mev_engine/amm/tenkswap/
factory.rs

1use crate::amm::pool::AutomatedMarketMaker;
2use async_trait::async_trait;
3use serde::{Deserialize, Serialize};
4use starknet::{core::types::Felt, providers::Provider};
5use std::sync::Arc;
6
7use crate::{
8    amm::{factory::AutomatedMarketMakerFactory, pool::AMM},
9    errors::AMMError,
10    utils::call_contract,
11};
12
13use super::get_data::get_pool_info;
14
15#[derive(Serialize, Deserialize, Clone, Debug)]
16pub struct TenKFactory {
17    pub factory_address: Felt,
18}
19
20#[async_trait]
21impl AutomatedMarketMakerFactory for TenKFactory {
22    fn address(&self) -> Felt {
23        self.factory_address
24    }
25
26    // async fn fetch_all_pools<P>(&mut self, provider: Arc<P>) -> Result<Vec<AMM>, AMMError>
27    // where
28    //     P: Provider + Sync + Send,
29    // {
30    //     let pool_addresses = get_all_pools(self, provider.clone()).await.unwrap();
31    //     let mut all_pools = vec![];
32    //     let mut first_val = true;
33    //
34    //     for pool_address in pool_addresses {
35    //         if first_val {
36    //             first_val = false;
37    //             continue;
38    //         }
39    //         let pool = get_pool_info(pool_address, provider.clone()).await.unwrap();
40    //
41    //         tokio::time::sleep(Duration::from_millis(200)).await;
42    //         all_pools.push(AMM::JediswapPool(pool));
43    //     }
44    //     Ok(all_pools)
45    // }
46    //
47    async fn fetch_all_pools<P>(&mut self, provider: Arc<P>) -> Result<Vec<AMM>, AMMError>
48    where
49        P: Provider + Sync + Send,
50    {
51        let pools_length = call_contract(
52            provider.clone(),
53            self.factory_address,
54            "allPairsLength",
55            vec![],
56        )
57        .await
58        .unwrap()[0];
59
60        let pools_length_parsed =
61            u64::from_le_bytes(pools_length.to_bytes_le()[0..8].try_into().unwrap());
62        // println!("total no. of pools {:?}", pools_length_parsed);
63        let mut all_pools = vec![];
64
65        for idx in 0..pools_length_parsed {
66            let pool_address = call_contract(
67                provider.clone(),
68                self.address(),
69                "allPairs",
70                vec![Felt::from(idx)],
71            )
72            .await
73            .unwrap()[0];
74            // println!("pool address {:?}", pool_address);
75
76            let pool = get_pool_info(pool_address, provider.clone()).await.unwrap();
77            all_pools.push(AMM::TenkSwapPool(pool));
78        }
79        Ok(all_pools)
80    }
81
82    fn amm_created_event_signature(&self) -> Vec<Vec<Felt>> {
83        vec![vec![Felt::ONE]]
84    }
85
86    async fn populate_amm_data<P>(
87        &self,
88        amms: &mut [AMM],
89        _block_number: Option<u64>,
90        middleware: Arc<P>,
91    ) -> Result<(), AMMError>
92    where
93        P: Provider + Sync + Send,
94    {
95        for amm in amms {
96            get_pool_info(amm.address(), middleware.clone())
97                .await
98                .unwrap();
99        }
100        Ok(())
101    }
102}
103
104impl TenKFactory {
105    pub fn new(factory_address: Felt) -> TenKFactory {
106        TenKFactory { factory_address }
107    }
108}