{"id":"EIP-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":"NFTs have nonces that change on transfer — prevents reactivation attacks where old marketplace listings become valid again. Design implications: show listing validity warnings ('This listing may be stale'), auto-cancel orders when nonce changes detected, indicate when an NFT was recently transferred. Design decisions: tradeoff between surfacing technical details (nonces) vs abstracting them, must decide how prominently to warn about potentially dangerous legacy listings on non-5008 NFTs.","hasDetailedContent":true,"content":{"id":"EIP-5008","summary":"EIP-5008 brings the permit pattern (gasless approvals) to NFTs. Instead of paying gas to approve an NFT transfer, users sign a message off-chain. The signature can be submitted by anyone—the marketplace, buyer, or a relayer. This enables gasless NFT listings, smoother auction flows, and better mobile experiences where users shouldn't need ETH just to list an item.","applicability":{"whenToUse":["Your product addresses: listing an NFT requires a gas-paying approval transaction.","Your users need ETH before they can sell their NFTs.","The flow should deliver: sign a message (free) → List immediately.","Fee screens need estimates, speed options, and plain-language breakdowns."],"whenToAvoid":["Clear language: \"This allows X to transfer your NFT when sold\".","Show expiration prominently: \"Valid until Feb 14, 2026\".","Permit dashboard showing all active approvals with cancel buttons.","The flow is a single low-risk transfer where batching adds confusion."]},"designerTakeaways":["You can design UI that delivers sign a message (free) → List immediately.","You can design UI that delivers sign permit.","You can design UI that delivers single signature, instant listing."],"problemsSolved":[{"problem":"Listing an NFT requires a gas-paying approval transaction","oldWay":"Connect wallet → Approve marketplace → Pay $5 gas → Wait → List","newWay":"Sign a message (free) → List immediately","impact":"critical"},{"problem":"Users need ETH before they can sell their NFTs","oldWay":"New user with NFT airdrop must buy ETH first to approve and sell","newWay":"Sign permit, marketplace submits it and deducts from sale proceeds","impact":"critical"},{"problem":"Mobile UX suffers from approval transactions","oldWay":"Multiple wallet popups, gas estimation, waiting for confirmation","newWay":"Single signature, instant listing","impact":"high"},{"problem":"Batch NFT operations require multiple approvals","oldWay":"Approve each NFT individually (or set approval-for-all)","newWay":"Sign multiple permits, submit all in one transaction","impact":"high"},{"problem":"Auction bidding flows are clunky with on-chain approvals","oldWay":"Approve before bidding, approval may expire or be front-run","newWay":"Sign permit with bid, only executed if you win","impact":"medium"}],"uxPatterns":[{"name":"Gasless NFT Listing","description":"List NFTs for sale without paying gas for approval","mockup":"concept/nft-gallery","userFlow":["User selects NFT to list","Enters price and duration","Clicks \"Sign to List\"","Wallet shows signature request (not transaction)","Signature stored off-chain","Listing appears immediately"]},{"name":"Permit Signature Request","description":"Clear wallet prompt explaining the gasless approval","mockup":"concept/permit-approval","userFlow":["Wallet receives permit signature request","Shows human-readable permit details","Explains what permission is being granted","User signs or cancels","Signature returned to dApp"]},{"name":"Bulk Listing Flow","description":"List multiple NFTs with a single signature","mockup":"concept/nft-gallery","userFlow":["User selects multiple NFTs","Sets individual prices","Single signature request shown","All permits generated from one signature","All listings go live simultaneously"]},{"name":"Cancel Listing UI","description":"Revoke permit by incrementing nonce","mockup":"concept/permit-approval","userFlow":["User views active listings","Clicks cancel on listing","Chooses free (wait) or fast (on-chain)","Fast option increments nonce, invalidating permit","Listing removed immediately"]}],"uiComponents":[{"name":"GaslessListingBadge","description":"Indicates listing/approval is free via permit","states":["available","not-supported","pending-signature"],"props":["supported","onLearnMore"]},{"name":"PermitSignatureModal","description":"Explains what the permit signature authorizes","states":["loading","ready","signing","error"],"props":["tokenId","spender","deadline","onSign","onCancel"]},{"name":"NonceDisplay","description":"Shows current nonce and explains invalidation","states":["current","incrementing","incremented"],"props":["nonce","pendingPermits"]},{"name":"BulkPermitManager","description":"Handle multiple permits in one UX flow","states":["selecting","configuring","signing","complete"],"props":["tokens[]","onBulkSign","maxBatch"]}],"antiPatterns":[{"pattern":"Not explaining what permit signatures authorize","why":"Users may not understand they're pre-authorizing a transfer","instead":"Clear language: \"This allows X to transfer your NFT when sold\"","severity":"critical"},{"pattern":"Hiding the deadline/expiration of permits","why":"Users don't know how long their approval is valid","instead":"Show expiration prominently: \"Valid until Feb 14, 2026\"","severity":"high"},{"pattern":"No way to see or cancel pending permits","why":"Users lose track of what they've authorized","instead":"Permit dashboard showing all active approvals with cancel buttons","severity":"high"},{"pattern":"Requesting permits with very long deadlines","why":"Security risk if signature is leaked or user forgets","instead":"Default to reasonable durations (7-30 days), let users extend","severity":"medium"},{"pattern":"Falling back to setApprovalForAll silently","why":"User expected gasless but gets broad approval transaction","instead":"Clearly indicate if permit isn't supported and why","severity":"medium"}],"onMonad":[{"aspect":"Gas Savings Impact","ethereum":"Permits save ~$5-15 per approval on Ethereum","monad":"Transactions already cheap, savings less dramatic","designImplication":"Emphasize convenience (no transaction) over cost savings"},{"aspect":"Signature Speed","ethereum":"After signing, must wait for on-chain confirmation when used","monad":"Sub-second finality when permit is executed","designImplication":"Can show real-time sale completion after buyer uses permit"},{"aspect":"Nonce Management","ethereum":"On-chain nonce increment can take 15+ seconds","monad":"Fast nonce updates for quick permit cancellation","designImplication":"Cancel actions feel instant, UI updates immediately"},{"aspect":"Reserve Balance","ethereum":"Permit execution may use all available funds","monad":"10 MON reserve for async execution safety","designImplication":"No risk of being stranded after permit-based sale; show spendable vs total"}],"keyTakeaways":["EIP-5008 = gasless NFT approvals via signatures","Always show what the permit authorizes (token, spender, deadline)","Provide clear cancellation UI with nonce explanation","Great for mobile where gas transactions are painful","On Monad: emphasize convenience over cost savings"],"technicalNotes":"EIP-5008 adds a nonces() function and permit() function to ERC-721. The permit creates a signature authorizing a spender for a specific tokenId. Nonce prevents replay attacks—incrementing nonce invalidates all pending permits. Signatures use EIP-712 typed data for human-readable wallet prompts."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-5008","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-5008","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-5008","markdown":"https://www.eipsfordesigners.com/standards/EIP-5008/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-5008/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-5008","official":"https://eips.ethereum.org/EIPS/eip-5008","discussion":"https://ethereum-magicians.org/search?q=EIP-5008"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}