Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion crates/engine-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ reth-rpc-api.workspace = true
# alloy
alloy-consensus.workspace = true
alloy-eips.workspace = true
alloy-hardforks.workspace = true
alloy-primitives.workspace = true
alloy-rpc-types-engine.workspace = true

Expand Down
33 changes: 18 additions & 15 deletions crates/engine-api/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@

use crate::{EngineApiResult, MorphEngineApiError, MorphL2EngineApi};
use alloy_consensus::{
BlockHeader, EMPTY_OMMER_ROOT_HASH, Header, constants::EMPTY_WITHDRAWALS,
proofs::calculate_transaction_root,
BlockHeader, EMPTY_OMMER_ROOT_HASH, Header, proofs::calculate_transaction_root,
};
use alloy_eips::eip2718::Decodable2718;
use alloy_hardforks::EthereumHardforks;
use alloy_primitives::{Address, B64, B256, Sealable};
use alloy_rpc_types_engine::PayloadAttributes;
use morph_chainspec::MorphChainSpec;
Expand Down Expand Up @@ -53,7 +51,7 @@ pub struct RealMorphL2EngineApi<Provider> {
engine_state_tracker: Arc<EngineStateTracker>,
}

#[derive(Debug, Clone, Copy)]
#[derive(Debug, Clone, Copy, PartialEq)]
struct InMemoryHead {
number: u64,
hash: B256,
Expand Down Expand Up @@ -698,10 +696,10 @@ impl<Provider> RealMorphL2EngineApi<Provider> {
Ok(header)
}

fn execution_payload_from_executable_data(
fn header_and_body_from_executable_data(
&self,
data: &ExecutableL2Data,
) -> EngineApiResult<(MorphExecutionData, MorphHeader)> {
) -> EngineApiResult<(MorphHeader, BlockBody)> {
let base_fee_per_gas = data
.base_fee_per_gas
.map(|fee| {
Expand Down Expand Up @@ -740,12 +738,6 @@ impl<Provider> RealMorphL2EngineApi<Provider> {
}

let logs_bloom = alloy_primitives::Bloom::from_slice(data.logs_bloom.as_ref());
let shanghai_active = self
.chain_spec
.is_shanghai_active_at_timestamp(data.timestamp);
let cancun_active = self
.chain_spec
.is_cancun_active_at_timestamp(data.timestamp);
// Override coinbase to empty address when FeeVault is enabled,
// matching go-ethereum's executableDataToBlock (l2_api.go:292-293).
let beneficiary = if self.chain_spec.is_fee_vault_enabled() {
Expand All @@ -762,7 +754,8 @@ impl<Provider> RealMorphL2EngineApi<Provider> {
state_root: data.state_root,
transactions_root: calculate_transaction_root(&txs),
receipts_root: data.receipts_root,
withdrawals_root: shanghai_active.then_some(EMPTY_WITHDRAWALS),
// Morph L2 has no withdrawals — always None, matching assemble path.
withdrawals_root: None,
logs_bloom,
difficulty: Default::default(),
number: data.number,
Expand All @@ -774,8 +767,9 @@ impl<Provider> RealMorphL2EngineApi<Provider> {
base_fee_per_gas,
extra_data: Default::default(),
parent_beacon_block_root: None,
blob_gas_used: cancun_active.then_some(0),
excess_blob_gas: cancun_active.then_some(0),
// Morph L2 has no blob transactions — always None, matching assemble path.
blob_gas_used: None,
excess_blob_gas: None,
requests_hash: None,
},
};
Expand All @@ -785,6 +779,15 @@ impl<Provider> RealMorphL2EngineApi<Provider> {
withdrawals: None,
};

Ok((header, body))
}

fn execution_payload_from_executable_data(
&self,
data: &ExecutableL2Data,
) -> EngineApiResult<(MorphExecutionData, MorphHeader)> {
let (header, body) = self.header_and_body_from_executable_data(data)?;

// Compute header hash once and verify against expected hash before
// constructing the sealed block. This avoids the clone + re-hash that
// seal_slow would perform, saving one keccak256 + one MorphHeader clone
Expand Down
3 changes: 2 additions & 1 deletion crates/evm/src/assemble.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ impl BlockAssembler<MorphEvmConfig> for MorphBlockAssembler {
withdrawals_root: None,
logs_bloom,
timestamp: timestamp.to(),
mix_hash: evm_env.block_env.prevrandao().unwrap_or_default(),
// Morph L2 keeps mix_hash fixed to zero, matching geth's L2 header shape.
mix_hash: Default::default(),
nonce: B64::ZERO,
// Only include base_fee_per_gas after London (EIP-1559)
base_fee_per_gas: is_london_active.then_some(evm_env.block_env.basefee()),
Expand Down
Loading