{"id":"ERC-5008","name":"ERC-721 Nonce 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-5008 supplies a per-token nonce and NonceChanged stale-order signal for ERC-721 integrations; it does not define permits, signatures, listing approval, or gasless transfers. Show separate order authorization and refresh stale listings when the nonce changes.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-5008","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","hasDetailedContent":true,"content":{"id":"ERC-5008","summary":"ERC-5008 is the ERC-721 Nonce Extension. It exposes nonce(tokenId), and an implementation updates that nonce when a transfer or other relevant state change invalidates pending orders. It provides a stale-order and replay-protection signal; it does not define permit(), signatures, listing approval, an EIP-712 domain, or gasless NFT transfers.","applicability":{"whenToUse":["An NFT listing or order flow needs to query the ERC-721 nonce extension for stale-order detection.","The product can invalidate cached listings when the token nonce changes.","Any separate signed permit or listing authorization is supplied by the actual order implementation."],"whenToAvoid":["The token does not implement the ERC-721 nonce extension.","The product needs a signed NFT permit or listing API; use a permit standard or contract that actually provides it.","The order system cannot query nonce changes before accepting or displaying a listing."]},"designerTakeaways":["You can query the token nonce and warn when a listing or order may be stale.","You can invalidate cached orders when a transfer or other relevant state change updates the nonce.","You can show the token and order implementation that supplies any separate signed permit or listing authorization."],"problemsSolved":[{"problem":"Marketplace orders can become stale after an NFT transfer","oldWay":"An order remains visible without showing that token state changed","newWay":"Query the token nonce and reject or refresh an order whose recorded nonce no longer matches","impact":"critical"},{"problem":"Old orders can be reactivated after relevant token state changes","oldWay":"Order systems have no standard per-token invalidation signal","newWay":"A nonce change invalidates the order context the marketplace recorded","impact":"critical"},{"problem":"Users cannot tell why a listing needs review","oldWay":"A stale listing looks identical to a current listing","newWay":"Show a stale-order warning and request a fresh order when the nonce changes","impact":"high"},{"problem":"Different order systems read token state inconsistently","oldWay":"Each integration invents its own token-state version field","newWay":"Use nonce(tokenId) as the token-side signal while keeping order semantics in the marketplace","impact":"medium"}],"uxPatterns":[{"name":"Nonce-aware NFT Listing","description":"Show the token nonce recorded when a listing was created and compare it before accepting an order.","mockup":"concept/nft-gallery","userFlow":["User opens a listing","App reads current nonce(tokenId)","App compares it with the order's recorded nonce","Listing is available only when the integration's checks pass"]},{"name":"Stale Order Warning","description":"Explain when token state changed after an order was created.","mockup":"concept/nft-gallery","userFlow":["Nonce differs from the order","Listing is marked stale","User sees transfer/state-change context","App asks for a fresh order or removes the listing"]},{"name":"Nonce Refresh","description":"Refresh marketplace state after a token event changes the nonce.","mockup":"concept/nft-gallery","userFlow":["App observes transfer or relevant token event","Order is rechecked","UI updates status","User can create a new order if supported"]},{"name":"Implementation Boundary","description":"Explain which separate contract supplies signed permits or listing authorization.","mockup":"concept/nft-gallery","userFlow":["User reviews order details","App identifies token nonce support","App labels any separate permit/listing mechanism","User signs or submits only the supported action"]}],"uiComponents":[{"name":"NonceStatus","description":"Show the current token nonce and whether the order matches it.","states":["loading","current","stale","unsupported"],"props":["tokenId","currentNonce","orderNonce"]},{"name":"StaleListingBanner","description":"Explain why a listing needs a fresh order after token state changes.","states":["hidden","warning","refreshing","resolved"],"props":["reason","onRefresh"]},{"name":"OrderImplementationDisclosure","description":"Identify the token and marketplace mechanisms that authorize an order.","states":["loading","available","unsupported"],"props":["token","authorizationModel"]}],"antiPatterns":[{"pattern":"Treating ERC-5008 as an NFT permit","why":"The extension defines a nonce and event, not permit(), signatures, or listing authorization.","instead":"Label nonce-based stale-order protection and document any separate permit or order contract.","severity":"critical"},{"pattern":"Accepting an order without checking the recorded nonce","why":"A transfer or relevant state change may have invalidated the order context.","instead":"Compare the current token nonce with the order's recorded nonce before display and execution.","severity":"critical"},{"pattern":"Showing a stale listing as executable","why":"Users cannot tell that token state changed after the order was created.","instead":"Mark it stale and request a fresh order when the integration supports it.","severity":"high"},{"pattern":"Using permit language for nonce invalidation","why":"Users may believe they granted a spender an authorization the token does not define.","instead":"Separate token-state invalidation from any signed authorization supplied by another standard or contract.","severity":"high"}],"keyTakeaways":["ERC-5008 supplies a per-token nonce signal for stale-order protection.","It does not define permit(), signed listings, or gasless NFT transfers.","Compare the current nonce with the order's recorded nonce.","Keep marketplace authorization and signature semantics in the selected implementation.","Show stale, refreshed, and unsupported states clearly."],"technicalNotes":"ERC-5008 adds nonce(uint256 tokenId) and the NonceChanged event to ERC-721. The nonce changes when a transfer or other relevant token property change invalidates pending orders. It does not add permit(), a signature format, an EIP-712 domain, or a universal listing flow. ERC-4494 or a custom marketplace contract may provide separate NFT permit semantics.","lastUpdated":"2026-09-18","sources":[{"label":"ERC-5008 official specification","url":"https://ercs.ethereum.org/ERCS/erc-5008","type":"official-spec"}],"lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5008","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-5008","type":"discussion"},{"label":"ERC-5008 official specification","url":"https://ercs.ethereum.org/ERCS/erc-5008","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5008","markdown":"https://www.eipsfordesigners.com/standards/ERC-5008/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5008/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5008","official":"https://ercs.ethereum.org/ERCS/erc-5008","discussion":"https://ethereum-magicians.org/search?q=ERC-5008"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}