kabu_strategy_backrun/
affected_pools_state.rs

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