{"id":"ERC-5007","name":"Time NFT Extension","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 have built-in start and end times — tokens can be time-bounded or represent time periods. Design implications: show validity period badges ('Valid: Jan 1 - Dec 31'), gray out or hide expired tokens, display countdown to activation/expiration, support time-range visualization for event tickets or subscriptions. Design decisions: whether to completely hide invalid-period tokens or show them disabled, how to handle timezone display, whether to allow splitting/merging time-bounded tokens if composable extension used.","hasDetailedContent":true,"content":{"id":"ERC-5007","summary":"ERC-5007 adds time validity to NFTs with built-in start and end times. Perfect for subscriptions, season passes, time-limited memberships, and access tokens that automatically become invalid after expiration.","applicability":{"whenToUse":["Your product addresses: subscriptions require off-chain expiration tracking.","Your product addresses: expired access tokens still appear in wallets.","The flow should deliver: nFT has on-chain startTime/endTime, contracts can check directly.","You are designing a subscription card experience with visible states and recovery paths."],"whenToAvoid":["Always show \"Valid until [date]\" prominently.","Visually distinguish expired tokens (gray out, badge).","Warn at 30, 7, and 1 day before expiry.","Assets are fungible tokens only with no unique-item semantics."]},"designerTakeaways":["You can design UI that delivers nFT has on-chain startTime/endTime.","You can design UI that delivers uI can show \"Valid until Dec 31\" or \"Expired\" clearly.","You can design UI that delivers set startTime in future: \"Valid Jan 1, Dec 31, 2027\"."],"problemsSolved":[{"problem":"Subscriptions require off-chain expiration tracking","oldWay":"NFT exists forever, backend checks if subscription is active","newWay":"NFT has on-chain startTime/endTime, contracts can check directly","impact":"critical"},{"problem":"Expired access tokens still appear in wallets","oldWay":"User sees membership NFT but it's actually expired","newWay":"UI can show \"Valid until Dec 31\" or \"Expired\" clearly","impact":"high"},{"problem":"Can't create future-starting access","oldWay":"NFT is valid from mint time, can't pre-sell future access","newWay":"Set startTime in future: \"Valid Jan 1 - Dec 31, 2027\"","impact":"high"},{"problem":"Renewal requires burn and remint","oldWay":"Extend subscription by burning old NFT, minting new one","newWay":"Just update endTime to extend validity period","impact":"medium"},{"problem":"Smart contracts can't verify time-based access","oldWay":"Off-chain oracle needed to verify subscription status","newWay":"On-chain time check: if (block.timestamp < endTime) grant access","impact":"medium"}],"uxPatterns":[{"name":"Subscription Card","description":"Display time-limited NFT with validity period","mockup":"concept/nft-gallery","userFlow":["User views their membership NFT","Sees validity period and time remaining","Progress bar shows how much time used","Can renew before expiration","After expiry, card shows \"Expired\" status"]},{"name":"Season Pass Timeline","description":"Show season pass with start and end dates","mockup":"concept/nft-gallery","userFlow":["User purchases season pass","Sees exact start and end dates","Timeline shows current position","Tracks progress toward rewards","Pass automatically expires at season end"]},{"name":"Future Access Pre-Sale","description":"Sell access that starts in the future","mockup":"generic/token-transfer","userFlow":["User sees pre-sale for future access","Pass has startTime in the future","User purchases at discount","NFT minted but not yet active","Automatically activates on startTime"]},{"name":"Expired Token Display","description":"Clear indication when time-limited NFT has expired","mockup":"concept/nft-gallery","userFlow":["User views expired NFT","Card clearly shown as expired (grayed out)","Shows when it expired","Option to hide or renew","Renewal extends endTime"]}],"uiComponents":[{"name":"ValidityPeriodDisplay","description":"Show start and end time of NFT","states":["not-started","active","expiring-soon","expired"],"props":["startTime","endTime","showProgress"]},{"name":"ExpiryCountdown","description":"Countdown to expiration","states":["plenty-time","warning","critical","expired"],"props":["endTime","warningThreshold","criticalThreshold"]},{"name":"TimelineBadge","description":"Visual timeline showing validity period","states":["past","present","future"],"props":["startTime","endTime","currentTime"]},{"name":"RenewalPrompt","description":"Prompt to renew expiring NFT","states":["hidden","suggested","urgent"],"props":["daysUntilExpiry","renewalPrice","onRenew"]},{"name":"ExpiredOverlay","description":"Overlay for expired NFT display","states":["expired","renewable","permanently-expired"],"props":["expiredAt","canRenew","onRenew","onHide"]}],"antiPatterns":[{"pattern":"Hiding validity period from users","why":"Users surprised when access suddenly revoked","instead":"Always show \"Valid until [date]\" prominently","severity":"critical"},{"pattern":"No warning before expiration","why":"Users miss renewal window, lose access","instead":"Warn at 30, 7, and 1 day before expiry","severity":"high"},{"pattern":"Treating expired NFTs same as active","why":"Confusing when NFT appears valid but doesn't work","instead":"Visually distinguish expired tokens (gray out, badge)","severity":"critical"},{"pattern":"Not showing future-starting passes clearly","why":"User thinks NFT is broken when it's just not active yet","instead":"Show \"Activates in X days\" with clear start date","severity":"high"},{"pattern":"Complex renewal process","why":"Users give up on renewing, churn increases","instead":"One-click renewal that extends endTime","severity":"medium"},{"pattern":"Burning expired NFTs automatically","why":"Users lose collectible/proof they had membership","instead":"Keep expired NFT visible, just mark as expired","severity":"medium"}],"onMonad":[{"aspect":"Timestamp Precision","ethereum":"12-second blocks, timestamps approximate","monad":"Sub-second blocks, more precise timing possible","designImplication":"Can show \"expires in X hours\" with higher accuracy"},{"aspect":"Renewal Transactions","ethereum":"Renewal costs gas, users might delay","monad":"Low gas makes last-minute renewals easy","designImplication":"Can offer \"renew instantly\" even at expiry"},{"aspect":"Access Checks","ethereum":"On-chain time checks in contracts","monad":"Fast finality means access revocation is instant","designImplication":"Access changes the moment endTime passes"},{"aspect":"Short-Duration Passes","ethereum":"Gas cost limits viability of daily passes","monad":"Low cost enables hourly or daily access tokens","designImplication":"Can design micro-duration access products"}],"keyTakeaways":["ERC-5007 = NFT with built-in start and end time","Perfect for subscriptions, season passes, memberships","Always show validity period prominently","Warn before expiration (30/7/1 day)","Keep expired NFTs visible, just marked as expired"],"technicalNotes":"ERC-5007 extends ERC-721 with startTime() and endTime() returning uint64 timestamps. Interface includes IERC5007 with these two functions. Contracts can check if (block.timestamp >= startTime && block.timestamp <= endTime) to verify validity. Common to pair with ERC-4907 for rental time windows or standalone for subscriptions."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-5007","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-5007","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5007","markdown":"https://www.eipsfordesigners.com/standards/ERC-5007/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5007/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5007","official":"https://eips.ethereum.org/EIPS/eip-5007","discussion":"https://ethereum-magicians.org/search?q=ERC-5007"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}