From bdd695f1424870221d308ae73feabd3ea94cc764 Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Thu, 2 Apr 2026 06:52:36 +0000 Subject: [PATCH 1/2] fix(kona): remove obsolete replacement deposit tx from consolidation The interop spec no longer includes an "optimistic block deposited transaction" in deposit-only replacement blocks. The supernode already builds replacement blocks with only the original deposit transactions (L1Info tx), but Kona was still appending an additional replacement deposit tx encoding the original block's output root. This caused a state root mismatch between the supernode's replacement block and Kona's, making TestInteropFaultProofs_InvalidBlock fail. Remove the craft_replacement_transaction call and dead code, and unskip the test. Closes #19411 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../serial/interop_fault_proofs_test.go | 3 -- .../proof/proof-interop/src/consolidation.rs | 47 ++----------------- 2 files changed, 4 insertions(+), 46 deletions(-) diff --git a/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go b/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go index 30132637f64da..6f7ec51adb5ff 100644 --- a/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go +++ b/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go @@ -64,9 +64,6 @@ func TestInteropFaultProofs_VariedBlockTimes_FasterChainB(gt *testing.T) { func TestInteropFaultProofs_InvalidBlock(gt *testing.T) { t := devtest.SerialT(gt) - // TODO(#19411): Re-enable once the invalid-block supernode proof expectations match the - // native Kona FPP and challenger provider behavior again. - t.Skip("Temporarily skipped while investigating invalid-block supernode proof mismatches") sys := presets.NewSimpleInteropSupernodeProofs(t, presets.WithChallengerCannonKonaEnabled()) sfp.RunInvalidBlockTest(t, sys) } diff --git a/rust/kona/crates/proof/proof-interop/src/consolidation.rs b/rust/kona/crates/proof/proof-interop/src/consolidation.rs index 786a3aa77ff44..89e65f833dd00 100644 --- a/rust/kona/crates/proof/proof-interop/src/consolidation.rs +++ b/rust/kona/crates/proof/proof-interop/src/consolidation.rs @@ -3,10 +3,9 @@ use crate::{BootInfo, OptimisticBlock, OracleInteropProvider, PreState}; use alloc::{collections::BTreeSet, vec::Vec}; use alloy_consensus::{Header, Sealed}; -use alloy_eips::Encodable2718; use alloy_evm::{EvmFactory, FromRecoveredTx, FromTxWithEncoded}; use alloy_op_evm::block::OpTxEnv; -use alloy_primitives::{Address, B256, Bytes, Sealable, TxKind, U256, address}; +use alloy_primitives::Sealable; use alloy_rpc_types_engine::PayloadAttributes; use core::fmt::Debug; use kona_executor::{Eip1559ValidationError, ExecutorError, StatelessL2Builder}; @@ -14,9 +13,8 @@ use kona_interop::{MessageGraph, MessageGraphError}; use kona_mpt::OrderedListWalker; use kona_preimage::CommsClient; use kona_proof::{errors::OracleProviderError, l2::OracleL2ChainProvider}; -use kona_protocol::OutputRoot; use kona_registry::{HashMap, ROLLUP_CONFIGS}; -use op_alloy_consensus::{InteropBlockReplacementDepositSource, OpTxEnvelope, OpTxType, TxDeposit}; +use op_alloy_consensus::{OpTxEnvelope, OpTxType}; use op_alloy_rpc_types_engine::OpPayloadAttributes; use op_revm::OpSpecId; use revm::context::BlockEnv; @@ -186,18 +184,12 @@ where .find(|block| block.block_hash == header.hash()) .ok_or(MessageGraphError::EmptyDependencySet)?; - // Filter out all transactions that are not deposits to start. - let mut transactions = transactions + // Filter out all transactions that are not deposits. + let transactions = transactions .into_iter() .filter(|t| !t.is_empty() && t[0] == OpTxType::Deposit) .collect::>(); - // Add the deposit replacement system transaction at the end of the list. - transactions.push(Self::craft_replacement_transaction( - &header, - original_optimistic_block.output_root, - )); - // Re-craft the execution payload, trimming off all non-deposit transactions. let deposit_only_payload = OpPayloadAttributes { payload_attributes: PayloadAttributes { @@ -264,37 +256,6 @@ where Ok(()) } - - /// Forms the replacement transaction inserted into a deposit-only block in the event that a - /// block is reduced due to invalid messages. - /// - /// - fn craft_replacement_transaction(old_header: &Sealed
, old_output_root: B256) -> Bytes { - const REPLACEMENT_SENDER: Address = address!("deaddeaddeaddeaddeaddeaddeaddeaddead0002"); - const REPLACEMENT_GAS: u64 = 36000; - - let source = InteropBlockReplacementDepositSource::new(old_output_root); - let output_root = OutputRoot::from_parts( - old_header.state_root, - old_header.withdrawals_root.unwrap_or_default(), - old_header.hash(), - ); - let replacement_tx = OpTxEnvelope::Deposit( - TxDeposit { - source_hash: source.source_hash(), - from: REPLACEMENT_SENDER, - to: TxKind::Call(Address::ZERO), - mint: 0, - value: U256::ZERO, - gas_limit: REPLACEMENT_GAS, - is_system_transaction: false, - input: output_root.encode().into(), - } - .seal(), - ); - - replacement_tx.encoded_2718().into() - } } /// An error type for the [`SuperchainConsolidator`] struct. From 2bec7202b83d84bf74e3d388217167c5123d8453 Mon Sep 17 00:00:00 2001 From: Adrian Sutton Date: Thu, 2 Apr 2026 07:22:59 +0000 Subject: [PATCH 2/2] keep test skipped until dependencies are merged The test requires #19890 (skip re-validating deposit-only blocks) and the L2Transactions hint fix from develop to pass. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../tests/interop/proofs/serial/interop_fault_proofs_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go b/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go index 6f7ec51adb5ff..2266993a0da19 100644 --- a/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go +++ b/op-acceptance-tests/tests/interop/proofs/serial/interop_fault_proofs_test.go @@ -64,6 +64,8 @@ func TestInteropFaultProofs_VariedBlockTimes_FasterChainB(gt *testing.T) { func TestInteropFaultProofs_InvalidBlock(gt *testing.T) { t := devtest.SerialT(gt) + // TODO(#19411): Re-enable once #19880 is merged. + t.Skip("Requires #19880 (supernode denylist output as optimistic)") sys := presets.NewSimpleInteropSupernodeProofs(t, presets.WithChallengerCannonKonaEnabled()) sfp.RunInvalidBlockTest(t, sys) }