From 1b6f4298435e67bac66b36f14e60e847e8b096c3 Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Thu, 8 Jun 2023 10:09:13 +0300 Subject: [PATCH] Update vending minter contract helpers --- components/collections/actions/actions.ts | 8 +++++ contracts/vendingMinter/contract.ts | 41 +++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/components/collections/actions/actions.ts b/components/collections/actions/actions.ts index d20f9c1..9b1a82d 100644 --- a/components/collections/actions/actions.ts +++ b/components/collections/actions/actions.ts @@ -5,6 +5,7 @@ import type { CollectionInfo, SG721Instance } from 'contracts/sg721' import { useSG721Contract } from 'contracts/sg721' import type { VendingMinterInstance } from 'contracts/vendingMinter' import { useVendingMinterContract } from 'contracts/vendingMinter' +import type { AirdropAllocation } from 'utils/isValidAccountsFile' import type { BaseMinterInstance } from '../../../contracts/baseMinter/contract' @@ -243,6 +244,7 @@ export interface DispatchExecuteArgs { limit: number tokenIds: string recipients: string[] + tokenRecipients: AirdropAllocation[] collectionInfo: CollectionInfo | undefined baseUri: string } @@ -325,6 +327,9 @@ export const dispatchExecute = async (args: DispatchExecuteArgs) => { case 'airdrop': { return vendingMinterMessages.airdrop(txSigner, args.recipients) } + case 'airdrop_specific': { + return vendingMinterMessages.airdropSpecificTokens(txSigner, args.tokenRecipients) + } case 'burn_remaining': { return vendingMinterMessages.burnRemaining(txSigner) } @@ -415,6 +420,9 @@ export const previewExecutePayload = (args: DispatchExecuteArgs) => { case 'airdrop': { return vendingMinterMessages(minterContract)?.airdrop(args.recipients) } + case 'airdrop_specific': { + return vendingMinterMessages(minterContract)?.airdropSpecificTokens(args.tokenRecipients) + } case 'burn_remaining': { return vendingMinterMessages(minterContract)?.burnRemaining() } diff --git a/contracts/vendingMinter/contract.ts b/contracts/vendingMinter/contract.ts index 8483fa3..2f5fcf0 100644 --- a/contracts/vendingMinter/contract.ts +++ b/contracts/vendingMinter/contract.ts @@ -5,6 +5,7 @@ import { coin } from '@cosmjs/proto-signing' import type { logs } from '@cosmjs/stargate' import type { Timestamp } from '@stargazezone/types/contracts/minter/shared-types' import { MsgExecuteContract } from 'cosmjs-types/cosmwasm/wasm/v1/tx' +import type { AirdropAllocation } from 'utils/isValidAccountsFile' export interface InstantiateResponse { readonly contractAddress: string @@ -47,6 +48,7 @@ export interface VendingMinterInstance { shuffle: (senderAddress: string) => Promise withdraw: (senderAddress: string) => Promise airdrop: (senderAddress: string, recipients: string[]) => Promise + airdropSpecificTokens: (senderAddress: string, tokenRecipients: AirdropAllocation[]) => Promise burnRemaining: (senderAddress: string) => Promise updateDiscountPrice: (senderAddress: string, price: string) => Promise removeDiscountPrice: (senderAddress: string) => Promise @@ -67,6 +69,7 @@ export interface VendingMinterMessages { shuffle: () => ShuffleMessage withdraw: () => WithdrawMessage airdrop: (recipients: string[]) => CustomMessage + airdropSpecificTokens: (recipients: AirdropAllocation[]) => CustomMessage burnRemaining: () => BurnRemainingMessage updateDiscountPrice: (price: string) => UpdateDiscountPriceMessage removeDiscountPrice: () => RemoveDiscountPriceMessage @@ -553,6 +556,29 @@ export const vendingMinter = (client: SigningCosmWasmClient, txSigner: string): return res.transactionHash } + const airdropSpecificTokens = async (senderAddress: string, recipients: AirdropAllocation[]): Promise => { + const executeContractMsgs: MsgExecuteContractEncodeObject[] = [] + for (let i = 0; i < recipients.length; i++) { + const msg = { + mint_for: { recipient: recipients[i].address, token_id: Number(recipients[i].tokenId) }, + } + const executeContractMsg: MsgExecuteContractEncodeObject = { + typeUrl: '/cosmwasm.wasm.v1.MsgExecuteContract', + value: MsgExecuteContract.fromPartial({ + sender: senderAddress, + contract: contractAddress, + msg: toUtf8(JSON.stringify(msg)), + }), + } + + executeContractMsgs.push(executeContractMsg) + } + + const res = await client.signAndBroadcast(senderAddress, executeContractMsgs, 'auto', 'airdrop_specific_tokens') + + return res.transactionHash + } + const shuffle = async (senderAddress: string): Promise => { const res = await client.execute( senderAddress, @@ -617,6 +643,7 @@ export const vendingMinter = (client: SigningCosmWasmClient, txSigner: string): batchMintFor, batchMint, airdrop, + airdropSpecificTokens, shuffle, withdraw, burnRemaining, @@ -838,6 +865,19 @@ export const vendingMinter = (client: SigningCosmWasmClient, txSigner: string): } } + const airdropSpecificTokens = (recipients: AirdropAllocation[]): CustomMessage => { + const msg: Record[] = [] + for (let i = 0; i < recipients.length; i++) { + msg.push({ mint_for: { recipient: recipients[i].address, token_id: recipients[i].tokenId } }) + } + return { + sender: txSigner, + contract: contractAddress, + msg, + funds: [], + } + } + const shuffle = (): ShuffleMessage => { return { sender: txSigner, @@ -886,6 +926,7 @@ export const vendingMinter = (client: SigningCosmWasmClient, txSigner: string): batchMintFor, batchMint, airdrop, + airdropSpecificTokens, shuffle, withdraw, burnRemaining,