{"id":"ERC-5725","name":"Transferable Vesting NFT","status":"Final","chain":"both","category":{"id":"defi","name":"DeFi Patterns","description":"Vaults, bonds, and financial primitives"},"journeyStages":[{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"ERC-5725 turns vesting schedules into transferable NFTs. Your employee token grant, investor allocation, or airdrop vesting becomes a transferable position; a marketplace can offer a sale at a discount when the deployed position and application support it.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-5725","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-5725","summary":"ERC-5725 turns vesting schedules into transferable NFTs. Your employee token grant, investor allocation, or airdrop vesting becomes a transferable position; a marketplace can offer a sale at a discount when the deployed position and application support it.","applicability":{"whenToUse":["Your product addresses: vesting tokens locked until schedule complete.","Your product handles vesting positions that are transferable only when the deployed contract permits it.","The flow can offer immediate liquidity through a supported vesting-position marketplace when available.","You are designing a vesting nft dashboard experience with visible states and recovery paths."],"whenToAvoid":["The product has no vesting schedule or claimable payout to display.","The deployed contract does not implement the ERC-5725 vesting and claim interface.","The position is not transferable and no secondary-market flow is supported.","No token balances, swaps, lending, or yield flows appear in the product."]},"designerTakeaways":["You can design UI that offers immediate liquidity for a vesting position when a supported marketplace exists.","You can design UI that supports a secondary market when the deployed position is transferable and a marketplace supports it.","Design the flow to support nFT shows total, vested, claimable clearly."],"problemsSolved":[{"problem":"Vesting tokens locked until schedule complete","oldWay":"Wait 4 years to access full allocation","newWay":"A supported marketplace can offer the vesting NFT for immediate liquidity","impact":"critical"},{"problem":"Can't trade unvested allocations","oldWay":"No market for future tokens","newWay":"A supported marketplace can list transferable vesting positions","impact":"critical"},{"problem":"Vesting progress not visible","oldWay":"Check protocol, do math for unlocked amount","newWay":"NFT shows total, vested, claimable clearly","impact":"high"},{"problem":"Early employees need liquidity","oldWay":"Wait or borrow against promise","newWay":"A supported marketplace can offer a vesting position for liquidity","impact":"high"},{"problem":"Vesting terms not standardized","oldWay":"Each protocol different interface","newWay":"Standard functions: claimable, vested, claim","impact":"medium"}],"uxPatterns":[{"name":"Vesting NFT Dashboard","description":"View all vesting positions as NFTs","userFlow":["User views vesting dashboard","Sees all vesting NFTs they own","Progress bar shows vested portion","Claimable amount shown in tokens and USD","Can claim vested or list the entire position when a supported marketplace is available"]},{"name":"Vesting Schedule Visualization","description":"Show unlock schedule over time","userFlow":["User opens vesting details","Sees visual unlock curve","Current position marked","Key milestones highlighted","Daily unlock rate shown"]},{"name":"Sell Vesting Position","description":"List a transferable vesting NFT for sale when a marketplace supports it","userFlow":["User selects vesting NFT to sell","Sees current vesting state","Market value calculated","Sets asking price","Discount from market shown","Lists for sale"]},{"name":"Buy Vesting Position","description":"Purchase someone's vesting NFT when a marketplace supports it","userFlow":["User browses vesting marketplace","Selects interesting position","Sees exactly what they get","Analyzes discount and break-even","Understands time risk","Purchases a listed vesting NFT when a supported marketplace is available"]},{"name":"Claim Vested Tokens","description":"Withdraw unlocked tokens","userFlow":["User views claimable amount","Sees when they last claimed","Shows the current claimable amount as read-only","Checks that the caller is the owner or approved claimant","Calls claim(tokenId); payout is sent to the authorized caller"]}],"uiComponents":[{"name":"VestingProgressBar","description":"Visual progress of vesting schedule","states":["before-cliff","vesting","fully-vested"],"props":["total","vested","claimed","cliffDate","endDate"]},{"name":"VestingNFTCard","description":"Card displaying vesting position","states":["loading","active","fully-vested","transferred"],"props":["vestingNFT","currentPrice","onClaim","onTransfer","onSell"]},{"name":"UnlockScheduleChart","description":"Graph showing tokens unlocking over time","states":["loading","ready"],"props":["schedule","currentDate","milestones[]"]},{"name":"VestingMarketplace","description":"Buy/sell vesting positions when a marketplace supports transfer and listing","states":["loading","listings","no-listings"],"props":["token","listings[]","onBuy","onList"]},{"name":"ClaimInterface","description":"Interface for claiming vested tokens","states":["nothing-claimable","claimable","claiming","claimed"],"props":["claimableAmount","onClaim","claimAuthority"]}],"antiPatterns":[{"pattern":"Not showing cliff status","why":"User thinks they can claim but cliff hasn't passed","instead":"Clearly show cliff date and whether it's passed","severity":"critical"},{"pattern":"Confusing vested vs claimable","why":"Vested might not equal claimable in some schedules","instead":"Show both: \"Vested: X | Claimable: Y\"","severity":"high"},{"pattern":"No sell discount context","why":"Seller doesn't know if their price is reasonable","instead":"Show market value and % discount","severity":"high"},{"pattern":"Hiding time risk for buyers","why":"Buyer doesn't understand they're taking price risk","instead":"Explicit warning: \"Token may decrease during vesting\"","severity":"high"},{"pattern":"No daily/hourly unlock rate","why":"User doesn't know how fast tokens vest","instead":"Show \"~68 PROTO unlock per day\"","severity":"medium"}],"keyTakeaways":["ERC-5725 = vesting schedules as transferable NFTs","Show vested, claimable, and claimed separately","Cliff date must be prominent","Help users assess marketplace availability, discount, and risk","Display unlock rate (daily/hourly)"],"technicalNotes":"ERC-5725 extends ERC-721 with vestedPayoutAtTime(tokenId, timestamp), pendingPayout(tokenId), and claimablePayout(tokenId). payoutToken() specifies what's vesting. claim(uint256 tokenId) has no amount or destination argument: it grants the current claimablePayout to msg.sender when the caller is the token owner or an approved claimant. Claim approval is distinct from ERC-721 transfer approval; transfers move the entire position.","lastUpdated":"2026-09-18","specConstraints":[{"id":"vesting-claim-payout","constraint":"A claim grants the current claimable payout to the caller.","appliesTo":"application","normativity":"normative","specQuote":"* @dev MUST grant the claimablePayout value at the time of claim being called to `msg.sender`.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5725#specification","designImplication":"Show claimable amount and recipient before the transaction, then update the claimed total after confirmation."},{"id":"vesting-claim-authorization","constraint":"Claiming must be initiated by the token owner or an approved user.","appliesTo":"application","normativity":"normative","specQuote":"*  MUST revert if not called by the token owner or approved users.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5725#specification","designImplication":"Show whether the current account owns or is approved for the vesting NFT before enabling Claim."},{"id":"vesting-claim-event","constraint":"A successful payout claim emits `PayoutClaimed`.","appliesTo":"application","normativity":"normative","specQuote":"*  MUST emit PayoutClaimed.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5725#specification","designImplication":"Use the claim event or receipt to move the UI from pending to claimed instead of assuming success after submission."},{"id":"vesting-time-schedule","constraint":"Vesting returns zero before mint and reaches its final payout at the end of the vesting schedule.","appliesTo":"application","normativity":"normative","specQuote":"*  Zero MUST be returned if the timestamp is before the token was minted.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5725#specification","designImplication":"Show not-started, accruing, and fully vested states and label the time basis used by the schedule."},{"id":"vesting-total-payout","constraint":"The maximum-time vested payout represents the total payout for the vesting NFT.","appliesTo":"application","normativity":"security-considerations","specQuote":"- `vestedPayoutAtTime(tokenId, type(uint256).max)`, for example, must return the total payout for a given `tokenId`","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-5725#security-considerations","designImplication":"Keep total allocation, claimed amount, and currently claimable amount separate in the payout view."},{"id":"vesting-approval-does-not-transfer","constraint":"ERC-5725 approval lets an operator claim vested tokens but does not let that operator transfer the vesting NFT away from its owner.","appliesTo":"application","normativity":"security-considerations","specQuote":"When a ERC-5725 approval is made on a Vesting NFT, the operator would have the rights to claim the vested tokens, but not transfer the NFT away from the owner.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-5725#security-considerations","designImplication":"Explain claim authority separately from NFT transfer authority in approval review."},{"id":"vesting-erc721-compatibility","constraint":"The vesting NFT is intended to remain compatible with ERC-721 integrations and marketplaces.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"## Backwards Compatibility\n\n- The Vesting NFT standard is meant to be fully backwards compatible with any current [ERC-721](./eip-721.md) integrations and marketplaces.\n- The Vesting NFT standard also supports [ERC-165](./eip-165.md) interface detection for detecting `EIP-721` compatibility, as well as Vesting NFT compatibility.","specSection":"Backwards Compatibility","specUrl":"https://ercs.ethereum.org/ERCS/erc-5725#backwards-compatibility","designImplication":"Preserve standard NFT ownership views while adding vesting and claim-specific states."},{"id":"no-payout-claim-revert","constraint":"The claim function should revert when there is nothing to claim.","appliesTo":"application","normativity":"normative","specQuote":"*  SHOULD revert if there is nothing to claim.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5725#specification","designImplication":"Disable or explain an empty claim state and treat a rejected empty claim as an expected no-payout outcome, not a successful transfer."}],"sources":[{"label":"ERC-5725 official specification","url":"https://ercs.ethereum.org/ERCS/erc-5725","type":"official-spec"}],"lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5725","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-5725","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5725","markdown":"https://www.eipsfordesigners.com/standards/ERC-5725/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5725/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5725","official":"https://ercs.ethereum.org/ERCS/erc-5725","discussion":"https://ethereum-magicians.org/search?q=ERC-5725"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}