Skip to content

铸造

作者 崔棉大师 X:@MasterCui Youtube: 崔棉大师

知识点

到目前为止,我们已经学习了如何创建和维护糖果机。我们已经了解了如何配置它们以及如何使用 Guard 和 Guard Group 设置复杂的铸造工作流程。现在是时候讨论拼图的最后一块了:铸造!

课程

1.基本铸币

正如在 Candy Guards 页面中提到的,有两个程序负责从 Candy Machines 铸造 NFT:Candy Machine Core 程序(负责铸造 NFT)和 Candy Guard 程序,它在其之上添加了一个可配置的访问控制层,并可以分叉以提供自定义保护。

因此,有两种方法可以从糖果机中铸造糖果:

  • 来自 Candy Guard 程序,该程序随后将铸币委托给 Candy Machine Core 程序。大多数情况下,您会希望这样做,因为它允许更复杂的铸币工作流程。您可能需要根据帐户中配置的保护将额外的剩余帐户和指令数据传递给铸币指令。幸运的是,我们的 SDK 通过要求一些额外的参数并为我们计算其余部分,使这变得简单。
  • 直接从 Candy Machine Core 程序中获取。在这种情况下,只有配置的铸币机构才能从中铸币,因此它需要签署交易。

candy-machine-mint

如果一切顺利,将根据糖果机中配置的参数创建一个 NFT。例如,如果给定的糖果机使用配置行设置并将"顺序"设置为 false,那么我们将随机获取下一个项目。

js
import { mintV2 } from "@metaplex-foundation/mpl-candy-machine";
import { setComputeUnitLimit } from "@metaplex-foundation/mpl-toolbox";
import { transactionBuilder, generateSigner } from "@metaplex-foundation/umi";

const nftMint = generateSigner(umi);
await transactionBuilder()
  .add(setComputeUnitLimit(umi, { units: 800_000 }))
  .add(
    mintV2(umi, {
      candyMachine: candyMachine.publicKey,
      nftMint,
      collectionMint: collectionNft.publicKey,
      collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
      tokenStandard: candyMachine.tokenStandard,
    })
  )
  .sendAndConfirm(umi);

完整代码

2.有守卫的铸币

当使用 Guards 的糖果机铸造糖果时,您可能需要提供额外的 Guards 特定信息。

如果您要手动构建铸币指令,则该信息将作为指令数据和剩余账户的混合提供。但是,使用我们的 SDK,每个在铸币时需要额外信息的 Guards 都会定义一组设置,我们称之为铸币设置。然后,这些铸币设置将被解析为程序所需的任何内容。

需要通过 Guards 铸币的一个很好的例子是使用 NFT 支付规则,它需要 NFT 的铸币地址,我们应该使用 NFT 的铸币地址来支付铸币等费用。

candy-machine-mint-guard

js
import {
  some,
  generateSigner,
  transactionBuilder,
} from "@metaplex-foundation/umi";
import { create, mintV2 } from "@metaplex-foundation/mpl-candy-machine";
import { setComputeUnitLimit } from "@metaplex-foundation/mpl-toolbox";

// Create a Candy Machine with guards.
const thirdPartySigner = generateSigner();
await create(umi, {
  // ...
  guards: {
    thirdPartySigner: some({ signer: thirdPartySigner.publicKey }),
    mintLimit: some({ id: 1, limit: 3 }),
  },
}).sendAndConfirm(umi);

// Mint from the Candy Machine.
const nftMint = generateSigner(umi);
await transactionBuilder()
  .add(setComputeUnitLimit(umi, { units: 800_000 }))
  .add(
    mintV2(umi, {
      candyMachine: candyMachine.publicKey,
      nftMint,
      collectionMint: collectionNft.publicKey,
      collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
      mintArgs: {
        thirdPartySigner: some({ signer: thirdPartySigner }),
        mintLimit: some({ id: 1 }),
      },
    })
  )
  .sendAndConfirm(umi);

3.有守卫组的铸造

当使用保护组从糖果机铸造糖果时,我们必须通过提供其标签明确选择我们想要从哪个组铸造糖果。

此外,可能还需要 Mint 设置,如上一节所述。但是,Mint 设置将应用于所选组的"已解决的守卫"。 例如,想象一个糖果机有以下保护装置:

  • 默认Guard
    • 机器人税:0.001 SOL
    • 第三方签名者
    • 开始时间:下午 5 点
  • 第一组:
    • label:"nft"
    • guards
    • 使用 NFT 支付
    • 开始时间:下午 4 点
  • 第二组:
    • label:"公售"
    • guards
      • SOL 付款:2 SOL

第一组的已解析守卫(标记为"nft")是:

  • 机器人税:来自默认 Guard。
  • 第三方签名者:来自默认 Guard。
  • NFT 付款:来自第一组。
  • 开始日期:从第一组开始,因为它覆盖了默认 Guard。

因此,提供的 Mint Settings 必须与这些 Resolved Guards 相关。在上面的示例中,必须为 Third Party Signer Guard 和 NFT Payment Guard 提供 Mint Settings。

candy-machine-mint-group

js
// 创建第三方签名人keypair
const thirdPartySigner = generateSigner();
// 创建NFT
await create(umi, {
  // guard默认规则
  guards: {
    botTax: some({ lamports: sol(0.001), lastInstruction: true }),
    thirdPartySigner: some({ signer: thirdPartySigner.publicKey }),
    startDate: some({ date: dateTime("2024-7-1T17:00:00Z") }),
  },
  // group规则
  groups: [
    {
      label: "nft",
      guards: {
        nftPayment: some({ requiredCollection, destination: nftTreasury }),
        startDate: some({ date: dateTime("2024-7-1T16:00:00Z") }),
      },
    },
    {
      label: "public",
      guards: {
        solPayment: some({ lamports: sol(1), destination: solTreasury }),
      },
    },
  ],
}).sendAndConfirm(umi);

// 创建NFT item的keypair账户
const nftMint = generateSigner(umi);
// 铸造
await transactionBuilder()
  .add(setComputeUnitLimit(umi, { units: 800_000 }))
  .add(
    mintV2(umi, {
      candyMachine: candyMachine.publicKey,
      nftMint,
      collectionMint: collectionNft.publicKey,
      collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
      group: some("nft"), // 组标签
      mintArgs: {
        thirdPartySigner: some({ signer: thirdPartySigner }), // 第三方签名
        nftPayment: some({
          mint: nftFromRequiredCollection.publicKey, // 用于支付的NFT
          destination: nftTreasury, // 接收支付NFT的地址
          tokenStandard: TokenStandard.NonFungible, // NFT标准
        }),
      },
    })
  )
  .sendAndConfirm(umi);