{"id":"ERC-2135","name":"Consumable Interface","status":"Final","chain":"both","category":{"id":"gaming","name":"Gaming & Composability","description":"Building complex interactive NFT systems"},"journeyStages":[{"id":"specialized","name":"Specialized Interactions","description":"Physical items, AI, social, gaming"}],"uxImpact":"Users hold NFT tickets/passes that can be 'used' or 'consumed' — once consumed, the token is burned or marked used (like tearing a concert ticket).","officialUrl":"https://ercs.ethereum.org/ERCS/erc-2135","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-2135","specConstraints":[{"id":"consume-balance-and-event","constraint":"A successful consume operation emits the applicable transfer-to-zero event for the consumed token.","appliesTo":"application","normativity":"normative","specQuote":"in addition to `OnConsumption`, it **MUST** also emit the `Transfer` / `TransferSingle` event (as applicable) as if a token has been transferred from the current holder to the zero address if the call to `consume` method succeeds.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-2135#specification","designImplication":"Show consumption as a balance-changing terminal action and update token history from the emitted event."},{"id":"consume-access-control","constraint":"Consume access control should match the use case and transfer restrictions, and be checked with security tests and audits.","appliesTo":"application","normativity":"security-considerations","specQuote":"Compliant contracts should pay attention to the balance change when a token is consumed.\nWhen the contract is being paused, or the user is being restricted from transferring a token,\nthe consumeability should be consistent with the transferral restriction.\n\nCompliant contracts should also carefully define access control, particularly whether any EOA or contract account may or may not initiate a `consume` method in their own use case.\n\nSecurity audits and tests should be used to verify that the access control to the `consume`\nfunction behaves as expected.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-2135#security-considerations","designImplication":"Show who can consume the asset, account for pause and transfer restrictions, and require an explicit confirmation when the action is irreversible."},{"id":"consume-erc721-compatibility","constraint":"The consume interface is designed to work with ERC-721 and ERC-1155 NFTs.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"This interface is designed to be compatible with ERC-721 and NFT of ERC-1155.","specSection":"Backwards Compatibility","specUrl":"https://ercs.ethereum.org/ERCS/erc-2135#backwards-compatibility","designImplication":"Retain the underlying token ownership view and show consumption as a separate state transition."},{"id":"delegated-consumer","constraint":"The consume interface may let an NFT be consumed for someone other than the transaction initiator.","appliesTo":"application","normativity":"rationale","specQuote":"We choose to include an `address consumer` for `consume` function and `isConsumableBy` so that an NFT MAY be consumed for someone other than the transaction initiator.","specSection":"Rationale","specUrl":"https://ercs.ethereum.org/ERCS/erc-2135#rationale","designImplication":"When the deployment supports delegated consumption, show the beneficiary and transaction initiator separately before confirmation. Keep this as an available option, not a mandatory two-party flow."}],"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-2135","type":"official-spec"}],"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","summary":"Users hold NFT tickets/passes that can be 'used' or 'consumed' — once consumed, the token is burned or marked used (like tearing a concert ticket).","designerTakeaways":["You can badge Consumable on eligible items and lead with a prominent Use pass button.","Your confirm step can state This cannot be undone before wallet signature on single-use items.","You can show Uses remaining: 2 of 3 on multi-use consumables."],"applicability":{"whenToUse":["Event tickets, coupons, or in-game passes are single or limited use.","Consumption is on-chain and irreversible or counted.","Games or venues need redeem UX."],"whenToAvoid":["Permanent collectibles never consumed.","Consumption handled off-chain only.","Reversible use without burn semantics."]},"prototypeFirst":[{"screen":"Consumable pass detail","why":"Holder decides to use at venue or in-game.","covers":["Unused","Multi-use partial","Fully consumed"],"include":["Consumable badge","Use CTA","Uses remaining","Consumed overlay"]},{"screen":"Irreversible use confirm","why":"Single-use needs strong consent.","covers":["Confirm modal"],"include":["Cannot undo copy","Ack checkbox","Confirm use"]},{"screen":"Consumption history","why":"Multi-use and audit need timeline.","covers":["History list"],"include":["Used dates","Remaining count","Consumer address if delegated"]},{"screen":"Fully consumed archive","why":"Used tickets may stay as mementos.","covers":["Grayed consumed"],"include":["Used on [date]","No Use button","Optional hide filter"]}],"mentalModel":[{"label":"Consumable","description":"Token exists to be used, not traded indefinitely."},{"label":"Use action","description":"On-chain consume — may burn or decrement counter."},{"label":"Single vs multi-use","description":"One shot or N remaining — UI must show count."},{"label":"Consumer permission","description":"Query isConsumableBy for the declared consumer; the consumer identity may differ from the transaction initiator, owner, or delegate."},{"label":"Irreversibility","description":"Most consumption cannot undo — confirm accordingly."}],"statesToDesign":[{"state":"Ready to use","trigger":"Unused consumable.","userNeed":"Clear primary action.","designResponse":"Prominent Use pass CTA."},{"state":"Confirm consumption","trigger":"User tapped Use.","userNeed":"Understand permanence.","designResponse":"Modal with irreversible warning."},{"state":"Partially used","trigger":"Multi-use with remaining.","userNeed":"Track count.","designResponse":"Uses remaining chip."},{"state":"Fully consumed","trigger":"No uses left.","userNeed":"See memento not active pass.","designResponse":"Used badge; disable Use."},{"state":"Wrong consumer","trigger":"isConsumableBy says the declared consumer is not authorized, or the implementation rejects the caller.","userNeed":"Plain block.","designResponse":"Explain which consumer the implementation accepts; do not hard-code owner or delegate authority."}],"designDecisions":[{"question":"Reversible consumption UI?","recommendation":"Never imply undo unless contract supports it.","rationale":"False undo hope causes disputes at venue."},{"question":"Show consumed in wallet?","recommendation":"Gray archive tab, not hidden delete.","rationale":"Proof of attendance matters."},{"question":"Confirm strength for multi-use?","recommendation":"Lighter confirm when uses remain; full warning on last use.","rationale":"Friction scales with finality."}],"problemsSolved":[{"problem":"Fake reuse of spent tickets","oldWay":"Screenshot of QR reused","newWay":"On-chain consume marks spent","impact":"critical"},{"problem":"Users unsure if pass still valid","oldWay":"Ambiguous metadata","newWay":"Consumable badge and remaining uses","impact":"high"},{"problem":"Accidental tap burns pass","oldWay":"One tap consume","newWay":"Confirm modal with ack","impact":"high"}],"uxPatterns":[{"name":"Use Pass Flow","description":"Consumable redeem with irreversible confirm.","components":["UseButton","ConfirmModal","ConsumedBadge"],"userFlow":["Open pass","Tap Use","Confirm","Marked consumed"]},{"name":"Uses Remaining Counter","description":"Multi-use consumable countdown.","components":["UsesCounter","HistoryList"],"userFlow":["View pass","See 2 of 3","Use once","Counter updates"]}],"antiPatterns":[{"pattern":"Use button with no confirm on single-use","why":"Accidental burn at venue","instead":"Ack modal before signature","severity":"critical"},{"pattern":"Hiding remaining uses on multi-use","why":"Surprise when last use gone","instead":"Uses remaining on card and detail","severity":"high"},{"pattern":"Identical UI for consumed and active","why":"Gate staff confusion","instead":"Used overlay and disabled Use","severity":"high"}],"vocabulary":[{"use":"Use pass","avoid":"Call consume()","why":"Venue-friendly action."},{"use":"Uses remaining","avoid":"Consumption counter","why":"Plain counting language."},{"use":"Used — cannot reuse","avoid":"Token burned","why":"Outcome not EVM term."}],"technicalNotes":"ERC-2135 consumption is often irreversible; match confirm strength to single vs last use.","relatedStandards":[{"id":"ERC-4400","relationship":"Consumer role extension for consumables"},{"id":"ERC-721","relationship":"Consumable NFT interface"}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-2135","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-2135","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-2135","markdown":"https://www.eipsfordesigners.com/standards/ERC-2135/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-2135/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-2135","official":"https://ercs.ethereum.org/ERCS/erc-2135","discussion":"https://ethereum-magicians.org/search?q=ERC-2135"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}