kabu_defi_pools/loaders/
maverick.rs

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