/
GovernanceFacet.sol
118 lines (101 loc) · 4.26 KB
/
GovernanceFacet.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
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "../interfaces/IGovernance.sol";
import "../libraries/LibDiamond.sol";
import "../libraries/LibGovernance.sol";
import "../libraries/LibFeeCalculator.sol";
import "../libraries/LibRouter.sol";
contract GovernanceFacet is IGovernance {
using Counters for Counters.Counter;
using SafeERC20 for IERC20;
function initGovernance(
address[] memory _members,
uint256 _percentage,
uint256 _precision
) external override {
LibGovernance.Storage storage gs = LibGovernance.governanceStorage();
require(!gs.initialized, "GovernanceFacet: already initialized");
require(
_members.length > 0,
"GovernanceFacet: Member list must contain at least 1 element"
);
require(_precision != 0, "GovernanceFacet: precision must not be zero");
require(
_percentage < _precision,
"GovernanceFacet: percentage must be less than precision"
);
gs.percentage = _percentage;
gs.precision = _precision;
gs.initialized = true;
for (uint256 i = 0; i < _members.length; i++) {
LibGovernance.updateMember(_members[i], true);
emit MemberUpdated(_members[i], true);
}
}
/// @return The current admin
function admin() external view override returns (address) {
return LibGovernance.admin();
}
/// @return The current percentage for minimum amount of members signatures
function membersPercentage() external view override returns (uint256) {
return LibGovernance.percentage();
}
/// @return The current precision for minimum amount of members signatures
function membersPrecision() external view override returns (uint256) {
return LibGovernance.precision();
}
/// @notice Updates the admin address
/// @param _newAdmin The address of the new admin
function updateAdmin(address _newAdmin) external override {
LibDiamond.enforceIsContractOwner();
address previousAdmin = LibGovernance.admin();
LibGovernance.updateAdmin(_newAdmin);
emit AdminUpdated(previousAdmin, _newAdmin);
}
/// @notice Updates the percentage of minimum amount of members signatures required
/// @param _percentage The new percentage
function updateMembersPercentage(uint256 _percentage) external override {
LibDiamond.enforceIsContractOwner();
LibGovernance.updateMembersPercentage(_percentage);
emit MembersPercentageUpdated(_percentage);
}
/// @notice Adds/removes a member account
/// @param _account The account to be modified
/// @param _status Whether the account will be set as member or not
function updateMember(address _account, bool _status) external override {
LibDiamond.enforceIsContractOwner();
if (_status) {
for (uint256 i = 0; i < LibRouter.nativeTokensCount(); i++) {
LibFeeCalculator.addNewMember(
_account,
LibRouter.nativeTokenAt(i)
);
}
} else {
for (uint256 i = 0; i < LibRouter.nativeTokensCount(); i++) {
address token = LibRouter.nativeTokenAt(i);
uint256 claimableFees = LibFeeCalculator.claimReward(
_account,
token
);
IERC20(token).safeTransfer(_account, claimableFees);
}
}
LibGovernance.updateMember(_account, _status);
emit MemberUpdated(_account, _status);
}
/// @return True/false depending on whether a given address is member or not
function isMember(address _member) external view override returns (bool) {
return LibGovernance.isMember(_member);
}
/// @return The count of members in the members set
function membersCount() external view override returns (uint256) {
return LibGovernance.membersCount();
}
/// @return The address of a member at a given index
function memberAt(uint256 _index) external view override returns (address) {
return LibGovernance.memberAt(_index);
}
}