-
Notifications
You must be signed in to change notification settings - Fork 30
/
cult.sol
113 lines (97 loc) · 4.18 KB
/
cult.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
// SPDX-License-Identifier: MIT
pragma solidity 0.8.2;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesCompUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol";
interface ITreasury {
function validatePayout() external;
}
contract Cult is Initializable,UUPSUpgradeable,ERC20Upgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable,ERC20VotesCompUpgradeable, OwnableUpgradeable, PausableUpgradeable {
using SafeMathUpgradeable for uint256;
address public treasury;
uint256 public tax;
mapping(address => bool) public whitelistedAddress;
event TreasuryAddressUpdated(address newTreasury);
event WhitelistAddressUpdated(address whitelistAccount, bool value);
event TaxUpdated(uint256 taxAmount);
function initialize(
address initialHolder,
uint256 initialSupply
) public initializer {
OwnableUpgradeable.__Ownable_init();
ERC20Upgradeable.__ERC20_init("Cult DAO", "CULT");
ERC20PermitUpgradeable.__ERC20Permit_init("cult");
ERC20VotesUpgradeable.__ERC20Votes_init_unchained();
__Pausable_init_unchained();
ERC20VotesCompUpgradeable.__ERC20VotesComp_init_unchained();
_mint(initialHolder, initialSupply);
tax=4;
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
require(!paused(), "ERC20Pausable: token transfer while paused");
}
function _afterTokenTransfer(address from, address to, uint256 amount)
internal
override(ERC20Upgradeable, ERC20VotesUpgradeable)
{
ERC20VotesUpgradeable._afterTokenTransfer(from, to, amount);
}
function _mint(address to, uint256 amount)
internal
override(ERC20Upgradeable, ERC20VotesUpgradeable)
{
super._mint(to, amount);
}
function _burn(address account, uint256 amount)
internal
override(ERC20Upgradeable, ERC20VotesUpgradeable)
{
super._burn(account, amount);
}
function setTreasuryAddress(address _treasury) external onlyOwner{
require(_treasury != address(0), "setTreasuryAddress: Zero address");
treasury = _treasury;
whitelistedAddress[_treasury] = true;
emit TreasuryAddressUpdated(_treasury);
}
function setWhitelistAddress(address _whitelist, bool _status) external onlyOwner{
require(_whitelist != address(0), "setWhitelistAddress: Zero address");
whitelistedAddress[_whitelist] = _status;
emit WhitelistAddressUpdated(_whitelist, _status);
}
function setTax(uint256 _tax) external onlyOwner{
tax = _tax;
emit TaxUpdated(tax);
}
function _maxSupply() internal view virtual override(ERC20VotesCompUpgradeable,ERC20VotesUpgradeable) returns (uint224) {
return type(uint224).max;
}
function _authorizeUpgrade(address) internal view override {
require(owner() == msg.sender, "Only owner can upgrade implementation");
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual override{
if(whitelistedAddress[sender] || whitelistedAddress[recipient]){
super._transfer(sender,recipient,amount);
}else{
uint256 taxAmount= amount.mul(tax).div(1000);
super._transfer(sender,treasury,taxAmount);
super._transfer(sender,recipient,amount.sub(taxAmount));
ITreasury(treasury).validatePayout();
}
}
}