use async_trait::async_trait;
use crate::core::types::ExchangeError;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum ChainFamily {
Evm { chain_id: u64 },
Solana,
Cosmos { chain_id: String },
StarkNet,
Sui { network: String },
Ton { network: String },
Aptos { network: String },
Bitcoin { network: String },
}
impl ChainFamily {
pub fn name(&self) -> String {
match self {
Self::Evm { chain_id } => format!("evm:{chain_id}"),
Self::Solana => "solana".to_string(),
Self::Cosmos { chain_id } => format!("cosmos:{chain_id}"),
Self::StarkNet => "starknet".to_string(),
Self::Sui { network } => format!("sui:{network}"),
Self::Ton { network } => format!("ton:{network}"),
Self::Aptos { network } => format!("aptos:{network}"),
Self::Bitcoin { network } => format!("bitcoin:{network}"),
}
}
pub fn is_evm(&self, chain_id: u64) -> bool {
matches!(self, Self::Evm { chain_id: id } if *id == chain_id)
}
pub fn is_sui(&self, network: &str) -> bool {
matches!(self, Self::Sui { network: n } if n == network)
}
pub fn is_aptos(&self, network: &str) -> bool {
matches!(self, Self::Aptos { network: n } if n == network)
}
pub fn is_bitcoin(&self, network: &str) -> bool {
matches!(self, Self::Bitcoin { network: n } if n == network)
}
}
#[derive(Debug, Clone)]
pub enum TxStatus {
Pending,
Confirmed {
block: u64,
},
Failed {
reason: String,
},
NotFound,
}
#[async_trait]
pub trait ChainProvider: Send + Sync {
fn chain_family(&self) -> ChainFamily;
async fn broadcast_tx(&self, tx_bytes: &[u8]) -> Result<String, ExchangeError>;
async fn get_height(&self) -> Result<u64, ExchangeError>;
async fn get_nonce(&self, address: &str) -> Result<u64, ExchangeError>;
async fn get_native_balance(&self, address: &str) -> Result<String, ExchangeError>;
async fn get_tx_status(&self, tx_hash: &str) -> Result<TxStatus, ExchangeError>;
}