{"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":"executing","name":"Executing Transactions","description":"Performing on-chain actions"},{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"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.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-7634","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-7634","specConstraints":[{"id":"native-transfer-count","constraint":"The cap counts native ERC-721 transfers, not minting or burning.","appliesTo":"application","normativity":"normative","specQuote":"Implementations MUST enforce the cap on native ERC-721 transfers of the underlying token (i.e., transfers where from != address(0) and to != address(0)). Incrementing the count SHOULD occur only after a successful native transfer. Mint and burn operations MUST NOT increment the count.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-7634#specification","designImplication":"Read the contract's count and limit rather than incrementing a client counter for every event. Label the native-transfer scope and show the selected implementation's actual behavior at the cap."},{"id":"wrapper-limits","constraint":"A native transfer cap cannot guarantee that trading or ownership changes stop across wrappers.","appliesTo":"application","normativity":"security-considerations","specQuote":"Any owner can cheaply wrap a token and transfer a separate wrapper token; such downstream transfers cannot be prevented without breaking ERC-721 composability.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-7634#security-considerations","designImplication":"Do not market the cap as an unbypassable resale restriction or guaranteed item wear. Explain wrapper scope, any deployment-specific restrictions, and whether the limit can change."},{"id":"post-cap-outcome","constraint":"An implementation MAY perform an action when the transfer cap is reached, such as burning the token.","appliesTo":"account-implementation","normativity":"normative","specSection":"Reference Implementation","specUrl":"https://ercs.ethereum.org/ERCS/erc-7634#reference-implementation","designImplication":"Show the deployed post-cap outcome explicitly and keep a cap-reached state separate from any optional burn or other action.","specQuote":"// Optional: perform action exactly when the cap is reached (e.g., _burn(tokenId))"}],"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":"The implementation's post-cap state needs distinct treatment.","covers":["Transfer exhausted"],"include":["Exhausted badge","Transfer history count","Disable Send when native transfers are blocked"]},{"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 counted native transfer reduces the remaining budget; minting, burning, and wrapper-token transfers are separate."},{"label":"Exhausted state","description":"Zero native transfers remaining — show the implementation-defined post-cap state."},{"label":"Primary vs secondary","description":"Minting does not consume the native-transfer budget; read the contract's current count and limit for secondary buyers."},{"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":"Explain the configured post-cap outcome before confirmation; call it irreversible only when the deployment makes it so."},{"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":"The final counted transfer may change what the holder can do. Explain the deployment's actual policy and whether the limit can change."},{"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":"An exhausted native-transfer budget is not proof of permanent ownership or a ban on wrapper transfers."}],"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.","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.","components":["LastTransferModal","AckCheckbox","ConfirmSend"],"userFlow":["User sends","One left detected","Modal warns","User acknowledges","Transfer proceeds"]}],"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 search","url":"https://ethereum-magicians.org/search?q=ERC-7634","type":"discussion"}],"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"}}