{"id":"ERC-1046","name":"Token Metadata","status":"Final","chain":"both","category":{"id":"comprehension","name":"Comprehension & Display","description":"Making blockchain data readable to humans"},"journeyStages":[{"id":"asset-display","name":"Asset Discovery & Display","description":"Seeing tokens, NFTs, and balances"}],"uxImpact":"ERC-20 tokens get rich metadata like NFTs — icons, descriptions, and images without manual token list curation. Design implications: fetch and display token images/icons from tokenURI, show descriptions in token detail views, support interop field to identify token type, handle missing/broken metadata gracefully. Design decisions: trust level for fetched metadata (SSRF risks), caching strategy for metadata, fallback displays when tokenURI fails, whether to prefer on-chain name() or metadata name.","hasDetailedContent":true,"content":{"id":"ERC-1046","summary":"ERC-1046 standardizes how tokens expose metadata—name, symbol, decimals, icon, description, and more via a URI. Instead of hardcoding token info or relying on centralized lists, wallets can fetch rich metadata directly from the token contract. This enables consistent branding, reduces reliance on token lists, and ensures users always see up-to-date token information.","applicability":{"whenToUse":["Your product addresses: token info depends on centralized token lists.","Your product addresses: fake tokens can impersonate real ones.","The flow should deliver: token contract points to authoritative metadata.","You are designing a rich token display experience with visible states and recovery paths."],"whenToAvoid":["Cross-reference with known contracts, show verification status.","Visual distinction: verified badge, warning for unknown.","Cache with reasonable TTL, refresh periodically.","Users never see addresses, amounts, or signing payloads in your UI."]},"designerTakeaways":["You can design UI that delivers token contract points to authoritative metadata.","You can design UI that delivers metadata URI verifiable from contract address.","You can standard icon field in metadata JSON."],"problemsSolved":[{"problem":"Token info depends on centralized token lists","oldWay":"Wallet fetches name/icon from Coingecko or static lists","newWay":"Token contract points to authoritative metadata","impact":"high"},{"problem":"Fake tokens can impersonate real ones","oldWay":"Scam token shows same name/symbol, users confused","newWay":"Metadata URI verifiable from contract address","impact":"high"},{"problem":"No standard way to include token icons","oldWay":"Icon lookup varies by wallet, often missing","newWay":"Standard icon field in metadata JSON","impact":"medium"},{"problem":"Token descriptions aren't available on-chain","oldWay":"Users must search externally to understand token","newWay":"Description in metadata, shown in wallet","impact":"medium"},{"problem":"Updating token info requires list maintainer action","oldWay":"Submit PR to token list, wait for merge","newWay":"Project updates their metadata URI directly","impact":"medium"}],"uxPatterns":[{"name":"Rich Token Display","description":"Show complete token info from metadata","mockup":"concept/nft-gallery","userFlow":["User taps on token in wallet","Wallet fetches tokenURI from contract","Parses JSON metadata","Displays rich token information","Shows verification that data is from contract"]},{"name":"Token Discovery with Metadata","description":"Add new tokens with auto-fetched info","mockup":"concept/nft-gallery","userFlow":["User pastes token address","Wallet checks for tokenURI function","Fetches and parses metadata","Shows preview with verification status","User adds token with confidence"]},{"name":"Scam Token Warning","description":"Detect potential impersonation attempts","mockup":"concept/nft-gallery","userFlow":["Token appears in wallet/dApp","Metadata claims to be known token","Contract address doesn't match","Clear warning displayed","Options to block or report"]},{"name":"Balance Display with Branding","description":"Token list with proper logos and info","mockup":"concept/nft-gallery","userFlow":["Wallet loads token balances","Fetches metadata for each token","Displays logo from metadata or placeholder","Shows verification status per token","Users can identify trusted vs unknown"]}],"uiComponents":[{"name":"TokenMetadataFetcher","description":"Fetch and parse token metadata from URI","states":["idle","fetching","parsed","error","no-metadata"],"props":["contractAddress","onMetadata","fallback"]},{"name":"TokenLogo","description":"Display token icon from metadata","states":["loading","loaded","fallback","error"],"props":["uri","symbol","size"]},{"name":"MetadataVerificationBadge","description":"Show metadata source and trust level","states":["verified","from-contract","from-list","unknown","suspicious"],"props":["source","contractAddress"]},{"name":"TokenDescription","description":"Expandable token description display","states":["collapsed","expanded","no-description"],"props":["description","maxLength"]}],"antiPatterns":[{"pattern":"Trusting metadata without verification","why":"Scam tokens can claim any name/logo","instead":"Cross-reference with known contracts, show verification status","severity":"critical"},{"pattern":"Showing unknown tokens same as verified ones","why":"Users can't distinguish trusted from suspicious","instead":"Visual distinction: verified badge, warning for unknown","severity":"critical"},{"pattern":"Not caching metadata","why":"Slow/expensive to fetch metadata on every view","instead":"Cache with reasonable TTL, refresh periodically","severity":"high"},{"pattern":"Hiding token contract address","why":"Address is ultimate source of truth","instead":"Always show contract address with easy copy","severity":"medium"},{"pattern":"Not handling missing metadata gracefully","why":"Many tokens won't have ERC-1046 metadata","instead":"Graceful fallback to on-chain name/symbol or \"Unknown\"","severity":"medium"}],"onMonad":[{"aspect":"Metadata Fetching","ethereum":"Fetching metadata may be slow if URI is on-chain","monad":"Fast reads for on-chain metadata URIs","designImplication":"Can fetch metadata in real-time without lag"},{"aspect":"Token Discovery","ethereum":"Indexing all tokens with metadata is slow","monad":"Faster indexing enables better token discovery","designImplication":"Can show \"all tokens with metadata\" views"},{"aspect":"Verification","ethereum":"Cross-referencing takes RPC calls","monad":"Fast verification checks","designImplication":"Real-time scam detection as tokens appear"},{"aspect":"New Token Support","ethereum":"Must wait for token list updates","monad":"Direct metadata enables instant new token support","designImplication":"New Monad tokens immediately show branding"}],"keyTakeaways":["ERC-1046 = standard way for tokens to expose metadata","Always verify metadata against contract address","Show clear distinction between verified and unknown tokens","Cache metadata but refresh periodically","On Monad: leverage fast reads for real-time metadata fetching"],"technicalNotes":"ERC-1046 adds a tokenURI() function returning a URI pointing to JSON metadata. The JSON follows a schema including: name, symbol, decimals, description, image (logo), external_url, and optional social links. This is similar to ERC-721/1155 metadata but for fungible tokens. Wallets should cache and periodically refresh metadata."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-1046","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-1046","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-1046","markdown":"https://www.eipsfordesigners.com/standards/ERC-1046/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-1046/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-1046","official":"https://eips.ethereum.org/EIPS/eip-1046","discussion":"https://ethereum-magicians.org/search?q=ERC-1046"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}