Alert Source Discuss
Standards Track: ERC

ERC-5006: 租赁 NFT,NFT 用户扩展

向 ERC-1155 代币添加具有受限权限的用户角色

Authors Lance (@LanceSnow), Anders (@0xanders), Shrug <shrug@emojidao.org>
Created 2022-04-12
Requires EIP-165, EIP-1155

摘要

本标准是 ERC-1155 的扩展。它提出了一个额外的角色(user),可以授予代表资产 user 而不是 owner 的地址。

动机

ERC-721 类似,ERC-1155 代币可能具有某种效用。 “使用” 代币的人可能与拥有它的人不同(例如在租赁中)。因此,为 “owner” 和 “user” 设置单独的角色会很有用,这样 “user” 就无法采取 owner 可以采取的行动(例如,转移所有权)。

规范

本文档中的关键词“必须”,“禁止”,“需要”,“应该”,“不应该”,“推荐”,“可以”和“可选”应按照 RFC 2119 中的描述进行解释。

// SPDX-License-Identifier: CC0-1.0

pragma solidity ^0.8.0;

interface IERC5006 {
    struct UserRecord {
        uint256 tokenId;
        address owner;
        uint64 amount;
        address user;
        uint64 expiry;
    }
    
    /**
     * @dev 当 `user` 被授予使用 `owner` 拥有的 `tokenId` 的 `amount` 数量的代币的权限时触发,
     * 权限截止日期为 `expiry`。
     */
    event CreateUserRecord(
        uint256 recordId,
        uint256 tokenId,
        uint64  amount,
        address owner,
        address user,
        uint64  expiry
    );

    /**
     * @dev 当 `recordId` 的记录被删除时触发。
     */
    event DeleteUserRecord(uint256 recordId);

    /**
     * @dev 返回 `account` 可以使用的 `tokenId` 代币数量。
     */
    function usableBalanceOf(address account, uint256 tokenId)
        external
        view
        returns (uint256);

    /**
     * @dev 返回 `account` 冻结的 `id` 类型代币数量。
     */
    function frozenBalanceOf(address account, uint256 tokenId)
        external
        view
        returns (uint256);

    /**
     * @dev 返回 `recordId` 的 `UserRecord`。
     */
    function userRecordOf(uint256 recordId)
        external
        view
        returns (UserRecord memory);

    /**
     * @dev 授予 `user` 权限以使用 `amount` 数量的 `tokenId` 代币,该代币由 `owner` 拥有,直至 `expiry`。
     *
     * 触发 {CreateUserRecord} 事件。
     *
     * 要求:
     *
     * - 如果调用者不是 `owner`,则必须已获批准通过 {setApprovalForAll} 花费 ``owner`` 的代币。
     * - `owner` 必须拥有至少 `amount` 数量的 `id` 类型代币余额。
     * - `user` 不能是零地址。
     * - `amount` 必须大于 0。
     * - `expiry` 必须在区块时间戳之后。
     */
    function createUserRecord(
        address owner,
        address user,
        uint256 tokenId,
        uint64 amount,
        uint64 expiry
    ) external returns (uint256);

    /**
     * @dev 通过调用者原子地删除 `recordId` 的 `record`。
     *
     * 触发 {DeleteUserRecord} 事件。
     *
     * 要求:
     *
     * - 调用者必须具有 allowance。
     */
    function deleteUserRecord(uint256 recordId) external;
}

当使用 0xc26d96cc 调用时,supportsInterface 方法必须返回 true

理由

此模型旨在方便实施。以下是本标准解决的一些问题:

清晰的权利分配

通过双重“owner”和“user”角色,可以更轻松地管理贷方和借方可以对 NFT 执行的操作(换句话说,他们的权利)。例如,对于转移所有权的权利,项目只需检查采取行动的地址是代表 owner 还是代表 user,如果是 user,则阻止交易。此外,owner 可以控制 user 是谁,并且其他项目可以轻松地将其自身的权利分配给 owner 或 user。

简单的第三方集成

本着无需许可的互操作性的精神,该标准使第三方协议更容易管理 NFT 使用权,而无需 NFT 发行者或 NFT 应用程序的许可。一旦项目采用了额外的 user 角色,任何其他项目都可以直接与这些功能交互并实施自己的交易类型。例如,使用此标准的 PFP NFT 可以同时集成到租赁平台(用户可以在其中租用 NFT 30 天)和抵押贷款平台(用户可以在分期付款最终购买 NFT 所有权的同时使用 NFT)。这一切都可以在不需要原始 PFP 项目许可的情况下完成。

向后兼容性

如规范部分所述,通过添加扩展功能集,此标准可以完全与 ERC 兼容,并且 ERC-5006 和 ERC-1155 之间没有冲突。

此外,本标准中引入的新函数与 ERC-1155 中的现有函数具有许多相似之处。这使开发人员可以轻松快速地采用该标准。

测试用例

测试用例包含在 test.js 中。

在终端中运行:

  1. cd ../assets/eip-5006
  2. npm install
  3. npx hardhat test

参考实现

请参阅 ERC5006.sol

安全注意事项

此 EIP 标准可以完全保护 owner 的权利,owner 可以更改 NFT user,user 不能转移 NFT。

版权

通过 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Lance (@LanceSnow), Anders (@0xanders), Shrug <shrug@emojidao.org>, "ERC-5006: 租赁 NFT,NFT 用户扩展," Ethereum Improvement Proposals, no. 5006, April 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5006.