Standard Solana NFTs (Metaplex Token Metadata standard) use one on-chain account per token. That's elegant — every NFT has a real on-chain identity, queryable directly — but it's also expensive at scale. Minting a million NFTs as 1M accounts costs ~2,000 SOL in rent (~$300,000 in 2026 prices). For project-scale collections that's fine; for game items, ticket stubs, or social-graph collectibles it's prohibitive.
The Bubblegum design
Metaplex's Bubblegum program changes the storage model. Instead of one account per token, the entire collection lives in a single on-chain Merkle tree:
- The tree has a fixed depth (chosen by the creator — depth 14 fits 16,384 leaves; depth 24 fits 16 million)
- Each leaf is a 32-byte hash of the NFT's metadata
- The on-chain account stores only the tree's root + bookkeeping
- The actual NFT data lives off-chain in an indexer (Helius DAS, SimpleHash, Triton)
Cost comparison:
| Operation | Standard NFT | Compressed NFT |
|---|---|---|
| Mint | ~0.012 SOL (~$1.80) | ~0.000004 SOL (~$0.0006) |
| Transfer | ~0.005 SOL (~$0.0008) | ~0.0005 SOL (~$0.00008) |
| Read | One RPC call | One indexer call |
The catch: you can't read compressed NFTs by walking on-chain accounts. You need an indexer. If the indexer is down or stale, the wallet can't show you what you own — but the on-chain proof is always reconstructable from the tree.
The wallet's cNFT story
For iteration D the wallet:
- Uses Helius DAS as the indexer (free tier covers 1k MAU; paid is $99/mo at 10k MAU)
- Caches the user's cNFT list in
sol_cnft_cachewith a 5-minute TTL - Surfaces the "Refresh" button to force a re-read
- Reads on-chain proofs at transfer time to ensure the indexer hasn't drifted
Transferring a cNFT
A Bubblegum transfer instruction takes:
- The tree address
- The leaf index (your NFT's position in the tree)
- The on-chain proof (Merkle path from leaf to root)
- The recipient's pubkey
The wallet builds all of this for you. You click "Transfer", paste a Solana address, sign. Cost: ~$0.0005.
Royalties on compressed NFTs are enforced via "creator verification" — if a creator is marked as verified for the collection, transfers must honor the configured royalty split. Most marketplaces respect this; some don't. The wallet displays the royalty terms on the NFT detail view so you know what you're agreeing to.
What can go wrong
- The indexer is stale. You see a cNFT you've already transferred, or don't see one you just received. Hit Refresh; if still wrong, the underlying tree's
getAssetProofis the source of truth. - The recipient doesn't have a Solana wallet. Same problem as any chain — verify the address before sending.
- You send to a contract address. cNFTs sent to a Solana program account often become unrecoverable; the program may not implement Bubblegum transfer-in semantics.
What you commit to
- The wallet uses an off-chain indexer for cNFT reads; results are cached 5 minutes
- Compressed-NFT transfers cost roughly $0.0005 and complete in ~1 second
- Royalty terms are displayed before transfer; you can override most enforcement but the audit log records the choice
- For "real" valuable NFTs (Magic Eden listings, etc.), the wallet shows the floor price next to the cNFT card so you don't accidentally send a $5,000 asset thinking it's a free airdrop
The next and final lesson covers cross-chain — bringing assets to Solana via Wormhole.