pool_sync/pools/pool_structures/
tri_crypto_curve_structure.rs1use 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