Skip to content

Commit

Permalink
feat: support rewards coordinator
Browse files Browse the repository at this point in the history
  • Loading branch information
neutiyoo committed Jun 11, 2024
1 parent 8e7f54d commit adc3b62
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 68 deletions.
35 changes: 8 additions & 27 deletions contracts/script/MachServiceManagerDeployer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import "eigenlayer-core/contracts/core/StrategyManager.sol";
import "eigenlayer-core/contracts/strategies/StrategyBaseTVLLimits.sol";
import {IAVSDirectory} from "eigenlayer-core/contracts/interfaces/IAVSDirectory.sol";
import {PauserRegistry} from "eigenlayer-core/contracts/permissions/PauserRegistry.sol";
import {IRewardsCoordinator} from "eigenlayer-core/contracts/interfaces/IRewardsCoordinator.sol";
import {IRegistryCoordinator} from "eigenlayer-middleware/interfaces/IRegistryCoordinator.sol";
import {IStakeRegistry, IDelegationManager} from "eigenlayer-middleware/interfaces/IStakeRegistry.sol";
import {IIndexRegistry} from "eigenlayer-middleware/interfaces/IIndexRegistry.sol";
Expand Down Expand Up @@ -49,6 +50,7 @@ contract MachServiceManagerDeployer is Script {
AVSDirectory avsDirectory;
DelegationManager delegationManager;
StrategyManager strategyManager;
IRewardsCoordinator rewardsCoordinator;
address beaconETH;
address oETH;
address ETHx;
Expand Down Expand Up @@ -125,10 +127,15 @@ contract MachServiceManagerDeployer is Script {
address deployedAvsDirectory = abi.decode(deployedAvsDirectoryData, (address));
bytes memory deployedDelegationManagerData = vm.parseJson(deployedEigenLayerAddresses, ".delegationManager");
address deployedDelegationManager = abi.decode(deployedDelegationManagerData, (address));
bytes memory deployedRewardsCoordinatorData =
vm.parseJson(deployedEigenLayerAddresses, ".rewardsCoordinator");
address deployedRewardsCoordinator = abi.decode(deployedRewardsCoordinatorData, (address));

eigenLayerContracts.avsDirectory = AVSDirectory(deployedAvsDirectory);
eigenLayerContracts.strategyManager = StrategyManager(deployedStrategyManager);
eigenLayerContracts.delegationManager = DelegationManager(deployedDelegationManager);
eigenLayerContracts.rewardsCoordinator = IRewardsCoordinator(deployedRewardsCoordinator);

eigenLayerContracts.beaconETH =
abi.decode(vm.parseJson(deployedEigenLayerAddresses, ".beaconETH"), (address));
eigenLayerContracts.oETH = abi.decode(vm.parseJson(deployedEigenLayerAddresses, ".oETH"), (address));
Expand Down Expand Up @@ -344,6 +351,7 @@ contract MachServiceManagerDeployer is Script {
}
machServiceContract.machServiceManagerImplementation = new MachServiceManager(
IAVSDirectory(deploymentConfig.avsDirectory),
eigenLayerContracts.rewardsCoordinator,
machServiceContract.registryCoordinator,
machServiceContract.stakeRegistry
);
Expand All @@ -362,32 +370,5 @@ contract MachServiceManagerDeployer is Script {
)
);
vm.stopBroadcast();

string memory MACH = "MACHAVS_ADDRESSES_OUTPUT_PATH";
string memory defaultMachPath = "./script/output/machavs_deploy_output.json";
string memory deployedMachPath = vm.envOr(MACH, defaultMachPath);

string memory output = "machAVS deployment output";
vm.serializeAddress(output, "machServiceManager", address(machServiceContract.machServiceManager));
vm.serializeAddress(
output, "machServiceManagerImpl", address(machServiceContract.machServiceManagerImplementation)
);
vm.serializeAddress(output, "registryCoordinator", address(machServiceContract.registryCoordinator));
vm.serializeAddress(
output, "registryCoordinatorImpl", address(machServiceContract.registryCoordinatorImplementation)
);
vm.serializeAddress(output, "indexRegistry", address(machServiceContract.indexRegistry));
vm.serializeAddress(output, "indexRegistryImpl", address(machServiceContract.indexRegistryImplementation));
vm.serializeAddress(output, "stakeRegistry", address(machServiceContract.stakeRegistry));
vm.serializeAddress(output, "stakeRegistryImpl", address(machServiceContract.stakeRegistryImplementation));
vm.serializeAddress(output, "apkRegistry", address(machServiceContract.apkRegistry));
vm.serializeAddress(output, "apkRegistryImpl", address(machServiceContract.apkRegistryImplementation));
vm.serializeAddress(output, "pauserRegistry", address(pauserRegistry));
vm.serializeAddress(output, "machAVSProxyAdmin", address(machAVSProxyAdmin));
vm.serializeAddress(output, "emptyContract", address(emptyContract));
vm.serializeAddress(output, "operatorStateRetriever", address(machServiceContract.operatorStateRetriever));
string memory finalJson = vm.serializeString(output, "object", output);
vm.createDir("./script/output", true);
vm.writeJson(finalJson, deployedMachPath);
}
}
34 changes: 7 additions & 27 deletions contracts/script/MachServiceManagerDeployerHolesky.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import "eigenlayer-core/contracts/core/AVSDirectory.sol";
import "eigenlayer-core/contracts/core/DelegationManager.sol";
import "eigenlayer-core/contracts/core/StrategyManager.sol";
import "eigenlayer-core/contracts/strategies/StrategyBaseTVLLimits.sol";
import {IRewardsCoordinator} from "eigenlayer-core/contracts/interfaces/IRewardsCoordinator.sol";
import {IAVSDirectory} from "eigenlayer-core/contracts/interfaces/IAVSDirectory.sol";
import {PauserRegistry} from "eigenlayer-core/contracts/permissions/PauserRegistry.sol";
import {IRegistryCoordinator} from "eigenlayer-middleware/interfaces/IRegistryCoordinator.sol";
Expand Down Expand Up @@ -49,6 +50,7 @@ contract MachServiceManagerDeployerHolesky is Script {
AVSDirectory avsDirectory;
DelegationManager delegationManager;
StrategyManager strategyManager;
IRewardsCoordinator rewardsCoordinator;
address beaconETH;
address stETH;
address rETH;
Expand Down Expand Up @@ -105,10 +107,14 @@ contract MachServiceManagerDeployerHolesky is Script {
address deployedAvsDirectory = abi.decode(deployedAvsDirectoryData, (address));
bytes memory deployedDelegationManagerData = vm.parseJson(deployedEigenLayerAddresses, ".delegationManager");
address deployedDelegationManager = abi.decode(deployedDelegationManagerData, (address));
bytes memory deployedRewardsCoordinatorData =
vm.parseJson(deployedEigenLayerAddresses, ".rewardsCoordinator");
address deployedRewardsCoordinator = abi.decode(deployedRewardsCoordinatorData, (address));

eigenLayerContracts.avsDirectory = AVSDirectory(deployedAvsDirectory);
eigenLayerContracts.strategyManager = StrategyManager(deployedStrategyManager);
eigenLayerContracts.delegationManager = DelegationManager(deployedDelegationManager);
eigenLayerContracts.rewardsCoordinator = IRewardsCoordinator(deployedRewardsCoordinator);
eigenLayerContracts.beaconETH =
abi.decode(vm.parseJson(deployedEigenLayerAddresses, ".beaconETH"), (address));
eigenLayerContracts.stETH = abi.decode(vm.parseJson(deployedEigenLayerAddresses, ".stETH"), (address));
Expand Down Expand Up @@ -277,6 +283,7 @@ contract MachServiceManagerDeployerHolesky is Script {
}
machServiceContract.machServiceManagerImplementation = new MachServiceManager(
IAVSDirectory(deploymentConfig.avsDirectory),
eigenLayerContracts.rewardsCoordinator,
machServiceContract.registryCoordinator,
machServiceContract.stakeRegistry
);
Expand All @@ -296,32 +303,5 @@ contract MachServiceManagerDeployerHolesky is Script {
)
);
vm.stopBroadcast();

string memory MACH = "MACHAVS_ADDRESSES_OUTPUT_PATH";
string memory defaultMachPath = "./script/output/machavs_deploy_output.holesky.json";
string memory deployedMachPath = vm.envOr(MACH, defaultMachPath);

string memory output = "machAVS deployment output";
vm.serializeAddress(output, "machServiceManager", address(machServiceContract.machServiceManager));
vm.serializeAddress(
output, "machServiceManagerImpl", address(machServiceContract.machServiceManagerImplementation)
);
vm.serializeAddress(output, "registryCoordinator", address(machServiceContract.registryCoordinator));
vm.serializeAddress(
output, "registryCoordinatorImpl", address(machServiceContract.registryCoordinatorImplementation)
);
vm.serializeAddress(output, "indexRegistry", address(machServiceContract.indexRegistry));
vm.serializeAddress(output, "indexRegistryImpl", address(machServiceContract.indexRegistryImplementation));
vm.serializeAddress(output, "stakeRegistry", address(machServiceContract.stakeRegistry));
vm.serializeAddress(output, "stakeRegistryImpl", address(machServiceContract.stakeRegistryImplementation));
vm.serializeAddress(output, "apkRegistry", address(machServiceContract.apkRegistry));
vm.serializeAddress(output, "apkRegistryImpl", address(machServiceContract.apkRegistryImplementation));
vm.serializeAddress(output, "pauserRegistry", address(pauserRegistry));
vm.serializeAddress(output, "machAVSProxyAdmin", address(machAVSProxyAdmin));
vm.serializeAddress(output, "emptyContract", address(emptyContract));
vm.serializeAddress(output, "operatorStateRetriever", address(machServiceContract.operatorStateRetriever));
string memory finalJson = vm.serializeString(output, "object", output);
vm.createDir("./script/output", true);
vm.writeJson(finalJson, deployedMachPath);
}
}
7 changes: 6 additions & 1 deletion contracts/script/MachServiceManagerImplDeployer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,22 @@ import {IStakeRegistry} from "eigenlayer-middleware/interfaces/IStakeRegistry.so
import {IRegistryCoordinator} from "eigenlayer-middleware/interfaces/IRegistryCoordinator.sol";
import {IPauserRegistry} from "eigenlayer-core/contracts/interfaces/IPauserRegistry.sol";
import {IAVSDirectory} from "eigenlayer-core/contracts/interfaces/IAVSDirectory.sol";
import {IRewardsCoordinator} from "eigenlayer-core/contracts/interfaces/IRewardsCoordinator.sol";

contract MachServiceManagerImplDeployer is Script {
function run() external {
address avsDirectory = vm.envAddress("AVS_DIRECTORY");
address registryCoordinator = vm.envAddress("REGISTRY_COORDINATOR");
address stakeRegistry = vm.envAddress("STAKE_REGISTRY");
address rewardsCoordinator = vm.envAddress("REWARDS_COORDINATOR");

vm.startBroadcast();
// 1. deploy new implementation contract
new MachServiceManager(
IAVSDirectory(avsDirectory), IRegistryCoordinator(registryCoordinator), IStakeRegistry(stakeRegistry)
IAVSDirectory(avsDirectory),
IRewardsCoordinator(rewardsCoordinator),
IRegistryCoordinator(registryCoordinator),
IStakeRegistry(stakeRegistry)
);
vm.stopBroadcast();
}
Expand Down
8 changes: 6 additions & 2 deletions contracts/src/core/MachOptimismZkServiceManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {IBLSApkRegistry} from "eigenlayer-middleware/interfaces/IRegistryCoordin
import {MachOptimismZkServiceManagerStorage} from "./MachOptimismZkServiceManagerStorage.sol";
import {IMachOptimism, CallbackAuthorization, IRiscZeroVerifier} from "../interfaces/IMachOptimism.sol";
import {IMachOptimismL2OutputOracle} from "../interfaces/IMachOptimismL2OutputOracle.sol";
import {IRewardsCoordinator} from "eigenlayer-core/contracts/interfaces/IRewardsCoordinator.sol";
import "../error/Errors.sol";

contract MachOptimismZkServiceManager is
Expand All @@ -35,12 +36,15 @@ contract MachOptimismZkServiceManager is
constructor(
uint256 rollupChainID_,
IAVSDirectory __avsDirectory,
IRewardsCoordinator __rewardsCoordinator,
IRegistryCoordinator __registryCoordinator,
IStakeRegistry __stakeRegistry
)
ServiceManagerBase(__avsDirectory, __registryCoordinator, __stakeRegistry)
ServiceManagerBase(__avsDirectory, __rewardsCoordinator, __registryCoordinator, __stakeRegistry)
MachOptimismZkServiceManagerStorage(block.chainid, rollupChainID_)
{}
{
_disableInitializers();
}

modifier onlyValidOperator() {
if (!_operators.contains(msg.sender)) {
Expand Down
17 changes: 10 additions & 7 deletions contracts/src/core/MachServiceManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ pragma solidity =0.8.12;

import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import {Pausable} from "eigenlayer-core/contracts/permissions/Pausable.sol";
import {IRewardsCoordinator} from "eigenlayer-core/contracts/interfaces/IRewardsCoordinator.sol";
import {IAVSDirectory} from "eigenlayer-core/contracts/interfaces/IAVSDirectory.sol";
import {ISignatureUtils} from "eigenlayer-core/contracts/interfaces/ISignatureUtils.sol";
import {IPauserRegistry} from "eigenlayer-core/contracts/interfaces/IPauserRegistry.sol";
import {IServiceManager} from "eigenlayer-middleware/interfaces/IServiceManager.sol";
import {IServiceManager, IServiceManagerUI} from "eigenlayer-middleware/interfaces/IServiceManager.sol";
import {IStakeRegistry} from "eigenlayer-middleware/interfaces/IStakeRegistry.sol";
import {IRegistryCoordinator} from "eigenlayer-middleware/interfaces/IRegistryCoordinator.sol";
import {BLSSignatureChecker} from "eigenlayer-middleware/BLSSignatureChecker.sol";
Expand Down Expand Up @@ -90,11 +91,12 @@ contract MachServiceManager is

constructor(
IAVSDirectory __avsDirectory,
IRewardsCoordinator __rewardsCoordinator,
IRegistryCoordinator __registryCoordinator,
IStakeRegistry __stakeRegistry
)
BLSSignatureChecker(__registryCoordinator)
ServiceManagerBase(__avsDirectory, __registryCoordinator, __stakeRegistry)
ServiceManagerBase(__avsDirectory, __rewardsCoordinator, __registryCoordinator, __stakeRegistry)
{
_disableInitializers();
}
Expand All @@ -103,12 +105,13 @@ contract MachServiceManager is
IPauserRegistry pauserRegistry_,
uint256 initialPausedStatus_,
address initialOwner_,
address rewardsInitiator_,
address alertConfirmer_,
address whitelister_,
uint256[] calldata rollupChainIDs_
) public initializer {
_initializePauser(pauserRegistry_, initialPausedStatus_);
__ServiceManagerBase_init(initialOwner_);
__ServiceManagerBase_init(initialOwner_, rewardsInitiator_);
_setAlertConfirmer(alertConfirmer_);
_setWhitelister(whitelister_);

Expand Down Expand Up @@ -235,12 +238,12 @@ contract MachServiceManager is
//////////////////////////////////////////////////////////////////////////////

/**
* @inheritdoc IServiceManager
* @inheritdoc IServiceManagerUI
*/
function registerOperatorToAVS(
address operator,
ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature
) public override(ServiceManagerBase, IServiceManager) whenNotPaused onlyRegistryCoordinator {
) public override(ServiceManagerBase, IServiceManagerUI) whenNotPaused onlyRegistryCoordinator {
if (allowlistEnabled && !allowlist[operator]) {
revert NotAdded();
}
Expand All @@ -254,11 +257,11 @@ contract MachServiceManager is
}

/**
* @inheritdoc IServiceManager
* @inheritdoc IServiceManagerUI
*/
function deregisterOperatorFromAVS(address operator)
public
override(ServiceManagerBase, IServiceManager)
override(ServiceManagerBase, IServiceManagerUI)
whenNotPaused
onlyRegistryCoordinator
{
Expand Down
11 changes: 9 additions & 2 deletions contracts/test/AVSDeployer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {IIndexRegistry} from "eigenlayer-middleware/interfaces/IIndexRegistry.so
import {IRegistryCoordinator} from "eigenlayer-middleware/interfaces/IRegistryCoordinator.sol";
import {IServiceManager} from "eigenlayer-middleware/interfaces/IServiceManager.sol";

import {RewardsCoordinatorMock} from "eigenlayer-middleware-test/mocks/RewardsCoordinatorMock.sol";
import {StrategyManagerMock} from "eigenlayer-contracts/src/test/mocks/StrategyManagerMock.sol";
import {EigenPodManagerMock} from "eigenlayer-contracts/src/test/mocks/EigenPodManagerMock.sol";
import {AVSDirectoryMock} from "eigenlayer-middleware-test/mocks/AVSDirectoryMock.sol";
Expand Down Expand Up @@ -66,6 +67,7 @@ contract AVSDeployer is Test {
IIndexRegistry public indexRegistry;
MachServiceManager public serviceManager;

RewardsCoordinatorMock public rewardsCoordinatorMock;
StrategyManagerMock public strategyManagerMock;
DelegationMock public delegationMock;
EigenPodManagerMock public eigenPodManagerMock;
Expand Down Expand Up @@ -137,6 +139,7 @@ contract AVSDeployer is Test {
pausers[0] = pauser;
pauserRegistry = new PauserRegistry(pausers, unpauser);

rewardsCoordinatorMock = new RewardsCoordinatorMock();
delegationMock = new DelegationMock();
avsDirectoryMock = new AVSDirectoryMock();
eigenPodManagerMock = new EigenPodManagerMock();
Expand Down Expand Up @@ -265,7 +268,9 @@ contract AVSDeployer is Test {

operatorStateRetriever = new OperatorStateRetriever();

serviceManagerImplementation = new MachServiceManager(avsDirectoryMock, registryCoordinator, stakeRegistry);
serviceManagerImplementation = new MachServiceManager(
avsDirectoryMock, IRewardsCoordinator(address(rewardsCoordinatorMock)), registryCoordinator, stakeRegistry
);

proxyAdmin.upgrade(
TransparentUpgradeableProxy(payable(address(serviceManager))), address(serviceManagerImplementation)
Expand All @@ -274,7 +279,9 @@ contract AVSDeployer is Test {
uint256[] memory ids = new uint256[](2);
ids[0] = 1;
ids[1] = 2;
serviceManager.initialize(pauserRegistry, 0, proxyAdminOwner, proxyAdminOwner, proxyAdminOwner, ids);
serviceManager.initialize(
pauserRegistry, 0, proxyAdminOwner, proxyAdminOwner, proxyAdminOwner, proxyAdminOwner, ids
);

cheats.stopPrank();
}
Expand Down
5 changes: 3 additions & 2 deletions contracts/test/MachServiceManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,11 @@ contract MachServiceManagerTest is BLSAVSDeployer {
}

function test_Init_RevertIfImpleBeingInitialized() public {
MachServiceManager impl = new MachServiceManager(avsDirectoryMock, registryCoordinator, stakeRegistry);
MachServiceManager impl =
new MachServiceManager(avsDirectoryMock, rewardsCoordinatorMock, registryCoordinator, stakeRegistry);
uint256[] memory ids = new uint256[](0);
vm.expectRevert("Initializable: contract is already initialized");
impl.initialize(pauserRegistry, 0, proxyAdminOwner, proxyAdminOwner, proxyAdminOwner, ids);
impl.initialize(pauserRegistry, 0, proxyAdminOwner, proxyAdminOwner, proxyAdminOwner, proxyAdminOwner, ids);
}

function test_SetConfirmer() public {
Expand Down

0 comments on commit adc3b62

Please sign in to comment.