Skip to content

Commit bb848ec

Browse files
committed
squash
1 parent 2ea9800 commit bb848ec

File tree

4 files changed

+272
-1
lines changed

4 files changed

+272
-1
lines changed

script/releases/Env.sol

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ library Env {
100100
return _envAddress("beigenProxyAdmin");
101101
}
102102

103+
function supportsNativeEth() internal view returns (bool) {
104+
return _envBool("supportsNativeEthRestaking");
105+
}
106+
103107
function ethPOS() internal view returns (IETHPOSDeposit) {
104108
return IETHPOSDeposit(_envAddress("ethPOS"));
105109
}
@@ -344,11 +348,15 @@ library Env {
344348
return ZEnvHelpers.state().envU64(key);
345349
}
346350

351+
function _envBool(string memory key) private view returns (bool) {
352+
return ZEnvHelpers.state().envBool(key);
353+
}
354+
347355
function _envU32(string memory key) private view returns (uint32) {
348356
return ZEnvHelpers.state().envU32(key);
349357
}
350358

351359
function _envU16(string memory key) private view returns (uint16) {
352360
return ZEnvHelpers.state().envU16(key);
353361
}
354-
}
362+
}
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.12;
3+
4+
import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
5+
import "../Env.sol";
6+
7+
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
8+
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
9+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
10+
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
11+
import "src/contracts/libraries/BeaconChainProofs.sol";
12+
13+
contract EmptyContract {}
14+
15+
contract DeployFresh is EOADeployer {
16+
using Env for *;
17+
18+
// helper fn
19+
function deployBlankProxy(string memory name) private returns (address) {
20+
return deployProxy({
21+
name: name,
22+
deployedTo: address(new TransparentUpgradeableProxy(
23+
address(new EmptyContract()),
24+
Env.proxyAdmin(),
25+
""
26+
))
27+
});
28+
}
29+
30+
function _runAsEOA() internal override {
31+
vm.startBroadcast();
32+
address[] memory pausers = new address[](3);
33+
pausers[0] = Env.pauserMultisig();
34+
pausers[1] = Env.opsMultisig();
35+
pausers[2] = Env.executorMultisig();
36+
37+
deployBlankProxy({
38+
admin:
39+
});
40+
41+
deployBlankProxy({
42+
name: type(PauserRegistry).name,
43+
implementation: address(new PauserRegistry({
44+
_pausers: pausers,
45+
_unpauser: Env.executorMultisig()
46+
})),
47+
admin: Env.proxyAdmin(),
48+
data: ""
49+
});
50+
51+
deployProxyAndImpl({
52+
name: type(PermissionController).name,
53+
implementation: address(new PermissionController()),
54+
admin: Env.proxyAdmin(),
55+
data: ""
56+
});
57+
58+
deployProxyAndImpl({
59+
name: type(DelegationManager).name,
60+
implementation: address(new DelegationManager({
61+
_strategyManager: Env.proxy.strategyManager(),
62+
_eigenPodManager: Env.proxy.eigenPodManager(),
63+
_allocationManager: Env.proxy.allocationManager(),
64+
_pauserRegistry: Env.impl.pauserRegistry(),
65+
_permissionController: Env.proxy.permissionController(),
66+
_MIN_WITHDRAWAL_DELAY: Env.MIN_WITHDRAWAL_DELAY()
67+
})),
68+
admin: Env.proxyAdmin(),
69+
data: ""
70+
});
71+
72+
deployProxyAndImpl({
73+
name: type(StrategyManager).name,
74+
implementation: address(new StrategyManager({
75+
_delegation: Env.proxy.delegationManager(),
76+
_pauserRegistry: Env.impl.pauserRegistry()
77+
})),
78+
admin: Env.proxyAdmin(),
79+
data: ""
80+
});
81+
82+
deployProxyAndImpl({
83+
name: type(AVSDirectory).name,
84+
implementation: address(new AVSDirectory({
85+
_delegation: Env.proxy.delegationManager(),
86+
_pauserRegistry: Env.impl.pauserRegistry()
87+
})),
88+
admin: Env.proxyAdmin(),
89+
data: ""
90+
});
91+
92+
/// core
93+
deployProxyAndImpl({
94+
name: type(AllocationManager).name,
95+
implementation: address(new AllocationManager({
96+
_delegation: Env.proxy.delegationManager(),
97+
_pauserRegistry: Env.impl.pauserRegistry(),
98+
_permissionController: Env.proxy.permissionController(),
99+
_DEALLOCATION_DELAY: Env.MIN_WITHDRAWAL_DELAY(),
100+
_ALLOCATION_CONFIGURATION_DELAY: Env.ALLOCATION_CONFIGURATION_DELAY()
101+
})),
102+
admin: Env.proxyAdmin(),
103+
data: abi.encodeCall(
104+
AllocationManager.initialize,
105+
(
106+
Env.executorMultisig(), // initialOwner
107+
0 // initialPausedStatus
108+
)
109+
)
110+
});
111+
112+
113+
deployProxyAndImpl({
114+
name: type(RewardsCoordinator).name,
115+
implementation: address(new RewardsCoordinator({
116+
_delegationManager: Env.proxy.delegationManager(),
117+
_strategyManager: Env.proxy.strategyManager(),
118+
_allocationManager: Env.proxy.allocationManager(),
119+
_pauserRegistry: Env.impl.pauserRegistry(),
120+
_permissionController: Env.proxy.permissionController(),
121+
_CALCULATION_INTERVAL_SECONDS: Env.CALCULATION_INTERVAL_SECONDS(),
122+
_MAX_REWARDS_DURATION: Env.MAX_REWARDS_DURATION(),
123+
_MAX_RETROACTIVE_LENGTH: Env.MAX_RETROACTIVE_LENGTH(),
124+
_MAX_FUTURE_LENGTH: Env.MAX_FUTURE_LENGTH(),
125+
_GENESIS_REWARDS_TIMESTAMP: Env.GENESIS_REWARDS_TIMESTAMP()
126+
})),
127+
admin: Env.proxyAdmin(),
128+
data: ""
129+
});
130+
131+
deployProxyAndImpl({
132+
name: type(EigenPodManager).name,
133+
implementation: address(new EigenPodManager({
134+
_ethPOS: Env.ethPOS(),
135+
_eigenPodBeacon: Env.beacon.eigenPod(),
136+
_delegationManager: Env.proxy.delegationManager(),
137+
_pauserRegistry: Env.impl.pauserRegistry()
138+
})),
139+
admin: Env.proxyAdmin(),
140+
data: ""
141+
});
142+
143+
deployProxyAndImpl({
144+
name: type(EigenPod).name,
145+
implementation: address(new EigenPod({
146+
_ethPOS: Env.ethPOS(),
147+
_eigenPodManager: Env.proxy.eigenPodManager(),
148+
_GENESIS_TIME: Env.EIGENPOD_GENESIS_TIME()
149+
})),
150+
admin: Env.proxyAdmin(),
151+
data: ""
152+
});
153+
154+
/// strategies/
155+
deployImpl({
156+
name: type(StrategyBaseTVLLimits).name,
157+
deployedTo: address(new StrategyBaseTVLLimits({
158+
_strategyManager: Env.proxy.strategyManager(),
159+
_pauserRegistry: Env.impl.pauserRegistry()
160+
}))
161+
});
162+
163+
deployImpl({
164+
name: type(EigenStrategy).name,
165+
deployedTo: address(new EigenStrategy({
166+
_strategyManager: Env.proxy.strategyManager(),
167+
_pauserRegistry: Env.impl.pauserRegistry()
168+
}))
169+
});
170+
171+
deployImpl({
172+
name: type(StrategyFactory).name,
173+
deployedTo: address(new StrategyFactory({
174+
_strategyManager: Env.proxy.strategyManager(),
175+
_pauserRegistry: Env.impl.pauserRegistry()
176+
}))
177+
});
178+
179+
// for strategies deployed via factory
180+
deployImpl({
181+
name: type(StrategyBase).name,
182+
deployedTo: address(new StrategyBase({
183+
_strategyManager: Env.proxy.strategyManager(),
184+
_pauserRegistry: Env.impl.pauserRegistry()
185+
}))
186+
});
187+
188+
vm.stopBroadcast();
189+
}
190+
191+
function testScript() public virtual {
192+
_runAsEOA();
193+
}
194+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.12;
3+
4+
import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
5+
import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
6+
import "../Env.sol";
7+
8+
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
9+
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
10+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
11+
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
12+
import "src/contracts/libraries/BeaconChainProofs.sol";
13+
14+
/**
15+
* Purpose: optionally enqueue a transaction that pauses all EigenPod functionality.
16+
*/
17+
contract Pause is MultisigBuilder, EigenPodPausingConstants {
18+
using Env for *;
19+
20+
function _runAsMultisig() prank(Env.pauserMultisig()) internal virtual override {
21+
if (!Env.supportsNativeEth()) {
22+
// disable all eigenpod functionality.
23+
uint mask = (1 << PAUSED_START_CHECKPOINT) |
24+
(1 << PAUSED_NEW_EIGENPODS) |
25+
(1 << PAUSED_WITHDRAW_RESTAKED_ETH) |
26+
(1 << PAUSED_EIGENPODS_VERIFY_CREDENTIALS) |
27+
(1 << PAUSED_NON_PROOF_WITHDRAWALS) |
28+
(1 << PAUSED_START_CHECKPOINT) |
29+
(1 << PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS) |
30+
(1 << PAUSED_VERIFY_STALE_BALANCE);
31+
32+
Env.proxy.eigenPodManager().pause(mask);
33+
}
34+
}
35+
36+
function testScript() public virtual {
37+
execute();
38+
39+
assertTrue(Env.proxy.eigenPodManager().paused(PAUSED_START_CHECKPOINT), "Not paused!");
40+
assertTrue(Env.proxy.eigenPodManager().paused(PAUSED_NEW_EIGENPODS), "Not paused!");
41+
assertTrue(Env.proxy.eigenPodManager().paused(PAUSED_WITHDRAW_RESTAKED_ETH), "Not paused!");
42+
assertTrue(Env.proxy.eigenPodManager().paused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS), "Not paused!");
43+
assertTrue(Env.proxy.eigenPodManager().paused(PAUSED_NON_PROOF_WITHDRAWALS), "Not paused!");
44+
assertTrue(Env.proxy.eigenPodManager().paused(PAUSED_START_CHECKPOINT), "Not paused!");
45+
assertTrue(Env.proxy.eigenPodManager().paused(PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS), "Not paused!");
46+
assertTrue(Env.proxy.eigenPodManager().paused(PAUSED_VERIFY_STALE_BALANCE), "Not paused!");
47+
48+
EigenPod pod = EigenPod(payable(Env.proxy.eigenPodManager().createPod()));
49+
vm.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager");
50+
pod.startCheckpoint(false);
51+
52+
// TODO: more tests.
53+
}
54+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "slashing-genesis",
3+
"from": "0.0.0",
4+
"to": "1.2.0",
5+
"phases": [
6+
{
7+
"type": "eoa",
8+
"filename": "1-deploy-contracts.s.sol"
9+
},
10+
{
11+
"type": "eoa",
12+
"filename": "2-disable-eigenpods-if-needed.s.sol"
13+
}
14+
]
15+
}

0 commit comments

Comments
 (0)