{"id":"EIP-747","name":"wallet_watchAsset","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":"DApps prompt users to add tokens with one click — no manual contract address copying. Design implications: show token add prompt with icon/name/symbol preview, verify token against known lists before suggesting, display security warnings for suspicious tokens. Design decisions: permission model (always prompt vs remember preference), how to handle spam token add requests, verification level before showing token (metadata fetch vs trust dapp), blocking malicious token suggestions.","hasDetailedContent":true,"content":{"id":"EIP-747","summary":"EIP-747 is the \"Add Token\" button. It lets dApps request that wallets track a new token. User swaps for a new token, clicks \"Add to Wallet\", and the token appears in their balance. Without this, users would have to manually enter contract addresses to see new tokens.","applicability":{"whenToUse":["Your product addresses: new tokens don't show in wallet.","Your users think tokens are lost.","The flow should deliver: click \"Add to Wallet\", token appears.","You are designing a add token after swap experience with visible states and recovery paths."],"whenToAvoid":["Auto-prompt add token after receiving new asset.","Always require user action to add.","Display address and verification status.","Users never see addresses, amounts, or signing payloads in your UI."]},"designerTakeaways":["You can design UI that delivers click \"Add to Wallet\", token appears.","You can design UI that delivers prompt to add token immediately after swap.","You can design UI that delivers app provides verified contract address."],"problemsSolved":[{"problem":"New tokens don't show in wallet","oldWay":"Find contract address, copy it, add token manually","newWay":"Click \"Add to Wallet\", token appears","impact":"high"},{"problem":"Users think tokens are lost","oldWay":"\"I swapped but don't see anything!\" (token not tracked)","newWay":"Prompt to add token immediately after swap","impact":"high"},{"problem":"Wrong tokens added by mistake","oldWay":"User adds scam token with similar name","newWay":"App provides verified contract address","impact":"medium"}],"uxPatterns":[{"name":"Add Token After Swap","description":"Prompt to track new token post-transaction","mockup":"concept/nft-gallery","userFlow":["User completes swap","App detects new token received","Prompts to add to wallet","User clicks \"Add Token\"","Calls wallet_watchAsset","Token now visible in wallet"]},{"name":"Token Page Add Button","description":"Add token from info/detail page","mockup":"concept/verify-safety","userFlow":["User views token page","Clicks \"Add to Wallet\"","Wallet shows add token popup","User approves","Token tracked in wallet"]}],"uiComponents":[{"name":"AddToWalletButton","description":"Button to trigger wallet_watchAsset","states":["idle","adding","added","error","no-wallet"],"props":["token","onAdd","onError"]},{"name":"TokenAddedConfirmation","description":"Success message after token added","states":["hidden","shown"],"props":["token","onDismiss"]},{"name":"TokenPreview","description":"Shows token details before adding","states":["loading","loaded"],"props":["address","symbol","decimals","image"]}],"antiPatterns":[{"pattern":"Not prompting to add after swap","why":"User doesn't see new token, thinks it failed","instead":"Auto-prompt add token after receiving new asset","severity":"high"},{"pattern":"Adding tokens without user consent","why":"Spam tokens could fill wallet","instead":"Always require user action to add","severity":"medium"},{"pattern":"Not showing contract address","why":"User can't verify it's the right token","instead":"Display address and verification status","severity":"medium"}],"onMonad":[{"aspect":"Token Tracking","ethereum":"Standard wallet_watchAsset","monad":"Same API, may need Monad-specific logo URLs","designImplication":"Works identically"}],"keyTakeaways":["EIP-747 = \"Add to Wallet\" button","Prompt to add tokens after swaps/receives","Always show contract address for verification","Never add tokens without user consent","Use wallet_watchAsset RPC method"],"technicalNotes":"EIP-747 defines wallet_watchAsset RPC method. Parameters: { type: \"ERC20\", options: { address, symbol, decimals, image } }. Returns boolean success. Most wallets show confirmation popup. Image should be publicly accessible URL (IPFS or HTTPS). Only ERC-20 widely supported, NFT support varies."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-747","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-747","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-747","markdown":"https://www.eipsfordesigners.com/standards/EIP-747/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-747/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-747","official":"https://eips.ethereum.org/EIPS/eip-747","discussion":"https://ethereum-magicians.org/search?q=EIP-747"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}