From 96e3619ea9a7aada54eac442fda7be95ad56a701 Mon Sep 17 00:00:00 2001 From: Rodrigo Herrera Date: Sat, 13 Apr 2024 07:02:15 -0600 Subject: [PATCH] use alloy's BaseFeeParams (2) (#7617) Co-authored-by: Matthias Seitz --- crates/primitives/src/basefee.rs | 13 ++-- crates/primitives/src/chain/mod.rs | 4 ++ crates/primitives/src/chain/spec.rs | 92 +++++--------------------- crates/primitives/src/constants/mod.rs | 43 ++++++++++-- crates/primitives/src/header.rs | 3 +- 5 files changed, 68 insertions(+), 87 deletions(-) diff --git a/crates/primitives/src/basefee.rs b/crates/primitives/src/basefee.rs index b414bb36ac..442cb66409 100644 --- a/crates/primitives/src/basefee.rs +++ b/crates/primitives/src/basefee.rs @@ -30,7 +30,7 @@ pub fn calculate_next_block_base_fee( base_fee_params: crate::BaseFeeParams, ) -> u64 { // Calculate the target gas by dividing the gas limit by the elasticity multiplier. - let gas_target = gas_limit / base_fee_params.elasticity_multiplier; + let gas_target = gas_limit / base_fee_params.elasticity_multiplier as u64; match gas_used.cmp(&gas_target) { // If the gas used in the current block is equal to the gas target, the base fee remains the @@ -45,7 +45,7 @@ pub fn calculate_next_block_base_fee( // Ensure a minimum increase of 1. 1, base_fee as u128 * (gas_used - gas_target) as u128 / - (gas_target as u128 * base_fee_params.max_change_denominator as u128), + (gas_target as u128 * base_fee_params.max_change_denominator), ) as u64) } // If the gas used in the current block is less than the gas target, calculate a new @@ -54,7 +54,7 @@ pub fn calculate_next_block_base_fee( // Calculate the decrease in base fee based on the formula defined by EIP-1559. base_fee.saturating_sub( (base_fee as u128 * (gas_target - gas_used) as u128 / - (gas_target as u128 * base_fee_params.max_change_denominator as u128)) + (gas_target as u128 * base_fee_params.max_change_denominator)) as u64, ) } @@ -65,6 +65,9 @@ pub fn calculate_next_block_base_fee( mod tests { use super::*; + #[cfg(feature = "optimism")] + use crate::chain::{OP_BASE_FEE_PARAMS, OP_SEPOLIA_BASE_FEE_PARAMS}; + #[test] fn calculate_base_fee_success() { let base_fee = [ @@ -124,7 +127,7 @@ mod tests { gas_used[i], gas_limit[i], base_fee[i], - crate::BaseFeeParams::optimism(), + OP_BASE_FEE_PARAMS, ) ); } @@ -157,7 +160,7 @@ mod tests { gas_used[i], gas_limit[i], base_fee[i], - crate::BaseFeeParams::optimism_sepolia(), + OP_SEPOLIA_BASE_FEE_PARAMS, ) ); } diff --git a/crates/primitives/src/chain/mod.rs b/crates/primitives/src/chain/mod.rs index 6f9673e719..f8425f95e6 100644 --- a/crates/primitives/src/chain/mod.rs +++ b/crates/primitives/src/chain/mod.rs @@ -8,6 +8,10 @@ pub use spec::{ #[cfg(feature = "optimism")] pub use spec::{BASE_MAINNET, BASE_SEPOLIA, OP_MAINNET, OP_SEPOLIA}; +#[cfg(feature = "optimism")] +#[cfg(test)] +pub(crate) use spec::{OP_BASE_FEE_PARAMS, OP_SEPOLIA_BASE_FEE_PARAMS}; + // The chain spec module. mod spec; // The chain info module. diff --git a/crates/primitives/src/chain/spec.rs b/crates/primitives/src/chain/spec.rs index 32d3b2ad84..160eddf9df 100644 --- a/crates/primitives/src/chain/spec.rs +++ b/crates/primitives/src/chain/spec.rs @@ -1,8 +1,5 @@ use crate::{ - constants::{ - EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR, EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, - EIP1559_INITIAL_BASE_FEE, EMPTY_RECEIPTS, EMPTY_TRANSACTIONS, EMPTY_WITHDRAWALS, - }, + constants::{EIP1559_INITIAL_BASE_FEE, EMPTY_RECEIPTS, EMPTY_TRANSACTIONS, EMPTY_WITHDRAWALS}, holesky_nodes, net::{goerli_nodes, mainnet_nodes, sepolia_nodes}, proofs::state_root_ref_unhashed, @@ -18,6 +15,14 @@ use std::{ sync::Arc, }; +pub use alloy_eips::eip1559::BaseFeeParams; + +#[cfg(feature = "optimism")] +pub(crate) use crate::constants::{ + OP_BASE_FEE_PARAMS, OP_CANYON_BASE_FEE_PARAMS, OP_SEPOLIA_BASE_FEE_PARAMS, + OP_SEPOLIA_CANYON_BASE_FEE_PARAMS, +}; + /// The Ethereum mainnet spec pub static MAINNET: Lazy> = Lazy::new(|| { ChainSpec { @@ -284,8 +289,8 @@ pub static OP_MAINNET: Lazy> = Lazy::new(|| { ]), base_fee_params: BaseFeeParamsKind::Variable( vec![ - (Hardfork::London, BaseFeeParams::optimism()), - (Hardfork::Canyon, BaseFeeParams::optimism_canyon()), + (Hardfork::London, OP_BASE_FEE_PARAMS), + (Hardfork::Canyon, OP_CANYON_BASE_FEE_PARAMS), ] .into(), ), @@ -338,8 +343,8 @@ pub static OP_SEPOLIA: Lazy> = Lazy::new(|| { ]), base_fee_params: BaseFeeParamsKind::Variable( vec![ - (Hardfork::London, BaseFeeParams::optimism_sepolia()), - (Hardfork::Canyon, BaseFeeParams::optimism_sepolia_canyon()), + (Hardfork::London, OP_SEPOLIA_BASE_FEE_PARAMS), + (Hardfork::Canyon, OP_SEPOLIA_CANYON_BASE_FEE_PARAMS), ] .into(), ), @@ -392,8 +397,8 @@ pub static BASE_SEPOLIA: Lazy> = Lazy::new(|| { ]), base_fee_params: BaseFeeParamsKind::Variable( vec![ - (Hardfork::London, BaseFeeParams::optimism_sepolia()), - (Hardfork::Canyon, BaseFeeParams::optimism_sepolia_canyon()), + (Hardfork::London, OP_SEPOLIA_BASE_FEE_PARAMS), + (Hardfork::Canyon, OP_SEPOLIA_CANYON_BASE_FEE_PARAMS), ] .into(), ), @@ -446,8 +451,8 @@ pub static BASE_MAINNET: Lazy> = Lazy::new(|| { ]), base_fee_params: BaseFeeParamsKind::Variable( vec![ - (Hardfork::London, BaseFeeParams::optimism()), - (Hardfork::Canyon, BaseFeeParams::optimism_canyon()), + (Hardfork::London, OP_BASE_FEE_PARAMS), + (Hardfork::Canyon, OP_CANYON_BASE_FEE_PARAMS), ] .into(), ), @@ -492,69 +497,6 @@ impl From> for ForkBaseFeeParams { } } -/// BaseFeeParams contains the config parameters that control block base fee computation -#[derive(Serialize, Deserialize, Debug, Copy, Clone, PartialEq, Eq)] -pub struct BaseFeeParams { - /// The base_fee_max_change_denominator from EIP-1559 - pub max_change_denominator: u64, - /// The elasticity multiplier from EIP-1559 - pub elasticity_multiplier: u64, -} - -impl BaseFeeParams { - /// Get the base fee parameters for Ethereum mainnet - pub const fn ethereum() -> BaseFeeParams { - BaseFeeParams { - max_change_denominator: EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR, - elasticity_multiplier: EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, - } - } - - /// Get the base fee parameters for optimism sepolia - #[cfg(feature = "optimism")] - pub const fn optimism_sepolia() -> BaseFeeParams { - BaseFeeParams { - max_change_denominator: - crate::constants::OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR, - elasticity_multiplier: - crate::constants::OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, - } - } - - /// Get the base fee parameters for optimism sepolia (post Canyon) - #[cfg(feature = "optimism")] - pub const fn optimism_sepolia_canyon() -> BaseFeeParams { - BaseFeeParams { - max_change_denominator: - crate::constants::OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON, - elasticity_multiplier: - crate::constants::OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, - } - } - - /// Get the base fee parameters for optimism mainnet - #[cfg(feature = "optimism")] - pub const fn optimism() -> BaseFeeParams { - BaseFeeParams { - max_change_denominator: - crate::constants::OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR, - elasticity_multiplier: - crate::constants::OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, - } - } - - /// Get the base fee parameters for optimism mainnet (post Canyon) - #[cfg(feature = "optimism")] - pub const fn optimism_canyon() -> BaseFeeParams { - BaseFeeParams { - max_change_denominator: - crate::constants::OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON, - elasticity_multiplier: - crate::constants::OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, - } - } -} - /// An Ethereum chain specification. /// /// A chain specification describes: diff --git a/crates/primitives/src/constants/mod.rs b/crates/primitives/src/constants/mod.rs index 18a41168fd..4fc0aadfe9 100644 --- a/crates/primitives/src/constants/mod.rs +++ b/crates/primitives/src/constants/mod.rs @@ -6,6 +6,9 @@ use crate::{ }; use std::time::Duration; +#[cfg(feature = "optimism")] +use crate::chain::BaseFeeParams; + /// [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844#parameters) constants. pub mod eip4844; @@ -67,32 +70,60 @@ pub const MINIMUM_GAS_LIMIT: u64 = 5000; /// Base fee max change denominator for Optimism Mainnet as defined in the Optimism /// [transaction costs](https://community.optimism.io/docs/developers/build/differences/#transaction-costs) doc. #[cfg(feature = "optimism")] -pub const OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR: u64 = 50; +pub const OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR: u128 = 50; /// Base fee max change denominator for Optimism Mainnet as defined in the Optimism Canyon /// hardfork. #[cfg(feature = "optimism")] -pub const OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON: u64 = 250; +pub const OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON: u128 = 250; /// Base fee max change denominator for Optimism Mainnet as defined in the Optimism /// [transaction costs](https://community.optimism.io/docs/developers/build/differences/#transaction-costs) doc. #[cfg(feature = "optimism")] -pub const OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER: u64 = 6; +pub const OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER: u128 = 6; /// Base fee max change denominator for Optimism Sepolia as defined in the Optimism /// [transaction costs](https://community.optimism.io/docs/developers/build/differences/#transaction-costs) doc. #[cfg(feature = "optimism")] -pub const OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR: u64 = 50; +pub const OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR: u128 = 50; /// Base fee max change denominator for Optimism Sepolia as defined in the Optimism Canyon /// hardfork. #[cfg(feature = "optimism")] -pub const OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON: u64 = 250; +pub const OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON: u128 = 250; /// Base fee max change denominator for Optimism Sepolia as defined in the Optimism /// [transaction costs](https://community.optimism.io/docs/developers/build/differences/#transaction-costs) doc. #[cfg(feature = "optimism")] -pub const OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER: u64 = 10; +pub const OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER: u128 = 10; + +/// Get the base fee parameters for Optimism Sepolia. +#[cfg(feature = "optimism")] +pub const OP_SEPOLIA_BASE_FEE_PARAMS: BaseFeeParams = BaseFeeParams { + max_change_denominator: OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR, + elasticity_multiplier: OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, +}; + +/// Get the base fee parameters for Optimism Sepolia (post Canyon). +#[cfg(feature = "optimism")] +pub const OP_SEPOLIA_CANYON_BASE_FEE_PARAMS: BaseFeeParams = BaseFeeParams { + max_change_denominator: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON, + elasticity_multiplier: OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, +}; + +/// Get the base fee parameters for Optimism Mainnet. +#[cfg(feature = "optimism")] +pub const OP_BASE_FEE_PARAMS: BaseFeeParams = BaseFeeParams { + max_change_denominator: OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR, + elasticity_multiplier: OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, +}; + +/// Get the base fee parameters for Optimism Mainnet (post Canyon). +#[cfg(feature = "optimism")] +pub const OP_CANYON_BASE_FEE_PARAMS: BaseFeeParams = BaseFeeParams { + max_change_denominator: OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON, + elasticity_multiplier: OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER, +}; /// 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 e436fb6734..0516d32271 100644 --- a/crates/primitives/src/header.rs +++ b/crates/primitives/src/header.rs @@ -654,7 +654,8 @@ impl SealedHeader { // Determine the parent gas limit, considering elasticity multiplier on the London fork. let parent_gas_limit = if chain_spec.fork(Hardfork::London).transitions_at_block(self.number) { - parent.gas_limit * chain_spec.base_fee_params(self.timestamp).elasticity_multiplier + parent.gas_limit * + chain_spec.base_fee_params(self.timestamp).elasticity_multiplier as u64 } else { parent.gas_limit };