{"id":"ERC-5489","name":"NFT Hyperlink Extension","status":"Final","chain":"both","category":{"id":"nft","name":"NFT Capabilities","description":"What NFTs can do beyond basic ownership"},"journeyStages":[{"id":"asset-display","name":"Asset Discovery & Display","description":"Seeing tokens, NFTs, and balances"},{"id":"specialized","name":"Specialized Interactions","description":"Physical items, AI, social, gaming"}],"uxImpact":"NFTs have authorized hyperlink slots — owners grant addresses permission to set links on their tokens.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-5489","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-5489","specConstraints":[{"id":"slot-metadata-schema","constraint":"A slot URI must point to JSON conforming to the ERC-5489 metadata schema.","appliesTo":"application","normativity":"normative","specQuote":"* The URI MUST point to a JSON file that conforms to the \"EIP5489 Metadata JSON schema\".","specSection":"Specification — Interface — IERC5489","specUrl":"https://ercs.ethereum.org/ERCS/erc-5489#ierc5489","designImplication":"Validate slot metadata before rendering authorization details and show a safe fallback when the URI is unavailable or malformed."},{"id":"slot-authorization-created","constraint":"The authorization-created event is emitted when a slot is authorized to an address.","appliesTo":"application","normativity":"normative","specQuote":"The `SlotAuthorizationCreated` event MUST be emitted when a slot is authorized to an address.","specSection":"Specification — Interface — IERC5489","specUrl":"https://ercs.ethereum.org/ERCS/erc-5489#ierc5489","designImplication":"Use the event to show who received the slot authorization and when it became active."},{"id":"slot-authorization-revoked","constraint":"The authorization-revoked event is emitted when a slot authorization is revoked.","appliesTo":"application","normativity":"normative","specQuote":"The `SlotAuthorizationRevoked` event MUST be emitted when a slot authorization is revoked.","specSection":"Specification — Interface — IERC5489","specUrl":"https://ercs.ethereum.org/ERCS/erc-5489#ierc5489","designImplication":"Show revocation as a distinct terminal state and remove actions that depend on the revoked slot."},{"id":"slot-uri-updated","constraint":"The slot URI update event is emitted when a slot’s metadata URI changes.","appliesTo":"application","normativity":"normative","specQuote":"The `SlotUriUpdated` event MUSt be emitted when a slot's URI is changed.","specSection":"Specification — Interface — IERC5489","specUrl":"https://ercs.ethereum.org/ERCS/erc-5489#ierc5489","designImplication":"Refresh the metadata view after an update and retain the previous URI in history when provenance matters."},{"id":"slot-erc721-compatibility","constraint":"The slot extension can be adopted while remaining compatible with ERC-721.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"## Backwards Compatibility\n\nAs mentioned in the specifications section, this standard can be fully EIP-721 compatible by adding an extension function set.\n\nIn addition, new functions introduced in this standard have many similarities with the existing functions in EIP-721. This allows developers to easily adopt the standard quickly.","specSection":"Backwards Compatibility","specUrl":"https://ercs.ethereum.org/ERCS/erc-5489#backwards-compatibility","designImplication":"Keep ordinary NFT ownership views available beside slot authorization state."},{"id":"slot-authorization-model","constraint":"An hNFT owner MAY authorize a URL slot to an EOA or contract address and may revoke that authorization at any time.","appliesTo":"application","normativity":"rationale","specSection":"Abstract","specUrl":"https://ercs.ethereum.org/ERCS/erc-5489#abstract","designImplication":"Show the authorized slot manager, distinguish EOA and contract recipients, and make revocation an explicit state transition.","specQuote":"This EIP proposes a new extension for NFTs (non-fungible token, aka [EIP-721](./eip-721.md)): nft-hyperlink-extention (hNFT), embedding NFTs with hyperlinks, referred to as “hNFTs”. As owners of hNFTs, users may authorize a URL slot to a specific address which can be either an externally-owned account (EOA) or a contract address and hNFT owners are entitled to revoke that authorization at any time. The address which has slot authorization can manage the URL of that slot."}],"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5489","type":"official-spec"}],"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","summary":"NFTs have authorized hyperlink slots — owners grant addresses permission to set links on their tokens.","designerTakeaways":["You can show attached links as a curated Links section with icon and description, not raw URLs.","Your owner settings can authorize or revoke addresses per slot with clear permission scope.","You can warn on external link click with destination preview before opening new tab."],"applicability":{"whenToUse":["NFTs need authorized on-chain links — artist site, merch, license.","Multiple parties may update different slots.","On-chain link authorization is required."],"whenToAvoid":["Metadata JSON off-chain links suffice.","No slot management in product scope.","Cannot vet link destinations safely."]},"prototypeFirst":[{"screen":"NFT links section","why":"Visitors discover issuer-authorized related URLs from the token page while checking the destination separately.","covers":["One link","Multiple slots","Empty slots"],"include":["Link cards with icon","Description","External link icon","Empty slot placeholder"]},{"screen":"Authorize slot setter","why":"Owner delegates who can set link without transferring NFT.","covers":["Authorize","Revoke"],"include":["Slot picker","Address field","Permission summary","Revoke list"]},{"screen":"Set link as authorized party","why":"Brand or collaborator updates their slot.","covers":["Edit link","Submit"],"include":["URL field","Icon upload","Description","Preview card"]},{"screen":"External link safety interstitial","why":"Phishing risk on any clickable URL.","covers":["Leaving site warning"],"include":["Destination domain","Continue button","Report link"]}],"mentalModel":[{"label":"Hyperlink slot","description":"Fixed position on NFT for one curated link."},{"label":"Authorized setter","description":"Only listed addresses can update that slot."},{"label":"Owner control","description":"Owner grants/revokes setter permissions per slot."},{"label":"Link metadata","description":"Icon and description make links scannable; authorization provenance does not verify the destination."},{"label":"Destination verification","description":"Show who authorized the slot separately from domain, content, and safety checks for the destination."}],"statesToDesign":[{"state":"Links displayed","trigger":"Slots filled.","userNeed":"Scan linked resources with authorization and destination context.","designResponse":"Curated link cards below art."},{"state":"Empty slot","trigger":"Authorized but unset.","userNeed":"Owner or setter knows to fill.","designResponse":"Empty slot dashed card for authorized users only."},{"state":"Unauthorized edit attempt","trigger":"Non-setter tries update.","userNeed":"Clear block.","designResponse":"You are not authorized for this slot."},{"state":"Revoked setter","trigger":"Owner revoked address.","userNeed":"Setter knows access ended.","designResponse":"Access removed; existing link may remain until cleared per rules."},{"state":"External click","trigger":"Viewer clicks link.","userNeed":"Safe navigation.","designResponse":"Interstitial with domain highlight."}],"designDecisions":[{"question":"How prominent are links?","recommendation":"Below fold Links section, not overlay on art.","rationale":"Ad-like overlays hurt aesthetic and trust."},{"question":"Show raw URL?","recommendation":"Description primary; URL on hover or expand.","rationale":"Raw URLs look like phishing."},{"question":"Multiple slots UI?","recommendation":"Max 3 visible plus Manage slots for owner.","rationale":"Slot sprawl looks spammy."}],"problemsSolved":[{"problem":"Authorized links buried in metadata","oldWay":"Users never find artist site","newWay":"Structured authorized link slots on detail page, with destination verification handled separately","impact":"medium"},{"problem":"Anyone could claim fake links in description","oldWay":"Scam links in off-chain metadata","newWay":"Authorized setter per slot on-chain","impact":"high"},{"problem":"Collaborators need link update without ownership","oldWay":"Transfer NFT or share keys","newWay":"Grant slot authorization to brand address","impact":"medium"}],"uxPatterns":[{"name":"Curated Link Cards","description":"Icon, description, and safe external open.","components":["LinkCard","DomainPreview","ExternalIcon"],"userFlow":["View NFT","See links section","Click card","Interstitial","Opens site"]},{"name":"Slot Authorization Panel","description":"Owner grants/revokes link setters per slot.","components":["SlotList","AuthorizeForm","RevokeButton"],"userFlow":["Owner opens settings","Picks slot","Authorizes address","Setter can edit link"]}],"antiPatterns":[{"pattern":"Banner ads overlaying NFT art","why":"Destroys aesthetic; feels scammy","instead":"Links section below art","severity":"high"},{"pattern":"Direct open with no domain preview","why":"Phishing via authorized compromised setter","instead":"Interstitial showing destination domain","severity":"critical"},{"pattern":"Ten link slots equally prominent","why":"Link farm appearance","instead":"Cap visible slots; manage overflow in settings","severity":"medium"}],"vocabulary":[{"use":"Attached links","avoid":"Hyperlink slots","why":"Curatorial not technical."},{"use":"Allow [brand] to update link","avoid":"Authorize slot setter","why":"Permission plain language."},{"use":"You are leaving for [domain]","avoid":"External URI navigation","why":"Safety interstitial copy."}],"technicalNotes":"ERC-5489 authorizes addresses to set hyperlink slot values; it does not attest that a URI is official, safe, or controlled by the named issuer. Display setter authorization separately from domain/content verification and use interstitials for external opens.","relatedStandards":[{"id":"ERC-721","relationship":"Hyperlink extension on NFTs"},{"id":"ERC-5521","relationship":"Reference graph complements outbound links"}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5489","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-5489","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5489","markdown":"https://www.eipsfordesigners.com/standards/ERC-5489/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5489/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5489","official":"https://ercs.ethereum.org/ERCS/erc-5489","discussion":"https://ethereum-magicians.org/search?q=ERC-5489"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}