{"id":"ERC-7432","name":"Non-Fungible Token Roles","status":"Final","chain":"both","category":{"id":"nft","name":"NFT Capabilities","description":"What NFTs can do beyond basic ownership"},"journeyStages":[{"id":"approving","name":"Approving & Permissioning","description":"Granting permissions for actions"},{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"Multiple custom roles (not just user/owner) can be assigned to NFTs with expiration and custom data. Design implications: display role badges per NFT (e.g., 'Manager', 'Tenant', 'Beneficiary'), show role assignment/revocation flows, visualize role hierarchies and permissions, design role marketplace for granting/revoking. Design decisions: how many roles to display before truncating, whether to show technical role IDs or friendly names, complexity of multi-role management UI vs simplified views.","hasDetailedContent":true,"content":{"id":"ERC-7432","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7432","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Multiple custom roles (not just user/owner) can be assigned to NFTs with expiration and custom data.","designerTakeaways":["You can display role chips on every NFT card — Manager until Mar 12, not raw role id 3.","Your assign flow can pick role type, recipient, and expiry in one guided sheet.","You can disable owner-only actions for role holders with clear This requires owner copy."],"applicability":{"whenToUse":["NFTs represent assets with delegated permissions.","Multiple parties interact with same token differently.","Roles have expiry or custom metadata worth showing."],"whenToAvoid":["Simple ERC-721 with owner-only actions.","Only user/owner dual roles — ERC-4907 suffices.","Role count would overwhelm UI without truncation strategy."]},"prototypeFirst":[{"screen":"NFT detail role roster","why":"Everyone opens detail to see who holds which role.","covers":["Multiple roles","Expired role","Empty"],"include":["Role chips","Holder address","Expiry per role","Assign role CTA"]},{"screen":"Assign role sheet","why":"Owners delegate without transferring NFT.","covers":["Pick role","Set expiry","Confirm"],"include":["Role picker","Recipient field","Expiry date","Permission summary"]},{"screen":"Role holder view","why":"Delegates see what they can do.","covers":["Active role","Expired","Revoked"],"include":["You are Manager banner","Allowed actions list","Expiry countdown"]},{"screen":"Role marketplace listing","why":"Some products grant roles without selling NFT.","covers":["Grant role listing","Purchase role"],"include":["Role type","Duration","Price","NFT reference"]}],"mentalModel":[{"label":"Owner","description":"Ultimate control — can assign and revoke roles."},{"label":"Role assignment","description":"Permission bundle granted to another address for a period."},{"label":"Role expiry","description":"Automatic revocation — UI must countdown and update without user tx."},{"label":"Custom role data","description":"Extra fields per role — show human summary, not raw bytes."},{"label":"Action gating","description":"Buttons enable based on caller role, not just ownership."}],"statesToDesign":[{"state":"Owner — full control","trigger":"Viewer is token owner.","userNeed":"Assign, revoke, transfer.","designResponse":"All actions enabled; role management section visible."},{"state":"Active role holder","trigger":"Viewer holds non-owner role.","userNeed":"Know permitted actions and expiry.","designResponse":"Role banner with allowed actions; owner actions hidden."},{"state":"Role expiring soon","trigger":"Expiry within warning window.","userNeed":"Renew or finish tasks.","designResponse":"Amber countdown on role chip and notification."},{"state":"Expired role","trigger":"Past expiry block.","userNeed":"Understand permissions ended.","designResponse":"Expired badge; disabled former actions with explanation."},{"state":"Revoked by owner","trigger":"Owner revoked role early.","userNeed":"Not assume access remains.","designResponse":"Access ended notice; remove role from active roster."}],"designDecisions":[{"question":"How many roles to show on thumbnail?","recommendation":"Max two chips plus +N more on card.","rationale":"Dense role lists clutter grids."},{"question":"Friendly names vs role ids?","recommendation":"Map ids to names from contract metadata or app config.","rationale":"Role id 4 means nothing to users."},{"question":"Notify on expiry?","recommendation":"Push or email before expiry for high-value roles.","rationale":"Silent expiry causes failed critical actions."}],"problemsSolved":[{"problem":"Only owner can act on NFT","oldWay":"Transfer NFT to delegate temporarily","newWay":"Grant Manager role while retaining ownership","impact":"high"},{"problem":"Unclear who can use an asset","oldWay":"Try action and revert","newWay":"Role roster visible before interaction","impact":"high"},{"problem":"Forgotten delegations","oldWay":"Roles linger without visibility","newWay":"Expiry countdowns and revoke controls","impact":"medium"}],"uxPatterns":[{"name":"Role Roster Panel","description":"List roles, holders, and expiry on NFT detail.","mockup":"concept/nft-gallery","components":["RoleChip","HolderRow","ExpiryTimer","AssignButton"],"userFlow":["Open NFT","See roles","Assign or revoke","Roster updates"]},{"name":"Role-Gated Actions","description":"Enable buttons based on viewer role.","mockup":"concept/permit-approval","components":["ActionButton","RoleGate","OwnerOnlyTooltip"],"userFlow":["User views NFT","UI checks role","Permitted actions enabled","Blocked show reason"]}],"seenInTheWild":[{"app":"ReNFT","url":"https://renft.io/","note":"Rental and delegation patterns inform role assignment UX."},{"app":"OpenSea","url":"https://opensea.io/","note":"Ownership display extends to delegated permission models."},{"app":"Decentraland","url":"https://decentraland.org/","note":"Land manager roles parallel custom NFT roles."}],"antiPatterns":[{"pattern":"Showing only owner with no role list","why":"Delegates discover limits at revert","instead":"Role roster on every detail page","severity":"high"},{"pattern":"Displaying raw role id integers","why":"Meaningless to users","instead":"Friendly role names from metadata","severity":"medium"},{"pattern":"No expiry warning","why":"Silent permission loss mid-task","instead":"Countdown and notification before expiry","severity":"high"}],"vocabulary":[{"use":"Manager until [date]","avoid":"Role 0x3 assigned","why":"Human role labels with expiry."},{"use":"Assign access","avoid":"Grant role bitmap","why":"Permission language over encoding."},{"use":"Requires owner","avoid":"onlyOwner modifier revert","why":"Plain gating explanation."}],"onMonad":[{"aspect":"Role assignment cost","ethereum":"Multiple role txs add up","monad":"Low fees encourage granular delegation","designImplication":"Offer batch assign in UI on Monad."},{"aspect":"Expiry updates","ethereum":"UI may lag after expiry block","monad":"Fast finality refreshes role state quickly","designImplication":"Auto-refresh detail page on expiry without manual reload."}],"technicalNotes":"ERC-7432 supports arbitrary roles; map ids to friendly names and always show expiry.","relatedStandards":[{"id":"ERC-4907","relationship":"Simpler user/owner dual role model"},{"id":"ERC-721","relationship":"NFT base with extended roles"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7432","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-7432","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/erc-7432","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-7432","markdown":"https://www.eipsfordesigners.com/standards/ERC-7432/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-7432/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-7432","official":"https://eips.ethereum.org/EIPS/erc-7432","discussion":"https://ethereum-magicians.org/search?q=ERC-7432"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}