# ERC-6551: Non-fungible Token Bound Accounts

Source: https://www.eipsfordesigners.com/standards/ERC-6551
Agent brief: https://www.eipsfordesigners.com/standards/ERC-6551/agent.md
Machine-readable JSON: https://www.eipsfordesigners.com/api/standards/ERC-6551
Last reviewed: 2026-04-05
Last updated: 2026-04-05

| Field | Value |
| --- | --- |
| Status | Review |
| Chain | both |
| Category | NFT Capabilities |
| Journey stages | Asset Discovery & Display, Asset Management |
| Detailed guide | Yes |
| Official specification | https://eips.ethereum.org/EIPS/eip-6551 |
| Discussion search | https://ethereum-magicians.org/search?q=ERC-6551 |

## UX Impact

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).

## 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.

## For Designers

- 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.

## Applicability

### When to Use

- 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.

### When to Avoid

- 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.

## Problems It Solves

### Game characters and inventory disconnected

Impact: critical

Old way: Character is one NFT, items are separate, manually bundle for sale

New way: Character owns items, sell character = sell everything

### NFT profiles can't hold assets

Impact: high

Old way: PFP NFT is just an image, can't accumulate value

New way: Your NFT collects airdrops, tips, achievements

### Tracking what belongs to what asset

Impact: high

Old way: Off-chain databases, manual tracking, trust the game server

New way: On-chain ownership: sword.owner = character.address

### NFT trading doesn't include accessories

Impact: medium

Old way: Buy ape, separately negotiate for hat, shirt, chain

New way: Buy ape, hat comes with it because ape owns hat

### Proving ownership history of nested assets

Impact: medium

Old way: Trust marketplace metadata, often wrong

New way: On-chain trail: this sword was owned by THIS hero

## Anti-Patterns

### Not showing TBA contents on NFT detail pages

Severity: critical

Buyers don't know what they're getting

Instead: Always fetch and display token bound account contents

### Allowing send to NFT without ownership warning

Severity: critical

User sends to NFT thinking owner will get it; NFT sells, assets gone

Instead: Clear warning: "Goes to NFT, not current owner"

### Assuming all NFTs have TBAs

Severity: high

TBAs must be deployed; some NFTs may not have one yet

Instead: Check if TBA exists, offer to create if not

### Hiding that NFTs can own assets

Severity: high

Users don't realize their NFT has unclaimed value

Instead: Proactive notification: "Your NFT received an airdrop"

### Not valuing bundled assets in listings

Severity: medium

Mispriced NFTs, buyer/seller confusion

Instead: Show estimated bundle value alongside NFT price

### Using technical term "Token Bound Account"

Severity: medium

Users don't understand what it means

Instead: "NFT Wallet", "NFT Inventory", "What's Inside"

## UI Components

### TokenBoundAccountView

Displays contents of an NFT's wallet
States: loading, empty, has-assets, error
Props: nftContract, tokenId, chainId

### NFTInventory

Grid/list of NFTs owned by another NFT
States: loading, empty, populated
Props: tbaAddress, onSelect, onTransfer

### SendToNFTForm

Form to send assets to an NFT's TBA
States: input, resolving, ready, sending, complete
Props: asset, onSend

### BundleValueEstimate

Calculates and displays total value of NFT + contents
States: calculating, ready, partial-data
Props: nftValue, bundledAssets[]

### TBACreator

Creates token bound account for NFT if not exists
States: checking, not-created, creating, exists
Props: nftContract, tokenId, implementation

## On Monad

### TBA Deployment Cost

Ethereum: ~50k gas to deploy TBA

Monad: Same cost but much cheaper in USD

Design implication: Can deploy TBAs liberally, even proactively

### Inventory Queries

Ethereum: Multiple RPC calls, can be slow

Monad: Parallel execution makes queries faster

Design implication: Can show real-time inventory updates

### Bundle Transfers

Ethereum: One NFT transfer = one transaction

Monad: Sub-second finality for complex transfers

Design implication: Instant feedback on inventory changes

### Reserve Balance

Ethereum: TBA can be drained to zero

Monad: TBA EOAs maintain 10 MON reserve for async execution safety

Design implication: Show spendable balance in NFT inventory

## Key Takeaways

- 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"

## UX Patterns

### NFT Inventory View

Show what an NFT owns inside its wallet

User flow:

- 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

Mockup registry key: `concept/nft-gallery` (React UI on the live standard page).

### Send to NFT

Send assets directly to an NFT's wallet

User flow:

- User selects "Send to NFT"
- Enters NFT ID or scans
- App resolves token bound account
- Shows ownership warning
- User confirms send

Mockup registry key: `concept/nft-gallery` (React UI on the live standard page).

### NFT Marketplace with Inventory

List NFTs showing what's bundled inside

User flow:

- Marketplace lists NFT for sale
- Fetches NFT's TBA contents
- Shows bundle value estimate
- Buyer sees total value
- Single purchase gets everything

Mockup registry key: `concept/nft-gallery` (React UI on the live standard page).

### Airdrop to NFT Holders

Send rewards directly to NFTs, not wallets

User flow:

- Project selects collection
- Configures airdrop amount
- System calculates all TBAs
- Shows preview
- Batch sends to all NFT wallets

Mockup registry key: `concept/nft-gallery` (React UI on the live standard page).

## Technical Notes

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.
