Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7641: 内在收益分成代币

一种 ERC-20 扩展,集成了收益分成机制,确保代币从本质上代表了公共收益池中的一部分

Authors Conway (@0x1cc), Cathie So (@socathie), Xiaohang Yu (@xhyumiracle), Suning Yao (@fewwwww), Kartin <kartin@hyperoracle.io>
Created 2024-02-28
Discussion Link https://ethereum-magicians.org/t/erc-7641-intrinsic-revshare-token/18999
Requires EIP-20

摘要

本提案概述了主流 ERC-20 代币标准的扩展,引入了一种无缝集成的收益分成机制。它包含了一套旨在促进代币持有者之间公平分配收益的接口,同时保留了 ERC-20 的基本属性。该设计的核心是建立一个公共收益池,汇总来自各种来源的收入。本质上,该代币体现了股份,使持有者能够燃烧他们的代币并从收益池中赎回相应比例的份额。这种创新的燃烧机制保证了,当收益池非空时,代币的价值至少与收益池的份额相称。此外,在定期的时间间隔内,代币持有者可以申领一部分奖励,丰富他们的参与度并进一步提高代币的效用。

动机

为代币持有者提供收益分成

本提案标准化了一种内在收益分成(revenue-sharing)模型,允许用户定期申领奖励,以确保流动性效率。该标准本质上可以为持有者提供清晰的长期利益路径和收益分成,通过奖励持有者来实现更可持续的代币模型。

通过继承 ERC-20 的功能,代币持有者可以在二级市场上灵活交易代币,并且可选的燃烧机制使他们能够通过获得收益池的比例份额来积极为通货紧缩经济模型做出贡献。

这种方法还通过为内在收益分成代币持有者提供可持续且多方面的收益分成生态系统,从而鼓励积极参与开源计划。

为任何项目提供资金

该标准允许将所有类型的具有收益的项目代币化。此 EIP 为激励对开源项目的贡献引入了一种新模型。它提出了向积极的贡献者分发内在收益分成代币,从而创建一种反映项目参与度的有形资产。

值得注意的是,它引入了一种称为初始模型发行(Initial Model Offering,简称 IMO)的用例。许多开源 AI 模型在通过其贡献获利方面面临挑战,从而导致贡献者和组织都缺乏动力。本提案旨在通过引入内在收益分成代币来增强开源 AI 模型和组织的能力。在利用代币进行 IMO 时,开源 AI 组织可以进行筹款,以获取激励 AI 模型持续开发所需的基本资金。此外,任何利用这些开源模型的项目都会通过向收益池支付指定费用来为生态系统的可持续性做出贡献。该费用构成了收益分成机制的基础,允许内在收益分成代币持有者申领相应比例的份额,从而建立一个系统且公平的分配机制。重要的是,这种收益分成功能可作为代币持有者的保证,从而促进长期的收益利益并鼓励持续参与开源 AI 社区。

规范

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

每个符合规范的合约都必须实现 IERC7641ERC-20 接口。

内在收益分成代币标准包括以下接口:

IERC7641:

  • 定义一个 claimableRevenue 视图函数,用于计算代币持有者在某个快照处可申领的 ETH 数量。
  • 定义一个 claim 函数,供代币持有者根据某个快照处的代币余额申领 ETH。
  • 定义一个 snapshot 函数,用于创建代币余额和可申领收益代币余额的快照。
  • 定义一个 redeemableOnBurn 视图函数,用于计算代币持有者在燃烧代币时可赎回的 ETH 数量。
  • 定义一个 burn 函数,供代币持有者燃烧代币并赎回相应数量的收益代币。
pragma solidity ^0.8.24;

/**
 * @dev An interface for ERC-7641, an ERC-20 extension that integrates a revenue-sharing mechanism, ensuring tokens intrinsically represent a share of a communal revenue pool
 * @dev ERC-7641 的接口,是 ERC-20 扩展,集成了收益分成机制,确保代币从本质上代表了公共收益池中的一部分
 */
interface IERC7641 is IERC20 {
    /**
     * @dev A function to calculate the amount of ETH claimable by a token holder at certain snapshot.
     * @param account The address of the token holder
     * @param snapshotId The snapshot id
     * @return The amount of revenue token claimable
     * @dev 用于计算代币持有者在特定快照处可申领的 ETH 数量的函数。
     * @param account 代币持有者的地址
     * @param snapshotId 快照 ID
     * @return 可申领的收益代币数量
     */
    function claimableRevenue(address account, uint256 snapshotId) external view returns (uint256);

    /**
     * @dev A function for token holder to claim ETH based on the token balance at certain snapshot.
     * @param snapshotId The snapshot id
     * @dev 代币持有者根据特定快照处的代币余额申领 ETH 的函数。
     * @param snapshotId 快照 ID
     */
    function claim(uint256 snapshotId) external;

    /**
     * @dev A function to snapshot the token balance and the claimable revenue token balance
     * @return The snapshot id
     * @notice Should have `require` to avoid ddos attack
     * @dev 拍摄代币余额和可申领收益代币余额快照的函数
     * @return 快照 ID
     * @notice 应该有 `require` 以避免 ddos 攻击
     */
    function snapshot() external returns (uint256);

    /**
     * @dev A function to calculate the amount of ETH redeemable by a token holder upon burn
     * @param amount The amount of token to burn
     * @return The amount of revenue ETH redeemable
     * @dev 用于计算代币持有者在燃烧时可赎回的 ETH 数量的函数
     * @param amount 要燃烧的代币数量
     * @return 可赎回的收益 ETH 数量
     */
    function redeemableOnBurn(uint256 amount) external view returns (uint256);

    /**
     * @dev A function to burn tokens and redeem the corresponding amount of revenue token
     * @param amount The amount of token to burn
     * @dev 燃烧代币并赎回相应数量的收益代币的函数
     * @param amount 要燃烧的代币数量
     */
    function burn(uint256 amount) external;
}

可选扩展:AltRevToken

AltRevToken 扩展是此标准的可选扩展。 这允许合约接受其他 ERC-20 收益代币(不仅仅是 ETH)到收益分成池中。

AltRevToken 扩展

  • 定义一个 claimableERC20 函数来计算代币持有者在某个快照处可以申领的 ERC-20 数量。
  • 定义一个 redeemableERC20OnBurn 函数来计算代币持有者在燃烧时可赎回的 ERC-20 数量。
pragma solidity ^0.8.24;

/**
 * @dev An optional extension of the ERC-7641 standard that accepts other ERC-20 revenue tokens into the contract with corresponding claim function
 * @dev ERC-7641 标准的可选扩展,它接受其他 ERC-20 收益代币到合约中,并具有相应的申领函数
 */
interface IERC7641AltRevToken is IERC7641 {
    /**
     * @dev A function to calculate the amount of ERC-20 claimable by a token holder at certain snapshot.
     * @param account The address of the token holder
     * @param snapshotId The snapshot id
     * @param token The address of the revenue token
     * @return The amount of revenue token claimable
     * @dev 用于计算代币持有者在特定快照处可申领的 ERC-20 数量的函数。
     * @param account 代币持有者的地址
     * @param snapshotId 快照 ID
     * @param token 收益代币的地址
     * @return 可申领的收益代币数量
     */
    function claimableERC20(address account, uint256 snapshotId, address token) external view returns (uint256);

    /**
     * @dev A function to calculate the amount of ERC-20 redeemable by a token holder upon burn
     * @param amount The amount of token to burn
     * @param token The address of the revenue token
     * @return The amount of revenue token redeemable
     * @dev 用于计算代币持有者在燃烧时可赎回的 ERC-20 数量的函数
     * @param amount 要燃烧的代币数量
     * @param token 收益代币的地址
     * @return 可赎回的收益代币数量
     */
    function redeemableERC20OnBurn(uint256 amount, address token) external view returns (uint256);
}

理由

收益分成机制

我们实施了一种收益分成机制,其中任何代币持有者都可以从收益池中申领相应比例的份额。 为了确保定期和透明的收益分配,我们采用了快照方法,捕获代币余额和相关的可申领收益代币余额。 需要定期调用快照方法,对应于不同的收益分成过程。 在每个快照期间,代币持有者有权从收益池中申领相应比例的份额,从而为参与者创建一个系统且公平的分配机制。

snapshot 接口

我们指定一个 snapshot 接口来拍摄代币余额和可申领收益代币余额的快照。 此功能确保正确跟踪代币持有量,从而便于透明地记录每个代币组合。 定期调用快照函数对于维护最新记录至关重要。 snapshot 接口返回一个唯一的 snapshotId,允许访问与该特定快照关联的相应代币余额和可申领收益代币余额。 这种系统方法增强了历史数据检索的正确性和可靠性,为用户提供了对其在不同时间点的代币和收益代币余额的全面了解。

claimableRevenue 接口

我们指定一个 claimableRevenue 接口来计算代币持有者在某个快照处可申领的 ETH 数量。 我们将分享两个连续快照之间的收益。 例如,在我们的参考实现中,假设两个快照之间的收益为 R,我们指定一个收益分成比例 p,范围从 0%-100%,并根据代币比例将 pR 的收益分享给不同的代币持有者。 在本示例中,持有 amount 个代币的代币持有者在某个快照处可申领的 ETH 数量为 pR * amount / totalAmount,其中 totalAmount 表示 ERC-7641 代币的总量。 请注意,剩余的 (1-p)R 收益将保留在收益池中,我们可以通过燃烧来取出这部分收益。

claim 接口

我们指定一个 claim 接口,供代币持有者根据某个快照处的代币余额申领 ETH。每个代币持有者只能在某个快照处申领一次收益,从而确保公平和透明的分配机制。

燃烧机制

我们实施了一种燃烧机制,其中任何代币持有者都可以燃烧他们的代币以从收益池中赎回相应比例的份额。 这种机制起到了保证作用,确保代币的价值始终大于或等于收益池的份额,从而促进公平和平衡的系统。

redeemableOnBurn 接口

我们指定 redeemableOnBurn 接口来计算代币持有者在燃烧时可赎回的 ETH 数量。 它被定义为一个视图函数,以降低 Gas 成本。 例如,在我们的参考实现中,具有 amount 个代币要燃烧的一个代币持有者可赎回的 ETH 数量,即 redeemableETH

redeemableETH = amount / totalSupply * totalRedeemableETH

其中,totalSupply 表示 ERC-7641 代币的总供应量,totalRedeemableETH 表示燃烧池中 ETH 的总量。

burn 接口:

我们指定 burn 接口,供代币持有者燃烧代币并赎回相应数量的收益代币。 代币持有者最多可以燃烧其持有的所有代币。 这种燃烧过程会导致代币总供应量减少,从而建立通货紧缩的经济模型。 此外,重要的是要注意,一旦燃烧的代币将不参与任何后续的收益分成。

向后兼容性

此标准与 ERC-20 向后兼容,因为它使用新接口扩展了现有功能。

测试用例

参考实现包括此标准中 contracts/ 下的接口的示例实现,以及 test/ 下的相应单元测试。

参考实现

安全考虑事项

通货紧缩的经济模型

本标准中燃烧机制的引入标志着向通货紧缩的经济模型的转变,这引入了关于安全性的独特考量。一个突出的问题涉及对代币流动性和市场动态的潜在影响。通过燃烧不断减少代币供应量可能会影响流动性水平,从而可能导致波动性增加和容易受到价格操纵的影响。必须进行彻底的压力测试和市场模拟,以评估系统在各种情况下的弹性。

垃圾收益代币

AltRevToken 的扩展,使其能够设置不同的收益代币,引入了特定的安全注意事项,主要集中在防止添加大量可能毫无价值的代币。添加过多的垃圾(无价值)代币可能会导致与燃烧和申领过程相关的 gas 费用增加。这可能会导致效率低下和更高的用户交易成本,从而可能阻止参与收益分成活动。

健全的治理模型对于批准和添加新的收益代币至关重要。实施透明且由社区驱动的决策过程可确保仅引入信誉良好且有价值的代币,从而防止包含几乎没有效用的代币。此治理过程应包括社区投票、安全审计以及对 gas 费用潜在影响的仔细考虑。

版权

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

Citation

Please cite this document as:

Conway (@0x1cc), Cathie So (@socathie), Xiaohang Yu (@xhyumiracle), Suning Yao (@fewwwww), Kartin <kartin@hyperoracle.io>, "ERC-7641: 内在收益分成代币 [DRAFT]," Ethereum Improvement Proposals, no. 7641, February 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7641.