DCIPs/assets/eip-5007/contracts/ERC5007.sol

91 lines
2.1 KiB
Solidity

// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "./IERC5007.sol";
abstract contract ERC5007 is ERC721, IERC5007 {
struct TimeNftInfo {
int64 startTime;
int64 endTime;
}
mapping(uint256 => TimeNftInfo) internal _timeNftMapping;
/**
* @dev See {IERC5007-startTime}.
*/
function startTime(uint256 tokenId)
public
view
virtual
override
returns (int64) {
require(_exists(tokenId), "ERC5007: invalid tokenId");
return _timeNftMapping[tokenId].startTime;
}
/**
* @dev See {IERC5007-endTime}.
*/
function endTime(uint256 tokenId)
public
view
virtual
override
returns (int64) {
require(_exists(tokenId), "ERC5007: invalid tokenId");
return _timeNftMapping[tokenId].endTime;
}
/**
* @dev mint a new time NFT.
*
* Requirements:
*
* - `tokenId_` must not exist.
* - `to_` cannot be the zero address.
* - `endTime_` should be equal or greater than `startTime_`
*/
function _mintTimeNft(
address to_,
uint256 tokenId_,
int64 startTime_,
int64 endTime_
) internal virtual {
require(endTime_ >= startTime_, 'ERC5007: invalid endTime');
_mint(to_, tokenId_);
TimeNftInfo storage info = _timeNftMapping[tokenId_];
info.startTime = startTime_;
info.endTime = endTime_;
}
/**
* @dev Destroys `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*
*/
function _burn(uint256 tokenId) internal virtual override {
super._burn(tokenId);
delete _timeNftMapping[tokenId];
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override
returns (bool) {
return
interfaceId == type(IERC5007).interfaceId ||
super.supportsInterface(interfaceId);
}
}