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