From 2c0dd7640fd2ce6e39a1005e669937fd9e6b4076 Mon Sep 17 00:00:00 2001 From: jaeaster Date: Mon, 20 May 2024 20:47:50 +0100 Subject: [PATCH] AVS testnet deployment on Holesky (#18) * update forge-std * deploy avs holesky * AVS holesky deployment * fix: formatting on avs config --- Makefile | 9 ++ config/avs.json | 133 ++++++++++++++++---------- foundry.toml | 5 +- lib/forge-std | 2 +- script/deploy/DeployAVS.s.sol | 9 +- script/output/holesky/deployment.json | 16 ++++ script/util/Stake.s.sol | 38 ++++++++ src/utils/Constants.sol | 14 ++- 8 files changed, 167 insertions(+), 59 deletions(-) create mode 100644 script/output/holesky/deployment.json create mode 100644 script/util/Stake.s.sol diff --git a/Makefile b/Makefile index 7004798..1f5994b 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,7 @@ DEPLOY_AVS_CMD=forge script DeployAVS --rpc-url QUERY_CMD=forge script Query --rpc-url WITHDRAW_FEES_CMD=forge script WithdrawFees --rpc-url BRIDGE_CMD=forge script Bridge --rpc-url +STAKE_CMD=forge script Stake --rpc-url # deps install :; forge install @@ -33,6 +34,7 @@ setup_integration_test : local_deploy_erc1967_proxy_factory local_deploy_registr setup_avs_integration_test : local_deploy_erc1967_proxy_factory local_deploy_avs local_deploy_erc1967_proxy_factory :; ${DEPLOY_PROXY_FACTORY_CMD} local ${LOCAL_DEPLOY_FLAGS} --json +holesky_testnet_deploy_erc1967_proxy_factory :; ${DEPLOY_PROXY_FACTORY_CMD} holesky ${DEPLOY_FLAGS} base_testnet_deploy_erc1967_proxy_factory :; ${DEPLOY_PROXY_FACTORY_CMD} base_sepolia ${DEPLOY_FLAGS} fraxtal_testnet_deploy_erc1967_proxy_factory :; ${DEPLOY_PROXY_FACTORY_CMD} fraxtal_testnet ${DEPLOY_FLAGS} fraxtal_mainnet_deploy_erc1967_proxy_factory :; ${DEPLOY_PROXY_FACTORY_CMD} fraxtal ${DEPLOY_FLAGS} ${MAINNET_DEPLOYER} @@ -45,6 +47,7 @@ fraxtal_testnet_integration_test : fraxtal_testnet_deploy_registry fraxtal_testn # Deploy the registry local_deploy_registry :; ${DEPLOY_REGISTRY_CMD} local ${LOCAL_DEPLOY_FLAGS} --json testnet_deploy_registry :; ${DEPLOY_REGISTRY_CMD} sepolia ${DEPLOY_FLAGS} --priority-gas-price 0.1gwei +holesky_testnet_deploy_registry :; ${DEPLOY_REGISTRY_CMD} holesky ${DEPLOY_FLAGS} --priority-gas-price 0.1gwei mainnet_deploy_registry :; ${DEPLOY_REGISTRY_CMD} mainnet ${DEPLOY_FLAGS} --priority-gas-price 0.5gwei ${MAINNET_DEPLOYER} base_testnet_deploy_registry :; ${DEPLOY_REGISTRY_CMD} base_sepolia ${DEPLOY_FLAGS} base_mainnet_deploy_registry :; ${DEPLOY_REGISTRY_CMD} base ${DEPLOY_FLAGS} ${MAINNET_DEPLOYER} @@ -54,6 +57,7 @@ fraxtal_mainnet_deploy_registry :; ${DEPLOY_REGISTRY_CMD} fraxtal ${DEPLOY_FLAGS # Deploy clients local_deploy_clients :; ${DEPLOY_CLIENTS_CMD} local ${LOCAL_DEPLOY_FLAGS} testnet_deploy_clients :; ${DEPLOY_CLIENTS_CMD} sepolia ${DEPLOY_FLAGS} --priority-gas-price 0.1gwei +holesky_deploy_clients :; ${DEPLOY_CLIENTS_CMD} holesky ${DEPLOY_FLAGS} --priority-gas-price 0.1gwei mainnet_deploy_clients :; ${DEPLOY_CLIENTS_CMD} mainnet ${DEPLOY_FLAGS} --priority-gas-price 0.5gwei --account v0_owner base_testnet_deploy_clients :; ${DEPLOY_CLIENTS_CMD} base_sepolia ${DEPLOY_FLAGS} base_mainnet_deploy_clients :; ${DEPLOY_CLIENTS_CMD} base ${DEPLOY_FLAGS} ${MAINNET_DEPLOYER} @@ -81,3 +85,8 @@ mainnet_bridge_base :; ${BRIDGE_CMD} mainnet ${LOCAL_DEPLOY_FLAGS} --account holesky_bridge_fraxtal :; ${BRIDGE_CMD} holesky ${LOCAL_DEPLOY_FLAGS} --priority-gas-price 0.01gwei -vvvv base_mainnet_deployment : base_mainnet_deploy_registry base_mainnet_deploy_clients + +# Stake +holesky_stake :; ${STAKE_CMD} holesky ${LOCAL_DEPLOY_FLAGS} --priority-gas-price 0.01gwei -vvvv --skip-simulation + +base_mainnet_deployment : base_mainnet_deploy_registry base_mainnet_deploy_clients diff --git a/config/avs.json b/config/avs.json index 29ef94e..366d359 100644 --- a/config/avs.json +++ b/config/avs.json @@ -14,56 +14,85 @@ "delegationManager": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A" } }, - "strategies": [ - { - "name": "cbETH", - "addr": "0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc", - "multiplier": 1000 - }, - { - "name": "stETH", - "addr": "0x93c4b944D05dfe6df7645A86cd2206016c51564D", - "multiplier": 1000 - }, - { - "name": "rETH", - "addr": "0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2", - "multiplier": 1000 - }, - { - "name": "ETHx", - "addr": "0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d", - "multiplier": 1000 - }, - { - "name": "ankrETH", - "addr": "0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff", - "multiplier": 1000 - }, - { - "name": "swETH", - "addr": "0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6", - "multiplier": 1000 - }, - { - "name": "wBETH", - "addr": "0x7CA911E83dabf90C90dD3De5411a10F1A6112184", - "multiplier": 1000 - }, - { - "name": "sfrxETH", - "addr": "0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6", - "multiplier": 1000 - }, - { - "name": "mETH", - "addr": "0x298aFB19A105D59E74658C4C334Ff360BadE6dd2", - "multiplier": 1000 - }, - { - "name": "Beacon ETH", - "addr": "0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0", - "multiplier": 1000 - } - ] + "strategies": { + "mainnet": [ + { + "name": "cbETH", + "addr": "0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc", + "multiplier": 1000 + }, + { + "name": "stETH", + "addr": "0x93c4b944D05dfe6df7645A86cd2206016c51564D", + "multiplier": 1000 + }, + { + "name": "rETH", + "addr": "0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2", + "multiplier": 1000 + }, + { + "name": "ETHx", + "addr": "0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d", + "multiplier": 1000 + }, + { + "name": "ankrETH", + "addr": "0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff", + "multiplier": 1000 + }, + { + "name": "swETH", + "addr": "0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6", + "multiplier": 1000 + }, + { + "name": "wBETH", + "addr": "0x7CA911E83dabf90C90dD3De5411a10F1A6112184", + "multiplier": 1000 + }, + { + "name": "sfrxETH", + "addr": "0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6", + "multiplier": 1000 + }, + { + "name": "mETH", + "addr": "0x298aFB19A105D59E74658C4C334Ff360BadE6dd2", + "multiplier": 1000 + }, + { + "name": "Beacon ETH", + "addr": "0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0", + "multiplier": 1000 + } + ], + "holesky": [ + { + "name": "stETH", + "addr": "0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", + "multiplier": 2000 + }, + { + "name": "ETHx", + "addr": "0x7F09ceb3874F5E35Cd2135F56fd4329b88c5d119", + "multiplier": 2000 + }, + { + "name": "WETH", + "addr": "0x94373a4919B3240D86eA41593D5eBa789FEF3848", + "multiplier": 2000 + }, + { + "name": "sfrxETH", + "addr": "0xa63f56985F9C7F3bc9fFc5685535649e0C1a55f3", + "multiplier": 2000 + }, + { + "name": "mETH", + "addr": "0xbe16244EAe9837219147384c8A7560BA14946262", + "multiplier": 2000 + } + ] + } } diff --git a/foundry.toml b/foundry.toml index c908310..e219a4a 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,8 +6,8 @@ fs_permissions = [{ access = "read", path = "./test" }, { access = "read-write", optimizer = true optimizer_runs = 200 solc-version = "0.8.25" -evm_version = "shanghai" -# evm_version = "cancun" TODO: Update after fraxtal support +# evm_version = "shanghai" +evm_version = "cancun" # TODO: Update after fraxtal support verbosity = 4 [fmt] @@ -26,6 +26,7 @@ fraxtal = "https://rpc.frax.com" [etherscan] sepolia = { key = "${MAINNET_ETHERSCAN_API_KEY}" } +holesky = { key = "${MAINNET_ETHERSCAN_API_KEY}" } base_sepolia = { key = "${BASESCAN_API_KEY}" } fraxtal_testnet = { key = "${FRAXSCAN_API_KEY}" } diff --git a/lib/forge-std b/lib/forge-std index bb4ceea..52715a2 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit bb4ceea94d6f10eeb5b41dc2391c6c8bf8e734ef +Subproject commit 52715a217dc51d0de15877878ab8213f6cbbbab5 diff --git a/script/deploy/DeployAVS.s.sol b/script/deploy/DeployAVS.s.sol index 488b724..cf5a05f 100644 --- a/script/deploy/DeployAVS.s.sol +++ b/script/deploy/DeployAVS.s.sol @@ -152,10 +152,15 @@ contract DeployAVS is BaseScript { return serviceManagerImpl; } - function getQuorum() private view returns (Quorum memory) { + function getQuorum() private returns (Quorum memory) { string memory json = vm.readFile(avsConfigPath()); StrategyConfig[] memory strategies; - bytes memory strategiesRaw = json.parseRaw(".strategies"); + + string memory chainName = getChain(block.chainid).chainAlias; + string memory strategiesKey = + string(abi.encodePacked(".strategies.", chainName)); + + bytes memory strategiesRaw = json.parseRaw(strategiesKey); strategies = abi.decode(strategiesRaw, (StrategyConfig[])); StrategyParams[] memory strategyParams = diff --git a/script/output/holesky/deployment.json b/script/output/holesky/deployment.json new file mode 100644 index 0000000..1907d1a --- /dev/null +++ b/script/output/holesky/deployment.json @@ -0,0 +1,16 @@ +{ + "addresses": { + "queryClient": "0x0D8F2217F0D194926AFF15aA9Dc978b920E37F45", + "registryImpl": "0x042B7626ebFf4cAa5bb8D44C26029C260158DAC9", + "registryProxy": "0x4f73289BFffEF7Eed9f284B1E76328beB52c6e37", + "serviceManagerImpl": "0xF221F7faDf301EC9fC1780D5c85F7137D9d11015", + "serviceManagerProxy": "0xf98D5De1014110C65c51b85Ea55f73863215CC10", + "stakeRegistryImpl": "0xBeAd7Fe75B567Ac0fc12526225451eb3F964d834", + "stakeRegistryProxy": "0xf724cDC7C40fd6B59590C624E8F0E5E3843b4BE4", + "storageContract": "0x09C52d2dCdA5724823f5b3bEe93E989B218004Ac" + }, + "chainInfo": { + "chainId": 17000, + "deploymentBlock": 1575368 + } +} diff --git a/script/util/Stake.s.sol b/script/util/Stake.s.sol new file mode 100644 index 0000000..ad5f0d6 --- /dev/null +++ b/script/util/Stake.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {BaseScript} from "../BaseScript.s.sol"; +import {LPNQueryV0} from "../../src/client/LPNQueryV0.sol"; +import {LPNRegistryV0} from "../../src/LPNRegistryV0.sol"; +import { + PUDGEY_PENGUINS, + isEthereum, + isMainnet +} from "../../src/utils/Constants.sol"; +import {L1BlockNumber} from "../../src/utils/L1Block.sol"; + +contract Stake is BaseScript { + address holeskyWeth = 0x94373a4919B3240D86eA41593D5eBa789FEF3848; + + IMantleEth mantleEth = + IMantleEth(0xbe16244EAe9837219147384c8A7560BA14946262); + + LPNRegistryV0 registry = LPNRegistryV0(getDeployedRegistry()); + LPNQueryV0 queryClient = LPNQueryV0(getDeployedQueryClient()); + + function run() external broadcaster { + stake(); + } + + function stake() private { + // Deposit to get WETH + // holeskyWeth.call{value: 1 ether}(""); + + // Stake to get mETH + mantleEth.stake{value: 100 ether}(0); + } +} + +interface IMantleEth { + function stake(uint256 minMETHAmount) external payable; +} diff --git a/src/utils/Constants.sol b/src/utils/Constants.sol index 10bad88..bb49621 100644 --- a/src/utils/Constants.sol +++ b/src/utils/Constants.sol @@ -8,6 +8,7 @@ uint256 constant ANVIL = 31337; uint256 constant ETH_MAINNET = 1; uint256 constant ETH_SEPOLIA = 11155111; +uint256 constant ETH_HOLESKY = 17000; uint256 constant BASE_MAINNET = 8453; uint256 constant BASE_SEPOLIA = 84532; @@ -32,7 +33,8 @@ uint256 constant LAGRANGE_LOONS_MAPPING_SLOT = 2; uint256 constant LAGRANGE_LOONS_LENGTH_SLOT = 8; function isEthereum() view returns (bool) { - return block.chainid == ETH_MAINNET || block.chainid == ETH_SEPOLIA; + return block.chainid == ETH_MAINNET || block.chainid == ETH_SEPOLIA + || block.chainid == ETH_HOLESKY; } function isOPStack() view returns (bool) { @@ -48,7 +50,8 @@ function isLocal() view returns (bool) { } function isTestnet() view returns (bool) { - uint256[3] memory testnets = [ETH_SEPOLIA, BASE_SEPOLIA, FRAXTAL_HOLESKY]; + uint256[4] memory testnets = + [ETH_SEPOLIA, ETH_HOLESKY, BASE_SEPOLIA, FRAXTAL_HOLESKY]; return chainMatches(testnets); } @@ -63,3 +66,10 @@ function chainMatches(uint256[3] memory chains) view returns (bool) { } return false; } + +function chainMatches(uint256[4] memory chains) view returns (bool) { + for (uint256 i = 0; i < chains.length; i++) { + if (chains[i] == block.chainid) return true; + } + return false; +}