-
Notifications
You must be signed in to change notification settings - Fork 1
/
L2Governor.sol
174 lines (155 loc) · 6.16 KB
/
L2Governor.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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.23;
import { GovernorUpgradeable } from "@openzeppelin-upgradeable/contracts/governance/GovernorUpgradeable.sol";
import { GovernorSettingsUpgradeable } from
"@openzeppelin-upgradeable/contracts/governance/extensions/GovernorSettingsUpgradeable.sol";
import { GovernorCountingSimpleUpgradeable } from
"@openzeppelin-upgradeable/contracts/governance/extensions/GovernorCountingSimpleUpgradeable.sol";
import {
IVotes,
GovernorVotesUpgradeable
} from "@openzeppelin-upgradeable/contracts/governance/extensions/GovernorVotesUpgradeable.sol";
import {
GovernorTimelockControlUpgradeable,
TimelockControllerUpgradeable
} from "@openzeppelin-upgradeable/contracts/governance/extensions/GovernorTimelockControlUpgradeable.sol";
import { Initializable } from "@openzeppelin-upgradeable/contracts/proxy/utils/Initializable.sol";
import { Ownable2StepUpgradeable } from "@openzeppelin-upgradeable/contracts/access/Ownable2StepUpgradeable.sol";
import { UUPSUpgradeable } from "@openzeppelin-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol";
contract L2Governor is
Initializable,
GovernorUpgradeable,
GovernorSettingsUpgradeable,
GovernorCountingSimpleUpgradeable,
GovernorVotesUpgradeable,
GovernorTimelockControlUpgradeable,
Ownable2StepUpgradeable,
UUPSUpgradeable
{
/// @notice Name of the governor contract.
string public constant NAME = "Lisk Governor";
/// @notice Voting delay for proposals (in EIP-6372 clock).
uint48 public constant VOTING_DELAY = 0;
/// @notice Voting period for proposals (in EIP-6372 clock).
uint32 public constant VOTING_PERIOD = 604800; // 7 days
/// @notice Threshold for a proposal to be successful.
uint256 public constant PROPOSAL_THRESHOLD = 300_000 * 10 ** 18; // 300.000 vpLSK
/// @notice Quorum required for a proposal to be successful (number of tokens).
uint256 public constant QUORUM_THRESHOLD = 24_000_000 * 10 ** 18; // 24.000.000 vpLSK
/// @notice Disabling initializers on implementation contract to prevent misuse.
constructor() {
_disableInitializers();
}
/// @notice Setting global params.
/// @param votesToken The address of the token contract used for voting (Voting Power Contract).
/// @param timelockController The address of the TimelockController contract used for time-controlled actions.
/// @param initialOwner The address of the initial owner of the contract.
function initialize(
IVotes votesToken,
TimelockControllerUpgradeable timelockController,
address initialOwner
)
public
initializer
{
require(address(votesToken) != address(0), "L2Governor: Votes token address cannot be 0");
require(address(timelockController) != address(0), "L2Governor: Timelock Controller address cannot be 0");
require(initialOwner != address(0), "L2Governor: initial owner address cannot be 0");
__Governor_init(NAME);
__GovernorSettings_init(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);
__GovernorCountingSimple_init();
__GovernorVotes_init(votesToken);
__GovernorTimelockControl_init(timelockController);
__Ownable2Step_init();
__Ownable_init(initialOwner);
__UUPSUpgradeable_init();
}
function version() public pure virtual override returns (string memory) {
return "1.0.0";
}
/// @notice Returns the quorum required for a proposal to be successful.
function quorum(uint256) public pure virtual override returns (uint256) {
return QUORUM_THRESHOLD;
}
/// @notice Ensures that only the owner can authorize a contract upgrade. It reverts if called by any address other
/// than the contract owner.
/// @param _newImplementation The address of the new contract implementation to which the proxy will be upgraded.
function _authorizeUpgrade(address _newImplementation) internal virtual override onlyOwner { }
// The below functions are overrides required by Solidity.
function state(uint256 proposalId)
public
view
virtual
override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)
returns (ProposalState)
{
return super.state(proposalId);
}
function proposalNeedsQueuing(uint256 proposalId)
public
view
virtual
override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)
returns (bool)
{
return super.proposalNeedsQueuing(proposalId);
}
function proposalThreshold()
public
view
virtual
override(GovernorUpgradeable, GovernorSettingsUpgradeable)
returns (uint256)
{
return super.proposalThreshold();
}
function _queueOperations(
uint256 proposalId,
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
)
internal
virtual
override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)
returns (uint48)
{
return super._queueOperations(proposalId, targets, values, calldatas, descriptionHash);
}
function _executeOperations(
uint256 proposalId,
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
)
internal
virtual
override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)
{
super._executeOperations(proposalId, targets, values, calldatas, descriptionHash);
}
function _cancel(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
)
internal
virtual
override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)
returns (uint256)
{
return super._cancel(targets, values, calldatas, descriptionHash);
}
function _executor()
internal
view
virtual
override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)
returns (address)
{
return super._executor();
}
}