/
KlimaIDONFT.sol
153 lines (116 loc) · 4.59 KB
/
KlimaIDONFT.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol";
contract KlimaIDONFT is
Initializable, ContextUpgradeable,
AccessControlEnumerableUpgradeable,
ERC721EnumerableUpgradeable,
ERC721BurnableUpgradeable,
ERC721PausableUpgradeable
{
modifier onlyMinter() {
require(hasRole(MINTER_ROLE, _msgSender()), "Minter: caller does not have the the minter role");
_;
}
modifier onlyPauser(){
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause");
_;
}
using CountersUpgradeable for CountersUpgradeable.Counter;
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
CountersUpgradeable.Counter private _tokenIdTracker;
string private _baseTokenURI;
constructor() {
}
function __KlimaIDONFT_init(
string memory name,
string memory symbol,
string memory _TokenURI
) initializer public {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__AccessControlEnumerable_init_unchained();
__ERC721_init_unchained(name, symbol);
__ERC721Enumerable_init_unchained();
__ERC721Burnable_init_unchained();
__Pausable_init_unchained();
__ERC721Pausable_init_unchained();
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
_setTokenURI(_TokenURI);
}
function setTokenURI(string memory _TokenURI) onlyMinter public {
_baseTokenURI = _TokenURI;
}
function _setTokenURI(string memory _TokenURI) internal {
_baseTokenURI = _TokenURI;
}
function tokenURI() public view returns (string memory){
return _baseTokenURI;
}
function totalSupply() public view override returns (uint256) {
return _tokenIdTracker.current();
}
function burn(uint256 tokenId) public override{
ERC721Upgradeable._burn(tokenId);
}
function _burn(uint256 tokenId) internal virtual override(ERC721Upgradeable){
ERC721Upgradeable._burn(tokenId);
}
function mint(address to) public onlyMinter whenPaused {
// We cannot just use balanceOf to create the new tokenId because tokens
// can be burned (destroyed), so we need a separate counter.
ERC721Upgradeable._mint(to, _tokenIdTracker.current());
_tokenIdTracker.increment();
}
function batchMint(address [] memory _list) public onlyMinter whenPaused {
// We cannot just use balanceOf to create the new tokenId because tokens
// can be burned (destroyed), so we need a separate counter.
require(_list.length <= 255, "Max 255 addresses at once");
for (uint8 i = 0; i < _list.length; i++) {
ERC721Upgradeable._mint(_list[i], _tokenIdTracker.current());
_tokenIdTracker.increment();
}
}
function pause() public virtual onlyPauser {
_pause();
}
function unpause() public virtual onlyPauser{
_unpause();
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable) {
if(hasRole(MINTER_ROLE, _msgSender())){
ERC721Upgradeable._beforeTokenTransfer(from,to,tokenId);
}
else
{
ERC721PausableUpgradeable._beforeTokenTransfer(from, to, tokenId);
}
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(AccessControlEnumerableUpgradeable, ERC721Upgradeable, ERC721EnumerableUpgradeable)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
uint256[48] private __gap;
}