{"id":"ERC-5216","name":"ERC-1155 Allowance Extension","status":"Last Call","chain":"both","category":{"id":"transaction-friction","name":"Transaction Friction","description":"Reducing clicks, signatures, and mental overhead"},"journeyStages":[{"id":"approving","name":"Approving & Permissioning","description":"Granting permissions for actions"}],"uxImpact":"ERC-5216 adds per-token-ID allowances to ERC-1155 contracts that implement the extension. A user can authorize an operator for a quantity of one token ID while keeping other IDs outside that allowance. It coexists with ERC-1155's broader setApprovalForAll operator permission, so the UI must show which mechanism the deployed collection supports and which scope the user is granting.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-5216","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-5216","summary":"ERC-5216 adds per-token-ID allowances to ERC-1155 contracts that implement the extension. A user can authorize an operator for a quantity of one token ID while keeping other IDs outside that allowance. It coexists with ERC-1155's broader setApprovalForAll operator permission, so the UI must show which mechanism the deployed collection supports and which scope the user is granting.","partialDeployment":{"body":"ERC-5216 is Last Call. Treat granular allowance controls as conditional on the deployed ERC-1155 implementing the extension and the transfer path enforcing it; verify the allowance ABI and behavior before showing this UI."},"applicability":{"whenToUse":["The deployed ERC-1155 implements the ERC-5216 allowance extension.","Users need to limit an operator's quantity for specific token IDs.","The flow can show the operator, token ID, allowance amount, and remaining quantity.","The integration can explain its fallback when only setApprovalForAll is available."],"whenToAvoid":["The collection does not implement the ERC-5216 allowance extension.","The operation needs ERC-20 transferFrom semantics; ERC-1155 uses safeTransferFrom or safeBatchTransferFrom.","The product cannot show per-token remaining allowance or a fallback to setApprovalForAll."]},"designerTakeaways":["Show the operator, token ID, and quantity when the deployed ERC-1155 supports this allowance extension.","Let users set a specific allowance and show how much remains after transfers.","Keep setApprovalForAll available only when the integration chooses that broader operator scope.","Default to the exact amount needed and let the user increase it when the integration requires more.","Prefer a granular allowance when the deployed collection and transfer path support ERC-5216.","Show the token ID, operator, approved quantity, and remaining allowance after a transfer."],"problemsSolved":[{"problem":"ERC-1155 only offers all-or-nothing approval","oldWay":"setApprovalForAll gives access to EVERY token in the collection","newWay":"When the extension is implemented, approve an exact quantity for a token ID and consume it through its supported transfer path","impact":"critical"},{"problem":"No way to limit how many tokens can be spent","oldWay":"An operator can move every token ID covered by setApprovalForAll","newWay":"When ERC-5216 is implemented, set an amount for one token ID through its supported transfer path","impact":"critical"},{"problem":"Users must trust platforms with entire collection","oldWay":"Marketplace approval can cover all game items through setApprovalForAll","newWay":"Approve only the token IDs and quantities required by the integration","impact":"high"},{"problem":"Revoking requires removing all access","oldWay":"Can only toggle full collection access on/off","newWay":"Reduce allowance for specific token IDs independently","impact":"medium"},{"problem":"No transparency on what's actually approved","oldWay":"\"This site has access to your collection\" - but which tokens?","newWay":"Clear list: \"5 potions, 2 scrolls approved\"","impact":"medium"}],"uxPatterns":[{"name":"Granular Approval Selector","description":"Let users choose exactly how many of each token to approve","userFlow":["dApp requests token approval","UI shows all tokens user owns","User sets specific amounts per token","Summary shows total approved","Single transaction sets all allowances"]},{"name":"Approval Dashboard","description":"View and manage all active allowances","userFlow":["User opens approval dashboard","Sees all operators with allowances","Expands to see per-token breakdown","Can edit amounts or revoke per operator","Changes reflected immediately"]},{"name":"Trade Flow with Exact Approval","description":"Approve only what's needed for this trade","userFlow":["User selects items to sell","UI calculates exact approvals needed","Shows clear list of what will be approved","Single click approves exact amounts","Listing created with precise allowances"]},{"name":"Allowance Increase Request","description":"Handle when more allowance is needed mid-action","userFlow":["User attempts action requiring more allowance","UI shows current vs required","Offers sensible preset amounts","User picks or enters custom amount","Allowance increased, action proceeds"]}],"uiComponents":[{"name":"TokenAllowanceInput","description":"Input for setting allowance per token ID","states":["empty","valid","exceeds-balance","max"],"props":["tokenId","balance","currentAllowance","onChange"]},{"name":"AllowanceProgressBar","description":"Shows used vs remaining allowance","states":["full","partial","depleted"],"props":["used","total","tokenSymbol"]},{"name":"BatchAllowanceEditor","description":"Edit multiple token allowances at once","states":["viewing","editing","saving","saved"],"props":["operator","allowances[]","onSave","onCancel"]},{"name":"ApprovalComparisonCard","description":"Compare old (all-or-nothing) vs new (granular) approach","states":["showing-old","showing-new","comparing"],"props":["collection","requestedTokens"]}],"antiPatterns":[{"pattern":"Defaulting to max allowance for convenience","why":"Defeats the security purpose of granular allowances","instead":"Default to exact amount needed, let user increase if wanted","severity":"critical"},{"pattern":"Falling back to setApprovalForAll when available","why":"Users expect granular control when they see the UI","instead":"Offer granular allowance when supported, explain its scope, and preserve setApprovalForAll only as an explicit broader option","severity":"critical"},{"pattern":"Not showing remaining allowance after partial use","why":"Users don't know how much the operator can still spend","instead":"Show \"8/10 potions remaining\" after 2 are used","severity":"high"},{"pattern":"Bundling all tokens into one approval prompt","why":"Users can't see or control individual token allowances","instead":"Itemized list with per-token amount controls","severity":"high"},{"pattern":"No indication when contract doesn't support 5216","why":"User may think they have granular control when they don't","instead":"Clear warning: \"This collection only supports all-or-nothing approval\"","severity":"medium"}],"specConstraints":[{"id":"bounded-operator-allowance","constraint":"The extension gives an operator a limited quantity for one ERC-1155 token ID rather than unlimited approval for all IDs.","appliesTo":"wallet","normativity":"normative","specQuote":"Due to the nature of the blockchain, programming errors or malicious operators can cause permanent loss of funds. It is therefore essential that transactions are as trustless as possible. ERC-1155 uses the `setApprovalForAll` function, which approves ALL tokens with a specific `id`. This system has obvious minimum required trust flaws. This ERC combines ideas from [ERC-20](./eip-20.md) and [ERC-721](./eip-721.md) in order to create a trust mechanism where an owner can allow a third party, such as a marketplace, to approve a limited (instead of unlimited) number of tokens of one `id`.","specSection":"Motivation","specUrl":"https://ercs.ethereum.org/ERCS/erc-5216#motivation","designImplication":"Approval UI must show operator, token ID, and exact quantity, and distinguish this allowance from setApprovalForAll."},{"id":"erc1155-compat","constraint":"The allowance extension is compatible with ERC-1155.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"## Backwards Compatibility\n\nThis standard is compatible with [ERC-1155](./eip-1155.md).","specSection":"Backwards Compatibility","specUrl":"https://ercs.ethereum.org/ERCS/erc-5216#backwards-compatibility","designImplication":"Keep familiar ERC-1155 collection and transfer surfaces while adding the narrower approval scope where supported."},{"id":"approval-amount-risk","constraint":"Users should carefully consider the amount granted to operators and revoke unused authorizations.","appliesTo":"wallet","normativity":"security-considerations","specQuote":"## Security Considerations\n\nUsers of this ERC must thoroughly consider the amount of tokens they give permission to `operators`, and should revoke unused authorizations.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-5216#security-considerations","designImplication":"Default to the smallest useful amount, show remaining allowance, and provide a visible revoke/reduce path."}],"keyTakeaways":["ERC-5216 = ERC-20 style allowances for ERC-1155","Default to exact amounts needed, not max","Show remaining allowance after partial use","Clearly indicate when collection doesn't support granular approvals"],"technicalNotes":"ERC-5216 adds allowance(owner, operator, tokenId) and approve(operator, tokenId, amount) to ERC-1155. The approved amount is consumed by safeTransferFrom and safeBatchTransferFrom according to the extension; it does not add ERC-20 transferFrom. Operators must be approved for each token ID they transfer.","lastUpdated":"2026-09-18","sources":[{"label":"ERC-5216 official specification","url":"https://ercs.ethereum.org/ERCS/erc-5216","type":"official-spec"}],"lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5216","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-5216","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5216","markdown":"https://www.eipsfordesigners.com/standards/ERC-5216/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5216/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5216","official":"https://ercs.ethereum.org/ERCS/erc-5216","discussion":"https://ethereum-magicians.org/search?q=ERC-5216"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}