Skip to content

Commit

Permalink
chore: refactor to avoid stack too deep
Browse files Browse the repository at this point in the history
  • Loading branch information
stevennevins committed Feb 3, 2025
1 parent 2ddc38c commit 491ec94
Showing 1 changed file with 148 additions and 118 deletions.
266 changes: 148 additions & 118 deletions test/utils/CoreDeployLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -125,55 +125,117 @@ library CoreDeploymentLib {
address proxyAdmin,
DeploymentConfigData memory configData
) internal returns (DeploymentData memory result) {
// Deploy proxy contracts
result.delegationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.avsDirectory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.strategyManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.eigenPodManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.allocationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.eigenPodBeacon = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.pauserRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.strategyFactory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.rewardsCoordinator = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
result.permissionController = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);

// Deploy implementation contracts
result = deployEmptyProxies(proxyAdmin);

deployAndConfigureCore(result, configData);
deployAndConfigurePods(result, configData);
deployAndConfigureStrategies(result, configData);
deployAndConfigureRewards(result, configData);

return result;
}

function deployEmptyProxies(
address proxyAdmin
) internal returns (DeploymentData memory proxies) {
proxies.delegationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.avsDirectory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.strategyManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.eigenPodManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.allocationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.eigenPodBeacon = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.pauserRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.strategyFactory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.rewardsCoordinator = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
proxies.permissionController = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin);
return proxies;
}

function deployAndConfigureCore(
DeploymentData memory deployments,
DeploymentConfigData memory config
) internal {
// Deploy core implementations
address permissionControllerImpl = address(new PermissionController());

address strategyManagerImpl = address(
new StrategyManager(
IDelegationManager(result.delegationManager), IPauserRegistry(result.pauserRegistry)
IDelegationManager(deployments.delegationManager),
IPauserRegistry(deployments.pauserRegistry)
)
);

address allocationManagerImpl = address(
new AllocationManager(
IDelegationManager(result.delegationManager),
IPauserRegistry(result.pauserRegistry),
IPermissionController(result.permissionController),
configData.allocationManager.deallocationDelay,
configData.allocationManager.allocationConfigurationDelay
IDelegationManager(deployments.delegationManager),
IPauserRegistry(deployments.pauserRegistry),
IPermissionController(deployments.permissionController),
config.allocationManager.deallocationDelay,
config.allocationManager.allocationConfigurationDelay
)
);

address delegationManagerImpl = address(
new DelegationManager(
IStrategyManager(result.strategyManager),
IEigenPodManager(result.eigenPodManager),
IAllocationManager(result.allocationManager),
IPauserRegistry(result.pauserRegistry),
IPermissionController(result.permissionController),
configData.delegationManager.minWithdrawalDelayBlocks
IStrategyManager(deployments.strategyManager),
IEigenPodManager(deployments.eigenPodManager),
IAllocationManager(deployments.allocationManager),
IPauserRegistry(deployments.pauserRegistry),
IPermissionController(deployments.permissionController),
config.delegationManager.minWithdrawalDelayBlocks
)
);

address avsDirectoryImpl = address(
new AVSDirectory(
IDelegationManager(result.delegationManager), IPauserRegistry(result.pauserRegistry)
IDelegationManager(deployments.delegationManager),
IPauserRegistry(deployments.pauserRegistry)
)
);

address ethPOSDeposit = configData.ethPOSDeposit.ethPOSDepositAddress;
// Initialize core contracts
UpgradeableProxyLib.upgrade(deployments.permissionController, permissionControllerImpl);

bytes memory upgradeCall = abi.encodeCall(
StrategyManager.initialize,
(
config.strategyManager.initialOwner,
config.strategyManager.initialStrategyWhitelister,
config.strategyManager.initPausedStatus
)
);
UpgradeableProxyLib.upgradeAndCall(
deployments.strategyManager, strategyManagerImpl, upgradeCall
);

upgradeCall = abi.encodeCall(
DelegationManager.initialize,
(config.delegationManager.initialOwner, config.delegationManager.initPausedStatus)
);
UpgradeableProxyLib.upgradeAndCall(
deployments.delegationManager, delegationManagerImpl, upgradeCall
);

upgradeCall = abi.encodeCall(
AllocationManager.initialize,
(config.allocationManager.initialOwner, config.allocationManager.initPausedStatus)
);
UpgradeableProxyLib.upgradeAndCall(
deployments.allocationManager, allocationManagerImpl, upgradeCall
);

upgradeCall = abi.encodeCall(
AVSDirectory.initialize,
(config.avsDirectory.initialOwner, config.avsDirectory.initPausedStatus)
);
UpgradeableProxyLib.upgradeAndCall(deployments.avsDirectory, avsDirectoryImpl, upgradeCall);
}

function deployAndConfigurePods(
DeploymentData memory deployments,
DeploymentConfigData memory config
) internal {
address ethPOSDeposit = config.ethPOSDeposit.ethPOSDepositAddress;
if (ethPOSDeposit == address(0)) {
if (block.chainid == 1) {
ethPOSDeposit = 0x00000000219ab540356cBB839Cbe05303d7705Fa;
Expand All @@ -182,134 +244,102 @@ library CoreDeploymentLib {
}
}

address eigenPodManagerImpl = address(
new EigenPodManager(
IETHPOSDeposit(ethPOSDeposit),
IBeacon(result.eigenPodBeacon),
IDelegationManager(result.delegationManager),
IPauserRegistry(result.pauserRegistry)
)
);

address eigenPodImpl = address(
new EigenPod(
IETHPOSDeposit(ethPOSDeposit),
IEigenPodManager(result.eigenPodManager),
configData.eigenPod.genesisTimestamp == 0
IEigenPodManager(deployments.eigenPodManager),
config.eigenPod.genesisTimestamp == 0
? uint64(block.timestamp)
: configData.eigenPod.genesisTimestamp // Use configured timestamp or current timestamp as fallback
: config.eigenPod.genesisTimestamp
)
);

address eigenPodBeaconImpl = address(new UpgradeableBeacon(eigenPodImpl));
UpgradeableProxyLib.upgrade(deployments.eigenPodBeacon, eigenPodBeaconImpl);

address baseStrategyImpl = address(
new StrategyBase(
IStrategyManager(result.strategyManager), IPauserRegistry(result.pauserRegistry)
address eigenPodManagerImpl = address(
new EigenPodManager(
IETHPOSDeposit(ethPOSDeposit),
IBeacon(deployments.eigenPodBeacon),
IDelegationManager(deployments.delegationManager),
IPauserRegistry(deployments.pauserRegistry)
)
);

address strategyFactoryImpl = address(
new StrategyFactory(
IStrategyManager(result.strategyManager), IPauserRegistry(result.pauserRegistry)
)
bytes memory upgradeCall = abi.encodeCall(
EigenPodManager.initialize,
(config.eigenPodManager.initialOwner, config.eigenPodManager.initPausedStatus)
);

address rewardsCoordinatorImpl = address(
new RewardsCoordinator(
IDelegationManager(result.delegationManager),
IStrategyManager(result.strategyManager),
IAllocationManager(result.allocationManager),
IPauserRegistry(result.pauserRegistry),
IPermissionController(result.permissionController),
configData.rewardsCoordinator.calculationIntervalSeconds,
configData.rewardsCoordinator.maxRewardsDuration,
configData.rewardsCoordinator.maxRetroactiveLength,
configData.rewardsCoordinator.maxFutureLength,
configData.rewardsCoordinator.genesisRewardsTimestamp
)
UpgradeableProxyLib.upgradeAndCall(
deployments.eigenPodManager, eigenPodManagerImpl, upgradeCall
);
}

result.strategyBeacon = address(new UpgradeableBeacon(baseStrategyImpl));

// Upgrade contracts
UpgradeableProxyLib.upgrade(result.eigenPodBeacon, eigenPodBeaconImpl);

UpgradeableProxyLib.upgrade(result.permissionController, permissionControllerImpl);

bytes memory upgradeCall;

upgradeCall = abi.encodeCall(
StrategyManager.initialize,
(
configData.strategyManager.initialOwner,
configData.strategyManager.initialStrategyWhitelister,
configData.strategyManager.initPausedStatus
function deployAndConfigureStrategies(
DeploymentData memory deployments,
DeploymentConfigData memory config
) internal {
address baseStrategyImpl = address(
new StrategyBase(
IStrategyManager(deployments.strategyManager),
IPauserRegistry(deployments.pauserRegistry)
)
);

UpgradeableProxyLib.upgradeAndCall(result.strategyManager, strategyManagerImpl, upgradeCall);
deployments.strategyBeacon = address(new UpgradeableBeacon(baseStrategyImpl));

upgradeCall = abi.encodeCall(
DelegationManager.initialize,
(
configData.delegationManager.initialOwner,
configData.delegationManager.initPausedStatus
address strategyFactoryImpl = address(
new StrategyFactory(
IStrategyManager(deployments.strategyManager),
IPauserRegistry(deployments.pauserRegistry)
)
);
UpgradeableProxyLib.upgradeAndCall(
result.delegationManager, delegationManagerImpl, upgradeCall
);

upgradeCall = abi.encodeCall(
AllocationManager.initialize,
bytes memory upgradeCall = abi.encodeCall(
StrategyFactory.initialize,
(
configData.allocationManager.initialOwner,
configData.allocationManager.initPausedStatus
config.strategyFactory.initialOwner,
config.strategyFactory.initPausedStatus,
IBeacon(deployments.strategyBeacon)
)
);
UpgradeableProxyLib.upgradeAndCall(
result.allocationManager, allocationManagerImpl, upgradeCall
);

upgradeCall = abi.encodeCall(
AVSDirectory.initialize,
(configData.avsDirectory.initialOwner, configData.avsDirectory.initPausedStatus)
);

UpgradeableProxyLib.upgradeAndCall(result.avsDirectory, avsDirectoryImpl, upgradeCall);

upgradeCall = abi.encodeCall(
EigenPodManager.initialize,
(configData.eigenPodManager.initialOwner, configData.eigenPodManager.initPausedStatus)
deployments.strategyFactory, strategyFactoryImpl, upgradeCall
);
UpgradeableProxyLib.upgradeAndCall(result.eigenPodManager, eigenPodManagerImpl, upgradeCall);
}

upgradeCall = abi.encodeCall(
StrategyFactory.initialize,
(
configData.strategyFactory.initialOwner,
configData.strategyFactory.initPausedStatus,
IBeacon(result.strategyBeacon)
function deployAndConfigureRewards(
DeploymentData memory deployments,
DeploymentConfigData memory config
) internal {
address rewardsCoordinatorImpl = address(
new RewardsCoordinator(
IDelegationManager(deployments.delegationManager),
IStrategyManager(deployments.strategyManager),
IAllocationManager(deployments.allocationManager),
IPauserRegistry(deployments.pauserRegistry),
IPermissionController(deployments.permissionController),
config.rewardsCoordinator.calculationIntervalSeconds,
config.rewardsCoordinator.maxRewardsDuration,
config.rewardsCoordinator.maxRetroactiveLength,
config.rewardsCoordinator.maxFutureLength,
config.rewardsCoordinator.genesisRewardsTimestamp
)
);
UpgradeableProxyLib.upgradeAndCall(result.strategyFactory, strategyFactoryImpl, upgradeCall);

upgradeCall = abi.encodeCall(
bytes memory upgradeCall = abi.encodeCall(
RewardsCoordinator.initialize,
(
configData.rewardsCoordinator.initialOwner,
configData.rewardsCoordinator.initPausedStatus,
configData.rewardsCoordinator.rewardsUpdater,
configData.rewardsCoordinator.activationDelay,
configData.rewardsCoordinator.defaultSplitBips
config.rewardsCoordinator.initialOwner,
config.rewardsCoordinator.initPausedStatus,
config.rewardsCoordinator.rewardsUpdater,
config.rewardsCoordinator.activationDelay,
config.rewardsCoordinator.defaultSplitBips
)
);

UpgradeableProxyLib.upgradeAndCall(
result.rewardsCoordinator, rewardsCoordinatorImpl, upgradeCall
deployments.rewardsCoordinator, rewardsCoordinatorImpl, upgradeCall
);

return result;
}
}

0 comments on commit 491ec94

Please sign in to comment.