4.2 KiB
Executable File
eip | title | description | author | discussions-to | status | last-call-deadline | type | category | created | requires |
---|---|---|---|---|---|---|---|---|---|---|
5007 | Time NFT, EIP-721 Time Extension | Add start time and end time to EIP-721 tokens. | Anders (@0xanders), Lance (@LanceSnow), Shrug <shrug@emojidao.org> | https://ethereum-magicians.org/t/eip-5007-eip-721-time-extension/8924 | Last Call | 2022-09-25 | Standards Track | ERC | 2022-04-13 | 165, 721 |
Abstract
This standard is an extension of EIP-721. It proposes some additional functions (startTime
, endTime
) to help with on-chain time management.
Motivation
Some NFTs have a defined usage period and cannot be used outside of that period. With traditional NFTs that do not include time information, if you want to mark a token as invalid or enable it at a specific time, you need to actively submit a transaction—a process both cumbersome and expensive.
Some existing NFTs contain time functions, but their interfaces are not consistent, so it is difficult to develop third-party platforms for them.
By introducing these functions (startTime
, endTime
), it is possible to enable and disable NFTs automatically on chain.
Specification
The keywords "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.
/**
* @dev the EIP-165 identifier for this interface is 0x7a0cdf92.
*/
interface IERC5007 /* is IERC721 */ {
/**
* @dev Returns the start time of the NFT as a UNIX timestamp.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function startTime(uint256 tokenId) external view returns (int64);
/**
* @dev Returns the end time of the NFT as a UNIX timestamp.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function endTime(uint256 tokenId) external view returns (int64);
}
The composable extension is OPTIONAL for this standard. This allows your NFT to be minted from an existing NFT or to merge two NFTs into one NFT.
/**
* @dev the EIP-165 identifier for this interface is 0x620063db.
*/
interface IERC5007Composable /* is IERC5007 */ {
/**
* @dev Returns the ancestor token id of the NFT.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function rootTokenId(uint256 tokenId) external view returns (uint256);
/**
* @dev Mint a new token from an old token.
* The rootTokenId of the new token is the same as the rootTokenId of the old token
*
* Requirements:
*
* - `oldTokenId` must exist.
* - `newTokenId` must not exist.
* - `newTokenOwner` cannot be the zero address.
* - `newTokenStartTime` require(oldTokenStartTime < newTokenStartTime && newTokenStartTime <= oldTokenEndTime)
*/
function split(
uint256 oldTokenId,
uint256 newTokenId,
address newTokenOwner,
int64 newTokenStartTime
) external;
/**
* @dev Merge the first token and second token into the new token.
*
* Requirements:
*
* - `firstTokenId` must exist.
* - `secondTokenId` must exist. require((firstToken.endTime + 1) == secondToken.startTime)
* - `newTokenOwner` cannot be the zero address.
* - `newTokenId` must not exist.
*/
function merge(
uint256 firstTokenId,
uint256 secondTokenId,
address newTokenOwner,
uint256 newTokenId
) external;
}
Rationale
Time Data Type
The max value of int64
is 9,223,372,036,854,775,807. As a timestamp, 9,223,372,036,854,775,807 is about year 292,471,210,648. uint256
is too big for C, C++, Java, Go, etc, and int64
is natively supported by mainstream programming languages.
Backwards Compatibility
This standard is fully EIP-721 compatible.
Test Cases
Test cases are included in test.js.
Run in terminal:
cd ../assets/eip-5007
npm install
truffle test
Reference Implementation
See ERC5007.sol
.
Security Considerations
No security issues found.
Copyright
Copyright and related rights waived via CC0.