From 8284752aabd916fd4b00335403fa26a6b0715393 Mon Sep 17 00:00:00 2001 From: Leni Date: Fri, 22 Aug 2025 03:43:17 +0800 Subject: [PATCH 1/6] fix issue 17991 --- crates/chainspec/src/api.rs | 7 ++----- crates/chainspec/src/spec.rs | 17 ----------------- crates/ethereum/node/tests/e2e/rpc.rs | 2 +- crates/optimism/chainspec/src/lib.rs | 4 +--- examples/custom-node/src/chainspec.rs | 7 +------ 5 files changed, 5 insertions(+), 32 deletions(-) diff --git a/crates/chainspec/src/api.rs b/crates/chainspec/src/api.rs index cb5b47bc245..edefd8d1e09 100644 --- a/crates/chainspec/src/api.rs +++ b/crates/chainspec/src/api.rs @@ -24,8 +24,7 @@ pub trait EthChainSpec: Send + Sync + Unpin + Debug { self.chain().id() } - /// Get the [`BaseFeeParams`] for the chain at the given block. - fn base_fee_params_at_block(&self, block_number: u64) -> BaseFeeParams; + /// Get the [`BaseFeeParams`] for the chain at the given timestamp. fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams; @@ -85,9 +84,7 @@ impl EthChainSpec for ChainSpec { self.chain } - fn base_fee_params_at_block(&self, block_number: u64) -> BaseFeeParams { - self.base_fee_params_at_block(block_number) - } + fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams { self.base_fee_params_at_timestamp(timestamp) diff --git a/crates/chainspec/src/spec.rs b/crates/chainspec/src/spec.rs index 2800640b708..b1c27f766c5 100644 --- a/crates/chainspec/src/spec.rs +++ b/crates/chainspec/src/spec.rs @@ -393,24 +393,7 @@ impl ChainSpec { } } - /// Get the [`BaseFeeParams`] for the chain at the given block number - pub fn base_fee_params_at_block(&self, block_number: u64) -> BaseFeeParams { - match self.base_fee_params { - BaseFeeParamsKind::Constant(bf_params) => bf_params, - BaseFeeParamsKind::Variable(ForkBaseFeeParams(ref bf_params)) => { - // Walk through the base fee params configuration in reverse order, and return the - // first one that corresponds to a hardfork that is active at the - // given timestamp. - for (fork, params) in bf_params.iter().rev() { - if self.hardforks.is_fork_active_at_block(fork.clone(), block_number) { - return *params - } - } - bf_params.first().map(|(_, params)| *params).unwrap_or(BaseFeeParams::ethereum()) - } - } - } /// Get the hash of the genesis block. pub fn genesis_hash(&self) -> B256 { diff --git a/crates/ethereum/node/tests/e2e/rpc.rs b/crates/ethereum/node/tests/e2e/rpc.rs index ea49d8b3c8e..8b584316264 100644 --- a/crates/ethereum/node/tests/e2e/rpc.rs +++ b/crates/ethereum/node/tests/e2e/rpc.rs @@ -62,7 +62,7 @@ async fn test_fee_history() -> eyre::Result<()> { let genesis_base_fee = chain_spec.initial_base_fee().unwrap() as u128; let expected_first_base_fee = genesis_base_fee - - genesis_base_fee / chain_spec.base_fee_params_at_block(0).max_change_denominator; + genesis_base_fee / chain_spec.base_fee_params_at_timestamp(chain_spec.genesis_timestamp()).max_change_denominator; assert_eq!(fee_history.base_fee_per_gas[0], genesis_base_fee); assert_eq!(fee_history.base_fee_per_gas[1], expected_first_base_fee,); diff --git a/crates/optimism/chainspec/src/lib.rs b/crates/optimism/chainspec/src/lib.rs index 44361c7abf5..45464630aec 100644 --- a/crates/optimism/chainspec/src/lib.rs +++ b/crates/optimism/chainspec/src/lib.rs @@ -243,9 +243,7 @@ impl EthChainSpec for OpChainSpec { self.inner.chain() } - fn base_fee_params_at_block(&self, block_number: u64) -> BaseFeeParams { - self.inner.base_fee_params_at_block(block_number) - } + fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams { self.inner.base_fee_params_at_timestamp(timestamp) diff --git a/examples/custom-node/src/chainspec.rs b/examples/custom-node/src/chainspec.rs index 5677d9fb576..27a85438b01 100644 --- a/examples/custom-node/src/chainspec.rs +++ b/examples/custom-node/src/chainspec.rs @@ -50,12 +50,7 @@ impl Hardforks for CustomChainSpec { impl EthChainSpec for CustomChainSpec { type Header = CustomHeader; - fn base_fee_params_at_block( - &self, - block_number: u64, - ) -> reth_ethereum::chainspec::BaseFeeParams { - self.inner.base_fee_params_at_block(block_number) - } + fn blob_params_at_timestamp(&self, timestamp: u64) -> Option { self.inner.blob_params_at_timestamp(timestamp) From 5c3b13d3ef177c66a97b3d1b7cf2f3a8206b588f Mon Sep 17 00:00:00 2001 From: Leni Date: Fri, 22 Aug 2025 03:49:03 +0800 Subject: [PATCH 2/6] remove duplicate and fix lint --- crates/chainspec/src/api.rs | 4 ---- crates/chainspec/src/spec.rs | 2 -- crates/optimism/chainspec/src/lib.rs | 2 -- examples/custom-node/src/chainspec.rs | 11 +++-------- 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/crates/chainspec/src/api.rs b/crates/chainspec/src/api.rs index edefd8d1e09..80327d38b6d 100644 --- a/crates/chainspec/src/api.rs +++ b/crates/chainspec/src/api.rs @@ -24,8 +24,6 @@ pub trait EthChainSpec: Send + Sync + Unpin + Debug { self.chain().id() } - - /// Get the [`BaseFeeParams`] for the chain at the given timestamp. fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams; @@ -84,8 +82,6 @@ impl EthChainSpec for ChainSpec { self.chain } - - fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams { self.base_fee_params_at_timestamp(timestamp) } diff --git a/crates/chainspec/src/spec.rs b/crates/chainspec/src/spec.rs index b1c27f766c5..ef3b7f3b277 100644 --- a/crates/chainspec/src/spec.rs +++ b/crates/chainspec/src/spec.rs @@ -393,8 +393,6 @@ impl ChainSpec { } } - - /// Get the hash of the genesis block. pub fn genesis_hash(&self) -> B256 { self.genesis_header.hash() diff --git a/crates/optimism/chainspec/src/lib.rs b/crates/optimism/chainspec/src/lib.rs index 45464630aec..dfc909dbd15 100644 --- a/crates/optimism/chainspec/src/lib.rs +++ b/crates/optimism/chainspec/src/lib.rs @@ -243,8 +243,6 @@ impl EthChainSpec for OpChainSpec { self.inner.chain() } - - fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams { self.inner.base_fee_params_at_timestamp(timestamp) } diff --git a/examples/custom-node/src/chainspec.rs b/examples/custom-node/src/chainspec.rs index 27a85438b01..c9a7f34778f 100644 --- a/examples/custom-node/src/chainspec.rs +++ b/examples/custom-node/src/chainspec.rs @@ -50,19 +50,14 @@ impl Hardforks for CustomChainSpec { impl EthChainSpec for CustomChainSpec { type Header = CustomHeader; - + fn base_fee_params_at_timestamp(&self, timestamp: u64) -> reth_ethereum::chainspec::BaseFeeParams { + self.inner.base_fee_params_at_timestamp(timestamp) + } fn blob_params_at_timestamp(&self, timestamp: u64) -> Option { self.inner.blob_params_at_timestamp(timestamp) } - fn base_fee_params_at_timestamp( - &self, - timestamp: u64, - ) -> reth_ethereum::chainspec::BaseFeeParams { - self.inner.base_fee_params_at_timestamp(timestamp) - } - fn bootnodes(&self) -> Option> { self.inner.bootnodes() } From acfda224ec18e4e97b82bc2c300c8a22e0a11186 Mon Sep 17 00:00:00 2001 From: Leni Date: Fri, 22 Aug 2025 03:55:41 +0800 Subject: [PATCH 3/6] fmt: apply cargo fmt formatting --- crates/ethereum/node/tests/e2e/rpc.rs | 5 ++++- examples/custom-node/src/chainspec.rs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/ethereum/node/tests/e2e/rpc.rs b/crates/ethereum/node/tests/e2e/rpc.rs index 8b584316264..db5eb8ec072 100644 --- a/crates/ethereum/node/tests/e2e/rpc.rs +++ b/crates/ethereum/node/tests/e2e/rpc.rs @@ -62,7 +62,10 @@ async fn test_fee_history() -> eyre::Result<()> { let genesis_base_fee = chain_spec.initial_base_fee().unwrap() as u128; let expected_first_base_fee = genesis_base_fee - - genesis_base_fee / chain_spec.base_fee_params_at_timestamp(chain_spec.genesis_timestamp()).max_change_denominator; + genesis_base_fee / + chain_spec + .base_fee_params_at_timestamp(chain_spec.genesis_timestamp()) + .max_change_denominator; assert_eq!(fee_history.base_fee_per_gas[0], genesis_base_fee); assert_eq!(fee_history.base_fee_per_gas[1], expected_first_base_fee,); diff --git a/examples/custom-node/src/chainspec.rs b/examples/custom-node/src/chainspec.rs index c9a7f34778f..e3301f83c31 100644 --- a/examples/custom-node/src/chainspec.rs +++ b/examples/custom-node/src/chainspec.rs @@ -50,7 +50,10 @@ impl Hardforks for CustomChainSpec { impl EthChainSpec for CustomChainSpec { type Header = CustomHeader; - fn base_fee_params_at_timestamp(&self, timestamp: u64) -> reth_ethereum::chainspec::BaseFeeParams { + fn base_fee_params_at_timestamp( + &self, + timestamp: u64, + ) -> reth_ethereum::chainspec::BaseFeeParams { self.inner.base_fee_params_at_timestamp(timestamp) } From 782e30c650b12ef8971de35a023879ca05937ff4 Mon Sep 17 00:00:00 2001 From: Dharm Singh Date: Fri, 22 Aug 2025 01:32:50 +0530 Subject: [PATCH 4/6] remove fn --- crates/chainspec/src/api.rs | 7 ------- crates/chainspec/src/spec.rs | 19 ------------------- crates/ethereum/node/tests/e2e/rpc.rs | 5 +---- crates/optimism/chainspec/src/lib.rs | 4 ---- examples/custom-node/src/chainspec.rs | 7 ------- 5 files changed, 1 insertion(+), 41 deletions(-) diff --git a/crates/chainspec/src/api.rs b/crates/chainspec/src/api.rs index cb5b47bc245..80327d38b6d 100644 --- a/crates/chainspec/src/api.rs +++ b/crates/chainspec/src/api.rs @@ -24,9 +24,6 @@ pub trait EthChainSpec: Send + Sync + Unpin + Debug { self.chain().id() } - /// Get the [`BaseFeeParams`] for the chain at the given block. - fn base_fee_params_at_block(&self, block_number: u64) -> BaseFeeParams; - /// Get the [`BaseFeeParams`] for the chain at the given timestamp. fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams; @@ -85,10 +82,6 @@ impl EthChainSpec for ChainSpec { self.chain } - fn base_fee_params_at_block(&self, block_number: u64) -> BaseFeeParams { - self.base_fee_params_at_block(block_number) - } - fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams { self.base_fee_params_at_timestamp(timestamp) } diff --git a/crates/chainspec/src/spec.rs b/crates/chainspec/src/spec.rs index 2800640b708..ef3b7f3b277 100644 --- a/crates/chainspec/src/spec.rs +++ b/crates/chainspec/src/spec.rs @@ -393,25 +393,6 @@ impl ChainSpec { } } - /// Get the [`BaseFeeParams`] for the chain at the given block number - pub fn base_fee_params_at_block(&self, block_number: u64) -> BaseFeeParams { - match self.base_fee_params { - BaseFeeParamsKind::Constant(bf_params) => bf_params, - BaseFeeParamsKind::Variable(ForkBaseFeeParams(ref bf_params)) => { - // Walk through the base fee params configuration in reverse order, and return the - // first one that corresponds to a hardfork that is active at the - // given timestamp. - for (fork, params) in bf_params.iter().rev() { - if self.hardforks.is_fork_active_at_block(fork.clone(), block_number) { - return *params - } - } - - bf_params.first().map(|(_, params)| *params).unwrap_or(BaseFeeParams::ethereum()) - } - } - } - /// Get the hash of the genesis block. pub fn genesis_hash(&self) -> B256 { self.genesis_header.hash() diff --git a/crates/ethereum/node/tests/e2e/rpc.rs b/crates/ethereum/node/tests/e2e/rpc.rs index ea49d8b3c8e..54339868948 100644 --- a/crates/ethereum/node/tests/e2e/rpc.rs +++ b/crates/ethereum/node/tests/e2e/rpc.rs @@ -61,10 +61,8 @@ async fn test_fee_history() -> eyre::Result<()> { let fee_history = provider.get_fee_history(10, 0_u64.into(), &[]).await?; let genesis_base_fee = chain_spec.initial_base_fee().unwrap() as u128; - let expected_first_base_fee = genesis_base_fee - - genesis_base_fee / chain_spec.base_fee_params_at_block(0).max_change_denominator; + assert_eq!(fee_history.base_fee_per_gas[0], genesis_base_fee); - assert_eq!(fee_history.base_fee_per_gas[1], expected_first_base_fee,); // Spend some gas let builder = GasWaster::deploy_builder(&provider, U256::from(500)).send().await?; @@ -74,7 +72,6 @@ async fn test_fee_history() -> eyre::Result<()> { let block = provider.get_block_by_number(1.into()).await?.unwrap(); assert_eq!(block.header.gas_used, receipt.gas_used,); - assert_eq!(block.header.base_fee_per_gas.unwrap(), expected_first_base_fee as u64); for _ in 0..100 { let _ = GasWaster::deploy_builder(&provider, U256::from(rng.random_range(0..1000))) diff --git a/crates/optimism/chainspec/src/lib.rs b/crates/optimism/chainspec/src/lib.rs index 44361c7abf5..dfc909dbd15 100644 --- a/crates/optimism/chainspec/src/lib.rs +++ b/crates/optimism/chainspec/src/lib.rs @@ -243,10 +243,6 @@ impl EthChainSpec for OpChainSpec { self.inner.chain() } - fn base_fee_params_at_block(&self, block_number: u64) -> BaseFeeParams { - self.inner.base_fee_params_at_block(block_number) - } - fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams { self.inner.base_fee_params_at_timestamp(timestamp) } diff --git a/examples/custom-node/src/chainspec.rs b/examples/custom-node/src/chainspec.rs index 5677d9fb576..244442dcc1b 100644 --- a/examples/custom-node/src/chainspec.rs +++ b/examples/custom-node/src/chainspec.rs @@ -50,13 +50,6 @@ impl Hardforks for CustomChainSpec { impl EthChainSpec for CustomChainSpec { type Header = CustomHeader; - fn base_fee_params_at_block( - &self, - block_number: u64, - ) -> reth_ethereum::chainspec::BaseFeeParams { - self.inner.base_fee_params_at_block(block_number) - } - fn blob_params_at_timestamp(&self, timestamp: u64) -> Option { self.inner.blob_params_at_timestamp(timestamp) } From dc20e5bc157c60b0c541ba1b72165c23c522cc36 Mon Sep 17 00:00:00 2001 From: Dharm Singh Date: Fri, 22 Aug 2025 02:04:53 +0530 Subject: [PATCH 5/6] remove fn --- crates/ethereum/node/tests/e2e/rpc.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/ethereum/node/tests/e2e/rpc.rs b/crates/ethereum/node/tests/e2e/rpc.rs index 54339868948..ee536016b53 100644 --- a/crates/ethereum/node/tests/e2e/rpc.rs +++ b/crates/ethereum/node/tests/e2e/rpc.rs @@ -61,9 +61,13 @@ async fn test_fee_history() -> eyre::Result<()> { let fee_history = provider.get_fee_history(10, 0_u64.into(), &[]).await?; let genesis_base_fee = chain_spec.initial_base_fee().unwrap() as u128; - + let expected_first_base_fee = genesis_base_fee - + genesis_base_fee / + chain_spec + .base_fee_params_at_timestamp(chain_spec.genesis_timestamp()) + .max_change_denominator; assert_eq!(fee_history.base_fee_per_gas[0], genesis_base_fee); - + assert_eq!(fee_history.base_fee_per_gas[1], expected_first_base_fee,); // Spend some gas let builder = GasWaster::deploy_builder(&provider, U256::from(500)).send().await?; node.advance_block().await?; @@ -72,6 +76,7 @@ async fn test_fee_history() -> eyre::Result<()> { let block = provider.get_block_by_number(1.into()).await?.unwrap(); assert_eq!(block.header.gas_used, receipt.gas_used,); + assert_eq!(block.header.base_fee_per_gas.unwrap(), expected_first_base_fee as u64); for _ in 0..100 { let _ = GasWaster::deploy_builder(&provider, U256::from(rng.random_range(0..1000))) From 1a052772e3a7a526322e5402b052c1e9a2f04db0 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Fri, 22 Aug 2025 09:43:38 +0200 Subject: [PATCH 6/6] order --- examples/custom-node/src/chainspec.rs | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/examples/custom-node/src/chainspec.rs b/examples/custom-node/src/chainspec.rs index e3301f83c31..4291b3549e4 100644 --- a/examples/custom-node/src/chainspec.rs +++ b/examples/custom-node/src/chainspec.rs @@ -50,6 +50,10 @@ impl Hardforks for CustomChainSpec { impl EthChainSpec for CustomChainSpec { type Header = CustomHeader; + fn chain(&self) -> reth_ethereum::chainspec::Chain { + self.inner.chain() + } + fn base_fee_params_at_timestamp( &self, timestamp: u64, @@ -61,36 +65,32 @@ impl EthChainSpec for CustomChainSpec { self.inner.blob_params_at_timestamp(timestamp) } - fn bootnodes(&self) -> Option> { - self.inner.bootnodes() + fn deposit_contract(&self) -> Option<&reth_ethereum::chainspec::DepositContract> { + self.inner.deposit_contract() } - fn chain(&self) -> reth_ethereum::chainspec::Chain { - self.inner.chain() + fn genesis_hash(&self) -> revm_primitives::B256 { + self.genesis_header.hash() } - fn deposit_contract(&self) -> Option<&reth_ethereum::chainspec::DepositContract> { - self.inner.deposit_contract() + fn prune_delete_limit(&self) -> usize { + self.inner.prune_delete_limit() } fn display_hardforks(&self) -> Box { self.inner.display_hardforks() } - fn prune_delete_limit(&self) -> usize { - self.inner.prune_delete_limit() + fn genesis_header(&self) -> &Self::Header { + &self.genesis_header } fn genesis(&self) -> &Genesis { self.inner.genesis() } - fn genesis_hash(&self) -> revm_primitives::B256 { - self.genesis_header.hash() - } - - fn genesis_header(&self) -> &Self::Header { - &self.genesis_header + fn bootnodes(&self) -> Option> { + self.inner.bootnodes() } fn final_paris_total_difficulty(&self) -> Option {