Skip to content

Commit 4338aba

Browse files
authored
feat: Verifiable Deployment Calldata script (#1415)
1 parent 74160cc commit 4338aba

File tree

4 files changed

+421
-138
lines changed

4 files changed

+421
-138
lines changed

contracts/script/deploy/verifiable/DeployVerifiable.sol renamed to contracts/script/deploy/verifiable/DeployVerifiable.s.sol

Lines changed: 51 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import {VersionedBlobParams} from "src/interfaces/IEigenDAStructs.sol";
3434
import {MockStakeRegistry} from "./mocks/MockStakeRegistry.sol";
3535
import {MockRegistryCoordinator} from "./mocks/MockRegistryCoordinator.sol";
3636

37+
import {BeforeVerifiableDeploymentInitialization} from "./test/BeforeVerifiableDeploymentInitialization.s.sol";
38+
3739
import {
3840
DeploymentInitializer,
3941
ImmutableInitParams,
@@ -44,15 +46,16 @@ import {
4446
CalldataInitParams,
4547
CalldataRegistryCoordinatorParams,
4648
CalldataThresholdRegistryParams,
47-
CalldataServiceManagerParams
49+
CalldataServiceManagerParams,
50+
InitParamsLib
4851
} from "./DeploymentInitializer.sol";
4952

5053
import "forge-std/Script.sol";
5154
import "forge-std/StdJson.sol";
55+
import {console2} from "forge-std/console2.sol";
5256

5357
contract DeployVerifiable is Script {
54-
// The intended owner of all the contracts after the full deployment process is completed.
55-
address initialOwner;
58+
using InitParamsLib for string;
5659

5760
// All proxies and implementations to upgrade them to, namespaced in structs.
5861
ProxyAdmin proxyAdmin;
@@ -62,15 +65,6 @@ contract DeployVerifiable is Script {
6265
// Contracts deployed without a proxy
6366
IPauserRegistry pauserRegistry;
6467

65-
// Configuration parameters for construction of implementations
66-
address rewardsCoordinator;
67-
address avsDirectory;
68-
address delegationManager;
69-
address churnApprover;
70-
address ejector;
71-
72-
uint256 initialPausedStatus;
73-
7468
// Inert implementation contracts used as initial implementations before the proxies are initialized
7569
address emptyContract;
7670
address mockStakeRegistry;
@@ -80,32 +74,17 @@ contract DeployVerifiable is Script {
8074
DeploymentInitializer deploymentInitializer;
8175

8276
// Script config
83-
string configData;
84-
85-
/// @dev override this if you don't want to use the environment to get the config path
86-
function _configPath() internal view virtual returns (string memory) {
87-
return vm.envString("DEPLOY_CONFIG_PATH");
88-
}
77+
string cfg;
8978

9079
function run() public {
9180
// Read JSON config
92-
configData = vm.readFile(_configPath());
93-
initialOwner = stdJson.readAddress(configData, ".initialOwner");
94-
rewardsCoordinator = stdJson.readAddress(configData, ".initParams.shared.rewardsCoordinator");
95-
avsDirectory = stdJson.readAddress(configData, ".initParams.shared.avsDirectory");
96-
delegationManager = stdJson.readAddress(configData, ".initParams.shared.delegationManager");
97-
initialPausedStatus = stdJson.readUint(configData, ".initParams.shared.initialPausedStatus");
81+
_initConfig();
9882

9983
vm.startBroadcast();
10084
proxyAdmin = new ProxyAdmin();
10185
emptyContract = address(new EmptyContract());
102-
mockStakeRegistry = address(new MockStakeRegistry(IDelegationManager(delegationManager)));
103-
pauserRegistry = IPauserRegistry(
104-
new PauserRegistry(
105-
stdJson.readAddressArray(configData, ".initParams.core.pauserRegistry.pausers"),
106-
stdJson.readAddress(configData, ".initParams.core.pauserRegistry.unpauser")
107-
)
108-
);
86+
mockStakeRegistry = address(new MockStakeRegistry(IDelegationManager(cfg.delegationManager())));
87+
pauserRegistry = IPauserRegistry(new PauserRegistry(cfg.pausers(), cfg.unpauser()));
10988

11089
_deployInertProxies();
11190
_deployImplementations();
@@ -116,24 +95,50 @@ contract DeployVerifiable is Script {
11695
// Transfer ownership of proxy admin to deployment initializer
11796
proxyAdmin.transferOwnership(address(deploymentInitializer));
11897

98+
_logs();
99+
119100
vm.stopBroadcast();
120101

121-
_doTests(configData);
102+
_doTests();
103+
}
104+
105+
/// @dev override this if you don't want to use the environment to get the config path
106+
function _initConfig() internal virtual {
107+
cfg = vm.readFile(vm.envString("DEPLOY_CONFIG_PATH"));
122108
}
123109

124-
function _doTests(string memory cfg) internal {
125-
vm.startPrank(initialOwner);
126-
CalldataInitParams memory params = CalldataInitParamsLib.getCalldataInitParams(cfg);
110+
function _logs() internal virtual {
111+
console2.log("Deployment addresses: ");
112+
console2.log("Deployment Initializer: ", address(deploymentInitializer));
113+
console2.log("Empty Contract Implementation", emptyContract);
114+
console2.log("Mock Stake Registry Implementation", mockStakeRegistry);
115+
console2.log("Mock Registry Coordinator Implementation", mockRegistryCoordinator);
116+
117+
console2.log(
118+
"\n\nAll other relevant deployment addresses should be queried from the DeploymentInitializer contract."
119+
);
120+
}
121+
122+
/// @dev This function does the same tests that a verifier of the deployment should be doing after the deployment.
123+
function _doTests() internal {
124+
BeforeVerifiableDeploymentInitialization beforeTest = new BeforeVerifiableDeploymentInitialization();
125+
beforeTest.doBeforeInitializationTests(
126+
cfg, deploymentInitializer, emptyContract, mockStakeRegistry, mockRegistryCoordinator
127+
);
128+
129+
vm.startPrank(cfg.initialOwner());
130+
CalldataInitParams memory params = InitParamsLib.calldataInitParams(cfg);
127131
deploymentInitializer.initializeDeployment(params);
128132

129133
// TODO: Add more tests
130134

131135
vm.stopPrank();
132136
}
137+
133138
function _deployInertProxies() internal virtual {
134139
proxyAdmin = new ProxyAdmin();
135140
emptyContract = address(new EmptyContract());
136-
mockStakeRegistry = address(new MockStakeRegistry(IDelegationManager(delegationManager)));
141+
mockStakeRegistry = address(new MockStakeRegistry(IDelegationManager(cfg.delegationManager())));
137142

138143
// Deploy empty contracts to get addresses
139144
proxies.indexRegistry = address(new TransparentUpgradeableProxy(emptyContract, address(proxyAdmin), ""));
@@ -158,7 +163,9 @@ contract DeployVerifiable is Script {
158163
function _deployImplementations() internal virtual {
159164
implementations.indexRegistry = address(new IndexRegistry(IRegistryCoordinator(proxies.registryCoordinator)));
160165
implementations.stakeRegistry = address(
161-
new StakeRegistry(IRegistryCoordinator(proxies.registryCoordinator), IDelegationManager(delegationManager))
166+
new StakeRegistry(
167+
IRegistryCoordinator(proxies.registryCoordinator), IDelegationManager(cfg.delegationManager())
168+
)
162169
);
163170
implementations.socketRegistry = address(new SocketRegistry(IRegistryCoordinator(proxies.registryCoordinator)));
164171
implementations.blsApkRegistry = address(new BLSApkRegistry(IRegistryCoordinator(proxies.registryCoordinator)));
@@ -177,8 +184,8 @@ contract DeployVerifiable is Script {
177184
implementations.disperserRegistry = address(new EigenDADisperserRegistry());
178185
implementations.serviceManager = address(
179186
new EigenDAServiceManager(
180-
IAVSDirectory(avsDirectory),
181-
IRewardsCoordinator(rewardsCoordinator),
187+
IAVSDirectory(cfg.avsDirectory()),
188+
IRewardsCoordinator(cfg.rewardsCoordinator()),
182189
IRegistryCoordinator(proxies.registryCoordinator),
183190
IStakeRegistry(proxies.stakeRegistry),
184191
IEigenDAThresholdRegistry(proxies.thresholdRegistry),
@@ -190,110 +197,16 @@ contract DeployVerifiable is Script {
190197
}
191198

192199
function _immutableInitParams() internal view returns (ImmutableInitParams memory) {
193-
ImmutableRegistryCoordinatorParams memory registryCoordinatorParams = ImmutableRegistryCoordinatorParams({
194-
churnApprover: stdJson.readAddress(configData, ".initParams.middleware.registryCoordinator.churnApprover"),
195-
ejector: stdJson.readAddress(configData, ".initParams.middleware.registryCoordinator.ejector")
196-
});
197-
ImmutablePaymentVaultParams memory paymentVaultParams = ImmutablePaymentVaultParams({
198-
minNumSymbols: uint64(stdJson.readUint(configData, ".initParams.eigenDA.paymentVault.minNumSymbols")),
199-
pricePerSymbol: uint64(stdJson.readUint(configData, ".initParams.eigenDA.paymentVault.pricePerSymbol")),
200-
priceUpdateCooldown: uint64(
201-
stdJson.readUint(configData, ".initParams.eigenDA.paymentVault.priceUpdateCooldown")
202-
),
203-
globalSymbolsPerPeriod: uint64(
204-
stdJson.readUint(configData, ".initParams.eigenDA.paymentVault.globalSymbolsPerPeriod")
205-
),
206-
reservationPeriodInterval: uint64(
207-
stdJson.readUint(configData, ".initParams.eigenDA.paymentVault.reservationPeriodInterval")
208-
),
209-
globalRatePeriodInterval: uint64(
210-
stdJson.readUint(configData, ".initParams.eigenDA.paymentVault.globalRatePeriodInterval")
211-
)
212-
});
213-
ImmutableServiceManagerParams memory serviceManagerParams = ImmutableServiceManagerParams({
214-
rewardsInitiator: stdJson.readAddress(configData, ".initParams.eigenDA.serviceManager.rewardsInitiator")
215-
});
216-
217200
return ImmutableInitParams({
218201
proxyAdmin: proxyAdmin,
219-
initialOwner: initialOwner,
202+
initialOwner: cfg.initialOwner(),
220203
pauserRegistry: pauserRegistry,
221-
initialPausedStatus: initialPausedStatus,
204+
initialPausedStatus: cfg.initialPausedStatus(),
222205
proxies: proxies,
223206
implementations: implementations,
224-
registryCoordinatorParams: registryCoordinatorParams,
225-
paymentVaultParams: paymentVaultParams,
226-
serviceManagerParams: serviceManagerParams
227-
});
228-
}
229-
}
230-
231-
library CalldataInitParamsLib {
232-
function operatorSetParams(string memory configData)
233-
internal
234-
pure
235-
returns (IRegistryCoordinator.OperatorSetParam[] memory)
236-
{
237-
bytes memory operatorConfigsRaw =
238-
stdJson.parseRaw(configData, ".initParams.middleware.registryCoordinator.operatorSetParams");
239-
return abi.decode(operatorConfigsRaw, (IRegistryCoordinator.OperatorSetParam[]));
240-
}
241-
242-
function minimumStakes(string memory configData) internal pure returns (uint96[] memory) {
243-
bytes memory stakesConfigsRaw =
244-
stdJson.parseRaw(configData, ".initParams.middleware.registryCoordinator.minimumStakes");
245-
return abi.decode(stakesConfigsRaw, (uint96[]));
246-
}
247-
248-
function strategyParams(string memory configData)
249-
internal
250-
pure
251-
returns (IStakeRegistry.StrategyParams[][] memory)
252-
{
253-
bytes memory strategyConfigsRaw =
254-
stdJson.parseRaw(configData, ".initParams.middleware.registryCoordinator.strategyParams");
255-
return abi.decode(strategyConfigsRaw, (IStakeRegistry.StrategyParams[][]));
256-
}
257-
258-
function quorumAdversaryThresholdPercentages(string memory configData) internal pure returns (bytes memory) {
259-
return
260-
stdJson.readBytes(configData, ".initParams.eigenDA.thresholdRegistry.quorumAdversaryThresholdPercentages");
261-
}
262-
263-
function quorumConfirmationThresholdPercentages(string memory configData) internal pure returns (bytes memory) {
264-
return stdJson.readBytes(
265-
configData, ".initParams.eigenDA.thresholdRegistry.quorumConfirmationThresholdPercentages"
266-
);
267-
}
268-
269-
function quorumNumbersRequired(string memory configData) internal pure returns (bytes memory) {
270-
return stdJson.readBytes(configData, ".initParams.eigenDA.thresholdRegistry.quorumNumbersRequired");
271-
}
272-
273-
function versionedBlobParams(string memory configData) internal pure returns (VersionedBlobParams[] memory) {
274-
bytes memory versionedBlobParamsRaw =
275-
stdJson.parseRaw(configData, ".initParams.eigenDA.thresholdRegistry.versionedBlobParams");
276-
return abi.decode(versionedBlobParamsRaw, (VersionedBlobParams[]));
277-
}
278-
279-
function batchConfirmers(string memory configData) internal pure returns (address[] memory) {
280-
return stdJson.readAddressArray(configData, ".initParams.eigenDA.serviceManager.batchConfirmers");
281-
}
282-
283-
function getCalldataInitParams(string memory configData) internal pure returns (CalldataInitParams memory) {
284-
return CalldataInitParams({
285-
registryCoordinatorParams: CalldataRegistryCoordinatorParams({
286-
operatorSetParams: operatorSetParams(configData),
287-
minimumStakes: minimumStakes(configData),
288-
strategyParams: strategyParams(configData)
289-
}),
290-
thresholdRegistryParams: CalldataThresholdRegistryParams({
291-
quorumAdversaryThresholdPercentages: quorumAdversaryThresholdPercentages(configData),
292-
quorumConfirmationThresholdPercentages: quorumConfirmationThresholdPercentages(configData),
293-
quorumNumbersRequired: quorumNumbersRequired(configData),
294-
versionedBlobParams: versionedBlobParams(configData)
295-
}),
296-
serviceManagerParams: CalldataServiceManagerParams({batchConfirmers: batchConfirmers(configData)})
207+
registryCoordinatorParams: cfg.registryCoordinatorParams(),
208+
paymentVaultParams: cfg.paymentVaultParams(),
209+
serviceManagerParams: cfg.serviceManagerParams()
297210
});
298211
}
299212
}

0 commit comments

Comments
 (0)