Section 01 · The reframe
What is the SPL token approach to NFTs on Solana?
If you have already created a fungible SPL token, you have done almost all the work an NFT needs. The difference is two numbers and one extra account, not a different program.
Quick answer
In one sentence: A Solana NFT is an SPL token mint with zero decimals and a supply of one, made recognizable as an NFT through a Metaplex metadata account and a master edition account attached to that same mint.
A fungible token you might create for a rewards system uses six decimals and a supply in the millions, so any unit is identical to any other and can be split into fractions. An NFT sets decimals to zero and supply to one. Zero decimals means the smallest unit is a whole token, so nothing can be split. Supply of one means there is exactly one unit in existence for that mint, so nothing is interchangeable with anything else.
That is the entire technical distinction inside the SPL Token Program itself. What turns this narrow token into something a wallet displays as an NFT with an image and a name is a second program, the Metaplex Token Metadata Program, which attaches a metadata account to the mint.
Why this matters more than it sounds
Treating NFTs as a special case of the same token primitive you already understand, rather than a separate system to learn from scratch, is what actually lets you reason about edge cases like semi fungible tokens or collection structures without memorizing new rules for each.
Section 02 · The metadata account
What does the Metaplex Token Metadata Program actually store?
The mint account itself has no room for a name, an image, or traits. The metadata account is a second account, derived deterministically from the mint, that carries everything a wallet or marketplace needs to render the NFT.
The metadata account stores an on chain name and symbol, a URI pointing to an off chain JSON file, and creator information used for royalties and verification. The off chain JSON, typically hosted on Arweave or IPFS for permanence, carries the richer data: the image URL, a description, and an attributes array that marketplaces read to build trait filters.
import { createNft } from "@metaplex-foundation/mpl-token-metadata";
import { generateSigner, percentAmount } from "@metaplex-foundation/umi";
import { umi } from "./umi-instance";
const mint = generateSigner(umi);
await createNft(umi, {
mint,
name: "Example NFT",
symbol: "EX",
uri: "https://arweave.net/your-metadata-json-hash",
sellerFeeBasisPoints: percentAmount(5),
}).sendAndConfirm(umi);This single call, using the Umi framework Metaplex builds its newer tooling on, creates the mint with zero decimals and supply one, initializes the metadata account, and sets up a master edition in one bundled transaction. sellerFeeBasisPoints sets the royalty percentage that marketplaces are expected to honor, expressed in hundredths of a percent, so 500 basis points equals five percent.
Section 03 · Master edition
What is a master edition account and why does it matter?
The master edition account is what actually locks the supply at one and controls whether anyone can ever print additional numbered copies from this same NFT.
Without a master edition, nothing stops someone with mint authority from minting more of the same token, which would break the assumption that this is a unique item. The master edition account, created alongside the metadata account, sets a maximum supply, most often zero for a true one of one NFT, meaning no prints are allowed beyond the original.
Metaplex does support a print model where a master edition allows a limited number of numbered copies, similar to a limited edition art print. Each print gets its own mint but references the master edition and carries an edition number in its own edition account. Most collectible and PFP style projects use zero max supply, treating every mint as its own one of one, while some art and membership projects use the print model deliberately.
| Setting | Fungible token | Standard NFT | Print edition NFT |
|---|---|---|---|
| Decimals | 6 (typical) | 0 | 0 |
| Supply per mint | Millions or more | 1 | 1 per print, referencing a master |
| Metadata account | Not used | Yes, Metaplex Token Metadata | Yes, Metaplex Token Metadata |
| Master edition max supply | Not applicable | 0 (no prints allowed) | Set to the intended print count |
Section 04 · Collections and candy machine
How do collections and candy machine fit into this model?
A single NFT is straightforward once you see it as a configured SPL token, but most real projects ship dozens or thousands of them together, which is what collection accounts and candy machine solve.
A Solana NFT collection is itself represented by another NFT, called the collection NFT, that every item in the collection references. This reference is what lets a marketplace group thousands of individual mints under one collection page and one floor price.
Candy machine is Metaplex's tool for minting a large batch of NFTs against shared configuration: a price, a start time, and a set of metadata files uploaded ahead of time, one per planned NFT. It is worth knowing this tool exists and what problem it solves, launching many items with consistent rules and controlled reveal timing, even if you are minting a single NFT by hand for now and do not need it yet.
Section 05 · Verification
How do you verify an NFT as part of a collection?
Referencing a collection in your metadata is not the same as being verified into it, and the difference is exactly why some NFTs display correctly on one marketplace and show as unverified on another.
Setting a collection field on an NFT's metadata is an unverified claim anyone can make, including pointing at a popular collection they do not actually belong to. Verification is a separate on chain instruction, signed by the collection's update authority, that flips a verified flag to true on that specific NFT's metadata.
import { verifyCollectionV1 } from "@metaplex-foundation/mpl-token-metadata";
import { publicKey } from "@metaplex-foundation/umi";
await verifyCollectionV1(umi, {
metadata: publicKey(nftMetadataAddress),
collectionMint: publicKey(collectionMintAddress),
authority: umi.identity,
}).sendAndConfirm(umi);Marketplaces and indexers check this verified flag before displaying an NFT under a collection's page or applying its floor price and royalty rules. Skipping this step is one of the most common reasons a freshly minted collection shows up correctly in a wallet, which trusts the unverified claim, but fails to group properly on a marketplace, which does not.
If you have not yet worked through creating the underlying token type this whole model builds on, the guide on creating an SPL token on Solana covers mint creation, decimals, and authority decisions from first principles, using the fungible case this post has been contrasting against throughout. Once you have a mint and want to surface it, whether fungible or an NFT, inside an actual product, integrating an SPL token with a Next.js application covers the wallet connection and rendering layer.
FAQ
Frequently asked questions
How do Solana NFTs work under the hood?
A Solana NFT is an SPL token mint created with zero decimals and a supply of one. A Metaplex Token Metadata account attaches a name, symbol, and link to off chain metadata, while a master edition account locks the supply and controls whether numbered print copies are allowed.
Why does an NFT mint have zero decimals and a supply of one?
Zero decimals means the token cannot be split into fractions, and a supply of one means there is exactly one unit in existence. Together these two settings turn the same SPL Token Program used for fungible tokens into something that behaves as a unique, indivisible item.
What is the Metaplex Token Metadata standard?
It is a program that attaches a metadata account to an SPL token mint, storing an on chain name, symbol, and URI pointing to off chain JSON with an image and attributes. It is what lets wallets and marketplaces display a token as an NFT rather than a generic balance.
What is a master edition account in a Solana NFT?
The master edition account, created alongside the metadata account, locks a mint's maximum supply, typically to zero for a standard one of one NFT, and controls whether the NFT supports a print model that allows a limited number of numbered copies referencing the original.
Why do NFT collections need verification instead of just listing a collection field?
A collection field on metadata is an unverified claim anyone can set, including pointing at a collection they do not own. Verification is a separate signed instruction from the collection's update authority that marketplaces and indexers check before grouping the NFT under that collection's page.
What is the difference between a fungible token, an NFT, and a semi fungible token on Solana?
All three are SPL Token Program mints. A fungible token typically uses six decimals with a large supply. A standard NFT uses zero decimals with a supply of one. A semi fungible token uses zero decimals but a supply greater than one, representing multiple identical copies of the same item.
If your team is building NFT infrastructure that needs to hold up under real collection scale and verification requirements, the blockchain development service covers this work end to end, from mint and metadata design through collection tooling.