From b39601cedbfa089bc7d3581451d553593349af1d Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 14 Mar 2025 13:05:44 -0400 Subject: [PATCH 1/6] chore: bump v1.3.0 --- lib/eigenlayer-contracts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/eigenlayer-contracts b/lib/eigenlayer-contracts index 851978db..722f3cbe 160000 --- a/lib/eigenlayer-contracts +++ b/lib/eigenlayer-contracts @@ -1 +1 @@ -Subproject commit 851978db8658072a07fe5ec669bf6be1aaad425f +Subproject commit 722f3cbeb7721431f1a2a4a73582f7981212e23d From 89356f4b5eed3c9f359158c1c35dd3cf4150bb3c Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 14 Mar 2025 13:54:21 -0400 Subject: [PATCH 2/6] fix: signature utils import --- src/ServiceManagerBase.sol | 5 +- src/SlashingRegistryCoordinator.sol | 5 +- src/interfaces/IECDSAStakeRegistry.sol | 7 +- src/interfaces/IRegistryCoordinator.sol | 11 ++- src/interfaces/IServiceManager.sol | 5 +- src/interfaces/IServiceManagerUI.sol | 7 +- src/unaudited/ECDSAServiceManagerBase.sol | 9 +- src/unaudited/ECDSAStakeRegistry.sol | 9 +- .../ECDSAStakeRegistryEqualWeight.sol | 5 +- .../ECDSAStakeRegistryPermissioned.sol | 7 +- test/integration/CoreRegistration.t.sol | 16 ++- test/integration/OperatorSetUser.t.sol | 12 ++- test/integration/User.t.sol | 23 +++-- test/mocks/AVSDirectoryMock.sol | 11 ++- test/mocks/DelegationMock.sol | 5 +- test/mocks/RegistryCoordinatorMock.sol | 12 ++- test/unit/ECDSAServiceManager.t.sol | 11 ++- .../ECDSAStakeRegistryEqualWeightUnit.t.sol | 11 ++- .../ECDSAStakeRegistryPermissionedUnit.t.sol | 13 ++- test/unit/ECDSAStakeRegistryUnit.t.sol | 29 +++--- test/unit/RegistryCoordinatorUnit.t.sol | 97 ++++++++++--------- test/utils/CoreDeployLib.sol | 5 +- test/utils/MockAVSDeployer.sol | 13 ++- 23 files changed, 207 insertions(+), 121 deletions(-) diff --git a/src/ServiceManagerBase.sol b/src/ServiceManagerBase.sol index d11e7197..26d41f58 100644 --- a/src/ServiceManagerBase.sol +++ b/src/ServiceManagerBase.sol @@ -4,7 +4,8 @@ pragma solidity ^0.8.27; import {Initializable} from "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import {ISignatureUtilsMixin} from + "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IRewardsCoordinator} from @@ -222,7 +223,7 @@ abstract contract ServiceManagerBase is ServiceManagerBaseStorage { */ function registerOperatorToAVS( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixin.SignatureWithSaltAndExpiry memory operatorSignature ) public virtual onlyRegistryCoordinator { _avsDirectory.registerOperatorToAVS(operator, operatorSignature); } diff --git a/src/SlashingRegistryCoordinator.sol b/src/SlashingRegistryCoordinator.sol index a1710853..dc764e40 100644 --- a/src/SlashingRegistryCoordinator.sol +++ b/src/SlashingRegistryCoordinator.sol @@ -2,7 +2,8 @@ pragma solidity ^0.8.27; import {IPauserRegistry} from "eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import {ISignatureUtilsMixin} from + "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IAVSRegistrar} from "eigenlayer-contracts/src/contracts/interfaces/IAVSRegistrar.sol"; import { @@ -44,7 +45,7 @@ contract SlashingRegistryCoordinator is Pausable, OwnableUpgradeable, SlashingRegistryCoordinatorStorage, - ISignatureUtils + ISignatureUtilsMixin { using BitmapUtils for *; using BN254 for BN254.G1Point; diff --git a/src/interfaces/IECDSAStakeRegistry.sol b/src/interfaces/IECDSAStakeRegistry.sol index e17086f8..25685482 100644 --- a/src/interfaces/IECDSAStakeRegistry.sol +++ b/src/interfaces/IECDSAStakeRegistry.sol @@ -4,7 +4,10 @@ pragma solidity ^0.8.27; import {IERC1271Upgradeable} from "@openzeppelin-upgrades/contracts/interfaces/IERC1271Upgradeable.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; @@ -139,7 +142,7 @@ interface IECDSAStakeRegistry is * @param signingKey The signing key to add to the operator's history. */ function registerOperatorWithSignature( - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature, + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature, address signingKey ) external; diff --git a/src/interfaces/IRegistryCoordinator.sol b/src/interfaces/IRegistryCoordinator.sol index e25f1477..e5c34f15 100644 --- a/src/interfaces/IRegistryCoordinator.sol +++ b/src/interfaces/IRegistryCoordinator.sol @@ -7,7 +7,10 @@ import { ISlashingRegistryCoordinatorEvents, ISlashingRegistryCoordinatorTypes } from "./ISlashingRegistryCoordinator.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IBLSApkRegistryTypes} from "./IBLSApkRegistry.sol"; import {IServiceManager} from "./IServiceManager.sol"; @@ -72,7 +75,7 @@ interface IRegistryCoordinator is bytes memory quorumNumbers, string memory socket, IBLSApkRegistryTypes.PubkeyRegistrationParams memory params, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external; /** @@ -94,8 +97,8 @@ interface IRegistryCoordinator is string memory socket, IBLSApkRegistryTypes.PubkeyRegistrationParams memory params, OperatorKickParam[] memory operatorKickParams, - ISignatureUtils.SignatureWithSaltAndExpiry memory churnApproverSignature, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory churnApproverSignature, + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external; /** diff --git a/src/interfaces/IServiceManager.sol b/src/interfaces/IServiceManager.sol index 29f50501..7f30b750 100644 --- a/src/interfaces/IServiceManager.sol +++ b/src/interfaces/IServiceManager.sol @@ -4,7 +4,10 @@ pragma solidity >=0.5.0; import {IRewardsCoordinator} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol"; import {IServiceManagerUI} from "./IServiceManagerUI.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IAllocationManagerTypes} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; import {IAllocationManager} from diff --git a/src/interfaces/IServiceManagerUI.sol b/src/interfaces/IServiceManagerUI.sol index a506256b..cf825f50 100644 --- a/src/interfaces/IServiceManagerUI.sol +++ b/src/interfaces/IServiceManagerUI.sol @@ -1,7 +1,10 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; /** * @title Minimal interface for a ServiceManager-type contract that AVS ServiceManager contracts must implement @@ -32,7 +35,7 @@ interface IServiceManagerUI { */ function registerOperatorToAVS( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external; /** diff --git a/src/unaudited/ECDSAServiceManagerBase.sol b/src/unaudited/ECDSAServiceManagerBase.sol index d5bf2c55..51fdf346 100644 --- a/src/unaudited/ECDSAServiceManagerBase.sol +++ b/src/unaudited/ECDSAServiceManagerBase.sol @@ -4,7 +4,10 @@ pragma solidity ^0.8.27; import {OwnableUpgradeable} from "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol"; import {IServiceManager} from "../interfaces/IServiceManager.sol"; import {IServiceManagerUI} from "../interfaces/IServiceManagerUI.sol"; @@ -127,7 +130,7 @@ abstract contract ECDSAServiceManagerBase is IServiceManager, OwnableUpgradeable /// @inheritdoc IServiceManagerUI function registerOperatorToAVS( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external virtual onlyStakeRegistry { _registerOperatorToAVS(operator, operatorSignature); } @@ -170,7 +173,7 @@ abstract contract ECDSAServiceManagerBase is IServiceManager, OwnableUpgradeable */ function _registerOperatorToAVS( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) internal virtual { IAVSDirectory(avsDirectory).registerOperatorToAVS(operator, operatorSignature); } diff --git a/src/unaudited/ECDSAStakeRegistry.sol b/src/unaudited/ECDSAStakeRegistry.sol index c961c83e..cc882261 100644 --- a/src/unaudited/ECDSAStakeRegistry.sol +++ b/src/unaudited/ECDSAStakeRegistry.sol @@ -9,7 +9,10 @@ import { import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IServiceManager} from "../interfaces/IServiceManager.sol"; import {OwnableUpgradeable} from "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; @@ -66,7 +69,7 @@ contract ECDSAStakeRegistry is /// @inheritdoc IECDSAStakeRegistry function registerOperatorWithSignature( - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature, + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature, address signingKey ) external { _registerOperatorWithSig(msg.sender, operatorSignature, signingKey); @@ -315,7 +318,7 @@ contract ECDSAStakeRegistry is /// @param signingKey The signing key to add to the operator's history function _registerOperatorWithSig( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature, + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature, address signingKey ) internal virtual { if (_operatorRegistered[operator]) { diff --git a/src/unaudited/examples/ECDSAStakeRegistryEqualWeight.sol b/src/unaudited/examples/ECDSAStakeRegistryEqualWeight.sol index 3edd6278..f3b0a672 100644 --- a/src/unaudited/examples/ECDSAStakeRegistryEqualWeight.sol +++ b/src/unaudited/examples/ECDSAStakeRegistryEqualWeight.sol @@ -1,7 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {ECDSAStakeRegistryPermissioned} from "./ECDSAStakeRegistryPermissioned.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; diff --git a/src/unaudited/examples/ECDSAStakeRegistryPermissioned.sol b/src/unaudited/examples/ECDSAStakeRegistryPermissioned.sol index f6afffdf..e7f55e63 100644 --- a/src/unaudited/examples/ECDSAStakeRegistryPermissioned.sol +++ b/src/unaudited/examples/ECDSAStakeRegistryPermissioned.sol @@ -1,7 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {ECDSAStakeRegistry} from "../ECDSAStakeRegistry.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; @@ -102,7 +105,7 @@ contract ECDSAStakeRegistryPermissioned is ECDSAStakeRegistry { /// @inheritdoc ECDSAStakeRegistry function _registerOperatorWithSig( address _operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory _operatorSignature, + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory _operatorSignature, address _operatorSigningKey ) internal override { if (allowlistedOperators[_operator] != true) { diff --git a/test/integration/CoreRegistration.t.sol b/test/integration/CoreRegistration.t.sol index 734d0fd4..e630179a 100644 --- a/test/integration/CoreRegistration.t.sol +++ b/test/integration/CoreRegistration.t.sol @@ -20,6 +20,10 @@ import {PermissionController} from "eigenlayer-contracts/src/contracts/permissions/PermissionController.sol"; import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; contract Test_CoreRegistration is MockAVSDeployer { // Contracts @@ -144,7 +148,8 @@ contract Test_CoreRegistration is MockAVSDeployer { bytes memory quorumNumbers = new bytes(1); // Get operator signature - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = _getOperatorSignature( + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorSignature( operatorPrivateKey, operator, address(serviceManager), emptySalt, maxExpiry ); @@ -232,7 +237,8 @@ contract Test_CoreRegistration is MockAVSDeployer { bytes memory quorumNumbers ) internal { // Get operator signature - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = _getOperatorSignature( + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorSignature( operatorPrivateKey, operator, address(serviceManager), emptySalt, maxExpiry ); @@ -252,7 +258,11 @@ contract Test_CoreRegistration is MockAVSDeployer { address avs, bytes32 salt, uint256 expiry - ) internal view returns (ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) { + ) + internal + view + returns (ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature) + { operatorSignature.salt = salt; operatorSignature.expiry = expiry; { diff --git a/test/integration/OperatorSetUser.t.sol b/test/integration/OperatorSetUser.t.sol index 697ab916..1adae0c1 100644 --- a/test/integration/OperatorSetUser.t.sol +++ b/test/integration/OperatorSetUser.t.sol @@ -90,7 +90,7 @@ contract OperatorSetUser is User { ( ISlashingRegistryCoordinatorTypes.OperatorKickParam[] memory kickParams, - ISignatureUtils.SignatureWithSaltAndExpiry memory churnApproverSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory churnApproverSignature ) = _generateOperatorKickParams(allQuorums, churnQuorums, churnTargets, standardQuorums); // Encode with RegistrationType.CHURN @@ -162,7 +162,7 @@ contract OperatorSetUser is User { override returns ( ISlashingRegistryCoordinatorTypes.OperatorKickParam[] memory, - ISignatureUtils.SignatureWithSaltAndExpiry memory + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory ) { ISlashingRegistryCoordinator.OperatorKickParam[] memory kickParams = @@ -217,8 +217,12 @@ contract OperatorSetUser is User { mstore(add(signature, 0x40), s) } signature[signature.length - 1] = bytes1(v); - ISignatureUtils.SignatureWithSaltAndExpiry memory churnApproverSignature = ISignatureUtils - .SignatureWithSaltAndExpiry({signature: signature, salt: _salt, expiry: expiry}); + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory churnApproverSignature = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ + signature: signature, + salt: _salt, + expiry: expiry + }); return (kickParams, churnApproverSignature); } diff --git a/test/integration/User.t.sol b/test/integration/User.t.sol index a8946a7a..b6f31cdc 100644 --- a/test/integration/User.t.sol +++ b/test/integration/User.t.sol @@ -5,7 +5,10 @@ import "forge-std/Test.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; // Interfaces -import "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; @@ -169,7 +172,7 @@ contract User is Test { ( ISlashingRegistryCoordinatorTypes.OperatorKickParam[] memory kickParams, - ISignatureUtils.SignatureWithSaltAndExpiry memory churnApproverSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory churnApproverSignature ) = _generateOperatorKickParams(allQuorums, churnQuorums, churnTargets, standardQuorums); vm.warp(block.timestamp + 1); @@ -285,10 +288,10 @@ contract User is Test { function _genAVSRegistrationSig() internal - returns (ISignatureUtils.SignatureWithSaltAndExpiry memory) + returns (ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory) { - ISignatureUtils.SignatureWithSaltAndExpiry memory signature = ISignatureUtils - .SignatureWithSaltAndExpiry({ + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signature = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ signature: new bytes(0), salt: bytes32(salt++), expiry: type(uint256).max @@ -355,7 +358,7 @@ contract User is Test { virtual returns ( ISlashingRegistryCoordinatorTypes.OperatorKickParam[] memory, - ISignatureUtils.SignatureWithSaltAndExpiry memory + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory ) { ISlashingRegistryCoordinator.OperatorKickParam[] memory kickParams = @@ -410,8 +413,12 @@ contract User is Test { mstore(add(signature, 0x40), s) } signature[signature.length - 1] = bytes1(v); - ISignatureUtils.SignatureWithSaltAndExpiry memory churnApproverSignature = ISignatureUtils - .SignatureWithSaltAndExpiry({signature: signature, salt: _salt, expiry: expiry}); + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory churnApproverSignature = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ + signature: signature, + salt: _salt, + expiry: expiry + }); return (kickParams, churnApproverSignature); } diff --git a/test/mocks/AVSDirectoryMock.sol b/test/mocks/AVSDirectoryMock.sol index d76f1abf..e90e5e4b 100644 --- a/test/mocks/AVSDirectoryMock.sol +++ b/test/mocks/AVSDirectoryMock.sol @@ -3,7 +3,10 @@ pragma solidity ^0.8.27; import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol"; import {OperatorSet} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IPauserRegistry} from "eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol"; @@ -24,14 +27,14 @@ contract AVSDirectoryMock is IAVSDirectory { function registerOperatorToOperatorSets( address operator, uint32[] calldata operatorSetIds, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external {} function forceDeregisterFromOperatorSets( address operator, address avs, uint32[] calldata operatorSetIds, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external {} function deregisterOperatorFromOperatorSets( @@ -59,7 +62,7 @@ contract AVSDirectoryMock is IAVSDirectory { function registerOperatorToAVS( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external {} function deregisterOperatorFromAVS( diff --git a/test/mocks/DelegationMock.sol b/test/mocks/DelegationMock.sol index 9aadf9e2..0c722999 100644 --- a/test/mocks/DelegationMock.sol +++ b/test/mocks/DelegationMock.sol @@ -10,7 +10,10 @@ import {IStrategyManager} from "eigenlayer-contracts/src/contracts/interfaces/IS import {StrategyManager} from "eigenlayer-contracts/src/contracts/core/StrategyManager.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IPauserRegistry} from "eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {SlashingLib} from "eigenlayer-contracts/src/contracts/libraries/SlashingLib.sol"; contract DelegationIntermediate is IDelegationManager { diff --git a/test/mocks/RegistryCoordinatorMock.sol b/test/mocks/RegistryCoordinatorMock.sol index 78c98660..e162355d 100644 --- a/test/mocks/RegistryCoordinatorMock.sol +++ b/test/mocks/RegistryCoordinatorMock.sol @@ -4,6 +4,10 @@ pragma solidity ^0.8.27; import "../../src/interfaces/IRegistryCoordinator.sol"; import "../../src/interfaces/ISlashingRegistryCoordinator.sol"; import "../../src/libraries/BN254.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; abstract contract RegistryCoordinatorMock is IRegistryCoordinator { // Add missing function declarations from interface @@ -62,15 +66,15 @@ abstract contract RegistryCoordinatorMock is IRegistryCoordinator { bytes memory quorumNumbers, string memory socket, IBLSApkRegistryTypes.PubkeyRegistrationParams memory params, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external virtual; function registerOperatorWithChurn( bytes calldata quorumNumbers, string memory socket, IBLSApkRegistryTypes.PubkeyRegistrationParams memory params, - OperatorKickParam[] memory operatorKickParams, - ISignatureUtils.SignatureWithSaltAndExpiry memory churnApproverSignature, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ISlashingRegistryCoordinatorTypes.OperatorKickParam[] memory kickParams, + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory churnApproverSignature, + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature ) external virtual; function setChurnApprover( address _churnApprover diff --git a/test/unit/ECDSAServiceManager.t.sol b/test/unit/ECDSAServiceManager.t.sol index 5afc891e..31b2c0a3 100644 --- a/test/unit/ECDSAServiceManager.t.sol +++ b/test/unit/ECDSAServiceManager.t.sol @@ -3,7 +3,10 @@ pragma solidity ^0.8.27; import {Test, console} from "forge-std/Test.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; import {IRewardsCoordinator} from @@ -35,7 +38,7 @@ contract MockDelegationManager { contract MockAVSDirectory { function registerOperatorToAVS( address, - ISignatureUtils.SignatureWithSaltAndExpiry memory + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory ) external pure {} function deregisterOperatorFromAVS( @@ -120,7 +123,7 @@ contract ECDSAServiceManagerSetup is Test { 10000, // Assuming a threshold weight of 10000 basis points quorum ); - ISignatureUtils.SignatureWithSaltAndExpiry memory dummySignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory dummySignature; vm.prank(operator1); mockStakeRegistry.registerOperatorWithSignature(dummySignature, operator1); @@ -131,7 +134,7 @@ contract ECDSAServiceManagerSetup is Test { function testRegisterOperatorToAVS() public { address operator = operator1; - ISignatureUtils.SignatureWithSaltAndExpiry memory signature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signature; vm.prank(address(mockStakeRegistry)); serviceManager.registerOperatorToAVS(operator, signature); diff --git a/test/unit/ECDSAStakeRegistryEqualWeightUnit.t.sol b/test/unit/ECDSAStakeRegistryEqualWeightUnit.t.sol index befc76c4..60cbd94e 100644 --- a/test/unit/ECDSAStakeRegistryEqualWeightUnit.t.sol +++ b/test/unit/ECDSAStakeRegistryEqualWeightUnit.t.sol @@ -1,7 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; @@ -29,7 +32,8 @@ contract EqualWeightECDSARegistry is ECDSAStakeRegistrySetup { fixedWeightRegistry.permitOperator(operator1); fixedWeightRegistry.permitOperator(operator2); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + address operator = address(0x123); + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; vm.prank(operator1); fixedWeightRegistry.registerOperatorWithSignature(operatorSignature, operator1); vm.prank(operator2); @@ -50,7 +54,8 @@ contract EqualWeightECDSARegistry is ECDSAStakeRegistrySetup { assertEq(fixedWeightRegistry.getLastCheckpointTotalWeight(), 1); vm.roll(block.number + 1); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + address operator = address(0x123); + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; vm.prank(operator1); fixedWeightRegistry.registerOperatorWithSignature(operatorSignature, operator1); diff --git a/test/unit/ECDSAStakeRegistryPermissionedUnit.t.sol b/test/unit/ECDSAStakeRegistryPermissionedUnit.t.sol index 7269e1ce..61c355d0 100644 --- a/test/unit/ECDSAStakeRegistryPermissionedUnit.t.sol +++ b/test/unit/ECDSAStakeRegistryPermissionedUnit.t.sol @@ -1,7 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.27; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; @@ -30,7 +33,7 @@ contract PermissionedECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { permissionedRegistry.permitOperator(operator1); permissionedRegistry.permitOperator(operator2); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; vm.prank(operator1); permissionedRegistry.registerOperatorWithSignature(operatorSignature, operator1); vm.prank(operator2); @@ -89,7 +92,7 @@ contract PermissionedECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { function test_RevertsWhen_NotAllowlisted_RegisterOperatorWithSig() public { address operator3 = address(0xBEEF); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; vm.expectRevert( abi.encodeWithSelector(ECDSAStakeRegistryPermissioned.OperatorNotAllowlisted.selector) ); @@ -100,7 +103,7 @@ contract PermissionedECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { function test_WhenAllowlisted_RegisterOperatorWithSig() public { address operator3 = address(0xBEEF); permissionedRegistry.permitOperator(operator3); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; vm.prank(operator3); permissionedRegistry.registerOperatorWithSignature(operatorSignature, operator3); } @@ -108,7 +111,7 @@ contract PermissionedECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { function test_DeregisterOperator() public { address operator3 = address(0xBEEF); permissionedRegistry.permitOperator(operator3); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; vm.prank(operator3); permissionedRegistry.registerOperatorWithSignature(operatorSignature, operator3); diff --git a/test/unit/ECDSAStakeRegistryUnit.t.sol b/test/unit/ECDSAStakeRegistryUnit.t.sol index 540f8dcc..ead8b571 100644 --- a/test/unit/ECDSAStakeRegistryUnit.t.sol +++ b/test/unit/ECDSAStakeRegistryUnit.t.sol @@ -3,7 +3,10 @@ pragma solidity ^0.8.27; import {Test, console} from "forge-std/Test.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; @@ -24,7 +27,7 @@ contract MockServiceManager { function registerOperatorToAVS( address, - ISignatureUtils.SignatureWithSaltAndExpiry memory // solhint-disable-next-line + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory // solhint-disable-next-line ) external {} } @@ -72,7 +75,7 @@ contract ECDSAStakeRegistrySetup is Test, IECDSAStakeRegistryEvents { IECDSAStakeRegistryTypes.StrategyParams({strategy: mockStrategy, multiplier: 10000}); registry = new ECDSAStakeRegistry(IDelegationManager(address(mockDelegationManager))); registry.initialize(address(mockServiceManager), 100, quorum); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; vm.prank(operator1); registry.registerOperatorWithSignature(operatorSignature, operator1); vm.prank(operator2); @@ -193,7 +196,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { function test_RegisterOperatorWithSignature() public { address operator3 = address(0x125); - ISignatureUtils.SignatureWithSaltAndExpiry memory signature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signature; vm.prank(operator3); registry.registerOperatorWithSignature(signature, operator3); assertTrue(registry.operatorRegistered(operator3)); @@ -204,7 +207,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { assertEq(registry.getLastCheckpointOperatorWeight(operator1), 1000); assertEq(registry.getLastCheckpointTotalWeight(), 2000); - ISignatureUtils.SignatureWithSaltAndExpiry memory signature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signature; vm.expectRevert(IECDSAStakeRegistryErrors.OperatorAlreadyRegistered.selector); vm.prank(operator1); registry.registerOperatorWithSignature(signature, operator1); @@ -217,7 +220,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { abi.encodeWithSelector( MockServiceManager.registerOperatorToAVS.selector, operator1, - ISignatureUtils.SignatureWithSaltAndExpiry({ + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ signature: signatureData, salt: bytes32(uint256(0x120)), expiry: 10 @@ -599,7 +602,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { vm.prank(operator2); registry.deregisterOperator(); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; address[] memory operators = new address[](30); for (uint256 i; i < operators.length; i++) { operators[i] = address(uint160(i)); @@ -621,7 +624,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { registry.deregisterOperator(); msgHash = keccak256("data"); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; address[] memory operators = new address[](30); bytes[] memory signatures = new bytes[](30); uint8 v; @@ -653,7 +656,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { function test_WhenUsingSigningKey_RegierOperatorWithSignature() public { address operator = operator3; - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; // Register operator with a different signing key vm.prank(operator); @@ -671,7 +674,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { function test_Twice_RegierOperatorWithSignature() public { address operator = operator3; - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; // Register operator with a different signing key vm.prank(operator); @@ -697,7 +700,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { function test_WhenUsingSigningKey_CheckSignatures() public { address operator = operator3; - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; // Register operator with a different signing key vm.prank(operator); @@ -723,7 +726,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { address initialSigningKey = address(vm.addr(signerPk)); address updatedSigningKey = address(vm.addr(signerPk + 1)); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; // Register operator with the initial signing key vm.prank(operator); @@ -764,7 +767,7 @@ contract ECDSAStakeRegistryTest is ECDSAStakeRegistrySetup { address initialSigningKey = address(vm.addr(signerPk)); address updatedSigningKey = address(vm.addr(signerPk + 1)); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; // Register operator with the initial signing key vm.prank(operator); diff --git a/test/unit/RegistryCoordinatorUnit.t.sol b/test/unit/RegistryCoordinatorUnit.t.sol index 9711f7ee..f38e57dc 100644 --- a/test/unit/RegistryCoordinatorUnit.t.sol +++ b/test/unit/RegistryCoordinatorUnit.t.sol @@ -14,6 +14,11 @@ import { IRegistryCoordinatorErrors } from "../../src/interfaces/IRegistryCoordinator.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; + import {IBLSApkRegistryTypes} from "../../src/interfaces/IBLSApkRegistry.sol"; import {QuorumBitmapHistoryLib} from "../../src/libraries/QuorumBitmapHistoryLib.sol"; import {BitmapUtils} from "../../src/libraries/BitmapUtils.sol"; @@ -278,7 +283,7 @@ contract RegistryCoordinatorUnitTests_Initialization_Setters is RegistryCoordina contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUnitTests { function test_registerOperator_revert_paused() public { bytes memory emptyQuorumNumbers = new bytes(0); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; // pause registerOperator cheats.prank(pauser); @@ -293,7 +298,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni function test_registerOperator_revert_emptyQuorumNumbers() public { bytes memory emptyQuorumNumbers = new bytes(0); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; cheats.expectRevert(bytes4(keccak256("BitmapEmpty()"))); cheats.prank(defaultOperator); @@ -304,7 +309,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni function test_registerOperator_revert_invalidQuorum() public { bytes memory quorumNumbersTooLarge = new bytes(1); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; quorumNumbersTooLarge[0] = 0xC0; @@ -318,7 +323,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni function test_registerOperator_revert_nonexistentQuorum() public { _deployMockEigenLayerAndAVS(10); bytes memory quorumNumbersNotCreated = new bytes(1); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; quorumNumbersNotCreated[0] = 0x0B; @@ -331,7 +336,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni function test_registerOperator_singleQuorum() public { bytes memory quorumNumbers = new bytes(1); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; quorumNumbers[0] = bytes1(defaultQuorumNumber); uint96 actualStake = _setOperatorWeight(defaultOperator, defaultQuorumNumber, defaultStake); @@ -390,7 +395,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni ) public { // filter the fuzzed input down to only valid quorums quorumBitmap = quorumBitmap & MAX_QUORUM_BITMAP; - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; cheats.assume(quorumBitmap != 0); bytes memory quorumNumbers = BitmapUtils.bitmapToBytesArray(quorumBitmap); @@ -456,7 +461,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni function test_registerOperator_addingQuorumsAfterInitialRegistration() public { uint256 registrationBlockNumber = block.number + 100; uint256 nextRegistrationBlockNumber = registrationBlockNumber + 100; - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); @@ -538,7 +543,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni ) public { uint32 numOperators = defaultMaxOperatorCount; uint32 registrationBlockNumber = 200; - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); @@ -573,7 +578,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni function test_registerOperator_revert_operatorAlreadyRegisteredForQuorum() public { uint256 registrationBlockNumber = block.number + 100; uint256 nextRegistrationBlockNumber = registrationBlockNumber + 100; - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); @@ -597,7 +602,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni // tests for the internal `_registerOperator` function: function test_registerOperatorInternal_revert_noQuorums() public { bytes memory emptyQuorumNumbers = new bytes(0); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; cheats.expectRevert(bytes4(keccak256("BitmapEmpty()"))); registryCoordinator._registerOperatorExternal( @@ -607,7 +612,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni function test_registerOperatorInternal_revert_nonexistentQuorum() public { bytes memory quorumNumbersTooLarge = new bytes(1); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; quorumNumbersTooLarge[0] = 0xC0; @@ -618,7 +623,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni } function test_registerOperatorInternal_revert_operatorAlreadyRegisteredForQuorum() public { - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); @@ -635,7 +640,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperator is RegistryCoordinatorUni function test_registerOperatorInternal() public { bytes memory quorumNumbers = new bytes(1); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; quorumNumbers[0] = bytes1(defaultQuorumNumber); defaultStake = _setOperatorWeight(defaultOperator, uint8(quorumNumbers[0]), defaultStake); @@ -726,7 +731,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is // @notice verifies that an operator who was registered for a single quorum can be deregistered function test_deregisterOperator_singleQuorumAndSingleOperator() public { - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; uint32 deregistrationBlockNumber = 200; @@ -790,7 +795,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is function testFuzz_deregisterOperator_fuzzedQuorumAndSingleOperator( uint256 quorumBitmap ) public { - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; uint32 deregistrationBlockNumber = 200; @@ -860,7 +865,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is uint256 registrationQuorumBitmap, uint256 deregistrationQuorumBitmap ) public { - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; uint32 deregistrationBlockNumber = 200; @@ -1077,7 +1082,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is function test_reregisterOperator() public { test_deregisterOperator_singleQuorumAndSingleOperator(); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 reregistrationBlockNumber = 201; bytes memory quorumNumbers = new bytes(1); @@ -1144,7 +1149,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is // tests for the internal `_deregisterOperator` function: function test_deregisterOperatorExternal_revert_noQuorums() public { - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; uint32 deregistrationBlockNumber = 200; @@ -1173,7 +1178,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is } function test_deregisterOperatorExternal_revert_incorrectQuorums() public { - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; uint32 deregistrationBlockNumber = 200; @@ -1202,7 +1207,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is cheats.prank(registryCoordinatorOwner); registryCoordinator.setEjectionCooldown(reregistrationDelay); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; uint32 reregistrationBlockNumber = 200; @@ -1234,7 +1239,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is cheats.prank(registryCoordinatorOwner); registryCoordinator.setEjectionCooldown(reregistrationDelay); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; uint32 reregistrationBlockNumber = 200; @@ -1267,7 +1272,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is uint256 registrationQuorumBitmap, uint256 deregistrationQuorumBitmap ) public { - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; uint32 deregistrationBlockNumber = 200; @@ -1380,7 +1385,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is // register operator with default stake with default quorum number bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; _setOperatorWeight(defaultOperator, uint8(quorumNumbers[0]), defaultStake); @@ -1420,7 +1425,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is bytes memory quorumNumbers = new bytes(2); quorumNumbers[0] = bytes1(defaultQuorumNumber); quorumNumbers[1] = bytes1(defaultQuorumNumber + 1); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; for (uint256 i = 0; i < quorumNumbers.length; i++) { _setOperatorWeight(defaultOperator, uint8(quorumNumbers[i]), defaultStake); @@ -1468,7 +1473,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is function test_ejectOperator_revert_notEjector() public { bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; _setOperatorWeight(defaultOperator, uint8(quorumNumbers[0]), defaultStake); @@ -1494,7 +1499,7 @@ contract RegistryCoordinatorUnitTests_DeregisterOperator_EjectOperator is // @notice tests for correct reversion and return values in the event that an operator registers function test_getQuorumBitmapIndicesAtBlockNumber_operatorRegistered() public { // register the operator - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); @@ -1737,8 +1742,8 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord emit QuorumIndexUpdate(operatorToRegisterId, defaultQuorumNumber, numOperators - 1); { - ISignatureUtils.SignatureWithSaltAndExpiry memory emptyAVSRegSig; - ISignatureUtils.SignatureWithSaltAndExpiry memory signatureWithExpiry = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptyAVSRegSig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signatureWithExpiry = _signOperatorChurnApproval( operatorToRegister, operatorToRegisterId, @@ -1803,7 +1808,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord ) public { bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptyAVSRegSig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptyAVSRegSig; ( address operatorToRegister, @@ -1815,7 +1820,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord _setOperatorWeight(operatorToRegister, defaultQuorumNumber, defaultStake); cheats.roll(registrationBlockNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory signatureWithExpiry = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signatureWithExpiry = _signOperatorChurnApproval( operatorToRegister, operatorToRegisterId, @@ -1840,7 +1845,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord ) public { bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptyAVSRegSig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptyAVSRegSig; uint96 operatorToKickStake = defaultMaxOperatorCount * defaultStake; ( @@ -1860,7 +1865,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord ); cheats.roll(registrationBlockNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory signatureWithExpiry = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signatureWithExpiry = _signOperatorChurnApproval( operatorToRegister, operatorToRegisterId, @@ -1885,7 +1890,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord ) public { bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptyAVSRegSig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptyAVSRegSig; ( address operatorToRegister, @@ -1897,7 +1902,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord _setOperatorWeight(operatorToRegister, defaultQuorumNumber, registeringStake); cheats.roll(registrationBlockNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory signatureWithSaltAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signatureWithSaltAndExpiry; signatureWithSaltAndExpiry.expiry = block.timestamp + 10; signatureWithSaltAndExpiry.signature = hex"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B"; @@ -1919,7 +1924,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord ) public { bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory emptyAVSRegSig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptyAVSRegSig; ( address operatorToRegister, @@ -1932,7 +1937,7 @@ contract RegistryCoordinatorUnitTests_RegisterOperatorWithChurn is RegistryCoord _setOperatorWeight(operatorToRegister, defaultQuorumNumber, registeringStake); cheats.roll(registrationBlockNumber); - ISignatureUtils.SignatureWithSaltAndExpiry memory signatureWithSaltAndExpiry = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory signatureWithSaltAndExpiry = _signOperatorChurnApproval( operatorToRegister, operatorToRegisterId, @@ -1968,7 +1973,7 @@ contract RegistryCoordinatorUnitTests_UpdateOperators is RegistryCoordinatorUnit // @notice tests the `updateOperators` function with a single registered operator as input function test_updateOperators_singleOperator() public { // register the default operator - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); @@ -1997,7 +2002,7 @@ contract RegistryCoordinatorUnitTests_UpdateOperators is RegistryCoordinatorUnit emit log_named_uint("mockReturnData", mockReturnData); // register the default operator - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; bytes memory quorumNumbers = BitmapUtils.bitmapToBytesArray(registrationBitmap); for (uint256 i = 0; i < quorumNumbers.length; ++i) { @@ -2089,7 +2094,7 @@ contract RegistryCoordinatorUnitTests_UpdateOperators is RegistryCoordinatorUnit function test_updateOperatorsForQuorum_revert_unregisteredOperator() public { // register the default operator - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); @@ -2172,7 +2177,7 @@ contract RegistryCoordinatorUnitTests_UpdateOperators is RegistryCoordinatorUnit function test_updateOperatorsForQuorum_singleOperator() public { // register the default operator - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySig; uint32 registrationBlockNumber = 100; bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(defaultQuorumNumber); @@ -2437,8 +2442,12 @@ contract RegistryCoordinatorUnitTests_AfterMigration is RegistryCoordinatorUnitT operatorToRegister.key.addr, address(registryCoordinator), salt, expiry ); bytes memory signature = OperatorKeyOperationsLib.sign(operatorToRegister.key, digestHash); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = ISignatureUtils - .SignatureWithSaltAndExpiry({signature: signature, salt: salt, expiry: expiry}); + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ + signature: signature, + salt: salt, + expiry: expiry + }); bytes32 messageHash = registryCoordinator.calculatePubkeyRegistrationMessageHash(operatorToRegister.key.addr); @@ -2485,7 +2494,7 @@ contract RegistryCoordinatorUnitTests_AfterMigration is RegistryCoordinatorUnitT bytes memory quorumNumbers = new bytes(1); quorumNumbers[0] = bytes1(uint8(0)); IBLSApkRegistryTypes.PubkeyRegistrationParams memory params; - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature; cheats.expectRevert(); registryCoordinator.registerOperator( @@ -2629,7 +2638,7 @@ contract RegistryCoordinatorUnitTests_AfterMigration is RegistryCoordinatorUnitT quorumNumber: 0 }); - ISignatureUtils.SignatureWithSaltAndExpiry memory churnApproverSignature; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory churnApproverSignature; // Encode with RegistrationType.CHURN bytes memory data = abi.encode( diff --git a/test/utils/CoreDeployLib.sol b/test/utils/CoreDeployLib.sol index c0f474e7..948ac2ee 100644 --- a/test/utils/CoreDeployLib.sol +++ b/test/utils/CoreDeployLib.sol @@ -18,7 +18,10 @@ import {StrategyBaseTVLLimits} from import {PauserRegistry} from "eigenlayer-contracts/src/contracts/permissions/PauserRegistry.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; import {IBeacon} from "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; diff --git a/test/utils/MockAVSDeployer.sol b/test/utils/MockAVSDeployer.sol index 5a9f2346..4597f0e9 100644 --- a/test/utils/MockAVSDeployer.sol +++ b/test/utils/MockAVSDeployer.sol @@ -8,7 +8,10 @@ import {ITransparentUpgradeableProxy} from import {PauserRegistry} from "eigenlayer-contracts/src/contracts/permissions/PauserRegistry.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {BitmapUtils} from "../../src/libraries/BitmapUtils.sol"; import {BN254} from "../../src/libraries/BN254.sol"; @@ -420,7 +423,7 @@ contract MockAVSDeployer is Test { _setOperatorWeight(operator, uint8(quorumNumbers[i]), stake); } - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySignatureAndExpiry; cheats.prank(operator); registryCoordinator.registerOperator( quorumNumbers, defaultSocket, pubkeyRegistrationParams, emptySignatureAndExpiry @@ -446,7 +449,7 @@ contract MockAVSDeployer is Test { _setOperatorWeight(operator, uint8(quorumNumbers[i]), stakes[uint8(quorumNumbers[i])]); } - ISignatureUtils.SignatureWithSaltAndExpiry memory emptySignatureAndExpiry; + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory emptySignatureAndExpiry; cheats.prank(operator); registryCoordinator.registerOperator( quorumNumbers, defaultSocket, pubkeyRegistrationParams, emptySignatureAndExpiry @@ -541,12 +544,12 @@ contract MockAVSDeployer is Test { ISlashingRegistryCoordinator.OperatorKickParam[] memory operatorKickParams, bytes32 salt, uint256 expiry - ) internal view returns (ISignatureUtils.SignatureWithSaltAndExpiry memory) { + ) internal view returns (ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory) { bytes32 digestHash = registryCoordinator.calculateOperatorChurnApprovalDigestHash( registeringOperator, registeringOperatorId, operatorKickParams, salt, expiry ); (uint8 v, bytes32 r, bytes32 s) = vm.sign(churnApproverPrivateKey, digestHash); - return ISignatureUtils.SignatureWithSaltAndExpiry({ + return ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ signature: abi.encodePacked(r, s, v), expiry: expiry, salt: salt From c4d9160d293bcb91d4b13f84d18f24079ae8033d Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 14 Mar 2025 14:03:22 -0400 Subject: [PATCH 3/6] fix: type issues --- src/RegistryCoordinator.sol | 19 ++++++++++ src/SlashingRegistryCoordinator.sol | 21 ++++++++++- test/integration/IntegrationDeployer.t.sol | 33 +++++++---------- test/mocks/AVSDirectoryMock.sol | 17 +++++++++ test/mocks/AllocationManagerMock.sol | 27 ++++++++++++++ test/mocks/DelegationMock.sol | 43 +++++++++++++++++++++- test/mocks/EigenPodManagerMock.sol | 13 ++++++- test/mocks/PermissionControllerMock.sol | 9 +++++ test/mocks/RewardsCoordinatorMock.sol | 9 +++++ test/utils/MockAVSDeployer.sol | 5 ++- 10 files changed, 169 insertions(+), 27 deletions(-) diff --git a/src/RegistryCoordinator.sol b/src/RegistryCoordinator.sol index 831a36d0..dd1ab2b2 100644 --- a/src/RegistryCoordinator.sol +++ b/src/RegistryCoordinator.sol @@ -6,6 +6,9 @@ import { IAllocationManager, OperatorSet } from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; +import {ISignatureUtilsMixin} from + "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; +import {ISemVerMixin} from "eigenlayer-contracts/src/contracts/interfaces/ISemVerMixin.sol"; import {IBLSApkRegistry, IBLSApkRegistryTypes} from "./interfaces/IBLSApkRegistry.sol"; import {IStakeRegistry} from "./interfaces/IStakeRegistry.sol"; import {IIndexRegistry} from "./interfaces/IIndexRegistry.sol"; @@ -293,4 +296,20 @@ contract RegistryCoordinator is RegistryCoordinatorStorage { ) external view returns (bool) { return _isM2Quorum(quorumNumber); } + + /** + * @notice Returns the domain separator used for EIP-712 signatures + * @return The domain separator + */ + function domainSeparator() external view override returns (bytes32) { + return bytes32(0); // Return a dummy value for now + } + + /** + * @notice Returns the version of the contract + * @return The version string + */ + function version() external pure override returns (string memory) { + return "v0.0.1"; + } } diff --git a/src/SlashingRegistryCoordinator.sol b/src/SlashingRegistryCoordinator.sol index dc764e40..10ff5aa3 100644 --- a/src/SlashingRegistryCoordinator.sol +++ b/src/SlashingRegistryCoordinator.sol @@ -11,6 +11,7 @@ import { OperatorSet, IAllocationManagerTypes } from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol"; +import {ISemVerMixin} from "eigenlayer-contracts/src/contracts/interfaces/ISemVerMixin.sol"; import {IBLSApkRegistry, IBLSApkRegistryTypes} from "./interfaces/IBLSApkRegistry.sol"; import {IStakeRegistry, IStakeRegistryTypes} from "./interfaces/IStakeRegistry.sol"; @@ -40,11 +41,11 @@ import {SlashingRegistryCoordinatorStorage} from "./SlashingRegistryCoordinatorS * @author Layr Labs, Inc. */ contract SlashingRegistryCoordinator is - EIP712, + SlashingRegistryCoordinatorStorage, Initializable, + EIP712, Pausable, OwnableUpgradeable, - SlashingRegistryCoordinatorStorage, ISignatureUtilsMixin { using BitmapUtils for *; @@ -1115,4 +1116,20 @@ contract SlashingRegistryCoordinator is ) public view virtual returns (bool) { return _avs == address(avs); } + + /** + * @notice Returns the domain separator used for EIP-712 signatures + * @return The domain separator + */ + function domainSeparator() external view returns (bytes32) { + return _domainSeparatorV4(); + } + + /** + * @notice Returns the version of the contract + * @return The version string + */ + function version() external pure returns (string memory) { + return "v0.0.1"; + } } diff --git a/test/integration/IntegrationDeployer.t.sol b/test/integration/IntegrationDeployer.t.sol index 60c47dac..dcedc465 100644 --- a/test/integration/IntegrationDeployer.t.sol +++ b/test/integration/IntegrationDeployer.t.sol @@ -188,11 +188,12 @@ abstract contract IntegrationDeployer is Test, IUserDeployer { ); // Deploy EigenPod Contracts - pod = new EigenPod(ethPOSDeposit, eigenPodManager, GENESIS_TIME_LOCAL); + pod = new EigenPod(ethPOSDeposit, eigenPodManager, GENESIS_TIME_LOCAL, address(0)); eigenPodBeacon = new UpgradeableBeacon(address(pod)); - PermissionController permissionControllerImplementation = new PermissionController(); + PermissionController permissionControllerImplementation = + new PermissionController(address(0)); // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs DelegationManager delegationImplementation = new DelegationManager( @@ -201,34 +202,26 @@ abstract contract IntegrationDeployer is Test, IUserDeployer { allocationManager, pauserRegistry, permissionController, - 0 + 0, + address(0) ); StrategyManager strategyManagerImplementation = - new StrategyManager(delegationManager, pauserRegistry); - EigenPodManager eigenPodManagerImplementation = - new EigenPodManager(ethPOSDeposit, eigenPodBeacon, delegationManager, pauserRegistry); + new StrategyManager(delegationManager, pauserRegistry, address(0)); + EigenPodManager eigenPodManagerImplementation = new EigenPodManager( + ethPOSDeposit, eigenPodBeacon, delegationManager, pauserRegistry, address(0) + ); AVSDirectory avsDirectoryImplementation = - new AVSDirectory(delegationManager, pauserRegistry); + new AVSDirectory(delegationManager, pauserRegistry, address(0)); - RewardsCoordinator rewardsCoordinatorImplementation = new RewardsCoordinator( - delegationManager, - IStrategyManager(address(strategyManager)), - allocationManager, - pauserRegistry, - permissionController, - CALCULATION_INTERVAL_SECONDS, - MAX_REWARDS_DURATION, - MAX_RETROACTIVE_LENGTH, - MAX_FUTURE_LENGTH, - GENESIS_REWARDS_TIMESTAMP - ); + RewardsCoordinator rewardsCoordinatorImplementation = new RewardsCoordinator(address(0)); AllocationManager allocationManagerImplementation = new AllocationManager( delegationManager, pauserRegistry, permissionController, uint32(7 days), // DEALLOCATION_DELAY - uint32(1 days) // ALLOCATION_CONFIGURATION_DELAY + uint32(1 days), // ALLOCATION_CONFIGURATION_DELAY + address(0) // Added config parameter ); // Third, upgrade the proxy contracts to point to the implementations diff --git a/test/mocks/AVSDirectoryMock.sol b/test/mocks/AVSDirectoryMock.sol index e90e5e4b..1f175da4 100644 --- a/test/mocks/AVSDirectoryMock.sol +++ b/test/mocks/AVSDirectoryMock.sol @@ -7,6 +7,7 @@ import { ISignatureUtilsMixin, ISignatureUtilsMixinTypes } from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; +import {ISemVerMixin} from "eigenlayer-contracts/src/contracts/interfaces/ISemVerMixin.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IPauserRegistry} from "eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol"; @@ -154,4 +155,20 @@ contract AVSDirectoryMock is IAVSDirectory { function isOperatorSetBatch( OperatorSet[] calldata operatorSets ) external view returns (bool) {} + + /** + * @notice Returns the domain separator used for EIP-712 signatures + * @return The domain separator + */ + function domainSeparator() external pure returns (bytes32) { + return bytes32(0); + } + + /** + * @notice Returns the version of the contract + * @return The version string + */ + function version() external pure returns (string memory) { + return "v0.0.1"; + } } diff --git a/test/mocks/AllocationManagerMock.sol b/test/mocks/AllocationManagerMock.sol index 22b92b74..2a04727a 100644 --- a/test/mocks/AllocationManagerMock.sol +++ b/test/mocks/AllocationManagerMock.sol @@ -8,6 +8,7 @@ import { import {IAVSRegistrar} from "eigenlayer-contracts/src/contracts/interfaces/IAVSRegistrar.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IPauserRegistry} from "eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol"; +import {ISemVerMixin} from "eigenlayer-contracts/src/contracts/interfaces/ISemVerMixin.sol"; contract AllocationManagerIntermediate is IAllocationManager { function initialize(address initialOwner, uint256 initialPausedStatus) external virtual {} @@ -149,6 +150,32 @@ contract AllocationManagerIntermediate is IAllocationManager { address operator, OperatorSet memory operatorSet ) external view virtual returns (bool) {} + + function getAllocatedStake( + address operator, + OperatorSet memory operatorSet, + IStrategy strategy + ) external view virtual returns (uint256) { + return 0; + } + + function getEncumberedMagnitude( + address operator, + IStrategy strategy + ) external view virtual returns (uint64) { + return 0; + } + + function isOperatorSlashable( + address operator, + OperatorSet memory operatorSet + ) external view virtual returns (bool) { + return false; + } + + function version() external pure virtual returns (string memory) { + return "v0.0.1"; + } } contract AllocationManagerMock is AllocationManagerIntermediate {} diff --git a/test/mocks/DelegationMock.sol b/test/mocks/DelegationMock.sol index 0c722999..86eb8c07 100644 --- a/test/mocks/DelegationMock.sol +++ b/test/mocks/DelegationMock.sol @@ -6,6 +6,8 @@ import {console2 as console} from "forge-std/Test.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {IDelegationManagerTypes} from + "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; import {IStrategyManager} from "eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; import {StrategyManager} from "eigenlayer-contracts/src/contracts/core/StrategyManager.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; @@ -14,6 +16,7 @@ import { ISignatureUtilsMixin, ISignatureUtilsMixinTypes } from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; +import {ISemVerMixin} from "eigenlayer-contracts/src/contracts/interfaces/ISemVerMixin.sol"; import {SlashingLib} from "eigenlayer-contracts/src/contracts/libraries/SlashingLib.sol"; contract DelegationIntermediate is IDelegationManager { @@ -239,17 +242,53 @@ contract DelegationIntermediate is IDelegationManager { function getQueuedWithdrawal( bytes32 withdrawalRoot - ) external view override returns (Withdrawal memory) {} + ) + external + view + override + returns (IDelegationManagerTypes.Withdrawal memory withdrawal, uint256[] memory shares) + { + return ( + IDelegationManagerTypes.Withdrawal({ + staker: address(0), + delegatedTo: address(0), + withdrawer: address(0), + nonce: 0, + startBlock: 0, + strategies: new IStrategy[](0), + scaledShares: new uint256[](0) + }), + new uint256[](0) + ); + } function getQueuedWithdrawalRoots( address staker - ) external view override returns (bytes32[] memory) {} + ) external view override returns (bytes32[] memory) { + return new bytes32[](0); + } function convertToDepositShares( address staker, IStrategy[] memory strategies, uint256[] memory withdrawableShares ) external view override returns (uint256[] memory) {} + + /** + * @notice Returns the domain separator used for EIP-712 signatures + * @return The domain separator + */ + function domainSeparator() external pure returns (bytes32) { + return bytes32(0); + } + + /** + * @notice Returns the version of the contract + * @return The version string + */ + function version() external pure returns (string memory) { + return "v0.0.1"; + } } contract DelegationMock is DelegationIntermediate { diff --git a/test/mocks/EigenPodManagerMock.sol b/test/mocks/EigenPodManagerMock.sol index dccdbef8..30870792 100644 --- a/test/mocks/EigenPodManagerMock.sol +++ b/test/mocks/EigenPodManagerMock.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.9; import "forge-std/Test.sol"; import "eigenlayer-contracts/src/contracts/permissions/Pausable.sol"; import "eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; +import "eigenlayer-contracts/src/contracts/interfaces/ISemVerMixin.sol"; contract EigenPodManagerMock is Test, Pausable, IEigenPodManager { receive() external payable {} @@ -75,7 +76,9 @@ contract EigenPodManagerMock is Test, Pausable, IEigenPodManager { address staker, IStrategy strategy, uint256 depositSharesToRemove - ) external {} + ) external returns (uint256, uint256) { + return (0, 0); + } function stakerDepositShares( address user, @@ -109,4 +112,12 @@ contract EigenPodManagerMock is Test, Pausable, IEigenPodManager { function burnableETHShares() external view returns (uint256) {} function increaseBurnableShares(IStrategy strategy, uint256 addedSharesToBurn) external {} + + /** + * @notice Returns the version of the contract + * @return The version string + */ + function version() external pure returns (string memory) { + return "v0.0.1"; + } } diff --git a/test/mocks/PermissionControllerMock.sol b/test/mocks/PermissionControllerMock.sol index 11452675..6a6cc05e 100644 --- a/test/mocks/PermissionControllerMock.sol +++ b/test/mocks/PermissionControllerMock.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.27; import {IPermissionController} from "eigenlayer-contracts/src/contracts/interfaces/IPermissionController.sol"; +import {ISemVerMixin} from "eigenlayer-contracts/src/contracts/interfaces/ISemVerMixin.sol"; contract PermissionControllerIntermediate is IPermissionController { function addPendingAdmin(address account, address admin) external virtual {} @@ -61,6 +62,14 @@ contract PermissionControllerIntermediate is IPermissionController { address target, bytes4 selector ) external virtual returns (address[] memory) {} + + /** + * @notice Returns the version of the contract + * @return The version string + */ + function version() external pure virtual returns (string memory) { + return "v0.0.1"; + } } contract PermissionControllerMock is PermissionControllerIntermediate { diff --git a/test/mocks/RewardsCoordinatorMock.sol b/test/mocks/RewardsCoordinatorMock.sol index d376db78..37283ab9 100644 --- a/test/mocks/RewardsCoordinatorMock.sol +++ b/test/mocks/RewardsCoordinatorMock.sol @@ -6,6 +6,7 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IPauserRegistry} from "eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol"; import {IRewardsCoordinator} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol"; +import {ISemVerMixin} from "eigenlayer-contracts/src/contracts/interfaces/ISemVerMixin.sol"; import "./AVSDirectoryMock.sol"; contract RewardsCoordinatorMock is IRewardsCoordinator { @@ -158,4 +159,12 @@ contract RewardsCoordinatorMock is IRewardsCoordinator { function MAX_FUTURE_LENGTH() external view override returns (uint32) {} function GENESIS_REWARDS_TIMESTAMP() external view override returns (uint32) {} + + /** + * @notice Returns the version of the contract + * @return The version string + */ + function version() external pure returns (string memory) { + return "v0.0.1"; + } } diff --git a/test/utils/MockAVSDeployer.sol b/test/utils/MockAVSDeployer.sol index 4597f0e9..b7437718 100644 --- a/test/utils/MockAVSDeployer.sol +++ b/test/utils/MockAVSDeployer.sol @@ -171,7 +171,7 @@ contract MockAVSDeployer is Test { strategyManagerMock = new StrategyManagerMock(delegationMock); allocationManagerMock = new AllocationManagerMock(); permissionControllerMock = new PermissionControllerMock(); - avsDirectoryImplementation = new AVSDirectory(delegationMock, pauserRegistry); // TODO: config value + avsDirectoryImplementation = new AVSDirectory(delegationMock, pauserRegistry, address(0)); avsDirectory = AVSDirectory( address( new TransparentUpgradeableProxy( @@ -278,7 +278,8 @@ contract MockAVSDeployer is Test { pauserRegistry, permissionControllerMock, uint32(7 days), // DEALLOCATION_DELAY - uint32(1 days) // ALLOCATION_CONFIGURATION_DELAY + uint32(1 days), // ALLOCATION_CONFIGURATION_DELAY + address(0) // Added config parameter ); proxyAdmin.upgrade( ITransparentUpgradeableProxy(payable(address(allocationManager))), From 880e8702d3d8d4579f28a4fcc33a594a43cb49d9 Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 14 Mar 2025 14:17:09 -0400 Subject: [PATCH 4/6] fix: renaming constructor issues --- src/RegistryCoordinator.sol | 4 +- src/SlashingRegistryCoordinator.sol | 4 +- test/harnesses/AVSDirectoryHarness.sol | 5 ++- test/integration/CoreRegistration.t.sol | 5 ++- test/integration/IntegrationDeployer.t.sol | 35 ++++++++++----- test/mocks/AllocationManagerMock.sol | 24 +++++++--- test/mocks/EigenPodManagerMock.sol | 9 ++-- test/unit/ServiceManagerBase.t.sol | 28 +++++++----- test/unit/Utils.sol | 2 +- test/utils/CoreDeployLib.sol | 51 ++++++++++++++-------- test/utils/MockAVSDeployer.sol | 4 +- 11 files changed, 110 insertions(+), 61 deletions(-) diff --git a/src/RegistryCoordinator.sol b/src/RegistryCoordinator.sol index dd1ab2b2..9c688dd6 100644 --- a/src/RegistryCoordinator.sol +++ b/src/RegistryCoordinator.sol @@ -301,7 +301,7 @@ contract RegistryCoordinator is RegistryCoordinatorStorage { * @notice Returns the domain separator used for EIP-712 signatures * @return The domain separator */ - function domainSeparator() external view override returns (bytes32) { + function domainSeparator() external view virtual override returns (bytes32) { return bytes32(0); // Return a dummy value for now } @@ -309,7 +309,7 @@ contract RegistryCoordinator is RegistryCoordinatorStorage { * @notice Returns the version of the contract * @return The version string */ - function version() external pure override returns (string memory) { + function version() external pure virtual override returns (string memory) { return "v0.0.1"; } } diff --git a/src/SlashingRegistryCoordinator.sol b/src/SlashingRegistryCoordinator.sol index 10ff5aa3..8d30da4b 100644 --- a/src/SlashingRegistryCoordinator.sol +++ b/src/SlashingRegistryCoordinator.sol @@ -1121,7 +1121,7 @@ contract SlashingRegistryCoordinator is * @notice Returns the domain separator used for EIP-712 signatures * @return The domain separator */ - function domainSeparator() external view returns (bytes32) { + function domainSeparator() external view virtual override returns (bytes32) { return _domainSeparatorV4(); } @@ -1129,7 +1129,7 @@ contract SlashingRegistryCoordinator is * @notice Returns the version of the contract * @return The version string */ - function version() external pure returns (string memory) { + function version() external pure virtual override returns (string memory) { return "v0.0.1"; } } diff --git a/test/harnesses/AVSDirectoryHarness.sol b/test/harnesses/AVSDirectoryHarness.sol index d452da82..6124ce0c 100644 --- a/test/harnesses/AVSDirectoryHarness.sol +++ b/test/harnesses/AVSDirectoryHarness.sol @@ -8,5 +8,8 @@ import {IPauserRegistry} from "eigenlayer-contracts/src/contracts/interfaces/IPa // wrapper around the AVSDirectory contract that exposes internal functionality, for unit testing contract AVSDirectoryHarness is AVSDirectory { - constructor(IDelegationManager _dm, IPauserRegistry _pauser) AVSDirectory(_dm, _pauser) {} + constructor( + IDelegationManager _dm, + IPauserRegistry _pauser + ) AVSDirectory(_dm, _pauser, "v0.0.1") {} } diff --git a/test/integration/CoreRegistration.t.sol b/test/integration/CoreRegistration.t.sol index e630179a..56e70956 100644 --- a/test/integration/CoreRegistration.t.sol +++ b/test/integration/CoreRegistration.t.sol @@ -49,7 +49,8 @@ contract Test_CoreRegistration is MockAVSDeployer { allocationManagerMock, pauserRegistry, permissionController, - 0 + 0, + "v0.0.1" ); IStrategy[] memory initializeStrategiesToSetDelayBlocks = new IStrategy[](0); uint256[] memory initializeWithdrawalDelayBlocks = new uint256[](0); @@ -73,7 +74,7 @@ contract Test_CoreRegistration is MockAVSDeployer { // Deploy New AVS Directory AVSDirectory avsDirectoryImplementation = - new AVSDirectory(delegationManager, pauserRegistry); // TODO: Fix Config + new AVSDirectory(delegationManager, pauserRegistry, "v0.0.1"); // TODO: Fix Config avsDirectory = AVSDirectory( address( new TransparentUpgradeableProxy( diff --git a/test/integration/IntegrationDeployer.t.sol b/test/integration/IntegrationDeployer.t.sol index dcedc465..eb1a24d4 100644 --- a/test/integration/IntegrationDeployer.t.sol +++ b/test/integration/IntegrationDeployer.t.sol @@ -188,12 +188,11 @@ abstract contract IntegrationDeployer is Test, IUserDeployer { ); // Deploy EigenPod Contracts - pod = new EigenPod(ethPOSDeposit, eigenPodManager, GENESIS_TIME_LOCAL, address(0)); + pod = new EigenPod(ethPOSDeposit, eigenPodManager, GENESIS_TIME_LOCAL, "v0.0.1"); eigenPodBeacon = new UpgradeableBeacon(address(pod)); - PermissionController permissionControllerImplementation = - new PermissionController(address(0)); + PermissionController permissionControllerImplementation = new PermissionController("v0.0.1"); // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs DelegationManager delegationImplementation = new DelegationManager( @@ -203,17 +202,31 @@ abstract contract IntegrationDeployer is Test, IUserDeployer { pauserRegistry, permissionController, 0, - address(0) + "v0.0.1" ); StrategyManager strategyManagerImplementation = - new StrategyManager(delegationManager, pauserRegistry, address(0)); + new StrategyManager(delegationManager, pauserRegistry, "v0.0.1"); EigenPodManager eigenPodManagerImplementation = new EigenPodManager( - ethPOSDeposit, eigenPodBeacon, delegationManager, pauserRegistry, address(0) + ethPOSDeposit, eigenPodBeacon, delegationManager, pauserRegistry, "v0.0.1" ); AVSDirectory avsDirectoryImplementation = - new AVSDirectory(delegationManager, pauserRegistry, address(0)); - - RewardsCoordinator rewardsCoordinatorImplementation = new RewardsCoordinator(address(0)); + new AVSDirectory(delegationManager, pauserRegistry, "v0.0.1"); + + RewardsCoordinator rewardsCoordinatorImplementation = new RewardsCoordinator( + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({ + delegationManager: delegationManager, + strategyManager: strategyManager, + allocationManager: allocationManager, + pauserRegistry: pauserRegistry, + permissionController: permissionController, + CALCULATION_INTERVAL_SECONDS: CALCULATION_INTERVAL_SECONDS, + MAX_REWARDS_DURATION: MAX_REWARDS_DURATION, + MAX_RETROACTIVE_LENGTH: MAX_RETROACTIVE_LENGTH, + MAX_FUTURE_LENGTH: MAX_FUTURE_LENGTH, + GENESIS_REWARDS_TIMESTAMP: GENESIS_REWARDS_TIMESTAMP, + version: "v0.0.1" + }) + ); AllocationManager allocationManagerImplementation = new AllocationManager( delegationManager, @@ -221,7 +234,7 @@ abstract contract IntegrationDeployer is Test, IUserDeployer { permissionController, uint32(7 days), // DEALLOCATION_DELAY uint32(1 days), // ALLOCATION_CONFIGURATION_DELAY - address(0) // Added config parameter + "v0.0.1" // Added config parameter ); // Third, upgrade the proxy contracts to point to the implementations @@ -300,7 +313,7 @@ abstract contract IntegrationDeployer is Test, IUserDeployer { ); // Deploy and whitelist strategies - baseStrategyImplementation = new StrategyBase(strategyManager, pauserRegistry); + baseStrategyImplementation = new StrategyBase(strategyManager, pauserRegistry, "v0.0.1"); for (uint256 i = 0; i < MAX_STRATEGY_COUNT; i++) { string memory number = uint256(i).toString(); string memory stratName = string.concat("StrategyToken", number); diff --git a/test/mocks/AllocationManagerMock.sol b/test/mocks/AllocationManagerMock.sol index 2a04727a..86ced577 100644 --- a/test/mocks/AllocationManagerMock.sol +++ b/test/mocks/AllocationManagerMock.sol @@ -152,11 +152,18 @@ contract AllocationManagerIntermediate is IAllocationManager { ) external view virtual returns (bool) {} function getAllocatedStake( - address operator, OperatorSet memory operatorSet, - IStrategy strategy - ) external view virtual returns (uint256) { - return 0; + address[] memory operators, + IStrategy[] memory strategies + ) external view virtual returns (uint256[][] memory slashableStake) { + uint256[][] memory result = new uint256[][](operators.length); + for (uint256 i = 0; i < operators.length; i++) { + result[i] = new uint256[](strategies.length); + for (uint256 j = 0; j < strategies.length; j++) { + result[i][j] = 0; + } + } + return result; } function getEncumberedMagnitude( @@ -178,4 +185,11 @@ contract AllocationManagerIntermediate is IAllocationManager { } } -contract AllocationManagerMock is AllocationManagerIntermediate {} +contract AllocationManagerMock is AllocationManagerIntermediate { + function getAllocatedStake( + address operator, + IStrategy strategy + ) external view returns (uint256) { + return 0; + } +} diff --git a/test/mocks/EigenPodManagerMock.sol b/test/mocks/EigenPodManagerMock.sol index 30870792..c16532de 100644 --- a/test/mocks/EigenPodManagerMock.sol +++ b/test/mocks/EigenPodManagerMock.sol @@ -76,8 +76,8 @@ contract EigenPodManagerMock is Test, Pausable, IEigenPodManager { address staker, IStrategy strategy, uint256 depositSharesToRemove - ) external returns (uint256, uint256) { - return (0, 0); + ) external returns (uint256) { + return 0; } function stakerDepositShares( @@ -95,9 +95,10 @@ contract EigenPodManagerMock is Test, Pausable, IEigenPodManager { function addShares( address staker, IStrategy strategy, - IERC20 token, uint256 shares - ) external returns (uint256, uint256) {} + ) external returns (uint256, uint256) { + return (0, 0); + } function beaconChainSlashingFactor( address staker diff --git a/test/unit/ServiceManagerBase.t.sol b/test/unit/ServiceManagerBase.t.sol index e888e9ef..b6753c1c 100644 --- a/test/unit/ServiceManagerBase.t.sol +++ b/test/unit/ServiceManagerBase.t.sol @@ -67,16 +67,19 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve _deployMockEigenLayerAndAVS(); // Deploy rewards coordinator rewardsCoordinatorImplementation = new RewardsCoordinator( - delegationMock, - IStrategyManager(address(strategyManagerMock)), - allocationManagerMock, - pauserRegistry, - permissionControllerMock, - CALCULATION_INTERVAL_SECONDS, - MAX_REWARDS_DURATION, - MAX_RETROACTIVE_LENGTH, - MAX_FUTURE_LENGTH, - GENESIS_REWARDS_TIMESTAMP + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({ + delegationManager: delegationMock, + strategyManager: IStrategyManager(address(strategyManagerMock)), + allocationManager: allocationManagerMock, + pauserRegistry: pauserRegistry, + permissionController: permissionControllerMock, + CALCULATION_INTERVAL_SECONDS: CALCULATION_INTERVAL_SECONDS, + MAX_REWARDS_DURATION: MAX_REWARDS_DURATION, + MAX_RETROACTIVE_LENGTH: MAX_RETROACTIVE_LENGTH, + MAX_FUTURE_LENGTH: MAX_FUTURE_LENGTH, + GENESIS_REWARDS_TIMESTAMP: GENESIS_REWARDS_TIMESTAMP, + version: "v0.0.1" + }) ); rewardsCoordinator = RewardsCoordinator( @@ -165,8 +168,9 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve IERC20 token3 = new ERC20PresetFixedSupply( "pepe wif avs", "MOCK3", mockTokenInitialSupply, address(this) ); - strategyImplementation = - new StrategyBase(IStrategyManager(address(strategyManagerMock)), pauserRegistry); + strategyImplementation = new StrategyBase( + IStrategyManager(address(strategyManagerMock)), pauserRegistry, "v0.0.1" + ); strategyMock1 = StrategyBase( address( new TransparentUpgradeableProxy( diff --git a/test/unit/Utils.sol b/test/unit/Utils.sol index 463d8a3b..89f274e8 100644 --- a/test/unit/Utils.sol +++ b/test/unit/Utils.sol @@ -12,7 +12,7 @@ contract Utils { IPauserRegistry pauserRegistry, address admin ) public returns (StrategyBase) { - StrategyBase newStrategy = new StrategyBase(strategyManager, pauserRegistry); + StrategyBase newStrategy = new StrategyBase(strategyManager, pauserRegistry, "v0.0.1"); newStrategy = StrategyBase( address(new TransparentUpgradeableProxy(address(newStrategy), address(admin), "")) ); diff --git a/test/utils/CoreDeployLib.sol b/test/utils/CoreDeployLib.sol index 948ac2ee..b93b4726 100644 --- a/test/utils/CoreDeployLib.sol +++ b/test/utils/CoreDeployLib.sol @@ -37,6 +37,8 @@ import {IAllocationManager} from import {AllocationManager} from "eigenlayer-contracts/src/contracts/core/AllocationManager.sol"; import {PermissionController} from "eigenlayer-contracts/src/contracts/permissions/PermissionController.sol"; +import {IRewardsCoordinatorTypes} from + "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol"; import {UpgradeableProxyLib} from "../unit/UpgradeableProxyLib.sol"; @@ -159,12 +161,13 @@ library CoreDeploymentLib { DeploymentConfigData memory config ) internal { // Deploy core implementations - address permissionControllerImpl = address(new PermissionController()); + address permissionControllerImpl = address(new PermissionController("1.0.0")); address strategyManagerImpl = address( new StrategyManager( IDelegationManager(deployments.delegationManager), - IPauserRegistry(deployments.pauserRegistry) + IPauserRegistry(deployments.pauserRegistry), + "1.0.0" ) ); @@ -174,7 +177,8 @@ library CoreDeploymentLib { IPauserRegistry(deployments.pauserRegistry), IPermissionController(deployments.permissionController), config.allocationManager.deallocationDelay, - config.allocationManager.allocationConfigurationDelay + config.allocationManager.allocationConfigurationDelay, + "1.0.0" ) ); @@ -185,14 +189,16 @@ library CoreDeploymentLib { IAllocationManager(deployments.allocationManager), IPauserRegistry(deployments.pauserRegistry), IPermissionController(deployments.permissionController), - config.delegationManager.minWithdrawalDelayBlocks + config.delegationManager.minWithdrawalDelayBlocks, + "1.0.0" ) ); address avsDirectoryImpl = address( new AVSDirectory( IDelegationManager(deployments.delegationManager), - IPauserRegistry(deployments.pauserRegistry) + IPauserRegistry(deployments.pauserRegistry), + "1.0.0" ) ); @@ -253,7 +259,8 @@ library CoreDeploymentLib { IEigenPodManager(deployments.eigenPodManager), config.eigenPod.genesisTimestamp == 0 ? uint64(block.timestamp) - : config.eigenPod.genesisTimestamp + : config.eigenPod.genesisTimestamp, + "1.0.0" ) ); @@ -265,7 +272,8 @@ library CoreDeploymentLib { IETHPOSDeposit(ethPOSDeposit), IBeacon(deployments.eigenPodBeacon), IDelegationManager(deployments.delegationManager), - IPauserRegistry(deployments.pauserRegistry) + IPauserRegistry(deployments.pauserRegistry), + "1.0.0" ) ); @@ -285,7 +293,8 @@ library CoreDeploymentLib { address baseStrategyImpl = address( new StrategyBase( IStrategyManager(deployments.strategyManager), - IPauserRegistry(deployments.pauserRegistry) + IPauserRegistry(deployments.pauserRegistry), + "1.0.0" ) ); @@ -294,7 +303,8 @@ library CoreDeploymentLib { address strategyFactoryImpl = address( new StrategyFactory( IStrategyManager(deployments.strategyManager), - IPauserRegistry(deployments.pauserRegistry) + IPauserRegistry(deployments.pauserRegistry), + "1.0.0" ) ); @@ -317,16 +327,19 @@ library CoreDeploymentLib { ) internal { address rewardsCoordinatorImpl = address( new RewardsCoordinator( - IDelegationManager(deployments.delegationManager), - IStrategyManager(deployments.strategyManager), - IAllocationManager(deployments.allocationManager), - IPauserRegistry(deployments.pauserRegistry), - IPermissionController(deployments.permissionController), - config.rewardsCoordinator.calculationIntervalSeconds, - config.rewardsCoordinator.maxRewardsDuration, - config.rewardsCoordinator.maxRetroactiveLength, - config.rewardsCoordinator.maxFutureLength, - config.rewardsCoordinator.genesisRewardsTimestamp + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({ + delegationManager: IDelegationManager(deployments.delegationManager), + strategyManager: IStrategyManager(deployments.strategyManager), + allocationManager: IAllocationManager(deployments.allocationManager), + pauserRegistry: IPauserRegistry(deployments.pauserRegistry), + permissionController: IPermissionController(deployments.permissionController), + CALCULATION_INTERVAL_SECONDS: config.rewardsCoordinator.calculationIntervalSeconds, + MAX_REWARDS_DURATION: config.rewardsCoordinator.maxRewardsDuration, + MAX_RETROACTIVE_LENGTH: config.rewardsCoordinator.maxRetroactiveLength, + MAX_FUTURE_LENGTH: config.rewardsCoordinator.maxFutureLength, + GENESIS_REWARDS_TIMESTAMP: config.rewardsCoordinator.genesisRewardsTimestamp, + version: "1.0.0" + }) ) ); diff --git a/test/utils/MockAVSDeployer.sol b/test/utils/MockAVSDeployer.sol index b7437718..0b663e58 100644 --- a/test/utils/MockAVSDeployer.sol +++ b/test/utils/MockAVSDeployer.sol @@ -171,7 +171,7 @@ contract MockAVSDeployer is Test { strategyManagerMock = new StrategyManagerMock(delegationMock); allocationManagerMock = new AllocationManagerMock(); permissionControllerMock = new PermissionControllerMock(); - avsDirectoryImplementation = new AVSDirectory(delegationMock, pauserRegistry, address(0)); + avsDirectoryImplementation = new AVSDirectory(delegationMock, pauserRegistry, "v0.0.1"); avsDirectory = AVSDirectory( address( new TransparentUpgradeableProxy( @@ -279,7 +279,7 @@ contract MockAVSDeployer is Test { permissionControllerMock, uint32(7 days), // DEALLOCATION_DELAY uint32(1 days), // ALLOCATION_CONFIGURATION_DELAY - address(0) // Added config parameter + "v0.0.1" // Added config parameter ); proxyAdmin.upgrade( ITransparentUpgradeableProxy(payable(address(allocationManager))), From 04775f6a856dc3050e88ff00ba53dfa7475a6bb1 Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 14 Mar 2025 14:31:48 -0400 Subject: [PATCH 5/6] fix: more restrictive inputs for rewareds --- test/unit/ServiceManagerBase.t.sol | 97 ++++++++++++++++++------------ 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/test/unit/ServiceManagerBase.t.sol b/test/unit/ServiceManagerBase.t.sol index b6753c1c..df571117 100644 --- a/test/unit/ServiceManagerBase.t.sol +++ b/test/unit/ServiceManagerBase.t.sol @@ -281,8 +281,13 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve "dog wif hat", "MOCK1", mockTokenInitialSupply, rewardsInitiator ); amount = bound(amount, 1, MAX_REWARDS_AMOUNT); - duration = bound(duration, 0, MAX_REWARDS_DURATION); + // Ensure duration is at least one CALCULATION_INTERVAL_SECONDS + duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION); + // Align duration to CALCULATION_INTERVAL_SECONDS duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); + if (duration == 0) { + duration = CALCULATION_INTERVAL_SECONDS; + } startTimestamp = bound( startTimestamp, uint256( @@ -374,8 +379,13 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve // 1. Bound fuzz inputs to valid ranges and amounts using randSeed for each amount = bound(amount + i, 1, MAX_REWARDS_AMOUNT); amounts[i] = amount; - duration = bound(duration + i, 0, MAX_REWARDS_DURATION); + // Ensure duration is at least one CALCULATION_INTERVAL_SECONDS + duration = bound(duration + i, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION); + // Align duration to CALCULATION_INTERVAL_SECONDS duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); + if (duration == 0) { + duration = CALCULATION_INTERVAL_SECONDS; + } startTimestamp = bound( startTimestamp + i, uint256( @@ -472,8 +482,13 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve amount = bound(amount + i, 1, MAX_REWARDS_AMOUNT); amounts[i] = amount; totalAmount += amount; - duration = bound(duration + i, 0, MAX_REWARDS_DURATION); + // Ensure duration is at least one CALCULATION_INTERVAL_SECONDS + duration = bound(duration + i, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION); + // Align duration to CALCULATION_INTERVAL_SECONDS duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); + if (duration == 0) { + duration = CALCULATION_INTERVAL_SECONDS; + } startTimestamp = bound( startTimestamp + i, uint256( @@ -716,8 +731,13 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve "dog wif hat", "MOCK1", mockTokenInitialSupply, rewardsInitiator ); amount = bound(amount, 1, MAX_REWARDS_AMOUNT); - duration = bound(duration, 0, MAX_REWARDS_DURATION); + // Ensure duration is at least one CALCULATION_INTERVAL_SECONDS + duration = bound(duration, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION); + // Align duration to CALCULATION_INTERVAL_SECONDS duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); + if (duration == 0) { + duration = CALCULATION_INTERVAL_SECONDS; + } startTimestamp = bound( startTimestamp, uint256( @@ -725,7 +745,7 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - MAX_RETROACTIVE_LENGTH ) ) + CALCULATION_INTERVAL_SECONDS - 1, - block.timestamp + uint256(MAX_FUTURE_LENGTH) + block.timestamp - 1 ); startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS); @@ -800,7 +820,12 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve uint256 amount, uint256 numSubmissions ) public { + // Bound inputs to reasonable values to avoid overflows + startTimestamp = bound(startTimestamp, 0, type(uint32).max); + duration = bound(duration, 0, type(uint32).max); + amount = bound(amount, 0, type(uint128).max); numSubmissions = bound(numSubmissions, 2, 10); + cheats.prank(rewardsCoordinator.owner()); IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory rewardsSubmissions = @@ -809,10 +834,7 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve uint256 startSubmissionNonce = rewardsCoordinator.submissionNonce(address(serviceManager)); _deployMockRewardTokens(rewardsInitiator, numSubmissions); - uint256[] memory avsBalancesBefore = _getBalanceForTokens(rewardTokens, rewardsInitiator); - uint256[] memory rewardsCoordinatorBalancesBefore = - _getBalanceForTokens(rewardTokens, address(rewardsCoordinator)); - // uint256[] memory amounts = new uint256[](numSubmissions); + uint256[] memory amounts = new uint256[](numSubmissions); uint256 latestStartTimestamp = 0; uint256 longestDuration = 0; @@ -820,11 +842,19 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve // Create multiple rewards submissions and their expected event for (uint256 i = 0; i < numSubmissions; ++i) { // 1. Bound fuzz inputs to valid ranges and amounts using randSeed for each - amount = bound(amount + i, 1, MAX_REWARDS_AMOUNT); - // amounts[i] = amount; - duration = bound(duration + i, 0, MAX_REWARDS_DURATION); - duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); - startTimestamp = bound( + amounts[i] = bound(amount + i, 1, MAX_REWARDS_AMOUNT); + + // Ensure duration is at least one CALCULATION_INTERVAL_SECONDS + uint256 submissionDuration = + bound(duration + i, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION); + // Align duration to CALCULATION_INTERVAL_SECONDS + submissionDuration = + submissionDuration - (submissionDuration % CALCULATION_INTERVAL_SECONDS); + if (submissionDuration == 0) { + submissionDuration = CALCULATION_INTERVAL_SECONDS; + } + + uint256 submissionStartTimestamp = bound( startTimestamp + i, uint256( _maxTimestamp( @@ -833,33 +863,33 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve ) + CALCULATION_INTERVAL_SECONDS - 1, block.timestamp - 1 // Must be in past for operator directed rewards ); - startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS); + submissionStartTimestamp = + submissionStartTimestamp - (submissionStartTimestamp % CALCULATION_INTERVAL_SECONDS); // loop and find the latest startTimestamp and the longest duration, then warp start + duration + 1 - - if (startTimestamp > latestStartTimestamp) { - latestStartTimestamp = startTimestamp; + if (submissionStartTimestamp > latestStartTimestamp) { + latestStartTimestamp = submissionStartTimestamp; } - if (duration > longestDuration) { - longestDuration = duration; + if (submissionDuration > longestDuration) { + longestDuration = submissionDuration; } // 2. Create reward submission input param IRewardsCoordinatorTypes.OperatorReward[] memory operatorRewards = new IRewardsCoordinatorTypes.OperatorReward[](1); - operatorRewards[0] = - IRewardsCoordinatorTypes.OperatorReward({operator: address(0x1), amount: amount}); + operatorRewards[0] = IRewardsCoordinatorTypes.OperatorReward({ + operator: address(0x1), + amount: amounts[i] + }); - IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory rewardsSubmission = - IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission({ + rewardsSubmissions[i] = IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission({ strategiesAndMultipliers: defaultStrategyAndMultipliers, token: rewardTokens[i], operatorRewards: operatorRewards, - startTimestamp: uint32(startTimestamp), - duration: uint32(duration), + startTimestamp: uint32(submissionStartTimestamp), + duration: uint32(submissionDuration), description: "Test Rewards" }); - rewardsSubmissions[i] = rewardsSubmission; // 3. expected event emitted for this rewardsSubmission avsSubmissionHashes[i] = keccak256( @@ -887,16 +917,7 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve ), "rewards submission hash not submitted" ); - // assertEq( - // avsBalancesBefore[i] - amounts[i], - // rewardTokens[i].balanceOf(rewardsInitiator), - // "AVS balance not decremented by amount of rewards submission" - // ); - // assertEq( - // rewardsCoordinatorBalancesBefore[i] + amounts[i], - // rewardTokens[i].balanceOf(address(rewardsCoordinator)), - // "RewardsCoordinator balance not incremented by amount of rewards submission" - // ); + // Removed balance checks to reduce stack depth } } @@ -945,7 +966,7 @@ contract ServiceManagerBase_UnitTests is MockAVSDeployer, IServiceManagerBaseEve serviceManager.setClaimerFor(claimer); } - function testFuzz_setClaimerFor_upateClaimer( + function testFuzz_setClaimerFor_updateClaimer( address claimer ) public filterFuzzedAddressInputs(claimer) { cheats.prank(serviceManagerOwner); From 0fb08b4afaf2f46d928c0fc87b32a73ea3e40ef2 Mon Sep 17 00:00:00 2001 From: steven Date: Tue, 18 Mar 2025 10:54:33 -0400 Subject: [PATCH 6/6] chore: resolve updates from dev --- test/utils/MiddlewareDeployLib.sol | 3 ++- test/utils/OperatorLib.sol | 13 ++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/test/utils/MiddlewareDeployLib.sol b/test/utils/MiddlewareDeployLib.sol index d2a047eb..9ee88648 100644 --- a/test/utils/MiddlewareDeployLib.sol +++ b/test/utils/MiddlewareDeployLib.sol @@ -260,7 +260,8 @@ library MiddlewareDeployLib { IIndexRegistry(deployment.indexRegistry), ISocketRegistry(deployment.socketRegistry), IAllocationManager(allocationManager), - IPauserRegistry(deployment.pauserRegistry) + IPauserRegistry(deployment.pauserRegistry), + "v0.0.1" ) ); bytes memory registryCoordinatorUpgradeCall = abi.encodeCall( diff --git a/test/utils/OperatorLib.sol b/test/utils/OperatorLib.sol index 73380ce6..828cba05 100644 --- a/test/utils/OperatorLib.sol +++ b/test/utils/OperatorLib.sol @@ -18,7 +18,10 @@ import {IStrategyManager} from "eigenlayer-contracts/src/contracts/interfaces/IS import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; -import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import { + ISignatureUtilsMixin, + ISignatureUtilsMixinTypes +} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol"; import { IAllocationManager, @@ -197,8 +200,12 @@ library OperatorLib { pubkeyRegistrationSignature: blsSig }); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = ISignatureUtils - .SignatureWithSaltAndExpiry({signature: signature, salt: salt, expiry: expiry}); + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature = + ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry({ + signature: signature, + salt: salt, + expiry: expiry + }); // Call the registerOperator function on the registry registryCoordinatorInstance.registerOperator(