Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7652: ERC-721 担保扩展

允许 NFT 持有者随时将其 NFT 兑换为流通代币

Authors Liu.C.Dao (@CDao) <iunknow@163.com>, Sam <1047180870@qq.com>
Created 2024-03-10
Discussion Link https://ethereum-magicians.org/t/erc-7652-eip-721-guarantee-extension/19284
Requires EIP-165, EIP-721

摘要

本规范定义了 EIP-721 实例的担保人角色的函数轮廓。担保接口为给定的 NFT(token ID)实现用户设定的估值和担保份额,以及在后续交易中享有的担保权利和承担的义务。实现允许用户读取或设置给定 NFT(token ID)的当前担保价值,并实现担保利息的分配和担保义务的履行。当状态改变时,它会发送标准化的事件。该提案依赖并扩展了现有的 EIP-721

动机

NFT(token ID)通常面临市场流动性不足的问题:主要原因是 NFT 定价缺乏透明度,使得用户在交易和购买 NFT(token ID)后难以套现。

通过引入担保人角色,不同的担保人团体可以为 NFT(token ID)提供各种价格担保,为 NFT(token ID)建立一个多方面的价格评估系统。

购买 NFT(token ID)后,用户可以随时以最高的担保价格将其退还给担保人,以保护他们的利益。

此外,在履行担保义务后,担保人还可以要求后续担保人提供担保义务。

当 NFT(token ID)由担保人拥有时,并且由于担保人可以是一个 DAO 组织,这种扩展允许 NFT(token ID)继续作为 DAO 运营,从而进一步增强 NFT(token ID)的社会或社区认可度。

规范

本文档中的关键词“MUST”,“MUST NOT”,“REQUIRED”,“SHALL”,“SHALL NOT”,“SHOULD”,“SHOULD NOT”,“RECOMMENDED”,“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。

每个符合 ERC721Guarantee 的合约都必须实现 IERC721Guarantee 担保接口。

guarantee extension(担保扩展) 对于 EIP-721 合约是 OPTIONAL(可选的)。

pragma solidity ^0.8.20;

// import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";

/// @title EIP-721 担保人角色扩展
///  注意:此接口的 EIP-165 标识符是


interface IERC721Guarantee /*is IERC721*/{
    /// @notice           当为 NFT 建立 `担保合约` 时发出
    /// @param user       担保人的地址
    /// @param value      DAO 提供的担保价值
    /// @param DAO        提供担保的 DAO 组织
    /// @param tokenId    担保的 NFT(token ID),
    event GuaranteeIsEstablshed(
        address user,
        uint256 value,
        address DAO,
        uint256 indexed tokenId
    );

    /// @notice           当 `担保合约` 被取消时发出
    /// @dev              封闭 DAO 中的一些用户请求减少他们的担保份额
    /// @param user       担保人的地址
    /// @param value      DAO 提供的担保价值
    /// @param DAO        提供担保的 DAO 组织
    /// @param tokenId    担保的 NFT(token ID),
    event GuaranteeIsCancel(
        address user,
        uint256 value,
        address DAO,
        uint256 indexed tokenId
    );

    /// @notice           当为 NFT 建立 `担保序列` 时发出
    /// @param userGuaranteed      被担保人的地址
    /// @param number  交易的 block.number,
    ///                并且在此之前建立的所有 DAO 将进入担保序列
    /// @param DAOs   提供担保的 DAO 序列
    /// @param tokenId 担保的 NFT(token ID),
    event GuaranteeSequenceIsEstablshed(
        address userGuaranteed,
        uint256 number,
        address DAOs,
        uint256 indexed tokenId
    );

    /// @notice   用户对 NFT(token ID)的评估
    /// @dev      为一个担保人设置担保信息,
    /// 如果 `_tokenId` 不是有效的 NFT,则抛出
    /// @param value  用户对 NFT 的评估,oledr value(旧值)被取消,
    /// @param user   担保人的地址
    /// @param weight 担保人的担保权重
    /// @param tokenId NFT
    /// @return 函数执行的错误状态
    function setNFTGuarantedInfo(
        uint256 value,
        address user,
        uint256 weight,
        uint256 tokenId
    ) external returns (uint256);

    /// @notice   为 NFT(token ID)建立担保序列并分配佣金
    /// @dev      每个 NFT(token ID)保留一个当前的担保序列,
    ///           过期的担保序列不再有效,
    ///           如果 `_tokenId` 不是有效的 NFT,则抛出
    /// @param valueCommission 交易的佣金
    /// @param userGuaranteed   被担保人的地址
    /// @param number  交易的 block.number,
    ///              并且在此之前建立的所有 DAO 将进入担保序列
    /// @param tokenId NFT
    /// @return 函数执行的错误状态
    function establishNFTGuarantee(
        uint256 valueCommission,
        address userGuaranteed,
        uint256 number,
        uint256 tokenId
    ) external returns (uint256);

    /// @notice   履行担保责任的交易
    /// @dev      新的问责交易也需要
    ///           构建新的担保序列
    ///           如果 `_tokenId` 不是有效的 NFT 或 userGuaranteed 不正确,则抛出。

    /// @param  userGuaranteed   被担保人的地址
    /// @param  tokenId NFT
    /// @return 函数执行的错误状态
    function FulfillGuaranteeTransfer(address userGuaranteed, uint256 tokenId)
        external
        returns (uint256);
}

理由

影响标准的关键因素:

  • 在分配佣金时,注意确保群体之间和群体内部的公平性
  • 保持接口中担保团体(DAO)的数量,以防止合约膨胀
  • 担保组是一个 DAO 合约,它必须实现 ERC721TokenReceiver 接口
  • 简单性
  • Gas 效率

向后兼容性

此标准与当前的 EIP-721 标准兼容。没有其他标准为 NFT 定义类似的角色,并且名称(Guarantor)未被其他 EIP-721 相关标准使用。

参考实现

参考实现将在稍后提供。

安全注意事项

需要讨论。

版权

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

Citation

Please cite this document as:

Liu.C.Dao (@CDao) <iunknow@163.com>, Sam <1047180870@qq.com>, "ERC-7652: ERC-721 担保扩展 [DRAFT]," Ethereum Improvement Proposals, no. 7652, March 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7652.