エアドロップ - 別のウォレットへ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を請求する方がしばしばコスト効率的です。

重要な考慮事項

  • 別のウォレットへのミントは高額になる可能性があります。代わりにallowlistNFT Gate Guardを使用した請求メカニズムを検討することをお勧めします。
  • ガードありとガードなしのCandy Machineで利用可能な異なるツールがあります。ガードなしでのミントは通常より簡単です。

このガイドでは2つのアプローチを説明します:

  1. Sugar CLIを使用したミント。コーディング不要!
  2. Javascriptを使用したミント

Sugar CLIの使用

Sugar CLIは、他のウォレットにNFTをミントするための2つの主要なコマンドを提供します:

  1. sugar mint1つの特定のウォレットにミント
  2. sugar airdrop複数のウォレットにミント

Sugarを通じてミントを許可する前提条件は、ガードが添付されていないCandy Machineを作成することです。Sugarを使用してCandy Machineを作成するには、このガイドの最初のステップに従ってください。Candy Machineにガードが添付されている場合、sugar guard removeを使用してガードを削除できます。

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を以下の形式でファイルに追加することで作成できます:

{
"11111111111111111111111111111111": 3,
"22222222222222222222222222222222": 1
}

デフォルトでは、Sugarはこのファイルをairdrop_list.jsonと呼ぶことを期待しますが、異なるファイル名を使用したい場合は、--airdrop-listを使用してファイル名を渡すことができます。

このエアドロップを実行するには、以下のコマンドを使用できます:

sugar airdrop --candy-machine 11111111111111111111111111111111

Typescriptと@metaplex-foundation/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(
mintFromCandyMachineV2(umi, {
candyMachine: candyMachine.publicKey,
mintAuthority: umi.identity,
nftOwner: recipient,
nftMint,
collectionMint: candyMachineAccount.collectionMint,
collectionUpdateAuthority: candyMachineAccount.authority,
})
)
.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(
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' },
})