blueprint_eigenlayer_testing_utils/
env.rs

1use alloy_primitives::Uint;
2use alloy_primitives::{Address, address};
3use alloy_provider::Provider;
4use blueprint_chain_setup::anvil::get_receipt;
5use blueprint_core::info;
6use blueprint_evm_extra::util::get_provider_http;
7use blueprint_runner::eigenlayer::config::EigenlayerProtocolSettings;
8use eigensdk::utils::slashing::middleware::registrycoordinator::ISlashingRegistryCoordinatorTypes::OperatorSetParam;
9use eigensdk::utils::slashing::middleware::registrycoordinator::IStakeRegistryTypes::StrategyParams;
10use eigensdk::utils::slashing::middleware::registrycoordinator::RegistryCoordinator;
11use url::Url;
12
13// ================= Core Eigenlayer Deployment Addresses =================
14/// The default Allocation Manager address on our testnet
15pub const ALLOCATION_MANAGER_ADDR: Address = address!("8a791620dd6260079bf849dc5567adc3f2fdc318");
16/// The default AVS Directory address on our testnet
17pub const AVS_DIRECTORY_ADDR: Address = address!("5fc8d32690cc91d4c39d9d3abcbd16989f875707");
18/// The default Delegation address on our testnet
19pub const DELEGATION_MANAGER_ADDR: Address = address!("cf7ed3acca5a467e9e704c703e8d87f634fb0fc9");
20/// The default Strategy Manager address on our testnet
21pub const STRATEGY_MANAGER_ADDR: Address = address!("a513e6e4b8f2a923d98304ec87f64353c4d5c853");
22/// The default Strategy Factory address on our testnet
23pub const STRATEGY_FACTORY_ADDR: Address = address!("0b306bf915c4d645ff596e518faf3f9669b97016");
24/// The default Rewards Coordinator address on our testnet
25pub const REWARDS_COORDINATOR_ADDR: Address = address!("b7f8bc63bbcad18155201308c8f3540b07f84f5e");
26/// The default Pauser Registry address on our testnet
27pub const PAUSER_REGISTRY_ADDR: Address = address!("c6e7df5e7b4f2a278906862b61205850344d4e7d");
28/// The default Strategy Beacon address on our testnet
29pub const STRATEGY_BEACON_ADDR: Address = address!("c3e53f4d16ae77db1c982e75a937b9f60fe63690");
30/// The default Permission Controller address on our testnet
31pub const PERMISSION_CONTROLLER_ADDR: Address =
32    address!("3aa5ebb10dc797cac828524e59a333d0a371443c");
33/// The default Strategy address for our Squaring Example
34pub const STRATEGY_ADDR: Address = address!("524f04724632eed237cba3c37272e018b3a7967e");
35/// The default Token address for our Squaring Example
36pub const TOKEN_ADDR: Address = address!("4826533b4897376654bb4d4ad88b7fafd0c98528");
37/// The default Stake Registry address on our testnet (Differs when using ECDSA Base)
38pub const STAKE_REGISTRY_ADDR: Address = address!("4c5859f0f772848b2d91f1d83e2fe57935348029");
39
40// ================= Incredible Squaring Deployment Addresses =================
41/// The default Operator State Retriever address on our testnet
42pub const OPERATOR_STATE_RETRIEVER_ADDR: Address =
43    address!("b0d4afd8879ed9f52b28595d31b441d079b2ca07");
44/// The default Registry Coordinator address on our testnet
45pub const REGISTRY_COORDINATOR_ADDR: Address = address!("cd8a1c3ba11cf5ecfa6267617243239504a98d90");
46/// The default Service Manager address on our testnet (Depends on AVS, this is the proxy)
47pub const SERVICE_MANAGER_ADDR: Address = address!("36c02da8a0983159322a80ffe9f24b1acff8b570");
48/// The default Slasher address on our testnet
49pub const SLASHER_ADDR: Address = address!("1429859428c0abc9c2c47c8ee9fbaf82cfa0f20f");
50
51pub struct EigenlayerTestEnvironment {
52    pub http_endpoint: String,
53    pub ws_endpoint: String,
54    pub accounts: Vec<Address>,
55    pub eigenlayer_contract_addresses: EigenlayerProtocolSettings,
56}
57
58/// Sets up the test environment for the EigenLayer Blueprint.
59///
60/// # Description
61/// - Sets all the necessary environment variables for the necessary EigenLayer Contract Addresses.
62/// - Returns a [`EigenlayerTestEnvironment`] struct containing the test environment state.
63#[allow(clippy::missing_panics_doc)]
64pub async fn setup_eigenlayer_test_environment<T: TryInto<Url>, U: TryInto<Url>>(
65    http_endpoint: T,
66    ws_endpoint: U,
67) -> EigenlayerTestEnvironment
68where
69    <T as TryInto<Url>>::Error: std::fmt::Debug,
70    <U as TryInto<Url>>::Error: std::fmt::Debug,
71{
72    let http_endpoint = http_endpoint.try_into().unwrap();
73    let ws_endpoint = ws_endpoint.try_into().unwrap();
74    let provider = get_provider_http(http_endpoint.clone());
75
76    let accounts = provider.get_accounts().await.unwrap();
77
78    unsafe {
79        std::env::set_var(
80            "REGISTRY_COORDINATOR_ADDR",
81            REGISTRY_COORDINATOR_ADDR.to_string(),
82        );
83        std::env::set_var(
84            "OPERATOR_STATE_RETRIEVER_ADDR",
85            OPERATOR_STATE_RETRIEVER_ADDR.to_string(),
86        );
87        std::env::set_var(
88            "DELEGATION_MANAGER_ADDR",
89            DELEGATION_MANAGER_ADDR.to_string(),
90        );
91        std::env::set_var(
92            "PERMISSION_CONTROLLER_ADDR",
93            PERMISSION_CONTROLLER_ADDR.to_string(),
94        );
95        std::env::set_var("SERVICE_MANAGER_ADDR", SERVICE_MANAGER_ADDR.to_string());
96        std::env::set_var("STAKE_REGISTRY_ADDR", STAKE_REGISTRY_ADDR.to_string());
97        std::env::set_var("STRATEGY_MANAGER_ADDR", STRATEGY_MANAGER_ADDR.to_string());
98        std::env::set_var("AVS_DIRECTORY_ADDR", AVS_DIRECTORY_ADDR.to_string());
99        std::env::set_var("SLASHER_ADDR", SLASHER_ADDR.to_string());
100    }
101
102    let registry_coordinator =
103        RegistryCoordinator::new(REGISTRY_COORDINATOR_ADDR, provider.clone());
104
105    let operator_set_params = OperatorSetParam {
106        maxOperatorCount: 10,
107        kickBIPsOfOperatorStake: 100,
108        kickBIPsOfTotalStake: 1000,
109    };
110    let strategy_params = StrategyParams {
111        strategy: TOKEN_ADDR,
112        multiplier: Uint::from(1),
113    };
114
115    info!("Creating Quorum...");
116    let _receipt = get_receipt(registry_coordinator.createTotalDelegatedStakeQuorum(
117        operator_set_params,
118        Uint::from(0),
119        vec![strategy_params],
120    ))
121    .await
122    .unwrap();
123
124    info!("Setup Eigenlayer test environment");
125
126    EigenlayerTestEnvironment {
127        http_endpoint: http_endpoint.to_string(),
128        ws_endpoint: ws_endpoint.to_string(),
129        accounts,
130        eigenlayer_contract_addresses: EigenlayerProtocolSettings {
131            allocation_manager_address: ALLOCATION_MANAGER_ADDR,
132            registry_coordinator_address: REGISTRY_COORDINATOR_ADDR,
133            operator_state_retriever_address: OPERATOR_STATE_RETRIEVER_ADDR,
134            delegation_manager_address: DELEGATION_MANAGER_ADDR,
135            service_manager_address: SERVICE_MANAGER_ADDR,
136            stake_registry_address: STAKE_REGISTRY_ADDR,
137            strategy_manager_address: STRATEGY_MANAGER_ADDR,
138            avs_directory_address: AVS_DIRECTORY_ADDR,
139            rewards_coordinator_address: REWARDS_COORDINATOR_ADDR,
140            permission_controller_address: PERMISSION_CONTROLLER_ADDR,
141            strategy_address: STRATEGY_ADDR,
142        },
143    }
144}