refactor: Remove eigenlayer-middleware and flatten ServiceManagerBase (#389)

## Summary

- Flatten `ServiceManagerBase` middleware layer directly into
`DataHavenServiceManager`
- Remove all unused EigenLayer integration code to keep the contract
minimal
- Fix access control on `deregisterOperatorFromOperatorSets` (was
missing `onlyOwner`)

  ## Motivation

The `ServiceManagerBase` from eigenlayer-middleware was designed for the
old `AVSDirectory` model and included many generic functions DataHaven
doesn't use. This refactor:

  - Reduces code complexity and contract size
  - Removes ~200 lines of unused code
  - Makes the codebase easier to audit and maintain
  - Keeps only what DataHaven actually needs

  ## Changes

  ### Architecture
Before: DataHavenServiceManager → ServiceManagerBase →
ServiceManagerBaseStorage → OwnableUpgradeable
After: DataHavenServiceManager → OwnableUpgradeable, IAVSRegistrar,
IDataHavenServiceManager

  ### Removed (unused)
- `IServiceManager` and `IServiceManagerUI` interfaces (old AVSDirectory
model)
  - `ServiceManagerBase` and `ServiceManagerBaseStorage` middleware
  - `PermissionController` integration (5 proxy functions)
  - `createOperatorSets()` - only needed at initialization
  - `avs()` - never called

  ### Kept (with fixes)
- `deregisterOperatorFromOperatorSets()` - added `onlyOwner` modifier
(security fix)
  - `updateAVSMetadataURI()` - needed for EigenLayer registration

  ### Files Deleted
  - `src/interfaces/IServiceManager.sol`
  - `src/interfaces/IServiceManagerUI.sol`
  - `src/middleware/ServiceManagerBase.sol`
  - `src/middleware/ServiceManagerBaseStorage.sol`
  - `test/mocks/ServiceManagerMock.sol`
  - `test/ServiceManagerBase.t.sol`

  ## Test Plan

  - [x] `forge build` passes
  - [x] `forge test` - all 10 tests pass
  - [x] Contract bindings regenerated
  - [x] State diff regenerated
This commit is contained in:
Ahmad Kaouk 2026-01-13 15:03:10 +01:00 committed by GitHub
parent 66843fde0d
commit a0ab11afec
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 636 additions and 1828 deletions

View file

@ -1,26 +1 @@
{
"network": "anvil",
"BeefyClient": "0x99bbA657f2BbC93c02D617f8bA121cB8Fc104Acf",
"AgentExecutor": "0x0E801D84Fa97b50751Dbf25036d067dCf18858bF",
"Gateway": "0x9d4454B023096f34B160D6B654540c56A1F81688",
"ServiceManager": "0x809d550fca64d94Bd9F66E60752A544199cfAC3D",
"ServiceManagerImplementation": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570",
"RewardsAgent": "0xac06641381166cf085281c45292147f833C622d7",
"DelegationManager": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82",
"StrategyManager": "0x9A676e781A523b5d0C0e43731313A708CB607508",
"AVSDirectory": "0x0B306BF915C4d645ff596e518fAf3F9669b97016",
"EigenPodManager": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1",
"EigenPodBeacon": "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1",
"RewardsCoordinator": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE",
"AllocationManager": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed",
"PermissionController": "0x3Aa5ebB10DC797CAC828524e59A333d0A371443c",
"ETHPOSDeposit": "0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141",
"BaseStrategyImplementation": "0xf5059a5D33d5853360D16C683c16e67980206f36",
"DeployedStrategies": [
{
"address": "0x998abeb3E57409262aE5b751f60747921B33613E",
"underlyingToken": "0x95401dc811bb5740090279Ba06cfA8fcF6113778",
"tokenCreator": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
}
]
}
{"network": "anvil","BeefyClient": "0x99bbA657f2BbC93c02D617f8bA121cB8Fc104Acf","AgentExecutor": "0x0E801D84Fa97b50751Dbf25036d067dCf18858bF","Gateway": "0x9d4454B023096f34B160D6B654540c56A1F81688","ServiceManager": "0x809d550fca64d94Bd9F66E60752A544199cfAC3D","ServiceManagerImplementation": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570","RewardsAgent": "0xac06641381166cf085281c45292147f833C622d7","DelegationManager": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82","StrategyManager": "0x9A676e781A523b5d0C0e43731313A708CB607508","AVSDirectory": "0x0B306BF915C4d645ff596e518fAf3F9669b97016","EigenPodManager": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1","EigenPodBeacon": "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1","RewardsCoordinator": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE","AllocationManager": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed","PermissionController": "0x3Aa5ebB10DC797CAC828524e59A333d0A371443c","ETHPOSDeposit": "0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141","BaseStrategyImplementation": "0xf5059a5D33d5853360D16C683c16e67980206f36","DeployedStrategies": [{"address": "0x998abeb3E57409262aE5b751f60747921B33613E","underlyingToken": "0x95401dc811bb5740090279Ba06cfA8fcF6113778","tokenCreator": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"}]}

View file

@ -1 +1 @@
5cb16238bf8311a3f27dd130cd89f0cd7befda5d
c23b1c40740f73273dddba8b23b9b1a84003e5a1

File diff suppressed because one or more lines are too long

View file

@ -241,9 +241,8 @@ abstract contract DeployBase is Script, DeployParams, Accounts {
// Deploy the Service Manager
vm.broadcast(_deployerPrivateKey);
DataHavenServiceManager serviceManagerImplementation = new DataHavenServiceManager(
rewardsCoordinator, permissionController, allocationManager
);
DataHavenServiceManager serviceManagerImplementation =
new DataHavenServiceManager(rewardsCoordinator, allocationManager);
Logging.logContractDeployed(
"ServiceManager Implementation", address(serviceManagerImplementation)
);

View file

@ -1,61 +1,81 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.27;
// OpenZeppelin imports
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";
// EigenLayer imports
import {
IAllocationManager,
IAllocationManagerTypes
} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {IAVSRegistrar} from "eigenlayer-contracts/src/contracts/interfaces/IAVSRegistrar.sol";
import {
IPermissionController
} from "eigenlayer-contracts/src/contracts/interfaces/IPermissionController.sol";
import {
IRewardsCoordinator,
IRewardsCoordinatorTypes
} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol";
import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol";
import {OperatorSet} from "eigenlayer-contracts/src/contracts/libraries/OperatorSetLib.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
// Snowbridge imports
import {IGatewayV2} from "snowbridge/src/v2/IGateway.sol";
import {ScaleCodec} from "snowbridge/src/utils/ScaleCodec.sol";
// DataHaven imports
import {DataHavenSnowbridgeMessages} from "./libraries/DataHavenSnowbridgeMessages.sol";
import {IDataHavenServiceManager} from "./interfaces/IDataHavenServiceManager.sol";
import {ServiceManagerBase} from "./middleware/ServiceManagerBase.sol";
/**
* @title DataHaven ServiceManager contract
* @notice Manages validators in the DataHaven network and submits rewards to EigenLayer
*/
contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager {
contract DataHavenServiceManager is OwnableUpgradeable, IAVSRegistrar, IDataHavenServiceManager {
using SafeERC20 for IERC20;
// ============ Constants ============
/// @notice The metadata for the DataHaven AVS.
string public constant DATAHAVEN_AVS_METADATA = "https://datahaven.network/";
/// @notice The EigenLayer operator set ID for the Validators securing the DataHaven network.
uint32 public constant VALIDATORS_SET_ID = 0;
// ============ Immutables ============
/// @notice The EigenLayer AllocationManager contract
IAllocationManager internal immutable _allocationManager;
/// @notice The EigenLayer RewardsCoordinator contract
IRewardsCoordinator internal immutable _rewardsCoordinator;
// ============ State Variables ============
/// @notice The address authorized to initiate rewards submissions
address public rewardsInitiator;
/// @inheritdoc IDataHavenServiceManager
mapping(address => bool) public validatorsAllowlist;
/// @notice The Snowbridge Gateway contract
IGatewayV2 private _snowbridgeGateway;
/// @inheritdoc IDataHavenServiceManager
mapping(address => address) public validatorEthAddressToSolochainAddress;
/// @notice Sets the (immutable) `_registryCoordinator` address
constructor(
IRewardsCoordinator __rewardsCoordinator,
IPermissionController __permissionController,
IAllocationManager __allocationManager
) ServiceManagerBase(__rewardsCoordinator, __permissionController, __allocationManager) {}
/// @notice Storage gap for upgradeability (must be at end of state variables)
// solhint-disable-next-line var-name-mixedcase
uint256[46] private __GAP;
/// @notice Modifier to ensure the caller is a registered Validator
// ============ Modifiers ============
/// @notice Restricts function to the rewards initiator
modifier onlyRewardsInitiator() {
require(msg.sender == rewardsInitiator, OnlyRewardsInitiator());
_;
}
/// @notice Restricts function to registered validators
modifier onlyValidator() {
OperatorSet memory operatorSet = OperatorSet({avs: address(this), id: VALIDATORS_SET_ID});
require(
@ -65,14 +85,38 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
_;
}
/// @notice Restricts function to the EigenLayer AllocationManager
modifier onlyAllocationManager() {
require(msg.sender == address(_allocationManager), OnlyAllocationManager());
_;
}
// ============ Constructor ============
/// @notice Sets the immutable EigenLayer contract references
/// @param __rewardsCoordinator The EigenLayer RewardsCoordinator contract
/// @param __allocationManager The EigenLayer AllocationManager contract
constructor(
IRewardsCoordinator __rewardsCoordinator,
IAllocationManager __allocationManager
) {
_rewardsCoordinator = __rewardsCoordinator;
_allocationManager = __allocationManager;
_disableInitializers();
}
// ============ Initializer ============
/// @inheritdoc IDataHavenServiceManager
function initialise(
address initialOwner,
address rewardsInitiator,
address _rewardsInitiator,
IStrategy[] memory validatorsStrategies,
address _snowbridgeGatewayAddress
) public virtual initializer {
__ServiceManagerBase_init(initialOwner, rewardsInitiator);
__Ownable_init();
_transferOwnership(initialOwner);
_setRewardsInitiator(_rewardsInitiator);
// Register the DataHaven service in the AllocationManager.
_allocationManager.updateAVSMetadataURI(address(this), DATAHAVEN_AVS_METADATA);
@ -81,33 +125,27 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
_createDataHavenOperatorSets(validatorsStrategies);
// Set the Snowbridge Gateway address.
// This is the contract to which messages are sent, to be relayed to the Solochain network.
_snowbridgeGateway = IGatewayV2(_snowbridgeGatewayAddress);
}
// ============ Snowbridge Functions ============
/// @inheritdoc IDataHavenServiceManager
function sendNewValidatorSet(
uint128 executionFee,
uint128 relayerFee
) external payable onlyOwner {
// Send the new validator set message to the Snowbridge Gateway
bytes memory message = buildNewValidatorSetMessage();
_snowbridgeGateway.v2_sendMessage{value: msg.value}(
message,
new bytes[](0), // No assets to send
bytes(""), // No claimer
executionFee,
relayerFee
message, new bytes[](0), bytes(""), executionFee, relayerFee
);
}
/// @inheritdoc IDataHavenServiceManager
function buildNewValidatorSetMessage() public view returns (bytes memory) {
// Get the current validator set
OperatorSet memory operatorSet = OperatorSet({avs: address(this), id: VALIDATORS_SET_ID});
address[] memory currentValidatorSet = _allocationManager.getMembers(operatorSet);
// Build the new validator set message
address[] memory newValidatorSet = new address[](currentValidatorSet.length);
for (uint256 i = 0; i < currentValidatorSet.length; i++) {
newValidatorSet[i] = validatorEthAddressToSolochainAddress[currentValidatorSet[i]];
@ -117,7 +155,6 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
DataHavenSnowbridgeMessages.NewValidatorSet memory newValidatorSetMessage =
DataHavenSnowbridgeMessages.NewValidatorSet({payload: newValidatorSetPayload});
// Return the encoded message
return DataHavenSnowbridgeMessages.scaleEncodeNewValidatorSetMessage(newValidatorSetMessage);
}
@ -125,7 +162,6 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
function updateSolochainAddressForValidator(
address solochainAddress
) external onlyValidator {
// Update the Solochain address for the Validator
validatorEthAddressToSolochainAddress[msg.sender] = solochainAddress;
}
@ -137,14 +173,21 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
emit SnowbridgeGatewaySet(_newSnowbridgeGateway);
}
/// @inheritdoc IDataHavenServiceManager
function snowbridgeGateway() external view returns (address) {
return address(_snowbridgeGateway);
}
// ============ IAVSRegistrar Implementation ============
/// @inheritdoc IAVSRegistrar
function registerOperator(
address operator,
address avs,
address avsAddress,
uint32[] calldata operatorSetIds,
bytes calldata data
) external override {
if (avs != address(this)) {
) external override onlyAllocationManager {
if (avsAddress != address(this)) {
revert IncorrectAVSAddress();
}
@ -152,7 +195,6 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
revert CantRegisterToMultipleOperatorSets();
}
// Only validators are supported
if (operatorSetIds[0] != VALIDATORS_SET_ID) {
revert InvalidOperatorSetId();
}
@ -161,8 +203,6 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
revert OperatorNotInAllowlist();
}
// In the case of the Validators operator set, expect the data to have the Solochain address of the operator.
// Require validators to provide 20 bytes addresses.
require(data.length == 20, "Invalid solochain address length");
validatorEthAddressToSolochainAddress[operator] = address(bytes20(data));
@ -172,10 +212,10 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
/// @inheritdoc IAVSRegistrar
function deregisterOperator(
address operator,
address avs,
address avsAddress,
uint32[] calldata operatorSetIds
) external override {
if (avs != address(this)) {
) external override onlyAllocationManager {
if (avsAddress != address(this)) {
revert IncorrectAVSAddress();
}
@ -187,12 +227,20 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
revert InvalidOperatorSetId();
}
// Remove validator from the addresses mapping
delete validatorEthAddressToSolochainAddress[operator];
emit OperatorDeregistered(operator, operatorSetIds[0]);
}
/// @inheritdoc IAVSRegistrar
function supportsAVS(
address avsAddress
) external view override returns (bool) {
return avsAddress == address(this);
}
// ============ Validator Management ============
/// @inheritdoc IDataHavenServiceManager
function addValidatorToAllowlist(
address validator
@ -231,32 +279,23 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
_allocationManager.addStrategiesToOperatorSet(address(this), VALIDATORS_SET_ID, _strategies);
}
/// @inheritdoc IDataHavenServiceManager
function snowbridgeGateway() external view returns (address) {
return address(_snowbridgeGateway);
}
// ============ Rewards Submitter Functions ============
// ============ Rewards Functions ============
/// @inheritdoc IDataHavenServiceManager
function submitRewards(
IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission calldata submission
) external override onlyRewardsInitiator {
// Calculate total amount for event
uint256 totalAmount = 0;
for (uint256 i = 0; i < submission.operatorRewards.length; i++) {
totalAmount += submission.operatorRewards[i].amount;
}
// Approve RewardsCoordinator to spend tokens
submission.token.safeIncreaseAllowance(address(_rewardsCoordinator), totalAmount);
// Wrap in array for RewardsCoordinator
IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[] memory submissions =
new IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[](1);
submissions[0] = submission;
// Submit to EigenLayer RewardsCoordinator
OperatorSet memory operatorSet = OperatorSet({avs: address(this), id: VALIDATORS_SET_ID});
_rewardsCoordinator.createOperatorDirectedOperatorSetRewardsSubmission(
operatorSet, submissions
@ -265,17 +304,36 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
emit RewardsSubmitted(totalAmount, submission.operatorRewards.length);
}
/// @notice Sets the rewards initiator address (overrides deprecated base implementation)
/// @param newRewardsInitiator The new rewards initiator address
/// @dev Only callable by the owner
/// @inheritdoc IDataHavenServiceManager
function setRewardsInitiator(
address newRewardsInitiator
) external override(IDataHavenServiceManager, ServiceManagerBase) onlyOwner {
) external override onlyOwner {
address oldInitiator = rewardsInitiator;
_setRewardsInitiator(newRewardsInitiator);
emit RewardsInitiatorSet(oldInitiator, newRewardsInitiator);
}
// ============ AVS Management Functions ============
/// @inheritdoc IDataHavenServiceManager
function updateAVSMetadataURI(
string memory _metadataURI
) external onlyOwner {
_allocationManager.updateAVSMetadataURI(address(this), _metadataURI);
}
/// @inheritdoc IDataHavenServiceManager
function deregisterOperatorFromOperatorSets(
address operator,
uint32[] calldata operatorSetIds
) external onlyOwner {
IAllocationManagerTypes.DeregisterParams memory params =
IAllocationManagerTypes.DeregisterParams({
operator: operator, avs: address(this), operatorSetIds: operatorSetIds
});
_allocationManager.deregisterFromOperatorSets(params);
}
// ============ Internal Functions ============
/**
@ -292,4 +350,14 @@ contract DataHavenServiceManager is ServiceManagerBase, IDataHavenServiceManager
});
_allocationManager.createOperatorSets(address(this), operatorSets);
}
/**
* @notice Internal function to set the rewards initiator
* @param _rewardsInitiator The new rewards initiator address
*/
function _setRewardsInitiator(
address _rewardsInitiator
) internal {
rewardsInitiator = _rewardsInitiator;
}
}

View file

@ -24,6 +24,10 @@ interface IDataHavenServiceManagerErrors {
error OperatorNotInAllowlist();
/// @notice Thrown when the caller is not a Validator in the Validators operator set
error CallerIsNotValidator();
/// @notice Thrown when a function is called by an address that is not the RewardsInitiator
error OnlyRewardsInitiator();
/// @notice Thrown when a function is called by an address that is not the AllocationManager
error OnlyAllocationManager();
}
/**
@ -204,4 +208,26 @@ interface IDataHavenServiceManager is
function setRewardsInitiator(
address initiator
) external;
// ============ AVS Management Functions ============
/**
* @notice Updates the metadata URI for the AVS
* @param _metadataURI is the metadata URI for the AVS
* @dev Only callable by the owner
*/
function updateAVSMetadataURI(
string memory _metadataURI
) external;
/**
* @notice Force-deregisters an operator from specified operator sets
* @param operator The address of the operator to deregister
* @param operatorSetIds The IDs of the operator sets to deregister from
* @dev Only callable by the owner. Use for removing misbehaving operators.
*/
function deregisterOperatorFromOperatorSets(
address operator,
uint32[] calldata operatorSetIds
) external;
}

View file

@ -1,128 +0,0 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
import {
IRewardsCoordinator
} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol";
import {IServiceManagerUI} from "./IServiceManagerUI.sol";
import {
IAllocationManagerTypes
} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {
IAllocationManager
} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol";
import {IAVSRegistrar} from "eigenlayer-contracts/src/contracts/interfaces/IAVSRegistrar.sol";
interface IServiceManagerErrors {
/// @notice Thrown when a function is called by an address that is not the RegistryCoordinator.
error OnlyRegistryCoordinator();
/// @notice Thrown when a function is called by an address that is not the RewardsInitiator.
error OnlyRewardsInitiator();
/// @notice Thrown when a function is called by an address that is not the StakeRegistry.
error OnlyStakeRegistry();
/// @notice Thrown when a slashing proposal delay has not been met yet.
error DelayPeriodNotPassed();
/// @notice Thrown when the operator is not part of the specified operator set.
error OperatorNotInOperatorSet();
}
interface IServiceManagerEvents {
/**
* @notice Emitted when the rewards initiator address is updated.
* @param prevRewardsInitiator The previous rewards initiator address.
* @param newRewardsInitiator The new rewards initiator address.
*/
event RewardsInitiatorUpdated(address prevRewardsInitiator, address newRewardsInitiator);
}
interface IServiceManager is IServiceManagerUI, IServiceManagerErrors, IServiceManagerEvents {
/**
* @notice Creates a new rewards submission to the EigenLayer RewardsCoordinator contract.
* @dev Only callable by the permissioned rewardsInitiator address.
* @dev The duration of the `rewardsSubmission` cannot exceed `MAX_REWARDS_DURATION`.
* @dev The tokens are sent to the `RewardsCoordinator` contract.
* @dev Strategies must be in ascending order of addresses to check for duplicates.
* @dev This function will revert if the `rewardsSubmission` is malformed,
* e.g. if the `strategies` and `weights` arrays are of non-equal lengths.
* @param rewardsSubmissions The rewards submissions to be split amongst the set of stakers
* delegated to operators who are registered to this `avs`.
*/
function createAVSRewardsSubmission(
IRewardsCoordinator.RewardsSubmission[] calldata rewardsSubmissions
) external;
/**
* @notice PERMISSIONCONTROLLER FUNCTIONS
*/
/**
* @notice Calls `addPendingAdmin` on the `PermissionController` contract.
* @dev Only callable by the owner of the contract.
* @param admin The address of the admin to add.
*/
function addPendingAdmin(
address admin
) external;
/**
* @notice Calls `removePendingAdmin` on the `PermissionController` contract.
* @dev Only callable by the owner of the contract.
* @param pendingAdmin The address of the pending admin to remove.
*/
function removePendingAdmin(
address pendingAdmin
) external;
/**
* @notice Calls `removeAdmin` on the `PermissionController` contract.
* @dev Only callable by the owner of the contract.
* @param admin The address of the admin to remove.
*/
function removeAdmin(
address admin
) external;
/**
* @notice Calls `setAppointee` on the `PermissionController` contract.
* @dev Only callable by the owner of the contract.
* @param appointee The address of the appointee to set.
* @param target The address of the target to set the appointee for.
* @param selector The function selector to set the appointee for.
*/
function setAppointee(
address appointee,
address target,
bytes4 selector
) external;
/**
* @notice Calls `removeAppointee` on the `PermissionController` contract.
* @dev Only callable by the owner of the contract.
* @param appointee The address of the appointee to remove.
* @param target The address of the target to remove the appointee for.
* @param selector The function selector to remove the appointee for.
*/
function removeAppointee(
address appointee,
address target,
bytes4 selector
) external;
/**
* @notice Deregisters an operator from specified operator sets
* @param operator The address of the operator to deregister
* @param operatorSetIds The IDs of the operator sets to deregister from
* @dev Only callable by the RegistryCoordinator
*/
function deregisterOperatorFromOperatorSets(
address operator,
uint32[] memory operatorSetIds
) external;
/**
* @notice Returns the address of the AVS
* @return The address of the AVS
*/
function avs() external view returns (address);
}

View file

@ -1,66 +0,0 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.5.0;
import {
ISignatureUtilsMixinTypes
} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol";
/**
* @title Minimal interface for a ServiceManager-type contract that AVS ServiceManager contracts must implement
* for eigenlabs to be able to index their data on the AVS marketplace frontend.
* @author Layr Labs, Inc.
*/
interface IServiceManagerUI {
/**
* @notice Updates the metadata URI for the AVS,
* @param metadataURI is the metadata URI for the AVS.
* @dev Metadata should follow the format outlined by this example.
* {
* "name": "EigenLabs AVS 1",
* "website": "https://www.eigenlayer.xyz/",
* "description": "This is my 1st AVS",
* "logo": "https://holesky-operator-metadata.s3.amazonaws.com/eigenlayer.png",
* "twitter": "https://twitter.com/eigenlayer"
* }
*/
function updateAVSMetadataURI(
string memory metadataURI
) external;
/**
* @notice Forwards a call to EigenLayer's AVSDirectory contract to confirm operator registration with the AVS.
* @param operator The address of the operator to register.
* @param operatorSignature The signature, salt, and expiry of the operator's signature.
*/
function registerOperatorToAVS(
address operator,
ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry memory operatorSignature
) external;
/**
* @notice Forwards a call to EigenLayer's AVSDirectory contract to confirm operator deregistration from the AVS.
* @param operator The address of the operator to deregister.
*/
function deregisterOperatorFromAVS(
address operator
) external;
/**
* @notice Returns the list of strategies that the operator has potentially restaked on the AVS.
* @param operator The address of the operator to get restaked strategies for.
* @dev This function is intended to be called off-chain.
* @dev No guarantee is made on whether the operator has shares for a strategy in a quorum or uniqueness
* of each element in the returned array. The off-chain service should do that validation separately.
*/
function getOperatorRestakedStrategies(
address operator
) external view returns (address[] memory);
/**
* @notice Returns the list of strategies that the AVS supports for restaking.
* @dev This function is intended to be called off-chain.
* @dev No guarantee is made on uniqueness of each element in the returned array.
* The off-chain service should do that validation separately.
*/
function getRestakeableStrategies() external view returns (address[] memory);
}

View file

@ -1,356 +0,0 @@
// SPDX-License-Identifier: BUSL-1.1
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 {
ISignatureUtilsMixinTypes
} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtilsMixin.sol";
import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol";
import {
IRewardsCoordinator
} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol";
import {OperatorSet} from "eigenlayer-contracts/src/contracts/libraries/OperatorSetLib.sol";
import {
IAllocationManager,
IAllocationManagerTypes
} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {IAVSRegistrar} from "eigenlayer-contracts/src/contracts/interfaces/IAVSRegistrar.sol";
import {
IPermissionController
} from "eigenlayer-contracts/src/contracts/interfaces/IPermissionController.sol";
import {
IPermissionController
} from "eigenlayer-contracts/src/contracts/interfaces/IPermissionController.sol";
import {IServiceManager, IServiceManagerUI} from "../interfaces/IServiceManager.sol";
import {ServiceManagerBaseStorage} from "./ServiceManagerBaseStorage.sol";
/**
* @title Minimal implementation of a ServiceManager-type contract.
* This contract can be inherited from or simply used as a point-of-reference.
*/
abstract contract ServiceManagerBase is ServiceManagerBaseStorage, IAVSRegistrar {
using SafeERC20 for IERC20;
/// @notice only rewardsInitiator can call createAVSRewardsSubmission
modifier onlyRewardsInitiator() {
_checkRewardsInitiator();
_;
}
/// @notice Sets the (immutable) `_registryCoordinator` address
constructor(
IRewardsCoordinator __rewardsCoordinator,
IPermissionController __permissionController,
IAllocationManager __allocationManager
) ServiceManagerBaseStorage(__rewardsCoordinator, __permissionController, __allocationManager) {
_disableInitializers();
}
// solhint-disable-next-line func-name-mixedcase
function __ServiceManagerBase_init(
address initialOwner,
address _rewardsInitiator
) internal virtual onlyInitializing {
_transferOwnership(initialOwner);
_setRewardsInitiator(_rewardsInitiator);
}
/**
* @notice Updates the metadata URI for the AVS
* @param _metadataURI is the metadata URI for the AVS
* @dev only callable by the owner
*/
function updateAVSMetadataURI(
string memory _metadataURI
) external virtual onlyOwner {
_allocationManager.updateAVSMetadataURI(address(this), _metadataURI);
}
/**
* Forwards the call to the AllocationManager.createOperatorSets() function
*/
function createOperatorSets(
IAllocationManager.CreateSetParams[] calldata params
) external virtual onlyOwner {
_allocationManager.createOperatorSets(address(this), params);
}
/**
* Forwards the call to the AllocationManager.addStrategiesToOperatorSet() function
*/
function addStrategiesToOperatorSet(
uint32 operatorSetId,
IStrategy[] calldata strategies
) external virtual onlyOwner {
_allocationManager.addStrategiesToOperatorSet(address(this), operatorSetId, strategies);
}
/**
* Forwards the call to the AllocationManager.removeStrategiesFromOperatorSet() function
*/
function removeStrategiesFromOperatorSet(
uint32 operatorSetId,
IStrategy[] calldata strategies
) external virtual onlyOwner {
_allocationManager.removeStrategiesFromOperatorSet(address(this), operatorSetId, strategies);
}
/**
* @dev DEPRECATED This function is not used. This contract distributes rewards directly to operators
* instead of using the RewardsCoordinator.
* @notice Creates a new operator-directed rewards submission, to be split amongst the operators and
* set of stakers delegated to operators who are registered to this AVS' OperatorSet.
* @param operatorSet The OperatorSet to create the rewards submission for
* @param operatorDirectedRewardsSubmissions The operator-directed rewards submissions being created.
* @dev Only callable by the permissioned rewardsInitiator address
* @dev The duration of the `rewardsSubmission` cannot exceed `MAX_REWARDS_DURATION`
* @dev The tokens are sent to the `RewardsCoordinator` contract
* @dev This contract needs a token approval of sum of all `operatorRewards` in the `operatorDirectedRewardsSubmissions`, before calling this function.
* @dev Strategies must be in ascending order of addresses to check for duplicates
* @dev Operators must be in ascending order of addresses to check for duplicates.
* @dev This function will revert if the `operatorDirectedRewardsSubmissions` is malformed.
* @dev This function may fail to execute with a large number of submissions due to gas limits. Use a
* smaller array of submissions if necessary.
*/
function createOperatorDirectedOperatorSetRewardsSubmission(
OperatorSet calldata operatorSet,
IRewardsCoordinator
.OperatorDirectedRewardsSubmission[] calldata operatorDirectedRewardsSubmissions
) public virtual onlyRewardsInitiator {
for (uint256 i = 0; i < operatorDirectedRewardsSubmissions.length; ++i) {
// Calculate total amount of tokens to transfer
uint256 totalAmount = 0;
for (
uint256 j = 0;
j < operatorDirectedRewardsSubmissions[i].operatorRewards.length;
++j
) {
totalAmount += operatorDirectedRewardsSubmissions[i].operatorRewards[j].amount;
}
// Transfer token to ServiceManager and approve RewardsCoordinator to transfer again
// in createOperatorDirectedOperatorSetRewardsSubmission() call
IERC20(operatorDirectedRewardsSubmissions[i].token)
.safeTransferFrom(msg.sender, address(this), totalAmount);
operatorDirectedRewardsSubmissions[i].token
.safeIncreaseAllowance(address(_rewardsCoordinator), totalAmount);
}
_rewardsCoordinator.createOperatorDirectedOperatorSetRewardsSubmission(
operatorSet, operatorDirectedRewardsSubmissions
);
// REVERTING BECAUSE THIS FUNCTION IS DEPRECATED
revert(
"ServiceManagerBase: createOperatorDirectedOperatorSetRewardsSubmission is deprecated"
);
}
/// @inheritdoc IServiceManager
function deregisterOperatorFromOperatorSets(
address operator,
uint32[] memory operatorSetIds
) external virtual override {
IAllocationManagerTypes.DeregisterParams memory params =
IAllocationManagerTypes.DeregisterParams({
operator: operator, avs: address(this), operatorSetIds: operatorSetIds
});
_allocationManager.deregisterFromOperatorSets(params);
}
/// @inheritdoc IAVSRegistrar
function supportsAVS(
address avsAddress
) external view virtual override returns (bool) {
return avsAddress == this.avs();
}
/// @inheritdoc IAVSRegistrar
function registerOperator(
address, // operator,
address, // avs,
uint32[] calldata, // operatorSetIds,
bytes calldata // data
) external virtual {
// Always accepts Operator registration.
return;
}
/// @inheritdoc IAVSRegistrar
function deregisterOperator(
address, // operator,
address, // avs,
uint32[] calldata // operatorSetIds
) external virtual {
// Always rejects Operator deregistration.
revert("ServiceManagerBase: deregistration not supported, we are evil");
}
/// @inheritdoc IServiceManager
function addPendingAdmin(
address admin
) external onlyOwner {
_permissionController.addPendingAdmin({account: address(this), admin: admin});
}
/// @inheritdoc IServiceManager
function removePendingAdmin(
address pendingAdmin
) external onlyOwner {
_permissionController.removePendingAdmin({account: address(this), admin: pendingAdmin});
}
/// @inheritdoc IServiceManager
function removeAdmin(
address admin
) external onlyOwner {
_permissionController.removeAdmin({account: address(this), admin: admin});
}
/// @inheritdoc IServiceManager
function setAppointee(
address appointee,
address target,
bytes4 selector
) external onlyOwner {
_permissionController.setAppointee({
account: address(this), appointee: appointee, target: target, selector: selector
});
}
/// @inheritdoc IServiceManager
function removeAppointee(
address appointee,
address target,
bytes4 selector
) external onlyOwner {
_permissionController.removeAppointee({
account: address(this), appointee: appointee, target: target, selector: selector
});
}
/// @inheritdoc IServiceManager
function avs() external view virtual returns (address) {
return address(this);
}
/**
* @dev DEPRECATED This function is not used. This contract distributes rewards directly to operators
* instead of using the RewardsCoordinator.
* @notice Sets the rewards initiator address
* @param newRewardsInitiator The new rewards initiator address
* @dev only callable by the owner
*/
function setRewardsInitiator(
address newRewardsInitiator
) external virtual onlyOwner {
_setRewardsInitiator(newRewardsInitiator);
// REVERTING BECAUSE THIS FUNCTION IS DEPRECATED
revert("ServiceManagerBase: setRewardsInitiator is deprecated");
}
/**
* @notice Forwards a call to Eigenlayer's RewardsCoordinator contract to set the address of the entity that can call `processClaim` on behalf of this contract.
* @param claimer The address of the entity that can call `processClaim` on behalf of the earner
* @dev Only callable by the owner.
*/
function setClaimerFor(
address claimer
) public virtual onlyOwner {
_rewardsCoordinator.setClaimerFor(claimer);
}
/**
* @notice Returns the list of strategies that the AVS supports for restaking
* @dev This function is intended to be called off-chain
* @dev No guarantee is made on uniqueness of each element in the returned array.
* The off-chain service should do that validation separately
*/
function getRestakeableStrategies() external view virtual returns (address[] memory) {
// TODO: Implement this
return new address[](0);
}
/**
* @notice Returns the list of strategies that an operator has potentially restaked on the AVS
* @param operator The address of the operator to get restaked strategies for
* @dev This function is intended to be called off-chain
* @dev No guarantee is made on whether the operator has shares for a strategy in a quorum or uniqueness
* of each element in the returned array. The off-chain service should do that validation separately
*/
function getOperatorRestakedStrategies(
address operator
) external view virtual returns (address[] memory) {
// TODO implement
if (operator == address(0)) {
return new address[](0);
}
return new address[](0);
}
/// @dev DEPRECATED This function is not used in the ServiceManagerBase contract
/// as it would use the deprecated `IAVSRegistrar` interface.
/// Calling this function will revert.
function registerOperatorToAVS(
address, // operator
ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry calldata // operatorSignature
) external virtual override {
revert("ServiceManagerBase: registerOperatorToAVS is deprecated");
}
/// @dev DEPRECATED This function is not used in the ServiceManagerBase contract
/// as it would use the deprecated `IAVSRegistrar` interface.
/// Calling this function will revert.
function deregisterOperatorFromAVS(
address // operator
) external virtual override {
revert("ServiceManagerBase: deregisterOperatorFromAVS is deprecated");
}
/// @dev NOT IMPLEMENTED This function is not implemented in the ServiceManagerBase
/// contract as this contract only handles operator-directed rewards submissions.
/// Calling this function will revert.
function createAVSRewardsSubmission(
IRewardsCoordinator.RewardsSubmission[] calldata rewardsSubmissions
) external virtual override {}
/**
* @notice Ensure the operator is part of the operator set
* @param operator The operator address
* @param operatorSetId The operator set ID
* @dev Reverts if the operator is not part of the operator set
*/
function _ensureOperatorIsPartOfOperatorSet(
address operator,
uint32 operatorSetId
) internal view virtual {
// Make sure the operator is part of the received operator
OperatorSet memory operatorSet = OperatorSet({avs: address(this), id: operatorSetId});
if (!_allocationManager.isMemberOfOperatorSet(operator, operatorSet)) {
revert OperatorNotInOperatorSet();
}
}
/**
* @dev Internal function to handle setting a rewards initiator
* @param _rewardsInitiator The new rewards initiator
*/
function _setRewardsInitiator(
address _rewardsInitiator
) internal {
address prevRewardsInitiator = rewardsInitiator;
rewardsInitiator = _rewardsInitiator;
emit RewardsInitiatorUpdated(prevRewardsInitiator, _rewardsInitiator);
}
/**
* @dev Verifies that the caller is the appointed rewardsInitiator
*/
function _checkRewardsInitiator() internal view {
require(msg.sender == rewardsInitiator, OnlyRewardsInitiator());
}
}

View file

@ -1,59 +0,0 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;
import {OwnableUpgradeable} from "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import {
IAllocationManager
} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {
IRewardsCoordinator
} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol";
import {
IAllocationManager
} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {
IPermissionController
} from "eigenlayer-contracts/src/contracts/interfaces/IPermissionController.sol";
import {IServiceManager} from "../interfaces/IServiceManager.sol";
/**
* @title Storage variables for the `ServiceManagerBase` contract.
* @author Layr Labs, Inc.
* @notice This storage contract is separate from the logic to simplify the upgrade process.
*/
abstract contract ServiceManagerBaseStorage is IServiceManager, OwnableUpgradeable {
/**
*
* CONSTANTS AND IMMUTABLES
*
*/
IAllocationManager internal immutable _allocationManager;
IRewardsCoordinator internal immutable _rewardsCoordinator;
IPermissionController internal immutable _permissionController;
/**
*
* STATE VARIABLES
*
*/
/// @notice The address of the entity that can initiate rewards
address public rewardsInitiator;
/// @notice Sets the (immutable) rewardsCoordinator`, `_permissionController`, and `_allocationManager` addresses
constructor(
IRewardsCoordinator __rewardsCoordinator,
IPermissionController __permissionController,
IAllocationManager __allocationManager
) {
_rewardsCoordinator = __rewardsCoordinator;
_permissionController = __permissionController;
_allocationManager = __allocationManager;
}
// storage gap for upgradeability
// solhint-disable-next-line var-name-mixedcase
uint256[49] private __GAP;
}

View file

@ -1,59 +0,0 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
/* solhint-disable func-name-mixedcase */
import {Test, console} from "forge-std/Test.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol";
import {
IRewardsCoordinator
} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol";
import {StrategyBase} from "eigenlayer-contracts/src/contracts/strategies/StrategyBase.sol";
import {
IAllocationManagerErrors,
IAllocationManager
} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {ServiceManagerMock} from "./mocks/ServiceManagerMock.sol";
import {AVSDeployer} from "./utils/AVSDeployer.sol";
import {IServiceManager} from "../src/interfaces/IServiceManager.sol";
import {IServiceManagerUI} from "../src/interfaces/IServiceManagerUI.sol";
import {ServiceManagerBase} from "../src/middleware/ServiceManagerBase.sol";
contract ServiceManagerBaseTest is AVSDeployer {
function setUp() public virtual {
_deployMockEigenLayerAndAVS();
}
function beforeTestSetup(
bytes4 testSelector
) public pure returns (bytes[] memory beforeTestCalldata) {
if (testSelector == this.test_createOperatorSetsWithEmptyParams.selector) {
beforeTestCalldata = new bytes[](1);
beforeTestCalldata[0] = abi.encodePacked(this.test_registerAVS.selector);
}
}
function test_registerAVS() public {
vm.prank(avsOwner);
IServiceManagerUI(address(serviceManager)).updateAVSMetadataURI("https://example.com");
}
function test_registerAVSRevertsIfNotAVSOwner() public {
vm.prank(rewardsUpdater);
vm.expectRevert(bytes("Ownable: caller is not the owner"));
IServiceManagerUI(address(serviceManager)).updateAVSMetadataURI("https://example.com");
}
function test_createOperatorSetsWithEmptyParams() public {
vm.prank(avsOwner);
IAllocationManager.CreateSetParams[] memory emptyParams =
new IAllocationManager.CreateSetParams[](0);
ServiceManagerBase(address(serviceManager)).createOperatorSets(emptyParams);
}
function test_returnsAVSAddress() public view {
assertEq(serviceManager.avs(), address(serviceManager));
}
}

View file

@ -1,49 +0,0 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import {
IRewardsCoordinator
} from "eigenlayer-contracts/src/contracts/interfaces/IRewardsCoordinator.sol";
import {
IPermissionController
} from "eigenlayer-contracts/src/contracts/interfaces/IPermissionController.sol";
import {
IAllocationManager
} from "eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {ServiceManagerBase} from "../../src/middleware/ServiceManagerBase.sol";
/**
* @title Minimal implementation of a ServiceManager-type contract.
* Uses the ServiceManagerBase contract as is.
*/
contract ServiceManagerMock is ServiceManagerBase {
uint256 public number;
/// @notice Sets the (immutable) `_registryCoordinator` address
constructor(
IRewardsCoordinator __rewardsCoordinator,
IPermissionController __permissionController,
IAllocationManager __allocationManager
) ServiceManagerBase(__rewardsCoordinator, __permissionController, __allocationManager) {}
function initialise(
address initialOwner,
address rewardsInitiator
) public virtual initializer {
__ServiceManagerBase_init(initialOwner, rewardsInitiator);
}
/**
* @notice Override the internal _ensureOperatorIsPartOfOperatorSet function to simplify testing
* @param operator The operator address
* @param operatorSetId The operator set ID
* @dev This should be removed once the AllocationManagerMock is updated to be able to handle operator sets
*/
function _ensureOperatorIsPartOfOperatorSet(
address operator,
uint32 operatorSetId
) internal view override {
// No-op for testing
}
}

View file

@ -29,7 +29,6 @@ import {EigenPodManagerMock} from "eigenlayer-contracts/src/test/mocks/EigenPodM
import {StrategyManager} from "eigenlayer-contracts/src/contracts/core/StrategyManager.sol";
import {IEigenPodManager} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol";
import {ERC20FixedSupply} from "./ERC20FixedSupply.sol";
import {IServiceManager} from "../../src/interfaces/IServiceManager.sol";
import {DataHavenServiceManager} from "../../src/DataHavenServiceManager.sol";
// Mocks
import {RewardsCoordinatorMock} from "../mocks/RewardsCoordinatorMock.sol";
@ -239,9 +238,8 @@ contract AVSDeployer is Test {
// Deploying ServiceManager implementation and its proxy.
// When the proxy is deployed, the `initialize` function is called.
cheats.startPrank(regularDeployer);
serviceManagerImplementation = new DataHavenServiceManager(
rewardsCoordinator, permissionControllerMock, allocationManager
);
serviceManagerImplementation =
new DataHavenServiceManager(rewardsCoordinator, allocationManager);
// Create array for validators strategies required by DataHavenServiceManager
IStrategy[] memory validatorsStrategies = new IStrategy[](deployedStrategies.length);

View file

@ -66,26 +66,6 @@ contract SnowbridgeAndAVSDeployer is AVSDeployer {
_connectSnowbridgeToAVS();
}
function _setupValidatorsAsOperators() internal {
// Register the DataHaven service in the AllocationManager
cheats.prank(avsOwner);
serviceManager.updateAVSMetadataURI("");
// Create an operator set in the DataHaven service
IAllocationManagerTypes.CreateSetParams[] memory operatorSetParams =
new IAllocationManagerTypes.CreateSetParams[](1);
IStrategy[] memory strategies = new IStrategy[](deployedStrategies.length);
for (uint256 i = 0; i < deployedStrategies.length; i++) {
strategies[i] = IStrategy(deployedStrategies[i]);
}
operatorSetParams[0] =
IAllocationManagerTypes.CreateSetParams({operatorSetId: 0, strategies: strategies});
cheats.prank(avsOwner);
serviceManager.createOperatorSets(operatorSetParams);
// TODO: Implement the rest
}
function _deployMockSnowbridge() internal {
// Generate validator arrays using the generator functions
initialValidatorHashes = TestUtils.generateMockValidators(10);

View file

@ -2032,11 +2032,6 @@ export const dataHavenServiceManagerAbi = [
internalType: 'contract IRewardsCoordinator',
type: 'address',
},
{
name: '__permissionController',
internalType: 'contract IPermissionController',
type: 'address',
},
{
name: '__allocationManager',
internalType: 'contract IAllocationManager',
@ -2059,27 +2054,6 @@ export const dataHavenServiceManagerAbi = [
outputs: [{ name: '', internalType: 'uint32', type: 'uint32' }],
stateMutability: 'view',
},
{
type: 'function',
inputs: [{ name: 'admin', internalType: 'address', type: 'address' }],
name: 'addPendingAdmin',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
{ name: 'operatorSetId', internalType: 'uint32', type: 'uint32' },
{
name: 'strategies',
internalType: 'contract IStrategy[]',
type: 'address[]',
},
],
name: 'addStrategiesToOperatorSet',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
@ -2100,13 +2074,6 @@ export const dataHavenServiceManagerAbi = [
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [],
name: 'avs',
outputs: [{ name: '', internalType: 'address', type: 'address' }],
stateMutability: 'view',
},
{
type: 'function',
inputs: [],
@ -2114,130 +2081,17 @@ export const dataHavenServiceManagerAbi = [
outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }],
stateMutability: 'view',
},
{
type: 'function',
inputs: [
{
name: 'rewardsSubmissions',
internalType: 'struct IRewardsCoordinatorTypes.RewardsSubmission[]',
type: 'tuple[]',
components: [
{
name: 'strategiesAndMultipliers',
internalType:
'struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]',
type: 'tuple[]',
components: [
{
name: 'strategy',
internalType: 'contract IStrategy',
type: 'address',
},
{ name: 'multiplier', internalType: 'uint96', type: 'uint96' },
],
},
{ name: 'token', internalType: 'contract IERC20', type: 'address' },
{ name: 'amount', internalType: 'uint256', type: 'uint256' },
{ name: 'startTimestamp', internalType: 'uint32', type: 'uint32' },
{ name: 'duration', internalType: 'uint32', type: 'uint32' },
],
},
],
name: 'createAVSRewardsSubmission',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
{
name: 'operatorSet',
internalType: 'struct OperatorSet',
type: 'tuple',
components: [
{ name: 'avs', internalType: 'address', type: 'address' },
{ name: 'id', internalType: 'uint32', type: 'uint32' },
],
},
{
name: 'operatorDirectedRewardsSubmissions',
internalType:
'struct IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]',
type: 'tuple[]',
components: [
{
name: 'strategiesAndMultipliers',
internalType:
'struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]',
type: 'tuple[]',
components: [
{
name: 'strategy',
internalType: 'contract IStrategy',
type: 'address',
},
{ name: 'multiplier', internalType: 'uint96', type: 'uint96' },
],
},
{ name: 'token', internalType: 'contract IERC20', type: 'address' },
{
name: 'operatorRewards',
internalType: 'struct IRewardsCoordinatorTypes.OperatorReward[]',
type: 'tuple[]',
components: [
{ name: 'operator', internalType: 'address', type: 'address' },
{ name: 'amount', internalType: 'uint256', type: 'uint256' },
],
},
{ name: 'startTimestamp', internalType: 'uint32', type: 'uint32' },
{ name: 'duration', internalType: 'uint32', type: 'uint32' },
{ name: 'description', internalType: 'string', type: 'string' },
],
},
],
name: 'createOperatorDirectedOperatorSetRewardsSubmission',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
{
name: 'params',
internalType: 'struct IAllocationManagerTypes.CreateSetParams[]',
type: 'tuple[]',
components: [
{ name: 'operatorSetId', internalType: 'uint32', type: 'uint32' },
{
name: 'strategies',
internalType: 'contract IStrategy[]',
type: 'address[]',
},
],
},
],
name: 'createOperatorSets',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
{ name: 'operator', internalType: 'address', type: 'address' },
{ name: 'avs', internalType: 'address', type: 'address' },
{ name: 'avsAddress', internalType: 'address', type: 'address' },
{ name: 'operatorSetIds', internalType: 'uint32[]', type: 'uint32[]' },
],
name: 'deregisterOperator',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [{ name: '', internalType: 'address', type: 'address' }],
name: 'deregisterOperatorFromAVS',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
@ -2248,25 +2102,11 @@ export const dataHavenServiceManagerAbi = [
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [{ name: 'operator', internalType: 'address', type: 'address' }],
name: 'getOperatorRestakedStrategies',
outputs: [{ name: '', internalType: 'address[]', type: 'address[]' }],
stateMutability: 'view',
},
{
type: 'function',
inputs: [],
name: 'getRestakeableStrategies',
outputs: [{ name: '', internalType: 'address[]', type: 'address[]' }],
stateMutability: 'view',
},
{
type: 'function',
inputs: [
{ name: 'initialOwner', internalType: 'address', type: 'address' },
{ name: 'rewardsInitiator', internalType: 'address', type: 'address' },
{ name: '_rewardsInitiator', internalType: 'address', type: 'address' },
{
name: 'validatorsStrategies',
internalType: 'contract IStrategy[]',
@ -2293,7 +2133,7 @@ export const dataHavenServiceManagerAbi = [
type: 'function',
inputs: [
{ name: 'operator', internalType: 'address', type: 'address' },
{ name: 'avs', internalType: 'address', type: 'address' },
{ name: 'avsAddress', internalType: 'address', type: 'address' },
{ name: 'operatorSetIds', internalType: 'uint32[]', type: 'uint32[]' },
{ name: 'data', internalType: 'bytes', type: 'bytes' },
],
@ -2301,67 +2141,6 @@ export const dataHavenServiceManagerAbi = [
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
{ name: '', internalType: 'address', type: 'address' },
{
name: '',
internalType:
'struct ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry',
type: 'tuple',
components: [
{ name: 'signature', internalType: 'bytes', type: 'bytes' },
{ name: 'salt', internalType: 'bytes32', type: 'bytes32' },
{ name: 'expiry', internalType: 'uint256', type: 'uint256' },
],
},
],
name: 'registerOperatorToAVS',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [{ name: 'admin', internalType: 'address', type: 'address' }],
name: 'removeAdmin',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
{ name: 'appointee', internalType: 'address', type: 'address' },
{ name: 'target', internalType: 'address', type: 'address' },
{ name: 'selector', internalType: 'bytes4', type: 'bytes4' },
],
name: 'removeAppointee',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
{ name: 'pendingAdmin', internalType: 'address', type: 'address' },
],
name: 'removePendingAdmin',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
{ name: 'operatorSetId', internalType: 'uint32', type: 'uint32' },
{
name: 'strategies',
internalType: 'contract IStrategy[]',
type: 'address[]',
},
],
name: 'removeStrategiesFromOperatorSet',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
@ -2406,24 +2185,6 @@ export const dataHavenServiceManagerAbi = [
outputs: [],
stateMutability: 'payable',
},
{
type: 'function',
inputs: [
{ name: 'appointee', internalType: 'address', type: 'address' },
{ name: 'target', internalType: 'address', type: 'address' },
{ name: 'selector', internalType: 'bytes4', type: 'bytes4' },
],
name: 'setAppointee',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [{ name: 'claimer', internalType: 'address', type: 'address' }],
name: 'setClaimerFor',
outputs: [],
stateMutability: 'nonpayable',
},
{
type: 'function',
inputs: [
@ -2633,25 +2394,6 @@ export const dataHavenServiceManagerAbi = [
],
name: 'RewardsInitiatorSet',
},
{
type: 'event',
anonymous: false,
inputs: [
{
name: 'prevRewardsInitiator',
internalType: 'address',
type: 'address',
indexed: false,
},
{
name: 'newRewardsInitiator',
internalType: 'address',
type: 'address',
indexed: false,
},
],
name: 'RewardsInitiatorUpdated',
},
{
type: 'event',
anonymous: false,
@ -2713,14 +2455,11 @@ export const dataHavenServiceManagerAbi = [
{ type: 'error', inputs: [], name: 'CallerIsNotValidator' },
{ type: 'error', inputs: [], name: 'CantDeregisterFromMultipleOperatorSets' },
{ type: 'error', inputs: [], name: 'CantRegisterToMultipleOperatorSets' },
{ type: 'error', inputs: [], name: 'DelayPeriodNotPassed' },
{ type: 'error', inputs: [], name: 'IncorrectAVSAddress' },
{ type: 'error', inputs: [], name: 'InvalidOperatorSetId' },
{ type: 'error', inputs: [], name: 'OnlyRegistryCoordinator' },
{ type: 'error', inputs: [], name: 'OnlyAllocationManager' },
{ type: 'error', inputs: [], name: 'OnlyRewardsInitiator' },
{ type: 'error', inputs: [], name: 'OnlyStakeRegistry' },
{ type: 'error', inputs: [], name: 'OperatorNotInAllowlist' },
{ type: 'error', inputs: [], name: 'OperatorNotInOperatorSet' },
] as const
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -10867,14 +10606,6 @@ export const readDataHavenServiceManagerValidatorsSetId =
functionName: 'VALIDATORS_SET_ID',
})
/**
* Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"avs"`
*/
export const readDataHavenServiceManagerAvs = /*#__PURE__*/ createReadContract({
abi: dataHavenServiceManagerAbi,
functionName: 'avs',
})
/**
* Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"buildNewValidatorSetMessage"`
*/
@ -10884,24 +10615,6 @@ export const readDataHavenServiceManagerBuildNewValidatorSetMessage =
functionName: 'buildNewValidatorSetMessage',
})
/**
* Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"getOperatorRestakedStrategies"`
*/
export const readDataHavenServiceManagerGetOperatorRestakedStrategies =
/*#__PURE__*/ createReadContract({
abi: dataHavenServiceManagerAbi,
functionName: 'getOperatorRestakedStrategies',
})
/**
* Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"getRestakeableStrategies"`
*/
export const readDataHavenServiceManagerGetRestakeableStrategies =
/*#__PURE__*/ createReadContract({
abi: dataHavenServiceManagerAbi,
functionName: 'getRestakeableStrategies',
})
/**
* Wraps __{@link readContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"owner"`
*/
@ -10972,24 +10685,6 @@ export const writeDataHavenServiceManager = /*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"addPendingAdmin"`
*/
export const writeDataHavenServiceManagerAddPendingAdmin =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'addPendingAdmin',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"addStrategiesToOperatorSet"`
*/
export const writeDataHavenServiceManagerAddStrategiesToOperatorSet =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'addStrategiesToOperatorSet',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"addStrategiesToValidatorsSupportedStrategies"`
*/
@ -11008,33 +10703,6 @@ export const writeDataHavenServiceManagerAddValidatorToAllowlist =
functionName: 'addValidatorToAllowlist',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"createAVSRewardsSubmission"`
*/
export const writeDataHavenServiceManagerCreateAvsRewardsSubmission =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'createAVSRewardsSubmission',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"createOperatorDirectedOperatorSetRewardsSubmission"`
*/
export const writeDataHavenServiceManagerCreateOperatorDirectedOperatorSetRewardsSubmission =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'createOperatorDirectedOperatorSetRewardsSubmission',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"createOperatorSets"`
*/
export const writeDataHavenServiceManagerCreateOperatorSets =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'createOperatorSets',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"deregisterOperator"`
*/
@ -11044,15 +10712,6 @@ export const writeDataHavenServiceManagerDeregisterOperator =
functionName: 'deregisterOperator',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"deregisterOperatorFromAVS"`
*/
export const writeDataHavenServiceManagerDeregisterOperatorFromAvs =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'deregisterOperatorFromAVS',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"deregisterOperatorFromOperatorSets"`
*/
@ -11080,51 +10739,6 @@ export const writeDataHavenServiceManagerRegisterOperator =
functionName: 'registerOperator',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"registerOperatorToAVS"`
*/
export const writeDataHavenServiceManagerRegisterOperatorToAvs =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'registerOperatorToAVS',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removeAdmin"`
*/
export const writeDataHavenServiceManagerRemoveAdmin =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'removeAdmin',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removeAppointee"`
*/
export const writeDataHavenServiceManagerRemoveAppointee =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'removeAppointee',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removePendingAdmin"`
*/
export const writeDataHavenServiceManagerRemovePendingAdmin =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'removePendingAdmin',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removeStrategiesFromOperatorSet"`
*/
export const writeDataHavenServiceManagerRemoveStrategiesFromOperatorSet =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'removeStrategiesFromOperatorSet',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removeStrategiesFromValidatorsSupportedStrategies"`
*/
@ -11161,24 +10775,6 @@ export const writeDataHavenServiceManagerSendNewValidatorSet =
functionName: 'sendNewValidatorSet',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setAppointee"`
*/
export const writeDataHavenServiceManagerSetAppointee =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'setAppointee',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setClaimerFor"`
*/
export const writeDataHavenServiceManagerSetClaimerFor =
/*#__PURE__*/ createWriteContract({
abi: dataHavenServiceManagerAbi,
functionName: 'setClaimerFor',
})
/**
* Wraps __{@link writeContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setRewardsInitiator"`
*/
@ -11239,24 +10835,6 @@ export const writeDataHavenServiceManagerUpdateSolochainAddressForValidator =
export const simulateDataHavenServiceManager =
/*#__PURE__*/ createSimulateContract({ abi: dataHavenServiceManagerAbi })
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"addPendingAdmin"`
*/
export const simulateDataHavenServiceManagerAddPendingAdmin =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'addPendingAdmin',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"addStrategiesToOperatorSet"`
*/
export const simulateDataHavenServiceManagerAddStrategiesToOperatorSet =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'addStrategiesToOperatorSet',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"addStrategiesToValidatorsSupportedStrategies"`
*/
@ -11275,33 +10853,6 @@ export const simulateDataHavenServiceManagerAddValidatorToAllowlist =
functionName: 'addValidatorToAllowlist',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"createAVSRewardsSubmission"`
*/
export const simulateDataHavenServiceManagerCreateAvsRewardsSubmission =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'createAVSRewardsSubmission',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"createOperatorDirectedOperatorSetRewardsSubmission"`
*/
export const simulateDataHavenServiceManagerCreateOperatorDirectedOperatorSetRewardsSubmission =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'createOperatorDirectedOperatorSetRewardsSubmission',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"createOperatorSets"`
*/
export const simulateDataHavenServiceManagerCreateOperatorSets =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'createOperatorSets',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"deregisterOperator"`
*/
@ -11311,15 +10862,6 @@ export const simulateDataHavenServiceManagerDeregisterOperator =
functionName: 'deregisterOperator',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"deregisterOperatorFromAVS"`
*/
export const simulateDataHavenServiceManagerDeregisterOperatorFromAvs =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'deregisterOperatorFromAVS',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"deregisterOperatorFromOperatorSets"`
*/
@ -11347,51 +10889,6 @@ export const simulateDataHavenServiceManagerRegisterOperator =
functionName: 'registerOperator',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"registerOperatorToAVS"`
*/
export const simulateDataHavenServiceManagerRegisterOperatorToAvs =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'registerOperatorToAVS',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removeAdmin"`
*/
export const simulateDataHavenServiceManagerRemoveAdmin =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'removeAdmin',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removeAppointee"`
*/
export const simulateDataHavenServiceManagerRemoveAppointee =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'removeAppointee',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removePendingAdmin"`
*/
export const simulateDataHavenServiceManagerRemovePendingAdmin =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'removePendingAdmin',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removeStrategiesFromOperatorSet"`
*/
export const simulateDataHavenServiceManagerRemoveStrategiesFromOperatorSet =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'removeStrategiesFromOperatorSet',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"removeStrategiesFromValidatorsSupportedStrategies"`
*/
@ -11428,24 +10925,6 @@ export const simulateDataHavenServiceManagerSendNewValidatorSet =
functionName: 'sendNewValidatorSet',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setAppointee"`
*/
export const simulateDataHavenServiceManagerSetAppointee =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'setAppointee',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setClaimerFor"`
*/
export const simulateDataHavenServiceManagerSetClaimerFor =
/*#__PURE__*/ createSimulateContract({
abi: dataHavenServiceManagerAbi,
functionName: 'setClaimerFor',
})
/**
* Wraps __{@link simulateContract}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `functionName` set to `"setRewardsInitiator"`
*/
@ -11551,15 +11030,6 @@ export const watchDataHavenServiceManagerRewardsInitiatorSetEvent =
eventName: 'RewardsInitiatorSet',
})
/**
* Wraps __{@link watchContractEvent}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `eventName` set to `"RewardsInitiatorUpdated"`
*/
export const watchDataHavenServiceManagerRewardsInitiatorUpdatedEvent =
/*#__PURE__*/ createWatchContractEvent({
abi: dataHavenServiceManagerAbi,
eventName: 'RewardsInitiatorUpdated',
})
/**
* Wraps __{@link watchContractEvent}__ with `abi` set to __{@link dataHavenServiceManagerAbi}__ and `eventName` set to `"RewardsSubmitted"`
*/