Skip to content

Commit 8b28190

Browse files
committed
fix: interfaces and add require check
1 parent c9abbe4 commit 8b28190

File tree

8 files changed

+96
-29
lines changed

8 files changed

+96
-29
lines changed

lib/eigenlayer-contracts

Submodule eigenlayer-contracts updated 98 files

src/SlashingRegistryCoordinator.sol

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,11 @@ contract SlashingRegistryCoordinator is
147147
/// @inheritdoc ISlashingRegistryCoordinator
148148
function registerOperator(
149149
address operator,
150+
address avs,
150151
uint32[] memory operatorSetIds,
151152
bytes calldata data
152153
) external override onlyAllocationManager onlyWhenNotPaused(PAUSED_REGISTER_OPERATOR) {
154+
require(avs == accountIdentifier, InvalidAVS());
153155
bytes memory quorumNumbers = _getQuorumNumbers(operatorSetIds);
154156

155157
(
@@ -222,8 +224,10 @@ contract SlashingRegistryCoordinator is
222224
/// @inheritdoc ISlashingRegistryCoordinator
223225
function deregisterOperator(
224226
address operator,
227+
address avs,
225228
uint32[] memory operatorSetIds
226229
) external override onlyAllocationManager onlyWhenNotPaused(PAUSED_DEREGISTER_OPERATOR) {
230+
require(avs == accountIdentifier, InvalidAVS());
227231
bytes memory quorumNumbers = _getQuorumNumbers(operatorSetIds);
228232
_deregisterOperator(operator, quorumNumbers);
229233
}

src/interfaces/ISlashingRegistryCoordinator.sol

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ interface ISlashingRegistryCoordinatorErrors {
5151
error NotSorted();
5252
/// @notice Thrown when maximum quorum count is reached.
5353
error MaxQuorumsReached();
54+
/// @notice Thrown when registering/deregistering for the wrong AVS
55+
error InvalidAVS();
5456
}
5557

5658
interface ISlashingRegistryCoordinatorTypes {
@@ -306,6 +308,7 @@ interface ISlashingRegistryCoordinator is
306308
/**
307309
* @notice Registers an operator through the allocation manager for operator set quorums.
308310
* @param operator The operator address to register.
311+
* @param avs The address of the AVS to register for.
309312
* @param operatorSetIds The operator set IDs to register for (corresponds to quorum numbers).
310313
* @param data Additional registration data containing the operator's socket and BLS public key parameters.
311314
* @dev Can only be called by the allocation manager.
@@ -314,19 +317,21 @@ interface ISlashingRegistryCoordinator is
314317
*/
315318
function registerOperator(
316319
address operator,
320+
address avs,
317321
uint32[] memory operatorSetIds,
318322
bytes memory data
319323
) external;
320324

321325
/**
322326
* @notice Deregisters an operator through the allocation manager from operator set quorums.
323327
* @param operator The operator address to deregister.
328+
* @param avs The address of the AVS to deregister from.
324329
* @param operatorSetIds The operator set IDs to deregister from (corresponds to quorum numbers).
325330
* @dev Can only be called by the allocation manager.
326331
* @dev Will revert if operator sets are not enabled or if deregistering from M2 quorums.
327332
* @dev This function implements the Slashing deregistration pathway specified by the IAVSRegistrar interface.
328333
*/
329-
function deregisterOperator(address operator, uint32[] memory operatorSetIds) external;
334+
function deregisterOperator(address operator, address avs, uint32[] memory operatorSetIds) external;
330335

331336
/**
332337
* @notice Updates stake weights for specified operators. If any operator is found to be below

test/mocks/AVSRegistrarMock.sol

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ import {IAVSRegistrar} from "eigenlayer-contracts/src/contracts/interfaces/IAVSR
66
contract AVSRegistrarMock is IAVSRegistrar {
77
function registerOperator(
88
address operator,
9+
address avs,
910
uint32[] calldata operatorSetIds,
1011
bytes calldata data
11-
) external override {}
12+
) external override {
13+
}
1214

1315
function deregisterOperator(
1416
address operator,
17+
address avs,
1518
uint32[] calldata operatorSetIds
16-
) external override {}
19+
) external override {
20+
}
1721
}

test/mocks/AllocationManagerMock.sol

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,19 @@ contract AllocationManagerIntermediate is IAllocationManager {
145145
uint32 futureBlock
146146
) external view virtual returns (uint256[][] memory slashableStake) {}
147147

148+
function getAllocatedStake(
149+
OperatorSet memory operatorSet,
150+
address[] memory operators,
151+
IStrategy[] memory strategies
152+
) public view returns (uint256[][] memory) {
153+
}
154+
155+
function getEncumberedMagnitude(address operator, IStrategy strategy) external view returns (uint64) {
156+
}
157+
158+
function isOperatorSlashable(address operator, OperatorSet memory operatorSet) public view returns (bool) {
159+
}
160+
148161
function isMemberOfOperatorSet(
149162
address operator,
150163
OperatorSet memory operatorSet

test/mocks/EigenPodManagerMock.sol

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ contract EigenPodManagerMock is Test, Pausable, IEigenPodManager {
9292
function addShares(
9393
address staker,
9494
IStrategy strategy,
95-
IERC20 token,
9695
uint256 shares
9796
) external returns (uint256, uint256) {}
9897

test/mocks/RewardsCoordinatorMock.sol

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,6 @@ contract RewardsCoordinatorMock is IRewardsCoordinator {
2929
RewardsSubmission[] calldata rewardsSubmissions
3030
) external override {}
3131

32-
function createOperatorDirectedOperatorSetRewardsSubmission(
33-
OperatorSet calldata operatorSet,
34-
OperatorDirectedRewardsSubmission[] calldata operatorDirectedRewardsSubmissions
35-
) external override {}
36-
37-
function getOperatorSetSplit(
38-
address operator,
39-
OperatorSet calldata operatorSet
40-
) external view override returns (uint16) {}
41-
42-
function setOperatorSetSplit(
43-
address operator,
44-
OperatorSet calldata operatorSet,
45-
uint16 split
46-
) external override {}
47-
4832
function createOperatorDirectedAVSRewardsSubmission(
4933
address avs,
5034
OperatorDirectedRewardsSubmission[] calldata operatorDirectedRewardsSubmissions

test/unit/RegistryCoordinatorUnit.t.sol

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2336,7 +2336,7 @@ contract RegistryCoordinatorUnitTests_BeforeMigration is RegistryCoordinatorUnit
23362336
cheats.prank(address(registryCoordinator.allocationManager()));
23372337
cheats.expectRevert();
23382338
registryCoordinator.registerOperator(
2339-
defaultOperator, new uint32[](0), abi.encode(defaultSocket, pubkeyRegistrationParams)
2339+
defaultOperator, address(serviceManager), new uint32[](0), abi.encode(defaultSocket, pubkeyRegistrationParams)
23402340
);
23412341
}
23422342

@@ -2345,7 +2345,7 @@ contract RegistryCoordinatorUnitTests_BeforeMigration is RegistryCoordinatorUnit
23452345
operatorSetIds[0] = 0;
23462346
cheats.prank(address(registryCoordinator.allocationManager()));
23472347
cheats.expectRevert();
2348-
registryCoordinator.deregisterOperator(defaultOperator, operatorSetIds);
2348+
registryCoordinator.deregisterOperator(defaultOperator, address(serviceManager), operatorSetIds);
23492349
}
23502350

23512351
function test_CreateTotalDelegatedStakeQuorum() public {
@@ -2577,7 +2577,7 @@ contract RegistryCoordinatorUnitTests_AfterMigration is RegistryCoordinatorUnitT
25772577
abi.encode(ISlashingRegistryCoordinatorTypes.RegistrationType.NORMAL, socket, params);
25782578

25792579
cheats.prank(address(registryCoordinator.allocationManager()));
2580-
registryCoordinator.registerOperator(defaultOperator, operatorSetIds, data);
2580+
registryCoordinator.registerOperator(defaultOperator, address(serviceManager), operatorSetIds, data);
25812581
}
25822582

25832583
function test_registerHook_WithChurn() public {
@@ -2634,7 +2634,7 @@ contract RegistryCoordinatorUnitTests_AfterMigration is RegistryCoordinatorUnitT
26342634

26352635
// Prank as allocation manager and call register hook
26362636
cheats.prank(address(registryCoordinator.allocationManager()));
2637-
registryCoordinator.registerOperator(defaultOperator, operatorSetIds, data);
2637+
registryCoordinator.registerOperator(defaultOperator, address(serviceManager), operatorSetIds, data);
26382638
}
26392639

26402640
function test_updateStakesForQuorum() public {
@@ -2703,7 +2703,7 @@ contract RegistryCoordinatorUnitTests_AfterMigration is RegistryCoordinatorUnitT
27032703
abi.encode(ISlashingRegistryCoordinatorTypes.RegistrationType.NORMAL, socket, params);
27042704

27052705
cheats.startPrank(address(registryCoordinator.allocationManager()));
2706-
registryCoordinator.registerOperator(defaultOperator, operatorSetIds, data);
2706+
registryCoordinator.registerOperator(defaultOperator, address(serviceManager), operatorSetIds, data);
27072707

27082708
// registryCoordinator.deregisterOperator(defaultOperator, operatorSetIds);
27092709

@@ -2748,7 +2748,7 @@ contract RegistryCoordinatorUnitTests_AfterMigration is RegistryCoordinatorUnitT
27482748
abi.encode(ISlashingRegistryCoordinatorTypes.RegistrationType.NORMAL, socket, params);
27492749

27502750
vm.expectRevert();
2751-
registryCoordinator.registerOperator(defaultOperator, operatorSetIds, data);
2751+
registryCoordinator.registerOperator(defaultOperator, address(serviceManager), operatorSetIds, data);
27522752
}
27532753

27542754
function test_deregisterHook_Reverts_WhenNotALM() public {
@@ -2792,10 +2792,68 @@ contract RegistryCoordinatorUnitTests_AfterMigration is RegistryCoordinatorUnitT
27922792
abi.encode(ISlashingRegistryCoordinatorTypes.RegistrationType.NORMAL, socket, params);
27932793

27942794
cheats.prank(address(registryCoordinator.allocationManager()));
2795-
registryCoordinator.registerOperator(defaultOperator, operatorSetIds, data);
2795+
registryCoordinator.registerOperator(defaultOperator, address(serviceManager), operatorSetIds, data);
27962796

27972797
cheats.expectRevert();
2798-
registryCoordinator.deregisterOperator(defaultOperator, operatorSetIds);
2798+
registryCoordinator.deregisterOperator(defaultOperator, address(serviceManager), operatorSetIds);
2799+
}
2800+
2801+
function test_deregisterHook_Reverts_WhenInvalidAVS() public {
2802+
_deployMockEigenLayerAndAVS(0);
2803+
address invalidAVS = address(0x1);
2804+
2805+
// Create quorum params
2806+
ISlashingRegistryCoordinatorTypes.OperatorSetParam memory operatorSetParams =
2807+
ISlashingRegistryCoordinatorTypes.OperatorSetParam({
2808+
maxOperatorCount: 10,
2809+
kickBIPsOfOperatorStake: 1000,
2810+
kickBIPsOfTotalStake: 100
2811+
});
2812+
2813+
uint96 minimumStake = 100;
2814+
IStakeRegistryTypes.StrategyParams[] memory strategyParams =
2815+
new IStakeRegistryTypes.StrategyParams[](1);
2816+
strategyParams[0] =
2817+
IStakeRegistryTypes.StrategyParams({strategy: IStrategy(address(1)), multiplier: 10000});
2818+
2819+
// Create total delegated stake quorum
2820+
cheats.prank(registryCoordinatorOwner);
2821+
registryCoordinator.createTotalDelegatedStakeQuorum(operatorSetParams, 0, strategyParams);
2822+
2823+
// operator sets should be enabled after creating a new quorum
2824+
assertTrue(registryCoordinator.operatorSetsEnabled(), "operatorSetsEnabled should be true");
2825+
2826+
// Prank as allocation manager and call register hook
2827+
uint32[] memory operatorSetIds = new uint32[](1);
2828+
operatorSetIds[0] = 0;
2829+
2830+
string memory socket = "socket";
2831+
IBLSApkRegistryTypes.PubkeyRegistrationParams memory params;
2832+
// TODO:
2833+
// params = IBLSApkRegistryTypes.PubkeyRegistrationParams({
2834+
// pubkeyG1: defaultPubKey,
2835+
// pubkeyG2: defaultPubKeyG2,
2836+
// pubkeySignature: defaultPubKeySignature
2837+
// });
2838+
2839+
bytes memory data =
2840+
abi.encode(ISlashingRegistryCoordinatorTypes.RegistrationType.NORMAL, socket, params);
2841+
2842+
// Check revert case when register callback is for wrong AVS
2843+
cheats.prank(address(registryCoordinator.allocationManager()));
2844+
cheats.expectRevert(ISlashingRegistryCoordinatorErrors.InvalidAVS.selector);
2845+
registryCoordinator.registerOperator(defaultOperator, invalidAVS, operatorSetIds, data);
2846+
2847+
cheats.prank(address(registryCoordinator.allocationManager()));
2848+
registryCoordinator.registerOperator(defaultOperator, address(serviceManager), operatorSetIds, data);
2849+
2850+
// Check revert case when deregistering for wrong AVS
2851+
cheats.prank(address(registryCoordinator.allocationManager()));
2852+
cheats.expectRevert(ISlashingRegistryCoordinatorErrors.InvalidAVS.selector);
2853+
registryCoordinator.deregisterOperator(defaultOperator, invalidAVS, operatorSetIds);
2854+
2855+
cheats.prank(address(registryCoordinator.allocationManager()));
2856+
registryCoordinator.deregisterOperator(defaultOperator, address(serviceManager), operatorSetIds);
27992857
}
28002858

28012859
function test_DeregisterHook_Reverts_WhenM2Quorum() public {

0 commit comments

Comments
 (0)