From 025dc407b7db7745d5ea402857ef37d9d12eb058 Mon Sep 17 00:00:00 2001 From: sadiq1971 Date: Thu, 30 Oct 2025 20:53:13 +0600 Subject: [PATCH 1/2] added rpc test for debug_execute_payload --- .../tests/proofs/execute_payload_test.go | 63 +++++++++++++++++++ crates/optimism/tests/proofs/init_test.go | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 crates/optimism/tests/proofs/execute_payload_test.go diff --git a/crates/optimism/tests/proofs/execute_payload_test.go b/crates/optimism/tests/proofs/execute_payload_test.go new file mode 100644 index 00000000000..671dfd0e3f5 --- /dev/null +++ b/crates/optimism/tests/proofs/execute_payload_test.go @@ -0,0 +1,63 @@ +package proofs + +import ( + "testing" + + "github.com/ethereum-optimism/optimism/op-devstack/devtest" + "github.com/ethereum-optimism/optimism/op-devstack/presets" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/txplan" +) + +func TestExecutePayload(gt *testing.T) { + t := devtest.SerialT(gt) + ctx := t.Ctx() + sys := presets.NewSingleChainMultiNode(t) + user := sys.FunderL2.NewFundedEOA(eth.OneHundredthEther) + + plannedTxOption := user.PlanTransfer(user.Address(), eth.OneWei) + plannedTx := txplan.NewPlannedTx(plannedTxOption) + signedTx, err := plannedTx.Signed.Eval(ctx) + if err != nil { + gt.Fatal(err) + } + + raw, err := signedTx.MarshalBinary() + if err != nil { + gt.Fatal(err) + } + + lastBlock, err := sys.L2ELB.Escape().L2EthClient().InfoByLabel(ctx, eth.Unsafe) + if err != nil { + gt.Fatal(err) + } + + blockTime := lastBlock.Time() + 1 + gasLimit := eth.Uint64Quantity(lastBlock.GasLimit()) + + var prevRandao eth.Bytes32 + copy(prevRandao[:], lastBlock.MixDigest().Bytes()) + + var zero1559 eth.Bytes8 + + attrs := eth.PayloadAttributes{ + Timestamp: eth.Uint64Quantity(blockTime), + PrevRandao: prevRandao, + SuggestedFeeRecipient: lastBlock.Coinbase(), + Withdrawals: nil, + ParentBeaconBlockRoot: lastBlock.ParentBeaconRoot(), + Transactions: []eth.Data{eth.Data(raw)}, + NoTxPool: true, + GasLimit: &gasLimit, + EIP1559Params: &zero1559, + MinBaseFee: nil, + } + + witness, err := sys.L2ELB.Escape().L2EthClient().PayloadExecutionWitness(ctx, lastBlock.Hash(), attrs) + if err != nil { + gt.Fatal(err) + } + if witness == nil { + gt.Fatal("empty witness") + } +} diff --git a/crates/optimism/tests/proofs/init_test.go b/crates/optimism/tests/proofs/init_test.go index 7ac34347adf..522fd7ce6f2 100644 --- a/crates/optimism/tests/proofs/init_test.go +++ b/crates/optimism/tests/proofs/init_test.go @@ -1,4 +1,4 @@ -package l2reorg +package proofs import ( "testing" From 4cc0f4243246ad04a342ee74a615e980e6600a15 Mon Sep 17 00:00:00 2001 From: sadiq1971 Date: Mon, 3 Nov 2025 20:54:44 +0600 Subject: [PATCH 2/2] added negetive case for execute payload --- .../tests/proofs/execute_payload_test.go | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/crates/optimism/tests/proofs/execute_payload_test.go b/crates/optimism/tests/proofs/execute_payload_test.go index 671dfd0e3f5..a5d8a7019a7 100644 --- a/crates/optimism/tests/proofs/execute_payload_test.go +++ b/crates/optimism/tests/proofs/execute_payload_test.go @@ -7,9 +7,10 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/presets" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/txplan" + "github.com/ethereum/go-ethereum/common" ) -func TestExecutePayload(gt *testing.T) { +func TestExecutePayloadSuccess(gt *testing.T) { t := devtest.SerialT(gt) ctx := t.Ctx() sys := presets.NewSingleChainMultiNode(t) @@ -61,3 +62,53 @@ func TestExecutePayload(gt *testing.T) { gt.Fatal("empty witness") } } + +func TestExecutePayloadWithInvalidParentHash(gt *testing.T) { + t := devtest.SerialT(gt) + ctx := t.Ctx() + sys := presets.NewSingleChainMultiNode(t) + user := sys.FunderL2.NewFundedEOA(eth.OneHundredthEther) + + plannedTxOption := user.PlanTransfer(user.Address(), eth.OneWei) + plannedTx := txplan.NewPlannedTx(plannedTxOption) + signedTx, err := plannedTx.Signed.Eval(ctx) + if err != nil { + gt.Fatal(err) + } + + raw, err := signedTx.MarshalBinary() + if err != nil { + gt.Fatal(err) + } + + lastBlock, err := sys.L2ELB.Escape().L2EthClient().InfoByLabel(ctx, eth.Unsafe) + if err != nil { + gt.Fatal(err) + } + + blockTime := lastBlock.Time() + 1 + gasLimit := eth.Uint64Quantity(lastBlock.GasLimit()) + + var prevRandao eth.Bytes32 + copy(prevRandao[:], lastBlock.MixDigest().Bytes()) + + var zero1559 eth.Bytes8 + + attrs := eth.PayloadAttributes{ + Timestamp: eth.Uint64Quantity(blockTime), + PrevRandao: prevRandao, + SuggestedFeeRecipient: lastBlock.Coinbase(), + Withdrawals: nil, + ParentBeaconBlockRoot: lastBlock.ParentBeaconRoot(), + Transactions: []eth.Data{eth.Data(raw)}, + NoTxPool: true, + GasLimit: &gasLimit, + EIP1559Params: &zero1559, + MinBaseFee: nil, + } + + _, err = sys.L2ELB.Escape().L2EthClient().PayloadExecutionWitness(ctx, common.Hash{}, attrs) + if err == nil { + gt.Fatal("expected error") + } +}