refactor: Remove Holesky testnet support (#334)

This commit is contained in:
Ahmad Kaouk 2025-12-04 11:32:13 +01:00 committed by GitHub
parent 1ce068eebe
commit 49cf560c83
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 39 additions and 144 deletions

View file

@ -39,11 +39,11 @@ cd ../test && bun generate:wagmi
Deployment parameters (EigenLayer addresses, initial validators, owners) are defined in `contracts/config/<network>.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/<network>.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/<network>.json`.
Supported networks: `hoodi` (no mainnet config yet). Artifacts → `contracts/deployments/<network>.json`.
## How It Works
1. **Registration**: Validators register with EigenLayer via `DataHavenServiceManager`.

View file

@ -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"
]
}
}
}

View file

@ -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"
]
}
}

View file

@ -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"}

View file

@ -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}" }
# mainnet = { key = "${ETHERSCAN_API_KEY}" }

View file

@ -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";
}
}

View file

@ -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

View file

@ -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);

View file

@ -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 <value>", "Target chain (hoodi, holesky, mainnet, anvil)")
.option("--chain <value>", "Target chain (hoodi, mainnet, anvil)")
.option("--rpc-url <value>", "Chain RPC URL (optional, defaults based on chain)")
.option(
"--private-key <value>",
@ -225,7 +225,7 @@ contractsCommand
contractsCommand
.command("deploy")
.description("Deploy DataHaven AVS contracts to specified chain")
.option("--chain <value>", "Target chain (hoodi, holesky, mainnet, anvil)")
.option("--chain <value>", "Target chain (hoodi, mainnet, anvil)")
.option("--rpc-url <value>", "Chain RPC URL (optional, defaults based on chain)")
.option(
"--private-key <value>",
@ -240,7 +240,7 @@ contractsCommand
contractsCommand
.command("verify")
.description("Verify deployed contracts on block explorer")
.option("--chain <value>", "Target chain (hoodi, holesky, mainnet, anvil)")
.option("--chain <value>", "Target chain (hoodi, mainnet, anvil)")
.option("--rpc-url <value>", "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 <value>", "Target chain (hoodi, holesky, mainnet, anvil)")
.option("--chain <value>", "Target chain (hoodi, mainnet, anvil)")
.option("--uri <value>", "New metadata URI (required)")
.option("--reset", "Use if you want to reset the metadata URI")
.option("--rpc-url <value>", "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 <value>", "Target chain (hoodi, holesky, mainnet, anvil)")
.option("--chain <value>", "Target chain (hoodi, mainnet, anvil)")
.option("--rpc-url <value>", "Chain RPC URL (optional, defaults based on chain)")
.option(
"--private-key <value>",

View file

@ -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,