pool-sync 3.0.0

A library for synchronizing and managing various types of liquidity pools across different blockchains
Documentation
use alloy::dyn_abi::DynSolValue;
use alloy::primitives::Address;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CurveTriCryptoPool {
    pub address: Address,
    pub token0: Address,
    pub token1: Address,
    pub token2: Address,
    pub token0_name: String,
    pub token1_name: String,
    pub token2_name: String,
    pub token0_decimals: u8,
    pub token1_decimals: u8,
    pub token2_decimals: u8,
}

impl CurveTriCryptoPool {
    pub fn get_tokens(&self) -> Vec<Address> {
        let tokens = vec![self.token0, self.token1, self.token2];
        tokens
    }

    pub fn get_token_index(&self, token: &Address) -> Option<usize> {
        if *token == self.token0 {
            Some(0)
        } else if *token == self.token1 {
            Some(1)
        } else {
            Some(2)
        }
    }
}

impl From<&[DynSolValue]> for CurveTriCryptoPool {
    fn from(data: &[DynSolValue]) -> Self {
        let pool_address = data[0].as_address().unwrap();
        let token0 = data[1].as_address().unwrap();
        let token1 = data[2].as_address().unwrap();
        let token2 = data[3].as_address().unwrap();
        let token0_decimals = data[4].as_uint().unwrap().0.to::<u8>();
        let token1_decimals = data[5].as_uint().unwrap().0.to::<u8>();
        let token2_decimals = data[6].as_uint().unwrap().0.to::<u8>();

        Self {
            address: pool_address,
            token0,
            token1,
            token2,
            token0_decimals,
            token1_decimals,
            token2_decimals,
            ..Default::default()
        }
    }
}