EIP-6551

EIP-6551 Token Bound Accounts (also known as ERC-6551) solve one of the longest-standing limitations of NFTs: they: are: passive: digital: ownership: records: that: cannot: DO: anything: on-chain: — they can be owned, transferred, and displayed but they cannot hold other assets, sign transactions, or participate in protocols as independent parties. EIP-6551: created: by: Brennan: Macdonald: and: the: Future: Primitive: team: and: published: to: the: EIP: repository: in: early: 2023: with: a: reference: implementation: deployed: that: year: — introduces: a: registry: contract that: any: user: can: call: to: deploy: a: smart: contract: wallet: for: ANY: existing: ERC-721: NFT: in: one: transaction: with: the: wallet: address: being: deterministically: derived: from: the: NFT’s: contract: address + token: ID: + chain: ID: (so: everyone: always: knows: what: the: TBA: address: for: any: given: NFT: will: be: even: before: it’s: deployed) enabling: applications: to: build: features: that: treat: NFTs: as: first-class: on-chain: identities: (accumulate: a: history: of: earning: spending: and: interacting: on: behalf: of: their: NFT: owner) rather: than: passive: collectibles: whose: only: on-chain: record: is: transfer: events.


Key Facts

  • EIP number: EIP-6551 (also known as ERC-6551 after finalization)
  • Authors: Brennan Macdonald, Future Primitive team + contributors
  • Published: 2023
  • Status: Final (implemented and deployed on Ethereum mainnet)
  • Registry address: 0x000000006551c19487814612e58FE06813775758 (same on all EVM chains)
  • Applies to: All existing + future ERC-721 NFTs (retroactive — no NFT modification needed)
  • Account type: ERC-6551Account (implements IERC165, IERC1271, IERC6551Account)
  • Key property: Account address is deterministic (computable without deploying)
  • Related: ERC-4337 (account abstraction), which TBAs can optionally implement

Problem EIP-6551 Solves

The following sections cover this in detail.

NFTs Are Passive Receipts

Before EIP-6551, an NFT (ERC-721 token):

  • Could be owned, transferred, and displayed ✅
  • Could NOT hold ETH, tokens, or other NFTs ❌
  • Could NOT sign messages or execute transactions ❌
  • Had no on-chain identity beyond its metadata + transfer history ❌
  • Was essentially a claim ticket, not an agent

Practical problem: if you want an NFT character (e.g., a gaming avatar NFT) to have items in its inventory, earn rewards, level up, or interact with DeFi protocols — you: couldn’t because the NFT is just a static token. The OWNER’s wallet did everything. When the NFT was sold, the new owner had to manually reconstruct any “state” that was tracked off-chain.

EIP-6551 Solution

Every: ERC-721: NFT: gets: a: smart: contract: wallet: that:

  • Is: permanently: tied: to: that: specific: NFT: (not: to: any: person’s: wallet)
  • Transfers: automatically: when: the: NFT: transfers
  • Can: hold: any: ERC-20: ERC-721: ERC-1155: or: ETH: balance
  • Can: execute: transactions: (signed: by: whoever: currently: owns: the: parent: NFT)
  • Can: sign: messages: (for: authentication: as: the: NFT’s: identity)

Key insight: the: NFT: owner: controls: the: TBA: — but: the: TBA: is: permanently: associated: with: the: NFT: not: the: owner: when: NFT: is: sold: new: owner: gets: both: the: NFT: AND: the: TBA: including: all: assets: in: the: TBA.


Technical Architecture

The protocol is built around the following components.

The Registry

EIP-6551: introduces: a: single: ERC6551Registry contract (deployed: at: the: same: deterministic: address: on: all: EVM: chains):

“`solidity

interface IERC6551Registry {

// Returns the address of the TBA for a specific NFT

function account(

address implementation,

bytes32 salt,

uint256 chainId,

address tokenContract,

uint256 tokenId

) external view returns (address);

// Deploys the TBA (creates the smart contract wallet)

function createAccount(

address implementation,

bytes32 salt,

uint256 chainId,

address tokenContract,

uint256 tokenId

) external returns (address);

}

“`

Key property: account() can compute the TBA address even before it’s deployed. This means:

  • Games: can: display: a: character’s: inventory: items: (in: the: TBA) without: the: TBA: being: deployed: yet
  • Protocols: can: airdrop: to: the: TBA: address: before: deployment
  • UIs: can: show: the: TBA’s: asset: holdings: by: looking: up: the: computed: address: on-chain

The Account Contract

The: TBA: itself: implements: a: minimal: interface:

“`solidity

interface IERC6551Account {

// Execute a transaction (only callable by NFT owner)

function execute(

address to,

uint256 value,

bytes calldata data,

uint8 operation

) external payable returns (bytes memory);

// Returns which NFT owns this account

function token() external view returns (uint256 chainId, address tokenContract, uint256 tokenId);

// Returns current state (incremented on each tx to prevent replay)

function state() external view returns (uint256);

}

“`


Use Cases

The following sections cover this in detail.

1. Gaming: Persistent Character Inventory

Most: important: use: case: for: EIP-6551:

  • Game: character: NFT: → has: a: TBA
  • Items: earned: in: game: (sword: armor: potions) are: ERC-1155: tokens: held: IN: the: character’s: TBA
  • Player: sells: character: NFT: → new: owner: receives: character + all: items: already: in: inventory
  • No: need: for: off-chain: databases: to: track: “which: items: belong: to: which: character” — it’s: all: on-chain: in: the: TBA

2. On-Chain Identity: Portfolio History

  • High-quality: NFT: (like: a: Nouns: DAO: NFT) → TBA: accumulates: years: of: on-chain: history
  • TBA: participates: in: governance: (DAO: votes: attributable: to: the: NFT: identity: not: the: owner: who: may: change)
  • TBA: holds: credentials: earned: over: time: (proof: of: attendance: tokens: protocol: contribution: badges)
  • This: creates: NFT: “character: history” that: makes: older: more: active: NFTs: more: valuable: (not: just: as: art: but: as: identity: assets: with: track: records)

3. DeFi: NFT as Collateral with Portfolio

  • An: NFT: with: money: in: its: TBA: is: more: useful: as: DeFi: collateral: than: a: bare: NFT
  • Example: borrow: against: an: NFT: that: has: ETH + USDC: in: its: TBA: (lender: gets: both: the: NFT: AND: the: TBA: assets: if: liquidated)
  • TBA: can: participate: in: DeFi: protocols: (provide: liquidity: earn: yield) building: up: the: NFT’s: value: over: time

4. Delegation and Hot/Cold Wallet Security

  • Cold: wallet: holds: the: NFT: (ultimate: owner: stored: safely)
  • TBA: can: delegate: signing: authority: to: a: hot: wallet: for: day-to-day: interactions
  • Gaming: or: social: interactions: happen: via: hot: wallet: but: the: official: “identity” remains: the: NFT: in: cold: storage
  • If: hot: wallet: is: compromised: attacker: can’t: transfer: the: NFT: (it’s: in: cold: storage): they: can: only: use: the: TBA: until: delegation: is: revoked

EIP-6551 vs. Soul Bound Tokens and Other Identity Proposals

Concept EIP-6551 TBA SBT (ERC-5114) Lens Profile
Transferable Yes (with parent NFT) No (non-transferable) Limited
Owns assets Yes No No
On-chain identity Via NFT history Via attestations Via social graph
Universal All ERC-721 NFTs New tokens only Lens platform only
Retroactive Yes No No

Key distinction: EIP-6551: creates: TRANSACTABLE: identity: (the: NFT: can: execute: transactions: sign: messages: hold: assets) while: SBTs: create: ATTESTATION: identity: (non-transferable: proof: of: credentials: but: no: active: capability): they: are: complementary: (SBTs: could: be: issued: INTO: a: TBA: creating: an: NFT: identity: that: holds: non-transferable: credentials).



Related Terms


Sources

  1. “EIP-6551: Token Bound Accounts — Specification and Motivation” — Ethereum EIP Repository / Future Primitive (2023). Primary specification document — explaining: the: motivation: (NFTs: as: identity: not: just: art: existing: approaches: required: changes: to: NFT: contracts: EIP-6551: is: retroactive: and: universal), the: full: technical: spec: (registry: interface: account: interface: state: storage: patterns: to: avoid: storage: collisions: between: different: TBA: implementations: for: the: same: NFT), implementation: guidelines: for: builders: (how: to: check: the: owner: of: a: TBA: using: IERC6551Account.token() + checking: the: current: ownerOf(): on: the: parent: NFT: contract: how: implementations: should: handle: the: reentrancy: attack: vector: where: a: TBA: could: call: its: own: parent: NFT: contract: in: a: way: that: creates: circular: ownership: — EIP-6551: explicitly: prohibits: implementations: from: allowing: a: TBA: to: own: the: parent: NFT: itself: because: this: would: create: a: loop).
  1. “Token Bound Accounts in Gaming: How EIP-6551 Enables Persistent On-Chain Inventories” — Manifold + Future Primitive (2023). Analysis of EIP-6551’s gaming applications — examining: concrete: implementations: like: Parallel: (TCG: on: Ethereum: where: card: NFTs: have: TBAs: that: hold: earned: rewards + cosmetics) Legend: of: Arcadia: (on-chain: RPG: where: character: NFTs: use: TBAs: to: hold: equipped: items) and: the: broader: design: implications: for: game: economies: (items: in: TBAs: can: be: verified: on-chain: by: anyone: → no: central: game: server: needed: for: inventory: validation: → games: can: be: interoperable: if: they: agree: to: recognize: common: item: standards).
  1. “EIP-6551 and On-Chain Identity: NFTs as Persistent Reputation Carriers” — Mirror.xyz / Paradigm Research (2024). Analysis of EIP-6551 as an identity primitive — examining: how: TBAs: transform: NFTs: from: static: collectibles: into: persistently-connected: on-chain: identities: that: accumulate: reputation: (DAO: votes: protocol: contributions: credential: issuances) across: time: and: multiple: owners: creating: the: concept: of: “NFT: legacy” (the: history: accumulated: in: a: TBA: is: permanently: associated: with: the: NFT: not: with: any: specific: owner: a: Nouns: DAO: NFT: that: has: voted: on: 200: proposals: over: 2: years: carries: that: history: even: after: being: transferred: to: a: new: owner).
  1. “EIP-6551 Security: Reentrancy, Circular Ownership, and Implementation Risks” — Trail of Bits + OpenZeppelin (2023). Security analysis of EIP-6551 implementations focusing on known attack vectors — examining: the: circular: ownership: attack: (a: TBA: registers: itself: as: the: owner: of: its: parent: NFT: creating: a: loop: where: the: TBA: can: call: execute(): to: transfer: away: the: parent: NFT: without: the: “real” owner’s: authorization: — the: EIP: specification: prohibits: this: but: naive: implementations: might: not: check: for: it), the: reentrancy: vector: (a: TBA: with: assets: in: it: could: be: recursively: called: during: a: token: transfer: if: the: implementation: doesn’t: follow: checks-effects-interactions: pattern), and: gas: griefing: attacks: (calling: createAccount(): for: many: NFTs: that: the: attacker: doesn’t: own: to: waste: gas: for: others: — the: deterministic: address: means: the: TBA: DOES: eventually: get: deployed: if: someone: pays: the: gas: but: front-running: someone’s: createAccount(): with: a: malicious: implementation: parameter).
  1. “The Market for NFT Identity: EIP-6551 Adoption, Secondary Market Impact, and the Future of TBAs” — Delphi Digital (2024). Market analysis of EIP-6551’s adoption trajectory — measuring: how: many: TBAs: have: been: created: (on-chain: data: from: registry: createAccount(): calls: across: all: EVM: chains), whether: TBA-enabled: NFTs: command: secondary: market: premiums: vs: non-TBA: versions: of: the: same: collection, and: what: the: 2-3: year: adoption: horizon: looks: like: if: gaming: and: identity: applications: of: EIP-6551: reach: meaningful: scale: (measurable: as: total: TBA: assets: held: across: all: deployed: accounts: vs: total: NFT: market: cap).