kabu_strategy_backrun/
affected_pools_logs.rs

1use std::collections::BTreeMap;
2use std::sync::Arc;
3use tokio::sync::RwLock;
4
5use alloy_rpc_types::Log;
6use alloy_sol_types::SolEventInterface;
7use eyre::Result;
8
9use kabu_defi_abi::uniswap4::IUniswapV4PoolManagerEvents::IUniswapV4PoolManagerEventsEvents;
10use kabu_defi_address_book::FactoryAddress;
11use kabu_types_market::SwapDirection;
12use kabu_types_market::{Market, PoolId, PoolWrapper};
13
14#[allow(dead_code)]
15pub async fn get_affected_pools_from_logs(market: Arc<RwLock<Market>>, logs: &[Log]) -> Result<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 log in logs.iter() {
21        if log.address().eq(&FactoryAddress::UNISWAP_V4_POOL_MANAGER_ADDRESS)
22            && let Some(pool_id) = match IUniswapV4PoolManagerEventsEvents::decode_log(&log.inner) {
23                Ok(event) => match event.data {
24                    IUniswapV4PoolManagerEventsEvents::Initialize(params) => Some(params.id),
25                    IUniswapV4PoolManagerEventsEvents::ModifyLiquidity(params) => Some(params.id),
26                    IUniswapV4PoolManagerEventsEvents::Swap(params) => Some(params.id),
27                    IUniswapV4PoolManagerEventsEvents::Donate(params) => Some(params.id),
28                },
29                Err(_) => None,
30            }
31            && let Some(pool) = market_guard.get_pool(&PoolId::B256(pool_id))
32            && !affected_pools.contains_key(pool)
33        {
34            affected_pools.insert(pool.clone(), pool.get_swap_directions());
35        }
36    }
37
38    Ok(affected_pools)
39}