/Docsv1.0Built on Arc Β· by Circle
Technical

NFT Metadata & IPFS Storage

All NFT images and metadata are stored on IPFS β€” a decentralised, content-addressed file network β€” via Pinata. Your NFTs remain accessible permanently regardless of ArcaneFi's servers.

How NFT Metadata Works

When you mint an NFT, ArcaneFi uploads your metadata JSON to IPFS via Pinata and stores the resulting IPFS hash as the token's tokenURI on-chain in Arc. Files are retrieved via the Pinata gateway: https://gateway.pinata.cloud/ipfs/QmHash.

πŸ“Œ
Content addressing = permanenceIPFS hashes are derived from the content itself β€” the same file always produces the same hash. This means metadata cannot be silently changed after minting, and it remains accessible from any IPFS node worldwide.

SBT Dynamic Metadata

SBT badge metadata is different from regular NFT metadata. It is served dynamically by the ArcaneFi API at /api/sbt/metadata/[contractAddress]/[tokenId].

Each request generates personalised trait data for the specific token holder β€” combining on-chain data (mint timestamp from mintedAt(), recipient address from tokenRecipient()) with database records (XP at claim, streak at claim). Responses are cached for 1 hour.

JSON β€” SBT Dynamic Metadata
// GET /api/sbt/metadata/0xContractAddress/42
{
  "name": "ArcaneFi 7-Day Loyalist #42",
  "description": "Awarded for maintaining a 7-day streak on ArcaneFi",
  "image": "ipfs://QmBadgeArtHash...",   // Same art for all holders
  "attributes": [
    // Unique per token / holder:
    { "trait_type": "Holder",          "value": "0xWallet..." },
    { "trait_type": "Claimed At",      "value": "2026-02-15" },
    { "trait_type": "XP at Claim",     "value": 840 },
    { "trait_type": "Streak at Claim", "value": 7 },
    { "trait_type": "Tier",            "value": "Bronze" },
    { "trait_type": "Soulbound",       "value": "true" }
  ]
}