kabu_strategy_backrun/
affected_pools_state.rs

1use std::collections::BTreeMap;
2
3use alloy_primitives::U256;
4use kabu_core_actors::SharedState;
5use kabu_types_blockchain::GethStateUpdateVec;
6use kabu_types_entities::{Market, PoolId, PoolWrapper, SwapDirection};
7use tracing::debug;
8
9pub async fn get_affected_pools_from_state_update(
10    market: SharedState<Market>,
11    state_update: &GethStateUpdateVec,
12) -> BTreeMap<PoolWrapper, Vec<SwapDirection>> {
13    let market_guard = market.read().await;
14
15    let mut affected_pools: BTreeMap<PoolWrapper, Vec<SwapDirection>> = BTreeMap::new();
16
17    for state_update_record in state_update.iter() {
18        for (address, state_update_entry) in state_update_record.iter() {
19            if market_guard.is_pool_manager(address) {
20                for cell in state_update_entry.storage.keys() {
21                    let cell_u: U256 = U256::from_be_slice(cell.as_slice());
22                    if let Some(pool_id) = market_guard.get_pool_id_for_cell(address, &cell_u) {
23                        if let Some(pool) = market_guard.get_pool(pool_id) {
24                            if !affected_pools.contains_key(pool) {
25                                debug!("Affected pool_managers {} pool {} ", address, pool_id);
26                                affected_pools.insert(pool.clone(), pool.get_swap_directions());
27                            }
28                        }
29                    }
30                }
31            } else if let Some(pool) = market_guard.get_pool(&PoolId::Address(*address)) {
32                if !affected_pools.contains_key(pool) {
33                    affected_pools.insert(pool.clone(), pool.get_swap_directions());
34                }
35            }
36        }
37    }
38
39    affected_pools
40}