EIP-5507: Refundable Tokens
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
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.