From 53bf8d11e77e23e5b2773c7a4b65ad7549e8c1e1 Mon Sep 17 00:00:00 2001 From: "muzry.li" Date: Tue, 3 Mar 2026 10:49:14 +0800 Subject: [PATCH] eth/catalyst: allow getPayloadV2 for pre-shanghai payloads --- eth/catalyst/api.go | 2 +- eth/catalyst/api_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/eth/catalyst/api.go b/eth/catalyst/api.go index 1e019ffb15..c64039b690 100644 --- a/eth/catalyst/api.go +++ b/eth/catalyst/api.go @@ -435,7 +435,7 @@ func (api *ConsensusAPI) GetPayloadV2(payloadID engine.PayloadID) (*engine.Execu payloadID, false, []engine.PayloadVersion{engine.PayloadV1, engine.PayloadV2}, - []forks.Fork{forks.Shanghai}, + []forks.Fork{forks.Paris, forks.Shanghai}, ) } diff --git a/eth/catalyst/api_test.go b/eth/catalyst/api_test.go index 7eb26065dc..34b2fef22c 100644 --- a/eth/catalyst/api_test.go +++ b/eth/catalyst/api_test.go @@ -1108,6 +1108,41 @@ func TestWithdrawals(t *testing.T) { } } +func TestGetPayloadV2AllowsPreShanghaiPayload(t *testing.T) { + genesis, blocks := generateMergeChain(10, true) + // Set shanghai time to be after the next payload timestamp. + time := blocks[len(blocks)-1].Time() + 10 + genesis.Config.ShanghaiTime = &time + + n, ethservice := startEthService(t, genesis, blocks) + defer n.Close() + + api := newConsensusAPIWithoutHeartbeat(ethservice) + parent := ethservice.BlockChain().CurrentHeader() + blockParams := engine.PayloadAttributes{ + Timestamp: parent.Time + 5, + } + fcState := engine.ForkchoiceStateV1{ + HeadBlockHash: parent.Hash(), + } + resp, err := api.ForkchoiceUpdatedV2(fcState, &blockParams) + if err != nil { + t.Fatalf("error preparing payload, err=%v", err) + } + if resp.PayloadStatus.Status != engine.VALID { + t.Fatalf("unexpected status (got: %s, want: %s)", resp.PayloadStatus.Status, engine.VALID) + } + if resp.PayloadID == nil { + t.Fatal("missing payload id") + } + if got, want := resp.PayloadID.Version(), engine.PayloadV2; got != want { + t.Fatalf("unexpected payload id version (got: %d, want: %d)", got, want) + } + if _, err := api.GetPayloadV2(*resp.PayloadID); err != nil { + t.Fatalf("GetPayloadV2 rejected pre-shanghai payload: %v", err) + } +} + func TestNilWithdrawals(t *testing.T) { genesis, blocks := generateMergeChain(10, true) // Set shanghai time to last block + 4 seconds (first post-merge block)