如何将 NFT 铸造到其他钱包 - 空投示例

概述

本指南介绍如何将 NFT 从 Candy Machine 铸造到不同的钱包地址——这是空投、赠品或向多个接收者分发 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 特别有用。本指南将引导您完成将 NFT 从 Candy Machine 铸造到不同钱包地址的过程。需要注意的是,发起铸造过程的人将承担铸造成本。因此,让接收者自己领取 NFT 通常更具成本效益。

重要考虑

  • 铸造到其他钱包可能会很昂贵。您可能需要考虑使用领取机制。
  • 对于有守卫和没有守卫的 Candy Machine 有不同的工具可用。没有守卫的铸造通常更简单。

本指南描述了两种方法:

  1. 使用 sugar CLI 铸造
  2. 使用 Javascript 铸造

使用 Sugar CLI

Sugar CLI 提供了两个主要命令用于将 NFT 铸造到其他钱包:

  1. sugar mint 铸造到一个特定钱包
  2. sugar airdrop 铸造到多个钱包

使用 sugar mint 铸造到单个接收者

要将 NFT 铸造到单个接收者钱包,使用带有以下参数的 sugar mint 命令:

  • --receiver <WALLET>:指定接收者的钱包地址
  • --number <NUMBER>:(可选)指定要铸造到该钱包的 NFT 数量

示例

要将 3 个 NFT 铸造到钱包 Tes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVV,可以调用:

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 是否使用守卫,有两种主要方法:

无守卫铸造

对于没有守卫的 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 为接收者创建代币账户和关联代币账户。这允许接收者在不必签署交易的情况下接收 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' },
})