ethers_middleware/gas_oracle/
provider_oracle.rs

1use super::{GasOracle, GasOracleError, Result};
2use async_trait::async_trait;
3use ethers_core::types::U256;
4use ethers_providers::Middleware;
5use std::fmt::Debug;
6
7/// Gas oracle from a [`Middleware`] implementation such as an
8/// Ethereum RPC provider.
9#[derive(Clone, Debug)]
10#[must_use]
11pub struct ProviderOracle<M: Middleware> {
12    provider: M,
13}
14
15impl<M: Middleware> ProviderOracle<M> {
16    pub fn new(provider: M) -> Self {
17        Self { provider }
18    }
19}
20
21#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
22#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
23impl<M: Middleware> GasOracle for ProviderOracle<M>
24where
25    M::Error: 'static,
26{
27    async fn fetch(&self) -> Result<U256> {
28        self.provider
29            .get_gas_price()
30            .await
31            .map_err(|err| GasOracleError::ProviderError(Box::new(err)))
32    }
33
34    async fn estimate_eip1559_fees(&self) -> Result<(U256, U256)> {
35        // TODO: Allow configuring different estimation functions.
36        self.provider
37            .estimate_eip1559_fees(None)
38            .await
39            .map_err(|err| GasOracleError::ProviderError(Box::new(err)))
40    }
41}