pool_sync/pools/pool_structures/
tri_crypto_curve_structure.rs

1use alloy::dyn_abi::DynSolValue;
2use alloy::primitives::Address;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize, Default)]
6pub struct CurveTriCryptoPool {
7    pub address: Address,
8    pub token0: Address,
9    pub token1: Address,
10    pub token2: Address,
11    pub token0_name: String,
12    pub token1_name: String,
13    pub token2_name: String,
14    pub token0_decimals: u8,
15    pub token1_decimals: u8,
16    pub token2_decimals: u8,
17}
18
19impl CurveTriCryptoPool {
20    pub fn get_tokens(&self) -> Vec<Address> {
21        let tokens = vec![self.token0, self.token1, self.token2];
22        tokens
23    }
24
25    pub fn get_token_index(&self, token: &Address) -> Option<usize> {
26        if *token == self.token0 {
27            Some(0)
28        } else if *token == self.token1 {
29            Some(1)
30        } else {
31            Some(2)
32        }
33    }
34}
35
36impl From<&[DynSolValue]> for CurveTriCryptoPool {
37    fn from(data: &[DynSolValue]) -> Self {
38        let pool_address = data[0].as_address().unwrap();
39        let token0 = data[1].as_address().unwrap();
40        let token1 = data[2].as_address().unwrap();
41        let token2 = data[3].as_address().unwrap();
42        let token0_decimals = data[4].as_uint().unwrap().0.to::<u8>();
43        let token1_decimals = data[5].as_uint().unwrap().0.to::<u8>();
44        let token2_decimals = data[6].as_uint().unwrap().0.to::<u8>();
45
46        Self {
47            address: pool_address,
48            token0,
49            token1,
50            token2,
51            token0_decimals,
52            token1_decimals,
53            token2_decimals,
54            ..Default::default()
55        }
56    }
57}
58