Bubblegum

圧縮NFTのミント

Bubblegum v2

このページはBubblegum v1に固有です。拡張された機能セットについては、Bubblegum v2の使用をお勧めします。Bubblegum v2を使用している場合は、詳細についてBubblegum v2のドキュメントを参照してください。

前のページでは、圧縮NFTをミントするためにBubblegum Treeが必要であり、その作成方法を見てきました。今度は、指定されたBubblegum Treeから圧縮NFTをミントする方法を見てみましょう。

BubblegumプログラムはTwo つのミント命令を提供します。1つはNFTをコレクションに関連付けずにミントするもの、もう1つはNFTを指定されたコレクションにミントするものです。後者は単にいくつかの追加パラメータが必要なだけなので、まず前者から見てみましょう。

コレクションなしでのミント

BubblegumプログラムはBubblegum Treeから圧縮NFTをミントできるMint V1命令を提供します。Bubblegum Treeが公開されている場合、誰でもこの命令を使用できます。そうでない場合は、Tree CreatorまたはTree Delegateのみが使用できます。

Mint V1命令の主要パラメータは以下の通りです:

  • Merkle Tree: 圧縮NFTがミントされるMerkle Treeのアドレス。
  • Tree Creator Or Delegate: Bubblegum Treeからのミントを許可された権限 — これはtreeの作成者またはdelegateのいずれかです。この権限はトランザクションに署名する必要があります。パブリックtreeの場合、このパラメータは任意の権限にできますが、それでも署名者である必要があります。
  • Leaf Owner: ミントされる圧縮NFTの所有者。
  • Leaf Delegate: ミントされたcNFTを管理することが許可されたdelegate権限(存在する場合)。そうでない場合は、Leaf Ownerに設定されます。
  • Metadata: ミントされる圧縮NFTのメタデータ。これには、NFTの名前、そのURI、そのコレクション、その作成者などの情報が含まれます。
    • メタデータ内でCollectionオブジェクトを提供することは可能ですが、Collection Authorityがこの命令で要求されておらず、したがってトランザクションに署名できないため、そのVerifiedフィールドはfalseに設定する必要があることに注意してください。
    • また、作成者はミント時にcNFT上で自分自身を検証できることにも注意してください。これを機能させるには、CreatorオブジェクトのVerifiedフィールドをtrueに設定し、残りのアカウントに作成者をSignerとして追加する必要があります。これは、すべての作成者がトランザクションに署名し、残りのアカウントに追加される限り、複数の作成者に対して実行できます。

コレクションなしで圧縮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を決定できます。この関数はTransactionを解析するため、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 });
// or const assetId = leaf.id;

コレクションへのミント

圧縮NFTがミントされた_後に_コレクションを設定および検証することは可能ですが、Bubblegumプログラムは圧縮NFTを指定されたコレクションに直接ミントする便利な命令を提供します。BubblegumはMetaplex Token MetadataコレクションNFTを使用して圧縮NFTをグループ化します。この命令はMintToCollectionV1と呼ばれ、MintV1命令と同じパラメータを使用しますが、以下のパラメータが追加されます:

  • Collection Mint: 圧縮NFTが属するToken Metadata Collection NFTのミントアドレス。
  • Collection Authority: 指定されたCollection NFTを管理することが許可された権限。これは、Collection NFTのupdate authorityまたは委任されたコレクション権限のいずれかです。Bubblegum Treeが公開されているかどうかに関係なく、この権限はトランザクションに署名する必要があります。
  • Collection Authority Record Pda: 委任されたコレクション権限を使用する場合、権限がCollection NFTを管理することが許可されていることを確認するために、Delegate Record PDAを提供する必要があります。これは、新しい「Metadata Delegate」PDAまたはレガシーの「Collection Authority Record」PDAのいずれかを使用できます。

さらに、Metadataパラメータには次のようなCollectionオブジェクトが含まれている必要があることに注意してください:

  • そのAddressフィールドがCollection Mintパラメータと一致している。
  • そのVerifiedフィールドはtrueまたはfalseのいずれかとして渡すことができます。falseとして渡された場合、トランザクション中にtrueに設定され、cNFTはVerifiedtrueに設定してミントされます。

また、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)

デフォルトでは、Collection AuthorityはUmi identityに設定されますが、以下の例に示すようにカスタマイズできます。

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

mintToCollectionトランザクションからのリーフスキーマとアセット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 });
// or const assetId = leaf.id;