-
Notifications
You must be signed in to change notification settings - Fork 1
/
ERC4907.sol
65 lines (55 loc) · 2.38 KB
/
ERC4907.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
// here is where you import the contracts to inherit from
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "./IERC4907.sol";
// name your contract here
contract ERC4907 is ERC721URIStorage, IERC4907 {
struct UserInfo {
address user; // address of user role
uint64 expires; // unix timestamp, user expires
}
// a mapping let's us set two variables UserInfo and _users to help define and store the concept of user
mapping(uint256 => UserInfo) internal _users;
// a constructor is something only used once, upon deployment, and never again
// in this case it defines and sets 2 strings, name and symbol
constructor(string memory name_, string memory symbol_) ERC721(name_, symbol_) {}
/// @notice set the user and expires for an NFT
/// @dev The zero address indicates there is no user
/// Throws if `tokenId` is not valid NFT
/// @param user The new user of the NFT
/// @param expires UNIX timestamp, The new user could use the NFT / utilities before time expires
function setUser(uint256 tokenId, address user, uint64 expires) public virtual override {
require(_isApprovedOrOwner(msg.sender, tokenId),"ERC721: transfer caller is not owner / nor approved");
UserInfo storage info = _users[tokenId];
info.user = user;
info.expires = expires;
emit UpdateUser(tokenId, user, expires);
}
/// @notice To get the "user" address for an NFT
/// @dev The zero address indicates that there is no user or the user is expired
/// @param "tokenId" is The NFT to get the user address for
/// @return The user address for this NFT
function userOf(uint256 tokenId) public view virtual override returns (address)
{
if (uint256(_users[tokenId].expires) >= block.timestamp) {
return _users[tokenId].user;
} else {
return address(0);
}
}
/// @notice Get the user "expires" for an NFT
/// @dev The zero value indicates that there is no user
/// @param "tokenId" The NFT to get the user expires for
/// @return The user expires for this NFT
function userExpires(uint256 tokenId) public view virtual override returns(uint256){
return _users[tokenId].expires;
}
/// @dev See {IERC165-supportsInterface}.
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool)
{
return
interfaceId == type(IERC4907).interfaceId ||
super.supportsInterface(interfaceId);
}
}