{"id":"ERC-7634","name":"Limited Transfer Count NFT","status":"Final","chain":"both","category":{"id":"nft","name":"NFT Capabilities","description":"What NFTs can do beyond basic ownership"},"journeyStages":[{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"NFTs can cap native ERC-721 transfers. Design implications: show count and limit, warn before the final native transfer, and disclose the implementation-defined post-cap state; mint, burn, and wrapper transfers are outside the standardized count.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-7634","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","hasDetailedContent":true,"content":{"id":"ERC-7634","sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-7634","type":"official-spec"}],"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","summary":"NFTs can have a maximum count for native ERC-721 transfers. After the cap is reached, the implementation chooses the resulting state; locking, burning, or another action is not mandated by ERC-7634.","designerTakeaways":["You can show Transfers remaining: 2 of 5 on listing and detail before purchase.","Your send confirmation can warn This is the last transfer when one remains.","You can badge the configured post-cap state, including Transfer exhausted where the implementation blocks further native transfers."],"applicability":{"whenToUse":["Collectibles intentionally scarce in secondary circulation.","Artist policy limits flips.","A deployed token implements the transfer-cap extension."],"whenToAvoid":["Standard freely tradable NFTs.","Cap not enforced on-chain.","Users expect infinite liquidity."]},"prototypeFirst":[{"screen":"Listing with transfer counter","why":"Secondary buyers price scarcity of remaining transfers.","covers":["5 of 5","1 remaining","Exhausted"],"include":["Counter chip","Tooltip explaining cap","Price context"]},{"screen":"Last transfer warning","why":"Final move needs explicit consent.","covers":["Last transfer confirm"],"include":["Scary warning modal","After this, the configured post-cap outcome applies","Confirm checkbox"]},{"screen":"Exhausted token view","why":"Permanent hold state needs distinct treatment.","covers":["Transfer exhausted"],"include":["Exhausted badge","Transfer history count","No Send button"]},{"screen":"Primary mint disclosure","why":"First buyers accept transfer policy.","covers":["Policy at mint"],"include":["Max transfers stated","Acknowledge checkbox"]}],"mentalModel":[{"label":"Transfer budget","description":"Finite number of allowed moves — like lives in a game."},{"label":"Decrement on transfer","description":"Each successful send reduces remaining count."},{"label":"Exhausted state","description":"Zero native transfers remaining — show the implementation-defined post-cap state."},{"label":"Primary vs secondary","description":"Mint may start count at max; secondary sees what's left."},{"label":"Burn on exhaust","description":"Some implementations destroy token — must disclose upfront."}],"statesToDesign":[{"state":"Full transfer budget","trigger":"New mint, all transfers available.","userNeed":"Know policy exists.","designResponse":"Up to N transfers badge on detail."},{"state":"Low remaining","trigger":"1-2 transfers left.","userNeed":"Factor into sell/buy decision.","designResponse":"Amber counter on card and listing."},{"state":"Last transfer confirmation","trigger":"User sends with 1 left.","userNeed":"Explicit consent.","designResponse":"Modal with irreversible warning."},{"state":"Transfer exhausted","trigger":"The native transfer count reaches the configured limit.","userNeed":"Know what the configured cap outcome means.","designResponse":"Show the post-cap state and hide Send only when native transfers are blocked."},{"state":"Burned on exhaust","trigger":"Token burned after final transfer.","userNeed":"Extreme warning before last send.","designResponse":"Show the configured post-cap outcome; warn that burn or another state applies only if the implementation defines it."}],"designDecisions":[{"question":"How alarming is last transfer?","recommendation":"Require checkbox acknowledgment in modal.","rationale":"Accidental final transfer is irreversible regret."},{"question":"Show counter on thumbnail?","recommendation":"Yes when ≤2 remain; always on detail.","rationale":"Scarcity affects price — surface early."},{"question":"Exhausted visual treatment?","recommendation":"Distinct badge, not hidden — collectors may still display.","rationale":"Proof of permanent collection piece."}],"problemsSolved":[{"problem":"Unlimited flipping undermines artist intent","oldWay":"No transfer limits","newWay":"On-chain cap enforces the configured number of native ERC-721 transfers","impact":"medium"},{"problem":"Buyers unaware of remaining liquidity","oldWay":"Discover cannot resell after buy","newWay":"Transfers remaining on listing","impact":"high"},{"problem":"Accidental final transfer","oldWay":"Send then the configured post-cap outcome surprises the holder","newWay":"Last transfer warning modal","impact":"high"}],"uxPatterns":[{"name":"Transfer Budget Counter","description":"Remaining transfers on card and detail.","mockup":"concept/nft-gallery","components":["TransferCounter","WarningChip","PolicyTooltip"],"userFlow":["View NFT","See 2 of 5","Decide to buy","Counter updates on transfer"]},{"name":"Last Transfer Gate","description":"Confirmation when one transfer remains.","mockup":"concept/verify-safety","components":["LastTransferModal","AckCheckbox","ConfirmSend"],"userFlow":["User sends","One left detected","Modal warns","User acknowledges","Transfer proceeds"]}],"seenInTheWild":[{"app":"Art Blocks","url":"https://www.artblocks.io/","note":"Artist policy on secondary markets informs transfer limit UX."},{"app":"Foundation","url":"https://foundation.app/","note":"Creator royalties and transfer policy display patterns."},{"app":"Zora","url":"https://zora.co/","note":"Creator-centric metadata for collection rules."}],"antiPatterns":[{"pattern":"Hiding transfer cap until send fails","why":"Surprise lock destroys trust","instead":"Counter visible at purchase and send","severity":"critical"},{"pattern":"Last transfer without extra confirm","why":"Irreversible user error","instead":"Acknowledgment modal for final transfer","severity":"critical"},{"pattern":"Same UI for exhausted and soulbound","why":"Different implications confused","instead":"Transfer exhausted vs Non-transferable labels","severity":"medium"}],"vocabulary":[{"use":"2 transfers left","avoid":"Transfer count decrement remaining","why":"Game-life metaphor."},{"use":"Final transfer","avoid":"Last allowed transfer before the configured post-cap outcome","why":"Short warning label."},{"use":"Cannot move again","avoid":"Transfer budget exhausted","why":"Plain permanence language."}],"technicalNotes":"ERC-7634 standardizes transferLimitOf(), transferCountOf(), and setTransferLimit() for native ERC-721 transfers where from and to are both non-zero. Mint and burn do not increment the count. The standard does not mandate a lock or burn when the cap is reached, and wrappers can move separate wrapper assets outside the native cap; disclose the target implementation's configured outcome and scope.","relatedStandards":[{"id":"ERC-6454","relationship":"Transfer restriction detection"},{"id":"ERC-721","relationship":"NFT with transfer cap extension"}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-7634","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-7634","type":"discussion"},{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-7634","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-7634","markdown":"https://www.eipsfordesigners.com/standards/ERC-7634/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-7634/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-7634","official":"https://ercs.ethereum.org/ERCS/erc-7634","discussion":"https://ethereum-magicians.org/search?q=ERC-7634"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}