alloy_eips/eip1559/
basefee.rs

1use crate::{
2    calc_next_block_base_fee,
3    eip1559::constants::{
4        BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
5        DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR, DEFAULT_ELASTICITY_MULTIPLIER,
6        OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
7        OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
8        OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
9        OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
10        OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
11        OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
12    },
13};
14
15/// BaseFeeParams contains the config parameters that control block base fee computation
16#[derive(Clone, Copy, Debug, PartialEq, Eq)]
17#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
18#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19pub struct BaseFeeParams {
20    /// The base_fee_max_change_denominator from EIP-1559
21    #[cfg_attr(feature = "serde", serde(with = "alloy_serde::quantity"))]
22    pub max_change_denominator: u128,
23    /// The elasticity multiplier from EIP-1559
24    #[cfg_attr(feature = "serde", serde(with = "alloy_serde::quantity"))]
25    pub elasticity_multiplier: u128,
26}
27
28impl BaseFeeParams {
29    /// Create a new BaseFeeParams
30    pub const fn new(max_change_denominator: u128, elasticity_multiplier: u128) -> Self {
31        Self { max_change_denominator, elasticity_multiplier }
32    }
33
34    /// Get the base fee parameters for Ethereum mainnet
35    pub const fn ethereum() -> Self {
36        Self {
37            max_change_denominator: DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR as u128,
38            elasticity_multiplier: DEFAULT_ELASTICITY_MULTIPLIER as u128,
39        }
40    }
41
42    /// Get the base fee parameters for Optimism Mainnet
43    pub const fn optimism() -> Self {
44        Self {
45            max_change_denominator: OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
46            elasticity_multiplier: OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
47        }
48    }
49
50    /// Get the base fee parameters for Optimism Mainnet (post Canyon)
51    pub const fn optimism_canyon() -> Self {
52        Self {
53            max_change_denominator: OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
54            elasticity_multiplier: OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
55        }
56    }
57
58    /// Get the base fee parameters for Optimism Sepolia
59    pub const fn optimism_sepolia() -> Self {
60        Self {
61            max_change_denominator: OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
62            elasticity_multiplier: OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
63        }
64    }
65
66    /// Get the base fee parameters for Optimism Sepolia (post Canyon)
67    pub const fn optimism_sepolia_canyon() -> Self {
68        Self {
69            max_change_denominator: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
70            elasticity_multiplier: OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
71        }
72    }
73
74    /// Get the base fee parameters for Base Sepolia
75    pub const fn base_sepolia() -> Self {
76        Self {
77            max_change_denominator: OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
78            elasticity_multiplier: BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
79        }
80    }
81
82    /// Get the base fee parameters for Base Sepolia (post Canyon)
83    pub const fn base_sepolia_canyon() -> Self {
84        Self {
85            max_change_denominator: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
86            elasticity_multiplier: BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
87        }
88    }
89
90    /// Calculate the base fee for the next block based on the EIP-1559 specification.
91    ///
92    /// See also [calc_next_block_base_fee]
93    #[inline]
94    pub fn next_block_base_fee(self, gas_used: u64, gas_limit: u64, base_fee: u64) -> u64 {
95        calc_next_block_base_fee(gas_used, gas_limit, base_fee, self)
96    }
97}
98
99#[cfg(test)]
100mod tests {
101    use super::*;
102    use arbitrary::Arbitrary;
103    use rand::Rng;
104
105    #[test]
106    fn test_arbitrary_base_fee_params() {
107        let mut bytes = [0u8; 1024];
108        rand::thread_rng().fill(bytes.as_mut_slice());
109        BaseFeeParams::arbitrary(&mut arbitrary::Unstructured::new(&bytes)).unwrap();
110    }
111}