{"id":"ERC-4907","name":"Rental NFT","status":"Final","chain":"both","category":{"id":"nft","name":"NFT Capabilities","description":"What NFTs can do beyond basic ownership"},"journeyStages":[{"id":"approving","name":"Approving & Permissioning","description":"Granting permissions for actions"},{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"NFTs have separate 'owner' and 'user' roles with automatic expiration — enabling trustless rentals. Design implications: display dual ownership badges (Owner vs User), show rental expiration countdown timers, design rental listing flows with duration pickers, indicate 'rented out' status on owned items, auto-update UI when rental expires without transaction. Design decisions: how prominently to show rental status vs ownership, whether to notify users before rental expiry, handling edge cases where user tries owner-only actions.","hasDetailedContent":true,"content":{"id":"ERC-4907","summary":"ERC-4907 adds rental functionality to NFTs. The owner can rent out their NFT to a \"user\" for a set time period. The renter gets usage rights without ownership. When the rental expires, usage rights automatically revert. Perfect for game items, virtual land, or any NFT with utility that can be temporarily shared.","applicability":{"whenToUse":["Your product addresses: no standard way to rent NFTs.","Your product addresses: renter could sell/transfer the NFT.","The flow should deliver: set user + expiration, owner keeps ownership.","You are designing a rental listing experience with visible states and recovery paths."],"whenToAvoid":["Always show countdown, warn as expiration approaches.","Always check userOf() AND userExpires() > now.","Clear badges: \"You OWN this\" vs \"You RENT this\".","Assets are fungible tokens only with no unique-item semantics."]},"designerTakeaways":["You can design UI that delivers set user + expiration, owner keeps ownership.","You can design UI that delivers owner retains ownership, only usage is delegated.","You can design UI that delivers simple setUser() call with expiration."],"problemsSolved":[{"problem":"No standard way to rent NFTs","oldWay":"Transfer NFT, trust renter to return it (they often don't)","newWay":"Set user + expiration, owner keeps ownership","impact":"critical"},{"problem":"Expensive to \"loan\" NFTs safely","oldWay":"Use escrow contracts, complex collateral systems","newWay":"Simple setUser() call with expiration","impact":"high"},{"problem":"Renter could sell/transfer the NFT","oldWay":"Owner loses asset if they transfer ownership for rental","newWay":"Owner retains ownership, only usage is delegated","impact":"critical"}],"uxPatterns":[{"name":"Rental Listing","description":"List NFT for rent with price and duration","mockup":"concept/nft-gallery","userFlow":["Owner selects NFT to rent","Sets price per day","Sets maximum duration","Signs rental listing","NFT available for rent"]},{"name":"Rental Marketplace","description":"Browse and rent NFTs","mockup":"concept/nft-gallery","userFlow":["User browses available rentals","Clicks \"Rent\" on desired item","Selects rental duration","Pays rental fee","Becomes \"user\" of NFT"]},{"name":"Active Rental Status","description":"View current rental with countdown","mockup":"concept/nft-gallery","userFlow":["User views their rental","Sees time remaining","Progress bar shows rental period","Option to extend before expiry","Warning as expiration approaches"]}],"uiComponents":[{"name":"RentalCard","description":"NFT card with rental info","states":["available","rented-by-you","rented-by-other","your-listing"],"props":["nft","price","duration","user","expires"]},{"name":"ExpirationTimer","description":"Countdown to rental expiration","states":["plenty-of-time","expiring-soon","expired"],"props":["expiresAt","onExpire"]},{"name":"RentalDurationPicker","description":"Select how long to rent","states":["selecting","selected"],"props":["minDuration","maxDuration","pricePerDay","onChange"]},{"name":"UserRoleBadge","description":"Shows if you're owner vs user","states":["owner","user","both","neither"],"props":["owner","user","currentAccount"]}],"antiPatterns":[{"pattern":"Not showing expiration prominently","why":"User loses access unexpectedly","instead":"Always show countdown, warn as expiration approaches","severity":"critical"},{"pattern":"Confusing \"owner\" and \"user\" roles","why":"Users don't understand their rights","instead":"Clear badges: \"You OWN this\" vs \"You RENT this\"","severity":"high"},{"pattern":"Not checking user() before granting access","why":"Expired rentals could still access utility","instead":"Always check userOf() AND userExpires() > now","severity":"critical"},{"pattern":"No reminder before expiration","why":"User surprised when access revoked","instead":"Notify at 24h, 1h, and near expiration","severity":"high"}],"onMonad":[{"aspect":"Rental Start","ethereum":"setUser() takes 12+ seconds","monad":"Instant rental activation","designImplication":"Renter can start using immediately"},{"aspect":"Expiration Checks","ethereum":"Block timestamp granularity","monad":"Faster blocks = more precise expiration","designImplication":"Can show more accurate countdown"}],"keyTakeaways":["ERC-4907 = NFT rentals with automatic expiration","Owner keeps ownership, user gets usage rights","Always check expiration before granting access","Show clear countdown to expiration","Distinguish \"owner\" vs \"user\" roles clearly"],"technicalNotes":"ERC-4907 extends ERC-721 with setUser(tokenId, user, expires) and userOf(tokenId), userExpires(tokenId) view functions. The \"user\" has usage rights but cannot transfer. When block.timestamp > expires, userOf returns address(0). UpdateUser event emitted on changes. Backward compatible — non-4907-aware contracts just see regular ERC-721."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-4907","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-4907","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-4907","markdown":"https://www.eipsfordesigners.com/standards/ERC-4907/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-4907/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-4907","official":"https://eips.ethereum.org/EIPS/eip-4907","discussion":"https://ethereum-magicians.org/search?q=ERC-4907"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}