Skip to content

Commit eb81921

Browse files
authored
feat: Add upgrade scripts for simulations (SC-891) (#80)
* feat: add first file change * feat: add working upgrade script * feat: update documentation * fix: use controller as a param * fix: update command * fix: update description
1 parent 155f3a6 commit eb81921

File tree

3 files changed

+211
-1
lines changed

3 files changed

+211
-1
lines changed

README.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,68 @@ To run all tests, run the following command:
9999
forge test
100100
```
101101

102+
## Deployments
103+
All commands to deploy:
104+
- Either the full system or just the controller
105+
- To mainnet or base
106+
- For staging or production
107+
108+
Can be found in the Makefile, with the nomenclature `make deploy-<domain>-<env>-<type>`.
109+
110+
Deploy a full ALM system to base production: `make deploy-base-production-full`
111+
Deploy a controller to mainnet production: `make deploy-mainnet-production-controller`
112+
113+
To deploy a full staging environment from scratch, with a new allocation system and all necessary dependencies, run `make deploy-staging-full`.
114+
115+
## Upgrade Simulations
116+
117+
To perform upgrades against forks of mainnet and base for testing/simulation purposes, use the following instructions.
118+
119+
1. Set up two anvil nodes forked against mainnet and base.
120+
```
121+
anvil --fork-url $MAINNET_RPC_URL
122+
```
123+
```
124+
anvil --fork-url $BASE_RPC_URL -p 8546
125+
```
126+
127+
2. Point to local RPCs.
128+
129+
```
130+
export MAINNET_RPC_URL=http://127.0.0.1:8545
131+
export BASE_RPC_URL=http://127.0.0.1:8546
132+
```
133+
134+
3. Upgrade mainnet contracts impersonating as the `SPARK_PROXY`.
135+
136+
```
137+
export SPARK_PROXY=0x3300f198988e4C9C63F75dF86De36421f06af8c4
138+
139+
cast rpc --rpc-url="$MAINNET_RPC_URL" anvil_setBalance $SPARK_PROXY `cast to-wei 1000 | cast to-hex`
140+
cast rpc --rpc-url="$MAINNET_RPC_URL" anvil_impersonateAccount $SPARK_PROXY
141+
142+
ENV=production \
143+
OLD_CONTROLLER=0xb960F71ca3f1f57799F6e14501607f64f9B36F11 \
144+
NEW_CONTROLLER=0x5cf73FDb7057E436A6eEaDFAd27E45E7ab6E431e \
145+
forge script script/Upgrade.s.sol:UpgradeMainnetController --broadcast --unlocked --sender $SPARK_PROXY
146+
```
147+
148+
4. Upgrade base contracts impersonating as the `SPARK_EXEUCTOR`.
149+
150+
```
151+
export SPARK_EXECUTOR=0xF93B7122450A50AF3e5A76E1d546e95Ac1d0F579
152+
153+
cast rpc --rpc-url="$BASE_RPC_URL" anvil_setBalance $SPARK_EXECUTOR `cast to-wei 1000 | cast to-hex`
154+
cast rpc --rpc-url="$BASE_RPC_URL" anvil_impersonateAccount $SPARK_EXECUTOR
155+
156+
CHAIN=base \
157+
ENV=production \
158+
OLD_CONTROLLER=0xc07f705D0C0e9F8C79C5fbb748aC1246BBCC37Ba \
159+
NEW_CONTROLLER=0x5F032555353f3A1D16aA6A4ADE0B35b369da0440 \
160+
forge script script/Upgrade.s.sol:UpgradeForeignController --broadcast --unlocked --sender $SPARK_EXECUTOR
161+
```
162+
163+
102164
***
103165
*The IP in this repository was assigned to Mars SPC Limited in respect of the MarsOne SP*
104166

script/Upgrade.s.sol

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
// SPDX-License-Identifier: AGPL-3.0
2+
pragma solidity ^0.8.0;
3+
4+
import { ScriptTools } from "dss-test/ScriptTools.sol";
5+
6+
import "forge-std/Script.sol";
7+
8+
import { CCTPForwarder } from "xchain-helpers/forwarders/CCTPForwarder.sol";
9+
10+
import { ControllerInstance } from "../deploy/ControllerInstance.sol";
11+
import { ForeignControllerInit as ForeignInit } from "../deploy/ForeignControllerInit.sol";
12+
import { MainnetControllerInit as MainnetInit } from "../deploy/MainnetControllerInit.sol";
13+
14+
contract UpgradeMainnetController is Script {
15+
16+
using stdJson for string;
17+
using ScriptTools for string;
18+
19+
function run() external {
20+
vm.setEnv("FOUNDRY_ROOT_CHAINID", "1");
21+
vm.setEnv("FOUNDRY_EXPORTS_OVERWRITE_LATEST", "true");
22+
23+
vm.createSelectFork(getChain("mainnet").rpcUrl);
24+
25+
console.log("Upgrading mainnet controller...");
26+
27+
string memory fileSlug = string(abi.encodePacked("mainnet-", vm.envString("ENV")));
28+
29+
address newController = vm.envAddress("NEW_CONTROLLER");
30+
address oldController = vm.envAddress("OLD_CONTROLLER");
31+
32+
vm.startBroadcast();
33+
34+
string memory inputConfig = ScriptTools.readInput(fileSlug);
35+
36+
ControllerInstance memory controllerInst = ControllerInstance({
37+
almProxy : inputConfig.readAddress(".almProxy"),
38+
controller : newController,
39+
rateLimits : inputConfig.readAddress(".rateLimits")
40+
});
41+
42+
MainnetInit.ConfigAddressParams memory configAddresses = MainnetInit.ConfigAddressParams({
43+
freezer : inputConfig.readAddress(".freezer"),
44+
relayer : inputConfig.readAddress(".relayer"),
45+
oldController : oldController
46+
});
47+
48+
MainnetInit.CheckAddressParams memory checkAddresses = MainnetInit.CheckAddressParams({
49+
admin : inputConfig.readAddress(".admin"),
50+
proxy : inputConfig.readAddress(".almProxy"),
51+
rateLimits : inputConfig.readAddress(".rateLimits"),
52+
vault : inputConfig.readAddress(".allocatorVault"),
53+
psm : inputConfig.readAddress(".psm"),
54+
daiUsds : inputConfig.readAddress(".daiUsds"),
55+
cctp : inputConfig.readAddress(".cctpTokenMessenger")
56+
});
57+
58+
MainnetInit.MintRecipient[] memory mintRecipients = new MainnetInit.MintRecipient[](1);
59+
60+
string memory baseInputConfig = ScriptTools.readInput(string(abi.encodePacked("base-", vm.envString("ENV"))));
61+
62+
address baseAlmProxy = baseInputConfig.readAddress(".almProxy");
63+
64+
mintRecipients[0] = MainnetInit.MintRecipient({
65+
domain : CCTPForwarder.DOMAIN_ID_CIRCLE_BASE,
66+
mintRecipient : bytes32(uint256(uint160(baseAlmProxy)))
67+
});
68+
69+
MainnetInit.upgradeController(controllerInst, configAddresses, checkAddresses, mintRecipients);
70+
71+
vm.stopBroadcast();
72+
73+
console.log("ALMProxy updated at ", controllerInst.almProxy);
74+
console.log("RateLimits upgraded at ", controllerInst.rateLimits);
75+
console.log("Controller upgraded at ", newController);
76+
console.log("Old Controller deprecated at", oldController);
77+
}
78+
79+
}
80+
81+
contract UpgradeForeignController is Script {
82+
83+
using stdJson for string;
84+
using ScriptTools for string;
85+
86+
function run() external {
87+
vm.setEnv("FOUNDRY_ROOT_CHAINID", "1");
88+
vm.setEnv("FOUNDRY_EXPORTS_OVERWRITE_LATEST", "true");
89+
90+
string memory chainName = vm.envString("CHAIN");
91+
string memory fileSlug = string(abi.encodePacked(chainName, "-", vm.envString("ENV")));
92+
93+
address newController = vm.envAddress("NEW_CONTROLLER");
94+
address oldController = vm.envAddress("OLD_CONTROLLER");
95+
96+
vm.createSelectFork(getChain(chainName).rpcUrl);
97+
98+
console.log(string(abi.encodePacked("Upgrading ", chainName, " controller...")));
99+
100+
vm.startBroadcast();
101+
102+
string memory inputConfig = ScriptTools.readInput(fileSlug);
103+
104+
ControllerInstance memory controllerInst = ControllerInstance({
105+
almProxy : inputConfig.readAddress(".almProxy"),
106+
controller : newController,
107+
rateLimits : inputConfig.readAddress(".rateLimits")
108+
});
109+
110+
ForeignInit.ConfigAddressParams memory configAddresses = ForeignInit.ConfigAddressParams({
111+
freezer : inputConfig.readAddress(".freezer"),
112+
relayer : inputConfig.readAddress(".relayer"),
113+
oldController : oldController
114+
});
115+
116+
ForeignInit.CheckAddressParams memory checkAddresses = ForeignInit.CheckAddressParams({
117+
admin : inputConfig.readAddress(".admin"),
118+
psm : inputConfig.readAddress(".psm"),
119+
cctp : inputConfig.readAddress(".cctpTokenMessenger"),
120+
usdc : inputConfig.readAddress(".usdc"),
121+
susds : inputConfig.readAddress(".susds"),
122+
usds : inputConfig.readAddress(".usds")
123+
});
124+
125+
ForeignInit.MintRecipient[] memory mintRecipients = new ForeignInit.MintRecipient[](1);
126+
127+
string memory mainnetInputConfig = ScriptTools.readInput(string(abi.encodePacked("mainnet-", vm.envString("ENV"))));
128+
129+
address mainnetAlmProxy = mainnetInputConfig.readAddress(".almProxy");
130+
131+
mintRecipients[0] = ForeignInit.MintRecipient({
132+
domain : CCTPForwarder.DOMAIN_ID_CIRCLE_ETHEREUM,
133+
mintRecipient : bytes32(uint256(uint160(mainnetAlmProxy)))
134+
});
135+
136+
ForeignInit.upgradeController(controllerInst, configAddresses, checkAddresses, mintRecipients);
137+
138+
vm.stopBroadcast();
139+
140+
console.log("ALMProxy updated at ", controllerInst.almProxy);
141+
console.log("RateLimits upgraded at ", controllerInst.rateLimits);
142+
console.log("Controller upgraded at ", newController);
143+
console.log("Old controller deprecated at", oldController);
144+
}
145+
146+
}

script/input/1/base-production.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@
66
"rateLimits": "0x983eC82E45C61a42FDDA7B3c43B8C767004c8A74",
77
"relayer": "0x8a25A24EDE9482C4Fc0738F99611BE58F1c839AB",
88
"freezer": "0x90D8c80C028B4C09C0d8dcAab9bbB057F0513431",
9-
"usdc": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
9+
"usdc": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
10+
"usds": "0x820C137fa70C8691f0e44Dc420a5e53c168921Dc",
11+
"susds": "0x5875eEE11Cf8398102FdAd704C9E96607675467a"
1012
}

0 commit comments

Comments
 (0)