Skip to content

Commit

Permalink
feat: deploy script for mainnet rewards (#638)
Browse files Browse the repository at this point in the history
* feat: deploy script for mainnet

* fix: retroactive length

* fix: tests and add back original config

* fix: ops multisig address as owner

* fix: deployment parser address check

* chore: output file cleanup

* chore: remove diff change

* fix: update back to executor multisig

* build: deployment

* docs: add addresses to readme

* docs: fix link
  • Loading branch information
8sunyuan authored Jul 23, 2024
1 parent f14d9d6 commit bb5ae18
Show file tree
Hide file tree
Showing 6 changed files with 271 additions and 6 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ The current mainnet deployment is our M2 release. You can view the deployed cont
| [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/pods/EigenPodManager.sol) | [`0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338`](https://etherscan.io/address/0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338) | [`0xe429...5762`](https://etherscan.io/address/0xe4297e3dadbc7d99e26a2954820f514cb50c5762) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`AVSDirectory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/core/AVSDirectory.sol) | [`0x135dda560e946695d6f155dacafc6f1f25c1f5af`](https://etherscan.io/address/0x135dda560e946695d6f155dacafc6f1f25c1f5af) | [`0xdabd...a5b7`](https://etherscan.io/address/0xdabdb3cd346b7d5f5779b0b614ede1cc9dcba5b7) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`Slasher`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/core/Slasher.sol) | [`0xD92145c07f8Ed1D392c1B88017934E301CC1c3Cd`](https://etherscan.io/address/0xD92145c07f8Ed1D392c1B88017934E301CC1c3Cd) | [`0xf323...6614`](https://etherscan.io/address/0xf3234220163a757edf1e11a8a085638d9b236614) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`RewardsCoordinator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/core/RewardsCoordinator.sol) | [`0x7750d328b314EfFa365A0402CcfD489B80B0adda`](https://etherscan.io/address/0x7750d328b314EfFa365A0402CcfD489B80B0adda) | [`0x5bf7...8785`](https://etherscan.io/address/0x5bf7c13D5FAdba224ECB3D5C0a67A231D1628785) | Proxy: [`[email protected]`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Strategies - ETH

Expand Down
75 changes: 75 additions & 0 deletions script/configs/mainnet/v0.3.0-eigenlayer-addresses.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
"addresses": {
"avsDirectory": "0x135dda560e946695d6f155dacafc6f1f25c1f5af",
"avsDirectoryImplementation": "0xdabdb3cd346b7d5f5779b0b614ede1cc9dcba5b7",
"beaconOracle": "0x343907185b71aDF0eBa9567538314396aa985442",
"baseStrategyImplementation": "0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3",
"delayedWithdrawalRouter": "0x7Fe7E9CC0F274d2435AD5d56D5fa73E47F6A23D8",
"delayedWithdrawalRouterImplementation": "0x4bb6731b02314d40abbffbc4540f508874014226",
"delegationManager": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A",
"delegationManagerImplementation": "0x1784be6401339fc0fedf7e9379409f5c1bfe9dda",
"eigenLayerPauserReg": "0x0c431C66F4dE941d089625E5B423D00707977060",
"eigenLayerProxyAdmin": "0x8b9566AdA63B64d1E1dcF1418b43fd1433b72444",
"eigenPodBeacon": "0x5a2a4F2F3C18f09179B6703e63D9eDD165909073",
"eigenPodImplementation": "0x28144c53ba98b4e909df5bc7ca33eaf0404cffcc",
"eigenPodManager": "0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338",
"eigenPodManagerImplementation": "0xe4297e3dadbc7d99e26a2954820f514cb50c5762",
"emptyContract": "0x1f96861fEFa1065a5A96F20Deb6D8DC3ff48F7f9",
"rewardsCoordinator": "0x0000000000000000000000000000000000000000",
"rewardsCoordinatorImplementation": "0x0000000000000000000000000000000000000000",
"slasher": "0xD92145c07f8Ed1D392c1B88017934E301CC1c3Cd",
"slasherImplementation": "0xf3234220163a757edf1e11a8a085638d9b236614",
"strategyManager": "0x858646372CC42E1A627fcE94aa7A7033e7CF075A",
"strategyManagerImplementation": "0x70f44c13944d49a236e3cd7a94f48f5dab6c619b",
"numStrategiesDeployed": 12,
"strategies": {
"stETH": "0x93c4b944D05dfe6df7645A86cd2206016c51564D",
"rETH": "0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2",
"cbETH": "0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc",
"ETHx": "0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d",
"ankrETH": "0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff",
"oETH": "0xa4C637e0F704745D182e4D38cAb7E7485321d059",
"osETH": "0x57ba429517c3473B6d34CA9aCd56c0e735b94c02",
"swETH": "0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6",
"wBETH": "0x7CA911E83dabf90C90dD3De5411a10F1A6112184",
"sfrxETH": "0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6",
"lsETH": "0xAe60d8180437b5C34bB956822ac2710972584473",
"mETH": "0x298aFB19A105D59E74658C4C334Ff360BadE6dd2"
},
"strategyAddresses": [
"0x93c4b944D05dfe6df7645A86cd2206016c51564D",
"0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2",
"0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc",
"0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d",
"0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff",
"0xa4C637e0F704745D182e4D38cAb7E7485321d059",
"0x57ba429517c3473B6d34CA9aCd56c0e735b94c02",
"0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6",
"0x7CA911E83dabf90C90dD3De5411a10F1A6112184",
"0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6",
"0xAe60d8180437b5C34bB956822ac2710972584473",
"0x298aFB19A105D59E74658C4C334Ff360BadE6dd2"
],
"token": {
"tokenProxyAdmin": "0x3f5Ab2D4418d38568705bFd6672630fCC3435CC9",
"EIGEN": "0xec53bf9167f50cdeb3ae105f56099aaab9061f83",
"bEIGEN": "0x83E9115d334D248Ce39a6f36144aEaB5b3456e75",
"EIGENImpl": "0x7ec354c84680112d3cff1544ec1eb19ca583700b",
"bEIGENImpl": "0xB91c69Af3eE022bd0a59Da082945914BFDcEFFE3",
"eigenStrategy": "0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7",
"eigenStrategyImpl": "0x27e7a3a81741b9fcc5ad7edcbf9f8a72a5c00428"
}
},
"numStrategies": 12,
"chainInfo": {
"chainId": 1,
"deploymentBlock": 17445559
},
"parameters": {
"communityMultisig": "0xFEA47018D632A77bA579846c840d5706705Dc598",
"executorMultisig": "0x369e6F597e22EaB55fFb173C6d9cD234BD699111",
"operationsMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90",
"pauserMultisig": "0x5050389572f2d220ad927CcbeA0D406831012390",
"timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF"
}
}
57 changes: 57 additions & 0 deletions script/configs/mainnet/v0.3.0-mainnet-rewards.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"chainInfo": {
"chainId": 1
},
"multisig_addresses": {
"communityMultisig": "0xFEA47018D632A77bA579846c840d5706705Dc598",
"executorMultisig": "0x369e6F597e22EaB55fFb173C6d9cD234BD699111",
"operationsMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90",
"pauserMultisig": "0x5050389572f2d220ad927CcbeA0D406831012390",
"timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF"
},
"strategies": {
"numStrategies": 0,
"MAX_PER_DEPOSIT": 115792089237316195423570985008687907853269984665640564039457584007913129639935,
"MAX_TOTAL_DEPOSITS": 115792089237316195423570985008687907853269984665640564039457584007913129639935,
"strategiesToDeploy": []
},
"strategyManager": {
"init_strategy_whitelister": "0xBE1685C81aA44FF9FB319dD389addd9374383e90",
"init_paused_status": 0
},
"delegationManager": {
"init_paused_status": 0,
"init_minWithdrawalDelayBlocks": 50400
},
"avsDirectory": {
"init_paused_status": 0
},
"slasher": {
"init_paused_status": 115792089237316195423570985008687907853269984665640564039457584007913129639935
},
"eigenPod": {
"MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": 32000000000,
"GENESIS_TIME": 1606824023
},
"eigenPodManager": {
"init_paused_status": 0,
"deneb_fork_timestamp": "1710338135"
},
"delayedWithdrawalRouter": {
"init_paused_status": 0,
"init_withdrawalDelayBlocks": 50400
},
"ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
"beaconOracleAddress": "0x343907185b71aDF0eBa9567538314396aa985442",
"rewardsCoordinator": {
"init_paused_status": 0,
"CALCULATION_INTERVAL_SECONDS": 604800,
"MAX_REWARDS_DURATION": 6048000,
"MAX_RETROACTIVE_LENGTH": 14515200,
"MAX_FUTURE_LENGTH": 2592000,
"GENESIS_REWARDS_TIMESTAMP": 1710979200,
"rewards_updater_address": "0x8f94F55fD8c9E090296283137C303fE97d32A9e2",
"activation_delay": 604800,
"global_operator_commission_bips": 1000
}
}
100 changes: 100 additions & 0 deletions script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.12;

import "@openzeppelin/contracts/utils/Create2.sol";
import "../../utils/ExistingDeploymentParser.sol";

/**
* @notice Script used for the first deployment of EigenLayer core contracts to Holesky
* FORK LOCAL
* anvil --fork-url $RPC_MAINNET
* forge script script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol:MainnetRewardsCoordinatorDeploy --rpc-url http://127.0.0.1:8545 --private-key $PRIVATE_KEY --broadcast -vvvv
*
* MAINNET
* forge script script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol:MainnetRewardsCoordinatorDeploy --rpc-url $RPC_MAINNET --private-key $PRIVATE_KEY --verify --broadcast -vvvv
*
*/
contract MainnetRewardsCoordinatorDeploy is ExistingDeploymentParser {
function run() external virtual {
_parseInitialDeploymentParams(
"script/configs/mainnet/v0.3.0-mainnet-rewards.config.json"
);
_parseDeployedContracts(
"script/configs/mainnet/v0.3.0-eigenlayer-addresses.config.json"
);

// START RECORDING TRANSACTIONS FOR DEPLOYMENT
vm.startBroadcast();

emit log_named_address("Deployer Address", msg.sender);

_deployRewardsCoordinator();

// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
vm.stopBroadcast();

// Sanity Checks
_verifyContractPointers();
_verifyImplementations();
_verifyContractsInitialized({isInitialDeployment: true});
_verifyInitializationParams();

logAndOutputContractAddresses("script/output/mainnet/v0.3.0-mainnet-rewards.output.json");
}

/**
* @notice Deploy RewardsCoordinator for Holesky
*/
function _deployRewardsCoordinator() internal {


// Deploy RewardsCoordinator proxy and implementation
rewardsCoordinatorImplementation = new RewardsCoordinator(
delegationManager,
strategyManager,
REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP
);
rewardsCoordinator = RewardsCoordinator(
address(
new TransparentUpgradeableProxy(
address(rewardsCoordinatorImplementation),
address(eigenLayerProxyAdmin),
abi.encodeWithSelector(
RewardsCoordinator.initialize.selector,
executorMultisig,
eigenLayerPauserReg,
REWARDS_COORDINATOR_INIT_PAUSED_STATUS,
REWARDS_COORDINATOR_UPDATER,
REWARDS_COORDINATOR_ACTIVATION_DELAY,
REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS
)
)
)
);
}

/**
* @notice Deploy RewardsCoordinator Implementation for Holesky and upgrade the proxy
*/
function _upgradeRewardsCoordinator() internal {
// Deploy RewardsCoordinator proxy and implementation
rewardsCoordinatorImplementation = new RewardsCoordinator(
delegationManager,
strategyManager,
REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS,
REWARDS_COORDINATOR_MAX_REWARDS_DURATION,
REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH,
REWARDS_COORDINATOR_MAX_FUTURE_LENGTH,
REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP
);

eigenLayerProxyAdmin.upgrade(
TransparentUpgradeableProxy(payable(address(rewardsCoordinator))),
address(rewardsCoordinatorImplementation)
);
}
}
37 changes: 37 additions & 0 deletions script/output/mainnet/v0.3.0-mainnet-rewards.output.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"addresses": {
"avsDirectory": "0x135DDa560e946695d6f155dACaFC6f1F25C1F5AF",
"avsDirectoryImplementation": "0xdAbdB3Cd346B7D5F5779b0B614EdE1CC9DcBA5b7",
"baseStrategyImplementation": "0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3",
"beaconOracle": "0x343907185b71aDF0eBa9567538314396aa985442",
"delayedWithdrawalRouter": "0x7Fe7E9CC0F274d2435AD5d56D5fa73E47F6A23D8",
"delayedWithdrawalRouterImplementation": "0x4bB6731B02314d40aBbfFBC4540f508874014226",
"delegationManager": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A",
"delegationManagerImplementation": "0x1784BE6401339Fc0Fedf7E9379409f5c1BfE9dda",
"eigenLayerPauserReg": "0x0c431C66F4dE941d089625E5B423D00707977060",
"eigenLayerProxyAdmin": "0x8b9566AdA63B64d1E1dcF1418b43fd1433b72444",
"eigenPodBeacon": "0x5a2a4F2F3C18f09179B6703e63D9eDD165909073",
"eigenPodImplementation": "0x28144C53bA98B4e909Df5bC7cA33eAf0404cFfcc",
"eigenPodManager": "0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338",
"eigenPodManagerImplementation": "0xe4297e3DaDBc7D99e26a2954820f514CB50C5762",
"emptyContract": "0x1f96861fEFa1065a5A96F20Deb6D8DC3ff48F7f9",
"rewardsCoordinator": "0x7750d328b314EfFa365A0402CcfD489B80B0adda",
"rewardsCoordinatorImplementation": "0x5bf7c13D5FAdba224ECB3D5C0a67A231D1628785",
"slasher": "0xD92145c07f8Ed1D392c1B88017934E301CC1c3Cd",
"slasherImplementation": "0xF3234220163a757edf1E11a8a085638D9B236614",
"strategies": "",
"strategyManager": "0x858646372CC42E1A627fcE94aa7A7033e7CF075A",
"strategyManagerImplementation": "0x70f44C13944d49a236E3cD7a94f48f5daB6C619b"
},
"chainInfo": {
"chainId": 1,
"deploymentBlock": 20341789
},
"parameters": {
"communityMultisig": "0xFEA47018D632A77bA579846c840d5706705Dc598",
"executorMultisig": "0x369e6F597e22EaB55fFb173C6d9cD234BD699111",
"operationsMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90",
"pauserMultisig": "0x5050389572f2d220ad927CcbeA0D406831012390",
"timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF"
}
}
7 changes: 1 addition & 6 deletions script/utils/ExistingDeploymentParser.sol
Original file line number Diff line number Diff line change
Expand Up @@ -312,18 +312,13 @@ contract ExistingDeploymentParser is Script, Test {
initialDeploymentData,
".rewardsCoordinator.init_paused_status"
);
REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS = uint32(
stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.CALCULATION_INTERVAL_SECONDS")
);
REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS = uint32(stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.CALCULATION_INTERVAL_SECONDS"));
REWARDS_COORDINATOR_MAX_REWARDS_DURATION = uint32(stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.MAX_REWARDS_DURATION"));
REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH = uint32(stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.MAX_RETROACTIVE_LENGTH"));
REWARDS_COORDINATOR_MAX_FUTURE_LENGTH = uint32(stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.MAX_FUTURE_LENGTH"));
REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP = uint32(stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.GENESIS_REWARDS_TIMESTAMP"));
REWARDS_COORDINATOR_UPDATER = stdJson.readAddress(initialDeploymentData, ".rewardsCoordinator.rewards_updater_address");
REWARDS_COORDINATOR_ACTIVATION_DELAY = uint32(stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.activation_delay"));
REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS = uint32(
stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.calculation_interval_seconds")
);
REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS = uint32(
stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.global_operator_commission_bips")
);
Expand Down

0 comments on commit bb5ae18

Please sign in to comment.