alloy_eips/eip1559/
basefee.rs1use 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#[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 #[cfg_attr(feature = "serde", serde(with = "alloy_serde::quantity"))]
22 pub max_change_denominator: u128,
23 #[cfg_attr(feature = "serde", serde(with = "alloy_serde::quantity"))]
25 pub elasticity_multiplier: u128,
26}
27
28impl BaseFeeParams {
29 pub const fn new(max_change_denominator: u128, elasticity_multiplier: u128) -> Self {
31 Self { max_change_denominator, elasticity_multiplier }
32 }
33
34 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 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 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 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 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 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 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 #[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}