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))]
19#[cfg_attr(feature = "borsh", derive(borsh::BorshSerialize, borsh::BorshDeserialize))]
20pub struct BaseFeeParams {
21 #[cfg_attr(feature = "serde", serde(with = "alloy_serde::quantity"))]
23 pub max_change_denominator: u128,
24 #[cfg_attr(feature = "serde", serde(with = "alloy_serde::quantity"))]
26 pub elasticity_multiplier: u128,
27}
28
29impl BaseFeeParams {
30 pub const fn new(max_change_denominator: u128, elasticity_multiplier: u128) -> Self {
32 Self { max_change_denominator, elasticity_multiplier }
33 }
34
35 pub const fn ethereum() -> Self {
37 Self {
38 max_change_denominator: DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR as u128,
39 elasticity_multiplier: DEFAULT_ELASTICITY_MULTIPLIER as u128,
40 }
41 }
42
43 pub const fn optimism() -> Self {
45 Self {
46 max_change_denominator: OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
47 elasticity_multiplier: OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
48 }
49 }
50
51 pub const fn optimism_canyon() -> Self {
53 Self {
54 max_change_denominator: OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
55 elasticity_multiplier: OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
56 }
57 }
58
59 pub const fn optimism_sepolia() -> Self {
61 Self {
62 max_change_denominator: OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
63 elasticity_multiplier: OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
64 }
65 }
66
67 pub const fn optimism_sepolia_canyon() -> Self {
69 Self {
70 max_change_denominator: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
71 elasticity_multiplier: OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
72 }
73 }
74
75 pub const fn base_sepolia() -> Self {
77 Self {
78 max_change_denominator: OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
79 elasticity_multiplier: BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
80 }
81 }
82
83 pub const fn base_sepolia_canyon() -> Self {
85 Self {
86 max_change_denominator: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
87 elasticity_multiplier: BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
88 }
89 }
90
91 #[inline]
95 pub fn next_block_base_fee(self, gas_used: u64, gas_limit: u64, base_fee: u64) -> u64 {
96 calc_next_block_base_fee(gas_used, gas_limit, base_fee, self)
97 }
98}
99
100#[cfg(test)]
101mod tests {
102 use super::*;
103 use arbitrary::Arbitrary;
104 use rand::Rng;
105
106 #[test]
107 fn test_arbitrary_base_fee_params() {
108 let mut bytes = [0u8; 1024];
109 rand::thread_rng().fill(bytes.as_mut_slice());
110 BaseFeeParams::arbitrary(&mut arbitrary::Unstructured::new(&bytes)).unwrap();
111 }
112}