2023-01-04 10:36:31 +00:00
|
|
|
use ethers::prelude::*;
|
|
|
|
use reqwest::Url;
|
|
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
const RPC_URL: &str = "https://mainnet.infura.io/v3/c60b0bb42f8a4c6481ecd229eddaca27";
|
|
|
|
|
|
|
|
/// The RetryClient is a type that wraps around a JsonRpcClient and automatically retries failed
|
|
|
|
/// requests using an exponential backoff and filtering based on a RetryPolicy. It presents as a
|
|
|
|
/// JsonRpcClient, but with additional functionality for retrying requests.
|
|
|
|
///
|
|
|
|
/// The RetryPolicy can be customized for specific applications and endpoints, mainly to handle
|
|
|
|
/// rate-limiting errors. In addition to the RetryPolicy, errors caused by connectivity issues such
|
|
|
|
/// as timed out connections or responses in the 5xx range can also be retried separately.
|
|
|
|
#[tokio::main]
|
|
|
|
async fn main() -> eyre::Result<()> {
|
|
|
|
let provider = Http::new(Url::parse(RPC_URL)?);
|
|
|
|
|
|
|
|
let client = RetryClientBuilder::default()
|
|
|
|
.rate_limit_retries(10)
|
|
|
|
.timeout_retries(3)
|
|
|
|
.initial_backoff(Duration::from_millis(500))
|
2023-01-12 03:17:46 +00:00
|
|
|
.build(provider, Box::<ethers::providers::HttpRateLimitRetryPolicy>::default());
|
2023-01-04 10:36:31 +00:00
|
|
|
|
|
|
|
// Send a JSON-RPC request for the latest block
|
|
|
|
let block_num = "latest".to_string();
|
|
|
|
let txn_details = false;
|
|
|
|
let params = (block_num, txn_details);
|
|
|
|
|
|
|
|
let block: Block<H256> =
|
|
|
|
JsonRpcClient::request(&client, "eth_getBlockByNumber", params).await?;
|
|
|
|
|
|
|
|
println!("{block:?}");
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|