{"id":"ERC-6551","name":"Non-fungible Token Bound Accounts","status":"Review","chain":"both","category":{"id":"nft","name":"NFT Capabilities","description":"What NFTs can do beyond basic ownership"},"journeyStages":[{"id":"asset-display","name":"Asset Discovery & Display","description":"Seeing tokens, NFTs, and balances"},{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"NFTs have their own wallet addresses — tokens can own assets, sign messages, and interact with dApps. Design implications: show 'Token Bound Account' with address and contained assets, enable NFT-as-wallet interactions, display nested inventory inside NFT, indicate TBA-enabled tokens. Design decisions: how to visualize 'wallet inside NFT' concept, whether to expose TBA address or abstract it, complexity of NFT-initiated transactions, handling ownership transfers (assets follow NFT). 🟢 Widely deployed (tokenbound.org registry live).","hasDetailedContent":true,"content":{"id":"ERC-6551","summary":"ERC-6551 gives every NFT its own wallet address. Your character NFT can own a sword NFT, gold tokens, and other items. When you sell or transfer the character, everything inside goes with it. This transforms NFTs from static images into portable, composable identities and inventories.","applicability":{"whenToUse":["Your product addresses: game characters and inventory disconnected.","Your product addresses: nFT profiles can't hold assets.","The flow should deliver: character owns items, sell character = sell everything.","Inventory or transfer UI must show quantities and support multi-item actions."],"whenToAvoid":["Always fetch and display token bound account contents.","Clear warning: \"Goes to NFT, not current owner\".","Check if TBA exists, offer to create if not.","Assets are fungible tokens only with no unique-item semantics."]},"designerTakeaways":["You can design UI that delivers character owns items, sell character = sell everything.","You can design UI that delivers your NFT collects airdrops, tips, achievements.","You can design UI that delivers on-chain ownership: sword.owner = character.address."],"problemsSolved":[{"problem":"Game characters and inventory disconnected","oldWay":"Character is one NFT, items are separate, manually bundle for sale","newWay":"Character owns items, sell character = sell everything","impact":"critical"},{"problem":"NFT profiles can't hold assets","oldWay":"PFP NFT is just an image, can't accumulate value","newWay":"Your NFT collects airdrops, tips, achievements","impact":"high"},{"problem":"Tracking what belongs to what asset","oldWay":"Off-chain databases, manual tracking, trust the game server","newWay":"On-chain ownership: sword.owner = character.address","impact":"high"},{"problem":"NFT trading doesn't include accessories","oldWay":"Buy ape, separately negotiate for hat, shirt, chain","newWay":"Buy ape, hat comes with it because ape owns hat","impact":"medium"},{"problem":"Proving ownership history of nested assets","oldWay":"Trust marketplace metadata, often wrong","newWay":"On-chain trail: this sword was owned by THIS hero","impact":"medium"}],"uxPatterns":[{"name":"NFT Inventory View","description":"Show what an NFT owns inside its wallet","mockup":"concept/nft-gallery","userFlow":["User selects NFT in collection","App fetches NFT's token bound account","Queries account for owned assets","Displays inventory and balances","User can manage items"]},{"name":"Send to NFT","description":"Send assets directly to an NFT's wallet","mockup":"concept/nft-gallery","userFlow":["User selects \"Send to NFT\"","Enters NFT ID or scans","App resolves token bound account","Shows ownership warning","User confirms send"]},{"name":"NFT Marketplace with Inventory","description":"List NFTs showing what's bundled inside","mockup":"concept/nft-gallery","userFlow":["Marketplace lists NFT for sale","Fetches NFT's TBA contents","Shows bundle value estimate","Buyer sees total value","Single purchase gets everything"]},{"name":"Airdrop to NFT Holders","description":"Send rewards directly to NFTs, not wallets","mockup":"concept/nft-gallery","userFlow":["Project selects collection","Configures airdrop amount","System calculates all TBAs","Shows preview","Batch sends to all NFT wallets"]}],"uiComponents":[{"name":"TokenBoundAccountView","description":"Displays contents of an NFT's wallet","states":["loading","empty","has-assets","error"],"props":["nftContract","tokenId","chainId"]},{"name":"NFTInventory","description":"Grid/list of NFTs owned by another NFT","states":["loading","empty","populated"],"props":["tbaAddress","onSelect","onTransfer"]},{"name":"SendToNFTForm","description":"Form to send assets to an NFT's TBA","states":["input","resolving","ready","sending","complete"],"props":["asset","onSend"]},{"name":"BundleValueEstimate","description":"Calculates and displays total value of NFT + contents","states":["calculating","ready","partial-data"],"props":["nftValue","bundledAssets[]"]},{"name":"TBACreator","description":"Creates token bound account for NFT if not exists","states":["checking","not-created","creating","exists"],"props":["nftContract","tokenId","implementation"]}],"antiPatterns":[{"pattern":"Not showing TBA contents on NFT detail pages","why":"Buyers don't know what they're getting","instead":"Always fetch and display token bound account contents","severity":"critical"},{"pattern":"Allowing send to NFT without ownership warning","why":"User sends to NFT thinking owner will get it; NFT sells, assets gone","instead":"Clear warning: \"Goes to NFT, not current owner\"","severity":"critical"},{"pattern":"Assuming all NFTs have TBAs","why":"TBAs must be deployed; some NFTs may not have one yet","instead":"Check if TBA exists, offer to create if not","severity":"high"},{"pattern":"Hiding that NFTs can own assets","why":"Users don't realize their NFT has unclaimed value","instead":"Proactive notification: \"Your NFT received an airdrop\"","severity":"high"},{"pattern":"Not valuing bundled assets in listings","why":"Mispriced NFTs, buyer/seller confusion","instead":"Show estimated bundle value alongside NFT price","severity":"medium"},{"pattern":"Using technical term \"Token Bound Account\"","why":"Users don't understand what it means","instead":"\"NFT Wallet\", \"NFT Inventory\", \"What's Inside\"","severity":"medium"}],"onMonad":[{"aspect":"TBA Deployment Cost","ethereum":"~50k gas to deploy TBA","monad":"Same cost but much cheaper in USD","designImplication":"Can deploy TBAs liberally, even proactively"},{"aspect":"Inventory Queries","ethereum":"Multiple RPC calls, can be slow","monad":"Parallel execution makes queries faster","designImplication":"Can show real-time inventory updates"},{"aspect":"Bundle Transfers","ethereum":"One NFT transfer = one transaction","monad":"Sub-second finality for complex transfers","designImplication":"Instant feedback on inventory changes"},{"aspect":"Reserve Balance","ethereum":"TBA can be drained to zero","monad":"TBA EOAs maintain 10 MON reserve for async execution safety","designImplication":"Show spendable balance in NFT inventory"}],"keyTakeaways":["ERC-6551 = every NFT gets a wallet","Always show what's inside an NFT before purchase","Warn users when sending TO an NFT (not the owner)","Check if TBA exists before assuming it does","Use \"NFT Inventory\" not \"Token Bound Account\""],"technicalNotes":"ERC-6551 defines a registry contract that deploys minimal proxy accounts (ERC-1167) for any NFT. The account address is deterministic based on chain ID, token contract, token ID, salt, and implementation. Anyone can deploy a TBA for any NFT. The TBA implements ERC-165, ERC-1271 for signatures, and has an execute() function for the NFT owner to control it."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-6551","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-6551","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-6551","markdown":"https://www.eipsfordesigners.com/standards/ERC-6551/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-6551/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-6551","official":"https://eips.ethereum.org/EIPS/eip-6551","discussion":"https://ethereum-magicians.org/search?q=ERC-6551"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}