diff --git a/contracts/README.md b/contracts/README.md index cc7db4fe..98e37ecf 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -39,11 +39,11 @@ cd ../test && bun generate:wagmi Deployment parameters (EigenLayer addresses, initial validators, owners) are defined in `contracts/config/.json`. - **Do not edit** `Config.sol` or `DeployParams.s.sol` directly; they only load the JSON. -- Ensure `contracts/config/hoodi.json` (or `holesky.json`) matches your target environment before deploying. +- Ensure `contracts/config/hoodi.json` matches your target environment before deploying. ## Deployment -Two deployment paths exist: **Local** (Anvil) and **Testnet** (Hoodi/Holesky). Both install the **DataHaven AVS contracts** (ServiceManager, RewardsRegistry, VetoableSlasher) and **Snowbridge** (BeefyClient, Gateway, Agent). They differ in EigenLayer setup: +Two deployment paths exist: **Local** (Anvil) and **Testnet** (Hoodi). Both install the **DataHaven AVS contracts** (ServiceManager, RewardsRegistry, VetoableSlasher) and **Snowbridge** (BeefyClient, Gateway, Agent). They differ in EigenLayer setup: ### Local (Anvil) **`DeployLocal.s.sol`** bootstraps a full EigenLayer core deployment (DelegationManager, StrategyManager, AVSDirectory, etc.) alongside DataHaven AVS and Snowbridge. @@ -52,7 +52,7 @@ anvil forge script script/deploy/DeployLocal.s.sol --rpc-url anvil --broadcast ``` -### Testnet (Hoodi / Holesky) +### Testnet (Hoodi) **`DeployTestnet.s.sol`** references existing EigenLayer contracts (addresses from `contracts/config/.json`) and only deploys DataHaven AVS + Snowbridge. ```bash NETWORK=hoodi forge script script/deploy/DeployTestnet.s.sol \ @@ -60,7 +60,7 @@ NETWORK=hoodi forge script script/deploy/DeployTestnet.s.sol \ --private-key $PRIVATE_KEY \ --broadcast ``` -Supported networks: `hoodi`, `holesky` (no mainnet config yet). Artifacts → `contracts/deployments/.json`. +Supported networks: `hoodi` (no mainnet config yet). Artifacts → `contracts/deployments/.json`. ## How It Works 1. **Registration**: Validators register with EigenLayer via `DataHavenServiceManager`. diff --git a/contracts/config/example.jsonc b/contracts/config/example.jsonc index 1a8b6788..334abd2a 100644 --- a/contracts/config/example.jsonc +++ b/contracts/config/example.jsonc @@ -12,33 +12,33 @@ /// See https://github.com/Layr-Labs/eigenlayer-contracts/tree/dev/docs#rewardscoordinator "rewardsUpdater": "0x90F79bf6EB2c4f870365E785982E1f101E93b906", /// The interval at which the new rewards merkle root is calculated. - /// See testnet deployment: https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F1 + /// See testnet deployment: https://hoodi.etherscan.io/address/0x29e8572678e0c272350aa0b4B8f304E47EBcd5e7#readProxyContract#F1 "calculationIntervalSeconds": 86400, /// The maximum duration of rewards that can be retroactively applied. - /// See testnet deployment: https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F5 + /// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F5 "maxRewardsDuration": 6048000, /// The maximum retroactive length of rewards that can be applied. - /// See testnet deployment: https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F4 + /// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F4 "maxRetroactiveLength": 7776000, /// The maximum duration of rewards that can be applied in the future. - /// See testnet deployment: https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F3 + /// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F3 "maxFutureLength": 2592000, /// The timestamp at which rewards are first calculated. - /// See testnet deployment: https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F2 + /// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F2 "genesisRewardsTimestamp": 1710979200, /// Delay in timestamp (seconds) before a posted root can be claimed against - /// See testnet deployment: https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F6 + /// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F6 "activationDelay": 7200, /// Also called "defaultOperatorSplitBips" /// Used off-chain by the rewards updater to calculate an Operator's split for a specific reward. - /// See testnet deployment: https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F7 + /// See testnet deployment: https://hoodi.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE#readProxyContract#F7 "globalCommissionBips": 1000, /// Multisig address for controlling operations (we don't care as much about this). "executorMultisig": "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", /// Multisig address for executing operations (we don't care as much about this). "operationsMultisig": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", /// The delay in blocks before withdrawals can be completed. - /// See testnet deployment: https://holesky.etherscan.io/address/0xA44151489861Fe9e3055d95adC98FbD462B948e7#readProxyContract#F24 + /// See testnet deployment: https://hoodi.etherscan.io/address/0x867837a9722C512e0862d8c2E15b8bE220E8b87d#readProxyContract#F24 "minWithdrawalDelayBlocks": 50, /// The initial paused status of the DelegationManager /// See here for more details: https://github.com/Layr-Labs/eigenlayer-contracts/blob/db0f582ba9b4df861b72269267d4980d7f3f7490/src/contracts/permissions/Pausable.sol#L12 @@ -53,16 +53,15 @@ /// See here for more details: https://github.com/Layr-Labs/eigenlayer-contracts/blob/db0f582ba9b4df861b72269267d4980d7f3f7490/src/contracts/permissions/Pausable.sol#L12 "allocationManagerInitPausedStatus": 0, /// The delay in blocks before deallocations can be completed. - /// See testnet deployment: https://holesky.etherscan.io/address/0x78469728304326CBc65f8f95FA756B0B73164462#readProxyContract#F2 + /// See testnet deployment: https://hoodi.etherscan.io/address/0x95a7431400F362F3647a69535C5666cA0133CAA0#readProxyContract#F2 "deallocationDelay": 50, /// The delay in blocks before allocation configuration can be completed. - /// See testnet deployment: https://holesky.etherscan.io/address/0x78469728304326CBc65f8f95FA756B0B73164462#readProxyContract#F1 + /// See testnet deployment: https://hoodi.etherscan.io/address/0x95a7431400F362F3647a69535C5666cA0133CAA0#readProxyContract#F1 "allocationConfigurationDelay": 75, /// The genesis time of the beacon state, to help EL calculate conversions between slot and timestamp - /// See testnet deployment: https://holesky.etherscan.io/address/0x68bd1e75E9863C9066B46B8a44E953F918466D37#readContract#F1 + /// See EigenPodManager: https://hoodi.etherscan.io/address/0xcd1442415Fc5C29Aa848A49d2e232720BE07976c "beaconChainGenesisTimestamp": 1695902400 }, - "avs": { /// The owner of the DataHaven Service Manager contract. "avsOwner": "0x976EA74026E726554dB657fA54763abd0C3a0aa9", @@ -77,7 +76,6 @@ /// The EigenLayer strategy addresses for the Validators to stake into. "validatorsStrategies": [] }, - "snowbridge": { /// Minimum delay in number of blocks that a relayer must wait between calling /// submitInitial and commitPrevRandao. In production this should be set to MAX_SEED_LOOKAHEAD: @@ -105,4 +103,4 @@ "0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e" ] } -} +} \ No newline at end of file diff --git a/contracts/config/holesky.json b/contracts/config/holesky.json deleted file mode 100644 index eacb3289..00000000 --- a/contracts/config/holesky.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "eigenLayer": { - "pausers": ["0x53410249ec7d3a3F9F1ba3912D50D6A3Df6d10A7"], - "unpauser": "0xE3328cb5068924119d6170496c4AB2dD12c12d15", - "rewardsUpdater": "0xe30a38ac89ffE5A86D5389Bfbf70C7EC766FbB6e", - "calculationIntervalSeconds": 86400, - "maxRewardsDuration": 6048000, - "maxRetroactiveLength": 7776000, - "maxFutureLength": 2592000, - "genesisRewardsTimestamp": 1710979200, - "activationDelay": 7200, - "globalCommissionBips": 1000, - "executorMultisig": "0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348", - "operationsMultisig": "0xfaEF7338b7490b9E272d80A1a39f4657cAf2b97d", - "minWithdrawalDelayBlocks": 50, - "delegationInitPausedStatus": 0, - "eigenPodManagerInitPausedStatus": 0, - "rewardsCoordinatorInitPausedStatus": 0, - "allocationManagerInitPausedStatus": 0, - "deallocationDelay": 50, - "allocationConfigurationDelay": 75, - "beaconChainGenesisTimestamp": 1710666600, - "delegationManager": "0xA44151489861Fe9e3055d95adC98FbD462B948e7", - "strategyManager": "0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6", - "eigenPodManager": "0x30770d7E3e71112d7A6b7259542D1f680a70e315", - "avsDirectory": "0x055733000064333CaDDbC92763c58BF0192fFeBf", - "rewardsCoordinator": "0xAcc1fb458a1317E886dB376Fc8141540537E68fE", - "allocationManager": "0x78469728304326CBc65f8f95FA756B0B73164462", - "permissionController": "0x598cb226B591155F767dA17AfE7A2241a68C5C10" - }, - "avs": { - "avsOwner": "0xe30a38ac89ffE5A86D5389Bfbf70C7EC766FbB6e", - "rewardsInitiator": "0xe30a38ac89ffE5A86D5389Bfbf70C7EC766FbB6e", - "vetoCommitteeMember": "0xe30a38ac89ffE5A86D5389Bfbf70C7EC766FbB6e", - "vetoWindowBlocks": 100, - "validatorsStrategies": [] - }, - "snowbridge": { - "randaoCommitDelay": 4, - "randaoCommitExpiration": 24, - "minNumRequiredSignatures": 2, - "startBlock": 1, - "rewardsMessageOrigin": "0x0000000000000000000000000000000000000000000000000000000000000000", - "initialValidatorHashes": [ - "0xaeb47a269393297f4b0a3c9c9cfd00c7a4195255274cf39d83dabc2fcc9ff3d7", - "0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde" - ], - "nextValidatorHashes": [ - "0xaeb47a269393297f4b0a3c9c9cfd00c7a4195255274cf39d83dabc2fcc9ff3d7", - "0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde" - ] - } -} diff --git a/contracts/deployments/holesky.json b/contracts/deployments/holesky.json deleted file mode 100644 index 7212da30..00000000 --- a/contracts/deployments/holesky.json +++ /dev/null @@ -1 +0,0 @@ -{"network": "holesky","BeefyClient": "0xcBfD943fC9385041Fc8BCfe9705e6F803A735F09","AgentExecutor": "0x545bC12764770C4F00b05a42F81C6eF5e638B9d3","Gateway": "0xa3C18F4D07Bf97BA5B1405a3e19d59fdAe24913F","ServiceManager": "0xaCF6110009a790eC487Ed362A43FC36cCAE49bC6","ServiceManagerImplementation": "0xE9cf23E6c3d2f46F8DE93d7EFaF6222bD00C5092","VetoableSlasher": "0xDbDD8EcB2725b2720a271f98dB1A7AD31D6A5224","RewardsRegistry": "0x88F243feF1EC11426b743a98cae9Dd7A6704cdf1","RewardsAgent": "0x73C3BF5Da6E0F81423c71e3699Ec4520D020fDfF","DelegationManager": "0xA44151489861Fe9e3055d95adC98FbD462B948e7","StrategyManager": "0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6","AVSDirectory": "0x055733000064333CaDDbC92763c58BF0192fFeBf","RewardsCoordinator": "0xAcc1fb458a1317E886dB376Fc8141540537E68fE","AllocationManager": "0x78469728304326CBc65f8f95FA756B0B73164462","PermissionController": "0x598cb226B591155F767dA17AfE7A2241a68C5C10"} \ No newline at end of file diff --git a/contracts/foundry.toml b/contracts/foundry.toml index 82cc6bc1..d06f6cd6 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -114,10 +114,8 @@ [rpc_endpoints] mainnet = "${RPC_MAINNET}" - holesky = "${RPC_HOLESKY}" - hoodi = "https://rpc.hoodi.ethpandaops.io" + hoodi = "${RPC_HOODI}" anvil = "http://localhost:8545" # [etherscan] -# mainnet = { key = "${ETHERSCAN_API_KEY}" } -# holesky = { key = "${ETHERSCAN_API_KEY}" } \ No newline at end of file +# mainnet = { key = "${ETHERSCAN_API_KEY}" } \ No newline at end of file diff --git a/contracts/script/deploy/DeployTestnet.s.sol b/contracts/script/deploy/DeployTestnet.s.sol index 1261eba4..873740aa 100644 --- a/contracts/script/deploy/DeployTestnet.s.sol +++ b/contracts/script/deploy/DeployTestnet.s.sol @@ -35,17 +35,9 @@ import { /** * @title DeployTestnet - * @notice Deployment script for testnets (hoodi, holesky) - references existing EigenLayer contracts + * @notice Deployment script for testnets (hoodi) - references existing EigenLayer contracts */ contract DeployTestnet is DeployBase { - // Supported testnet chains - enum TestnetChain { - HOODI, - HOLESKY - } - - // Current testnet being deployed to - TestnetChain public currentTestnet; string public networkName; function run() public { @@ -56,7 +48,7 @@ contract DeployTestnet is DeployBase { "NETWORK environment variable required for testnet deployment" ); - currentTestnet = _detectAndValidateNetwork(networkName); + _validateNetwork(networkName); totalSteps = 4; _executeSharedDeployment(); @@ -68,12 +60,7 @@ contract DeployTestnet is DeployBase { } function _getDeploymentMode() internal view override returns (string memory) { - if (currentTestnet == TestnetChain.HOODI) { - return "HOODI_TESTNET"; - } else if (currentTestnet == TestnetChain.HOLESKY) { - return "HOLESKY_TESTNET"; - } - return "UNKNOWN_TESTNET"; + return "HOODI_TESTNET"; } function _setupEigenLayerContracts( @@ -234,24 +221,20 @@ contract DeployTestnet is DeployBase { // TESTNET-SPECIFIC FUNCTIONS /** - * @notice Detect and validate the target testnet network + * @notice Validate that the network is hoodi (the only supported testnet) */ - function _detectAndValidateNetwork( + function _validateNetwork( string memory network - ) internal pure returns (TestnetChain) { + ) internal pure { bytes32 networkHash = keccak256(abi.encodePacked(network)); - if (networkHash == keccak256(abi.encodePacked("hoodi"))) { - return TestnetChain.HOODI; - } else if (networkHash == keccak256(abi.encodePacked("holesky"))) { - return TestnetChain.HOLESKY; + if (networkHash != keccak256(abi.encodePacked("hoodi"))) { + revert( + string.concat( + "Unsupported testnet network: ", network, ". Supported networks: hoodi" + ) + ); } - - revert( - string.concat( - "Unsupported testnet network: ", network, ". Supported networks: hoodi, holesky" - ) - ); } /** @@ -276,17 +259,4 @@ contract DeployTestnet is DeployBase { ) ); } - - /** - * @notice Get testnet-specific configuration parameters - * @dev Override this function to add testnet-specific logic in the future - */ - function _getTestnetConfig() internal view returns (string memory) { - if (currentTestnet == TestnetChain.HOODI) { - return "hoodi"; - } else if (currentTestnet == TestnetChain.HOLESKY) { - return "holesky"; - } - return "unknown"; - } } diff --git a/test/cli/handlers/contracts/README.md b/test/cli/handlers/contracts/README.md index 2ea44b4a..a961a3a7 100644 --- a/test/cli/handlers/contracts/README.md +++ b/test/cli/handlers/contracts/README.md @@ -1,6 +1,6 @@ # DataHaven Contracts Deployment -Deploy DataHaven AVS contracts to supported chains (Hoodi, Holesky, Mainnet). +Deploy DataHaven AVS contracts to supported chains (Hoodi, Mainnet). ## What Gets Deployed @@ -13,11 +13,9 @@ Deploy DataHaven AVS contracts to supported chains (Hoodi, Holesky, Mainnet). 1. **Account Setup**: Create or import an account in Metamask (you'll need the private key) 2. **Funding**: Get native tokens for deployment fees: - **Hoodi**: Use PoW Faucet at https://hoodi-faucet.pk910.de/#/mine/cc7df92c-9629-4ad8-aaa4-53b1e1c294e8 - - **Holesky**: Use public faucets or bridge from mainnet - **Mainnet**: Purchase ETH 3. **API Key** (optional): Generate API token from block explorer for contract verification: - Hoodi: Etherscan-compatible endpoint - - Holesky: https://holesky.etherscan.io/apis - Mainnet: https://etherscan.io/apis ## Setup @@ -45,11 +43,6 @@ ETHERSCAN_API_KEY=your_api_key_here bun cli contracts deploy --chain hoodi ``` -### Deploy to Holesky -```bash -bun cli contracts deploy --chain holesky -``` - ### Deploy to Mainnet ```bash bun cli contracts deploy --chain mainnet diff --git a/test/cli/handlers/contracts/deploy.ts b/test/cli/handlers/contracts/deploy.ts index d16daa79..4792fb0c 100644 --- a/test/cli/handlers/contracts/deploy.ts +++ b/test/cli/handlers/contracts/deploy.ts @@ -91,11 +91,11 @@ export const contractsPreActionHook = async (thisCommand: any) => { const privateKey = thisCommand.getOptionValue("privateKey"); if (!chain) { - logger.error("❌ Chain is required. Use --chain option (hoodi, holesky, mainnet, anvil)"); + logger.error("❌ Chain is required. Use --chain option (hoodi, mainnet, anvil)"); process.exit(1); } - const supportedChains = ["hoodi", "holesky", "mainnet", "anvil"]; + const supportedChains = ["hoodi", "mainnet", "anvil"]; if (!supportedChains.includes(chain)) { logger.error(`❌ Unsupported chain: ${chain}. Supported chains: ${supportedChains.join(", ")}`); process.exit(1); diff --git a/test/cli/index.ts b/test/cli/index.ts index 399e5cb3..79d31ff3 100644 --- a/test/cli/index.ts +++ b/test/cli/index.ts @@ -198,7 +198,7 @@ const contractsCommand = program - update-metadata: Update the metadata URI of an existing AVS contract Common options: - --chain: Target chain (required: hoodi, holesky, mainnet, anvil) + --chain: Target chain (required: hoodi, mainnet, anvil) --rpc-url: Chain RPC URL (optional, defaults based on chain) --private-key: Private key for deployment --skip-verification: Skip contract verification @@ -210,7 +210,7 @@ const contractsCommand = program contractsCommand .command("status") .description("Show deployment plan, configuration, and status") - .option("--chain ", "Target chain (hoodi, holesky, mainnet, anvil)") + .option("--chain ", "Target chain (hoodi, mainnet, anvil)") .option("--rpc-url ", "Chain RPC URL (optional, defaults based on chain)") .option( "--private-key ", @@ -225,7 +225,7 @@ contractsCommand contractsCommand .command("deploy") .description("Deploy DataHaven AVS contracts to specified chain") - .option("--chain ", "Target chain (hoodi, holesky, mainnet, anvil)") + .option("--chain ", "Target chain (hoodi, mainnet, anvil)") .option("--rpc-url ", "Chain RPC URL (optional, defaults based on chain)") .option( "--private-key ", @@ -240,7 +240,7 @@ contractsCommand contractsCommand .command("verify") .description("Verify deployed contracts on block explorer") - .option("--chain ", "Target chain (hoodi, holesky, mainnet, anvil)") + .option("--chain ", "Target chain (hoodi, mainnet, anvil)") .option("--rpc-url ", "Chain RPC URL (optional, defaults based on chain)") .option("--skip-verification", "Skip contract verification", false) .hook("preAction", contractsPreActionHook) @@ -250,7 +250,7 @@ contractsCommand contractsCommand .command("update-metadata") .description("Update AVS metadata URI for the DataHaven Service Manager") - .option("--chain ", "Target chain (hoodi, holesky, mainnet, anvil)") + .option("--chain ", "Target chain (hoodi, mainnet, anvil)") .option("--uri ", "New metadata URI (required)") .option("--reset", "Use if you want to reset the metadata URI") .option("--rpc-url ", "Chain RPC URL (optional, defaults based on chain)") @@ -278,7 +278,7 @@ contractsCommand // Default Contracts command (runs check) contractsCommand .description("Show deployment plan, configuration, and status") - .option("--chain ", "Target chain (hoodi, holesky, mainnet, anvil)") + .option("--chain ", "Target chain (hoodi, mainnet, anvil)") .option("--rpc-url ", "Chain RPC URL (optional, defaults based on chain)") .option( "--private-key ", diff --git a/test/configs/contracts/config.ts b/test/configs/contracts/config.ts index 30c0f85f..58017e30 100644 --- a/test/configs/contracts/config.ts +++ b/test/configs/contracts/config.ts @@ -14,16 +14,6 @@ export const CHAIN_CONFIGS = { EPOCHS_PER_SYNC_COMMITTEE_PERIOD: 256, SYNC_COMMITTEE_SIZE: 512 }, - holesky: { - NETWORK_NAME: "holesky", - CHAIN_ID: 17000, - RPC_URL: "https://ethereum-holesky-rpc.publicnode.com", - BLOCK_EXPLORER: "https://holesky.etherscan.io/", - GENESIS_TIME: 1695902400, - SLOT_TIME: 12, // seconds - EPOCHS_PER_SYNC_COMMITTEE_PERIOD: 256, - SYNC_COMMITTEE_SIZE: 512 - }, mainnet: { NETWORK_NAME: "mainnet", CHAIN_ID: 1,