{"id":"ERC-4400","name":"Consumable NFT Extension","status":"Final","chain":"both","category":{"id":"gaming","name":"Gaming & Composability","description":"Building complex interactive NFT systems"},"journeyStages":[{"id":"approving","name":"Approving & Permissioning","description":"Granting permissions for actions"},{"id":"specialized","name":"Specialized Interactions","description":"Physical items, AI, social, gaming"}],"uxImpact":"ERC-4400 records a consumer identity for an NFT without changing ownership. The consumer is not automatically an owner, operator, or approved transfer address; the consuming app defines which actions, if any, that role permits.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-4400","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-4400","specConstraints":[{"id":"consumer-not-owner-or-operator","constraint":"A consumer role must not count as NFT ownership, operator, or approval and cannot transfer or approve the NFT.","appliesTo":"application","normativity":"normative","specQuote":"Every contract implementing the `EIP721Consumable` extension is free to define the permissions of a `consumer` (e.g. what are consumers allowed to do within their system) with only one exception - consumers MUST NOT be considered owners, authorised operators or approved addresses as per the EIP-721 specification. Thus, they MUST NOT be able to execute transfers & approvals.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-4400#specification","designImplication":"Show consumer access as a separate capability. Do not give a consumer the owner’s transfer or approval controls."},{"id":"consumer-resets-on-transfer","constraint":"Every transfer changes the consumer to the default address.","appliesTo":"application","normativity":"normative","specQuote":"On every `transfer`, the consumer MUST be changed to a default address. It is RECOMMENDED for implementors to use `address(0)` as that default address.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-4400#specification","designImplication":"Clear consumer access after an NFT transfer and require the new owner to establish a new consumer relationship."},{"id":"consumer-permission-scope","constraint":"Implementations must restrict consumer permissions to the intended use case even when consumers cannot transfer or burn NFTs.","appliesTo":"application","normativity":"security-considerations","specQuote":"## Security Considerations\n\nImplementors of the `EIP721Consumable` standard must consider thoroughly the permissions they give to `consumers`. Even if they implement the standard correctly and do not allow transfer/burning of NFTs, they might still provide permissions to the `consumers` that they might not want to provide otherwise and should be restricted to `owners` only.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-4400#security-considerations","designImplication":"Document the exact actions a consumer can take and keep them narrower than owner actions."},{"id":"erc721-consumer-compatibility","constraint":"The consumer extension is compatible with current ERC-721 standards.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"## Backwards Compatibility\n\nThis standard is compatible with current EIP-721 standards. There are no other standards that define a similar role for NFTs and the name (`consumer`) is not used by other EIP-721 related standards.","specSection":"Backwards Compatibility","specUrl":"https://ercs.ethereum.org/ERCS/erc-4400#backwards-compatibility","designImplication":"Keep ERC-721 ownership and transfer views available while adding a separate consumer role."}],"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-4400","type":"official-spec"}],"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","summary":"ERC-4400 records a consumer identity for an NFT without changing ownership. The consumer is not automatically an owner, operator, or approved transfer address; the consuming app defines which actions, if any, that role permits.","designerTakeaways":["You can show dual badges Owner: you and Consumer: builder.eth on detail pages.","Your Assign consumer flow stays distinct from Transfer and explains the app-specific actions granted.","You can list active consumers on owner settings with a Revoke consumer role action, then re-check app permissions."],"applicability":{"whenToUse":["Metaverse land, game items, or equipment need use-without-transfer.","Owner-consumer split is on-chain via ERC-4400.","Both parties use same dApp."],"whenToAvoid":["ERC-4907 rental with expiry suffices.","No consumer utilities implemented.","Simple ownership-only NFTs."]},"prototypeFirst":[{"screen":"Dual role detail header","why":"Instant clarity on owner vs consumer.","covers":["You are owner","You are consumer","Third party viewing"],"include":["Role banners","Owner row","Consumer row","Role-specific CTAs"]},{"screen":"Assign consumer sheet","why":"Delegation must not feel like sale.","covers":["Assign","Replace consumer"],"include":["Consumer address","Not a transfer callout","Confirm assign"]},{"screen":"Consumer action view","why":"Consumer sees permitted in-app actions only.","covers":["Allowed build","Blocked transfer"],"include":["You can use","Owner-only actions grayed"]},{"screen":"Revoke consumer access","why":"Owner ends delegation.","covers":["Revoke confirm"],"include":["Consumer name","Revoke warning","Immediate effect note"]}],"mentalModel":[{"label":"Owner","description":"Legal/on-chain holder — can transfer and assign consumer."},{"label":"Consumer","description":"Consumer identity without ownership; permitted actions come from the consuming app."},{"label":"Assign vs transfer","description":"Assign keeps owner; transfer changes owner."},{"label":"Revoke","description":"Owner clears the consumer role; app permissions may use additional policy and must be re-evaluated."},{"label":"Viewer context","description":"UI adapts to You are owner / You are consumer."}],"statesToDesign":[{"state":"Owner, no consumer","trigger":"Default holding.","userNeed":"Assign or use as owner.","designResponse":"Assign consumer optional CTA."},{"state":"Owner with active consumer","trigger":"Consumer set.","userNeed":"Monitor and revoke.","designResponse":"Consumer row in settings with Revoke."},{"state":"You are consumer","trigger":"Connected as consumer.","userNeed":"See which app actions this consumer role permits.","designResponse":"Consumer banner; hide transfer and approval actions, and show only app-defined permissions."},{"state":"Revoked consumer","trigger":"Owner revoked.","userNeed":"Consumer knows the role ended.","designResponse":"Consumer role cleared notice; reload app-specific permissions on next load."},{"state":"Third party viewer","trigger":"Neither owner nor consumer.","userNeed":"See both roles.","designResponse":"Owner and Consumer rows read-only."}],"designDecisions":[{"question":"Show consumer history?","recommendation":"Last 3 consumers in owner settings.","rationale":"Audit without full explorer."},{"question":"Consumer can transfer?","recommendation":"Never — hide transfer for consumer role.","rationale":"Prevents confusion and exploits."},{"question":"Assign vs rent (4907)?","recommendation":"4400 for indefinite use grant; 4907 for time rental.","rationale":"Pick standard matching product semantics."}],"problemsSolved":[{"problem":"Full transfer to lend utility","oldWay":"Temporary transfer risks not getting back","newWay":"Consumer role without ownership change","impact":"high"},{"problem":"Consumer thinks they own NFT","oldWay":"Same UI for all connected wallets","newWay":"You are consumer banner","impact":"high"},{"problem":"Forgotten open delegations","oldWay":"Consumer retains access silently","newWay":"Active consumer row with revoke","impact":"medium"}],"uxPatterns":[{"name":"Owner Consumer Dual Badge","description":"Parallel role display on NFT detail.","components":["OwnerBadge","ConsumerBadge","RoleBanner"],"userFlow":["Open NFT","See roles","Actions gated by role"]},{"name":"Assign Consumer Flow","description":"Delegate use without transfer.","components":["AssignSheet","NotTransferCallout","RevokeButton"],"userFlow":["Owner taps Assign","Enters address","Confirms","App checks the consumer role and grants configured actions"]}],"antiPatterns":[{"pattern":"Assign consumer copy says Transfer","why":"Owner accidentally sells","instead":"Assign a consumer role, explain the app-specific permissions, and state that ownership stays unchanged","severity":"critical"},{"pattern":"Consumer sees Transfer button","why":"Failed txs and confusion","instead":"Hide transfer and approval actions for the consumer role; show only permissions granted by the app","severity":"high"},{"pattern":"No active consumer indicator for owner","why":"Forgotten delegations","instead":"Consumer row in owner settings always visible","severity":"medium"}],"vocabulary":[{"use":"Assign someone to use","avoid":"Set consumer address","why":"Delegation language."},{"use":"You are using this","avoid":"Consumer role active","why":"Second-person clarity."},{"use":"Revoke access","avoid":"Clear consumer","why":"Permission language."}],"technicalNotes":"ERC-4400 standardizes the consumer identity and its events. A consumer is not the owner, operator, or approved transfer address, and assigning or clearing consumerOf does not define every application permission. Read the consuming app's policy before enabling utility; clearing the role clears that role signal, not necessarily every off-chain or contract-specific permission.","relatedStandards":[{"id":"ERC-4907","relationship":"Time-bound rental alternative"},{"id":"ERC-2135","relationship":"Consumer may trigger consumable use"}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-4400","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-4400","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-4400","markdown":"https://www.eipsfordesigners.com/standards/ERC-4400/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-4400/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-4400","official":"https://ercs.ethereum.org/ERCS/erc-4400","discussion":"https://ethereum-magicians.org/search?q=ERC-4400"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}