Bubblegum

铸造压缩NFT

Bubblegum v2

本页面特定于Bubblegum v1。如需增强的功能集,我们建议使用Bubblegum v2。如果您正在使用Bubblegum v2,请查阅Bubblegum v2文档以获取更多详细信息。

上一页中,我们看到需要Bubblegum树来铸造压缩NFT,并且我们看到了如何创建一个。现在,让我们看看如何从给定的Bubblegum树铸造压缩NFT。

Bubblegum程序提供两个铸造指令。一个在不关联集合的情况下铸造NFT,另一个将NFT铸造到给定集合。让我们先看前者,因为后者只需要几个额外的参数。

不关联集合的铸造

Bubblegum程序提供了Mint V1指令,使我们能够从Bubblegum树铸造压缩NFT。如果Bubblegum树是公开的,任何人都可以使用此指令。否则,只有树创建者或树委托才能这样做。

Mint V1指令的主要参数是:

  • 默克尔树:将从中铸造压缩NFT的默克尔树地址。
  • 树创建者或委托:允许从Bubblegum树铸造的权限——可以是树的创建者或委托。此权限必须签署交易。对于公开树,此参数可以是任何权限,但仍必须是签名者。
  • 叶子所有者:将被铸造的压缩NFT的所有者。
  • 叶子委托:允许管理铸造的cNFT的委托权限(如果有)。否则,设置为叶子所有者。
  • 元数据:将被铸造的压缩NFT的元数据。它包含NFT的名称URI集合创作者等信息。
    • 请注意,可以在元数据中提供集合对象,但其已验证字段必须设置为false,因为此指令不需要集合权限,因此无法签署交易。
    • 还要注意,创作者可以在铸造时验证自己的cNFT。为此,我们需要将创作者对象的已验证字段设置为true,并将创作者作为签名者添加到剩余账户中。只要所有创作者都签署交易并添加为剩余账户,这可以对多个创作者执行。

铸造不关联集合的压缩NFT

import { none } from '@metaplex-foundation/umi'
import { mintV1 } from '@metaplex-foundation/mpl-bubblegum'
await mintV1(umi, {
leafOwner,
merkleTree,
metadata: {
name: 'My Compressed NFT',
uri: 'https://example.com/my-cnft.json',
sellerFeeBasisPoints: 500, // 5%
collection: none(),
creators: [
{ address: umi.identity.publicKey, verified: false, share: 100 },
],
},
}).sendAndConfirm(umi)

从铸造交易获取叶子模式和资产ID

您可以使用parseLeafFromMintV1Transaction辅助函数从mintV1交易中检索叶子并确定资产ID。此函数解析交易,因此您必须确保在调用parseLeafFromMintV1Transaction之前交易已完成。

交易完成

请确保交易已完成后再调用parseLeafFromMintV1Transaction

从铸造交易获取叶子模式

import {
findLeafAssetIdPda,
mintV1,
parseLeafFromMintV1Transaction
} from "@metaplex-foundation/mpl-bubblegum";
const { signature } = await mintV1(umi, {
leafOwner,
merkleTree,
metadata,
}).sendAndConfirm(umi, { confirm: { commitment: "finalized" } });
const leaf: LeafSchema = await parseLeafFromMintV1Transaction(umi, signature);
const assetId = findLeafAssetIdPda(umi, { merkleTree, leafIndex: leaf.nonce });
// 或 const assetId = leaf.id;

铸造到集合

虽然可以在铸造后为压缩NFT设置和验证集合,但Bubblegum程序提供了一个便捷的指令,可以直接将压缩NFT铸造到给定集合。Bubblegum使用Metaplex Token Metadata集合NFT来分组压缩NFT。此指令称为MintToCollectionV1,它使用与MintV1指令相同的参数,并添加以下参数:

  • 集合铸造:压缩NFT将归属的Token Metadata集合NFT的铸造地址。
  • 集合权限:允许管理给定集合NFT的权限。这可以是集合NFT的更新权限或委托的集合权限。无论Bubblegum树是否公开,此权限都必须签署交易。
  • 集合权限记录PDA:使用委托的集合权限时,必须提供委托记录PDA以确保该权限被允许管理集合NFT。这可以使用新的"元数据委托"PDA或旧的"集合权限记录"PDA。

此外,请注意元数据参数必须包含集合对象,使得:

  • 地址字段与集合铸造参数匹配。
  • 已验证字段可以传入为truefalse。如果传入为false,它将在交易期间设置为true,cNFT将以已验证设置为true铸造。

另请注意,与Mint V1指令一样,创作者可以通过签署交易并将自己添加为剩余账户来验证自己。

铸造压缩NFT到集合

import { none } from '@metaplex-foundation/umi'
import { mintToCollectionV1 } from '@metaplex-foundation/mpl-bubblegum'
await mintToCollectionV1(umi, {
leafOwner,
merkleTree,
collectionMint,
metadata: {
name: 'My Compressed NFT',
uri: 'https://example.com/my-cnft.json',
sellerFeeBasisPoints: 500, // 5%
collection: { key: collectionMint, verified: false },
creators: [
{ address: umi.identity.publicKey, verified: false, share: 100 },
],
},
}).sendAndConfirm(umi)

默认情况下,集合权限设置为Umi身份,但可以自定义,如下例所示。

const customCollectionAuthority = generateSigner(umi)
await mintToCollectionV1(umi, {
// ...
collectionAuthority: customCollectionAuthority,
})

从铸造到集合交易获取叶子模式和资产ID

同样,您可以使用parseLeafFromMintToCollectionV1Transaction辅助函数从mintToCollectionV1交易中检索叶子并确定资产ID。

交易完成

请确保交易已完成后再调用parseLeafFromMintToCollectionV1Transaction

从mintToCollectionV1交易获取叶子模式

import {
findLeafAssetIdPda,
mintV1,
parseLeafFromMintToCollectionV1Transaction
} from "@metaplex-foundation/mpl-bubblegum";
const { signature } = await mintToCollectionV1(umi, {
leafOwner,
merkleTree,
metadata,
collectionMint: collectionMint.publicKey,
}).sendAndConfirm(umi);
const leaf: LeafSchema = await parseLeafFromMintToCollectionV1Transaction(umi, signature);
const assetId = findLeafAssetIdPda(umi, { merkleTree, leafIndex: leaf.nonce });
// 或 const assetId = leaf.id;