kabu_defi_pools/loaders/
maverick.rs

1use crate::{MaverickPool, pool_loader};
2use alloy::primitives::{Bytes, Log};
3use alloy::sol_types::SolEventInterface;
4use alloy_evm::EvmEnv;
5use eyre::{Result, eyre};
6use kabu_defi_abi::maverick::IMaverickPool::IMaverickPoolEvents;
7use kabu_evm_db::KabuDBError;
8use kabu_types_market::PoolClass;
9use kabu_types_market::{PoolId, PoolLoader, PoolWrapper};
10use reth_ethereum_primitives::EthPrimitives;
11use revm::DatabaseRef;
12use std::future::Future;
13use std::pin::Pin;
14use std::sync::Arc;
15use tokio_stream::Stream;
16
17pool_loader!(MaverickPoolLoader);
18
19impl<P, N, LDT> PoolLoader<P, N, LDT> for MaverickPoolLoader<P, N, LDT>
20where
21    N: Network,
22    P: Provider<N> + Clone + 'static,
23    LDT: Send + Sync + 'static,
24{
25    fn get_pool_class_by_log(&self, log_entry: &Log) -> Option<(PoolId, PoolClass)> {
26        let log_entry: Option<Log> = Log::new(log_entry.address, log_entry.data.topics().to_vec(), log_entry.data.data.clone());
27        match log_entry {
28            Some(log_entry) => match IMaverickPoolEvents::decode_log(&log_entry) {
29                Ok(event) => match event.data {
30                    IMaverickPoolEvents::Swap(_) | IMaverickPoolEvents::AddLiquidity(_) | IMaverickPoolEvents::RemoveLiquidity(_) => {
31                        Some((PoolId::Address(log_entry.address), PoolClass::Maverick))
32                    }
33                    _ => None,
34                },
35                Err(_) => None,
36            },
37            None => None,
38        }
39    }
40
41    fn fetch_pool_by_id<'a>(&'a self, pool_id: PoolId) -> Pin<Box<dyn Future<Output = Result<PoolWrapper>> + Send + 'a>> {
42        Box::pin(async move {
43            if let Some(provider) = self.provider.clone() {
44                self.fetch_pool_by_id_from_provider(pool_id, provider).await
45            } else {
46                Err(eyre!("NO_PROVIDER"))
47            }
48        })
49    }
50
51    fn fetch_pool_by_id_from_provider(&self, pool_id: PoolId, provider: P) -> Pin<Box<dyn Future<Output = Result<PoolWrapper>> + Send>> {
52        Box::pin(async move {
53            let address = match pool_id {
54                PoolId::Address(addr) => addr,
55                PoolId::B256(_) => return Err(eyre!("B256 pool ID variant not supported for Maverick pools")),
56            };
57            Ok(PoolWrapper::new(Arc::new(MaverickPool::fetch_pool_data(provider.clone(), address).await?)))
58        })
59    }
60
61    fn fetch_pool_by_id_from_evm(&self, pool_id: PoolId, db: &dyn DatabaseRef<Error = KabuDBError>) -> Result<PoolWrapper> {
62        let address = match pool_id {
63            PoolId::Address(addr) => addr,
64            PoolId::B256(_) => return Err(eyre!("B256 pool ID variant not supported for Maverick pools")),
65        };
66        Ok(PoolWrapper::new(Arc::new(MaverickPool::fetch_pool_data_evm(db, &EvmEnv::default(), address)?)))
67    }
68
69    fn is_code(&self, _code: &Bytes) -> bool {
70        false
71    }
72
73    fn protocol_loader(&self) -> Result<Pin<Box<dyn Stream<Item = (PoolId, PoolClass)> + Send>>> {
74        Err(eyre!("NOT_IMPLEMENTED"))
75    }
76}