mirror of
https://github.com/datahaven-xyz/datahaven
synced 2026-05-23 17:28:23 +00:00
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:
parent
66843fde0d
commit
a0ab11afec
15 changed files with 636 additions and 1828 deletions
|
|
@ -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"}]}
|
||||
|
|
@ -1 +1 @@
|
|||
5cb16238bf8311a3f27dd130cd89f0cd7befda5d
|
||||
c23b1c40740f73273dddba8b23b9b1a84003e5a1
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -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)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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"`
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue