機能
エディションの印刷
すべてのNFTは、そのMaster Editionアカウントが適切に設定されている場合、複数のエディションとして印刷される可能性を持っています。このページでは、印刷可能なNFTを作成し、そこからエディションを印刷する方法を学びます。
印刷可能NFT
印刷可能NFTの所有者は、その最大供給量に達していない限り、そこから好きなだけエディションを印刷できます。
すべての非代替可能アセット(すなわち、NonFungibleおよびProgrammableNonFungibleトークン標準)は、作成時に印刷可能NFTになることができます。これは、アセットのMaster EditionアカウントのMax Supply属性を設定することで行われます。この属性はオプションであり、以下の値のいずれかを持つことができます:
None: NFTには固定の供給量がありません。言い換えると、NFTは印刷可能で無制限の供給量を持ちます。Some(x): NFTはxエディションの固定供給量を持ちます。x = 0の場合、これはNFTが印刷不可能であることを意味します。x > 0の場合、これはNFTが印刷可能でxエディションの固定供給量を持つことを意味します。
印刷可能NFTから新しい印刷エディションが作成されるたびに、いくつかのことが起こります:
- 全く新しいエディションNFTが作成され、そのデータは元のNFTと一致します。唯一の違いは、印刷されたエディションが元のNFTとは異なるトークン標準を使用することです。
NonFungibleアセットの場合、印刷エディションはNonFungibleEditionトークン標準を使用します。ProgrammableNonFungibleアセットの場合、印刷エディションはProgrammableNonFungibleEditionトークン標準を使用します。
- Master Editionアカウントを使用する代わりに、新しいエディションNFTはEditionアカウントを使用し、そのエディション番号と親NFTを追跡するために、親のMaster Editionアカウントのアドレスを保存します。
- Master EditionアカウントのSupply属性が1増加します。Supply属性がMax Supply属性に達すると、NFTはもはや印刷できません。
Master Edition NFTの設定
印刷可能なNFTを作成するには、Token MetadataプログラムのCreate命令のPrint Supply属性を設定する必要があります。これにより、前のセクションで見たようにMaster EditionアカウントのMax Supply属性が設定されます。この属性は以下のいずれかになります:
Zero: NFTは印刷不可能です。Limited(x): NFTは印刷可能で、xエディションの固定供給量を持ちます。Unlimited: NFTは印刷可能で、無制限の供給量を持ちます。
SDKを使用して印刷可能なNFTを作成する方法を以下に示します。
1import { percentAmount, generateSigner } from '@metaplex-foundation/umi';
2import { createNft, printSupply } from '@metaplex-foundation/mpl-token-metadata';
3
4// Assuming umi is set up with mplTokenMetadata plugin
5
6const mint = generateSigner(umi);
7
8await createNft(umi, {
9 mint,
10 name: 'My Master Edition NFT',
11 uri: 'https://example.com/my-nft.json',
12 sellerFeeBasisPoints: percentAmount(5.5),
13 printSupply: printSupply('Limited', [100]), // Or printSupply('Unlimited')
14}).sendAndConfirm(umi);
15
16console.log('Master Edition NFT created:', mint.publicKey);
1import { generateKeyPairSigner } from '@solana/kit';
2import { createNft, PrintSupply } from '@metaplex-foundation/mpl-token-metadata-kit';
3
4// Assuming rpc, rpcSubscriptions, sendAndConfirm, and authority are set up
5
6const mint = await generateKeyPairSigner();
7
8// Create a Master Edition NFT with limited supply of 100 prints
9const [createIx, mintIx] = await createNft({
10 mint,
11 authority,
12 payer: authority,
13 name: 'My Master Edition NFT',
14 uri: 'https://example.com/my-nft.json',
15 sellerFeeBasisPoints: 550, // 5.5%
16 tokenOwner: authority.address,
17 printSupply: PrintSupply.Limited(100), // Or PrintSupply.Unlimited
18});
19
20await sendAndConfirm({
21 instructions: [createIx, mintIx],
22 payer: authority,
23});
24
25console.log('Master Edition NFT created:', mint.address);
Master Edition NFTからのエディション印刷
Max Supplyに達していない印刷可能なNFTがあれば、そこから新しいエディションを印刷できます。これはToken MetadataプログラムのPrint命令を呼び出すことで行われます。この命令は以下の属性を受け入れます:
- Master Edition Mint: 印刷可能なNFTのMintアカウントのアドレス。
- Edition Mint: 新しいエディションNFTのMintアカウントのアドレス。これは通常、アカウントが存在しない場合は命令によって作成されるため、新しく生成されたSignerです。
- Master Token Account Owner: Signerとしての印刷可能なNFTの所有者。印刷可能なNFTの所有者のみが、そこから新しいエディションを印刷できます。
- Edition Token Account Owner: 新しいエディションNFTの所有者のアドレス。
- Edition Number: 印刷する新しいエディションNFTのエディション番号。これは通常、Master Editionアカウントの現在のSupplyに1を加えた値です。
- Token Standard: 印刷可能なNFTのトークン標準。
NonFungibleまたはProgrammableNonFungibleです。
SDKを使用して印刷可能なNFTから新しいエディションを印刷する方法を以下に示します。
1import { generateSigner } from '@metaplex-foundation/umi';
2import {
3 printV1,
4 fetchMasterEditionFromSeeds,
5} from '@metaplex-foundation/mpl-token-metadata';
6
7// Assuming umi, masterEditionMint, originalOwner, and ownerOfThePrintedEdition are set up
8
9const editionMint = generateSigner(umi);
10
11// (Optional) Fetch the master edition account to mint the next edition number.
12const masterEdition = await fetchMasterEditionFromSeeds(umi, {
13 mint: masterEditionMint,
14});
15
16await printV1(umi, {
17 masterTokenAccountOwner: originalOwner,
18 masterEditionMint,
19 editionMint,
20 editionTokenAccountOwner: ownerOfThePrintedEdition,
21 editionNumber: masterEdition.supply + 1n,
22 tokenStandard: TokenStandard.NonFungible,
23}).sendAndConfirm(umi);
24
25console.log('Edition printed:', editionMint.publicKey);
1import { generateKeyPairSigner } from '@solana/kit';
2import {
3 getPrintV1InstructionAsync,
4 fetchMasterEdition,
5 findMasterEditionPda,
6 TokenStandard,
7} from '@metaplex-foundation/mpl-token-metadata-kit';
8
9// Assuming rpc, rpcSubscriptions, sendAndConfirm, originalOwner are set up
10
11const masterEditionMintAddress = 'masterEditionMintAddress...';
12const ownerOfThePrintedEdition = 'ownerAddress...';
13const editionMint = await generateKeyPairSigner();
14
15// Fetch the master edition account to mint the next edition number
16const [masterEditionPda] = await findMasterEditionPda({ mint: masterEditionMintAddress });
17const masterEdition = await fetchMasterEdition(rpc, masterEditionPda);
18
19// Print a new edition
20const printIx = await getPrintV1InstructionAsync({
21 masterTokenAccountOwner: originalOwner,
22 masterEditionMint: masterEditionMintAddress,
23 editionMint,
24 editionTokenAccountOwner: ownerOfThePrintedEdition,
25 editionNumber: masterEdition.data.supply + 1n,
26 tokenStandard: TokenStandard.NonFungible,
27 payer: originalOwner,
28});
29
30await sendAndConfirm({
31 instructions: [printIx],
32 payer: originalOwner,
33});
34
35console.log('Edition printed:', editionMint.address);
