use alloy_eips::eip1559::BaseFeeParams;
use crate::{
BASE_MAINNET_CHAIN_ID, BASE_SEPOLIA_CHAIN_ID, OP_MAINNET_CHAIN_ID, OP_SEPOLIA_CHAIN_ID,
};
pub const OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR: u128 = 50;
pub const OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON: u128 = 250;
pub const OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER: u128 = 6;
pub const OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR: u128 = 50;
pub const OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON: u128 = 250;
pub const OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER: u128 = 6;
pub const BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER: u128 = 10;
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,
};
pub const BASE_SEPOLIA_BASE_FEE_PARAMS: BaseFeeParams = BaseFeeParams {
max_change_denominator: OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
elasticity_multiplier: BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
};
pub const OP_MAINNET_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,
};
pub const OP_SEPOLIA_BASE_FEE_PARAMS_CANYON: BaseFeeParams = BaseFeeParams {
max_change_denominator: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
elasticity_multiplier: OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
};
pub const BASE_SEPOLIA_BASE_FEE_PARAMS_CANYON: BaseFeeParams = BaseFeeParams {
max_change_denominator: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
elasticity_multiplier: BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
};
pub const OP_MAINNET_BASE_FEE_PARAMS_CANYON: BaseFeeParams = BaseFeeParams {
max_change_denominator: OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
elasticity_multiplier: OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
};
pub const fn base_fee_params(chain_id: u64) -> BaseFeeParams {
match chain_id {
OP_MAINNET_CHAIN_ID => OP_MAINNET_BASE_FEE_PARAMS,
OP_SEPOLIA_CHAIN_ID => OP_SEPOLIA_BASE_FEE_PARAMS,
BASE_MAINNET_CHAIN_ID => OP_MAINNET_BASE_FEE_PARAMS,
BASE_SEPOLIA_CHAIN_ID => BASE_SEPOLIA_BASE_FEE_PARAMS,
_ => OP_MAINNET_BASE_FEE_PARAMS,
}
}
pub const fn base_fee_params_canyon(chain_id: u64) -> BaseFeeParams {
match chain_id {
OP_MAINNET_CHAIN_ID => OP_MAINNET_BASE_FEE_PARAMS_CANYON,
OP_SEPOLIA_CHAIN_ID => OP_SEPOLIA_BASE_FEE_PARAMS_CANYON,
BASE_MAINNET_CHAIN_ID => OP_MAINNET_BASE_FEE_PARAMS_CANYON,
BASE_SEPOLIA_CHAIN_ID => BASE_SEPOLIA_BASE_FEE_PARAMS_CANYON,
_ => OP_MAINNET_BASE_FEE_PARAMS_CANYON,
}
}
pub const OP_SEPOLIA_BASE_FEE_CONFIG: BaseFeeConfig = BaseFeeConfig {
eip1559_elasticity: OP_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
eip1559_denominator: OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
eip1559_denominator_canyon: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
};
pub const BASE_SEPOLIA_BASE_FEE_CONFIG: BaseFeeConfig = BaseFeeConfig {
eip1559_elasticity: BASE_SEPOLIA_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
eip1559_denominator: OP_SEPOLIA_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
eip1559_denominator_canyon: OP_SEPOLIA_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
};
pub const OP_MAINNET_BASE_FEE_CONFIG: BaseFeeConfig = BaseFeeConfig {
eip1559_elasticity: OP_MAINNET_EIP1559_DEFAULT_ELASTICITY_MULTIPLIER,
eip1559_denominator: OP_MAINNET_EIP1559_DEFAULT_BASE_FEE_MAX_CHANGE_DENOMINATOR,
eip1559_denominator_canyon: OP_MAINNET_EIP1559_BASE_FEE_MAX_CHANGE_DENOMINATOR_CANYON,
};
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BaseFeeConfig {
#[cfg_attr(
feature = "serde",
serde(rename = "eip1559Elasticity", alias = "eip1559_elasticity")
)]
#[cfg_attr(feature = "serde", serde(with = "maili_serde::quantity"))]
pub eip1559_elasticity: u128,
#[cfg_attr(
feature = "serde",
serde(rename = "eip1559Denominator", alias = "eip1559_denominator")
)]
#[cfg_attr(feature = "serde", serde(with = "maili_serde::quantity"))]
pub eip1559_denominator: u128,
#[cfg_attr(
feature = "serde",
serde(rename = "eip1559DenominatorCanyon", alias = "eip1559_denominator_canyon")
)]
#[cfg_attr(feature = "serde", serde(with = "maili_serde::quantity"))]
pub eip1559_denominator_canyon: u128,
}
impl BaseFeeConfig {
pub const fn as_base_fee_params(&self) -> BaseFeeParams {
BaseFeeParams {
max_change_denominator: self.eip1559_denominator,
elasticity_multiplier: self.eip1559_elasticity,
}
}
pub const fn as_canyon_base_fee_params(&self) -> BaseFeeParams {
BaseFeeParams {
max_change_denominator: self.eip1559_denominator_canyon,
elasticity_multiplier: self.eip1559_elasticity,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_base_fee_params_from_chain_id() {
assert_eq!(base_fee_params(OP_MAINNET_CHAIN_ID), OP_MAINNET_BASE_FEE_PARAMS);
assert_eq!(base_fee_params(OP_SEPOLIA_CHAIN_ID), OP_SEPOLIA_BASE_FEE_PARAMS);
assert_eq!(base_fee_params(BASE_MAINNET_CHAIN_ID), OP_MAINNET_BASE_FEE_PARAMS);
assert_eq!(base_fee_params(BASE_SEPOLIA_CHAIN_ID), BASE_SEPOLIA_BASE_FEE_PARAMS);
assert_eq!(base_fee_params(0), OP_MAINNET_BASE_FEE_PARAMS);
}
#[test]
fn test_base_fee_params_canyon_from_chain_id() {
assert_eq!(base_fee_params_canyon(OP_MAINNET_CHAIN_ID), OP_MAINNET_BASE_FEE_PARAMS_CANYON);
assert_eq!(base_fee_params_canyon(OP_SEPOLIA_CHAIN_ID), OP_SEPOLIA_BASE_FEE_PARAMS_CANYON);
assert_eq!(
base_fee_params_canyon(BASE_MAINNET_CHAIN_ID),
OP_MAINNET_BASE_FEE_PARAMS_CANYON
);
assert_eq!(
base_fee_params_canyon(BASE_SEPOLIA_CHAIN_ID),
BASE_SEPOLIA_BASE_FEE_PARAMS_CANYON
);
assert_eq!(base_fee_params_canyon(0), OP_MAINNET_BASE_FEE_PARAMS_CANYON);
}
#[test]
#[cfg(feature = "serde")]
fn test_base_fee_config_ser() {
let config = OP_MAINNET_BASE_FEE_CONFIG;
let raw_str = serde_json::to_string(&config).unwrap();
assert_eq!(
raw_str,
r#"{"eip1559Elasticity":"0x6","eip1559Denominator":"0x32","eip1559DenominatorCanyon":"0xfa"}"#
);
}
#[test]
#[cfg(feature = "serde")]
fn test_base_fee_config_serde_strs() {
let raw_str: &'static str = r#"{"eip1559Elasticity":"6","eip1559Denominator":"50","eip1559DenominatorCanyon":"250"}"#;
let config: BaseFeeConfig = serde_json::from_str(raw_str).unwrap();
assert_eq!(config, OP_MAINNET_BASE_FEE_CONFIG);
}
#[test]
#[cfg(feature = "serde")]
fn test_base_fee_config_serde_raw_number() {
let raw_str: &'static str =
r#"{"eip1559Elasticity":6,"eip1559Denominator":50,"eip1559DenominatorCanyon":250}"#;
let config: BaseFeeConfig = serde_json::from_str(raw_str).unwrap();
assert_eq!(config, OP_MAINNET_BASE_FEE_CONFIG);
}
#[test]
#[cfg(feature = "serde")]
fn test_base_fee_config_serde_hex() {
let raw_str: &'static str = r#"{"eip1559Elasticity":"0x6","eip1559Denominator":"0x32","eip1559DenominatorCanyon":"0xfa"}"#;
let config: BaseFeeConfig = serde_json::from_str(raw_str).unwrap();
assert_eq!(config, OP_MAINNET_BASE_FEE_CONFIG);
}
}