Solana 101 — Initiate · Lesson 4 of 5

Compressed NFTs (cNFTs)

4 min · read

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_cache with 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 getAssetProof is 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.