NFT Collection
Non-fungible token collection with unique token IDs, metadata URIs, and badge-based ownership
Category: Token Types
Summary
Required standards: ["NFTs"]
For tradable NFTs: ["NFTs", "NFTMarketplace", "NFTPricingDenom:ubadge"]
validTokenIds: set to the range of unique token IDs (e.g. [{ "start": "1", "end": "100" }])
Each token ID represents a unique NFT; amount in transfers is typically "1"
Use {id} placeholder in tokenMetadata URI for per-token metadata (e.g. "ipfs://QmHash/{id}")
Mint approvals MUST have overridesFromOutgoingApprovals: true
Ownership times are usually forever for NFTs
Instructions
NFT Collection Configuration
When creating an NFT collection, follow this pattern:
Required Configuration
Standards: Include "NFTs" in the standards array
Example: "standards": ["NFTs"]
For tradable NFTs: "standards": ["NFTs", "NFTMarketplace", "NFTPricingDenom:ubadge"]
validTokenIds: Set to the range of unique token IDs
Example for 100 NFTs: [{ "start": "1", "end": "100" }]
Each token ID represents a unique NFT
Token Metadata: Each tokenMetadata entry must include tokenIds matching the range
Use {id} placeholder for per-token metadata URIs
Pattern Example
Sequential Minting with predeterminedBalances
For NFTs, use predeterminedBalances with incrementTokenIdsBy: "1" to mint tokens sequentially (token 1, then 2, then 3, etc.):
Key: incrementTokenIdsBy: "1" means each mint gets the next sequential token ID. Use maxNumTransfers to cap total mints and per-user mints.
IMPORTANT: predeterminedBalances and approvalAmounts are INCOMPATIBLE β use one or the other. NFTs use predeterminedBalances (not approvalAmounts).
NFT-Specific Gotchas
Each token ID is unique and represents a distinct NFT
Amount in transfers is typically "1" (one NFT per transfer)
Ownership times are usually forever for NFTs
Mint approvals MUST have overridesFromOutgoingApprovals: true
Use {id} in metadata URIs for per-token metadata
Common Mistakes
DON'T reuse token IDs across editions without understanding ownership times β each token ID is unique and represents a distinct NFT.
DON'T forget tokenIds in canUpdateTokenMetadata permission structure β the permission must specify which token ID ranges it covers.
DON'T use {id} in metadata name, description, or image fields β the {id} placeholder only works in the URI string itself (e.g. "ipfs://abc/{id}").
DON'T forget overridesFromOutgoingApprovals: true on Mint approvals β required for all minting operations.
DON'T use custom list IDs β only reserved IDs are valid: "All", "Mint", "!Mint", "AllWithoutMint", or direct bb1... addresses.
Last updated