diff --git a/bin/reth/src/args/rpc_server_args.rs b/bin/reth/src/args/rpc_server_args.rs index d05ce42b431..8159cce40f3 100644 --- a/bin/reth/src/args/rpc_server_args.rs +++ b/bin/reth/src/args/rpc_server_args.rs @@ -346,6 +346,7 @@ impl RpcServerArgs { ) -> Result where Provider: BlockReaderIdExt + + ChainSpecProvider + HeaderProvider + StateProviderFactory + EvmEnvProvider diff --git a/crates/consensus/auto-seal/src/lib.rs b/crates/consensus/auto-seal/src/lib.rs index 668a2117f6b..53a78eb8e84 100644 --- a/crates/consensus/auto-seal/src/lib.rs +++ b/crates/consensus/auto-seal/src/lib.rs @@ -246,10 +246,18 @@ impl StorageInner { /// Fills in pre-execution header fields based on the current best block and given /// transactions. - pub(crate) fn build_header_template(&self, transactions: &Vec) -> Header { + pub(crate) fn build_header_template( + &self, + transactions: &Vec, + chain_spec: Arc, + ) -> Header { // check previous block for base fee - let base_fee_per_gas = - self.headers.get(&self.best_block).and_then(|parent| parent.next_block_base_fee()); + let base_fee_per_gas = self.headers.get(&self.best_block).and_then(|parent| { + parent.next_block_base_fee( + chain_spec.elasticity_multiplier(), + chain_spec.base_fee_change_denominator(), + ) + }); let mut header = Header { parent_hash: self.best_hash, @@ -335,8 +343,9 @@ impl StorageInner { &mut self, transactions: Vec, executor: &mut Executor, + chain_spec: Arc, ) -> Result<(SealedHeader, PostState), BlockExecutionError> { - let header = self.build_header_template(&transactions); + let header = self.build_header_template(&transactions, chain_spec); let block = Block { header, body: transactions, ommers: vec![], withdrawals: None }; diff --git a/crates/consensus/auto-seal/src/task.rs b/crates/consensus/auto-seal/src/task.rs index 6d77784b1ad..9bba1fc188c 100644 --- a/crates/consensus/auto-seal/src/task.rs +++ b/crates/consensus/auto-seal/src/task.rs @@ -109,6 +109,7 @@ where let to_engine = this.to_engine.clone(); let client = this.client.clone(); let chain_spec = Arc::clone(&this.chain_spec); + let chain_spec2 = Arc::clone(&this.chain_spec); let pool = this.pool.clone(); let events = this.pipe_line_events.take(); let canon_state_notification = this.canon_state_notification.clone(); @@ -131,7 +132,11 @@ where let substate = SubState::new(State::new(client.latest().unwrap())); let mut executor = Executor::new(chain_spec, substate); - match storage.build_and_execute(transactions.clone(), &mut executor) { + match storage.build_and_execute( + transactions.clone(), + &mut executor, + chain_spec2, + ) { Ok((new_header, post_state)) => { // clear all transactions from pool pool.remove_transactions(transactions.iter().map(|tx| tx.hash())); diff --git a/crates/consensus/common/src/validation.rs b/crates/consensus/common/src/validation.rs index 5fffb7f2a2e..7d5dac072ea 100644 --- a/crates/consensus/common/src/validation.rs +++ b/crates/consensus/common/src/validation.rs @@ -294,7 +294,12 @@ pub fn validate_header_regarding_parent( constants::EIP1559_INITIAL_BASE_FEE } else { // This BaseFeeMissing will not happen as previous blocks are checked to have them. - parent.next_block_base_fee().ok_or(ConsensusError::BaseFeeMissing)? + parent + .next_block_base_fee( + chain_spec.base_fee_change_denominator(), + chain_spec.elasticity_multiplier(), + ) + .ok_or(ConsensusError::BaseFeeMissing)? }; if expected_base_fee != base_fee { return Err(ConsensusError::BaseFeeDiff { expected: expected_base_fee, got: base_fee }) diff --git a/crates/payload/builder/src/payload.rs b/crates/payload/builder/src/payload.rs index 83cfe75ec1e..1ea9ad44ea5 100644 --- a/crates/payload/builder/src/payload.rs +++ b/crates/payload/builder/src/payload.rs @@ -134,7 +134,14 @@ impl PayloadBuilderAttributes { prevrandao: Some(self.prev_randao), gas_limit: U256::from(parent.gas_limit), // calculate basefee based on parent block's gas usage - basefee: U256::from(parent.next_block_base_fee().unwrap_or_default()), + basefee: U256::from( + parent + .next_block_base_fee( + chain_spec.base_fee_change_denominator(), + chain_spec.elasticity_multiplier(), + ) + .unwrap_or_default(), + ), }; (cfg, block_env) diff --git a/crates/primitives/src/basefee.rs b/crates/primitives/src/basefee.rs index be60c3dcc4a..95f83aa4c79 100644 --- a/crates/primitives/src/basefee.rs +++ b/crates/primitives/src/basefee.rs @@ -1,10 +1,14 @@ //! Helpers for working with EIP-1559 base fee -use crate::constants; - /// Calculate base fee for next block. [EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md) spec -pub fn calculate_next_block_base_fee(gas_used: u64, gas_limit: u64, base_fee: u64) -> u64 { - let gas_target = gas_limit / constants::EIP1559_ELASTICITY_MULTIPLIER; +pub fn calculate_next_block_base_fee( + gas_used: u64, + gas_limit: u64, + base_fee: u64, + elasticity: u64, + change_denominator: u64, +) -> u64 { + let gas_target = gas_limit / elasticity; if gas_used == gas_target { return base_fee @@ -15,14 +19,14 @@ pub fn calculate_next_block_base_fee(gas_used: u64, gas_limit: u64, base_fee: u6 1, base_fee as u128 * gas_used_delta as u128 / gas_target as u128 / - constants::EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR as u128, + change_denominator as u128, ); base_fee + (base_fee_delta as u64) } else { let gas_used_delta = gas_target - gas_used; let base_fee_per_gas_delta = base_fee as u128 * gas_used_delta as u128 / gas_target as u128 / - constants::EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR as u128; + change_denominator as u128; base_fee.saturating_sub(base_fee_per_gas_delta as u64) } @@ -54,7 +58,13 @@ mod tests { for i in 0..base_fee.len() { assert_eq!( next_base_fee[i], - calculate_next_block_base_fee(gas_used[i], gas_limit[i], base_fee[i]) + calculate_next_block_base_fee( + gas_used[i], + gas_limit[i], + base_fee[i], + crate::constants::EIP1559_ELASTICITY_MULTIPLIER, + crate::constants::EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR, + ) ); } } diff --git a/crates/primitives/src/chain/spec.rs b/crates/primitives/src/chain/spec.rs index 86db32ba0db..952dc1387f8 100644 --- a/crates/primitives/src/chain/spec.rs +++ b/crates/primitives/src/chain/spec.rs @@ -201,7 +201,10 @@ pub static OP_GOERLI: Lazy> = Lazy::new(|| { ), (Hardfork::Regolith, ForkCondition::Timestamp(1679079600)), ]), - optimism: Some(OptimismConfig { eip_1559_elasticity: 10, eip_1559_denominator: 50 }), + optimism: Some(OptimismConfig { + eip_1559_elasticity: crate::constants::EIP1559_DEFAULT_OPTIMISM_ELASTICITY_MULTIPLIER, + eip_1559_denominator: crate::constants::EIP1559_DEFAULT_OPTIMISM_CHANGE_DENOMINATOR, + }), } .into() }); @@ -420,6 +423,30 @@ impl ChainSpec { ForkId { hash: forkhash, next: 0 } } + /// Return the configured EIP-1559 max base fee change denominator + pub fn base_fee_change_denominator(&self) -> u64 { + #[cfg(not(feature = "optimism"))] + { + crate::constants::EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR + } + #[cfg(feature = "optimism")] + { + self.optimism.as_ref().unwrap().eip_1559_denominator + } + } + + /// Return the configured EIP-1559 elasticity multiplier + pub fn elasticity_multiplier(&self) -> u64 { + #[cfg(not(feature = "optimism"))] + { + crate::constants::EIP1559_ELASTICITY_MULTIPLIER + } + #[cfg(feature = "optimism")] + { + self.optimism.as_ref().unwrap().eip_1559_elasticity + } + } + /// Build a chainspec using [`ChainSpecBuilder`] pub fn builder() -> ChainSpecBuilder { ChainSpecBuilder::default() diff --git a/crates/primitives/src/constants/mod.rs b/crates/primitives/src/constants/mod.rs index 6a5c5fefbeb..3bb07262bd4 100644 --- a/crates/primitives/src/constants/mod.rs +++ b/crates/primitives/src/constants/mod.rs @@ -37,11 +37,15 @@ pub const BEACON_NONCE: u64 = 0u64; /// See . pub const ETHEREUM_BLOCK_GAS_LIMIT: u64 = 30_000_000; -/// The minimal value the basefee can decrease to. +/// The minimum tx fee below which the txpool will reject the transaction. /// -/// The `BASE_FEE_MAX_CHANGE_DENOMINATOR` is `8`, or 12.5%. -/// Once the base fee has dropped to `7` WEI it cannot decrease further because 12.5% of 7 is less -/// than 1. +/// Configured to `7` WEI which is the lowest possible value of base fee under mainnet EIP-1559 +/// parameters. `BASE_FEE_MAX_CHANGE_DENOMINATOR` +/// is `8`, or 12.5%. Once the base fee has dropped to `7` WEI it cannot decrease further because +/// 12.5% of 7 is less than 1. +/// +/// Note that min base fee under different 1559 parameterizations (e.g. Optimism's) may differ, +/// but there's no signifant harm in leaving this setting as is. pub const MIN_PROTOCOL_BASE_FEE: u64 = 7; /// Same as [MIN_PROTOCOL_BASE_FEE] but as a U256. @@ -50,21 +54,19 @@ pub const MIN_PROTOCOL_BASE_FEE_U256: U256 = U256::from_limbs([7u64, 0, 0, 0]); /// Initial base fee as defined in [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) pub const EIP1559_INITIAL_BASE_FEE: u64 = 1_000_000_000; -/// Base fee max change denominator as defined in [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) -#[cfg(not(feature = "optimism"))] -pub const EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR: u64 = 8; - /// Elasticity multiplier as defined in [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) -#[cfg(not(feature = "optimism"))] pub const EIP1559_ELASTICITY_MULTIPLIER: u64 = 2; +/// Base fee max change denominator as defined in [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) +pub const EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR: u64 = 8; + /// Base fee max change denominator for Optimism. #[cfg(feature = "optimism")] -pub const EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR: u64 = 50; +pub const EIP1559_DEFAULT_OPTIMISM_CHANGE_DENOMINATOR: u64 = 50; /// Elasticity multiplier for Optimism. #[cfg(feature = "optimism")] -pub const EIP1559_ELASTICITY_MULTIPLIER: u64 = 10; +pub const EIP1559_DEFAULT_OPTIMISM_ELASTICITY_MULTIPLIER: u64 = 6; /// Multiplier for converting gwei to wei. pub const GWEI_TO_WEI: u64 = 1_000_000_000; diff --git a/crates/primitives/src/header.rs b/crates/primitives/src/header.rs index ba8e8f31deb..fb3c9e3cf22 100644 --- a/crates/primitives/src/header.rs +++ b/crates/primitives/src/header.rs @@ -166,8 +166,14 @@ impl Header { /// Calculate base fee for next block according to the EIP-1559 spec. /// /// Returns a `None` if no base fee is set, no EIP-1559 support - pub fn next_block_base_fee(&self) -> Option { - Some(calculate_next_block_base_fee(self.gas_used, self.gas_limit, self.base_fee_per_gas?)) + pub fn next_block_base_fee(&self, elasticity: u64, change_denominator: u64) -> Option { + Some(calculate_next_block_base_fee( + self.gas_used, + self.gas_limit, + self.base_fee_per_gas?, + elasticity, + change_denominator, + )) } /// Seal the header with a known hash. diff --git a/crates/rpc/rpc-builder/src/auth.rs b/crates/rpc/rpc-builder/src/auth.rs index 758713bbdeb..47fa98c891e 100644 --- a/crates/rpc/rpc-builder/src/auth.rs +++ b/crates/rpc/rpc-builder/src/auth.rs @@ -12,7 +12,8 @@ use jsonrpsee::{ }; use reth_network_api::{NetworkInfo, Peers}; use reth_provider::{ - BlockReaderIdExt, EvmEnvProvider, HeaderProvider, ReceiptProviderIdExt, StateProviderFactory, + BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, HeaderProvider, ReceiptProviderIdExt, + StateProviderFactory, }; use reth_rpc::{ eth::{cache::EthStateCache, gas_oracle::GasPriceOracle}, @@ -40,10 +41,11 @@ pub async fn launch( ) -> Result where Provider: BlockReaderIdExt - + ReceiptProviderIdExt + + ChainSpecProvider + + EvmEnvProvider + HeaderProvider + + ReceiptProviderIdExt + StateProviderFactory - + EvmEnvProvider + Clone + Unpin + 'static, @@ -85,6 +87,7 @@ pub async fn launch_with_eth_api( ) -> Result where Provider: BlockReaderIdExt + + ChainSpecProvider + HeaderProvider + StateProviderFactory + EvmEnvProvider diff --git a/crates/rpc/rpc/src/eth/api/block.rs b/crates/rpc/rpc/src/eth/api/block.rs index 1cb547e3153..ab297add711 100644 --- a/crates/rpc/rpc/src/eth/api/block.rs +++ b/crates/rpc/rpc/src/eth/api/block.rs @@ -9,13 +9,14 @@ use crate::{ }; use reth_network_api::NetworkInfo; use reth_primitives::{BlockId, BlockNumberOrTag, TransactionMeta}; -use reth_provider::{BlockReaderIdExt, EvmEnvProvider, StateProviderFactory}; +use reth_provider::{BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, StateProviderFactory}; use reth_rpc_types::{Block, Index, RichBlock, TransactionReceipt}; use reth_transaction_pool::TransactionPool; impl EthApi where - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Pool: TransactionPool + Clone + 'static, Network: NetworkInfo + Send + Sync + 'static, { diff --git a/crates/rpc/rpc/src/eth/api/call.rs b/crates/rpc/rpc/src/eth/api/call.rs index 29cbdcfc446..dd687e0a735 100644 --- a/crates/rpc/rpc/src/eth/api/call.rs +++ b/crates/rpc/rpc/src/eth/api/call.rs @@ -14,7 +14,9 @@ use crate::{ use ethers_core::utils::get_contract_address; use reth_network_api::NetworkInfo; use reth_primitives::{AccessList, BlockId, BlockNumberOrTag, Bytes, U256}; -use reth_provider::{BlockReaderIdExt, EvmEnvProvider, StateProvider, StateProviderFactory}; +use reth_provider::{ + BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, StateProvider, StateProviderFactory, +}; use reth_revm::{ access_list::AccessListInspector, database::{State, SubState}, @@ -34,7 +36,8 @@ const MIN_CREATE_GAS: u64 = 53_000u64; impl EthApi where Pool: TransactionPool + Clone + 'static, - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Network: NetworkInfo + Send + Sync + 'static, { /// Estimate gas needed for execution of the `request` at the [BlockId]. diff --git a/crates/rpc/rpc/src/eth/api/fees.rs b/crates/rpc/rpc/src/eth/api/fees.rs index 49b0291a119..52d16cb37eb 100644 --- a/crates/rpc/rpc/src/eth/api/fees.rs +++ b/crates/rpc/rpc/src/eth/api/fees.rs @@ -8,7 +8,7 @@ use reth_network_api::NetworkInfo; use reth_primitives::{ basefee::calculate_next_block_base_fee, BlockNumberOrTag, SealedHeader, U256, }; -use reth_provider::{BlockReaderIdExt, EvmEnvProvider, StateProviderFactory}; +use reth_provider::{BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, StateProviderFactory}; use reth_rpc_types::{FeeHistory, TxGasAndReward}; use reth_transaction_pool::TransactionPool; use tracing::debug; @@ -16,7 +16,8 @@ use tracing::debug; impl EthApi where Pool: TransactionPool + Clone + 'static, - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Network: NetworkInfo + Send + Sync + 'static, { /// Returns a suggestion for a gas price for legacy transactions. @@ -119,6 +120,8 @@ where last_header.gas_used, last_header.gas_limit, last_header.base_fee_per_gas.unwrap_or_default(), + self.provider().chain_spec().elasticity_multiplier(), + self.provider().chain_spec().base_fee_change_denominator(), ))); Ok(FeeHistory { diff --git a/crates/rpc/rpc/src/eth/api/mod.rs b/crates/rpc/rpc/src/eth/api/mod.rs index de5d12f8d10..5155bd19b81 100644 --- a/crates/rpc/rpc/src/eth/api/mod.rs +++ b/crates/rpc/rpc/src/eth/api/mod.rs @@ -16,7 +16,9 @@ use reth_network_api::NetworkInfo; use reth_primitives::{ Address, BlockId, BlockNumberOrTag, ChainInfo, SealedBlock, H256, U256, U64, }; -use reth_provider::{BlockReaderIdExt, EvmEnvProvider, StateProviderBox, StateProviderFactory}; +use reth_provider::{ + BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, StateProviderBox, StateProviderFactory, +}; use reth_rpc_types::{SyncInfo, SyncStatus}; use reth_tasks::{TaskSpawner, TokioTaskExecutor}; use reth_transaction_pool::TransactionPool; @@ -78,7 +80,7 @@ pub struct EthApi { impl EthApi where - Provider: BlockReaderIdExt, + Provider: BlockReaderIdExt + ChainSpecProvider, { /// Creates a new, shareable instance using the default tokio task spawner. pub fn new( @@ -188,7 +190,8 @@ where impl EthApi where - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, { /// Returns the state at the given [BlockId] enum. pub fn state_at_block_id(&self, at: BlockId) -> EthResult> { @@ -222,7 +225,8 @@ where impl EthApi where - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Pool: TransactionPool + Clone + 'static, Network: NetworkInfo + Send + Sync + 'static, { @@ -243,7 +247,10 @@ where // assumed child block is in the next slot latest.timestamp += 12; // base fee of the child block - latest.base_fee_per_gas = latest.next_block_base_fee(); + latest.base_fee_per_gas = latest.next_block_base_fee( + self.provider().chain_spec().elasticity_multiplier(), + self.provider().chain_spec().base_fee_change_denominator(), + ); PendingBlockEnvOrigin::DerivedFromLatest(latest) }; @@ -321,7 +328,8 @@ impl Clone for EthApi { impl EthApiSpec for EthApi where Pool: TransactionPool + Clone + 'static, - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Network: NetworkInfo + 'static, { /// Returns the current ethereum protocol version. diff --git a/crates/rpc/rpc/src/eth/api/server.rs b/crates/rpc/rpc/src/eth/api/server.rs index 1cca7addc90..6c121bded55 100644 --- a/crates/rpc/rpc/src/eth/api/server.rs +++ b/crates/rpc/rpc/src/eth/api/server.rs @@ -16,8 +16,8 @@ use reth_primitives::{ AccessListWithGasUsed, Address, BlockId, BlockNumberOrTag, Bytes, H256, H64, U256, U64, }; use reth_provider::{ - BlockIdReader, BlockReader, BlockReaderIdExt, EvmEnvProvider, HeaderProvider, - StateProviderFactory, + BlockIdReader, BlockReader, BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, + HeaderProvider, StateProviderFactory, }; use reth_rpc_api::EthApiServer; use reth_rpc_types::{ @@ -36,6 +36,7 @@ where Provider: BlockReader + BlockIdReader + BlockReaderIdExt + + ChainSpecProvider + HeaderProvider + StateProviderFactory + EvmEnvProvider @@ -398,12 +399,12 @@ mod tests { use reth_interfaces::test_utils::{generators, generators::Rng}; use reth_network_api::noop::NoopNetwork; use reth_primitives::{ - basefee::calculate_next_block_base_fee, constants::ETHEREUM_BLOCK_GAS_LIMIT, Block, - BlockNumberOrTag, Header, TransactionSigned, H256, U256, + constants::{self, ETHEREUM_BLOCK_GAS_LIMIT}, + Block, BlockNumberOrTag, Header, TransactionSigned, H256, U256, }; use reth_provider::{ - test_utils::{MockEthProvider, NoopProvider}, - BlockReader, BlockReaderIdExt, EvmEnvProvider, StateProviderFactory, + test_utils::NoopProvider, BlockReader, BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, + StateProviderFactory, }; use reth_rpc_api::EthApiServer; use reth_rpc_types::FeeHistory; @@ -412,6 +413,7 @@ mod tests { fn build_test_eth_api< P: BlockReaderIdExt + BlockReader + + ChainSpecProvider + EvmEnvProvider + StateProviderFactory + Unpin @@ -449,6 +451,10 @@ mod tests { /// Handler for: `eth_test_fee_history` // TODO: Split this into multiple tests, and add tests for percentiles. #[tokio::test] + // TODO(op-reth): fix this for optimism. currently the MockEthProvider uses + // a chain_spec for mainnet, but this test needs the Optimism config values + // to be specified. + #[cfg(not(feature = "optimism"))] async fn test_fee_history() { let mut rng = generators::rng(); @@ -460,7 +466,7 @@ mod tests { let mut gas_used_ratios = Vec::new(); let mut base_fees_per_gas = Vec::new(); let mut last_header = None; - let mock_provider = MockEthProvider::default(); + let mock_provider = reth_provider::test_utils::MockEthProvider::default(); for i in (0..block_count).rev() { let hash = H256::random(); @@ -521,11 +527,15 @@ mod tests { // Add final base fee (for the next block outside of the request) let last_header = last_header.unwrap(); - base_fees_per_gas.push(U256::from(calculate_next_block_base_fee( - last_header.gas_used, - last_header.gas_limit, - last_header.base_fee_per_gas.unwrap_or_default(), - ))); + base_fees_per_gas.push(U256::from( + reth_primitives::basefee::calculate_next_block_base_fee( + last_header.gas_used, + last_header.gas_limit, + last_header.base_fee_per_gas.unwrap_or_default(), + constants::EIP1559_ELASTICITY_MULTIPLIER, + constants::EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR, + ), + )); let eth_api = build_test_eth_api(mock_provider); diff --git a/crates/rpc/rpc/src/eth/api/state.rs b/crates/rpc/rpc/src/eth/api/state.rs index 0930bf0b6c5..d571440a16e 100644 --- a/crates/rpc/rpc/src/eth/api/state.rs +++ b/crates/rpc/rpc/src/eth/api/state.rs @@ -9,14 +9,16 @@ use reth_primitives::{ U256, }; use reth_provider::{ - AccountReader, BlockReaderIdExt, EvmEnvProvider, StateProvider, StateProviderFactory, + AccountReader, BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, StateProvider, + StateProviderFactory, }; use reth_rpc_types::{EIP1186AccountProofResponse, StorageProof}; use reth_transaction_pool::{PoolTransaction, TransactionPool}; impl EthApi where - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Pool: TransactionPool + Clone + 'static, Network: Send + Sync + 'static, { diff --git a/crates/rpc/rpc/src/eth/api/transactions.rs b/crates/rpc/rpc/src/eth/api/transactions.rs index 514d436b3ab..1cd9a8fa5b0 100644 --- a/crates/rpc/rpc/src/eth/api/transactions.rs +++ b/crates/rpc/rpc/src/eth/api/transactions.rs @@ -19,7 +19,9 @@ use reth_primitives::{ TransactionKind::{Call, Create}, TransactionMeta, TransactionSigned, TransactionSignedEcRecovered, H256, U128, U256, U64, }; -use reth_provider::{BlockReaderIdExt, EvmEnvProvider, StateProviderBox, StateProviderFactory}; +use reth_provider::{ + BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, StateProviderBox, StateProviderFactory, +}; use reth_revm::{ database::{State, SubState}, env::{fill_block_env_with_coinbase, tx_env_with_recovered}, @@ -226,7 +228,8 @@ pub trait EthTransactions: Send + Sync { impl EthTransactions for EthApi where Pool: TransactionPool + Clone + 'static, - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Network: NetworkInfo + Send + Sync + 'static, { fn call_gas_limit(&self) -> u64 { @@ -638,7 +641,8 @@ where impl EthApi where - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Network: 'static, { /// Helper function for `eth_getTransactionReceipt` @@ -662,7 +666,8 @@ where impl EthApi where Pool: TransactionPool + 'static, - Provider: BlockReaderIdExt + StateProviderFactory + EvmEnvProvider + 'static, + Provider: + BlockReaderIdExt + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, Network: NetworkInfo + Send + Sync + 'static, { pub(crate) fn sign_request( diff --git a/crates/storage/provider/src/test_utils/mock.rs b/crates/storage/provider/src/test_utils/mock.rs index d679a7ed544..ccb39f6c97b 100644 --- a/crates/storage/provider/src/test_utils/mock.rs +++ b/crates/storage/provider/src/test_utils/mock.rs @@ -1,18 +1,18 @@ use crate::{ traits::{BlockSource, ReceiptProvider}, AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, - EvmEnvProvider, HeaderProvider, PostState, PostStateDataProvider, ReceiptProviderIdExt, - StateProvider, StateProviderBox, StateProviderFactory, StateRootProvider, TransactionsProvider, - WithdrawalsProvider, + ChainSpecProvider, EvmEnvProvider, HeaderProvider, PostState, PostStateDataProvider, + ReceiptProviderIdExt, StateProvider, StateProviderBox, StateProviderFactory, StateRootProvider, + TransactionsProvider, WithdrawalsProvider, }; use parking_lot::Mutex; use reth_db::models::StoredBlockBodyIndices; use reth_interfaces::{provider::ProviderError, Result}; use reth_primitives::{ keccak256, Account, Address, Block, BlockHash, BlockHashOrNumber, BlockId, BlockNumber, - BlockWithSenders, Bytecode, Bytes, ChainInfo, Header, Receipt, SealedBlock, SealedHeader, - StorageKey, StorageValue, TransactionMeta, TransactionSigned, TransactionSignedNoHash, TxHash, - TxNumber, H256, U256, + BlockWithSenders, Bytecode, Bytes, ChainInfo, ChainSpec, Header, Receipt, SealedBlock, + SealedHeader, StorageKey, StorageValue, TransactionMeta, TransactionSigned, + TransactionSignedNoHash, TxHash, TxNumber, H256, U256, }; use reth_revm_primitives::primitives::{BlockEnv, CfgEnv}; use std::{ @@ -22,7 +22,7 @@ use std::{ }; /// A mock implementation for Provider interfaces. -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone)] pub struct MockEthProvider { /// Local block store pub blocks: Arc>>, @@ -30,6 +30,19 @@ pub struct MockEthProvider { pub headers: Arc>>, /// Local account store pub accounts: Arc>>, + /// Local chain spec + pub chain_spec: Arc, +} + +impl Default for MockEthProvider { + fn default() -> MockEthProvider { + MockEthProvider { + blocks: Default::default(), + headers: Default::default(), + accounts: Default::default(), + chain_spec: Arc::new(reth_primitives::ChainSpecBuilder::mainnet().build()), + } + } } /// An extended account for local store @@ -160,6 +173,12 @@ impl HeaderProvider for MockEthProvider { } } +impl ChainSpecProvider for MockEthProvider { + fn chain_spec(&self) -> Arc { + self.chain_spec.clone() + } +} + impl TransactionsProvider for MockEthProvider { fn transaction_id(&self, _tx_hash: TxHash) -> Result> { todo!() diff --git a/crates/transaction-pool/src/lib.rs b/crates/transaction-pool/src/lib.rs index d4c25f047e7..29b84670726 100644 --- a/crates/transaction-pool/src/lib.rs +++ b/crates/transaction-pool/src/lib.rs @@ -93,10 +93,10 @@ //! //! ``` //! use reth_primitives::MAINNET; -//! use reth_provider::StateProviderFactory; +//! use reth_provider::{ChainSpecProvider, StateProviderFactory}; //! use reth_tasks::TokioTaskExecutor; //! use reth_transaction_pool::{EthTransactionValidator, Pool, TransactionPool}; -//! async fn t(client: C) where C: StateProviderFactory + Clone + 'static{ +//! async fn t(client: C) where C: StateProviderFactory + ChainSpecProvider + Clone + 'static{ //! let pool = Pool::eth_pool( //! EthTransactionValidator::new(client, MAINNET.clone(), TokioTaskExecutor::default()), //! Default::default(), @@ -118,12 +118,12 @@ //! ``` //! use futures_util::Stream; //! use reth_primitives::MAINNET; -//! use reth_provider::{BlockReaderIdExt, CanonStateNotification, StateProviderFactory}; +//! use reth_provider::{BlockReaderIdExt, CanonStateNotification, ChainSpecProvider, StateProviderFactory}; //! use reth_tasks::TokioTaskExecutor; //! use reth_transaction_pool::{EthTransactionValidator, Pool}; //! use reth_transaction_pool::maintain::maintain_transaction_pool_future; //! async fn t(client: C, stream: St) -//! where C: StateProviderFactory + BlockReaderIdExt + Clone + 'static, +//! where C: StateProviderFactory + BlockReaderIdExt + ChainSpecProvider + Clone + 'static, //! St: Stream + Send + Unpin + 'static, //! { //! let pool = Pool::eth_pool( diff --git a/crates/transaction-pool/src/maintain.rs b/crates/transaction-pool/src/maintain.rs index 22cc62ddaab..55034b8d317 100644 --- a/crates/transaction-pool/src/maintain.rs +++ b/crates/transaction-pool/src/maintain.rs @@ -10,7 +10,9 @@ use futures_util::{ FutureExt, Stream, StreamExt, }; use reth_primitives::{Address, BlockHash, BlockNumberOrTag, FromRecoveredTransaction}; -use reth_provider::{BlockReaderIdExt, CanonStateNotification, PostState, StateProviderFactory}; +use reth_provider::{ + BlockReaderIdExt, CanonStateNotification, ChainSpecProvider, PostState, StateProviderFactory, +}; use reth_tasks::TaskSpawner; use std::{ borrow::Borrow, @@ -49,7 +51,7 @@ pub fn maintain_transaction_pool_future( config: MaintainPoolConfig, ) -> BoxFuture<'static, ()> where - Client: StateProviderFactory + BlockReaderIdExt + Clone + Send + 'static, + Client: StateProviderFactory + BlockReaderIdExt + ChainSpecProvider + Clone + Send + 'static, P: TransactionPoolExt + 'static, St: Stream + Send + Unpin + 'static, Tasks: TaskSpawner + 'static, @@ -70,7 +72,7 @@ pub async fn maintain_transaction_pool( task_spawner: Tasks, config: MaintainPoolConfig, ) where - Client: StateProviderFactory + BlockReaderIdExt + Clone + Send + 'static, + Client: StateProviderFactory + ChainSpecProvider + BlockReaderIdExt + Clone + Send + 'static, P: TransactionPoolExt + 'static, St: Stream + Send + Unpin + 'static, Tasks: TaskSpawner + 'static, @@ -83,7 +85,12 @@ pub async fn maintain_transaction_pool( let info = BlockInfo { last_seen_block_hash: latest.hash, last_seen_block_number: latest.number, - pending_basefee: latest.next_block_base_fee().unwrap_or_default(), + pending_basefee: latest + .next_block_base_fee( + client.chain_spec().elasticity_multiplier(), + client.chain_spec().base_fee_change_denominator(), + ) + .unwrap_or_default(), }; pool.set_block_info(info); } @@ -205,7 +212,12 @@ pub async fn maintain_transaction_pool( } // base fee for the next block: `new_tip+1` - let pending_block_base_fee = new_tip.next_block_base_fee().unwrap_or_default(); + let pending_block_base_fee = new_tip + .next_block_base_fee( + client.chain_spec().elasticity_multiplier(), + client.chain_spec().base_fee_change_denominator(), + ) + .unwrap_or_default(); // we know all changed account in the new chain let new_changed_accounts: HashSet<_> = @@ -281,7 +293,12 @@ pub async fn maintain_transaction_pool( let tip = blocks.tip(); // base fee for the next block: `tip+1` - let pending_block_base_fee = tip.next_block_base_fee().unwrap_or_default(); + let pending_block_base_fee = tip + .next_block_base_fee( + client.chain_spec().elasticity_multiplier(), + client.chain_spec().base_fee_change_denominator(), + ) + .unwrap_or_default(); let first_block = blocks.first(); trace!(