pub mod transfer;
use std::io::{self, Error, ErrorKind};
use avalanche_types::key;
use ethers::prelude::*;
use ethers_providers::Middleware;
#[derive(Clone, Debug)]
pub struct SubnetEvm<T>
where
T: key::secp256k1::ReadOnly + key::secp256k1::SignOnly + Clone,
{
pub inner: crate::wallet::Wallet<T>,
}
impl<T> SubnetEvm<T>
where
T: key::secp256k1::ReadOnly + key::secp256k1::SignOnly + Clone,
{
pub async fn balance_with_endpoint_index(&self, idx: usize) -> io::Result<U256> {
let subnet_evm_providers = self.inner.subnet_evm_providers.clone().unwrap();
subnet_evm_providers[idx]
.get_balance(self.inner.h160_address, None)
.await
.map_err(|e| Error::new(ErrorKind::Other, format!("failed to get_balance '{}'", e)))
}
pub async fn balances(&self) -> io::Result<Vec<U256>> {
let mut balances = Vec::new();
for tuple in self.inner.http_rpcs.iter().enumerate() {
let balance = self.balance_with_endpoint_index(tuple.0).await?;
balances.push(balance);
}
Ok(balances)
}
pub async fn balance(&self) -> io::Result<U256> {
self.balance_with_endpoint_index(self.inner.pick_http_rpc().0)
.await
}
#[must_use]
pub fn transfer(&self) -> transfer::Tx<T> {
transfer::Tx::new(self)
}
}