From 946fe007f5d03f1d375ee6550212be461f166ce7 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Thu, 2 Jul 2026 16:22:47 +0100 Subject: [PATCH 1/3] cmd/evm, core: fixes for eels tests@v20.0.0 release --- core/blockchain_test.go | 10 +++++++-- core/state_processor.go | 8 +++++++ tests/init.go | 47 ++++++++++++++++++----------------------- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/core/blockchain_test.go b/core/blockchain_test.go index 4530895b9dda..b493b117e730 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -4127,6 +4127,8 @@ func TestEIP7702(t *testing.T) { Nonce: 0, Balance: big.NewInt(0), }, + params.WithdrawalQueueAddress: {Code: params.WithdrawalQueueCode}, + params.ConsolidationQueueAddress: {Code: params.ConsolidationQueueCode}, }, } @@ -4431,8 +4433,12 @@ func TestGetCanonicalReceipt(t *testing.T) { address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000000000000) gspec = &Genesis{ - Config: params.MergedTestChainConfig, - Alloc: types.GenesisAlloc{address: {Balance: funds}}, + Config: params.MergedTestChainConfig, + Alloc: types.GenesisAlloc{ + address: {Balance: funds}, + params.WithdrawalQueueAddress: {Code: params.WithdrawalQueueCode}, + params.ConsolidationQueueAddress: {Code: params.ConsolidationQueueCode}, + }, BaseFee: big.NewInt(params.InitialBaseFee), } signer = types.LatestSigner(gspec.Config) diff --git a/core/state_processor.go b/core/state_processor.go index bc565db6f9a1..1cd2eeb2f93d 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -188,6 +188,14 @@ func PostExecution(ctx context.Context, config *params.ChainConfig, number *big. rules := config.Rules(number, true, time) // IsMerge is always true // Read requests if Prague is enabled. if config.IsPrague(number, time) { + // EIP-7002, EIP-7251: the block is invalid if either requests + // contract has no code, as an empty system call result is + // indistinguishable from a successful call returning no requests. + for _, addr := range []common.Address{params.WithdrawalQueueAddress, params.ConsolidationQueueAddress} { + if evm.StateDB.GetCodeSize(addr) == 0 { + return nil, nil, fmt.Errorf("requests contract %v has no code", addr) + } + } requests = [][]byte{} // EIP-6110 if err := ParseDepositLogs(&requests, allLogs, config); err != nil { diff --git a/tests/init.go b/tests/init.go index 67f199203fe8..38af9ef17b24 100644 --- a/tests/init.go +++ b/tests/init.go @@ -487,7 +487,7 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, }, }, "OsakaToBPO1AtTime15k": { @@ -515,7 +515,7 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, }, }, "BPO2": { @@ -544,8 +544,8 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, - BPO2: bpo2BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, + BPO2: params.DefaultBPO2BlobConfig, }, }, "BPO1ToBPO2AtTime15k": { @@ -574,8 +574,8 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, - BPO2: bpo2BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, + BPO2: params.DefaultBPO2BlobConfig, }, }, "BPO3": { @@ -605,8 +605,8 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, - BPO2: bpo2BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, + BPO2: params.DefaultBPO2BlobConfig, BPO3: params.DefaultBPO3BlobConfig, }, }, @@ -637,8 +637,8 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, - BPO2: bpo2BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, + BPO2: params.DefaultBPO2BlobConfig, BPO3: params.DefaultBPO3BlobConfig, }, }, @@ -670,8 +670,8 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, - BPO2: bpo2BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, + BPO2: params.DefaultBPO2BlobConfig, BPO3: params.DefaultBPO3BlobConfig, BPO4: params.DefaultBPO4BlobConfig, }, @@ -704,8 +704,8 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, - BPO2: bpo2BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, + BPO2: params.DefaultBPO2BlobConfig, BPO3: params.DefaultBPO3BlobConfig, BPO4: params.DefaultBPO4BlobConfig, }, @@ -739,8 +739,8 @@ var Forks = map[string]*params.ChainConfig{ BlobScheduleConfig: ¶ms.BlobScheduleConfig{ Cancun: params.DefaultCancunBlobConfig, Prague: params.DefaultPragueBlobConfig, - BPO1: bpo1BlobConfig, - BPO2: bpo2BlobConfig, + BPO1: params.DefaultBPO1BlobConfig, + BPO2: params.DefaultBPO2BlobConfig, BPO3: params.DefaultBPO3BlobConfig, BPO4: params.DefaultBPO4BlobConfig, }, @@ -793,16 +793,11 @@ var Forks = map[string]*params.ChainConfig{ }, } -var bpo1BlobConfig = ¶ms.BlobConfig{ - Target: 9, - Max: 14, - UpdateFraction: 8832827, -} - -var bpo2BlobConfig = ¶ms.BlobConfig{ - Target: 14, - Max: 21, - UpdateFraction: 13739630, +func init() { + // Execution-spec-tests fixtures use the historical upgrade names for + // the EIP150 and EIP158 rulesets. + Forks["TangerineWhistle"] = Forks["EIP150"] + Forks["SpuriousDragon"] = Forks["EIP158"] } // AvailableForks returns the set of defined fork names From 2af4643a6d3f7094f5c2cc81bc29001c10dd6cb8 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Thu, 2 Jul 2026 16:49:07 +0100 Subject: [PATCH 2/3] build: update spec-tests to eels tests@v20.0.0 --- build/checksums.txt | 8 ++++---- build/ci.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/checksums.txt b/build/checksums.txt index 454efa93c478..0d135b93e523 100644 --- a/build/checksums.txt +++ b/build/checksums.txt @@ -1,9 +1,9 @@ # This file contains sha256 checksums of optional build dependencies. -# version:spec-tests v5.1.0 -# https://github.com/ethereum/execution-spec-tests/releases -# https://github.com/ethereum/execution-spec-tests/releases/download/v5.1.0 -a3192784375acec7eaec492799d5c5d0c47a2909a3cc40178898e4ecd20cc416 fixtures_develop.tar.gz +# version:spec-tests tests@v20.0.0 +# https://github.com/ethereum/execution-specs/releases +# https://github.com/ethereum/execution-specs/releases/download/tests%40v20.0.0 +b183702a5b447b465873865357ced9eb342315922e52e31b714e2de115dd0bb4 fixtures.tar.gz # version:golang 1.25.10 # https://go.dev/dl/ diff --git a/build/ci.go b/build/ci.go index 53ade2e1bf1d..320e858e82a4 100644 --- a/build/ci.go +++ b/build/ci.go @@ -452,7 +452,7 @@ func doTest(cmdline []string) { // downloadSpecTestFixtures downloads and extracts the execution-spec-tests fixtures. func downloadSpecTestFixtures(csdb *download.ChecksumDB, cachedir string) string { ext := ".tar.gz" - base := "fixtures_develop" + base := "fixtures" archivePath := filepath.Join(cachedir, base+ext) if err := csdb.DownloadFileFromKnownURL(archivePath); err != nil { log.Fatal(err) From 3f9bf55bfa75b660388e2e2ce5b940c7cddceb92 Mon Sep 17 00:00:00 2001 From: spencer-tb Date: Fri, 3 Jul 2026 14:59:48 +0100 Subject: [PATCH 3/3] core, tests: drop requests contract code check in favor of test skips --- core/blockchain_test.go | 10 ++-------- core/state_processor.go | 8 -------- tests/block_test.go | 10 ++++------ 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/core/blockchain_test.go b/core/blockchain_test.go index b493b117e730..4530895b9dda 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -4127,8 +4127,6 @@ func TestEIP7702(t *testing.T) { Nonce: 0, Balance: big.NewInt(0), }, - params.WithdrawalQueueAddress: {Code: params.WithdrawalQueueCode}, - params.ConsolidationQueueAddress: {Code: params.ConsolidationQueueCode}, }, } @@ -4433,12 +4431,8 @@ func TestGetCanonicalReceipt(t *testing.T) { address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000000000000) gspec = &Genesis{ - Config: params.MergedTestChainConfig, - Alloc: types.GenesisAlloc{ - address: {Balance: funds}, - params.WithdrawalQueueAddress: {Code: params.WithdrawalQueueCode}, - params.ConsolidationQueueAddress: {Code: params.ConsolidationQueueCode}, - }, + Config: params.MergedTestChainConfig, + Alloc: types.GenesisAlloc{address: {Balance: funds}}, BaseFee: big.NewInt(params.InitialBaseFee), } signer = types.LatestSigner(gspec.Config) diff --git a/core/state_processor.go b/core/state_processor.go index 1cd2eeb2f93d..bc565db6f9a1 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -188,14 +188,6 @@ func PostExecution(ctx context.Context, config *params.ChainConfig, number *big. rules := config.Rules(number, true, time) // IsMerge is always true // Read requests if Prague is enabled. if config.IsPrague(number, time) { - // EIP-7002, EIP-7251: the block is invalid if either requests - // contract has no code, as an empty system call result is - // indistinguishable from a successful call returning no requests. - for _, addr := range []common.Address{params.WithdrawalQueueAddress, params.ConsolidationQueueAddress} { - if evm.StateDB.GetCodeSize(addr) == 0 { - return nil, nil, fmt.Errorf("requests contract %v has no code", addr) - } - } requests = [][]byte{} // EIP-6110 if err := ParseDepositLogs(&requests, allLogs, config); err != nil { diff --git a/tests/block_test.go b/tests/block_test.go index 0f087967bb68..a054e59e0fe2 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -88,14 +88,12 @@ func TestExecutionSpecBlocktests(t *testing.T) { bt := new(testMatcher) // These tests require us to handle scenarios where a system contract is not deployed at a fork - bt.skipLoad(".*prague/eip7251_consolidations/test_system_contract_deployment.json") - bt.skipLoad(".*prague/eip7002_el_triggerable_withdrawals/test_system_contract_deployment.json") + bt.skipLoad(`.*eip7251_consolidations/contract_deployment/system_contract_deployment\.json`) + bt.skipLoad(`.*eip7002_el_triggerable_withdrawals/contract_deployment/system_contract_deployment\.json`) // Broken tests - bt.skipLoad(`RevertInCreateInInit`) - bt.skipLoad(`InitCollisionParis`) - bt.skipLoad(`dynamicAccountOverwriteEmpty_Paris`) - bt.skipLoad(`create2collisionStorageParis`) + bt.skipLoad(`.*eip7610_create_collision/initcollision/.*`) + bt.skipLoad(`.*eip7610_create_collision/revert_in_create/.*`) bt.walk(t, executionSpecBlockchainTestDir, func(t *testing.T, name string, test *BlockTest) { execBlockTest(t, bt, test)