kabu_strategy_backrun/
affected_pools_logs.rs

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