Skip to content

管理糖果机

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

知识点

在上一章节中,我们介绍了糖果机的各种设置。现在,让我们看看如何使用这些设置来创建和更新糖果机。我们还将学到如何获取现有的糖果机以及如何在它完成其使命后将其删除

我们将经历糖果机的创建、读取、更新和删除步骤。我们开始吧!

课程

1.创建合集

在创建糖果机之前,我们需要通过 Metaplex 的 SDK 创建一个 NFT 合集,糖果机必须与 Collection NFT 相关联,并且其更新权限必须授权此操作。

完整代码

js
// 随机创建collection mint账户keypair
const collectionMint = generateSigner(umi);
// 创建collection
await createNft(umi, {
  mint: collectionMint,
  authority: signer,
  name: "My Collection",
  uri: "https://example.com/my-collection.json",
  sellerFeeBasisPoints: percentAmount(5.5), // 5.5%
  isCollection: true,
}).sendAndConfirm(umi);

2.创建糖果机

获得 Collection NFT 的账户地址之后,我们就可以创建糖果机了

完整代码

js
// 创建糖果机账户keypair
const candyMachine = generateSigner(umi);
// 创建糖果机
(
  await create(umi, {
    candyMachine: candyMachine, // 糖果机账户keypair
    collectionMint: collectionMint, // Collection 合集地址
    collectionUpdateAuthority: signer, // 合集更新权限
    tokenStandard: TokenStandard.NonFungible, // Token类型
    sellerFeeBasisPoints: percentAmount(9.99, 2), // 版税9.99%
    itemsAvailable: 10, // 可插入的Item数量
    creators: [
      // 创建者
      {
        address: signer.publicKey, // 创建着地址
        verified: true, // 是否验证
        percentageShare: 100, // 版税占比100%
      },
    ],
    configLineSettings: some({
      // 配置行设置
      prefixName: "My New NFT #$ID+1$", // 名称前缀
      nameLength: 0, // 名称长度
      prefixUri: "https://arweave.net/", // URI前缀
      uriLength: 43, // URI长度
      isSequential: false, // 随机排序
    }),
  })
).sendAndConfirm(umi);

3.糖果机账户

在创建糖果机之后,我们随时可以通过 SDK 的fetchCandyMachine函数获取糖果机当前状态

完整代码

js
const candyMachine = await fetchCandyMachine(umi, candyMachineAddress);
console.log(candyMachine);

返回结果:

sh
{
  publicKey: 'AxHy37HkfL1yhyR9dSr6HtnNWum1swBC6gTkbXjWCqXH',
  header: {
    executable: false,
    owner: 'CndyV3LdqHUfDLmE5naZjVN8rBZz4tqhdefbAnjHG3JR',
    lamports: { basisPoints: 10175520n, identifier: 'SOL', decimals: 9 },
    rentEpoch: 18446744073709551616n,
    exists: true
  },
  discriminator: [
    51, 173, 177, 113,
    25, 241, 109, 189
  ],
  version: 1,
  tokenStandard: 0,
  features: [ 0, 0, 0, 0, 0, 0 ],
  authority: 'CuiDdffKV38LjgRVtiA2QiMTKhnzkjX2LUxqSMbVnGjG',
  mintAuthority: 'DBE4rMWcKwkH8WHdAd2hNr2QHa8breVjRZwpHuY1Yt6C',
  collectionMint: '8jFyNfxQkoGAnBaX3KLsWbJgWE5JxDSN8i3H8ptDwm3C',
  itemsRedeemed: 0n,
  data: {
    itemsAvailable: 10n,
    symbol: '',
    sellerFeeBasisPoints: { basisPoints: 999n, identifier: '%', decimals: 2 },
    maxEditionSupply: 0n,
    isMutable: true,
    creators: [ [Object] ],
    configLineSettings: { __option: 'Some', value: [Object] },
    hiddenSettings: { __option: 'None' }
  },
  items: [],
  itemsLoaded: 0,
  ruleSet: { __option: 'None' }
}

以上返回的信息中包含糖果机当前所有的状态,我们重点关注以下几个属性:

  • itemsRedeemed已兑换物品。这将跟踪从糖果机铸造的 NFT 数量。请注意,一旦此数字从 0 变为 1,大多数设置将不再可更新。
  • version账户版本。此枚举用于跟踪糖果机的账户版本。它用于确定哪些功能可用以及如何解释账户。请注意,不要将其与糖果机 V3混淆,后者指的是糖果机程序的第三个也是最新版本(包括糖果机核心和糖果守卫程序)。
  • features随着更多功能的引入,这有助于程序实现向后和向前的兼容性。

4.更新权限

一旦创建了糖果机,只要您是糖果机的管理员,您就可以稍后更新其大部分设置。在接下来的几节中,我们将了解如何更新这些设置,但首先,让我们看看如何更新糖果机的管理员和铸币管理员。

  • 要更新权限,需要传递当前权限作为签名者,以及新权限的地址。
  • 要更新铸币权限,您需要将当前权限和新铸币权限作为签名者传递。这是因为铸币权限主要用于将糖果守卫与糖果机关联起来。将铸币权限设为签名者可防止任何人使用其他人的糖果守卫,因为这可能会对原始糖果机产生副作用。

完整代码

js
const newAuthority = generateSigner(umi);
await setCandyMachineAuthority(umi, {
  candyMachine: candyMachine.publicKey,
  authority: currentAuthority,
  newAuthority: newAuthority.publicKey,
})
  .add(
    setCandyGuardAuthority(umi, {
      candyGuard: candyMachine.mintAuthority,
      authority: currentAuthority,
      newAuthority: newAuthority.publicKey,
    })
  )
  .sendAndConfirm(umi);

5.更新共享属性

您还可以更新糖果机所有铸造 NFT 之间共享的属性。如上一章节所述,这些属性包括:卖家费用基点、符号、最大版本供应量、是否可变和创建者。

糖果机的物品设置也可以更新,但有一些限制。

  • 可以在configLineSettings配置行设置和hiddenSettings隐藏设置之间切换,如果不切换模式,也可以修改这些设置内部属性
  • 使用configLineSettings配置行设置时:
    • 无法更新可用项目itemsAvailable属性。
    • 名称长度nameLength和 URI 长度uriLength属性只能更新为较小的值,因为程序不会在更新期间调整 Candy Machine 帐户的大小。
  • 请注意,一旦铸造了第一个 NFT,这些属性就无法再更新。

完整代码

js
// 创建一个新的Creator
const newCreator = generateSigner(umi).publicKey;
// 更新糖果机共享属性
await updateCandyMachine(umi, {
  candyMachine: candyMachine.publicKey,
  data: {
    ...candyMachine.data,
    symbol: "NEW",
    sellerFeeBasisPoints: percentAmount(5.5, 2),
    creators: [{ address: newCreator, verified: false, percentageShare: 100 }],
    hiddenSettings: none(),
    configLineSettings: some({
      type: "configLines",
      prefixName: "My New NFT #$ID+1$",
      nameLength: 0,
      prefixUri: "https://arweave.net/",
      uriLength: 43,
      isSequential: true,
    }),
  },
}).sendAndConfirm(umi);

6.删除糖果机

一旦糖果机完全铸造完毕,它就完成了使命,可以安全处理掉了。这样,它的创建者就可以收回糖果机账户的存储成本,也可以收回糖果卫士账户的存储成本。

完整代码

js
await deleteCandyMachine(umi, {
  candyMachine: candyMachine.publicKey,
}).sendAndConfirm(umi);

await deleteCandyGuard(umi, {
  candyGuard: candyMachine.mintAuthority,
}).sendAndConfirm(umi);