kabu_defi_pools/loaders/
maverick.rs1use 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}