{"id":"ERC-5484","name":"Consensual Soulbound Tokens","status":"Final","chain":"both","category":{"id":"identity","name":"Identity & Privacy","description":"Who you are on-chain, and what you choose to reveal"},"journeyStages":[{"id":"approving","name":"Approving & Permissioning","description":"Granting permissions for actions"},{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"ERC-5484 extends ERC-721 for soulbound tokens whose burn authorization is agreed before issuance. The issuer presents metadata and burnAuth, obtains the receiver's signature off-chain, then issues the token; after issuance burnAuth is immutable and transfer remains disabled. The interface has no pending accept/decline token state.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-5484","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-5484","specConstraints":[{"id":"issuance-consent","constraint":"The receiver must see the metadata and burn authority and consent before issuance.","appliesTo":"application","normativity":"normative","specQuote":"- `burnAuth` SHALL be presented to receiver before issuance.\n- `burnAuth` SHALL be Immutable after issuance.\n- `burnAuth` SHALL be the sole factor that determines which party has the rights to burn token.\n- The issuer SHALL present token metadata to the receiver and acquire receiver's signature before issuance.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5484#specification","designImplication":"Build the consent request before minting, showing the credential and who can burn it. Do not invent an on-chain pending-token accept or decline function."},{"id":"immutable-burn-authority","constraint":"Burn authority is fixed after issuance.","appliesTo":"application","normativity":"normative","specQuote":"burnAuth SHALL be Immutable after issuance.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5484#specification","designImplication":"Show the agreed burn authority before consent and in the credential's details. Do not offer a later setting that implies this field can be changed."},{"id":"immutable-token-metadata","constraint":"The issuer must not change token metadata after issuance.","appliesTo":"application","normativity":"normative","specQuote":"The issuer SHALL NOT change metadata after issuance.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5484#specification","designImplication":"Show the agreed metadata before consent and retain it in credential details. Do not offer an issuer edit action that implies an issued credential can be rewritten."}],"summary":"ERC-5484 extends ERC-721 for soulbound tokens whose burn authorization is agreed before issuance. The issuer presents metadata and burnAuth, obtains the receiver's signature off-chain, then issues the token; after issuance burnAuth is immutable and transfer remains disabled. The interface has no pending accept/decline token state.","applicability":{"whenToUse":["A soulbound issuer can present metadata and BurnAuth and obtain receiver consent before issuance.","The product can model request, signature, mint, and failure states off-chain without inventing token functions.","Post-issuance UI reads burnAuth and the Issued event for the immutable burn rule."],"whenToAvoid":["The issuer cannot obtain recipient consent before issuance.","The product requires a pending on-chain accept/decline token state.","The app cannot show burnAuth before the recipient signs."]},"designerTakeaways":["You can show BurnAuth and the metadata before the recipient signs consent.","You can present the product's off-chain request, consent, and mint handshake as app behavior.","You can show the immutable burn rule after Issued is observed and query burnAuth() for the token."],"problemsSolved":[{"problem":"A recipient needs to consent to an immutable burn rule","oldWay":"The issuer mints first and explains burn rights later","newWay":"The issuer presents metadata and burnAuth before acquiring the receiver signature","impact":"high"},{"problem":"Soulbound issuances need interoperable burn authorization","oldWay":"Every issuer uses different enum values and discovery","newWay":"burnAuth and Issued expose the declared rule","impact":"high"},{"problem":"Users need to know whether a token is bound","oldWay":"Wallets treat the asset as an ordinary NFT until transfer fails","newWay":"Issued plus ERC-721/ERC-165 support identifies the soulbound issuance","impact":"medium"}],"uxPatterns":[{"name":"Pre-Issuance Consent","description":"Show metadata and BurnAuth before the receiver signs consent.","userFlow":["Issuer prepares token metadata","Receiver reviews metadata and burnAuth","Receiver signs the app's consent message","Issuer mints only after consent is obtained","App records the handoff state"]},{"name":"Issued Token Detail","description":"Show immutable burn authorization after the Issued event.","userFlow":["App observes Issued and Transfer","Reads burnAuth(tokenId)","Shows issuer/owner/both/neither rule","Explains that the token is non-transferable"]},{"name":"Burn Authorization Explainer","description":"Explain each BurnAuth option without suggesting an accept transaction.","userFlow":["User opens burn policy","App shows the declared enum","Explains who may burn","Links to issuer policy and implementation"]},{"name":"Consent Failure Recovery","description":"Handle off-chain consent, rejection, or expired request as app states.","userFlow":["Receiver declines or request expires","App marks the request incomplete","Issuer can create a new request","No pending token is shown unless the app tracks one off-chain"]}],"uiComponents":[{"name":"ConsentModal","description":"Off-chain consent request modal shown before issuance.","states":["requesting","reviewing","signed","declined","expired"],"props":["credential","issuer","burnAuth","onSign","onDecline"]},{"name":"PendingConsentBadge","description":"Shows app-tracked consent requests that have not produced an issuance.","states":["none","few","many"],"props":["count","onClick"]},{"name":"BurnAuthIndicator","description":"Shows who can burn the token","states":["issuer-only","owner-only","both","neither"],"props":["burnAuth","issuer","showDetails"]},{"name":"SoulboundBadge","description":"Shows issuance and current soulbound state after the Issued event.","states":["not-issued","issued","burned"],"props":["status","burnAuth","tooltip"]},{"name":"ConsentRequestInbox","description":"Lists app-tracked off-chain credential offers before issuance.","states":["empty","has-pending","has-spam"],"props":["requests[]","onSign","onDecline"]}],"antiPatterns":[{"pattern":"Minting a pending token and waiting for on-chain accept","why":"ERC-5484 requires receiver consent before issuance and defines no pending accept function.","instead":"Model request and signature off-chain, then issue only after consent.","severity":"critical"},{"pattern":"Calling acceptPendingToken or decline on the token contract","why":"Those functions are not part of the interface.","instead":"Use the app's request state and the issuer's mint flow.","severity":"critical"},{"pattern":"Hiding BurnAuth until after mint","why":"The receiver must see burn authorization before signing consent.","instead":"Show BurnAuth and metadata in the pre-issuance review.","severity":"high"}],"keyTakeaways":["ERC-5484 acquires receiver consent before issuance.","Show metadata and BurnAuth before the receiver signs.","Issued and burnAuth expose the immutable post-issuance rule.","Pending, accept, decline, and request expiry are app behavior, not token-interface functions."],"technicalNotes":"ERC-5484 requires ERC-165 and ERC-721 compatibility, presents burnAuth and metadata before issuance, and acquires the receiver signature before issuance. The required interface defines BurnAuth { IssuerOnly, OwnerOnly, Both, Neither }, Issued, and burnAuth(uint256 tokenId). It has no acceptPendingToken, decline, TokenBound, or pending-token function; burnAuth is immutable after issuance.","lastUpdated":"2026-09-18","sources":[{"label":"ERC-5484 official specification","url":"https://ercs.ethereum.org/ERCS/erc-5484","type":"official-spec"}],"lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5484","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-5484","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5484","markdown":"https://www.eipsfordesigners.com/standards/ERC-5484/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5484/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5484","official":"https://ercs.ethereum.org/ERCS/erc-5484","discussion":"https://ethereum-magicians.org/search?q=ERC-5484"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}