-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathMainnetControllerInit.sol
More file actions
158 lines (117 loc) · 6.6 KB
/
MainnetControllerInit.sol
File metadata and controls
158 lines (117 loc) · 6.6 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
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity >=0.8.0;
import { MainnetController } from "../src/MainnetController.sol";
import { IALMProxy } from "../src/interfaces/IALMProxy.sol";
import { IRateLimits } from "../src/interfaces/IRateLimits.sol";
import { ControllerInstance } from "./ControllerInstance.sol";
interface IBufferLike {
function approve(address, address, uint256) external;
}
interface IPSMLike {
function kiss(address) external;
}
interface IVaultLike {
function buffer() external view returns (address);
function rely(address) external;
}
library MainnetControllerInit {
/**********************************************************************************************/
/*** Structs and constants ***/
/**********************************************************************************************/
struct CheckAddressParams {
address admin;
address proxy;
address rateLimits;
address vault;
address psm;
address daiUsds;
address cctp;
}
struct ConfigAddressParams {
address freezer;
address relayer;
address oldController;
}
struct MintRecipient {
uint32 domain;
bytes32 mintRecipient;
}
bytes32 constant DEFAULT_ADMIN_ROLE = 0x00;
/**********************************************************************************************/
/*** Internal library functions ***/
/**********************************************************************************************/
function initAlmSystem(
address vault,
address usds,
ControllerInstance memory controllerInst,
ConfigAddressParams memory configAddresses,
CheckAddressParams memory checkAddresses,
MintRecipient[] memory mintRecipients
)
internal
{
// Step 1: Do sanity checks outside of the controller
require(IALMProxy(controllerInst.almProxy).hasRole(DEFAULT_ADMIN_ROLE, checkAddresses.admin), "MainnetControllerInit/incorrect-admin-almProxy");
require(IRateLimits(controllerInst.rateLimits).hasRole(DEFAULT_ADMIN_ROLE, checkAddresses.admin), "MainnetControllerInit/incorrect-admin-rateLimits");
// Step 2: Initialize the controller
_initController(controllerInst, configAddresses, checkAddresses, mintRecipients);
// Step 3: Configure almProxy within the allocation system
require(vault == checkAddresses.vault, "MainnetControllerInit/incorrect-vault");
IVaultLike(vault).rely(controllerInst.almProxy);
IBufferLike(IVaultLike(vault).buffer()).approve(usds, controllerInst.almProxy, type(uint256).max);
}
function upgradeController(
ControllerInstance memory controllerInst,
ConfigAddressParams memory configAddresses,
CheckAddressParams memory checkAddresses,
MintRecipient[] memory mintRecipients
)
internal
{
_initController(controllerInst, configAddresses, checkAddresses, mintRecipients);
IALMProxy almProxy = IALMProxy(controllerInst.almProxy);
IRateLimits rateLimits = IRateLimits(controllerInst.rateLimits);
require(configAddresses.oldController != address(0), "MainnetControllerInit/old-controller-zero-address");
require(almProxy.hasRole(almProxy.CONTROLLER(), configAddresses.oldController), "MainnetControllerInit/old-controller-not-almProxy-controller");
require(rateLimits.hasRole(rateLimits.CONTROLLER(), configAddresses.oldController), "MainnetControllerInit/old-controller-not-rateLimits-controller");
almProxy.revokeRole(almProxy.CONTROLLER(), configAddresses.oldController);
rateLimits.revokeRole(rateLimits.CONTROLLER(), configAddresses.oldController);
}
function pauseProxyInitAlmSystem(address psm, address almProxy) internal {
IPSMLike(psm).kiss(almProxy); // To allow using no fee functionality
}
/**********************************************************************************************/
/*** Private helper functions ***/
/**********************************************************************************************/
function _initController(
ControllerInstance memory controllerInst,
ConfigAddressParams memory configAddresses,
CheckAddressParams memory checkAddresses,
MintRecipient[] memory mintRecipients
)
private
{
// Step 1: Perform controller sanity checks
MainnetController newController = MainnetController(controllerInst.controller);
require(newController.hasRole(DEFAULT_ADMIN_ROLE, checkAddresses.admin), "MainnetControllerInit/incorrect-admin-controller");
require(address(newController.proxy()) == controllerInst.almProxy, "MainnetControllerInit/incorrect-almProxy");
require(address(newController.rateLimits()) == controllerInst.rateLimits, "MainnetControllerInit/incorrect-rateLimits");
require(address(newController.vault()) == checkAddresses.vault, "MainnetControllerInit/incorrect-vault");
require(address(newController.psm()) == checkAddresses.psm, "MainnetControllerInit/incorrect-psm");
require(address(newController.daiUsds()) == checkAddresses.daiUsds, "MainnetControllerInit/incorrect-daiUsds");
require(address(newController.cctp()) == checkAddresses.cctp, "MainnetControllerInit/incorrect-cctp");
require(newController.psmTo18ConversionFactor() == 1e12, "MainnetControllerInit/incorrect-psmTo18ConversionFactor");
require(configAddresses.oldController != address(newController), "MainnetControllerInit/old-controller-is-new-controller");
// Step 2: Configure ACL permissions controller, almProxy, and rateLimits
IALMProxy almProxy = IALMProxy(controllerInst.almProxy);
IRateLimits rateLimits = IRateLimits(controllerInst.rateLimits);
newController.grantRole(newController.FREEZER(), configAddresses.freezer);
newController.grantRole(newController.RELAYER(), configAddresses.relayer);
almProxy.grantRole(almProxy.CONTROLLER(), address(newController));
rateLimits.grantRole(rateLimits.CONTROLLER(), address(newController));
// Step 3: Configure the mint recipients on other domains
for (uint256 i = 0; i < mintRecipients.length; i++) {
newController.setMintRecipient(mintRecipients[i].domain, mintRecipients[i].mintRecipient);
}
}
}