別のウォレットへNFTをミントする方法 - エアドロップ例
概要
このガイドでは、Candy Machineから異なるウォレットアドレスにNFTをミントする方法を説明します。これは、エアドロップ、景品配布、または複数の受信者にNFTを配布する一般的な要件です。
前提条件
どちらか
SolanaとNFTの基本的な理解
トランザクション手数料のための資金調達されたウォレット
Sugar CLI(v2.0.0以上) または
Node.js 16.0以上
@metaplex-foundation/mpl-token-metadata
@metaplex-foundation/mpl-toolbox
@metaplex-foundation/umi-bundle-defaults
@metaplex-foundation/mpl-candy-machine
別のウォレットへNFTをミントすることは、エアドロップ、景品配布、または複数の受信者にNFTを配布する際に特に有用です。このガイドでは、Candy Machineから異なるウォレットアドレスにNFTをミントするプロセスを案内します。ミントプロセスを開始する人がミントコストを負担することに注意することが重要です。したがって、受信者が自分でNFTを請求する方がしばしばコスト効率的です。
重要な考慮事項
- 別のウォレットへのミントは高額になる可能性があります。代わりに請求メカニズムを使用することを検討することをお勧めします。
- ガードありとガードなしのCandy Machineで利用可能な異なるツールがあります。ガードなしでのミントは通常より簡単です。
このガイドでは2つのアプローチを説明します:
- sugar CLIを使用したミント
- Javascriptを使用したミント
Sugar CLIの使用
Sugar CLIは、他のウォレットにNFTをミントするための2つの主要なコマンドを提供します:
sugar mint:1つの特定のウォレットにミントsugar airdrop:複数のウォレットにミント
sugar mintを使用した単一受信者ミント
単一の受信者ウォレットにNFTをミントするには、以下のパラメーターでsugar mintコマンドを使用してください:
--receiver <WALLET>:受信者のウォレットアドレスを指定--number <NUMBER>:(オプション)そのウォレットにミントするNFTの数を指定
例:
ウォレットTes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVVに3つのNFTをミントするには、以下を実行します:
sugar mint --receiver Tes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVV -n 3 --candy-machine 11111111111111111111111111111111
sugar airdropを使用した複数受信者
単一のコマンドで複数のウォレットにNFTをミントするには、sugar airdropを使用できます。これには、アドレスと各ウォレットが受け取るべきNFTの量を含むファイルが必要です。このようなファイルは、例えば特定のコレクションのNFT所有者のスナップショットを取得し、彼らのウォレットと所有するNFTを以下の形式でファイルに追加することで作成できます:
{
"22222222222222222222222222222222": 3,
"33333333333333333333333333333333": 1
}
デフォルトでは、Sugarはこのファイルをairdrop_list.jsonと呼ぶことを期待します。このデフォルト名は--airdrop-listで変更できます。
例: このエアドロップを実行するには、以下のコマンドを使用できます:
sugar airdrop --candy-machine 11111111111111111111111111111111
Typescriptとmpl-candy-machineの使用
このセクションでは、Javascriptでのミント関数のコードスニペットを示します。両方の例には、candy machineが作成され、その後単一のNFTがミントされる完全なコードスニペットも含まれています。完全なエアドロップスクリプトを実装するには、ミント関数の周りにループとエラー処理を実装する必要があります。
Typescriptを使用して別のウォレットにミントする場合、Candy Machineがガードを使用するかどうかに応じて2つの主要なアプローチがあります:
ガードなしでのミント
ガードなしのCandy Machineの場合、mintFromCandyMachineV2を使用します。この関数では、受信者をnftOwnerとして直接指定できます。
const candyMachineAccount = await fetchCandyMachine(umi, publicKey("CM Address"));
const recipient = publicKey('Tes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVV')
const nftMint = generateSigner(umi)
const mintTx = await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(createMintWithAssociatedToken(umi, { mint: nftMint, owner: recipient }))
.add(
mintV2(umi, {
candyMachine: candyMachineAccount.publicKey,
nftMint,
token: findAssociatedTokenPda(umi, {
mint: nftMint.publicKey,
owner: recipient,
}),
collectionMint: candyMachineAccount.collectionMint,
collectionUpdateAuthority: candyMachineAccount.authority,
tokenStandard: TokenStandard.NonFungible,
mintArgs: {
mintLimit: some({ // mintArgsが必要なガードをここで指定する必要があります
id: 1,
}),
},
})
)
.sendAndConfirm(umi, {
confirm: { commitment: 'finalized' },
})
ガードありでのミント
ガードありのCandy Machineの場合、mintV2を使用します。この場合、まずcreateMintWithAssociatedTokenを使用して受信者のToken AccountとAssociated Token Accountを作成する必要があります。これにより、受信者がトランザクションに署名する必要なくNFTを受け取ることができます。
const candyMachineAccount = await fetchCandyMachine(umi, publicKey("CM Address"));
const recipient = publicKey('Tes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVV')
const nftMint = generateSigner(umi)
const mintTx = await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(createMintWithAssociatedToken(umi, { mint: nftMint, owner: recipient }))
.add(
mintFromCandyMachineV2(umi, {
candyMachine: candyMachine.publicKey,
mintAuthority: umi.identity,
nftOwner: recipient,
nftMint,
collectionMint: candyMachineAccount.collectionMint,
collectionUpdateAuthority: candyMachineAccount.authority,
})
)
.sendAndConfirm(umi, {
confirm: { commitment: 'finalized' },
})
