diff --git a/crates/anvil/src/eth/api.rs b/crates/anvil/src/eth/api.rs index ba9965faafcd1..3d9a1c4861509 100644 --- a/crates/anvil/src/eth/api.rs +++ b/crates/anvil/src/eth/api.rs @@ -1313,30 +1313,11 @@ impl EthApi { response.reward = Some(rewards); - // calculate next base fee + // add the next block's base fee to the response // The spec states that `base_fee_per_gas` "[..] includes the next block after the // newest of the returned range, because this value can be derived from the // newest block" - if let (Some(last_gas_used), Some(last_fee_per_gas)) = - (response.gas_used_ratio.last(), response.base_fee_per_gas.last()) - { - let elasticity = self.backend.elasticity(); - let last_fee_per_gas = *last_fee_per_gas as f64; - if last_gas_used > &0.5 { - // increase base gas - let increase = ((last_gas_used - 0.5) * 2f64) * elasticity; - let new_base_fee = (last_fee_per_gas + (last_fee_per_gas * increase)) as u128; - response.base_fee_per_gas.push(new_base_fee); - } else if last_gas_used < &0.5 { - // decrease gas - let increase = ((0.5 - last_gas_used) * 2f64) * elasticity; - let new_base_fee = (last_fee_per_gas - (last_fee_per_gas * increase)) as u128; - response.base_fee_per_gas.push(new_base_fee); - } else { - // same base gas - response.base_fee_per_gas.push(last_fee_per_gas as u128); - } - } + response.base_fee_per_gas.push(self.backend.fees().base_fee()); Ok(response) } diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index 994dde5fd6d67..51b14bb2dcee6 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -1055,12 +1055,12 @@ impl Backend { header.base_fee_per_gas.unwrap_or_default(), ); - // notify all listeners - self.notify_on_new_block(header, block_hash); - // update next base fee self.fees.set_base_fee(next_block_base_fee); + // notify all listeners + self.notify_on_new_block(header, block_hash); + outcome } diff --git a/crates/anvil/src/eth/fees.rs b/crates/anvil/src/eth/fees.rs index 142a6a4af38c2..f5534a0cd10cf 100644 --- a/crates/anvil/src/eth/fees.rs +++ b/crates/anvil/src/eth/fees.rs @@ -174,7 +174,6 @@ impl FeeHistoryService { /// Create a new history entry for the block fn create_cache_entry(&self, hash: B256) -> (FeeHistoryCacheItem, Option) { - let elasticity = self.fees.elasticity(); // percentile list from 0.0 to 100.0 with a 0.5 resolution. // this will create 200 percentile points let reward_percentiles: Vec = { @@ -199,10 +198,7 @@ impl FeeHistoryService { block_number = Some(block.header.number); let gas_used = block.header.gas_used as f64; - let gas_limit = block.header.gas_limit as f64; - - let gas_target = gas_limit / elasticity; - item.gas_used_ratio = gas_used / (gas_target * elasticity); + item.gas_used_ratio = gas_used / block.header.gas_limit as f64; // extract useful tx info (gas_used, effective_reward) let mut transactions: Vec<(u128, u128)> = receipts diff --git a/crates/anvil/tests/it/gas.rs b/crates/anvil/tests/it/gas.rs index 93cebb90c7247..bca7102cbf6b9 100644 --- a/crates/anvil/tests/it/gas.rs +++ b/crates/anvil/tests/it/gas.rs @@ -170,3 +170,25 @@ async fn test_tip_above_fee_cap() { .to_string() .contains("max priority fee per gas higher than max fee per gas")); } + +#[tokio::test(flavor = "multi_thread")] +async fn test_can_use_fee_history() { + let base_fee = 50u128; + let (_api, handle) = spawn(NodeConfig::test().with_base_fee(Some(base_fee))).await; + let provider = handle.http_provider(); + + for _ in 0..10 { + let fee_history = provider.get_fee_history(1, Default::default(), &[]).await.unwrap(); + let next_base_fee = fee_history.base_fee_per_gas.last().unwrap(); + + let tx = TransactionRequest::default() + .with_to(Address::random()) + .with_value(U256::from(100)) + .with_gas_price(*next_base_fee); + let tx = WithOtherFields::new(tx); + + let receipt = + provider.send_transaction(tx.clone()).await.unwrap().get_receipt().await.unwrap(); + assert!(receipt.inner.inner.is_success()); + } +}