forked from filterswap/filterswap-contracts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFilterManager.sol
More file actions
242 lines (175 loc) · 8.09 KB
/
Copy pathFilterManager.sol
File metadata and controls
242 lines (175 loc) · 8.09 KB
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8;
contract FilterManager {
address public adminAddress;
address public treasuryAddress;
address public factoryAddress;
address public routerAddress;
address public deployerAddress;
address public verifierAddress;
address public distributorAddress;
address public wethAddress;
address public governanceToken;
uint public governanceVoteDeadline;
uint public governanceMaxVotingPower;
uint public governanceMinVotesRequired;
uint public swapLiquidityProviderFee;
uint public swapTreasuryFee;
mapping(address => bool) public isTokenVerified;
uint public deployerMaxOwnerShare;
// **** ROUTER SPECIFIC ****
mapping(address => mapping(address => uint)) public liquidityUnlockTimes;
uint public liquidityMinLockTime;
// **** DEPLOYER SPECIFIC ****
uint public deployerMintFee;
uint public numTokenTemplates;
mapping(uint => address) public tokenTemplateAddresses;
// **** VERIFICATION REQUEST SPECIFIC ****
uint public verificationRequestFee;
uint public verificationRequestDeadline;
// **** PRESALE SPECIFIC ****
uint public presaleFee; // in basis points
uint public presaleMinDuration;
uint public presaleMaxDuration;
uint public presaleMaxFinalizeTime;
uint public presaleMinTokenPercentage;
// **** CONSTRUCTOR & MODIFIER FUNCTIONS ****
constructor() {
adminAddress = msg.sender;
}
modifier onlyAdmin() {
require(msg.sender == adminAddress, "FilterManager: FORBIDDEN");
_;
}
modifier onlyAdminOrContracts() {
require(
msg.sender == adminAddress ||
msg.sender == deployerAddress ||
msg.sender == verifierAddress ||
msg.sender == distributorAddress,
"FilterManager: FORBIDDEN");
_;
}
modifier onlyRouter() {
require(msg.sender == routerAddress, "FilterManager: FORBIDDEN");
_;
}
modifier untilInitialized() {
if (wethAddress != address(0) && factoryAddress != address(0) && routerAddress != address(0)) revert("FilterManager: ALREADY_INITIALIZED");
_;
}
// **** VIEW FUNCTIONS ****
function isLiquidityLocked(address _liquidityProviderAddress, address _pairAddress) external view returns (bool) {
return block.timestamp < liquidityUnlockTimes[_liquidityProviderAddress][_pairAddress] ? true : false;
}
// **** ONE-TIME FUNCTIONS ****
function setFactoryAddress(address _factoryAddress) external onlyAdmin untilInitialized {
factoryAddress = _factoryAddress;
}
function setRouterAddress(address _routerAddress) external onlyAdmin untilInitialized {
routerAddress = _routerAddress;
}
function setWethAddress(address _wethAddress) external onlyAdmin untilInitialized {
wethAddress = _wethAddress;
isTokenVerified[wethAddress] = true;
}
// **** ADMIN FUNCTIONS (general) ****
function setAdminAddress(address _adminAddress) external onlyAdmin {
adminAddress = _adminAddress;
}
function setTreasuryAddress(address _treasuryAddress) external onlyAdmin {
treasuryAddress = _treasuryAddress;
}
function setDeployerAddress(address _deployerAddress) external onlyAdmin {
deployerAddress = _deployerAddress;
}
function setVerifierAddress(address _verifierAddress) external onlyAdmin {
verifierAddress = _verifierAddress;
}
function setDistributorAddress(address _distributorAddress) external onlyAdmin {
distributorAddress = _distributorAddress;
}
function verifyToken(address _tokenAddress) external onlyAdminOrContracts {
isTokenVerified[_tokenAddress] = true;
}
function unverifyToken(address _tokenAddress) external onlyAdminOrContracts {
isTokenVerified[_tokenAddress] = false;
}
function setSwapLiquidityProviderFee(uint _swapLiquidityProviderFee) external onlyAdminOrContracts {
swapLiquidityProviderFee = _swapLiquidityProviderFee;
}
function setSwapTreasuryFee(uint _swapTreasuryFee) external onlyAdminOrContracts {
swapTreasuryFee = _swapTreasuryFee;
}
// **** ADMIN FUNCTIONS (governance)
function setGovernanceToken(address _governanceToken) external onlyAdmin {
governanceToken = _governanceToken;
}
function setGovernanceVoteDeadline(uint _governanceVoteDeadline) external onlyAdmin {
governanceVoteDeadline = _governanceVoteDeadline;
}
function setGovernanceMaxVotingPower(uint _governanceMaxVotingPower) external onlyAdmin {
governanceMaxVotingPower = _governanceMaxVotingPower;
}
function setGovernanceMinVotesRequired(uint _governanceMinVotesRequired) external onlyAdmin {
governanceMinVotesRequired = _governanceMinVotesRequired;
}
// **** ADMIN FUNCTIONS (router) ****
function setLiquidityMinLockTime(uint _liquidityMinLockTime) external onlyAdmin {
liquidityMinLockTime = _liquidityMinLockTime;
}
function setLiquidityUnlockTime(address _holderAddress, address _pairAddress, uint _liquidityLockTime) private {
liquidityUnlockTimes[_holderAddress][_pairAddress] = _liquidityLockTime;
}
function imposeLiquidityLock(address _holderAddress, address _pairAddress, uint _liquidityLockTime) external onlyRouter {
require(_liquidityLockTime >= liquidityMinLockTime, "FilterManager: LOCKTIME_TOO_SHORT");
if (liquidityUnlockTimes[_holderAddress][_pairAddress] == 0) setLiquidityUnlockTime(_holderAddress, _pairAddress, block.timestamp + _liquidityLockTime);
else if (liquidityUnlockTimes[_holderAddress][_pairAddress] < block.timestamp) setLiquidityUnlockTime(_holderAddress, _pairAddress, block.timestamp + _liquidityLockTime);
}
function removeLiquidityLock(address _holderAddress, address _pairAddress) external onlyAdmin {
liquidityUnlockTimes[_holderAddress][_pairAddress] = 0;
}
// **** ADMIN FUNCTIONS (deployer) ****
function setDeployerMintFee(uint _deployerMintFee) external onlyAdmin {
deployerMintFee = _deployerMintFee;
}
function addTokenTemplate(address _templateAddress) external onlyAdmin {
tokenTemplateAddresses[numTokenTemplates] = _templateAddress;
numTokenTemplates++;
}
function removeTokenTemplate(uint _templateIndex) external onlyAdmin {
tokenTemplateAddresses[_templateIndex] = address(0);
numTokenTemplates--;
}
function setDeployerMaxOwnerShare(uint _deployerMaxOwnerShare) external onlyAdmin {
deployerMaxOwnerShare = _deployerMaxOwnerShare;
}
// **** ADMIN FUNCTIONS (presale) ****
function setPresaleFee(uint _presaleFee) external onlyAdmin {
presaleFee = _presaleFee;
}
function setPresaleMinDuration(uint _presaleMinDuration) external onlyAdmin {
presaleMinDuration = _presaleMinDuration;
}
function setPresaleMaxDuration(uint _presaleMaxDuration) external onlyAdmin {
presaleMaxDuration = _presaleMaxDuration;
}
function setPresaleMaxFinalizeTime(uint _presaleMaxFinalizeTime) external onlyAdmin {
presaleMaxFinalizeTime = _presaleMaxFinalizeTime;
}
function setPresaleMinTokenPercentage(uint _presaleMinTokenPercentage) external onlyAdmin {
presaleMinTokenPercentage = _presaleMinTokenPercentage;
}
// **** ADMIN FUNCTIONS (verification requests) ****
function setVerificationRequestFee(uint _verificationRequestFee) external onlyAdmin {
verificationRequestFee = _verificationRequestFee;
}
function setVerificationRequestDeadline(uint _verificationRequestDeadline) external onlyAdmin {
verificationRequestDeadline = _verificationRequestDeadline;
}
// **** MISCELLANEOUS ****
function extendLiquidityLock(address _holderAddress, address _pairAddress, uint _liquidityLockTime) external {
require(msg.sender == _holderAddress, "FilterManager: NOT_LIQUIDITY_HOLDER");
setLiquidityUnlockTime(_holderAddress, _pairAddress, liquidityUnlockTimes[_holderAddress][_pairAddress] + _liquidityLockTime);
}
}