avalanche-sdk 0.93.0

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

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

pub async fn block_number(
    http_rpc: &str,
    chain_id_alias: &str,
) -> io::Result<eth::BlockNumberResponse> {
    let chain_rpc_url_path = format!("/ext/bc/{}/rpc", chain_id_alias);
    log::info!("getting block number via {} {}", http_rpc, chain_id_alias,);

    let mut data = jsonrpc::Request::default();
    data.method = String::from("eth_blockNumber");

    let d = data.encode_json()?;
    let rb = http_manager::post_non_tls(http_rpc, &chain_rpc_url_path, &d).await?;

    serde_json::from_slice(&rb)
        .map_err(|e| Error::new(ErrorKind::Other, format!("failed eth_blockNumber '{}'", e)))
}

/// Fetches the balance.
/// "chain_id_alias" is "C" for C-chain, and blockchain Id for subnet-evm.
/// 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,
    chain_id_alias: &str,
    eth_addr: &str,
) -> io::Result<eth::GetBalanceResponse> {
    let chain_rpc_url_path = format!("/ext/bc/{}/rpc", chain_id_alias);
    log::info!(
        "getting balances for {} via {} {}",
        eth_addr,
        http_rpc,
        chain_rpc_url_path
    );

    let mut data = jsonrpc::RequestWithParamsArray::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, &chain_rpc_url_path, &d).await?;

    serde_json::from_slice(&rb)
        .map_err(|e| Error::new(ErrorKind::Other, format!("failed eth_getBalance '{}'", e)))
}

pub async fn get_transaction_count(
    http_rpc: &str,
    chain_id_alias: &str,
    eth_addr: &str,
) -> io::Result<eth::GetTransactionCountResponse> {
    let chain_rpc_url_path = format!("/ext/bc/{}/rpc", chain_id_alias);
    log::info!(
        "getting transaction count for {} via {} {}",
        eth_addr,
        http_rpc,
        chain_rpc_url_path
    );

    let mut data = jsonrpc::RequestWithParamsArray::default();
    data.method = String::from("eth_getTransactionCount");

    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, &chain_rpc_url_path, &d).await?;

    serde_json::from_slice(&rb).map_err(|e| {
        Error::new(
            ErrorKind::Other,
            format!("failed eth_getTransactionCount '{}'", e),
        )
    })
}

/// Get transaction receipt.
pub async fn get_transaction_receipt(
    http_rpc: &str,
    chain_id_alias: &str,
    tx_hash: &str,
) -> io::Result<eth::GetTransactionReceiptResponse> {
    let chain_rpc_url_path = format!("/ext/bc/{}/rpc", chain_id_alias);
    log::info!(
        "getting transaction receipt for {} via {} {}",
        tx_hash,
        http_rpc,
        chain_rpc_url_path
    );

    let mut data = jsonrpc::RequestWithParamsArray::default();
    data.method = String::from("eth_getTransactionReceipt");

    let params = vec![String::from(tx_hash)];
    data.params = Some(params);

    let d = data.encode_json()?;
    let rb = http_manager::post_non_tls(http_rpc, &chain_rpc_url_path, &d).await?;

    serde_json::from_slice(&rb).map_err(|e| {
        Error::new(
            ErrorKind::Other,
            format!("failed eth_getTransactionReceipt '{}'", e),
        )
    })
}

pub async fn send_raw_transaction(
    http_rpc: &str,
    chain_id_alias: &str,
    req: &eth::SendRawTransactionParam,
) -> io::Result<eth::SendRawTransactionResponse> {
    let chain_rpc_url_path = format!("/ext/bc/{}/rpc", chain_id_alias);
    log::info!("sending raw tx via {} {}", http_rpc, chain_id_alias,);

    let mut data = jsonrpc::Request::default();
    data.method = String::from("eth_blockNumber");

    let d = data.encode_json()?;
    let rb = http_manager::post_non_tls(http_rpc, &chain_rpc_url_path, &d).await?;

    serde_json::from_slice(&rb)
        .map_err(|e| Error::new(ErrorKind::Other, format!("failed eth_blockNumber '{}'", e)))
}