diff --git a/.gitmodules b/.gitmodules index 093c1942..68229d69 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,4 +5,7 @@ path = contracts/lib/eigenlayer-middleware url = https://github.com/Lay3rLabs/eigenlayer-middleware # This commit hash (3ea829d52c4a8cb1d26c9a6ac4807b87c70a1f47) corresponds to wavs-1.4 branch (based on tag v1.4.0-testnet-holesky) - branch = 3ea829d52c4a8cb1d26c9a6ac4807b87c70a1f47 \ No newline at end of file + branch = 3ea829d52c4a8cb1d26c9a6ac4807b87c70a1f47 +[submodule "contracts/lib/poa-middleware"] + path = contracts/lib/poa-middleware + url = https://github.com/Lay3rLabs/poa-middleware.git diff --git a/README.md b/README.md index 2569a01d..ea2a859a 100644 --- a/README.md +++ b/README.md @@ -351,6 +351,15 @@ docker run --rm --network host -v ./.nodes:/root/.nodes \ wavs-middleware -m mirror deploy ``` +For **POA (Proof of Authority)** deployments, set `IS_POA=true` and set `WAVS_SERVICE_MANAGER_ADDRESS` to the `POAStakeRegistry` address: + +```bash +docker run --rm --network host -v ./.nodes:/root/.nodes \ + -e IS_POA=true \ + -e WAVS_SERVICE_MANAGER_ADDRESS=${POA_STAKE_REGISTRY_ADDRESS} \ + wavs-middleware -m mirror deploy +``` + | Environment Variable | Required | Default | Source | Description | | ------------------------------ | --------------------- | ----------------------------- | ------------ | --------------------------------------------- | | `DEPLOY_ENV` | for non-default value | `LOCAL` | `.env` | Deployment environment (`LOCAL` or `TESTNET`) | @@ -358,6 +367,7 @@ docker run --rm --network host -v ./.nodes:/root/.nodes \ | `FUNDED_KEY` | if not mounted | From `.nodes/deployer` | Volume | Deployer private key | | `SOURCE_RPC_URL` | for non-default value | `http://localhost:8545` | Command line | RPC URL for source chain | | `MIRROR_RPC_URL` | for non-default value | `http://localhost:8546` | Command line | RPC URL for mirror chain | +| `IS_POA` | for POA deployments | `false` | Command line | Set to `true` for POA stake registries | ### List Mirror Operators @@ -598,20 +608,17 @@ sequenceDiagram - `execute_transaction`: Run a transaction and handle errors - `stop_impersonating`: Stop impersonating an account (LOCAL only) -### Instructions on getting Holesky ETH - -To get Holesky ETH for running on testnet: - -1. PoW Mining Faucet: +### Instructions on getting Sepolia ETH - - Go to https://holesky-faucet.pk910.de/ - - Connect your wallet - - Mine blocks in your browser to earn ETH - - Rewards based on mining time/hashrate - - No external requirements +To get Sepolia ETH for running on testnet: -2. Alchemy Faucet (Alternative): - - Visit https://www.alchemy.com/faucets/holesky +1. Alchemy Faucet: + - Visit https://www.alchemy.com/faucets/ethereum-sepolia - Requires mainnet ETH balance to use - Connect wallet and verify ownership - Request funds (limits apply) + +2. Google Cloud Faucet: + - Visit https://cloud.google.com/application/web3/faucet/ethereum/sepolia + - No requirements + - Request funds (limits apply) diff --git a/contracts/foundry.toml b/contracts/foundry.toml index 14f48e42..ce654282 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -11,6 +11,9 @@ optimizer = true optimizer_runs = 100 # Higher number optimizes for frequent contract calls, lower number optimizes for deployment cost +[profile.ci] +via-ir = false + [profile.bls] src = "src/eigenlayer/bls" test = "test/eigenlayer/bls" diff --git a/contracts/lib/poa-middleware b/contracts/lib/poa-middleware new file mode 160000 index 00000000..095670eb --- /dev/null +++ b/contracts/lib/poa-middleware @@ -0,0 +1 @@ +Subproject commit 095670eb3c206f0e6c8c6951f6b81e601f989b39 diff --git a/contracts/remappings.txt b/contracts/remappings.txt index 62ca3dec..c478d992 100644 --- a/contracts/remappings.txt +++ b/contracts/remappings.txt @@ -4,3 +4,4 @@ @openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/ @openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/ forge-std/=lib/forge-std/src/ +@poa-middleware/=lib/poa-middleware/contracts/ diff --git a/contracts/script/eigenlayer/bls/WavsMiddlewareDeployer.s.sol b/contracts/script/eigenlayer/bls/WavsMiddlewareDeployer.s.sol index 306af39c..eb429332 100644 --- a/contracts/script/eigenlayer/bls/WavsMiddlewareDeployer.s.sol +++ b/contracts/script/eigenlayer/bls/WavsMiddlewareDeployer.s.sol @@ -121,7 +121,7 @@ contract WavsMiddlewareDeployer is Script { } if ( address(registryCoordinator.serviceManager()) - != wavsMiddlewareDeployment.wavsServiceManager + != wavsMiddlewareDeployment.wavsServiceManager || address(registryCoordinator.stakeRegistry()) != wavsMiddlewareDeployment.stakeRegistry || address(registryCoordinator.blsApkRegistry()) @@ -130,7 +130,8 @@ contract WavsMiddlewareDeployer is Script { != wavsMiddlewareDeployment.indexRegistry || address(registryCoordinator.socketRegistry()) != wavsMiddlewareDeployment.socketRegistry - || address(registryCoordinator.allocationManager()) != coreDeployment.allocationManager + || address(registryCoordinator.allocationManager()) + != coreDeployment.allocationManager || address(registryCoordinator.pauserRegistry()) != wavsMiddlewareDeployment.pauserRegistry ) { diff --git a/contracts/script/eigenlayer/bls/utils/BLSKeyGenerator.sol b/contracts/script/eigenlayer/bls/utils/BLSKeyGenerator.sol index 7d785036..2de1eb0c 100644 --- a/contracts/script/eigenlayer/bls/utils/BLSKeyGenerator.sol +++ b/contracts/script/eigenlayer/bls/utils/BLSKeyGenerator.sol @@ -2,8 +2,9 @@ pragma solidity ^0.8.27; import {BN254} from "@eigenlayer-middleware/src/libraries/BN254.sol"; -import {ISlashingRegistryCoordinator} from - "@eigenlayer-middleware/src/interfaces/ISlashingRegistryCoordinator.sol"; +import { + ISlashingRegistryCoordinator +} from "@eigenlayer-middleware/src/interfaces/ISlashingRegistryCoordinator.sol"; import {IBLSApkRegistryTypes} from "@eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {BN256G2} from "@eigenlayer-middleware/test/utils/BN256G2.sol"; @@ -55,9 +56,7 @@ library BLSKeyGenerator { BN254.G1Point memory signature = BN254.scalar_mul(pubkeyRegistrationMessageHash, privateKey); params = IBLSApkRegistryTypes.PubkeyRegistrationParams({ - pubkeyRegistrationSignature: signature, - pubkeyG1: pubkeyG1, - pubkeyG2: pubkeyG2 + pubkeyRegistrationSignature: signature, pubkeyG1: pubkeyG1, pubkeyG2: pubkeyG2 }); } } diff --git a/contracts/script/eigenlayer/bls/utils/UpgradeableProxyLib.sol b/contracts/script/eigenlayer/bls/utils/UpgradeableProxyLib.sol index 02a5056a..ea505068 100644 --- a/contracts/script/eigenlayer/bls/utils/UpgradeableProxyLib.sol +++ b/contracts/script/eigenlayer/bls/utils/UpgradeableProxyLib.sol @@ -48,7 +48,10 @@ library UpgradeableProxyLib { * @param proxy The proxy address. * @param impl The implementation address. */ - function upgrade(address proxy, address impl) internal { + function upgrade( + address proxy, + address impl + ) internal { ProxyAdmin admin = getProxyAdmin(proxy); admin.upgrade(ITransparentUpgradeableProxy(payable(proxy)), impl); } @@ -59,7 +62,11 @@ library UpgradeableProxyLib { * @param impl The implementation address. * @param initData The initialization data. */ - function upgradeAndCall(address proxy, address impl, bytes memory initData) internal { + function upgradeAndCall( + address proxy, + address impl, + bytes memory initData + ) internal { ProxyAdmin admin = getProxyAdmin(proxy); admin.upgradeAndCall(ITransparentUpgradeableProxy(payable(proxy)), impl, initData); } diff --git a/contracts/script/eigenlayer/bls/utils/WavsMiddlewareDeploymentLib.sol b/contracts/script/eigenlayer/bls/utils/WavsMiddlewareDeploymentLib.sol index c9137b8c..689ce389 100644 --- a/contracts/script/eigenlayer/bls/utils/WavsMiddlewareDeploymentLib.sol +++ b/contracts/script/eigenlayer/bls/utils/WavsMiddlewareDeploymentLib.sol @@ -10,8 +10,9 @@ import {BLSApkRegistry} from "@eigenlayer-middleware/src/BLSApkRegistry.sol"; import {IndexRegistry} from "@eigenlayer-middleware/src/IndexRegistry.sol"; import {SocketRegistry} from "@eigenlayer-middleware/src/SocketRegistry.sol"; import {RegistryCoordinator} from "@eigenlayer-middleware/src/RegistryCoordinator.sol"; -import {SlashingRegistryCoordinator} from - "@eigenlayer-middleware/src/SlashingRegistryCoordinator.sol"; +import { + SlashingRegistryCoordinator +} from "@eigenlayer-middleware/src/SlashingRegistryCoordinator.sol"; import {InstantSlasher} from "@eigenlayer-middleware/src/slashers/InstantSlasher.sol"; import {OperatorStateRetriever} from "@eigenlayer-middleware/src/OperatorStateRetriever.sol"; @@ -23,8 +24,9 @@ import {IBLSApkRegistry} from "@eigenlayer-middleware/src/interfaces/IBLSApkRegi import {IIndexRegistry} from "@eigenlayer-middleware/src/interfaces/IIndexRegistry.sol"; import {ISocketRegistry} from "@eigenlayer-middleware/src/interfaces/ISocketRegistry.sol"; import {IServiceManager} from "@eigenlayer-middleware/src/interfaces/IServiceManager.sol"; -import {IRegistryCoordinatorTypes} from - "@eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol"; +import { + IRegistryCoordinatorTypes +} from "@eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol"; import { ISlashingRegistryCoordinator, ISlashingRegistryCoordinatorTypes @@ -232,9 +234,7 @@ library WavsMiddlewareDeploymentLib { ISlashingRegistryCoordinator(deployment.registryCoordinator); slashingRegistryCoordinator.createSlashableStakeQuorum( ISlashingRegistryCoordinatorTypes.OperatorSetParam({ - maxOperatorCount: 10_000, - kickBIPsOfOperatorStake: 10_500, - kickBIPsOfTotalStake: 100 + maxOperatorCount: 10_000, kickBIPsOfOperatorStake: 10_500, kickBIPsOfTotalStake: 100 }), minimumWeight, strategyParams, @@ -278,8 +278,7 @@ library WavsMiddlewareDeploymentLib { new IStakeRegistryTypes.StrategyParams[](strategyCount); for (uint256 i; i < strategyCount; ++i) { strategyParams[i] = IStakeRegistryTypes.StrategyParams({ - strategy: IStrategy(strategies[i]), - multiplier: multipliers[i] + strategy: IStrategy(strategies[i]), multiplier: multipliers[i] }); } diff --git a/contracts/script/eigenlayer/bls/utils/WavsRegisterOperatorLib.sol b/contracts/script/eigenlayer/bls/utils/WavsRegisterOperatorLib.sol index e507ed2a..5b6315da 100644 --- a/contracts/script/eigenlayer/bls/utils/WavsRegisterOperatorLib.sol +++ b/contracts/script/eigenlayer/bls/utils/WavsRegisterOperatorLib.sol @@ -80,8 +80,8 @@ library WavsRegisterOperatorLib { opSetIds[0] = 0; BN254.G1Point memory pubkeyRegistrationMessageHash = ISlashingRegistryCoordinator( - WavsServiceManager(serviceManagerAddress).getRegistryCoordinator() - ).pubkeyRegistrationMessageHash(operatorAddr); + WavsServiceManager(serviceManagerAddress).getRegistryCoordinator() + ).pubkeyRegistrationMessageHash(operatorAddr); IBLSApkRegistryTypes.PubkeyRegistrationParams memory blsParams = BLSKeyGenerator.generateBLSParams(pubkeyRegistrationMessageHash, operatorKey); @@ -89,8 +89,10 @@ library WavsRegisterOperatorLib { bytes memory data = abi.encode( ISlashingRegistryCoordinatorTypes.RegistrationType.NORMAL, "Mock Socket", blsParams ); - IAllocationManagerTypes.RegisterParams memory params = IAllocationManagerTypes - .RegisterParams({avs: serviceManagerAddress, operatorSetIds: opSetIds, data: data}); + IAllocationManagerTypes.RegisterParams memory params = + IAllocationManagerTypes.RegisterParams({ + avs: serviceManagerAddress, operatorSetIds: opSetIds, data: data + }); allocationManager.registerForOperatorSets(operatorAddr, params); diff --git a/contracts/script/eigenlayer/ecdsa/WavsMiddlewareDeployer.s.sol b/contracts/script/eigenlayer/ecdsa/WavsMiddlewareDeployer.s.sol index 3f9b498e..e5fbbf53 100644 --- a/contracts/script/eigenlayer/ecdsa/WavsMiddlewareDeployer.s.sol +++ b/contracts/script/eigenlayer/ecdsa/WavsMiddlewareDeployer.s.sol @@ -2,8 +2,9 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; -import {IECDSAStakeRegistryTypes} from - "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; +import { + IECDSAStakeRegistryTypes +} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; import {WavsMiddlewareDeploymentLib} from "./utils/WavsMiddlewareDeploymentLib.sol"; import {ReadCoreLib} from "./utils/ReadCoreLib.sol"; diff --git a/contracts/script/eigenlayer/ecdsa/WavsMirrorDeployer.s.sol b/contracts/script/eigenlayer/ecdsa/WavsMirrorDeployer.s.sol index 47eb4c84..01d56a8f 100644 --- a/contracts/script/eigenlayer/ecdsa/WavsMirrorDeployer.s.sol +++ b/contracts/script/eigenlayer/ecdsa/WavsMirrorDeployer.s.sol @@ -3,8 +3,9 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; import {console2} from "forge-std/Test.sol"; -import {IECDSAStakeRegistryTypes} from - "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; +import { + IECDSAStakeRegistryTypes +} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; import {WavsMirrorDeploymentLib} from "./utils/WavsMirrorDeploymentLib.sol"; import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; diff --git a/contracts/script/eigenlayer/ecdsa/WavsMirrorPrepareDeploy.s.sol b/contracts/script/eigenlayer/ecdsa/WavsMirrorPrepareDeploy.s.sol index 36ca0bac..bf0f8850 100644 --- a/contracts/script/eigenlayer/ecdsa/WavsMirrorPrepareDeploy.s.sol +++ b/contracts/script/eigenlayer/ecdsa/WavsMirrorPrepareDeploy.s.sol @@ -2,8 +2,9 @@ pragma solidity ^0.8.27; import {Script} from "forge-std/Script.sol"; -import {IECDSAStakeRegistryTypes} from - "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; +import { + IECDSAStakeRegistryTypes +} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; import {WavsMirrorDeploymentLib} from "./utils/WavsMirrorDeploymentLib.sol"; import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; @@ -19,15 +20,19 @@ contract WavsMirrorPrepareDeploy is Script, IECDSAStakeRegistryTypes { /// @notice The environment variable for the WAVS service manager contract address. string public constant ENV_SERVICE_MANAGER = "WAVS_SERVICE_MANAGER_ADDRESS"; + /// @notice The environment variable to indicate POA deployment. + string public constant ENV_IS_POA = "IS_POA"; string private configFile; address private serviceManagerAddress; + bool private isPOA; /// @notice The setup function for the script. function setUp() public virtual { // read env vars configFile = "./deployments/wavs-mirror-config.json"; serviceManagerAddress = vm.envAddress(ENV_SERVICE_MANAGER); + isPOA = vm.envOr(ENV_IS_POA, false); } /// @notice The run function for the script. @@ -36,7 +41,7 @@ contract WavsMirrorPrepareDeploy is Script, IECDSAStakeRegistryTypes { // Pass in the configuration as a file, load it WavsMirrorDeploymentLib.InitialConfiguration memory configuration = - WavsMirrorDeploymentLib.loadConfigurationFromChain(serviceManagerAddress); + WavsMirrorDeploymentLib.loadConfigurationFromChain(serviceManagerAddress, isPOA); // write the configuration to a file WavsMirrorDeploymentLib.writeConfiguration(configFile, configuration); diff --git a/contracts/script/eigenlayer/ecdsa/utils/UpgradeableProxyLib.sol b/contracts/script/eigenlayer/ecdsa/utils/UpgradeableProxyLib.sol index 42bf3021..a683f105 100644 --- a/contracts/script/eigenlayer/ecdsa/utils/UpgradeableProxyLib.sol +++ b/contracts/script/eigenlayer/ecdsa/utils/UpgradeableProxyLib.sol @@ -48,7 +48,10 @@ library UpgradeableProxyLib { * @param proxy The proxy address. * @param impl The implementation address. */ - function upgrade(address proxy, address impl) internal { + function upgrade( + address proxy, + address impl + ) internal { ProxyAdmin admin = getProxyAdmin(proxy); admin.upgrade(ITransparentUpgradeableProxy(payable(proxy)), impl); } @@ -59,7 +62,11 @@ library UpgradeableProxyLib { * @param impl The implementation address. * @param initData The initialization data. */ - function upgradeAndCall(address proxy, address impl, bytes memory initData) internal { + function upgradeAndCall( + address proxy, + address impl, + bytes memory initData + ) internal { ProxyAdmin admin = getProxyAdmin(proxy); admin.upgradeAndCall(ITransparentUpgradeableProxy(payable(proxy)), impl, initData); } diff --git a/contracts/script/eigenlayer/ecdsa/utils/WavsMiddlewareDeploymentLib.sol b/contracts/script/eigenlayer/ecdsa/utils/WavsMiddlewareDeploymentLib.sol index f58ceb49..328c333b 100644 --- a/contracts/script/eigenlayer/ecdsa/utils/WavsMiddlewareDeploymentLib.sol +++ b/contracts/script/eigenlayer/ecdsa/utils/WavsMiddlewareDeploymentLib.sol @@ -18,8 +18,9 @@ import {UpgradeableProxyLib} from "./UpgradeableProxyLib.sol"; import {WavsServiceManager} from "src/eigenlayer/ecdsa/WavsServiceManager.sol"; import {ReadCoreLib} from "./ReadCoreLib.sol"; import {WavsAVSRegistrar} from "src/eigenlayer/ecdsa/WavsAVSRegistrar.sol"; -import {WavsOperatorUpdateHandler} from - "src/eigenlayer/ecdsa/handlers/WavsOperatorUpdateHandler.sol"; +import { + WavsOperatorUpdateHandler +} from "src/eigenlayer/ecdsa/handlers/WavsOperatorUpdateHandler.sol"; /** * @title WavsMiddlewareDeploymentLib @@ -165,8 +166,10 @@ library WavsMiddlewareDeploymentLib { // If op set only allows one strategy, why do we need 12 registered with multipliers in the quorum? // Suggestion - use same both for opset and for initialize. But which one (or both)? // ECDSAStakeRegistry.initialize, (result.WavsServiceManager, 100, quorum) // TODO: dynamically update threshold (?) - IAllocationManagerTypes.CreateSetParams memory opSetParams = IAllocationManagerTypes - .CreateSetParams({operatorSetId: 0, strategies: new IStrategy[](1)}); + IAllocationManagerTypes.CreateSetParams memory opSetParams = + IAllocationManagerTypes.CreateSetParams({ + operatorSetId: 0, strategies: new IStrategy[](1) + }); opSetParams.strategies[0] = IStrategy(deployment.strategy); IAllocationManagerTypes.CreateSetParams[] memory opSetParamsArray = new IAllocationManagerTypes.CreateSetParams[](1); @@ -203,8 +206,7 @@ library WavsMiddlewareDeploymentLib { for (uint256 i = 0; i < size; ++i) { totalMultiplier += multipliers[i]; quorum.strategies[i] = IECDSAStakeRegistryTypes.StrategyParams({ - strategy: IStrategy(strategies[i]), - multiplier: multipliers[i] + strategy: IStrategy(strategies[i]), multiplier: multipliers[i] }); } if (totalMultiplier != 10_000) { diff --git a/contracts/script/eigenlayer/ecdsa/utils/WavsMirrorDeploymentLib.sol b/contracts/script/eigenlayer/ecdsa/utils/WavsMirrorDeploymentLib.sol index be89f5c6..accdbf68 100644 --- a/contracts/script/eigenlayer/ecdsa/utils/WavsMirrorDeploymentLib.sol +++ b/contracts/script/eigenlayer/ecdsa/utils/WavsMirrorDeploymentLib.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.27; import {console2} from "forge-std/Test.sol"; -import {Vm} from "forge-std/Vm.sol"; +import {Vm, VmSafe} from "forge-std/Vm.sol"; import {stdJson} from "forge-std/StdJson.sol"; import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; import {IAllocationManager} from "@eigenlayer/contracts/interfaces/IAllocationManager.sol"; @@ -14,9 +14,12 @@ import { import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {IPOAStakeRegistry} from "@poa-middleware/src/ecdsa/interfaces/IPOAStakeRegistry.sol"; +import {IWavsServiceManager} from "src/eigenlayer/ecdsa/interfaces/IWavsServiceManager.sol"; import {MirrorStakeRegistry} from "src/eigenlayer/ecdsa/MirrorStakeRegistry.sol"; -import {MirrorOperatorSyncHandler} from - "src/eigenlayer/ecdsa/handlers/MirrorOperatorSyncHandler.sol"; +import { + MirrorOperatorSyncHandler +} from "src/eigenlayer/ecdsa/handlers/MirrorOperatorSyncHandler.sol"; import {MirrorQuorumSyncHandler} from "src/eigenlayer/ecdsa/handlers/MirrorQuorumSyncHandler.sol"; import {WavsServiceManager} from "src/eigenlayer/ecdsa/WavsServiceManager.sol"; import {UpgradeableProxyLib} from "./UpgradeableProxyLib.sol"; @@ -94,11 +97,11 @@ library WavsMirrorDeploymentLib { // use an mock quorum so checks pass, we don't use it internally IStrategy mockStrategyInstance = IStrategy(address(1)); // Using address(1) instead of address(0) - IECDSAStakeRegistryTypes.StrategyParams memory strategyParams = IECDSAStakeRegistryTypes - .StrategyParams({ - strategy: mockStrategyInstance, - multiplier: 10_000 // 100% in basis points - }); + IECDSAStakeRegistryTypes.StrategyParams memory strategyParams = + IECDSAStakeRegistryTypes.StrategyParams({ + strategy: mockStrategyInstance, + multiplier: 10_000 // 100% in basis points + }); IECDSAStakeRegistryTypes.StrategyParams[] memory strategies = new IECDSAStakeRegistryTypes.StrategyParams[](1); strategies[0] = strategyParams; @@ -258,38 +261,111 @@ library WavsMirrorDeploymentLib { /** * @notice The load configuration from chain function. * @param serviceManagerAddress The service manager address. + * @param isPOA Whether this is a POA deployment. * @return cfg The initial configuration. */ function loadConfigurationFromChain( - address serviceManagerAddress - ) internal view returns (WavsMirrorDeploymentLib.InitialConfiguration memory) { - WavsServiceManager serviceManager = WavsServiceManager(serviceManagerAddress); - ECDSAStakeRegistry stakeRegistry = ECDSAStakeRegistry(serviceManager.stakeRegistry()); - + address serviceManagerAddress, + bool isPOA + ) internal returns (WavsMirrorDeploymentLib.InitialConfiguration memory) { WavsMirrorDeploymentLib.InitialConfiguration memory cfg; - // get config values - cfg.thresholdWeight = stakeRegistry.getLastCheckpointThresholdWeight(); - cfg.quorumNumerator = serviceManager.quorumNumerator(); - cfg.quorumDenominator = serviceManager.quorumDenominator(); - - // get operators - IAllocationManager allocationManager = - IAllocationManager(serviceManager.getAllocationManager()); - OperatorSet memory opSetQuery = OperatorSet({avs: serviceManagerAddress, id: 0}); - cfg.operators = allocationManager.getMembers(opSetQuery); - - // get operator info - cfg.signingKeyAddresses = new address[](cfg.operators.length); - cfg.weights = new uint256[](cfg.operators.length); - for (uint256 i = 0; i < cfg.operators.length; ++i) { - cfg.signingKeyAddresses[i] = stakeRegistry.getLatestOperatorSigningKey(cfg.operators[i]); - cfg.weights[i] = stakeRegistry.getOperatorWeight(cfg.operators[i]); + if (isPOA) { + // For POA, serviceManagerAddress IS the POAStakeRegistry + // (it implements both IPOAStakeRegistry and IWavsServiceManager) + IPOAStakeRegistry poaRegistry = IPOAStakeRegistry(serviceManagerAddress); + + cfg.thresholdWeight = poaRegistry.getLastCheckpointThresholdWeight(); + (cfg.quorumNumerator, cfg.quorumDenominator) = poaRegistry.getLastCheckpointQuorum(); + + // Get operators from POA events + cfg.operators = loadOperatorsFromPOAEvents(serviceManagerAddress); + + // Get operator signing keys and weights + cfg.signingKeyAddresses = new address[](cfg.operators.length); + cfg.weights = new uint256[](cfg.operators.length); + for (uint256 i = 0; i < cfg.operators.length; ++i) { + cfg.signingKeyAddresses[i] = + poaRegistry.getLatestOperatorSigningKey(cfg.operators[i]); + cfg.weights[i] = + IWavsServiceManager(serviceManagerAddress).getOperatorWeight(cfg.operators[i]); + } + } else { + // EigenLayer mode + WavsServiceManager serviceManager = WavsServiceManager(serviceManagerAddress); + ECDSAStakeRegistry stakeRegistry = ECDSAStakeRegistry(serviceManager.stakeRegistry()); + + cfg.thresholdWeight = stakeRegistry.getLastCheckpointThresholdWeight(); + cfg.quorumNumerator = serviceManager.quorumNumerator(); + cfg.quorumDenominator = serviceManager.quorumDenominator(); + + address allocationManagerAddr = serviceManager.getAllocationManager(); + IAllocationManager allocationManager = IAllocationManager(allocationManagerAddr); + OperatorSet memory opSetQuery = OperatorSet({avs: serviceManagerAddress, id: 0}); + cfg.operators = allocationManager.getMembers(opSetQuery); + + cfg.signingKeyAddresses = new address[](cfg.operators.length); + cfg.weights = new uint256[](cfg.operators.length); + for (uint256 i = 0; i < cfg.operators.length; ++i) { + cfg.signingKeyAddresses[i] = + stakeRegistry.getLatestOperatorSigningKey(cfg.operators[i]); + cfg.weights[i] = stakeRegistry.getOperatorWeight(cfg.operators[i]); + } } return cfg; } + /** + * @notice Loads operators from POA stake registry by querying OperatorRegistered events + * @param stakeRegistryAddress The stake registry address + * @return operators Array of unique operator addresses + */ + function loadOperatorsFromPOAEvents( + address stakeRegistryAddress + ) internal returns (address[] memory operators) { + bytes32[] memory topics = new bytes32[](1); + topics[0] = keccak256("OperatorRegistered(address)"); + + uint256 fromBlock = block.number > 5000 ? block.number - 5000 : 0; + VmSafe.EthGetLogs[] memory logs = + VM.eth_getLogs(fromBlock, block.number, stakeRegistryAddress, topics); + + address[] memory tempOperators = new address[](logs.length); + uint256 count = 0; + + for (uint256 i = 0; i < logs.length; i++) { + // Ensure the operator address topic exists before accessing it + if (logs[i].topics.length <= 1) { + // Skip logs that do not have the expected indexed operator address + continue; + } + + address operator = address(uint160(uint256(logs[i].topics[1]))); + + bool found = false; + for (uint256 j = 0; j < count; j++) { + if (tempOperators[j] == operator) { + found = true; + break; + } + } + + if (!found) { + tempOperators[count] = operator; + count++; + } + } + + // Create properly sized array + operators = new address[](count); + for (uint256 i = 0; i < count; i++) { + operators[i] = tempOperators[i]; + } + + return operators; + } + /** * @notice The read deployment JSON function. * @param chainId The chain ID. diff --git a/contracts/script/eigenlayer/ecdsa/utils/WavsMockDeploymentLib.sol b/contracts/script/eigenlayer/ecdsa/utils/WavsMockDeploymentLib.sol index d0f75a0f..c3295112 100644 --- a/contracts/script/eigenlayer/ecdsa/utils/WavsMockDeploymentLib.sol +++ b/contracts/script/eigenlayer/ecdsa/utils/WavsMockDeploymentLib.sol @@ -84,11 +84,11 @@ library WavsMockDeploymentLib { // use an mock quorum so checks pass, we don't use it internally IStrategy mockStrategyInstance = IStrategy(address(1)); // Using address(1) instead of address(0) - IECDSAStakeRegistryTypes.StrategyParams memory strategyParams = IECDSAStakeRegistryTypes - .StrategyParams({ - strategy: mockStrategyInstance, - multiplier: 10_000 // 100% in basis points - }); + IECDSAStakeRegistryTypes.StrategyParams memory strategyParams = + IECDSAStakeRegistryTypes.StrategyParams({ + strategy: mockStrategyInstance, + multiplier: 10_000 // 100% in basis points + }); IECDSAStakeRegistryTypes.StrategyParams[] memory strategies = new IECDSAStakeRegistryTypes.StrategyParams[](1); strategies[0] = strategyParams; @@ -196,7 +196,10 @@ library WavsMockDeploymentLib { * @param data The deployment data. * @param fileName The file name. */ - function writeDeploymentJson(DeploymentData memory data, string memory fileName) internal { + function writeDeploymentJson( + DeploymentData memory data, + string memory fileName + ) internal { address proxyAdmin = address(UpgradeableProxyLib.getProxyAdmin(data.wavsServiceManager)); string memory deploymentData = _generateDeploymentJson(data, proxyAdmin); diff --git a/contracts/script/eigenlayer/ecdsa/utils/WavsRegisterOperatorLib.sol b/contracts/script/eigenlayer/ecdsa/utils/WavsRegisterOperatorLib.sol index 0b9bb66c..0aebc4f1 100644 --- a/contracts/script/eigenlayer/ecdsa/utils/WavsRegisterOperatorLib.sol +++ b/contracts/script/eigenlayer/ecdsa/utils/WavsRegisterOperatorLib.sol @@ -112,7 +112,10 @@ library WavsRegisterOperatorLib { * @param serviceManagerAddress The WAVS service manager address. * @param signingKeyAddress The signing key address. */ - function registerToAvs(address serviceManagerAddress, address signingKeyAddress) internal { + function registerToAvs( + address serviceManagerAddress, + address signingKeyAddress + ) internal { WavsServiceManager serviceManager = WavsServiceManager(serviceManagerAddress); ECDSAStakeRegistry stakeRegistry = ECDSAStakeRegistry(serviceManager.stakeRegistry()); @@ -129,8 +132,10 @@ library WavsRegisterOperatorLib { opSetIds[0] = 0; // TODO: change this arbitrary code? bytes memory secretCode = bytes("0x1234"); - IAllocationManagerTypes.RegisterParams memory params = IAllocationManagerTypes - .RegisterParams({avs: serviceManagerAddress, operatorSetIds: opSetIds, data: secretCode}); + IAllocationManagerTypes.RegisterParams memory params = + IAllocationManagerTypes.RegisterParams({ + avs: serviceManagerAddress, operatorSetIds: opSetIds, data: secretCode + }); allocationManager.registerForOperatorSets(operatorAddr, params); console2.log("Successfully registered operator %s to operator sets [0]", operatorAddr); @@ -172,11 +177,9 @@ library WavsRegisterOperatorLib { console2.log("Registering operator with signature..."); ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature = - ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ - signature: signature, - salt: salt, - expiry: expiry - }); + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ + signature: signature, salt: salt, expiry: expiry + }); stakeRegistry.registerOperatorWithSignature(operatorSignature, signingKeyAddress); console2.log( @@ -210,12 +213,10 @@ library WavsRegisterOperatorLib { if (allocationManager.isMemberOfOperatorSet(operatorAddr, opSetQuery)) { uint32[] memory opSetIds = new uint32[](1); opSetIds[0] = 0; - IAllocationManagerTypes.DeregisterParams memory params = IAllocationManagerTypes - .DeregisterParams({ - operator: operatorAddr, - avs: serviceManagerAddress, - operatorSetIds: opSetIds - }); + IAllocationManagerTypes.DeregisterParams memory params = + IAllocationManagerTypes.DeregisterParams({ + operator: operatorAddr, avs: serviceManagerAddress, operatorSetIds: opSetIds + }); allocationManager.deregisterFromOperatorSets(params); console2.log( diff --git a/contracts/src/eigenlayer/bls/WavsServiceManager.sol b/contracts/src/eigenlayer/bls/WavsServiceManager.sol index 516f94c1..55f7e6e7 100644 --- a/contracts/src/eigenlayer/bls/WavsServiceManager.sol +++ b/contracts/src/eigenlayer/bls/WavsServiceManager.sol @@ -4,8 +4,9 @@ pragma solidity ^0.8.27; import {ServiceManagerBase} from "@eigenlayer-middleware/src/ServiceManagerBase.sol"; import {IAVSDirectory} from "@eigenlayer/contracts/interfaces/IAVSDirectory.sol"; import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; -import {ISlashingRegistryCoordinator} from - "@eigenlayer-middleware/src/interfaces/ISlashingRegistryCoordinator.sol"; +import { + ISlashingRegistryCoordinator +} from "@eigenlayer-middleware/src/interfaces/ISlashingRegistryCoordinator.sol"; import {IStakeRegistry} from "@eigenlayer-middleware/src/interfaces/IStakeRegistry.sol"; import {IPermissionController} from "@eigenlayer/contracts/interfaces/IPermissionController.sol"; import {IAllocationManager} from "@eigenlayer/contracts/interfaces/IAllocationManager.sol"; @@ -60,7 +61,10 @@ contract WavsServiceManager is ServiceManagerBase, IWavsServiceManager { * @param initialOwner The initial owner of the contract * @param rewardsInitiator The address of the rewards initiator */ - function initialize(address initialOwner, address rewardsInitiator) external initializer { + function initialize( + address initialOwner, + address rewardsInitiator + ) external initializer { __ServiceManagerBase_init(initialOwner, rewardsInitiator); quorumNumerator = 2; @@ -91,7 +95,10 @@ contract WavsServiceManager is ServiceManagerBase, IWavsServiceManager { } /// @inheritdoc IWavsServiceManager - function setQuorumThreshold(uint256 numerator, uint256 denominator) external onlyOwner { + function setQuorumThreshold( + uint256 numerator, + uint256 denominator + ) external onlyOwner { if (numerator == 0) { revert InvalidQuorumParameters(); } diff --git a/contracts/src/eigenlayer/bls/interfaces/IWavsServiceManager.sol b/contracts/src/eigenlayer/bls/interfaces/IWavsServiceManager.sol index 4c439d71..a0b8a501 100644 --- a/contracts/src/eigenlayer/bls/interfaces/IWavsServiceManager.sol +++ b/contracts/src/eigenlayer/bls/interfaces/IWavsServiceManager.sol @@ -47,7 +47,10 @@ interface IWavsServiceManager { * @dev The fraction numerator/denominator represents the minimum portion of stake * required for a valid signature (e.g., 2/3 or 51/100) */ - function setQuorumThreshold(uint256 numerator, uint256 denominator) external; + function setQuorumThreshold( + uint256 numerator, + uint256 denominator + ) external; /** * @notice Returns the address of the registry coordinator. diff --git a/contracts/src/eigenlayer/ecdsa/MirrorStakeRegistry.sol b/contracts/src/eigenlayer/ecdsa/MirrorStakeRegistry.sol index 6c25df98..3211ab47 100644 --- a/contracts/src/eigenlayer/ecdsa/MirrorStakeRegistry.sol +++ b/contracts/src/eigenlayer/ecdsa/MirrorStakeRegistry.sol @@ -1,16 +1,19 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {IDelegationManager} from - "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import { + IDelegationManager +} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; import { ECDSAStakeRegistry, IECDSAStakeRegistryTypes } from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; -import {ISignatureUtilsMixinTypes} from - "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; -import {CheckpointsUpgradeable} from - "@openzeppelin-upgrades/contracts/utils/CheckpointsUpgradeable.sol"; +import { + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; +import { + CheckpointsUpgradeable +} from "@openzeppelin-upgrades/contracts/utils/CheckpointsUpgradeable.sol"; /** * @title Mirror Stake Registry diff --git a/contracts/src/eigenlayer/ecdsa/WavsServiceManager.sol b/contracts/src/eigenlayer/ecdsa/WavsServiceManager.sol index 75d4202a..c78936d0 100644 --- a/contracts/src/eigenlayer/ecdsa/WavsServiceManager.sol +++ b/contracts/src/eigenlayer/ecdsa/WavsServiceManager.sol @@ -1,11 +1,13 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.27; -import {ECDSAServiceManagerBase} from - "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; +import { + ECDSAServiceManagerBase +} from "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; -import {IECDSAStakeRegistry} from - "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistryStorage.sol"; +import { + IECDSAStakeRegistry +} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistryStorage.sol"; import {IServiceManager} from "@eigenlayer-middleware/src/interfaces/IServiceManager.sol"; import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; import { @@ -14,10 +16,12 @@ import { } from "@eigenlayer/contracts/interfaces/IAllocationManager.sol"; import {ISignatureUtilsMixinTypes} from "@eigenlayer/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; -import {ECDSAUpgradeable} from - "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; -import {IERC1271Upgradeable} from - "@openzeppelin-upgrades/contracts/interfaces/IERC1271Upgradeable.sol"; +import { + ECDSAUpgradeable +} from "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; +import { + IERC1271Upgradeable +} from "@openzeppelin-upgrades/contracts/interfaces/IERC1271Upgradeable.sol"; import {IWavsServiceManager} from "./interfaces/IWavsServiceManager.sol"; import {IWavsServiceHandler} from "./interfaces/IWavsServiceHandler.sol"; @@ -67,7 +71,10 @@ contract WavsServiceManager is ECDSAServiceManagerBase, IWavsServiceManager { * @param _initialOwner The initial owner of the service manager * @param _rewardsInitiator The rewards initiator of the service manager */ - function initialize(address _initialOwner, address _rewardsInitiator) public initializer { + function initialize( + address _initialOwner, + address _rewardsInitiator + ) public initializer { __ServiceManagerBase_init(_initialOwner, _rewardsInitiator); quorumNumerator = 2; quorumDenominator = 3; @@ -99,9 +106,8 @@ contract WavsServiceManager is ECDSAServiceManagerBase, IWavsServiceManager { uint32 operatorSetId, IStrategy[] calldata strategies ) external onlyOwner { - IAllocationManager(allocationManager).addStrategiesToOperatorSet( - address(this), operatorSetId, strategies - ); + IAllocationManager(allocationManager) + .addStrategiesToOperatorSet(address(this), operatorSetId, strategies); } /** @@ -113,9 +119,8 @@ contract WavsServiceManager is ECDSAServiceManagerBase, IWavsServiceManager { uint32 operatorSetId, IStrategy[] calldata strategies ) external onlyOwner { - IAllocationManager(allocationManager).removeStrategiesFromOperatorSet( - address(this), operatorSetId, strategies - ); + IAllocationManager(allocationManager) + .removeStrategiesFromOperatorSet(address(this), operatorSetId, strategies); } /** @@ -260,9 +265,8 @@ contract WavsServiceManager is ECDSAServiceManagerBase, IWavsServiceManager { // Check signature validity if ( magicValue - != ECDSAStakeRegistry(stakeRegistry).isValidSignature( - ethSignedMessageHash, signatureDataBytes - ) + != ECDSAStakeRegistry(stakeRegistry) + .isValidSignature(ethSignedMessageHash, signatureDataBytes) ) { revert IWavsServiceManager.InvalidSignature(); } @@ -274,8 +278,9 @@ contract WavsServiceManager is ECDSAServiceManagerBase, IWavsServiceManager { address operator = registry.getOperatorForSigningKeyAtBlock( signatureData.signers[i], signatureData.referenceBlock ); - signedWeight += - registry.getOperatorWeightAtBlock(operator, signatureData.referenceBlock); + signedWeight += registry.getOperatorWeightAtBlock( + operator, signatureData.referenceBlock + ); } uint256 totalWeight = @@ -291,7 +296,10 @@ contract WavsServiceManager is ECDSAServiceManagerBase, IWavsServiceManager { * @param totalWeight The total weight of all operators * @dev Requires at least quorumNumerator/quorumDenominator of the total weight to have signed */ - function _validateQuorumSigned(uint256 signedWeight, uint256 totalWeight) internal view { + function _validateQuorumSigned( + uint256 signedWeight, + uint256 totalWeight + ) internal view { // Avoid 0 weight ever passing this check if (totalWeight == 0) { revert IWavsServiceManager.InsufficientQuorumZero(); @@ -315,7 +323,10 @@ contract WavsServiceManager is ECDSAServiceManagerBase, IWavsServiceManager { * @dev The fraction numerator/denominator represents the minimum portion of stake * required for a valid signature (e.g., 2/3 or 51/100) */ - function setQuorumThreshold(uint256 numerator, uint256 denominator) external onlyOwner { + function setQuorumThreshold( + uint256 numerator, + uint256 denominator + ) external onlyOwner { if (numerator == 0) { revert IWavsServiceManager.InvalidQuorumParameters(); } diff --git a/contracts/src/eigenlayer/ecdsa/handlers/WavsOperatorUpdateHandler.sol b/contracts/src/eigenlayer/ecdsa/handlers/WavsOperatorUpdateHandler.sol index 31f344df..10ebbf13 100644 --- a/contracts/src/eigenlayer/ecdsa/handlers/WavsOperatorUpdateHandler.sol +++ b/contracts/src/eigenlayer/ecdsa/handlers/WavsOperatorUpdateHandler.sol @@ -24,7 +24,10 @@ contract WavsOperatorUpdateHandler is IWavsOperatorUpdateHandler, IWavsServiceHa * @param _serviceManager The service manager instance * @param _ecdsaStakeRegistry The ECDSA stake registry instance */ - constructor(WavsServiceManager _serviceManager, ECDSAStakeRegistry _ecdsaStakeRegistry) { + constructor( + WavsServiceManager _serviceManager, + ECDSAStakeRegistry _ecdsaStakeRegistry + ) { SERVICE_MANAGER = _serviceManager; ECDSA_STAKE_REGISTRY = _ecdsaStakeRegistry; } diff --git a/contracts/src/eigenlayer/ecdsa/mocks/SimpleServiceManager.sol b/contracts/src/eigenlayer/ecdsa/mocks/SimpleServiceManager.sol index 707a8b0d..149abf88 100644 --- a/contracts/src/eigenlayer/ecdsa/mocks/SimpleServiceManager.sol +++ b/contracts/src/eigenlayer/ecdsa/mocks/SimpleServiceManager.sol @@ -96,7 +96,10 @@ contract SimpleServiceManager is IWavsServiceManager { * @param operator The operator * @param weight The weight of the operator */ - function setOperatorWeight(address operator, uint256 weight) external { + function setOperatorWeight( + address operator, + uint256 weight + ) external { operatorWeights[operator] = weight; } diff --git a/contracts/src/eigenlayer/ecdsa/mocks/SimpleSubmit.sol b/contracts/src/eigenlayer/ecdsa/mocks/SimpleSubmit.sol index eca2d0a6..ef0774a3 100644 --- a/contracts/src/eigenlayer/ecdsa/mocks/SimpleSubmit.sol +++ b/contracts/src/eigenlayer/ecdsa/mocks/SimpleSubmit.sol @@ -41,9 +41,7 @@ contract SimpleSubmit is IWavsServiceHandler, ISimpleSubmit { abi.decode(envelope.payload, (ISimpleSubmit.DataWithId)); signedDatas[dataWithId.triggerId] = ISimpleSubmit.SignedData({ - data: dataWithId.data, - signatureData: signatureData, - envelope: envelope + data: dataWithId.data, signatureData: signatureData, envelope: envelope }); validTriggers[dataWithId.triggerId] = true; diff --git a/contracts/test/eigenlayer/bls/WavsServiceManager.t.sol b/contracts/test/eigenlayer/bls/WavsServiceManager.t.sol index fc4f3054..2135b95e 100644 --- a/contracts/test/eigenlayer/bls/WavsServiceManager.t.sol +++ b/contracts/test/eigenlayer/bls/WavsServiceManager.t.sol @@ -3,8 +3,9 @@ pragma solidity ^0.8.27; import {Test} from "forge-std/Test.sol"; -import {TransparentUpgradeableProxy} from - "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { + TransparentUpgradeableProxy +} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {WavsServiceManager} from "src/eigenlayer/bls/WavsServiceManager.sol"; import {IWavsServiceManager} from "src/eigenlayer/bls/interfaces/IWavsServiceManager.sol"; diff --git a/contracts/test/eigenlayer/ecdsa/MirrorOperatorSyncHandler.t.sol b/contracts/test/eigenlayer/ecdsa/MirrorOperatorSyncHandler.t.sol index e286ff03..7ac14061 100644 --- a/contracts/test/eigenlayer/ecdsa/MirrorOperatorSyncHandler.t.sol +++ b/contracts/test/eigenlayer/ecdsa/MirrorOperatorSyncHandler.t.sol @@ -3,8 +3,9 @@ pragma solidity ^0.8.27; import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import {ECDSAUpgradeable} from - "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; +import { + ECDSAUpgradeable +} from "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; import {WavsMirrorDeploymentLib} from "script/eigenlayer/ecdsa/utils/WavsMirrorDeploymentLib.sol"; import {UpgradeableProxyLib} from "script/eigenlayer/ecdsa/utils/UpgradeableProxyLib.sol"; @@ -133,9 +134,7 @@ contract MirrorOperatorSyncHandlerTest is Test { /* solhint-enable func-name-mixedcase */ // Create an envelope with invalid payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode("Bad payload") + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode("Bad payload") }); // Create signature data with 4 operators (more than enough to pass quorum) @@ -156,19 +155,17 @@ contract MirrorOperatorSyncHandlerTest is Test { uint256[] memory newWeights = weights; // Update to triggerId 5 - IMirrorOperatorSyncHandler.UpdateWithId memory updateData = IMirrorOperatorSyncHandler - .UpdateWithId({ - triggerId: 5, - thresholdWeight: 5000, - operators: newOperators, - signingKeyAddresses: newSigningKeyAddresses, - weights: newWeights - }); + IMirrorOperatorSyncHandler.UpdateWithId memory updateData = + IMirrorOperatorSyncHandler.UpdateWithId({ + triggerId: 5, + thresholdWeight: 5000, + operators: newOperators, + signingKeyAddresses: newSigningKeyAddresses, + weights: newWeights + }); // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // Create signature data with 4 operators (more than enough to pass quorum) @@ -195,9 +192,7 @@ contract MirrorOperatorSyncHandlerTest is Test { }); // Create envelope with the encoded payload envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(2)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(2)), ordering: bytes12(0), payload: abi.encode(updateData) }); // Create signature data with 4 operators (more than enough to pass quorum) signatureData = createSignatureData(envelope, 4, 5); @@ -223,20 +218,18 @@ contract MirrorOperatorSyncHandlerTest is Test { newWeights[0] = 10_000; // Create the UpdateWithId struct with triggerId = 1 - IMirrorOperatorSyncHandler.UpdateWithId memory updateData = IMirrorOperatorSyncHandler - .UpdateWithId({ - triggerId: 1, - thresholdWeight: 5000, - operators: newOperators, - signingKeyAddresses: newSigningKeyAddresses, - weights: newWeights - }); + IMirrorOperatorSyncHandler.UpdateWithId memory updateData = + IMirrorOperatorSyncHandler.UpdateWithId({ + triggerId: 1, + thresholdWeight: 5000, + operators: newOperators, + signingKeyAddresses: newSigningKeyAddresses, + weights: newWeights + }); // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // Create signature data with only 3 operators (not enough for quorum) @@ -276,20 +269,18 @@ contract MirrorOperatorSyncHandlerTest is Test { } // Create the UpdateWithId struct with triggerId = 1 - IMirrorOperatorSyncHandler.UpdateWithId memory updateData = IMirrorOperatorSyncHandler - .UpdateWithId({ - triggerId: 1, - thresholdWeight: 8000, - operators: newOperators, - signingKeyAddresses: newSigningKeyAddresses, - weights: newWeights - }); + IMirrorOperatorSyncHandler.UpdateWithId memory updateData = + IMirrorOperatorSyncHandler.UpdateWithId({ + triggerId: 1, + thresholdWeight: 8000, + operators: newOperators, + signingKeyAddresses: newSigningKeyAddresses, + weights: newWeights + }); // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // 4/5 can pass this with > 2/3 @@ -339,9 +330,7 @@ contract MirrorOperatorSyncHandlerTest is Test { // Create envelope with the encoded payload envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // First 2 operators now have 2/3 and can pass diff --git a/contracts/test/eigenlayer/ecdsa/MirrorQuorumSyncHandler.t.sol b/contracts/test/eigenlayer/ecdsa/MirrorQuorumSyncHandler.t.sol index 99324ae7..9d067299 100644 --- a/contracts/test/eigenlayer/ecdsa/MirrorQuorumSyncHandler.t.sol +++ b/contracts/test/eigenlayer/ecdsa/MirrorQuorumSyncHandler.t.sol @@ -3,8 +3,9 @@ pragma solidity ^0.8.27; import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import {ECDSAUpgradeable} from - "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; +import { + ECDSAUpgradeable +} from "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; import {WavsMirrorDeploymentLib} from "script/eigenlayer/ecdsa/utils/WavsMirrorDeploymentLib.sol"; import {UpgradeableProxyLib} from "script/eigenlayer/ecdsa/utils/UpgradeableProxyLib.sol"; @@ -123,9 +124,7 @@ contract MirrorQuorumSyncHandlerTest is Test { IMirrorQuorumSyncHandler.UpdateWithId({triggerId: 5, numerator: 2, denominator: 3}); // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // Create signature data with all operators (5/5) @@ -144,9 +143,7 @@ contract MirrorQuorumSyncHandlerTest is Test { IMirrorQuorumSyncHandler.UpdateWithId({triggerId: 2, numerator: 3, denominator: 4}); // Create envelope with the encoded payload envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(2)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(2)), ordering: bytes12(0), payload: abi.encode(updateData) }); // Create signature data with all operators (5/5) signatureData = createSignatureData(envelope, 5, 0); @@ -168,9 +165,7 @@ contract MirrorQuorumSyncHandlerTest is Test { // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // Create signature data with only 2 operators (not enough for quorum) @@ -194,17 +189,17 @@ contract MirrorQuorumSyncHandlerTest is Test { function test_invalid_payload() public { // Create an invalid payload (not matching UpdateWithId struct) bytes memory invalidPayload = abi.encode("BAD"); - + // Create envelope with the invalid payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: invalidPayload }); - + // Create signature data with all operators (5/5) IWavsServiceHandler.SignatureData memory signatureData = createSignatureData(envelope, 5, 5); - + // Call handleSignedEnvelope should fail with abi decode error vm.expectRevert(); // Decoding error serviceHandler.handleSignedEnvelope(envelope, signatureData); @@ -222,9 +217,7 @@ contract MirrorQuorumSyncHandlerTest is Test { // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // 4/5 can pass this with > 2/3 @@ -241,9 +234,7 @@ contract MirrorQuorumSyncHandlerTest is Test { // Create envelope with the encoded payload envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // 2/5 is now enough to pass diff --git a/contracts/test/eigenlayer/ecdsa/MirrorStakeRegistry.t.sol b/contracts/test/eigenlayer/ecdsa/MirrorStakeRegistry.t.sol index 1c6e2227..d39645d8 100644 --- a/contracts/test/eigenlayer/ecdsa/MirrorStakeRegistry.t.sol +++ b/contracts/test/eigenlayer/ecdsa/MirrorStakeRegistry.t.sol @@ -2,13 +2,16 @@ pragma solidity ^0.8.27; import {Test} from "forge-std/Test.sol"; -import {IECDSAStakeRegistryTypes} from - "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistryStorage.sol"; -import {ISignatureUtilsMixinTypes} from - "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; +import { + IECDSAStakeRegistryTypes +} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistryStorage.sol"; +import { + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; -import {IERC1271Upgradeable} from - "@openzeppelin-upgrades/contracts/interfaces/IERC1271Upgradeable.sol"; +import { + IERC1271Upgradeable +} from "@openzeppelin-upgrades/contracts/interfaces/IERC1271Upgradeable.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {MirrorStakeRegistry} from "src/eigenlayer/ecdsa/MirrorStakeRegistry.sol"; @@ -80,11 +83,11 @@ contract MirrorStakeRegistryTest is Test { IStrategy mockStrategyInstance = IStrategy(address(1)); // Using address(1) instead of address(0) // Create the strategy params - IECDSAStakeRegistryTypes.StrategyParams memory strategyParams = IECDSAStakeRegistryTypes - .StrategyParams({ - strategy: mockStrategyInstance, - multiplier: 10_000 // 100% in basis points - }); + IECDSAStakeRegistryTypes.StrategyParams memory strategyParams = + IECDSAStakeRegistryTypes.StrategyParams({ + strategy: mockStrategyInstance, + multiplier: 10_000 // 100% in basis points + }); // Create the strategies array with one strategy IECDSAStakeRegistryTypes.StrategyParams[] memory strategies = diff --git a/contracts/test/eigenlayer/ecdsa/WavsMiddlewareDeploymentLib.t.sol b/contracts/test/eigenlayer/ecdsa/WavsMiddlewareDeploymentLib.t.sol index f0c6fd7e..65b33213 100644 --- a/contracts/test/eigenlayer/ecdsa/WavsMiddlewareDeploymentLib.t.sol +++ b/contracts/test/eigenlayer/ecdsa/WavsMiddlewareDeploymentLib.t.sol @@ -2,11 +2,13 @@ pragma solidity ^0.8.27; import {Test, console2} from "forge-std/Test.sol"; -import {IECDSAStakeRegistryTypes} from - "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; +import { + IECDSAStakeRegistryTypes +} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; -import {WavsMiddlewareDeploymentLib} from - "script/eigenlayer/ecdsa/utils/WavsMiddlewareDeploymentLib.sol"; +import { + WavsMiddlewareDeploymentLib +} from "script/eigenlayer/ecdsa/utils/WavsMiddlewareDeploymentLib.sol"; import {UpgradeableProxyLib} from "script/eigenlayer/ecdsa/utils/UpgradeableProxyLib.sol"; uint256 constant OPERATOR_WEIGHT = 10_000; diff --git a/contracts/test/eigenlayer/ecdsa/WavsMirrorDeploymentLib.t.sol b/contracts/test/eigenlayer/ecdsa/WavsMirrorDeploymentLib.t.sol index 4a758eef..4c3c2adc 100644 --- a/contracts/test/eigenlayer/ecdsa/WavsMirrorDeploymentLib.t.sol +++ b/contracts/test/eigenlayer/ecdsa/WavsMirrorDeploymentLib.t.sol @@ -2,11 +2,13 @@ pragma solidity ^0.8.27; import {Test} from "forge-std/Test.sol"; -import {IECDSAStakeRegistryTypes} from - "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; +import { + IECDSAStakeRegistryTypes +} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import {ECDSAUpgradeable} from - "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; +import { + ECDSAUpgradeable +} from "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; import {WavsMirrorDeploymentLib} from "script/eigenlayer/ecdsa/utils/WavsMirrorDeploymentLib.sol"; import {UpgradeableProxyLib} from "script/eigenlayer/ecdsa/utils/UpgradeableProxyLib.sol"; @@ -150,9 +152,7 @@ contract WavsMirrorDeploymentLibTest is Test { /* solhint-enable func-name-mixedcase */ // Create the envelope IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: "one" + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: "one" }); // Create signature data with first 4 operators (4/5 >= 2/3 == success) @@ -168,9 +168,7 @@ contract WavsMirrorDeploymentLibTest is Test { /* solhint-enable func-name-mixedcase */ // Create the envelope IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(2)), - ordering: bytes12(0), - payload: "two" + eventId: bytes20(uint160(2)), ordering: bytes12(0), payload: "two" }); // Create signature data with first 3 operators (3/5 < 2/3 == failure) @@ -197,9 +195,7 @@ contract WavsMirrorDeploymentLibTest is Test { // Create the envelope IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(3)), - ordering: bytes12(0), - payload: "three" + eventId: bytes20(uint160(3)), ordering: bytes12(0), payload: "three" }); // Create signature data with first 4 operators (3/5 >= 3/5 == success) @@ -241,9 +237,7 @@ contract WavsMirrorDeploymentLibTest is Test { assertEq(registeredOperator, operators[0], "Operator not registered correctly"); IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(4)), - ordering: bytes12(0), - payload: "four" + eventId: bytes20(uint160(4)), ordering: bytes12(0), payload: "four" }); // One operator will match threshold. Ensure lookup by signing key works well. @@ -268,9 +262,7 @@ contract WavsMirrorDeploymentLibTest is Test { // Create the envelope IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(5)), - ordering: bytes12(0), - payload: "five" + eventId: bytes20(uint160(5)), ordering: bytes12(0), payload: "five" }); // Create signature data with first 3 operators (3/5 >= 51% == success) @@ -342,9 +334,7 @@ contract WavsMirrorDeploymentLibTest is Test { serviceManager.validate( IWavsServiceHandler.Envelope({eventId: bytes20(0), ordering: bytes12(0), payload: ""}), IWavsServiceHandler.SignatureData({ - signers: emptySigners, - signatures: emptySignatures, - referenceBlock: 1 + signers: emptySigners, signatures: emptySignatures, referenceBlock: 1 }) ); } diff --git a/contracts/test/eigenlayer/ecdsa/WavsOperatorUpdateHandler.t.sol b/contracts/test/eigenlayer/ecdsa/WavsOperatorUpdateHandler.t.sol index 6cc20fb3..246b401c 100644 --- a/contracts/test/eigenlayer/ecdsa/WavsOperatorUpdateHandler.t.sol +++ b/contracts/test/eigenlayer/ecdsa/WavsOperatorUpdateHandler.t.sol @@ -3,11 +3,13 @@ pragma solidity ^0.8.27; import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import {ECDSAUpgradeable} from - "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; +import { + ECDSAUpgradeable +} from "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; -import {TransparentUpgradeableProxy} from - "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { + TransparentUpgradeableProxy +} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; import {WavsServiceManager} from "src/eigenlayer/ecdsa/WavsServiceManager.sol"; import { @@ -140,9 +142,7 @@ contract WavsOperatorUpdateHandlerTest is Test { /* solhint-enable func-name-mixedcase */ // Create an envelope with invalid payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode("Bad payload") + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode("Bad payload") }); // Create signature data with 4 operators (more than enough to pass quorum) @@ -159,16 +159,13 @@ contract WavsOperatorUpdateHandlerTest is Test { /* solhint-enable func-name-mixedcase */ // Create a valid UpdateWithId payload with triggerId = 1 IWavsOperatorUpdateHandler.OperatorUpdatePayload memory updateData = - IWavsOperatorUpdateHandler.OperatorUpdatePayload({ - operatorsPerQuorum: new address[][](0), - quorumNumbers: new bytes(0) - }); + IWavsOperatorUpdateHandler.OperatorUpdatePayload({ + operatorsPerQuorum: new address[][](0), quorumNumbers: new bytes(0) + }); // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // Create signature data with only 2 operators (not enough for quorum) @@ -193,16 +190,13 @@ contract WavsOperatorUpdateHandlerTest is Test { /* solhint-enable func-name-mixedcase */ // Create the update data with some operators IWavsOperatorUpdateHandler.OperatorUpdatePayload memory updateData = - IWavsOperatorUpdateHandler.OperatorUpdatePayload({ - operatorsPerQuorum: new address[][](1), - quorumNumbers: new bytes(0) - }); + IWavsOperatorUpdateHandler.OperatorUpdatePayload({ + operatorsPerQuorum: new address[][](1), quorumNumbers: new bytes(0) + }); // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // 4/5 can pass this with > 2/3 @@ -221,16 +215,13 @@ contract WavsOperatorUpdateHandlerTest is Test { address[][] memory operatorsPerQuorum = new address[][](1); operatorsPerQuorum[0] = operators; IWavsOperatorUpdateHandler.OperatorUpdatePayload memory updateData = - IWavsOperatorUpdateHandler.OperatorUpdatePayload({ - operatorsPerQuorum: operatorsPerQuorum, - quorumNumbers: new bytes(0) - }); + IWavsOperatorUpdateHandler.OperatorUpdatePayload({ + operatorsPerQuorum: operatorsPerQuorum, quorumNumbers: new bytes(0) + }); // Create envelope with the encoded payload IWavsServiceHandler.Envelope memory envelope = IWavsServiceHandler.Envelope({ - eventId: bytes20(uint160(1)), - ordering: bytes12(0), - payload: abi.encode(updateData) + eventId: bytes20(uint160(1)), ordering: bytes12(0), payload: abi.encode(updateData) }); // 4/5 can pass this with > 2/3 diff --git a/contracts/test/eigenlayer/ecdsa/WavsServiceManager.t.sol b/contracts/test/eigenlayer/ecdsa/WavsServiceManager.t.sol index ad19ac88..28f6db21 100644 --- a/contracts/test/eigenlayer/ecdsa/WavsServiceManager.t.sol +++ b/contracts/test/eigenlayer/ecdsa/WavsServiceManager.t.sol @@ -2,8 +2,9 @@ pragma solidity ^0.8.27; import {Test} from "forge-std/Test.sol"; -import {TransparentUpgradeableProxy} from - "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { + TransparentUpgradeableProxy +} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {WavsServiceManager} from "src/eigenlayer/ecdsa/WavsServiceManager.sol"; import {IWavsServiceManager} from "src/eigenlayer/ecdsa/interfaces/IWavsServiceManager.sol"; @@ -166,9 +167,7 @@ contract WavsServiceManagerTest is Test { signers[0] = signer1; // Operators registered 0x1 to 0x5 signatures[0] = ""; // Empty signature since we're mocking the validation IWavsServiceHandler.SignatureData memory signatureData = IWavsServiceHandler.SignatureData({ - signers: signers, - signatures: signatures, - referenceBlock: uint32(block.number) - 1 + signers: signers, signatures: signatures, referenceBlock: uint32(block.number) - 1 }); serviceManager.validate( @@ -270,9 +269,7 @@ contract WavsServiceManagerTest is Test { serviceManager.validate( IWavsServiceHandler.Envelope({eventId: bytes20(0), ordering: bytes12(0), payload: ""}), IWavsServiceHandler.SignatureData({ - signers: emptySigners, - signatures: emptySignatures, - referenceBlock: 1 + signers: emptySigners, signatures: emptySignatures, referenceBlock: 1 }) ); } diff --git a/contracts/test/eigenlayer/ecdsa/mocks/MockStakeRegistry.sol b/contracts/test/eigenlayer/ecdsa/mocks/MockStakeRegistry.sol index b2ec68d2..29e5d922 100644 --- a/contracts/test/eigenlayer/ecdsa/mocks/MockStakeRegistry.sol +++ b/contracts/test/eigenlayer/ecdsa/mocks/MockStakeRegistry.sol @@ -1,10 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {IERC1271Upgradeable} from - "@openzeppelin-upgrades/contracts/interfaces/IERC1271Upgradeable.sol"; -import {IECDSAStakeRegistryErrors} from - "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; +import { + IERC1271Upgradeable +} from "@openzeppelin-upgrades/contracts/interfaces/IERC1271Upgradeable.sol"; +import { + IECDSAStakeRegistryErrors +} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistry.sol"; /** * @title MockStakeRegistry @@ -29,7 +31,10 @@ contract MockStakeRegistry is IECDSAStakeRegistryErrors { * @param operator The operator. * @param weight The weight. */ - function setOperatorWeight(address operator, uint256 weight) external { + function setOperatorWeight( + address operator, + uint256 weight + ) external { operatorWeights[operator] = weight; // set this to self operatorToSigning[operator] = operator; @@ -41,7 +46,10 @@ contract MockStakeRegistry is IECDSAStakeRegistryErrors { * @param operator The operator. * @param signer The signer. */ - function setOperatorSigner(address operator, address signer) external { + function setOperatorSigner( + address operator, + address signer + ) external { address oldSigner = operatorToSigning[operator]; delete signingToOperator[oldSigner]; operatorToSigning[operator] = signer; diff --git a/contracts/test/eigenlayer/ecdsa/mocks/SimpleServiceManager.t.sol b/contracts/test/eigenlayer/ecdsa/mocks/SimpleServiceManager.t.sol index 8c90a123..1e49d8ab 100644 --- a/contracts/test/eigenlayer/ecdsa/mocks/SimpleServiceManager.t.sol +++ b/contracts/test/eigenlayer/ecdsa/mocks/SimpleServiceManager.t.sol @@ -122,9 +122,7 @@ contract SimpleServiceManagerTest is Test { signatures[1] = bytes("signature2"); IWavsServiceHandler.SignatureData memory signatureData = IWavsServiceHandler.SignatureData({ - signers: signers, - signatures: signatures, - referenceBlock: uint32(block.number - 1) + signers: signers, signatures: signatures, referenceBlock: uint32(block.number - 1) }); // Should not revert @@ -139,9 +137,7 @@ contract SimpleServiceManagerTest is Test { bytes[] memory signatures = new bytes[](0); IWavsServiceHandler.SignatureData memory signatureData = IWavsServiceHandler.SignatureData({ - signers: signers, - signatures: signatures, - referenceBlock: uint32(block.number - 1) + signers: signers, signatures: signatures, referenceBlock: uint32(block.number - 1) }); vm.expectRevert(IWavsServiceManager.InvalidSignatureLength.selector); @@ -160,9 +156,7 @@ contract SimpleServiceManagerTest is Test { signatures[0] = bytes("signature1"); IWavsServiceHandler.SignatureData memory signatureData = IWavsServiceHandler.SignatureData({ - signers: signers, - signatures: signatures, - referenceBlock: uint32(block.number - 1) + signers: signers, signatures: signatures, referenceBlock: uint32(block.number - 1) }); vm.expectRevert(IWavsServiceManager.InvalidSignatureLength.selector); @@ -180,9 +174,7 @@ contract SimpleServiceManagerTest is Test { signatures[0] = bytes("signature1"); IWavsServiceHandler.SignatureData memory signatureData = IWavsServiceHandler.SignatureData({ - signers: signers, - signatures: signatures, - referenceBlock: uint32(block.number + 1) + signers: signers, signatures: signatures, referenceBlock: uint32(block.number + 1) }); vm.expectRevert(IWavsServiceManager.InvalidSignatureBlock.selector); @@ -208,9 +200,7 @@ contract SimpleServiceManagerTest is Test { signatures[1] = bytes("signature2"); IWavsServiceHandler.SignatureData memory signatureData = IWavsServiceHandler.SignatureData({ - signers: signers, - signatures: signatures, - referenceBlock: uint32(block.number - 1) + signers: signers, signatures: signatures, referenceBlock: uint32(block.number - 1) }); vm.expectRevert(IWavsServiceManager.InvalidSignatureOrder.selector); @@ -231,9 +221,7 @@ contract SimpleServiceManagerTest is Test { signatures[0] = bytes("signature1"); IWavsServiceHandler.SignatureData memory signatureData = IWavsServiceHandler.SignatureData({ - signers: signers, - signatures: signatures, - referenceBlock: uint32(block.number - 1) + signers: signers, signatures: signatures, referenceBlock: uint32(block.number - 1) }); vm.expectRevert(IWavsServiceManager.InsufficientQuorumZero.selector); @@ -259,9 +247,7 @@ contract SimpleServiceManagerTest is Test { signatures[1] = bytes("signature2"); IWavsServiceHandler.SignatureData memory signatureData = IWavsServiceHandler.SignatureData({ - signers: signers, - signatures: signatures, - referenceBlock: uint32(block.number - 1) + signers: signers, signatures: signatures, referenceBlock: uint32(block.number - 1) }); vm.expectRevert( diff --git a/docker/BLS_CLI.md b/docker/BLS_CLI.md index d264e8c9..5cf813f9 100644 --- a/docker/BLS_CLI.md +++ b/docker/BLS_CLI.md @@ -7,7 +7,7 @@ docker build -t wavs-middleware . ``` ```bash docci-if-not-exists="docker/.env" -CHAIN=holesky +CHAIN=sepolia cp docker/env.example.$CHAIN docker/.env ``` diff --git a/docker/ECDSA_CLI.md b/docker/ECDSA_CLI.md index 08354330..6b7203df 100644 --- a/docker/ECDSA_CLI.md +++ b/docker/ECDSA_CLI.md @@ -7,7 +7,7 @@ docker build -t wavs-middleware . ``` ```bash docci-if-not-exists="docker/.env" -CHAIN=holesky +CHAIN=sepolia cp docker/env.example.$CHAIN docker/.env ``` diff --git a/package.json b/package.json index 58756f93..fcfdbf58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wavs/solidity", - "version": "0.4.0", + "version": "0.6.0-alpha.3", "description": "WAVS Middleware", "author": "Lay3rLabs Team", "license": "MIT", diff --git a/scripts/bls/eigen/deploy.sh b/scripts/bls/eigen/deploy.sh index 0e9ea28c..ac4d15c7 100644 --- a/scripts/bls/eigen/deploy.sh +++ b/scripts/bls/eigen/deploy.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -45,6 +41,11 @@ ensure_balance "$deployer_address" echo "Deployer address: $deployer_address configured for $DEPLOY_ENV environment" cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/bls/WavsMiddlewareDeployer.s.sol --rpc-url "$RPC_URL" --private-key "$FUNDED_KEY" -vvv --broadcast --skip-simulation || handle_error "Failed to deploy WavsMiddlewareDeployer" echo "BLS contracts deployed with addresses:" diff --git a/scripts/bls/eigen/list_operators.sh b/scripts/bls/eigen/list_operators.sh index 8e96a605..97edac4d 100755 --- a/scripts/bls/eigen/list_operators.sh +++ b/scripts/bls/eigen/list_operators.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -30,6 +26,11 @@ echo "Listing operators for service manager: $WAVS_SERVICE_MANAGER_ADDRESS" # List operators cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/bls/WavsListOperators.s.sol -vvv --rpc-url "$RPC_URL" --broadcast --skip-simulation || handle_error "Failed to list operators" # Save operator list data diff --git a/scripts/bls/eigen/pause.sh b/scripts/bls/eigen/pause.sh index 3189a8da..6f81bbbc 100755 --- a/scripts/bls/eigen/pause.sh +++ b/scripts/bls/eigen/pause.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -39,6 +35,11 @@ echo "Pausing WAVS registration..." # Pause registration cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/bls/PauseWavsRegistration.s.sol --rpc-url "$RPC_URL" --private-key "$FUNDED_KEY" --broadcast --skip-simulation || handle_error "Failed to pause WAVS registration" echo "WAVS registration paused successfully" diff --git a/scripts/bls/eigen/register.sh b/scripts/bls/eigen/register.sh index e7609b9f..588c8477 100755 --- a/scripts/bls/eigen/register.sh +++ b/scripts/bls/eigen/register.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -51,6 +47,10 @@ echo "Delegate amount: $WAVS_DELEGATE_AMOUNT" cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + # Deposit into strategy forge script script/eigenlayer/bls/WavsDepositIntoStrategy.s.sol -vvv --rpc-url "$RPC_URL" --private-key "$OPERATOR_KEY" --broadcast --skip-simulation || handle_error "Failed to deposit into strategy" diff --git a/scripts/bls/eigen/set_service_uri.sh b/scripts/bls/eigen/set_service_uri.sh index fdcd00e3..7c59412c 100755 --- a/scripts/bls/eigen/set_service_uri.sh +++ b/scripts/bls/eigen/set_service_uri.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" diff --git a/scripts/bls/eigen/unpause.sh b/scripts/bls/eigen/unpause.sh index 7df44c61..7a90027b 100755 --- a/scripts/bls/eigen/unpause.sh +++ b/scripts/bls/eigen/unpause.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -39,6 +35,11 @@ echo "Unpausing WAVS registration..." # Unpause registration cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/bls/UnpauseWavsRegistration.s.sol --rpc-url "$RPC_URL" --private-key "$FUNDED_KEY" --broadcast --skip-simulation || handle_error "Failed to unpause WAVS registration" echo "WAVS registration unpaused successfully" diff --git a/scripts/bls/eigen/update_quorum.sh b/scripts/bls/eigen/update_quorum.sh index 0c385af4..fc9f91ec 100755 --- a/scripts/bls/eigen/update_quorum.sh +++ b/scripts/bls/eigen/update_quorum.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -42,6 +38,11 @@ echo "Updating quorum configuration to $QUORUM_NUMERATOR/$QUORUM_DENOMINATOR..." # Update quorum configuration cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/bls/WavsUpdateQuorum.s.sol -vvv --rpc-url "$RPC_URL" --private-key "$FUNDED_KEY" --broadcast --skip-simulation || handle_error "Failed to update quorum configuration" echo "Quorum configuration updated successfully" diff --git a/scripts/ecdsa/eigen/delegate_to_operator.sh b/scripts/ecdsa/eigen/delegate_to_operator.sh index 3f1533c3..b624c11c 100755 --- a/scripts/ecdsa/eigen/delegate_to_operator.sh +++ b/scripts/ecdsa/eigen/delegate_to_operator.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -49,6 +45,9 @@ echo "Delegating $WAVS_DELEGATE_AMOUNT to operator $OPERATOR_ADDRESS..." # Change to contracts directory and run the script cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" forge script script/eigenlayer/ecdsa/WavsDelegateToOperator.s.sol --rpc-url "$RPC_URL" --private-key "$STAKER_KEY" -vvv --broadcast --skip-simulation || handle_error "Failed to delegate to operator" echo "Successfully delegated to operator $OPERATOR_ADDRESS from staker $staker_address" diff --git a/scripts/ecdsa/eigen/deploy.sh b/scripts/ecdsa/eigen/deploy.sh index 2b3e54c3..1489a195 100755 --- a/scripts/ecdsa/eigen/deploy.sh +++ b/scripts/ecdsa/eigen/deploy.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -46,6 +42,11 @@ ensure_balance "$deployer_address" echo "Deployer address: $deployer_address configured for $DEPLOY_ENV environment" cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/ecdsa/WavsMiddlewareDeployer.s.sol --rpc-url "$RPC_URL" --private-key "$FUNDED_KEY" -vvv --broadcast --skip-simulation || handle_error "Failed to deploy WavsMiddlewareDeployer" echo "Middleware contracts deployed with addresses:" diff --git a/scripts/ecdsa/eigen/deregister.sh b/scripts/ecdsa/eigen/deregister.sh index 7896d1ab..f3298c1e 100644 --- a/scripts/ecdsa/eigen/deregister.sh +++ b/scripts/ecdsa/eigen/deregister.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -34,6 +30,9 @@ echo "Deregistering WAVS registration..." # Pause registration cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" forge script script/eigenlayer/ecdsa/WavsDeregisterOperator.s.sol -vvv --rpc-url "$RPC_URL" --private-key "$OPERATOR_KEY" --broadcast --skip-simulation || handle_error "Failed to deregister WAVS registration" echo "WAVS registration deregistered successfully" diff --git a/scripts/ecdsa/eigen/list_operators.sh b/scripts/ecdsa/eigen/list_operators.sh index e6f1bf35..1083c48e 100755 --- a/scripts/ecdsa/eigen/list_operators.sh +++ b/scripts/ecdsa/eigen/list_operators.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -30,4 +26,7 @@ echo "Listing operators for service manager: $WAVS_SERVICE_MANAGER_ADDRESS" # List operators cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" forge script script/eigenlayer/ecdsa/WavsListOperators.s.sol -vvv --rpc-url "$RPC_URL" --broadcast --skip-simulation || handle_error "Failed to list operators" diff --git a/scripts/ecdsa/eigen/pause.sh b/scripts/ecdsa/eigen/pause.sh index d3a5b86c..1674eda3 100755 --- a/scripts/ecdsa/eigen/pause.sh +++ b/scripts/ecdsa/eigen/pause.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -39,6 +35,9 @@ echo "Pausing WAVS registration..." # Pause registration cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" forge script script/eigenlayer/ecdsa/PauseWavsRegistration.s.sol --rpc-url "$RPC_URL" --private-key "$FUNDED_KEY" --broadcast --skip-simulation || handle_error "Failed to pause WAVS registration" echo "WAVS registration paused successfully" diff --git a/scripts/ecdsa/eigen/register.sh b/scripts/ecdsa/eigen/register.sh index 72b3a5bb..a2570a03 100755 --- a/scripts/ecdsa/eigen/register.sh +++ b/scripts/ecdsa/eigen/register.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -41,4 +37,9 @@ echo "Operator address: $OP_ADDR" # Register operator cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/ecdsa/WavsRegisterOperator.s.sol -vvv --rpc-url "$RPC_URL" --private-key "$OPERATOR_KEY" --broadcast --skip-simulation || handle_error "Failed to register operator" diff --git a/scripts/ecdsa/eigen/set_service_uri.sh b/scripts/ecdsa/eigen/set_service_uri.sh index fdcd00e3..7c59412c 100755 --- a/scripts/ecdsa/eigen/set_service_uri.sh +++ b/scripts/ecdsa/eigen/set_service_uri.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" diff --git a/scripts/ecdsa/eigen/transfer_ownership.sh b/scripts/ecdsa/eigen/transfer_ownership.sh index 5b670b37..27d1edcc 100644 --- a/scripts/ecdsa/eigen/transfer_ownership.sh +++ b/scripts/ecdsa/eigen/transfer_ownership.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" diff --git a/scripts/ecdsa/eigen/unpause.sh b/scripts/ecdsa/eigen/unpause.sh index 4637ffb2..ce03bfdc 100755 --- a/scripts/ecdsa/eigen/unpause.sh +++ b/scripts/ecdsa/eigen/unpause.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -39,6 +35,9 @@ echo "Unpausing WAVS registration..." # Unpause registration cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" forge script script/eigenlayer/ecdsa/UnpauseWavsRegistration.s.sol --rpc-url "$RPC_URL" --private-key "$FUNDED_KEY" --broadcast --skip-simulation || handle_error "Failed to unpause WAVS registration" echo "WAVS registration unpaused successfully" diff --git a/scripts/ecdsa/eigen/update_quorum.sh b/scripts/ecdsa/eigen/update_quorum.sh index 607d16ef..8e70683a 100755 --- a/scripts/ecdsa/eigen/update_quorum.sh +++ b/scripts/ecdsa/eigen/update_quorum.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -42,6 +38,9 @@ echo "Updating quorum configuration to $QUORUM_NUMERATOR/$QUORUM_DENOMINATOR..." # Update quorum configuration cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" forge script script/eigenlayer/ecdsa/WavsUpdateQuorum.s.sol -vvv --rpc-url "$RPC_URL" --private-key "$FUNDED_KEY" --broadcast --skip-simulation || handle_error "Failed to update quorum configuration" echo "Quorum configuration updated successfully" diff --git a/scripts/ecdsa/mirror/deploy.sh b/scripts/ecdsa/mirror/deploy.sh index 4ab08c62..56f6ca79 100755 --- a/scripts/ecdsa/mirror/deploy.sh +++ b/scripts/ecdsa/mirror/deploy.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -47,6 +43,11 @@ echo "Reading source chain config:" # Prepare deployment cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/ecdsa/WavsMirrorPrepareDeploy.s.sol --rpc-url "$SOURCE_RPC_URL" -vvv --broadcast --skip-simulation || handle_error "Failed to run WavsMirrorPrepareDeploy script" echo "Got config:" diff --git a/scripts/ecdsa/mirror/list_operators.sh b/scripts/ecdsa/mirror/list_operators.sh index 81b67b37..3584d48a 100755 --- a/scripts/ecdsa/mirror/list_operators.sh +++ b/scripts/ecdsa/mirror/list_operators.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -38,6 +34,11 @@ check_param "MIRROR_SERVICE_MANAGER_ADDRESS" "${MIRROR_SERVICE_MANAGER_ADDRESS:- # Change to contracts directory and run the script cd contracts || handle_error "Failed to change to contracts directory" + +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/ecdsa/WavsMirrorListOperators.s.sol -vvv --broadcast --skip-simulation || handle_error "Failed to list operators" echo "Operator list:" diff --git a/scripts/ecdsa/mock/configure.sh b/scripts/ecdsa/mock/configure.sh index cbaf8687..27975682 100644 --- a/scripts/ecdsa/mock/configure.sh +++ b/scripts/ecdsa/mock/configure.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -48,6 +44,10 @@ echo "Configuring mock contracts" # Configure contracts cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/ecdsa/WavsMockConfiguration.s.sol --rpc-url "$MOCK_RPC_URL" --private-key "$MOCK_DEPLOYER_KEY" -vvv --broadcast --skip-simulation || handle_error "Failed to configure WavsMockDeployer" echo "Mock contracts configured successfully" diff --git a/scripts/ecdsa/mock/deploy.sh b/scripts/ecdsa/mock/deploy.sh index 1cfd9084..7661c92d 100755 --- a/scripts/ecdsa/mock/deploy.sh +++ b/scripts/ecdsa/mock/deploy.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@" @@ -46,6 +42,10 @@ echo "Deploying contracts" # Deploy contracts cd contracts || handle_error "Failed to change to contracts directory" +# shellcheck source=../foundry_profile.sh +# shellcheck disable=SC1091 +source "$SCRIPT_DIR/../foundry_profile.sh" + forge script script/eigenlayer/ecdsa/WavsMockDeployer.s.sol --rpc-url "$MOCK_RPC_URL" --private-key "$MOCK_DEPLOYER_KEY" -vvv --broadcast --skip-simulation || handle_error "Failed to deploy WavsMockDeployer" echo "Mock contracts deployed with addresses:" diff --git a/scripts/ecdsa/mock/transfer_ownership.sh b/scripts/ecdsa/mock/transfer_ownership.sh index 6aa3c6d5..89cca97b 100644 --- a/scripts/ecdsa/mock/transfer_ownership.sh +++ b/scripts/ecdsa/mock/transfer_ownership.sh @@ -11,10 +11,6 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../../helper.sh" -# shellcheck source=../foundry_profile.sh -# shellcheck disable=SC1091 -source "$SCRIPT_DIR/../foundry_profile.sh" - # Parse command line arguments in key=value format parse_args "$@"