Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions e2e/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ func TestIntegrationBlsAgg(t *testing.T) {
OperatorStateRetrieverAddr: contractAddrs.OperatorStateRetriever.String(),
AvsName: "avs",
PromMetricsIpPortAddress: "localhost:9090",
ServiceManagerAddress: contractAddrs.ServiceManager.String(),
}, ecdsaPrivKey, logger)
require.NoError(t, err)
avsWriter := avsClients.AvsRegistryChainWriter
Expand Down
2 changes: 1 addition & 1 deletion example/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ This will register your operator with the AVS and EigenLayer.

Run the operator first.
```
./start-nodes.sh --rpc-url $ETH_RPC_URL
./start_nodes.sh --rpc-url $ETH_RPC_URL
```

In a seperate terminal, run the aggregator.
Expand Down
2 changes: 1 addition & 1 deletion example/contracts/lib/eigenlayer-middleware
149 changes: 97 additions & 52 deletions example/contracts/script/DeployAVS.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,25 @@ import {EmptyContract} from "eigenlayer-core/test/mocks/EmptyContract.sol";
import {IDelegationManager} from "eigenlayer-core/contracts/interfaces/IDelegationManager.sol";
import {IAVSDirectory} from "eigenlayer-core/contracts/interfaces/IAVSDirectory.sol";
import {IRewardsCoordinator} from "eigenlayer-core/contracts/interfaces/IRewardsCoordinator.sol";
import {IAllocationManager} from "eigenlayer-core/contracts/interfaces/IAllocationManager.sol";
import {IAVSRegistrar} from "eigenlayer-core/contracts/interfaces/IAVSRegistrar.sol";
import {IPermissionController} from "eigenlayer-core/contracts/interfaces/IPermissionController.sol";


import {BLSApkRegistry} from "eigenlayer-middleware/BLSApkRegistry.sol";
import {RegistryCoordinator} from "eigenlayer-middleware/RegistryCoordinator.sol";
import {SlashingRegistryCoordinator} from "eigenlayer-middleware/SlashingRegistryCoordinator.sol";
import {OperatorStateRetriever} from "eigenlayer-middleware/OperatorStateRetriever.sol";
import {IRegistryCoordinator} from "eigenlayer-middleware/interfaces/IRegistryCoordinator.sol";
import {IndexRegistry} from "eigenlayer-middleware/IndexRegistry.sol";
import {IIndexRegistry} from "eigenlayer-middleware/interfaces/IIndexRegistry.sol";
import {StakeRegistry, IStrategy} from "eigenlayer-middleware/StakeRegistry.sol";
import {IStakeRegistry} from "eigenlayer-middleware/interfaces/IStakeRegistry.sol";
import {IStakeRegistry, IStakeRegistryTypes} from "eigenlayer-middleware/interfaces/IStakeRegistry.sol";
import {IServiceManager} from "eigenlayer-middleware/interfaces/IServiceManager.sol";
import {IBLSApkRegistry} from "eigenlayer-middleware/interfaces/IBLSApkRegistry.sol";
import {ServiceManagerBase} from "eigenlayer-middleware/ServiceManagerBase.sol";
import {ISocketRegistry, SocketRegistry} from "eigenlayer-middleware/SocketRegistry.sol";
import {IPauserRegistry} from "eigenlayer-core/contracts/interfaces/IPauserRegistry.sol";
import {ISlashingRegistryCoordinator, ISlashingRegistryCoordinatorTypes} from "eigenlayer-middleware/interfaces/ISlashingRegistryCoordinator.sol";

import {MinimalServiceManager} from "../src/MinimalServiceManager.sol";
import {MinimalCertificateVerifier} from "../src/MinimalCertificateVerifier.sol";
Expand All @@ -31,17 +36,19 @@ import "forge-std/Test.sol";
import "forge-std/Script.sol";
import "forge-std/StdJson.sol";


contract DeployAVS is Script, Test {
// Core contracts
ProxyAdmin public avsProxyAdmin;
PauserRegistry public avsPauserReg;
EmptyContract public emptyContract;


// Middleware contracts
BLSApkRegistry public apkRegistry;
IServiceManager public serviceManager;
MinimalCertificateVerifier public certificateVerifier;
RegistryCoordinator public registryCoordinator;
SlashingRegistryCoordinator public slashingRegistryCoordinator;
IIndexRegistry public indexRegistry;
IStakeRegistry public stakeRegistry;
ISocketRegistry public socketRegistry;
Expand All @@ -51,16 +58,17 @@ contract DeployAVS is Script, Test {
BLSApkRegistry public apkRegistryImplementation;
IServiceManager public serviceManagerImplementation;
MinimalCertificateVerifier public certificateVerifierImplementation;
IRegistryCoordinator public registryCoordinatorImplementation;
ISlashingRegistryCoordinator public slashingRegistryCoordinatorImplementation;
IIndexRegistry public indexRegistryImplementation;
IStakeRegistry public stakeRegistryImplementation;
ISocketRegistry public socketRegistryImplementation;

struct EigenlayerDeployment {
address avsDirectory;
address allocationManager;
address delegationManager;
address permissionsController;
address permissionController;
address rewardsCoordinator;
address avsDirectory;
}

function run(
Expand All @@ -70,12 +78,20 @@ contract DeployAVS is Script, Test {
) external {
// read the json file
string memory inputConfig = vm.readFile(inputConfigPath);
bytes memory data = vm.parseJson(inputConfig);
EigenlayerDeployment memory eigenlayerDeployment = abi.decode(data, (EigenlayerDeployment));
EigenlayerDeployment memory eigenlayerDeployment = EigenlayerDeployment({
allocationManager: stdJson.readAddress(inputConfig, ".allocationManager"),
delegationManager: stdJson.readAddress(inputConfig, ".delegationManager"),
permissionController: stdJson.readAddress(inputConfig, ".permissionController"),
rewardsCoordinator: stdJson.readAddress(inputConfig, ".rewardsCoordinator"),
avsDirectory: stdJson.readAddress(inputConfig, ".avsDirectory")
});


emit log_named_address("allocation manager", eigenlayerDeployment.allocationManager);
emit log_named_address("delegation manager", eigenlayerDeployment.delegationManager);
emit log_named_address("avs directory", eigenlayerDeployment.avsDirectory);
emit log_named_address("permission controller", eigenlayerDeployment.permissionController);
emit log_named_address("rewards coordinator", eigenlayerDeployment.rewardsCoordinator);
emit log_named_address("avs directory", eigenlayerDeployment.avsDirectory);

// only a lower bound for the deployment block number
uint256 deploymentBlock = block.number;
Expand All @@ -101,7 +117,7 @@ contract DeployAVS is Script, Test {
address(new TransparentUpgradeableProxy(address(emptyContract), address(avsProxyAdmin), ""))
);

registryCoordinator = RegistryCoordinator(
slashingRegistryCoordinator = SlashingRegistryCoordinator(
address(new TransparentUpgradeableProxy(address(emptyContract), address(avsProxyAdmin), ""))
);

Expand All @@ -123,7 +139,7 @@ contract DeployAVS is Script, Test {

// Deploy implementations and upgrade proxies
indexRegistryImplementation = new IndexRegistry(
registryCoordinator
slashingRegistryCoordinator
);

avsProxyAdmin.upgrade(
Expand All @@ -132,8 +148,10 @@ contract DeployAVS is Script, Test {
);

stakeRegistryImplementation = new StakeRegistry(
registryCoordinator,
IDelegationManager(eigenlayerDeployment.delegationManager)
slashingRegistryCoordinator,
IDelegationManager(eigenlayerDeployment.delegationManager),
IAVSDirectory(eigenlayerDeployment.avsDirectory),
IAllocationManager(address(0))
);

avsProxyAdmin.upgrade(
Expand All @@ -142,33 +160,54 @@ contract DeployAVS is Script, Test {
);

apkRegistryImplementation = new BLSApkRegistry(
registryCoordinator
slashingRegistryCoordinator
);

avsProxyAdmin.upgrade(
ITransparentUpgradeableProxy(payable(address(apkRegistry))),
address(apkRegistryImplementation)
);

socketRegistryImplementation = new SocketRegistry(registryCoordinator);
socketRegistryImplementation = new SocketRegistry(slashingRegistryCoordinator);

avsProxyAdmin.upgrade(
ITransparentUpgradeableProxy(payable(address(socketRegistry))),
address(socketRegistryImplementation)
);

registryCoordinatorImplementation = new RegistryCoordinator(
IServiceManager(address(serviceManager)),
serviceManagerImplementation = new MinimalServiceManager(
IAVSDirectory(eigenlayerDeployment.avsDirectory),
IRewardsCoordinator(eigenlayerDeployment.rewardsCoordinator),
slashingRegistryCoordinator,
stakeRegistry,
IPermissionController(address(eigenlayerDeployment.permissionController)),
IAllocationManager(eigenlayerDeployment.allocationManager)
);

// Initialize ServiceManagerBase
avsProxyAdmin.upgradeAndCall(
ITransparentUpgradeableProxy(payable(address(serviceManager))),
address(serviceManagerImplementation),
abi.encodeWithSelector(
MinimalServiceManager.initialize.selector,
msg.sender,
msg.sender
)
);

slashingRegistryCoordinatorImplementation = new SlashingRegistryCoordinator(
stakeRegistry,
apkRegistry,
indexRegistry,
socketRegistry
socketRegistry,
IAllocationManager(eigenlayerDeployment.allocationManager),
avsPauserReg
);

{
IRegistryCoordinator.OperatorSetParam[] memory operatorSetParams = new IRegistryCoordinator.OperatorSetParam[](strategies.length);
ISlashingRegistryCoordinatorTypes.OperatorSetParam[] memory operatorSetParams = new ISlashingRegistryCoordinatorTypes.OperatorSetParam[](strategies.length);
for (uint i = 0; i < strategies.length; i++) {
operatorSetParams[i] = IRegistryCoordinator.OperatorSetParam({
operatorSetParams[i] = ISlashingRegistryCoordinatorTypes.OperatorSetParam({
maxOperatorCount: uint32(maxOperatorCount),
kickBIPsOfOperatorStake: 11000,
kickBIPsOfTotalStake: 1001
Expand All @@ -179,52 +218,58 @@ contract DeployAVS is Script, Test {
for (uint i = 0; i < strategies.length; i++) {
minimumStakeForQuourm[i] = 1;
}
IStakeRegistry.StrategyParams[][] memory strategyAndWeightingMultipliers = new IStakeRegistry.StrategyParams[][](strategies.length);
IStakeRegistryTypes.StrategyParams[][] memory strategyAndWeightingMultipliers = new IStakeRegistryTypes.StrategyParams[][](strategies.length);
for (uint i = 0; i < strategies.length; i++) {
strategyAndWeightingMultipliers[i] = new IStakeRegistry.StrategyParams[](1);
strategyAndWeightingMultipliers[i][0] = IStakeRegistry.StrategyParams({
strategyAndWeightingMultipliers[i] = new IStakeRegistryTypes.StrategyParams[](1);
strategyAndWeightingMultipliers[i][0] = IStakeRegistryTypes.StrategyParams({
strategy: strategies[i],
multiplier: 1 ether
});
}

avsProxyAdmin.upgradeAndCall(
ITransparentUpgradeableProxy(payable(address(registryCoordinator))),
address(registryCoordinatorImplementation),
ITransparentUpgradeableProxy(payable(address(slashingRegistryCoordinator))),
address(slashingRegistryCoordinatorImplementation),
abi.encodeWithSelector(
RegistryCoordinator.initialize.selector,
msg.sender,
msg.sender,
msg.sender,
IPauserRegistry(address(avsPauserReg)),
SlashingRegistryCoordinator.initialize.selector,
msg.sender, // initial owner
msg.sender, // churn approver
msg.sender, // ejector
0, // initial paused status
operatorSetParams,
minimumStakeForQuourm,
strategyAndWeightingMultipliers
address(serviceManager) // accountIdentifier
)
);
}

serviceManagerImplementation = new MinimalServiceManager(
IAVSDirectory(eigenlayerDeployment.avsDirectory),
IRewardsCoordinator(eigenlayerDeployment.rewardsCoordinator),
IRegistryCoordinator(address(registryCoordinator)),
IStakeRegistry(address(stakeRegistry))
);

// Initialize ServiceManagerBase
avsProxyAdmin.upgradeAndCall(
ITransparentUpgradeableProxy(payable(address(serviceManager))),
address(serviceManagerImplementation),
abi.encodeWithSelector(
MinimalServiceManager.initialize.selector,
// set AVS Registrar on AllocationManager to SlashingRegistryCoordinator
serviceManager.setAppointee(
msg.sender,
msg.sender
)
);
eigenlayerDeployment.allocationManager,
IAllocationManager(eigenlayerDeployment.allocationManager).setAVSRegistrar.selector
);

IAllocationManager(eigenlayerDeployment.allocationManager).setAVSRegistrar(
address(serviceManager),
IAVSRegistrar(slashingRegistryCoordinator)
);

// give slashingregistrycoordindator permission to createTotalDelegatedStakeQuorum
serviceManager.setAppointee(
address(slashingRegistryCoordinator),
eigenlayerDeployment.allocationManager,
IAllocationManager(eigenlayerDeployment.allocationManager).createOperatorSets.selector
);

for (uint i = 0; i < strategies.length; i++) {
slashingRegistryCoordinator.createTotalDelegatedStakeQuorum(
operatorSetParams[i],
minimumStakeForQuourm[i],
strategyAndWeightingMultipliers[i]
);
}
}

certificateVerifierImplementation = new MinimalCertificateVerifier(
registryCoordinator
slashingRegistryCoordinator
);

avsProxyAdmin.upgrade(
Expand All @@ -239,7 +284,7 @@ contract DeployAVS is Script, Test {
string memory output = "deployment";
vm.serializeAddress(output, "serviceManager", address(serviceManager));
vm.serializeAddress(output, "certificateVerifier", address(certificateVerifier));
vm.serializeAddress(output, "registryCoordinator", address(registryCoordinator));
vm.serializeAddress(output, "slashingRegistryCoordinator", address(slashingRegistryCoordinator));
vm.serializeAddress(output, "indexRegistry", address(indexRegistry));
vm.serializeAddress(output, "stakeRegistry", address(stakeRegistry));
vm.serializeAddress(output, "apkRegistry", address(apkRegistry));
Expand Down
7 changes: 4 additions & 3 deletions example/contracts/script/input/testnet.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"strategyManager": "0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6",
"allocationManager": "0x78469728304326CBc65f8f95FA756B0B73164462",
"delegationManager": "0xA44151489861Fe9e3055d95adC98FbD462B948e7",
"avsDirectory": "0x055733000064333CaDDbC92763c58BF0192fFeBf",
"permissionController": "0x598cb226B591155F767dA17AfE7A2241a68C5C10",
"rewardsCoordinator": "0xAcc1fb458a1317E886dB376Fc8141540537E68fE",
"permissionsController": "0x598cb226B591155F767dA17AfE7A2241a68C5C10"
"avsDirectory": "0x055733000064333CaDDbC92763c58BF0192fFeBf",
"strategyManager": "0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6"
}
22 changes: 11 additions & 11 deletions example/contracts/script/output/avs_deploy_output.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"apkRegistry": "0x4CF2160928A4a353Cf0212EF953ee2Dc3d9F7e0B",
"avsPauserReg": "0xd9E7CEf66490Ce34EBE71d66036079e7A85790AE",
"avsProxyAdmin": "0x80Ee00FAE33ff8a16D7E094E11ff597f651ECF94",
"certificateVerifier": "0x035f01335d77c5c13cd477F5AD6518d3c50E4e68",
"deploymentBlock": 3199379,
"indexRegistry": "0x86650A65876E1e01b3EB39519f1EA5a517475B05",
"apkRegistry": "0x2233b18fb577f4767797571831D4693a67386B76",
"avsPauserReg": "0x0bB05Fd1687B1E56AEcdD37A27b8974564b22a36",
"avsProxyAdmin": "0xD8906Ed56832C5B7e61512Ed0e8c6794d8701f29",
"certificateVerifier": "0x623F9C932A188a6A006342013e947dd18f844397",
"deploymentBlock": 3299059,
"indexRegistry": "0x889Ed72836573259cb87DA19a63D65Ed1F0dCd33",
"object": "deployment",
"operatorStateRetriever": "0x9aEBe2bd3384D30704b906a2728218242F3d39c0",
"registryCoordinator": "0xB8b2B243DDc1C66e9cE85f3bC76759a250b6c32A",
"serviceManager": "0x626F36f2dA0EF56d444cfa972e8E17305d814Aa1",
"socketRegistry": "0x45a1688085a6E00044B6B13Ccb0Cffe5957394aB",
"stakeRegistry": "0xC1F5ca8E62ed7c9EF6cE872888CE4ac92F20f30B"
"operatorStateRetriever": "0x2760Ec0E2b723156f7a33cfB54ae3096cfBc2ECF",
"serviceManager": "0x7e148Bb691b41279c7ade56Dd84D652e4df3dc30",
"slashingRegistryCoordinator": "0xCb0dd2ce1876B61ac9A7A99d3c1D18ac68f85a27",
"socketRegistry": "0x9b619837Bd2E2DeCa07A66D488f1CcEB087a573C",
"stakeRegistry": "0x94D759bE3cE57Ee1A097EEf2aDD986331eD01450"
}
6 changes: 3 additions & 3 deletions example/contracts/src/MinimalCertificateVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity ^0.8.12;

import {BLSSignatureChecker} from "eigenlayer-middleware/BLSSignatureChecker.sol";
import {IRegistryCoordinator} from "eigenlayer-middleware/interfaces/IRegistryCoordinator.sol";
import {ISlashingRegistryCoordinator} from "eigenlayer-middleware/interfaces/ISlashingRegistryCoordinator.sol";

contract MinimalCertificateVerifier is BLSSignatureChecker {

Expand All @@ -21,9 +21,9 @@ contract MinimalCertificateVerifier is BLSSignatureChecker {
mapping(bytes32 => VerificationRecord) public verificationRecords;

constructor(
IRegistryCoordinator __registryCoordinator
ISlashingRegistryCoordinator __slashingRegistryCoordinator
)
BLSSignatureChecker(__registryCoordinator)
BLSSignatureChecker(__slashingRegistryCoordinator)
{ }

function verifyCertificate(
Expand Down
16 changes: 11 additions & 5 deletions example/contracts/src/MinimalServiceManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,27 @@
pragma solidity ^0.8.12;

import {ServiceManagerBase, IAVSDirectory, IRewardsCoordinator, IServiceManager} from "eigenlayer-middleware/ServiceManagerBase.sol";
import {IRegistryCoordinator} from "eigenlayer-middleware/interfaces/IRegistryCoordinator.sol";
import {ISlashingRegistryCoordinator} from "eigenlayer-middleware/interfaces/ISlashingRegistryCoordinator.sol";
import {IStakeRegistry} from "eigenlayer-middleware/interfaces/IStakeRegistry.sol";
import {IPermissionController} from "eigenlayer-core/contracts/interfaces/IPermissionController.sol";
import {IAllocationManager} from "eigenlayer-core/contracts/interfaces/IAllocationManager.sol";

contract MinimalServiceManager is ServiceManagerBase {
constructor(
IAVSDirectory __avsDirectory,
IRewardsCoordinator __rewardsCoordinator,
IRegistryCoordinator __registryCoordinator,
IStakeRegistry __stakeRegistry
ISlashingRegistryCoordinator __slashingRegistryCoordinator,
IStakeRegistry __stakeRegistry,
IPermissionController __permissionController,
IAllocationManager __allocationManager
)
ServiceManagerBase(
__avsDirectory,
__rewardsCoordinator,
__registryCoordinator,
__stakeRegistry
__slashingRegistryCoordinator,
__stakeRegistry,
__permissionController,
__allocationManager
)
{ }

Expand Down
Loading