⚠️ 该 EIP 不建议普遍使用或实施,因为它可能会发生变化。

EIP-5507: Refundable Tokens Source

Adds refund functionality to EIP-20, EIP-721, and EIP-1155 tokens

作者 elie222, Pandapip1
讨论-To https://ethereum-magicians.org/t/eip-5507-refundable-nfts/10451
状态 Draft
类型 Standards Track
分类 ERC
创建日期 2022-08-19
依赖 20, 165, 721, 1155
英文版 https://eips.ethereum.org/EIPS/eip-5507

Abstract

This EIP adds refund functionality for initial token offerings to EIP-20, EIP-721, and EIP-1155. Funds are held in escrow until a predetermined time before they are claimable. Until that predetermined time passes, users can receive a refund for tokens they have purchased.

Motivation

The NFT and token spaces lack accountability. For the health of the ecosystem as a whole, better mechanisms to prevent rugpulls from happening are needed. Offering refunds provides greater protection for buyers and increases legitimacy for creators.

Specification

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.

EIP-20 Refund Extension

// SPDX-License-Identifier: CC0-1.0

pragma solidity ^0.8.4;

import "IERC20.sol";
import "IERC165.sol";

/// @notice Refundable EIP-20 tokens
/// @dev    The EIP-165 identifier of this interface is `0xTODO`
interface IERC20Refund is ERC20, ERC165 {
    /// @notice           Emitted when a token is refunded
    /// @dev              Emitted by `refund`
    /// @param  _sender   The person that requested a refund
    /// @param  _amount   The amount of token (in terms of the smallest divisible unit) that was refunded
    event Refund(
        address indexed _sender,
        uint256 indexed _amount
    );

    /// @notice         As long as the refund is active, refunds the user
    /// @dev            Make sure to check that the user has the token, and be aware of potential re-entrancy vectors
    /// @param  amount  The `amount` to refund
    function refund(uint256 amount) external;

    /// @notice         Gets the refund price
    /// @return _wei    The amount of ether (in wei) that would be refunded for a single token unit (10**decimals smallest divisible units)
    function refundOf() external view returns (uint256 _wei);

    /// @notice         Gets the first block for which the refund is not active
    /// @return block   The block beyond which the token cannot be refunded
    function refundDeadlineOf() external view returns (uint256 block);
}

EIP-721 Refund Extension

// SPDX-License-Identifier: CC0-1.0

pragma solidity ^0.8.4;

import "IERC721.sol";
import "IERC165.sol";

/// @notice Refundable EIP-721 tokens
/// @dev    The EIP-165 identifier of this interface is `0xTODO`
interface IERC721Refund is ERC721, ERC165 {
    /// @notice           Emitted when a token is refunded
    /// @dev              Emitted by `refund`
    /// @param  _sender   The person that requested a refund
    /// @param  _tokenId  The `tokenId` that was refunded
    event Refund(
        address indexed _sender,
        uint256 indexed _tokenId
    );

    /// @notice         As long as the refund is active for the given `tokenId`, refunds the user
    /// @dev            Make sure to check that the user has the token, and be aware of potential re-entrancy vectors
    /// @param  tokenId The `tokenId` to refund
    function refund(uint256 tokenId) external;

    /// @notice         Gets the refund price of the specific `tokenId`
    /// @param  tokenId The `tokenId` to query
    /// @return _wei    The amount of ether (in wei) that would be refunded
    function refundOf(uint256 tokenId) external view returns (uint256 _wei);

    /// @notice         Gets the first block for which the refund is not active for a given `tokenId`
    /// @param  tokenId The `tokenId` to query
    /// @return block   The block beyond which the token cannot be refunded
    function refundDeadlineOf(uint256 tokenId) external view returns (uint256 block);
}

EIP-1155 Refund Extension

// SPDX-License-Identifier: CC0-1.0

pragma solidity ^0.8.4;

import "IERC1155.sol";
import "IERC165.sol";

/// @notice Refundable EIP-1155 tokens
/// @dev    The EIP-165 identifier of this interface is `0xTODO`
interface IERC1155Refund is IERC1155, IERC165 {
    /// @notice           Emitted when a token is refunded
    /// @dev              Emitted by `refund`
    /// @param  _sender   The person that requested a refund
    /// @param  _tokenId  The `tokenId` that was refunded
    /// @param  _amount   The amount of `tokenId` that was refunded
    event Refund(
        address indexed _sender,
        uint256 indexed _tokenId,
        uint256 _amount
    );

    /// @notice         As long as the refund is active for the given `tokenId`, refunds the user
    /// @dev            Make sure to check that the user has enough tokens, and be aware of potential re-entrancy vectors
    /// @param  tokenId The `tokenId` to refund
    /// @param  amount  The amount of `tokenId` to refund
    function refund(uint256 tokenId, uint256 amount) external;

    /// @notice         Gets the refund price of the specific `tokenId`
    /// @param  tokenId The `tokenId` to query
    /// @return _wei    The amount of ether (in wei) that would be refunded for a single token
    function refundOf(uint256 tokenId) external view returns (uint256 _wei);

    /// @notice         Gets the first block for which the refund is not active for a given `tokenId`
    /// @param  tokenId The `tokenId` to query
    /// @return block   The block beyond which the token cannot be refunded
    function refundDeadlineOf(uint256 tokenId) external view returns (uint256 block);
}

Rationale

refundDeadlineOf uses blocks instead of timestamps, as timestamps are less reliable than block numbers.

向后兼容性

No backward compatibility issues were found.

Security Considerations

Needs discussion.

Copyright and related rights waived via CC0.

参考文献

Please cite this document as:

elie222, Pandapip1, "EIP-5507: Refundable Tokens [DRAFT]," Ethereum Improvement Proposals, no. 5507, August 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5507.