mev_engine/amm/tenkswap/
factory.rs1use 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>
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 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 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}