use alloy's BaseFeeParams (2) (#7617)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
Rodrigo Herrera
2024-04-13 07:02:15 -06:00
committed by GitHub
parent 987e597442
commit 96e3619ea9
5 changed files with 68 additions and 87 deletions

View File

@@ -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,
)
);
}

View File

@@ -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.

View File

@@ -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<Arc<ChainSpec>> = Lazy::new(|| {
ChainSpec {
@@ -284,8 +289,8 @@ pub static OP_MAINNET: Lazy<Arc<ChainSpec>> = 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<Arc<ChainSpec>> = 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<Arc<ChainSpec>> = 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<Arc<ChainSpec>> = 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<Vec<(Hardfork, BaseFeeParams)>> 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:

View File

@@ -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;

View File

@@ -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
};