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)))
}
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),
)
})
}
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: ð::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)))
}