ByAUJay
Can You Suggest Solutions for Managing NFT Metadata Efficiently Across Multiple Chains Like Solana and Polygon?
Description: Yes—by standardizing “canonical” metadata once, layering chain-specific overlays, and wiring storage, indexing, and refresh pipelines that respect Solana’s Metaplex standards and EVM ERCs, you can run one metadata system across Solana and Polygon with low toil and predictable updates.
TL;DR for decision‑makers
- Stop duplicating metadata per chain. Author one canonical JSON and derive small overlays per chain (URI, royalties, collection pointers, and rules).
- Use content-addressed storage (IPFS CIDv1 or Arweave ar://) with resilient pinning and CDN strategy, and emit the right on‑chain “refresh” signals (ERC‑4906 on EVM, Token Metadata update on Solana) + marketplace refresh hooks. (docs.ipfs.tech)
- On Solana, target Metaplex Core for new mints; fall back to Token Metadata for legacy, and use DAS-based indexers for compressed NFTs at scale. On Polygon/EVM, wire ERC‑721/1155 + ERC‑4906 + ERC‑2981 + contractURI. (developers.metaplex.com)
Why multichain NFT metadata is hard (and how to make it boring)
- Two very different NFT stacks:
- Solana: Metaplex programs (Token Metadata, Core, Token Auth Rules), pNFT rule sets, and compressed NFTs (cNFTs) that rely on indexers for reads. (developers.metaplex.com)
- Polygon/EVM: ERC‑721/1155 tokenURI/uri JSONs, ERC‑4906 metadata change events, ERC‑2981 royalties, and marketplace‑specific “contractURI”. (docs.opensea.io)
- Storage realities changed: NFT.Storage “Classic” uploads were decommissioned (June 30, 2024). Teams must plan for alternative hot storage or self‑hosted pinning. (nft.storage)
- Indexer ecosystem is moving: Helius’ DAS API unifies uncompressed and compressed Solana assets; some multi‑chain NFT APIs sunset (e.g., SimpleHash in March 2025; Reservoir sunset October 15, 2025), so plan migrations. (helius.dev)
The fix is an architecture that makes metadata chain‑agnostic, event‑driven, and storage‑portable.
The reference architecture (7Block Labs pattern)
- Canonical metadata once, overlays per chain
- Maintain a single “canonical” JSON per asset (immutable fields) and small chain overlays for:
- storage URI (ipfs:// or ar://),
- royalties (ERC‑2981 for EVM vs sellerFee basis points in Solana metadata),
- collection pointers and verification (Solana Collection verify),
- rule sets (pNFT) and market‑specific toggles,
- animation_url/image variants for marketplace capabilities. (developers.metaplex.com)
- Content addressing and resilient delivery
- Prefer ipfs:// CIDv1 (base32) or ar://. Use subdomain gateways for origin isolation, and pin content across providers or your IPFS Cluster. For Arweave, use Bundlr for fast, batched writes. (docs.ipfs.tech)
- If you must expose HTTPS links, rewrite ipfs:// at the “last mile,” not on‑chain, to avoid lock‑in. (dev.nft.storage)
- Standards‑first contracts and programs
- EVM/Polygon:
- ERC‑721/1155 returning tokenURI/uri;
- emit ERC‑4906 on metadata changes;
- implement ERC‑2981 and a collection‑level contractURI JSON. (docs.opensea.io)
- Solana:
- For new projects, mint with Metaplex Core (single account, low compute, enforced royalties);
- For legacy/market ubiquity, Metaplex Token Metadata + (optionally) programmable NFTs with Token Auth Rules. (developers.metaplex.com)
- Indexing and refresh automation
- Solana: use Helius DAS for both regular NFTs and cNFTs; subscribe via webhooks for updates. (helius.dev)
- EVM: monitor mints/transfers and emit ERC‑4906; call OpenSea V2 refresh endpoint as needed; wire Magic Eden APIs for Polygon. (eips-wg.github.io)
- Observability and SLOs
- Track metadata freshness (time to visible update on top marketplaces after source change), gateway health (latency, hit rate), and on‑chain event coverage.
The standards you should anchor to in 2026
- EVM/Polygon
- ERC‑721/1155 metadata JSON structure and display fields (image, animation_url, attributes…). (docs.opensea.io)
- ERC‑4906 for metadata change signaling to indexers/marketplaces. (eips-wg.github.io)
- ERC‑2981 for royalties; use contractURI for collection‑level metadata. (eips.ethereum.org)
- Solana
- Metaplex Core: next‑gen single‑account NFTs with lower mint cost and enforced royalties. (developers.metaplex.com)
- Token Metadata + programmable NFTs (pNFT) with Token Auth Rules (rule sets) for fine‑grained operations, plus verified collections. (developers.metaplex.com)
- Compressed NFTs (Bubblegum + state compression) require an indexer/DAS for reads at scale. (solana.com)
Storage layer: what’s “production‑ready” now
- IPFS
- Use CIDv1 and subdomain gateways for origin isolation; pin to multiple nodes or run IPFS Cluster; don’t put https:// gateway URLs on‑chain. (docs.ipfs.tech)
- With NFT.Storage Classic uploads decommissioned, plan hot storage via Pinata or Lighthouse; NFT.Storage positions itself now for long‑term preservation with Filecoin and an on‑chain endowment. (nft.storage)
- A case study from OpenSea shows large gains using Pinata’s gateway + CDN for fast reveals. (pinata.cloud)
- Arweave
- Store metadata/media with ar:// and upload via Bundlr for throughput; Bundlr carries the bulk of Arweave writes today. (alchemy.com)
Emerging risk note: network‑level attacks against IPFS gateways highlight the value of multi‑gateway strategies and replication. (arxiv.org)
Indexing, APIs, and marketplace refresh
- Solana
- Helius DAS: getAssetsByOwner/searchAssets unify regular/cNFTs; use webhooks for events; this is critical because cNFTs don’t live in traditional account structures. (helius.dev)
- EVM (Polygon, Ethereum, etc.)
- OpenSea Developer API: use “refresh_nft” to force re‑pull after emitting ERC‑4906; apply for API keys and respect rate limits. (docs.opensea.io)
- Magic Eden’s EVM and Solana APIs are available for metadata and trading workflows. (docs.magiceden.io)
- Aggregators and changes to plan for
- SimpleHash sunset (Mar 27, 2025): plan migrations (Alchemy NFT API now covers 30+ chains incl. Solana). (alchemy.com)
- Reservoir sunset (Oct 15, 2025): if you relied on its metadata normalization, migrate to alternatives and/or self‑hosted indexers. (outposts.io)
- Covalent/GoldRush APIs (via QuickNode) continue to provide multi‑chain NFT endpoints (notably Ethereum/Polygon) and wallet‑level views; validate Solana coverage per endpoint. (blog.quicknode.com)
Practical blueprint: one metadata, two chains
Below is a concrete pattern we deploy for clients minting on Solana and Polygon simultaneously.
1) Author one canonical JSON
- Canonical JSON (immutable payload, content‑addressed):
{ "version": "1.2.0", "name": "Astro Access Pass #7261", "description": "Dynamic pass with gated content and multi-chain proof.", "image": "ipfs://bafy.../7261.png", "animation_url": "ipfs://bafy.../7261.glb", "external_url": "https://example.com/passes/7261", "attributes": [ {"trait_type": "Tier", "value": "Explorer"}, {"trait_type": "Season", "value": "2026-01"} ], "checksum": { "image_sha256": "f9a5...8a", "animation_sha256": "0a1b...ff" }, "updated_at": "2026-01-07T12:00:00Z" }
- Store the JSON and assets via IPFS CIDv1 or ar://; avoid storing a gateway URL on‑chain. (dev.nft.storage)
2) Chain overlays
-
Polygon/EVM overlay:
- tokenURI points to the canonical JSON CID;
- contractURI for collection‑level metadata (banner image, external_link, collaborators);
- ERC‑2981 royalties configured at mint (e.g., 500 bps);
- on “reveal” or trait fixes, emit ERC‑4906 events and call OpenSea’s refresh endpoint. (docs.opensea.io)
-
Solana overlay:
- If new mint: Metaplex Core asset with plugin enforcing royalties;
- If using Token Metadata: set collection and verify; optionally configure a pNFT Rule Set to restrict disallowed programs or create granular delegates. (developers.metaplex.com)
3) Contract and program snippets
- Polygon ERC‑721 with ERC‑4906, ERC‑2981, and contractURI:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; interface IERC4906 { event MetadataUpdate(uint256 _tokenId); event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); } contract AstroPass is ERC721URIStorage, IERC2981, Ownable, IERC4906 { string private _contractURI; address private _royaltyReceiver; uint96 private _royaltyBps; // e.g., 500 = 5% constructor(string memory name_, string memory symbol_, string memory contractURI_, address royaltyReceiver_, uint96 royaltyBps_) ERC721(name_, symbol_) { _contractURI = contractURI_; _royaltyReceiver = royaltyReceiver_; _royaltyBps = royaltyBps_; } function mint(address to, uint256 tokenId, string memory tokenURI_) external onlyOwner { _safeMint(to, tokenId); _setTokenURI(tokenId, tokenURI_); } // ERC-2981 function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) { uint256 amount = (salePrice * _royaltyBps) / 10_000; return (_royaltyReceiver, amount); } function supportsInterface(bytes4 iid) public view override(ERC721, IERC165) returns (bool) { return iid == type(IERC2981).interfaceId || super.supportsInterface(iid); } // Collection-level metadata function contractURI() external view returns (string memory) { return _contractURI; } // Trigger marketplace refresh (off-chain callers listen) function bumpMetadata(uint256 tokenId) external onlyOwner { emit MetadataUpdate(tokenId); // ERC-4906 signal } }
Emit
MetadataUpdate or BatchMetadataUpdate when you change JSONs, then POST to OpenSea’s V2 refresh endpoint for the specific chain/contract/token. (eips-wg.github.io)
- Solana (Umi + Metaplex Token Metadata update):
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'; import { publicKey } from '@metaplex-foundation/umi'; import { updateV1 } from '@metaplex-foundation/mpl-token-metadata'; const umi = createUmi('https://api.mainnet-beta.solana.com'); async function updateUri(mint: string, newUri: string) { await updateV1(umi, { mint: publicKey(mint), // name/symbol optional; only update uri data: { name: null, symbol: null, uri: newUri, sellerFeeBasisPoints: null }, // requires update authority signer }).sendAndConfirm(umi); }
Only the update authority can change the on‑chain metadata fields like
uri; if the NFT was created immutable, it can’t be changed. (developers.metaplex.com)
If you’re using pNFTs, attach a Rule Set (e.g., the Metaplex Foundation rule set) to enforce marketplace behaviors. (developers.metaplex.com)
4) Index and refresh pipelines
- Solana:
- Subscribe to DAS webhooks on relevant mints/collections or Merkle tree addresses (for cNFTs). Use
/getAssetsByOwner
to reconcile state. (helius.dev)searchAssets
- Subscribe to DAS webhooks on relevant mints/collections or Merkle tree addresses (for cNFTs). Use
- Polygon/EVM:
- On any metadata change, queue an ERC‑4906 emit, wait for confirmations, then call
on OpenSea (API key required). Also handle manual refresh in edge cases. (docs.opensea.io)POST /api/v2/chain/{chain}/contract/{address}/nfts/{id}/refresh
- On any metadata change, queue an ERC‑4906 emit, wait for confirmations, then call
Security, royalties, and access control
- Royalties
- EVM: implement ERC‑2981 and register your contract‑level settings; marketplaces read
by convention. Some marketplaces may not enforce, but the interface standardizes retrieval. (eips.ethereum.org)royaltyInfo - Solana: Core supports enforced royalties; with Token Metadata, pNFTs plus Token Auth Rules create an authorization bottleneck to enforce transfer rules. (developers.metaplex.com)
- EVM: implement ERC‑2981 and register your contract‑level settings; marketplaces read
- Collection authenticity on Solana
- Always set and “verify” the collection; the verify instruction flips the flag and prevents imposters from attaching to your collection. (developers.metaplex.com)
- Gated content
- Use Lit Protocol for decrypt‑on‑ownership across EVM and Solana—encrypt media and let Lit issue decryption keys when on‑chain conditions are satisfied. Works with IPFS/Arweave. (developer-dev.litprotocol.com)
Cost and scale tips
- Solana
- Metaplex Core reduces minting compute and SOL cost via single‑account design; consider Core as default for new collections. (developers.metaplex.com)
- Compressed NFTs cut costs for very large collections; you will rely on DAS to read them and Bubblegum to modify. (solana.com)
- Polygon
- Same JSON serves Ethereum and Polygon; stabilize your reveal process with contractURI and ERC‑4906 so marketplaces refresh fast. OpenSea supports the conventional metadata shape and refresh semantics. (docs.opensea.io)
Ops runbook: avoiding support tickets
- Before mint
- Validate JSON against your schema; populate animation_url MIME types; keep media under practical limits (marketplaces recommend keeping files reasonably sized for performance). (docs.opensea.io)
- Pre‑pin CIDs to multiple providers and warm gateways; consider your own gateway for predictable UX. (dev.nft.storage)
- At mint
- Solana: set collection and verify; for pNFTs, attach the rule set now. (developers.metaplex.com)
- Polygon: set tokenURI and contractURI; configure ERC‑2981. (docs.opensea.io)
- On update
- Change the off‑chain JSON; for EVM emit ERC‑4906; call marketplace refresh; for Solana call
(if mutable). (eips-wg.github.io)updateV1
- Change the off‑chain JSON; for EVM emit ERC‑4906; call marketplace refresh; for Solana call
- Monitoring
- Track “time to visible update” on OpenSea/Magic Eden; alert if no refresh after X minutes; monitor webhooks/DAS streams for lag. (helius.dev)
Example: chain‑aware overlays table (what typically differs)
- URI scheme: ipfs:// vs ar:// (both fine)
- Royalties: ERC‑2981 vs sellerFeeBasisPoints/pNFT rules
- Collection pointer: contractURI vs Solana Collection + Verify
- Update signal: ERC‑4906 event vs Token Metadata update instruction
- Indexer: OpenSea/Magic Eden APIs vs DAS indexers for cNFTs (eips.ethereum.org)
Emerging practices we recommend
- Prefer Metaplex Core on Solana unless you need legacy compatibility; cost and compute savings add up at scale. (developers.metaplex.com)
- Standardize on ERC‑4906 for any dynamic EVM metadata; your reveals and trait fixes land faster across UIs. (eips-wg.github.io)
- Bake “version” and checksums into your JSON to make cache busting and integrity audits trivial.
- Use gateway subdomains and multi‑pinning; plan for provider churn. With NFT.Storage Classic uploads decommissioned, decide on Pinata, Lighthouse, web3.storage, or your own cluster. (nft.storage)
Implementation checklist
- Storage
- Upload assets + JSON to IPFS (CIDv1) or Arweave; replicate/pin across providers; set up your gateway and CDN. (docs.ipfs.tech)
- EVM/Polygon
- ERC‑721/1155 implementation with
;tokenURI - ERC‑2981 royalties;
-
with collection JSON;contractURI() - Emit ERC‑4906 on updates; integrate OpenSea refresh API. (eips.ethereum.org)
- ERC‑721/1155 implementation with
- Solana
- Metaplex Core mint (or Token Metadata);
- Set collection and Verify;
- If pNFT, attach Token Auth Rule Set;
- For cNFT at scale, wire DAS + webhooks. (developers.metaplex.com)
- Observability
- Webhooks/DAS subscriptions;
- Metadata freshness SLO dashboards per marketplace. (helius.dev)
Tooling we use in 2026
- Solana: Metaplex Core/Token Metadata SDKs, Helius DAS, webhooks. (developers.metaplex.com)
- EVM/Polygon: OpenZeppelin contracts, OpenSea API, Magic Eden APIs, Covalent/GoldRush add‑ons where appropriate. (docs.opensea.io)
Note: check chain IDs if you branch to Polygon zkEVM (1101) vs Polygon PoS (137). (docs.polygon.technology)
How 7Block Labs can help
- Multichain metadata platformization: we implement the canonical/overlay model, write schemas, and ship the refresh/indexing automation.
- Storage reliability engineering: multi‑pinning, custom gateways/CDN, integrity checks, and incident runbooks.
- Migration support: off SimpleHash/Reservoir to Helius/Alchemy/Covalent with zero downtime cutovers. (alchemy.com)
- Solana‑first design: Core/pNFT rollouts, rule‑set authoring, and DAS pipelines.
If you’re planning a launch or migrating existing collections to a multichain footprint, we’ll scope a 2–3 week sprint to stand up the whole pipeline.
Appendix: JSON and collection‑level examples
- OpenSea‑compatible token metadata fields: name, description, image, animation_url, attributes, external_url, background_color. (docs.opensea.io)
- Collection‑level contractURI JSON: include banner_image, featured_image, external_link, collaborators. (docs.opensea.io)
By adopting this blueprint—canonical metadata, standards‑first overlays, resilient storage, and automated refresh/indexing—you can run one clean metadata system across Solana and Polygon that scales to millions of assets without chaos.
Like what you're reading? Let's build together.
Get a free 30‑minute consultation with our engineering team.

