Compression Best Practices
Rules for scaling compressed NFTs without RPC pain, stale proofs, or tree capacity incidents on Agave 4.1.1.
How to Use This List
- Apply A at tree creation and capacity planning
- Review B before public mint and gallery launch
- Use C for wallet transfer and marketplace integrations
A - Tree & Mint Planning
- Size tree depth for peak supply + headroom. Cannot expand depth in place easily.
- Set canopy depth for target tree depth. Reduces transfer tx size failures.
- Secure tree authority with multisig. Compromise corrupts entire collection.
- Upload metadata to Arweave before batch mint. Broken URIs permanent at leaf hash.
- Rehearse batch mint on devnet. Measure CU, tx size, and indexer lag.
- Budget priority fees for mint window. Concurrent mints compete for block space.
B - DAS & Reads
- Use DAS-enabled RPC for all cNFT reads. Vanilla RPC cannot replace indexer.
- Paginate
getAssetsByGroupfor galleries. Respect rate limits on launch day. - Use DAS
idfor follow-up calls. Not tree pubkey or leaf index alone. - Plan API tier for launch traffic. Spike mint day DAS queries.
- Cache metadata; not proofs. Short TTL on proof responses only.
- Monitor indexer lag metric. Delay gallery if assets missing post-mint.
C - Transfers & Operations
- Refetch
getAssetProofimmediately before sign. Stale root is top failure mode. - Use mpl-bubblegum SDK transfer builder. Correct proof account ordering.
- Simulate deep-tree transfers on devnet. Versioned txs + ALTs if size tight.
- Set user expectations on send latency. Proof fetch adds steps vs Core NFT.
- Do not implement manual proof verification. Delegate to Bubblegum/compression programs.
- Document DAS provider in runbook. Incidents need indexer contact path.
FAQs
Top cNFT launch failure?
Tree capacity exceeded or DAS overload hiding successful mints from gallery.
Minimum team stack?
Umi + mpl-bubblegum + DAS URL + @solana/kit for sends.
When skip compression?
Under ~2k unique on-chain NFTs where Core rent is acceptable.
Proof refresh pattern?
Fetch asset + proof in one pre-sign pipeline; reject if older than few seconds during hot windows.
Multisig tree authority?
Recommended for mainnet collections with ongoing mint rights.
Support playbook?
Root mismatch -> refetch proof. Missing asset -> check indexer lag. Tx too large -> review canopy.
Testing stack?
Surfpool 0.12.0 + devnet DAS + two-wallet transfer test.
Marketplace listing?
Verify cNFT support; proofs may be needed at list time per venue.
Burn policy?
Document whether burns are allowed; proof-based burn like transfer.
Custom on-chain logic?
Prefer client Bubblegum flows unless audit covers CPI proof accounts.
Related
- State Compression Basics - overview
- Cost & Trade-offs - when to compress
- Transferring cNFTs - proof pipeline
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.