Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-5604: NFT 留置权

扩展 ERC-721 以支持对 NFT 设置留置权

Authors Zainan Victor Zhou (@xinbenlv), Allen Zhou <allen@ubiloan.io>, Alex Qin <alex@ubiloan.io>
Created 2022-09-05
Discussion Link https://ethereum-magicians.org/t/creating-a-new-erc-proposal-for-nft-lien/10683
Requires EIP-165, EIP-721

摘要

此 ERC 引入了 NFT 留置权,这是一种对财产的担保权益,用于确保债务的追回或其他义务的履行。它引入了一个用于设置和移除留置权的接口,以及一个事件。

动机

留置权广泛用于金融用例,例如汽车和房产留置权。NFT 留置权的一个用例是地契。 此 ERC 提供了一个接口来实现执行留置权持有关系的接口。

规范

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

  1. 任何符合规范的合约必须实现 ERC-721ERC-165

  2. 任何符合规范的合约必须实现以下接口:

interface IERC_LIEN is ERC721, ERC165 {

    /// === Events ===

    /// @notice 当新的留置权成功设置时必须发出。
    /// @param tokenId 设置留置权的 token。
    /// @param holder 留置权的持有人。
    /// @param extraParams 添加留置权的原始请求的额外参数。
    event OnLienPlaced(uint256 tokenId, address holder, bytes calldata extraParams);

    /// @notice 当现有留置权成功移除时必须发出。
    /// @param tokenId 移除留置权的 token。
    /// @param holder 留置权的持有人。
    /// @param extraParams 移除留置权的原始请求的额外参数。
    event OnLienRemoved(uint256 tokenId, address holder, bytes calldata extraParams);

    /// === CRUD ===

    /// @notice 用于在 token 上设置留置权的方法
    ///         如果同一持有人已在同一 token 上拥有留置权,则必须引发错误。
    /// @param tokenId 设置留置权的 token。
    /// @param holder 留置权的持有人
    /// @param extraParams 用于未来扩展的额外数据。
    function addLienHolder(uint256 tokenId, address holder, bytes calldata extraParams) public;

    /// @notice 用于移除 token 上的留置权的方法
    ///         如果持有人没有留置权,则必须引发错误。
    /// @param tokenId 要移除留置权的 token。
    /// @param holder 留置权的持有人
    /// @param extraParams 用于未来扩展的额外数据。
    function removeLienHolder(uint256 tokenId, address holder, bytes calldata extraParams) public;

    /// @notice 用于查询 token 上是否存在有效留置权的方法。
    ///         如果 tokenId 不存在或不归属,则必须引发错误。
    /// @param tokenId 要查询留置权的 token
    /// @param holder 该方法正在查询关于留置权持有情况的持有人。
    /// @param extraParams 用于未来扩展的额外数据。
    function hasLien(uint256 tokenId, address holder, bytes calldata extraParams) public view returns (bool);
}

理由

  1. 为了简单和 gas 效率,我们只支持 ERC-721 NFT。我们没有考虑其他 ERC,可以留待将来扩展。例如,没有考虑 ERC-20ERC-1155

  2. 我们选择单独的 “addLienHolder” 和 “removeLienHolder” 而不是使用带有金额的单个 changeLienholder,因为我们相信 添加或删除操作有很大的不同,并且通常需要不同的访问控制, 例如,token 持有人应该能够添加其他人作为留置权持有人,而不是该 token 的留置权持有人。

  3. 我们没有在此接口中指定“债务金额”。我们认为这足够复杂,值得单独的 ERC。

  4. 我们没有指定如何应用背书以允许持有人发出他们对转让或交换的批准的信号。我们认为这足够复杂,值得单独的 ERC。

向后兼容性

该 ERC 被设计为 ERC-721 的扩展,因此符合规范的合约需要完全符合 ERC-721

安全考虑

需要讨论。

版权

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

Citation

Please cite this document as:

Zainan Victor Zhou (@xinbenlv), Allen Zhou <allen@ubiloan.io>, Alex Qin <alex@ubiloan.io>, "ERC-5604: NFT 留置权 [DRAFT]," Ethereum Improvement Proposals, no. 5604, September 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5604.