avalanche-sdk 0.68.1

Avalanche API/SDK
Documentation
use std::io::{self, Error, ErrorKind};

use avalanche_types::jsonrpc::{self, eth};

/// e.g., "eth_getBalance" on "http://[ADDR]:9650" and "/ext/bc/C/rpc" path.
/// ref. https://docs.avax.network/build/avalanchego-apis/c-chain#eth_getassetbalance
pub async fn get_balance(http_rpc: &str, eth_addr: &str) -> io::Result<eth::GetBalanceResponse> {
    let joined = http_manager::join_uri(http_rpc, "/ext/bc/C/rpc")?;
    log::debug!("getting balances for {} via {}", eth_addr, joined.as_str());

    let mut data = jsonrpc::DataWithParamsArray::default();
    data.method = String::from("eth_getBalance");

    let params = vec![String::from(eth_addr), "latest".to_string()];
    data.params = Some(params);

    let d = data.encode_json()?;
    let rb = http_manager::post_non_tls(http_rpc, "/ext/bc/C/rpc", &d).await?;

    let resp: eth::GetBalanceResponse = match serde_json::from_slice(&rb) {
        Ok(p) => p,
        Err(e) => {
            return Err(Error::new(
                ErrorKind::Other,
                format!("failed to decode eth::GetBalanceResponse {}", e),
            ));
        }
    };
    Ok(resp)
}