Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7681: 双重性质多代币协议

结合同质化代币 ERC-20 和多代币 ERC-1155

Authors Sennett Lau (@sennett-lau)
Created 2024-04-08
Discussion Link https://ethereum-magicians.org/t/erc-7681-dual-nature-multi-token-protocol/19590
Requires EIP-20, EIP-1155

摘要

本提案 ERC-7681 阐述了同质化 ERC-20 代币合约与半同质化 ERC-1155 多代币标准的集成,从而在单个合约框架内实现两种标准之间的协同操作。它定义了一种结合两种代币合约并同步它们之间操作的机制。

动机

ERC-7631 双重性质代币对的启发,该提案引入了 ERC-20 和 ERC-721 之间可互联代币的概念,但由于重复的 Transfer(address, address, uint256) 事件,出现了一个挑战,使得完全兼容具有挑战性。然而,结合 ERC-20 和 ERC-1155 提供了类似的非同质化代币 (NFT) 原生碎片化的好处。在这里,获取 ERC-20 代币可以自动按比例发行 ERC-1155 代币,从而完全符合两种标准。

此外,类似于 ERC-7631,该提案允许用户在 ERC-20 到 ERC-1155 的同步过程中选择不参与 ERC-1155 的铸造和转移。

规范

本文档中的关键词“必须 (MUST)”,“禁止 (MUST NOT)”,“必需 (REQUIRED)”,“应该 (SHALL)”,“不应该 (SHALL NOT)”,“应当 (SHOULD)”,“不应当 (SHOULD NOT)”,“推荐 (RECOMMENDED)”,“不推荐 (NOT RECOMMENDED)”,“可以 (MAY)”和“可选 (OPTIONAL)”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

概述

每个 ERC-7681 必须实现 ERC20ERC1155 接口。

ERC-7681 接口

ERC-20 合约必须实现以下接口。

interface IERC7681 /* is IERC20, IERC1155 */ {
    /// 合约必须包含以下事件
    /// ERC20 相关事件
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    /// 合约必须包含以下事件
    /// ERC1155 相关事件
    event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value);
    event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    event URI(string _value, uint256 indexed _id);

    /// 合约可以包含以下函数
    /// ERC20 相关函数
    function name() public view returns (string);
    function symbol() public view returns (string);
    function decimals() public view returns (uint8);

    /// 合约必须包含以下函数
    /// ERC20 相关函数
    function totalSupply() public view returns (uint256);
    function balanceOf(address _owner) public view returns (uint256);
    function transfer(address _to, uint256 _value) public returns (bool);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool);
    function approve(address _spender, uint256 _value) public returns (bool);
    function allowance(address _owner, address _spender) public view returns (uint256);

    /// 合约必须包含以下函数
    /// ERC1155 相关函数
    function balanceOf(address _owner, uint256 _id) external view returns (uint256);
    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory);
    function setApprovalForAll(address _operator, bool _approved) external;
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
    function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
    function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external;
}

ERC-7681 可跳过接口

ERC-7681 合约可以实现以下接口。

interface IERC7681Skippable {
    /// @dev 当 `owner` 的跳过 ERC1155 代币状态通过任何机制更改时发出。
    ///
    /// `owner` 的初始跳过 ERC1155 代币状态可以动态地选择为 true 或 false,
    /// 但对其进行的任何更改必须发出此事件。
    event SkipTokenSet(address indexed owner, bool status);

    /// @dev 如果在 ERC-20 到 ERC-1155 同步期间,
    /// 应该跳过对 `owner` 的 ERC-1155 铸造和转移,则返回 true。否则返回 false。
    ///
    /// 此方法可能会回退
    ///
    /// 如果此方法回退:
    /// - 交互代码应将 `setSkipToken` 功能解释为不可用(并隐藏任何调用 `setSkipToken` 的功能)。
    /// - `owner` 的跳过 ERC1155 代币状态应解释为未定义。
    ///
    /// 一旦为给定的 `owner` 返回了 true 或 false 值,
    /// 此方法不得针对给定的 `owner` 回退。
    function getSkipToken(address owner) external view returns (bool);

    /// @dev 设置调用者的跳过 ERC1155 代币状态。
    ///
    /// 此方法可能会回退
    /// (例如,权限不足,不支持该方法)。
    ///
    /// 发出 {SkipTokenSet} 事件。
    function setSkipToken(bool status) external;
}

理由

实现灵活性

该提案有意不规定特定的代币同步逻辑,以允许不同的实现策略和新颖的用例,例如基于 ERC-20 持有量的一对一同步或 ERC-1155 代币的碎片化。开发者可以灵活地确定他们的同步方法,前提是它仍然完全符合这两种代币标准的规范。

ERC-1155 代币跳过

对于 owner 是智能合约的情况,默认将跳过状态设置为 true 可以防止与 DEX 和借贷协议等合约交互时进行不必要的 ERC-1155 铸造,从而可能降低 gas 成本。

向后兼容性

该提案与现有的 ERC-20 和 ERC-1155 标准完全向后兼容,确保依赖这些标准的合约将继续无缝运行。

安全考虑

耗尽 gas 拒绝服务

当用户转移 ERC-20 代币时,它可以触发各种 ERC-1155 代币的自动铸造、转移或销毁。此过程可能导致 gas 费用随着操作数量呈线性增长 O(n),而不是通常在 ERC-20 代币交易中看到的固定成本 O(1)。此外,用于选择 ERC-1155 代币 ID 的机制可能会进一步增加 gas 费用。因此,任何同步策略都需要考虑 ERC-1155 相关 gas 成本的潜在上升,以避免耗尽 gas,这可能导致拒绝服务的情况。

版权

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

Citation

Please cite this document as:

Sennett Lau (@sennett-lau), "ERC-7681: 双重性质多代币协议 [DRAFT]," Ethereum Improvement Proposals, no. 7681, April 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7681.