{"id":"ERC-5496","name":"Multi-privilege Management NFT","status":"Last Call","chain":"both","category":{"id":"security","name":"Security & Trust","description":"Helping users verify, control, and protect their assets"},"journeyStages":[{"id":"approving","name":"Approving & Permissioning","description":"Granting permissions for actions"}],"uxImpact":"ERC-5496 adds per-user NFT privileges queried with hasPrivilege(tokenId, privilegeId, user) and provider-defined expiry. Assignment/revocation rules and optional clonePrivilege support are implementation-specific; separate privilege holder from owner.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-5496","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","hasDetailedContent":true,"content":{"id":"ERC-5496","summary":"ERC-5496 extends ERC-721 with multiple privileges that can be assigned to users and checked independently of NFT ownership. A privilege has a provider-defined expiry through privilegeExpires, and an optional cloneable extension can copy a privilege; implementations decide assignment authority and the practical access policy.","applicability":{"whenToUse":["An NFT needs separate privilege assignments for named users with queryable expiry.","The product can check hasPrivilege(tokenId, privilegeId, user) for the actual user.","Clone controls are shown only when the optional IERC721Cloneable interface is supported."],"whenToAvoid":["The NFT does not implement the privilege interface or the target user/privilege lookup.","The product needs expiry or cloning guarantees the deployed implementation does not provide.","The UI cannot distinguish token owner from privilege holder."]},"designerTakeaways":["You can show one NFT's separate privilege slots and their current holders.","You can grant a privilege to a user without transferring the NFT when the implementation authorizes it.","You can call hasPrivilege(tokenId, privilegeId, user) and show privilegeExpires for the selected user."],"problemsSolved":[{"problem":"NFTs represent only single permissions","oldWay":"Need separate NFTs for VIP access, parking, and merch discount","newWay":"One NFT can expose multiple privilege slots with separate users and expiry timestamps","impact":"critical"},{"problem":"Can't grant temporary access without full transfer","oldWay":"Lend entire NFT (and all privileges) or nothing","newWay":"The access check can ask hasPrivilege(tokenId, privilegeId, user) for a specific user","impact":"high"},{"problem":"No standard way to check multiple perks","oldWay":"Custom logic per project to track entitlements","newWay":"A product can show privilege holder and NFT owner as separate roles","impact":"high"},{"problem":"Privileges can't expire independently","oldWay":"Whole NFT valid or invalid, no per-perk expiry","newWay":"The product can query privilegeExpires and display the deployed implementation's expiry rules","impact":"medium"},{"problem":"Hard to revoke specific access without burning NFT","oldWay":"Must issue new NFT with reduced privileges","newWay":"When the optional cloneable extension is supported, a privilege can be copied through clonePrivilege; reassignment or revocation remains implementation-specific","impact":"medium"}],"uxPatterns":[{"name":"Multi-Privilege NFT Card","description":"Display all privileges on a single NFT","mockup":"concept/nft-gallery","userFlow":["User opens a privilege-bearing NFT","App reads privilegeIds and current assignment","App checks hasPrivilege(tokenId, privilegeId, user) for the connected user","Shows privilege holder, NFT owner, and privilegeExpires separately"]},{"name":"Privilege Delegation","description":"Show the privilege holder, expiry timestamp, and action scope for the selected user.","mockup":"generic/vault-deposit","userFlow":["User selects NFT to share from","Picks specific privilege to delegate","Enters recipient address","Sets duration/expiry for delegation","Confirms transaction","Recipient gains privilege access"]},{"name":"Privilege Verification Gate","description":"Offer privilege sharing only when the deployed contract supports setPrivilege or the optional cloneable extension.","mockup":"concept/wallet","userFlow":["Gate displays required privilege","User scans QR or connects wallet","System checks hasPrivilege()","Verifies not expired","Shows if direct ownership or delegated","Grants or denies access"]},{"name":"Privilege Management Dashboard","description":"Show assignment and optional clone controls; expose revocation only when the deployed implementation supports it.","mockup":"generic/token-transfer","userFlow":["User opens privilege manager","Sees outgoing and received assignments","App shows any implementation-supported reassignment or revoke action","Clone controls appear only when clonePrivilege is supported","App refreshes hasPrivilege and privilegeExpires"]}],"uiComponents":[{"name":"PrivilegeBadge","description":"Visual indicator for a single privilege status","states":["active","expiring-soon","expired","used","delegated"],"props":["privilegeId","name","expiresAt","isDelegated"]},{"name":"PrivilegeTimeline","description":"Visual timeline of privilege validity","states":["before","active","ended"],"props":["startDate","endDate","privilegeName"]},{"name":"DelegationCard","description":"Shows assignment details and a revoke/reassignment action only when the implementation exposes one.","states":["active","expiring","revoked"],"props":["privilege","delegatee","expiresAt","onRevoke"]},{"name":"PrivilegeVerifier","description":"Real-time privilege checking component","states":["checking","verified","denied","expired"],"props":["tokenId","privilegeId","address"]}],"antiPatterns":[{"pattern":"Not showing which privileges are delegated vs owned","why":"Users confused about what they can actually use vs lend","instead":"Call hasPrivilege(tokenId, privilegeId, user) for the actual user and display privilegeExpires separately.","severity":"critical"},{"pattern":"Allowing privilege use after expiry without clear error","why":"Frustrating when access fails at the gate","instead":"Explain expiry as a timestamp read from the deployed contract; do not assume one universal duration or automatic renewal.","severity":"high"},{"pattern":"No revocation UI for delegated privileges","why":"Users can't retract access they granted","instead":"Show the implementation-supported reassignment or revoke action; offer clonePrivilege only when IERC721Cloneable is advertised.","severity":"high"},{"pattern":"Bundling all privileges into one indistinguishable token","why":"Users can't see or manage individual perks","instead":"Itemized privilege list with individual management","severity":"medium"},{"pattern":"Not showing remaining uses for consumable privileges","why":"User doesn't know if they have uses left","instead":"Show \"2/5 uses remaining\" for limited privileges","severity":"medium"}],"keyTakeaways":["ERC-5496 attaches multiple user privileges to an NFT.","hasPrivilege requires tokenId, privilegeId, and user.","Read privilegeExpires and the deployed assignment rules; expiry is not a universal product promise.","Treat cloning as an optional extension and capability-gate its UI.","Keep NFT ownership and privilege holding visibly separate."],"technicalNotes":"ERC-5496 defines setPrivilege(tokenId, privilegeId, user, expires), privilegeExpires(tokenId, privilegeId), and hasPrivilege(tokenId, privilegeId, user). The specification recommends a maximum privilege number and says expires should be less than 30 days in the base interface guidance. IERC721Cloneable and clonePrivilege(tokenId, privilegeId, referrer) are optional.","lastUpdated":"2026-09-18","sources":[{"label":"ERC-5496 official specification","url":"https://ercs.ethereum.org/ERCS/erc-5496","type":"official-spec"}],"lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5496","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-5496","type":"discussion"},{"label":"ERC-5496 official specification","url":"https://ercs.ethereum.org/ERCS/erc-5496","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5496","markdown":"https://www.eipsfordesigners.com/standards/ERC-5496/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5496/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5496","official":"https://ercs.ethereum.org/ERCS/erc-5496","discussion":"https://ethereum-magicians.org/search?q=ERC-5496"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}