pool_sync/pools/pool_structures/
v2_structure.rs

1
2use crate::events::{AerodromeSync, DataEvents};
3use crate::pools::PoolType;
4use alloy::dyn_abi::DynSolValue;
5use alloy::primitives::{Address, U256};
6use alloy::rpc::types::Log;
7use alloy::sol_types::SolEvent;
8use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, Serialize, Deserialize, Default)]
11pub struct UniswapV2Pool {
12    pub address: Address,
13    pub token0: Address,
14    pub token1: Address,
15    pub token0_name: String,
16    pub token1_name: String,
17    pub token0_decimals: u8,
18    pub token1_decimals: u8,
19    pub token0_reserves: U256,
20    pub token1_reserves: U256,
21    pub stable: Option<bool>,
22    pub fee: Option<U256>,
23}
24
25pub fn process_sync_data(pool: &mut UniswapV2Pool, log: Log, pool_type: PoolType) {
26    let (reserve0, reserve1) = if pool_type == PoolType::Aerodrome {
27        let sync_event =  AerodromeSync::Sync::decode_log(log.as_ref(), true).unwrap();
28        (sync_event.reserve0, sync_event.reserve1)
29    } else {
30        let sync_event = DataEvents::Sync::decode_log(log.as_ref(), true).unwrap();
31        (U256::from(sync_event.reserve0), U256::from(sync_event.reserve1))
32    };
33    pool.token0_reserves = reserve0;
34    pool.token1_reserves = reserve1;
35}
36
37impl From<&[DynSolValue]> for UniswapV2Pool {
38    fn from(data: &[DynSolValue]) -> Self {
39        Self {
40            address: data[0].as_address().unwrap(),
41            token0: data[1].as_address().unwrap(),
42            token1: data[2].as_address().unwrap(),
43            token0_decimals: data[3].as_uint().unwrap().0.to::<u8>(),
44            token1_decimals: data[4].as_uint().unwrap().0.to::<u8>(),
45            token0_reserves: data[5].as_uint().unwrap().0.to::<U256>(),
46            token1_reserves: data[6].as_uint().unwrap().0.to::<U256>(),
47            ..Default::default()
48        }
49    }
50}
51