mirror of
https://github.com/datahaven-xyz/datahaven
synced 2026-05-24 09:50:01 +00:00
This PR adds the `setup-validators` Typescript script that, given an already started up network, sets up a new validator set and sends it through Snowbridge's Gateway to the solochain. To accomplish that purpose, this PR: - Modifies the `DeployLocal` script to save in the `anvil.json` file not only the deployed strategies' addresses but also the owner of each strategy's underlying token. This owner is used as the source of funds to transfer tokens to other validators so they can register under that strategy. - Adds an `OPERATOR_SOLOCHAIN_ADDRESS` to the `Accounts` utility script contract. This address is the one used as the Solochain address when registering a new Operator. - Updates the `SignUpOperator` (which I believe is now deprecated since we have multiple Operator Sets) and `SignUpOperatorBase` scripts to adapt to both aforementioned changes. - Updates the `ELScriptStorage` script to save the new extra information of each deployed strategy (the creator of the underlying token) in storage. - Adds a `validator-set.json` file which contains the validators that should be registered in the AVS and sent to the Solochain network through the Snowbridge Gateway when starting any integration test. This is currently hardcoded but could be generated in any other way, giving us flexibility for testing. - Adds both a Markdown file and a Excalidraw diagram showcasing both how the setup of integration tests work and possible integration tests that will be added in a future PR. This list is not exahustive as there are many more scenarios we will want to test using integration tests. - Updates the `e2e-cli.ts` script to execute the validator setup when bootstrapping the network used for integration testing. --------- Co-authored-by: Facundo Farall <37149322+ffarall@users.noreply.github.com>
93 lines
4.3 KiB
Solidity
93 lines
4.3 KiB
Solidity
// SPDX-License-Identifier: UNLICENSED
|
|
pragma solidity ^0.8.27;
|
|
|
|
// Testing imports
|
|
import {Script} from "forge-std/Script.sol";
|
|
|
|
// EigenLayer imports
|
|
import {RewardsCoordinator} from "eigenlayer-contracts/src/contracts/core/RewardsCoordinator.sol";
|
|
import {PermissionController} from
|
|
"eigenlayer-contracts/src/contracts/permissions/PermissionController.sol";
|
|
import {AllocationManager} from "eigenlayer-contracts/src/contracts/core/AllocationManager.sol";
|
|
import {DelegationManager} from "eigenlayer-contracts/src/contracts/core/DelegationManager.sol";
|
|
import {StrategyManager} from "eigenlayer-contracts/src/contracts/core/StrategyManager.sol";
|
|
import {AVSDirectory} from "eigenlayer-contracts/src/contracts/core/AVSDirectory.sol";
|
|
import {EigenPodManager} from "eigenlayer-contracts/src/contracts/pods/EigenPodManager.sol";
|
|
import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
|
|
import {EigenPod} from "eigenlayer-contracts/src/contracts/pods/EigenPod.sol";
|
|
import {StrategyBaseTVLLimits} from
|
|
"eigenlayer-contracts/src/contracts/strategies/StrategyBaseTVLLimits.sol";
|
|
import {IETHPOSDeposit} from "eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol";
|
|
|
|
// Struct used in the deployment JSON file to store detailed strategy information
|
|
struct DeployedStrategyJson {
|
|
address strategyAddress;
|
|
address strategyUnderlyingToken;
|
|
address strategyTokenCreator;
|
|
}
|
|
|
|
// Struct used here to store strategy information
|
|
struct DeployedStrategyInfo {
|
|
StrategyBaseTVLLimits strategy;
|
|
address strategyTokenCreator;
|
|
}
|
|
|
|
/**
|
|
* @title ELScriptStorage
|
|
* @notice This contract is a utility for scripts that need to interact with EigenLayer contracts.
|
|
*/
|
|
contract ELScriptStorage is Script {
|
|
// EigenLayer Contract declarations
|
|
RewardsCoordinator public rewardsCoordinator;
|
|
PermissionController public permissionController;
|
|
AllocationManager public allocationManager;
|
|
DelegationManager public delegation;
|
|
StrategyManager public strategyManager;
|
|
EigenPodManager public eigenPodManager;
|
|
EigenPod public eigenPodBeacon;
|
|
StrategyBaseTVLLimits public baseStrategy;
|
|
DeployedStrategyInfo[] public deployedStrategies;
|
|
IETHPOSDeposit public ethPOSDeposit;
|
|
|
|
// EigenLayer required semver
|
|
string public constant SEMVER = "v1.0.0";
|
|
|
|
/**
|
|
* @notice Loads the EigenLayer contracts from the deployment file.
|
|
*/
|
|
function _loadELContracts(
|
|
string memory network
|
|
) internal {
|
|
// Load the deployment file
|
|
string memory deploymentFile =
|
|
vm.readFile(string.concat("./deployments/", network, ".json"));
|
|
|
|
// Store the contract addresses
|
|
rewardsCoordinator =
|
|
RewardsCoordinator(vm.parseJsonAddress(deploymentFile, ".RewardsCoordinator"));
|
|
permissionController =
|
|
PermissionController(vm.parseJsonAddress(deploymentFile, ".PermissionController"));
|
|
allocationManager =
|
|
AllocationManager(vm.parseJsonAddress(deploymentFile, ".AllocationManager"));
|
|
delegation = DelegationManager(vm.parseJsonAddress(deploymentFile, ".DelegationManager"));
|
|
strategyManager = StrategyManager(vm.parseJsonAddress(deploymentFile, ".StrategyManager"));
|
|
eigenPodManager = EigenPodManager(vm.parseJsonAddress(deploymentFile, ".EigenPodManager"));
|
|
eigenPodBeacon = EigenPod(payable(vm.parseJsonAddress(deploymentFile, ".EigenPodBeacon")));
|
|
baseStrategy = StrategyBaseTVLLimits(
|
|
vm.parseJsonAddress(deploymentFile, ".BaseStrategyImplementation")
|
|
);
|
|
ethPOSDeposit = IETHPOSDeposit(vm.parseJsonAddress(deploymentFile, ".ETHPOSDeposit"));
|
|
bytes memory deployedStrategiesArrayData =
|
|
vm.parseJson(deploymentFile, ".DeployedStrategies");
|
|
DeployedStrategyJson[] memory strategies =
|
|
abi.decode(deployedStrategiesArrayData, (DeployedStrategyJson[]));
|
|
for (uint256 i = 0; i < strategies.length; i++) {
|
|
address strategyAddress = strategies[i].strategyAddress;
|
|
address strategyTokenCreator = strategies[i].strategyTokenCreator;
|
|
DeployedStrategyInfo memory strategyInfo;
|
|
strategyInfo.strategy = StrategyBaseTVLLimits(strategyAddress);
|
|
strategyInfo.strategyTokenCreator = strategyTokenCreator;
|
|
deployedStrategies.push(strategyInfo);
|
|
}
|
|
}
|
|
}
|