Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-6353: 慈善代币

EIP-20 代币的扩展,可以部分捐赠给慈善项目

Authors Aubay <blockchain-team@aubay.com>, BOCA Jeabby (@bjeabby1507), EL MERSHATI Laith (@lth-elm), KEMP Elia (@eliakemp)
Created 2022-05-13
Discussion Link https://ethereum-magicians.org/t/erc20-charity-token/12617
Requires EIP-20

摘要

EIP-20 的扩展,可以自动将每次转账的一定比例额外发送给第三方,并提供一个接口来检索此信息。这可以允许代币所有者每次转账时都向慈善机构捐款。这也可以用于允许自动化储蓄计划。

动机

有一些在链上的地址的慈善组织,也有希望进行自动化捐赠的代币持有者。拥有收集和管理这些捐款的标准化方法有助于用户和用户界面开发者。用户可以通过他们的代币产生影响,并为实现可持续的区块链发展做出贡献。项目可以轻松检索给定 EIP-20 代币的慈善捐款地址和费率,代币持有者可以比较代币合约所有者允许的最低费率捐赠优惠。此标准提供了允许代币持有者轻松捐赠的功能。

规范

本文档中的关键词“必须”,“不得”,“必需”,“应该”,“不应该”,“推荐”,“可以”和“可选”应解释为 RFC 2119 中所述。

合约的所有者可以在审查后,在 whitelistedRate 中注册慈善地址,并全局设置默认捐赠率。要注册地址,费率必须不能为空。

代币持有者可以_defaultAddress 中选择并指定一个默认的慈善地址,对于激活捐赠,此地址应该与空地址不同。

捐赠是一种基于百分比的费率模型,但计算方式可能不同。应用程序和个人可以通过使用 charityInfo() 检索信息来实现此标准,该函数指定给定地址的分配费率。

此标准提供了允许代币持有者轻松捐赠的功能。激活后的捐赠直接在被覆盖的 transfertransferFromapprove 函数中完成。

当调用 transfertransferFrom 时,发送者的余额将减少初始金额,并扣除捐赠金额。初始转移的金额将被转移到接收者的余额中,并且额外的捐赠金额将被转移到第三方(慈善机构)。这两个转移同时完成,并发出两个 Transfer 事件。 此外,如果账户的余额不足以支付转账和捐赠,则整个转账将被回滚。

// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.4;

///
/// @dev ERC20 Charity 兼容合约的必需接口。
///
interface IERC20charity is IERC165 {
    /// 此接口的 EIP-165 标识符为 0x557512b6

    
    /**
     * @dev 当 `toAdd` 慈善地址添加到 `whitelistedRate` 时发出。
     */
    event AddedToWhitelist (address toAdd);

    /**
     * @dev 当 `toRemove` 慈善地址从 `whitelistedRate` 中删除时发出。
     */
    event RemovedFromWhitelist (address toRemove);

    /**
     * @dev 当 `_defaultAddress` 慈善地址被修改并设置为 `whitelistedAddr` 时发出。
     */
    event DonnationAddressChanged (address whitelistedAddr);

    /**
     * @dev 当 `_defaultAddress` 慈善地址被修改并设置为 `whitelistedAddr` 
    * 并且 _donation 设置为 `rate` 时发出。
     */
    event DonnationAddressAndRateChanged (address whitelistedAddr,uint256 rate);

    /**
     * @dev 当 `whitelistedRate` 的 `whitelistedAddr` 被修改并设置为 `rate` 时发出。
     */
    event ModifiedCharityRate(address whitelistedAddr,uint256 rate);
    
    /**
    *@notice 调用慈善地址以确定合约是否将该地址列入白名单
    *以及是否分配了费率。
    *@param addr - 查询捐赠信息的慈善地址。
    *@return whitelisted - 如果合约将该地址列入白名单以接收捐赠,则为 true
    *@return defaultRate - 合约所有者默认定义的费率,允许的最低费率不同于 0
    */
    function charityInfo(
        address addr
    ) external view returns (
        bool whitelisted,
        uint256 defaultRate
    );

    /**
    *@notice 将地址添加到白名单并将费率设置为默认费率。
    * @dev 要求:
     *
     * - `toAdd` 不能是零地址。
     *
     * @param toAdd 要列入白名单的地址。
     */
    function addToWhitelist(address toAdd) external;

    /**
    *@notice 从白名单中删除地址并将费率设置为默认费率。
    * @dev 要求:
     *
     * - `toRemove` 不能是零地址。
     *
     * @param toRemove 要从白名单中删除的地址。
     */
    function deleteFromWhitelist(address toRemove) external;

    /**
    *@notice 获取所有已注册的慈善地址。
     */
    function getAllWhitelistedAddresses() external ;

    /**
    *@notice 向用户显示将接收捐赠的默认慈善地址的费率。
     */
    function getRate() external view returns (uint256);

    /**
    *@notice 在 {whitelistedRate} 中为慈善地址设置个性化费率。
    * @dev 要求:
     *
     * - `whitelistedAddr` 不能是零地址。
     * - `rate` 不能低于默认费率。
     *
     * @param whitelistedAddr 要设置为默认值的地址。
     * @param rate 捐赠的个性化费率。
     */
    function setSpecificRate(address whitelistedAddr , uint256 rate) external;

    /**
    *@notice 为用户设置将接收捐赠的默认慈善地址。
    * 将应用 {whitelistedRate} 中指定的默认费率。
    * @dev 要求:
     *
     * - `whitelistedAddr` 不能是零地址。
     *
     * @param whitelistedAddr 要设置为默认值的地址。
     */
    function setSpecificDefaultAddress(address whitelistedAddr) external;

    /**
    *@notice 为用户设置将接收捐赠的默认慈善地址。
    * 费率由用户指定。
    * @dev 要求:
     *
     * - `whitelistedAddr` 不能是零地址。
     * - `rate` 不能低于默认费率
     * 或此合约的所有者在 {whitelistedRate} 中指定的费率。
     *
     * @param whitelistedAddr 要设置为默认值的地址。
     * @param rate 捐赠的个性化费率。
     */
    function setSpecificDefaultAddressAndRate(address whitelistedAddr , uint256 rate) external;

    /**
    *@notice 向用户显示将接收捐赠的默认慈善地址。
    * 将应用 {whitelistedRate} 中指定的默认费率。
     */
    function specificDefaultAddress() external view returns (
        address defaultAddress
    );

    /**
    *@notice 删除默认地址并停用捐赠。
     */
    function deleteDefaultAddress() external;
}

函数

addToWhitelist

将地址添加到白名单并将费率设置为默认费率。

参数 描述
toAdd 要添加到白名单的地址。

deleteFromWhitelist

从白名单中删除地址并将费率设置为默认费率。

参数 描述
toRemove 要从白名单中删除的地址。

getAllWhitelistedAddresses

获取所有已注册的慈善地址。

getRate

向用户显示将接收捐赠的默认慈善地址的费率。

setSpecificRate

在 {whitelistedRate} 中为慈善地址设置个性化费率。

参数 描述
whitelistedAddr 要设置为默认值的地址。
rate 捐赠的个性化费率。

setSpecificDefaultAddress

为用户设置将接收捐赠的默认慈善地址。将应用 {whitelistedRate} 中指定的默认费率。

参数 描述
whitelistedAddr 要设置为默认值的地址。

setSpecificDefaultAddressAndRate

为用户设置将接收捐赠的默认慈善地址。费率由用户指定。

参数 描述
whitelistedAddr 要设置为默认值的地址。
rate 捐赠的个性化费率。

specificDefaultAddress

向用户显示将接收捐赠的默认慈善地址。将应用 {whitelistedRate} 中指定的默认费率。

deleteDefaultAddress

删除默认地址并停用捐赠。

charityInfo

调用慈善地址以确定合约是否将该地址列入白名单,如果是,则确定分配的费率。

参数 描述
addr 查询捐赠信息的慈善地址。

原理

此 EIP 选择通过使用数组并将“活动”状态与映射 whitelistedRate 结合使用来将慈善地址列入白名单,以允许接收者的多种选择并提高透明度。捐赠地址也可以是由合约所有者选择并定期修改的单个地址。

如果发送者余额不足,即代币总额(初始转账 + 捐赠)不足,则转账将回滚。捐赠在 transfer 函数中完成,以简化使用,并且不添加额外的函数,但是实现方式可能不同,例如,允许在激活捐赠时进行转账而不包括捐赠金额。代币实施者还可以选择将捐赠存储在合约中或另一个合约中,并添加提款或可领取的函数,以便慈善机构可以自己领取已分配的代币数量,额外的转账将由慈善机构触发,而不是代币持有者。

此外,此处的捐赠金额被计算为转移的代币数量的百分比,以允许不同的情况,但代币实施者可以决定选择另一种方法,例如四舍五入交易价值。

向后兼容性

此实现是对 EIP-20 功能的扩展,它引入了新功能,同时保留了 EIP-20 标准的核心接口和功能。存在一个小的向后兼容性问题,实际上,如果账户余额不足,则转账可能会失败。

测试用例

测试可以在 charity.js 中找到。

参考实现

该标准的参考实现可以在 contracts/ 文件夹下找到。

安全注意事项

与 EIP-20 相比,没有其他安全注意事项。

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Aubay <blockchain-team@aubay.com>, BOCA Jeabby (@bjeabby1507), EL MERSHATI Laith (@lth-elm), KEMP Elia (@eliakemp), "ERC-6353: 慈善代币 [DRAFT]," Ethereum Improvement Proposals, no. 6353, May 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6353.