{"id":"ERC-5006","name":"Rental NFT for ERC-1155","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":"ERC-5006 defines ERC-1155 user records with an owner, user, tokenId, amount, and expiry, plus usable and frozen balance views. It does not by itself specify escrow, custody movement, expiry cleanup, rental pricing, or a marketplace; those behaviors must be checked against the target implementation. The pinned reference implementation uses escrow and an authorized deleteUserRecord path, which is implementation-specific.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-5006","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-5006","summary":"ERC-5006 defines ERC-1155 user records with an owner, user, tokenId, amount, and expiry, plus usable and frozen balance views. It does not by itself specify escrow, custody movement, expiry cleanup, rental pricing, or a marketplace; those behaviors must be checked against the target implementation. The pinned reference implementation uses escrow and an authorized deleteUserRecord path, which is implementation-specific.","applicability":{"whenToUse":["The target ERC-1155 implementation exposes ERC-5006 user records and the app can read owner, user, amount, expiry, and balance views.","The product can show which implementation-specific actions create, revoke, delete, or reclaim a record.","A partial rental or delegation journey needs quantity, expiry, and owner/user state."],"whenToAvoid":["The token does not implement quantity-based ERC-5006 records or the app cannot verify the target contract.","The product promises escrow, automatic reclaim, or expiry cleanup without confirming those behaviors and permissions.","The consuming app has no utility that depends on an active user record."]},"designerTakeaways":["Design quantity-specific rental views from userRecordOf, usableBalanceOf, and frozenBalanceOf, and label each value as a contract read.","Show expiry ending usable access; do not imply that expiry deletes a record or transfers custody.","Show escrow or reclaim controls only when the target implementation and caller permissions are verified."],"problemsSolved":[{"problem":"Cannot rent a partial ERC-1155 balance","oldWay":"A product transfers an entire balance or invents a custom record.","newWay":"A user record can expose an amount and expiry for a quantity-specific rental when the target contract implements it.","impact":"critical"},{"problem":"Rental records vary across games","oldWay":"Each implementation uses different owner, user, and expiry fields.","newWay":"The interface standardizes userRecordOf and usable/frozen balance views; custody and permissions still require implementation checks.","impact":"high"},{"problem":"Expiry state is unclear","oldWay":"A UI assumes expiry submits deletion or returns tokens automatically.","newWay":"Show expiry removing the record amount from usableBalanceOf and separately show any available delete/reclaim action.","impact":"high"},{"problem":"Usage rights and ownership are conflated","oldWay":"Transfer an asset to lend it and lose a clear owner/user distinction.","newWay":"Show the record's owner, user, amount, and expiry as separate values.","impact":"medium"},{"problem":"Rental settlement needs an application layer","oldWay":"Assume the ERC defines listings and pricing.","newWay":"Treat marketplace terms, pricing, and payment as product and contract integration policy.","impact":"medium"}],"uxPatterns":[{"name":"Partial Rental Record","description":"Create or inspect a quantity-specific user record when the target implementation authorizes it.","userFlow":["User views the ERC-1155 balance","Selects a quantity and expiry","UI shows owner, user, amount, and implementation permissions","User submits the supported record call","UI reads the resulting record and usable/frozen balances"]},{"name":"Guild Item Lending","description":"An optional product flow layered over ERC-5006 records.","userFlow":["Guild leader selects items and quantities","Product explains its own lending terms","User submits the target contract's supported record call","Member can use items only while the verified record grants utility","Reclaim or replacement path is shown only if the contract exposes it"]},{"name":"Active Records Dashboard","description":"Track records and balances without implying that expiry performs cleanup.","userFlow":["User views records and balance reads","Shows owner, user, amount, and expiry","After expiry, marks usable access ended","Shows a delete/reclaim action only when available and authorized","Confirms custody only after the target transaction settles"]},{"name":"Rental Marketplace","description":"Optional application-layer listings that use user records for fulfillment.","userFlow":["User browses application listings","Listing discloses price and settlement terms","User selects quantity and duration","Product creates the record through the verified contract path","UI distinguishes marketplace state from on-chain record state"]}],"uiComponents":[{"name":"PartialQuantitySelector","description":"Select quantity from available balance","states":["selecting","max-reached","min-reached"],"props":["available","selected","min","max","onChange"]},{"name":"RecordExpiryTimer","description":"Countdown to record expiry; show extension only when the target contract exposes and authorizes it.","states":["plenty-time","expiring-soon","expired"],"props":["expiresAt","onExpire","showExtend"]},{"name":"OwnerUserDisplay","description":"Show owner vs current user of items","states":["owner-using","rented-out","renting-in"],"props":["owner","user","quantity","expiresAt"]},{"name":"RentalListingForm","description":"Create an application-layer rental listing backed by a verified user record; pricing and duration are not defined by ERC-5006.","states":["editing","previewing","listing","active"],"props":["tokenId","maxQuantity","pricePerDay","minDuration"]},{"name":"InventoryWithRentals","description":"Inventory showing owner/user record states and usable access; rental labels are application-layer.","states":["all","owned","renting","rented-out"],"props":["items[]","filter","onItemClick"]}],"antiPatterns":[{"pattern":"Not showing quantity and balance sources","why":"Users cannot tell owner balance from usable or frozen record amounts.","instead":"Show balanceOf, usableBalanceOf, frozenBalanceOf, and active record amounts with their contract source.","severity":"critical"},{"pattern":"Treating expiry as automatic reclaim","why":"The standard does not itself submit deleteUserRecord or move custody when the timestamp passes.","instead":"Show expiry separately from any authorized delete/reclaim path.","severity":"high"},{"pattern":"Hiding owner, user, or caller permissions","why":"A role or record may not be manageable by the viewer.","instead":"Show owner/user fields and the target implementation's authorized actions.","severity":"high"},{"pattern":"Allowing a quantity above the target contract's available balance","why":"The user record may fail or exceed the implementation's usable amount.","instead":"Limit quantity to verified balance and record state; handle contract rejection.","severity":"critical"},{"pattern":"Presenting marketplace pricing as an ERC-5006 feature","why":"The interface does not define listings, prices, or settlement.","instead":"Label pricing and marketplace status as application-layer terms.","severity":"medium"},{"pattern":"Promising an extension without a contract path","why":"ERC-5006 does not define a universal rental renewal operation.","instead":"Offer extension only when the target implementation exposes and authorizes it; otherwise explain the new-record path.","severity":"medium"}],"keyTakeaways":["ERC-5006 standardizes ERC-1155 user records with quantity and expiry fields.","Owner, user, usable balance, and frozen balance are distinct values.","Expiry ends usable access; it does not by itself delete a record or return custody.","Escrow, reclaim, pricing, and permissions come from the target implementation or app layer.","Show the verified record and recovery path before promising a rental outcome."],"technicalNotes":"ERC-5006 defines createUserRecord(owner, user, tokenId, amount, expiry), deleteUserRecord(recordId), userRecordOf(recordId), usableBalanceOf(account, tokenId), and frozenBalanceOf(account, tokenId). In the pinned reference implementation, createUserRecord transfers the amount from owner into contract escrow and records owner, user, amount, and expiry. Expiry removes the amount from usableBalanceOf; it does not itself decrement frozenBalanceOf or transfer custody. An authorized deleteUserRecord call returns the amount and clears the record in that implementation. Verify permissions, custody, and reclaim behavior on the target contract before presenting them as available.","lastUpdated":"2026-09-18","specConstraints":[{"id":"rental-authorization","constraint":"A caller who is not the owner must be approved to spend the owner’s rental tokens.","appliesTo":"application","normativity":"normative","specQuote":"* - If the caller is not `owner`, it must be have been approved to spend ``owner``'s tokens","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5006#specification","designImplication":"Show the owner, renter, and approval relationship before a rental action. Do not treat a user token as transferable ownership of the underlying NFT."},{"id":"rental-amount-and-expiry","constraint":"A rental must use an available token balance, a positive amount, and an expiry after the current block timestamp.","appliesTo":"application","normativity":"normative","specQuote":"* - `owner` must have a balance of tokens of type `id` of at least `amount`.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-5006#specification","designImplication":"Show amount and expiry in the rental review and reject an already expired or zero-duration rental."},{"id":"erc1155-rental-compatibility","constraint":"The rental extension is compatible with ERC-1155 and can be adopted through an extension interface set.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"## Backwards Compatibility\n\nAs mentioned in the specifications section, this standard can be fully ERC compatible by adding an extension function set, and there are no conflicts between [ERC-5006](./eip-5006.md) and ERC-1155.\n\nIn addition, new functions introduced in this standard have many similarities with the existing functions in ERC-1155. This allows developers to easily adopt the standard quickly.","specSection":"Backwards Compatibility","specUrl":"https://ercs.ethereum.org/ERCS/erc-5006#backwards-compatibility","designImplication":"Keep ERC-1155 balances and ownership semantics visible alongside the rental user state."},{"id":"rental-user-cannot-transfer","constraint":"The owner can change the NFT user, while the user cannot transfer the NFT.","appliesTo":"application","normativity":"security-considerations","specQuote":"## Security Considerations\n\nThis EIP standard can completely protect the rights of the owner, the owner can change the NFT user, the user can not transfer the NFT.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-5006#security-considerations","designImplication":"Give renters use controls without owner transfer controls and make the end of the rental distinct from NFT ownership."}],"sources":[{"label":"ERC-5006 official specification","url":"https://ercs.ethereum.org/ERCS/erc-5006","type":"official-spec"}],"lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-5006","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-5006","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-5006","markdown":"https://www.eipsfordesigners.com/standards/ERC-5006/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-5006/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-5006","official":"https://ercs.ethereum.org/ERCS/erc-5006","discussion":"https://ethereum-magicians.org/search?q=ERC-5006"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}