From e4a21b3c879834f37c4221e3f75aae33a6a42c3d Mon Sep 17 00:00:00 2001 From: shekohex Date: Wed, 5 Apr 2023 12:34:51 +0000 Subject: [PATCH 1/3] fix(etherscan)!: change the `GasOracle` fields to be `f64` This updates the `GasOracle`'s {safe_gase_price,propose_gas_price,fast_gas_price} from `u64` to `f64` to fix [BUG] Failed to deserialize etherscan response: data did not match any variant of untagged enum ResponseData #2324 BREAKING CHANGE: This considered a public api breaking change, since `f64` and `u64` is not compatible with each other. --- ethers-etherscan/src/gas.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ethers-etherscan/src/gas.rs b/ethers-etherscan/src/gas.rs index e58fc2f3a..d5af083b6 100644 --- a/ethers-etherscan/src/gas.rs +++ b/ethers-etherscan/src/gas.rs @@ -7,11 +7,11 @@ use std::{collections::HashMap, str::FromStr}; #[serde(rename_all = "PascalCase")] pub struct GasOracle { #[serde(deserialize_with = "deserialize_number_from_string")] - pub safe_gas_price: u64, + pub safe_gas_price: f64, #[serde(deserialize_with = "deserialize_number_from_string")] - pub propose_gas_price: u64, + pub propose_gas_price: f64, #[serde(deserialize_with = "deserialize_number_from_string")] - pub fast_gas_price: u64, + pub fast_gas_price: f64, #[serde(deserialize_with = "deserialize_number_from_string")] pub last_block: u64, #[serde(deserialize_with = "deserialize_number_from_string")] From 7be8ba049d4a829de8dd0e2a911176ede9dd281c Mon Sep 17 00:00:00 2001 From: Shady Khalifa Date: Wed, 5 Apr 2023 14:58:03 +0200 Subject: [PATCH 2/3] fix(ethers-middleware): update etherscan oracle This a required change after chaning the gas prices to be `f64` --- ethers-middleware/src/gas_oracle/etherscan.rs | 4 +++- ethers-middleware/src/gas_oracle/mod.rs | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ethers-middleware/src/gas_oracle/etherscan.rs b/ethers-middleware/src/gas_oracle/etherscan.rs index 9d8da4c05..481f18e72 100644 --- a/ethers-middleware/src/gas_oracle/etherscan.rs +++ b/ethers-middleware/src/gas_oracle/etherscan.rs @@ -1,6 +1,6 @@ use super::{GasCategory, GasOracle, GasOracleError, Result, GWEI_TO_WEI_U256}; use async_trait::async_trait; -use ethers_core::types::U256; +use ethers_core::{types::U256, utils::parse_units}; use ethers_etherscan::Client; use std::ops::{Deref, DerefMut}; @@ -44,6 +44,8 @@ impl GasOracle for Etherscan { GasCategory::Fast => result.fast_gas_price, _ => unreachable!(), }; + // returned gas prices are f64 value in gwei + let gas_price = parse_units(gas_price, "gwei")?; Ok(U256::from(gas_price) * GWEI_TO_WEI_U256) } diff --git a/ethers-middleware/src/gas_oracle/mod.rs b/ethers-middleware/src/gas_oracle/mod.rs index 40c1bf427..0c32de415 100644 --- a/ethers-middleware/src/gas_oracle/mod.rs +++ b/ethers-middleware/src/gas_oracle/mod.rs @@ -89,6 +89,8 @@ pub enum GasOracleError { /// Error thrown when the provider failed. #[error("Provider error: {0}")] ProviderError(#[from] Box), + #[error("Failed to parse gas values: {0}")] + ConversionError(#[from] ethers_core::utils::ConversionError), } /// An Ethereum gas price oracle. From 4cca52f014b554b804bde9a6b87f3c5a8857665d Mon Sep 17 00:00:00 2001 From: Shady Khalifa Date: Wed, 5 Apr 2023 15:09:01 +0200 Subject: [PATCH 3/3] test(etherscan): add more tests --- ethers-etherscan/src/gas.rs | 25 +++++++++++++++++++++++++ ethers-etherscan/tests/it/gas.rs | 6 +++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/ethers-etherscan/src/gas.rs b/ethers-etherscan/src/gas.rs index d5af083b6..e8eacdd42 100644 --- a/ethers-etherscan/src/gas.rs +++ b/ethers-etherscan/src/gas.rs @@ -82,3 +82,28 @@ impl Client { Ok(response.result) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn response_works() { + // Response from Polygon mainnet at 2023-04-05 + let v = r#"{ + "status": "1", + "message": "OK", + "result": { + "LastBlock": "41171167", + "SafeGasPrice": "119.9", + "ProposeGasPrice": "141.9", + "FastGasPrice": "142.9", + "suggestBaseFee": "89.82627877", + "gasUsedRatio": "0.399191166666667,0.4847166,0.997667533333333,0.538075133333333,0.343416033333333", + "UsdPrice": "1.15" + } + }"#; + let gas_oracle: Response = serde_json::from_str(v).unwrap(); + assert_eq!(gas_oracle.message, "OK"); + } +} diff --git a/ethers-etherscan/tests/it/gas.rs b/ethers-etherscan/tests/it/gas.rs index a8754ee56..7c8e548e1 100644 --- a/ethers-etherscan/tests/it/gas.rs +++ b/ethers-etherscan/tests/it/gas.rs @@ -34,9 +34,9 @@ async fn gas_oracle_success() { let oracle = result.unwrap(); - assert!(oracle.safe_gas_price > 0); - assert!(oracle.propose_gas_price > 0); - assert!(oracle.fast_gas_price > 0); + assert!(oracle.safe_gas_price > 0f64); + assert!(oracle.propose_gas_price > 0f64); + assert!(oracle.fast_gas_price > 0f64); assert!(oracle.last_block > 0); assert!(oracle.suggested_base_fee > 0.0); assert!(!oracle.gas_used_ratio.is_empty());