Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
213be65
chore: bump eigenlayer contracts to operator set branch
stevennevins Jun 26, 2024
e1673f0
fix: updates for operator sets
stevennevins Jun 26, 2024
e70c80e
feat: add proxied functions for registering/deregistering from operat…
stevennevins Jun 27, 2024
1d365fc
feat: add standbyParam setup and todos to update core dep
stevennevins Jun 27, 2024
be42620
chore: bump dependencies for operator set release
stevennevins Jul 1, 2024
2086967
feat: operator sets wire up ecdsa contract
stevennevins Jul 1, 2024
4520a8b
feat: operator sets wire up proxied calls
stevennevins Jul 1, 2024
6af0875
Merge branch 'dev' into feat/operatorsets-steven
stevennevins Jul 1, 2024
a18b7eb
feat: operator sets wire update new entry points
stevennevins Jul 1, 2024
0d4be9c
feat: update core and impelment changes in tests, mocks, and contracts
stevennevins Jul 11, 2024
a58f7be
feat: add base upgrade scripts
stevennevins Jul 11, 2024
2262e30
feat: upgrade upgrade script to get contract by name from compiler ou…
stevennevins Jul 11, 2024
15eb2c5
docs: add comments
stevennevins Jul 11, 2024
681e5d0
feat: abstract classes for upgrade
stevennevins Jul 11, 2024
aa3e8dd
feat: run upgrade and add checks
stevennevins Jul 11, 2024
031cf6b
refactor: scripts
stevennevins Jul 12, 2024
4114b91
chore: bump core dep
stevennevins Jul 12, 2024
e75a516
feat: hook up registry coordinator with new functions
stevennevins Jul 15, 2024
4d6748a
feat: wire up service manager functions
stevennevins Jul 15, 2024
4764531
chore: remove standByParams
stevennevins Jul 15, 2024
56f63ae
feat: update asserts with new mapping
stevennevins Jul 15, 2024
85ea19c
chore: vm.skip for now
stevennevins Jul 15, 2024
dca75cf
feat: parse quorums to operator set ids
stevennevins Jul 15, 2024
260b4c1
chore: remove legacy functions
stevennevins Jul 15, 2024
dcb6d3b
chore: update deps
stevennevins Jul 17, 2024
f3bc539
fix: import AVSDirectory for interface
stevennevins Jul 17, 2024
d2b6c11
feat: handle self deregistration on AVS Directory by checking in upda…
stevennevins Jul 17, 2024
99db597
feat: move getting of avs address and add TODO
stevennevins Jul 17, 2024
c7346f6
feat: mock out avs directory state
stevennevins Jul 18, 2024
58df1e8
feat: add migrate operators function
stevennevins Jul 18, 2024
30b7cc0
feat: add migration function
stevennevins Jul 18, 2024
f162040
feat: add migrate interface function
stevennevins Jul 22, 2024
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 foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ optimizer_runs = 200
via_ir = false
# Override the Solidity version (this overrides `auto_detect_solc`)
solc_version = '0.8.12'
gas_limit = "18446744073709551615"

[fmt]
bracket_spacing = false
Expand Down
2 changes: 1 addition & 1 deletion lib/eigenlayer-contracts
Submodule eigenlayer-contracts updated 52 files
+4 −1 .github/workflows/certora-prover.yml
+1 −1 .github/workflows/commitlint.yml
+85 −0 .github/workflows/coverage.yml
+30 −0 .github/workflows/format.yml
+5 −9 Dockerfile
+0 −1 Makefile
+23 −6 bin/install-deps.sh
+34 −0 certora/specs/core/DelegationManager.spec
+32 −3 docs/core/RewardsCoordinator.md
+325 −1,333 package-lock.json
+1 −1 package.json
+236 −1 pkg/bindings/IRewardsCoordinator/binding.go
+0 −3,639 pkg/bindings/PaymentCoordinator/binding.go
+266 −50 pkg/bindings/RewardsCoordinator/binding.go
+220 −35 pkg/bindings/RewardsCoordinatorStorage/binding.go
+276 −75 src/contracts/core/AVSDirectory.sol
+11 −9 src/contracts/core/AVSDirectoryStorage.sol
+131 −93 src/contracts/core/DelegationManager.sol
+5 −4 src/contracts/core/DelegationManagerStorage.sol
+90 −37 src/contracts/core/RewardsCoordinator.sol
+16 −10 src/contracts/core/RewardsCoordinatorStorage.sol
+7 −32 src/contracts/core/Slasher.sol
+17 −31 src/contracts/core/StrategyManager.sol
+126 −24 src/contracts/interfaces/IAVSDirectory.sol
+1 −3 src/contracts/interfaces/IBackingEigen.sol
+5 −2 src/contracts/interfaces/IDelayedWithdrawalRouter.sol
+1 −1 src/contracts/interfaces/IDelegationFaucet.sol
+7 −16 src/contracts/interfaces/IDelegationManager.sol
+1 −2 src/contracts/interfaces/IEigen.sol
+7 −15 src/contracts/interfaces/IEigenPod.sol
+4 −6 src/contracts/interfaces/IEigenPodManager.sol
+1 −2 src/contracts/interfaces/IPausable.sol
+1 −1 src/contracts/interfaces/IPauserRegistry.sol
+28 −13 src/contracts/interfaces/IRewardsCoordinator.sol
+1 −1 src/contracts/interfaces/ISignatureUtils.sol
+2 −7 src/contracts/interfaces/ISlasher.sol
+0 −1 src/contracts/interfaces/ISocketUpdater.sol
+1 −1 src/contracts/interfaces/IStrategyManager.sol
+28 −38 src/contracts/libraries/BeaconChainProofs.sol
+7 −21 src/contracts/libraries/BytesLib.sol
+8 −8 src/contracts/libraries/Endian.sol
+7 −14 src/contracts/libraries/Merkle.sol
+1 −2 src/contracts/permissions/Pausable.sol
+20 −25 src/contracts/pods/DelayedWithdrawalRouter.sol
+69 −80 src/contracts/pods/EigenPod.sol
+44 −31 src/contracts/pods/EigenPodManager.sol
+7 −7 src/contracts/strategies/EigenStrategy.sol
+10 −4 src/contracts/token/BackingEigen.sol
+23 −13 src/contracts/token/Eigen.sol
+1 −1 src/test/events/IAVSDirectoryEvents.sol
+413 −42 src/test/unit/AVSDirectoryUnit.t.sol
+86 −47 src/test/unit/RewardsCoordinatorUnit.t.sol
53 changes: 53 additions & 0 deletions script/upgrades/ECDSAServiceManagerUpgrade.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;

import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {MiddlewareBaseScript} from "./MiddlewareBaseScript.s.sol";
import {EigenUpgradesLib} from "./EigenUpgradesLib.sol";

/// Replace with your ECDSAServiceManagerBase
contract ECDSAServiceManagerBaseV2 {
constructor() {}
}

contract UpgradeECDSAServiceManager is MiddlewareBaseScript {
function setUp() public virtual override {
super.setUp();
string memory network = vm.envString("NETWORK");
string memory localDeploymentPath = EigenUpgradesLib
.getLocalDeploymentConfigPath(network);

// Load deployment data
string memory localDeployment = vm.readFile(localDeploymentPath);

// Parse deployment data
proxyAddress = vm.parseJsonAddress(
localDeployment,
".addresses.serviceManager"
);
}

function run() public {
newImplementation = deployNewImplementation();
upgradeContract();
address currentImplementation = EigenUpgradesLib
.getImplementationAddress(proxyAddress);
require(
currentImplementation == newImplementation,
"Upgrade failed: Implementation address mismatch"
);
}

function getProxyAddress(
string memory,
string memory
) internal view override returns (address) {
return proxyAddress;
}

function deployNewImplementation() internal returns (address) {
return deployNewImplementation("ECDSAServiceManagerBaseV2", "");
}
}
44 changes: 44 additions & 0 deletions script/upgrades/ECDSAStakeRegistryContractsUpgrade.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;

import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {MiddlewareBaseScript} from "./MiddlewareBaseScript.s.sol";
import {EigenUpgradesLib} from "./EigenUpgradesLib.sol";

contract ECDSAStakeRegistryBaseV2 {
constructor() {}
}

contract UpgradeECDSAStakeRegistry is MiddlewareBaseScript {
function setUp() public virtual override {
super.setUp();
string memory network = vm.envString("NETWORK");
string memory localDeploymentPath = EigenUpgradesLib
.getLocalDeploymentConfigPath(network);

string memory localDeployment = vm.readFile(localDeploymentPath);

proxyAddress = vm.parseJsonAddress(
localDeployment,
".addresses.stakeRegistry"
);
}

function run() public {
newImplementation = EigenUpgradesLib.deployNewImplementation(
"ECDSAStakeRegistryBaseV2",
""
);

upgradeContract();

address currentImplementation = EigenUpgradesLib
.getImplementationAddress(proxyAddress);
require(
currentImplementation == newImplementation,
"Upgrade failed: Implementation address mismatch"
);
}
}
94 changes: 94 additions & 0 deletions script/upgrades/EigenUpgradesLib.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;

import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {Vm} from "forge-std/Vm.sol";

library EigenUpgradesLib {
Vm internal constant vm =
Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
bytes32 internal constant ADMIN_SLOT =
0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;

bytes32 internal constant IMPLEMENTATION_SLOT =
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

function upgradeContract(
ProxyAdmin proxyAdmin,
address proxy,
address newImplementation
) internal {
address preUpgradeOwner = Ownable(proxy).owner();

require(
msg.sender == proxyAdmin.owner(),
"Caller is not the owner of the proxy admin"
);
proxyAdmin.upgrade({
proxy: TransparentUpgradeableProxy(payable(proxy)),
implementation: newImplementation
});

address postUpgradeOwner = Ownable(proxy).owner();

require(
preUpgradeOwner == postUpgradeOwner,
"Owner changed after upgrade"
);
}

function getAdminAddress(address proxy) internal view returns (address) {
bytes32 adminSlot = vm.load(proxy, ADMIN_SLOT);
return address(uint160(uint256(adminSlot)));
}

function getImplementationAddress(
address proxy
) internal view returns (address) {
bytes32 implSlot = vm.load(proxy, IMPLEMENTATION_SLOT);
return address(uint160(uint256(implSlot)));
}

function deployNewImplementation(
string memory contractName,
bytes memory constructorArgs
) internal returns (address) {
bytes memory bytecode = abi.encodePacked(
vm.getCode(contractName),
constructorArgs
);
address newImplementation;
assembly {
newImplementation := create(0, add(bytecode, 0x20), mload(bytecode))
}
require(
newImplementation != address(0),
"Deployment of new implementation failed"
);
return newImplementation;
}

function getEigenlayerCoreConfigPath(
string memory network
) internal pure returns (string memory) {
return
string(
abi.encodePacked(
"lib/eigenlayer-contracts/script/output/",
network,
"/deployment_output.json"
)
);
}

function getLocalDeploymentConfigPath(
string memory network
) internal pure returns (string memory) {
return
string(
abi.encodePacked("script/output/", network, "/deployment.json")
);
}
}
56 changes: 56 additions & 0 deletions script/upgrades/MiddlewareBaseScript.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;

import {Script} from "forge-std/Script.sol";
import {Test} from "forge-std/Test.sol";
import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import {EigenUpgradesLib} from "./EigenUpgradesLib.sol";

abstract contract MiddlewareBaseScript is Script, Test {
ProxyAdmin internal proxyAdmin;
address internal proxyAddress;
address internal newImplementation;

function setUp() public virtual {
string memory network = vm.envString("NETWORK");
string memory eigenlayerConfigPath = EigenUpgradesLib
.getEigenlayerCoreConfigPath(network);
string memory localConfigPath = EigenUpgradesLib
.getLocalDeploymentConfigPath(network);

string memory eigenlayerConfig = vm.readFile(eigenlayerConfigPath);
string memory localConfig = vm.readFile(localConfigPath);

proxyAddress = getProxyAddress(eigenlayerConfig, localConfig);
proxyAdmin = ProxyAdmin(EigenUpgradesLib.getAdminAddress(proxyAddress));

vm.label(msg.sender, "Caller");
vm.label(address(proxyAdmin), "Proxy Admin");
vm.label(proxyAdmin.owner(), "Proxy Admin Owner");
vm.label(proxyAddress, "Proxy Address");
}

function getProxyAddress(
string memory eigenlayerConfig,
string memory localConfig
) internal virtual returns (address) {}

function deployNewImplementation(
string memory contractName,
bytes memory constructorArgs
) internal virtual returns (address) {
return
EigenUpgradesLib.deployNewImplementation(
contractName,
constructorArgs
);
}

function upgradeContract() internal virtual {
EigenUpgradesLib.upgradeContract(
proxyAdmin,
proxyAddress,
newImplementation
);
}
}
136 changes: 136 additions & 0 deletions script/upgrades/RegistryContractsUpgrade.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;

import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol";
import {IRegistryCoordinator} from "../../src/interfaces/IRegistryCoordinator.sol";
import {IBLSApkRegistry} from "../../src/interfaces/IBLSApkRegistry.sol";
import {IIndexRegistry} from "../../src/interfaces/IIndexRegistry.sol";
import {IStakeRegistry} from "../../src/interfaces/IStakeRegistry.sol";

import {Script} from "forge-std/Script.sol";
import {Test} from "forge-std/Test.sol";

contract RegistryContractsUpgrade is Script, Test {
bytes32 internal constant ADMIN_SLOT =
0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;

bytes32 internal constant IMPLEMENTATION_SLOT =
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

ProxyAdmin internal proxyAdmin;
address internal registryCoordinatorProxy;
address internal blsApkRegistryProxy;
address internal indexRegistryProxy;
address internal stakeRegistryProxy;
address internal newImplementationV2;

string internal localDeploymentPath;
string internal coreDeploymentPath;

function run() public virtual {
string memory network = vm.envString("NETWORK");
coreDeploymentPath = string.concat(
"lib/eigenlayer-contracts/script/output/",
network,
"/deployment_output.json"
);

/// This is your local path, so you can import this script into your repo
localDeploymentPath = string.concat(
"script/output/",
network,
"/deployment.json"
);

// Load deployment data
string memory deploymentOutput = vm.readFile(coreDeploymentPath);
string memory localDeployment = vm.readFile(localDeploymentPath);

// Parse deployment data
registryCoordinatorProxy = vm.parseJsonAddress(
deploymentOutput,
".addresses.registryCoordinator"
);
blsApkRegistryProxy = vm.parseJsonAddress(
deploymentOutput,
".addresses.blsApkRegistry"
);
indexRegistryProxy = vm.parseJsonAddress(
deploymentOutput,
".addresses.indexRegistry"
);
stakeRegistryProxy = vm.parseJsonAddress(
deploymentOutput,
".addresses.stakeRegistry"
);

proxyAdmin = ProxyAdmin(getAdminAddress(registryCoordinatorProxy));
vm.label(msg.sender, "Caller");
vm.label(address(proxyAdmin), "Proxy Admin");
vm.label(proxyAdmin.owner(), "Proxy Admin Owner");

vm.startBroadcast();
newImplementationV2 = deployNewImplementation("YourContractV2", "");

_upgradeContract(registryCoordinatorProxy, newImplementationV2);
_upgradeContract(blsApkRegistryProxy, newImplementationV2);
_upgradeContract(indexRegistryProxy, newImplementationV2);
_upgradeContract(stakeRegistryProxy, newImplementationV2);

vm.stopBroadcast();
}

function _upgradeContract(
address proxy,
address newImplementation
) internal {
address preUpgradeOwner = Ownable(proxy).owner();

require(
msg.sender == proxyAdmin.owner(),
"Call with private key for owner of the proxy admin"
);
proxyAdmin.upgrade({
proxy: TransparentUpgradeableProxy(payable(proxy)),
implementation: newImplementation
});

address postUpgradeOwner = Ownable(proxy).owner();

assertEq(preUpgradeOwner, postUpgradeOwner, "Owner changed");
}

function getAdminAddress(address proxy) internal view returns (address) {
bytes32 adminSlot = vm.load(proxy, ADMIN_SLOT);
return address(uint160(uint256(adminSlot)));
}

function getImplementationAddress(
address proxy
) internal view returns (address) {
bytes32 implSlot = vm.load(proxy, IMPLEMENTATION_SLOT);
return address(uint160(uint256(implSlot)));
}

function deployNewImplementation(
string memory contractName,
bytes memory constructorArgs
) internal returns (address) {
bytes memory bytecode = abi.encodePacked(
vm.getCode(contractName),
constructorArgs
);
address newImplementation;
assembly {
newImplementation := create(0, add(bytecode, 0x20), mload(bytecode))
}
require(
newImplementation != address(0),
"Deployment of new implementation failed"
);
return newImplementation;
}
}
Loading