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.