From ce4be7dd872d1aa87e370345bde213626412209d Mon Sep 17 00:00:00 2001 From: Xzavier Date: Fri, 6 Feb 2026 05:10:32 +0800 Subject: [PATCH] fix: support EIP-1559 params configuration for Optimism dev mode (#21855) --- crates/engine/local/src/payload.rs | 30 ++++++++++++++++--- .../ethereum/hardforks/src/hardforks/dev.rs | 1 + crates/optimism/chainspec/src/lib.rs | 8 +++++ crates/optimism/hardforks/src/lib.rs | 3 +- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/crates/engine/local/src/payload.rs b/crates/engine/local/src/payload.rs index 5555143096..1b0c9704c3 100644 --- a/crates/engine/local/src/payload.rs +++ b/crates/engine/local/src/payload.rs @@ -72,6 +72,9 @@ where &self, parent: &SealedHeader, ) -> op_alloy_rpc_types_engine::OpPayloadAttributes { + use alloy_primitives::B64; + use reth_chainspec::BaseFeeParams; + use std::env; /// Dummy system transaction for dev mode. /// OP Mainnet transaction at index 0 in block 124665056. /// @@ -80,14 +83,33 @@ where "7ef8f8a0683079df94aa5b9cf86687d739a60a9b4f0835e520ec4d664e2e415dca17a6df94deaddeaddeaddeaddeaddeaddeaddeaddead00019442000000000000000000000000000000000000158080830f424080b8a4440a5e200000146b000f79c500000000000000040000000066d052e700000000013ad8a3000000000000000000000000000000000000000000000000000000003ef1278700000000000000000000000000000000000000000000000000000000000000012fdf87b89884a61e74b322bbcf60386f543bfae7827725efaaf0ab1de2294a590000000000000000000000006887246668a3b87f54deb3b94ba47a6f63f32985" ); + // Configure EIP-1559 parameters for dev mode. These can be overridden via environment + // variables (OP_DEV_EIP1559_DENOMINATOR, OP_DEV_EIP1559_ELASTICITY, OP_DEV_GAS_LIMIT), + // otherwise defaults from Optimism's BaseFeeParams are used. The parameters are encoded + // as an 8-byte value (denominator + elasticity) required by Optimism's Jovian fork. + let default_eip_1559_params = BaseFeeParams::optimism(); + let denominator = env::var("OP_DEV_EIP1559_DENOMINATOR") + .ok() + .and_then(|v| v.parse::().ok()) + .unwrap_or(default_eip_1559_params.max_change_denominator as u32); + let elasticity = env::var("OP_DEV_EIP1559_ELASTICITY") + .ok() + .and_then(|v| v.parse::().ok()) + .unwrap_or(default_eip_1559_params.elasticity_multiplier as u32); + let gas_limit = env::var("OP_DEV_GAS_LIMIT").ok().and_then(|v| v.parse::().ok()); + + let mut eip1559_bytes = [0u8; 8]; + eip1559_bytes[0..4].copy_from_slice(&denominator.to_be_bytes()); + eip1559_bytes[4..8].copy_from_slice(&elasticity.to_be_bytes()); + let eip_1559_params = Some(B64::from(eip1559_bytes)); + op_alloy_rpc_types_engine::OpPayloadAttributes { payload_attributes: self.build(parent), - // Add dummy system transaction transactions: Some(vec![TX_SET_L1_BLOCK_OP_MAINNET_BLOCK_124665056.into()]), no_tx_pool: None, - gas_limit: None, - eip_1559_params: None, - min_base_fee: None, + gas_limit, + eip_1559_params, + min_base_fee: Some(0), } } } diff --git a/crates/ethereum/hardforks/src/hardforks/dev.rs b/crates/ethereum/hardforks/src/hardforks/dev.rs index b121a084de..edb3895320 100644 --- a/crates/ethereum/hardforks/src/hardforks/dev.rs +++ b/crates/ethereum/hardforks/src/hardforks/dev.rs @@ -35,5 +35,6 @@ pub static DEV_HARDFORKS: LazyLock = LazyLock::new(|| { (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0)), (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0)), (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0)), + (EthereumHardfork::Osaka.boxed(), ForkCondition::Timestamp(0)), ]) }); diff --git a/crates/optimism/chainspec/src/lib.rs b/crates/optimism/chainspec/src/lib.rs index a91102c4f8..e428916038 100644 --- a/crates/optimism/chainspec/src/lib.rs +++ b/crates/optimism/chainspec/src/lib.rs @@ -512,6 +512,14 @@ pub fn make_op_genesis_header(genesis: &Genesis, hardforks: &ChainHardforks) -> }))); } + // If Jovian is active at genesis, encode the base fee parameters in extra_data + if hardforks.fork(OpHardfork::Jovian).active_at_timestamp(header.timestamp) { + use op_alloy_consensus::encode_jovian_extra_data; + // Encode with empty nonce (8 zero bytes) + header.extra_data = + encode_jovian_extra_data([0u8; 8].into(), BaseFeeParams::optimism(), 0).unwrap(); + } + header } diff --git a/crates/optimism/hardforks/src/lib.rs b/crates/optimism/hardforks/src/lib.rs index 89ac0b2dc3..f299f7a964 100644 --- a/crates/optimism/hardforks/src/lib.rs +++ b/crates/optimism/hardforks/src/lib.rs @@ -32,7 +32,6 @@ use reth_ethereum_forks::{ChainHardforks, EthereumHardfork, ForkCondition, Hardf /// Dev hardforks pub static DEV_HARDFORKS: LazyLock = LazyLock::new(|| { - const JOVIAN_TIMESTAMP: ForkCondition = ForkCondition::Timestamp(1761840000); ChainHardforks::new(vec![ (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)), (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)), @@ -64,7 +63,7 @@ pub static DEV_HARDFORKS: LazyLock = LazyLock::new(|| { (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(0)), (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0)), (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(0)), - (OpHardfork::Jovian.boxed(), JOVIAN_TIMESTAMP), + (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(0)), ]) });