//! Ethereum compatible providers //! Currently supported: //! - Raw HTTP POST requests //! //! TODO: WebSockets, multiple backends, popular APIs etc. mod http; use crate::{ types::{Address, BlockNumber, Bytes, Transaction, TransactionRequest, TxHash, U256}, utils, }; use async_trait::async_trait; use serde::{Deserialize, Serialize}; use std::{error::Error, fmt::Debug}; /// An HTTP provider for interacting with an Ethereum-compatible blockchain pub type HttpProvider = Provider; #[async_trait] /// Implement this trait in order to plug in different backends pub trait JsonRpcClient: Debug { type Error: Error; /// Sends a request with the provided method and the params serialized as JSON async fn request Deserialize<'a>>( &self, method: &str, params: Option, ) -> Result; } /// An abstract provider for interacting with the [Ethereum JSON RPC /// API](https://github.com/ethereum/wiki/wiki/JSON-RPC) #[derive(Clone, Debug)] pub struct Provider

(P); // JSON RPC bindings impl Provider

{ pub async fn get_block_number(&self) -> Result { self.0.request("eth_blockNumber", None::<()>).await } pub async fn get_transaction>( &self, hash: T, ) -> Result { let hash = hash.into(); self.0.request("eth_getTransactionByHash", Some(hash)).await } pub async fn send_transaction(&self, tx: TransactionRequest) -> Result { self.0.request("eth_sendTransaction", Some(tx)).await } pub async fn send_raw_transaction(&self, rlp: &Bytes) -> Result { let rlp = utils::serialize(&rlp); self.0.request("eth_sendRawTransaction", Some(rlp)).await } pub async fn get_transaction_count( &self, from: Address, block: Option, ) -> Result { let from = utils::serialize(&from); let block = utils::serialize(&block.unwrap_or(BlockNumber::Latest)); self.0 .request("eth_getTransactionCount", Some(&[from, block])) .await } }