기능
에디션 출력
모든 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는 부모 NFT의 Master Edition 계정의 주소를 저장함으로써 에디션 번호와 부모 NFT를 추적하는 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: 출력 가능한 NFT의 소유자를 Signer로. 출력 가능한 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);
