Features
Printing Editions
Every NFT has the potential to be printed as multiple editions when its Master Edition account is configured accordingly. On this page, we'll learn how to create a printable NFT and how to print editions from it.
Printable NFTs
The owner of a printable NFT can print as many editions as they want from it as long as its maximum supply has not been reached.
Every Non-Fungible asset — i.e. NonFungible
and ProgrammableNonFungible
token standards — can be a printable NFT when created. This is done by configuring the Max Supply attribute of the asset's Master Edition account. This attribute is optional and can have one of the following values:
None
: The NFT does not have a fixed supply. In other words, the NFT is printable and has an unlimited supply.Some(x)
: The NFT has a fixed supply ofx
editions.- When
x = 0
, this means the NFT is not printable. - When
x > 0
, this means the NFT is printable and has a fixed supply ofx
editions.
- When
Whenever a new printed edition is created from a printable NFT, a few things happen:
- A brand new edition NFT is created and its data matches the original NFT. The only difference is that the printed edition uses a different token standard than the original NFT.
- For a
NonFungible
asset, the printed editions use theNonFungibleEdition
token standard. - For a
ProgrammableNonFungible
asset, the printed editions use theProgrammableNonFungibleEdition
token standard.
- For a
- Instead of using a Master Edition account, the new edition NFT uses an Edition account which keeps track of its edition number and its parent NFT by storing the address of its parent's Master Edition account.
- The Supply attribute of the Master edition account is incremented by 1. When the Supply attribute reaches the Max Supply attribute, the NFT is no longer printable.
Setting up a Master Edition NFT
To create a printable NFT, we need to configure the Print Supply attribute of the Create instruction of the Token Metadata program. This will configure the Max Supply attribute of the Master Edition account as seen in the previous section. This attribute can be:
Zero
: The NFT is not printable.Limited(x)
: The NFT is printable and has a fixed supply ofx
editions.Unlimited
: The NFT is printable and has an unlimited supply.
Here is how you can use our SDKs to create a printable NFT.
Create the Master Edition NFT
import { percentAmount, generateSigner } from '@metaplex-foundation/umi'
import { createNft, printSupply } from '@metaplex-foundation/mpl-token-metadata'
const mint = generateSigner(umi)
await createNft(umi, {
mint,
name: 'My Master Edition NFT',
uri: 'https://example.com/my-nft.json',
sellerFeeBasisPoints: percentAmount(5.5),
printSupply: printSupply('Limited', [100]), // Or printSupply('Unlimited')
}).sendAndConfirm(umi)
Printing Editions from the Master Edition NFT
Once we have a printable NFT that has not reached its Max Supply, we can print new editions from it. This is done by calling the Print instruction of the Token Metadata program. This instruction accepts the following attributes:
- Master Edition Mint: The address of the printable NFT's Mint account.
- Edition Mint: The address of the new edition NFT's Mint account. This is typically a newly generated Signer since the account will be created by the instruction if it does not exist.
- Master Token Account Owner: The owner of the printable NFT as a Signer. Only the owner of a printable NFT can print new editions from it.
- Edition Token Account Owner: The address of the new edition NFT's owner
- Edition Number: The edition number of the new edition NFT to print. This is typically the current Supply of the Master Edition account plus 1.
- Token Standard: The token standard of the printable NFT. This can be
NonFungible
orProgrammableNonFungible
.
Here is how you can use our SDKs to print a new edition from a printable NFT.
Create the Master Edition NFT
import { generateSigner } from '@metaplex-foundation/umi'
import {
printV1,
fetchMasterEditionFromSeeds,
} from '@metaplex-foundation/mpl-token-metadata'
// (Optional) Fetch the master edition account to mint the next edition number.
const masterEdition = await fetchMasterEditionFromSeeds(umi, {
mint: masterEditionMint,
})
const editionMint = generateSigner(umi)
await printV1(umi, {
masterTokenAccountOwner: originalOwner,
masterEditionMint,
editionMint,
editionTokenAccountOwner: ownerOfThePrintedEdition,
editionNumber: masterEdition.supply + 1n,
tokenStandard: TokenStandard.NonFungible,
}).sendAndConfirm(umi)