use crate::client::evm::records::{FeeHistory, Receipt};
use crate::client::evm::rpc::query::{address, data, json, quantity, small, tag};
use crate::client::evm::rpc::{BlockTag, CallRequest, Query};
use crate::client::evm::u256::{B256, U256};
use crate::utils::{Address, Json, hex};
fn query<T>(method: &'static str, params: Vec<Json>, read: fn(&str) -> Result<T, String>) -> Query<T> {
Query { method, params, read }
}
#[must_use]
pub fn chain_id() -> Query<u64> {
query("eth_chainId", Vec::new(), small)
}
#[must_use]
pub fn balance(owner: Address, block: BlockTag) -> Query<U256> {
query("eth_getBalance", vec![address(owner), tag(block)], json)
}
#[must_use]
pub fn transaction_count(owner: Address, block: BlockTag) -> Query<u64> {
query("eth_getTransactionCount", vec![address(owner), tag(block)], small)
}
#[must_use]
pub fn gas_price() -> Query<U256> {
query("eth_gasPrice", Vec::new(), json)
}
#[must_use]
pub fn max_priority_fee() -> Query<U256> {
query("eth_maxPriorityFeePerGas", Vec::new(), json)
}
#[must_use]
pub fn fee_history(blocks: u64, newest: BlockTag, percentiles: &[u8]) -> Query<FeeHistory> {
let percentiles = percentiles.iter().map(|percent| Json::Number(percent.to_string())).collect();
query("eth_feeHistory", vec![quantity(U256::from_u64(blocks)), tag(newest), Json::Array(percentiles)], json)
}
#[must_use]
pub fn estimate_gas(call: &CallRequest) -> Query<u64> {
query("eth_estimateGas", vec![call.json()], small)
}
#[must_use]
pub fn call(call: &CallRequest, block: BlockTag) -> Query<Vec<u8>> {
query("eth_call", vec![call.json(), tag(block)], data)
}
#[must_use]
pub fn send_raw_transaction(raw: &[u8]) -> Query<B256> {
query("eth_sendRawTransaction", vec![Json::String(hex::encode_prefixed(raw))], json)
}
#[must_use]
pub fn receipt(hash: B256) -> Query<Option<Receipt>> {
query("eth_getTransactionReceipt", vec![Json::String(hash.to_hex())], json)
}