From c2f42e3dd34051f1455bbdcb9edb5f0c08223a9b Mon Sep 17 00:00:00 2001 From: Shawn <44221603+shaspitz@users.noreply.github.com> Date: Fri, 29 Nov 2024 12:20:39 -0800 Subject: [PATCH] feat: support for operator specific delegators (#508) --- .../validator-registry/middleware/MevCommitMiddleware.sol | 3 ++- .../middleware/MevCommitMiddlewareStorage.sol | 3 +++ contracts/contracts/validator-registry/middleware/README.md | 2 +- .../validator-registry/middleware/MevCommitMiddlewareTest.sol | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/contracts/contracts/validator-registry/middleware/MevCommitMiddleware.sol b/contracts/contracts/validator-registry/middleware/MevCommitMiddleware.sol index cc3c50a..8f0b0d7 100644 --- a/contracts/contracts/validator-registry/middleware/MevCommitMiddleware.sol +++ b/contracts/contracts/validator-registry/middleware/MevCommitMiddleware.sol @@ -613,7 +613,8 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage IEntity delegator = IEntity(IVault(vault).delegator()); if (delegator.TYPE() == _FULL_RESTAKE_DELEGATOR_TYPE) { revert FullRestakeDelegatorNotSupported(vault); - } else if (delegator.TYPE() != _NETWORK_RESTAKE_DELEGATOR_TYPE) { + // Only two delegator types are supported, network-restake and operator-specific. + } else if (delegator.TYPE() != _NETWORK_RESTAKE_DELEGATOR_TYPE && delegator.TYPE() != _OPERATOR_SPECIFIC_DELEGATOR_TYPE) { revert UnknownDelegatorType(vault, delegator.TYPE()); } diff --git a/contracts/contracts/validator-registry/middleware/MevCommitMiddlewareStorage.sol b/contracts/contracts/validator-registry/middleware/MevCommitMiddlewareStorage.sol index a56f546..6fa859c 100644 --- a/contracts/contracts/validator-registry/middleware/MevCommitMiddlewareStorage.sol +++ b/contracts/contracts/validator-registry/middleware/MevCommitMiddlewareStorage.sol @@ -16,6 +16,9 @@ abstract contract MevCommitMiddlewareStorage { /// @notice Enum TYPE for Symbiotic core FullRestakeDelegator. uint64 internal constant _FULL_RESTAKE_DELEGATOR_TYPE = 1; + /// @notice Enum TYPE for Symbiotic core OperatorSpecificDelegator. + uint64 internal constant _OPERATOR_SPECIFIC_DELEGATOR_TYPE = 2; + /// @notice Enum TYPE for Symbiotic core InstantSlasher. uint64 internal constant _INSTANT_SLASHER_TYPE = 0; diff --git a/contracts/contracts/validator-registry/middleware/README.md b/contracts/contracts/validator-registry/middleware/README.md index b0cabd4..9c910a0 100644 --- a/contracts/contracts/validator-registry/middleware/README.md +++ b/contracts/contracts/validator-registry/middleware/README.md @@ -16,7 +16,7 @@ For L1 validators to be *opted-in to mev-commit*, some collateral stake must be Operators for the mev-commit network are responsible for bulk registering groups of L1 validator pubkeys to an associated vault. Every registered validator is represented by restaked collateral from a single Vault and Operator. Each Vault’s total collateral can be split up to secure/represent many validators in groups**.** -Our network middleware contract requires any Vault registering with the contract to have a delegator of the `NetworkRestakeDelegator` type. `FullRestakeDelegator` is disallowed due to its ability for vaults to reuse stake within the same network to multiple Operators. In other words, a single instance of `slashAmount` vault collateral can only be used to secure a single validator. +Our network middleware contract requires any Vault registering with the contract to have a delegator of the `NetworkRestakeDelegator` type or `OperatorSpecificDelegator` type. `FullRestakeDelegator` is disallowed due to its ability for vaults to reuse stake within the same network to multiple Operators. In other words, a single instance of `slashAmount` vault collateral can only be used to secure a single validator, through a single Operator. Vaults are still able to split their slashable collateral across multiple Operators. # Steps for validator opt-in via symbiotic diff --git a/contracts/test/validator-registry/middleware/MevCommitMiddlewareTest.sol b/contracts/test/validator-registry/middleware/MevCommitMiddlewareTest.sol index 91d2e58..ef3fd65 100644 --- a/contracts/test/validator-registry/middleware/MevCommitMiddlewareTest.sol +++ b/contracts/test/validator-registry/middleware/MevCommitMiddlewareTest.sol @@ -583,9 +583,10 @@ contract MevCommitMiddlewareTest is Test { mevCommitMiddleware.registerVaults(vaults, slashAmounts); uint64 networkRestakeDelegatorType = 0; + uint64 operatorSpecificDelegatorType = 2; mockDelegator1.setType(networkRestakeDelegatorType); - mockDelegator2.setType(networkRestakeDelegatorType); + mockDelegator2.setType(operatorSpecificDelegatorType); vm.prank(owner); vm.expectRevert(