-
Notifications
You must be signed in to change notification settings - Fork 0
/
Token.sol
38 lines (31 loc) · 1.4 KB
/
Token.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
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
contract MyToken is Ownable, ERC20PresetMinterPauser {
bytes32 public constant CAPPER_ROLE = keccak256("CAPPER_ROLE");
using SafeMath for uint256;
uint256 private _cap;
constructor() ERC20PresetMinterPauser("RandomCoin", "RC") {
_cap = 1000;
_setupRole(CAPPER_ROLE, _msgSender());
_mint(msg.sender, 10);
}
function cap() public view virtual returns (uint256) {
return _cap;
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
if (from == address(0)) {
require(totalSupply().add(amount) <= cap(), "ERC20Capped: cap exceeded");
}
}
function setCap(uint256 _newCap) public {
string memory setCapErrorMessage = "setCap(): must have CAPPER_ROLE to change cap";
require(hasRole(CAPPER_ROLE, _msgSender()), setCapErrorMessage);
string memory capMustBeGreaterThanZeroErrorMessage = "setCap(): incorrect cap amount set, must be greater than zero";
require(_newCap > 0, capMustBeGreaterThanZeroErrorMessage);
_cap = _newCap;
}
}