diff --git a/README.md b/README.md
index 5b34a6e61d39..494dea98c302 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
# Nethermind Ethereum client
[](https://github.com/nethermindeth/nethermind/actions/workflows/nethermind-tests.yml)
-[](https://x.com/nethermindeth)
+[](https://x.com/nethermind)
[](https://discord.gg/GXJFaYk)
[](https://github.com/nethermindeth/nethermind/discussions)
[](https://www.gitpoap.io/gh/NethermindEth/nethermind)
diff --git a/src/Nethermind/Chains/arena-z-mainnet.json.zst b/src/Nethermind/Chains/arena-z-mainnet.json.zst
index e9113e55b220..5792108e41ae 100644
Binary files a/src/Nethermind/Chains/arena-z-mainnet.json.zst and b/src/Nethermind/Chains/arena-z-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/arena-z-sepolia.json.zst b/src/Nethermind/Chains/arena-z-sepolia.json.zst
index cdb5309b4711..7302ef3c16bf 100644
Binary files a/src/Nethermind/Chains/arena-z-sepolia.json.zst and b/src/Nethermind/Chains/arena-z-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/automata-mainnet.json.zst b/src/Nethermind/Chains/automata-mainnet.json.zst
index 0e9e27a6116d..017f4c5f5a42 100644
Binary files a/src/Nethermind/Chains/automata-mainnet.json.zst and b/src/Nethermind/Chains/automata-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/base-mainnet.json.zst b/src/Nethermind/Chains/base-mainnet.json.zst
index 6401d6a84d4d..fdec15ef83ae 100644
Binary files a/src/Nethermind/Chains/base-mainnet.json.zst and b/src/Nethermind/Chains/base-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/base-sepolia.json.zst b/src/Nethermind/Chains/base-sepolia.json.zst
index 0ebb4d1fa34e..c129b089596d 100644
Binary files a/src/Nethermind/Chains/base-sepolia.json.zst and b/src/Nethermind/Chains/base-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/bob-mainnet.json.zst b/src/Nethermind/Chains/bob-mainnet.json.zst
index d7bfae7bcff5..4e349a61aa72 100644
Binary files a/src/Nethermind/Chains/bob-mainnet.json.zst and b/src/Nethermind/Chains/bob-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/boba-mainnet.json.zst b/src/Nethermind/Chains/boba-mainnet.json.zst
index 71fd1372d268..03838fb0dda2 100644
Binary files a/src/Nethermind/Chains/boba-mainnet.json.zst and b/src/Nethermind/Chains/boba-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/boba-sepolia.json.zst b/src/Nethermind/Chains/boba-sepolia.json.zst
index fe40e08c362d..de5e36abae18 100644
Binary files a/src/Nethermind/Chains/boba-sepolia.json.zst and b/src/Nethermind/Chains/boba-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/camp-sepolia.json.zst b/src/Nethermind/Chains/camp-sepolia.json.zst
index 2c3309f68c10..1b3511bd9fe1 100644
Binary files a/src/Nethermind/Chains/camp-sepolia.json.zst and b/src/Nethermind/Chains/camp-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/cyber-mainnet.json.zst b/src/Nethermind/Chains/cyber-mainnet.json.zst
index c39e500211bb..c85da79d3826 100644
Binary files a/src/Nethermind/Chains/cyber-mainnet.json.zst and b/src/Nethermind/Chains/cyber-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/cyber-sepolia.json.zst b/src/Nethermind/Chains/cyber-sepolia.json.zst
index 214f3c4ca664..b51bf216a013 100644
Binary files a/src/Nethermind/Chains/cyber-sepolia.json.zst and b/src/Nethermind/Chains/cyber-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/dictionary b/src/Nethermind/Chains/dictionary
index 20e4d3d6b4c3..2b5819f0e4ae 100644
Binary files a/src/Nethermind/Chains/dictionary and b/src/Nethermind/Chains/dictionary differ
diff --git a/src/Nethermind/Chains/ethernity-mainnet.json.zst b/src/Nethermind/Chains/ethernity-mainnet.json.zst
index f23bd1dc90f7..46379fd2022b 100644
Binary files a/src/Nethermind/Chains/ethernity-mainnet.json.zst and b/src/Nethermind/Chains/ethernity-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/ethernity-sepolia.json.zst b/src/Nethermind/Chains/ethernity-sepolia.json.zst
index 4bc6ebf7aa2f..dc55f0155710 100644
Binary files a/src/Nethermind/Chains/ethernity-sepolia.json.zst and b/src/Nethermind/Chains/ethernity-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/foundation.json b/src/Nethermind/Chains/foundation.json
index 554155c6879a..30a9ec37e5e2 100644
--- a/src/Nethermind/Chains/foundation.json
+++ b/src/Nethermind/Chains/foundation.json
@@ -199,6 +199,14 @@
"eip7251TransitionTimestamp": "0x681b3057",
"eip7702TransitionTimestamp": "0x681b3057",
"eip7623TransitionTimestamp": "0x681b3057",
+ "eip7594TransitionTimestamp": "0x6930b057",
+ "eip7823TransitionTimestamp": "0x6930b057",
+ "eip7825TransitionTimestamp": "0x6930b057",
+ "eip7883TransitionTimestamp": "0x6930b057",
+ "eip7918TransitionTimestamp": "0x6930b057",
+ "eip7934TransitionTimestamp": "0x6930b057",
+ "eip7939TransitionTimestamp": "0x6930b057",
+ "eip7951TransitionTimestamp": "0x6930b057",
"depositContractAddress": "0x00000000219ab540356cbb839cbe05303d7705fa",
"terminalTotalDifficulty": "C70D808A128D7380000",
"blobSchedule": [
@@ -208,6 +216,20 @@
"target": 6,
"max": 9,
"baseFeeUpdateFraction": "0x4c6964"
+ },
+ {
+ "name": "bpo1",
+ "timestamp": "0x69383057",
+ "target": 10,
+ "max": 15,
+ "baseFeeUpdateFraction": "0x7f5a51"
+ },
+ {
+ "name": "bpo2",
+ "timestamp": "0x695db057",
+ "target": 14,
+ "max": 21,
+ "baseFeeUpdateFraction": "0xb24b3f"
}
]
},
diff --git a/src/Nethermind/Chains/fraxtal-mainnet.json.zst b/src/Nethermind/Chains/fraxtal-mainnet.json.zst
index ed91032e2d24..030bddb357fc 100644
Binary files a/src/Nethermind/Chains/fraxtal-mainnet.json.zst and b/src/Nethermind/Chains/fraxtal-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/funki-mainnet.json.zst b/src/Nethermind/Chains/funki-mainnet.json.zst
index 09b2dcbc7b2c..4d8eff551449 100644
Binary files a/src/Nethermind/Chains/funki-mainnet.json.zst and b/src/Nethermind/Chains/funki-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/funki-sepolia.json.zst b/src/Nethermind/Chains/funki-sepolia.json.zst
index 492b9ee72307..5db62f1204a0 100644
Binary files a/src/Nethermind/Chains/funki-sepolia.json.zst and b/src/Nethermind/Chains/funki-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/hashkeychain-mainnet.json.zst b/src/Nethermind/Chains/hashkeychain-mainnet.json.zst
index 635c53a69d8d..52fd8ed8a5be 100644
Binary files a/src/Nethermind/Chains/hashkeychain-mainnet.json.zst and b/src/Nethermind/Chains/hashkeychain-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/ink-mainnet.json.zst b/src/Nethermind/Chains/ink-mainnet.json.zst
index 4962aeaa8a9f..d2e225730e67 100644
Binary files a/src/Nethermind/Chains/ink-mainnet.json.zst and b/src/Nethermind/Chains/ink-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/ink-sepolia.json.zst b/src/Nethermind/Chains/ink-sepolia.json.zst
index 355e98d01863..1e824187026c 100644
Binary files a/src/Nethermind/Chains/ink-sepolia.json.zst and b/src/Nethermind/Chains/ink-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/lisk-mainnet.json.zst b/src/Nethermind/Chains/lisk-mainnet.json.zst
index b861f8eab4cf..d1731571e279 100644
Binary files a/src/Nethermind/Chains/lisk-mainnet.json.zst and b/src/Nethermind/Chains/lisk-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/lisk-sepolia.json.zst b/src/Nethermind/Chains/lisk-sepolia.json.zst
index e5e0ef57af6d..72e73346df8a 100644
Binary files a/src/Nethermind/Chains/lisk-sepolia.json.zst and b/src/Nethermind/Chains/lisk-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/lyra-mainnet.json.zst b/src/Nethermind/Chains/lyra-mainnet.json.zst
index 3efc8fb54798..f926cd06200d 100644
Binary files a/src/Nethermind/Chains/lyra-mainnet.json.zst and b/src/Nethermind/Chains/lyra-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/metal-mainnet.json.zst b/src/Nethermind/Chains/metal-mainnet.json.zst
index a09d22cca6af..7b2e6eed203e 100644
Binary files a/src/Nethermind/Chains/metal-mainnet.json.zst and b/src/Nethermind/Chains/metal-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/metal-sepolia.json.zst b/src/Nethermind/Chains/metal-sepolia.json.zst
index e06f84b5277d..b9589a1495f2 100644
Binary files a/src/Nethermind/Chains/metal-sepolia.json.zst and b/src/Nethermind/Chains/metal-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/mint-mainnet.json.zst b/src/Nethermind/Chains/mint-mainnet.json.zst
index 767212c16dff..dd580a3ac1ad 100644
Binary files a/src/Nethermind/Chains/mint-mainnet.json.zst and b/src/Nethermind/Chains/mint-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/mode-mainnet.json.zst b/src/Nethermind/Chains/mode-mainnet.json.zst
index ebbba73331d6..864b1880f6c6 100644
Binary files a/src/Nethermind/Chains/mode-mainnet.json.zst and b/src/Nethermind/Chains/mode-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/mode-sepolia.json.zst b/src/Nethermind/Chains/mode-sepolia.json.zst
index 148ca283c3cc..ba15e7b41167 100644
Binary files a/src/Nethermind/Chains/mode-sepolia.json.zst and b/src/Nethermind/Chains/mode-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/op-mainnet.json.zst b/src/Nethermind/Chains/op-mainnet.json.zst
index 82270fcad1ec..2ced8c31de3f 100644
Binary files a/src/Nethermind/Chains/op-mainnet.json.zst and b/src/Nethermind/Chains/op-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/op-sepolia.json.zst b/src/Nethermind/Chains/op-sepolia.json.zst
index 505c7b220db6..273e9638055f 100644
Binary files a/src/Nethermind/Chains/op-sepolia.json.zst and b/src/Nethermind/Chains/op-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/orderly-mainnet.json.zst b/src/Nethermind/Chains/orderly-mainnet.json.zst
index c9f4111f7f25..6ed46dcc1693 100644
Binary files a/src/Nethermind/Chains/orderly-mainnet.json.zst and b/src/Nethermind/Chains/orderly-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/ozean-sepolia.json.zst b/src/Nethermind/Chains/ozean-sepolia.json.zst
index 13d9a20574fc..c0bd43fc8d76 100644
Binary files a/src/Nethermind/Chains/ozean-sepolia.json.zst and b/src/Nethermind/Chains/ozean-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/pivotal-sepolia.json.zst b/src/Nethermind/Chains/pivotal-sepolia.json.zst
index 457eeee0f749..4652ced5cba8 100644
Binary files a/src/Nethermind/Chains/pivotal-sepolia.json.zst and b/src/Nethermind/Chains/pivotal-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/polynomial-mainnet.json.zst b/src/Nethermind/Chains/polynomial-mainnet.json.zst
index 38de4e507a15..aa4b1cf3b1c6 100644
Binary files a/src/Nethermind/Chains/polynomial-mainnet.json.zst and b/src/Nethermind/Chains/polynomial-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/race-mainnet.json.zst b/src/Nethermind/Chains/race-mainnet.json.zst
index ac9c1856ddfa..aa60436ed34b 100644
Binary files a/src/Nethermind/Chains/race-mainnet.json.zst and b/src/Nethermind/Chains/race-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/race-sepolia.json.zst b/src/Nethermind/Chains/race-sepolia.json.zst
index 9b1cdf012dbb..a847cf4129bc 100644
Binary files a/src/Nethermind/Chains/race-sepolia.json.zst and b/src/Nethermind/Chains/race-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/redstone-mainnet.json.zst b/src/Nethermind/Chains/redstone-mainnet.json.zst
index e7ca96a6cc01..8ff28af177af 100644
Binary files a/src/Nethermind/Chains/redstone-mainnet.json.zst and b/src/Nethermind/Chains/redstone-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/settlus-mainnet-mainnet.json.zst b/src/Nethermind/Chains/settlus-mainnet-mainnet.json.zst
index e6433f92b1d9..8cd588d51007 100644
Binary files a/src/Nethermind/Chains/settlus-mainnet-mainnet.json.zst and b/src/Nethermind/Chains/settlus-mainnet-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/settlus-sepolia-sepolia.json.zst b/src/Nethermind/Chains/settlus-sepolia-sepolia.json.zst
index 1a3e94b1c9d1..9a2c8654e736 100644
Binary files a/src/Nethermind/Chains/settlus-sepolia-sepolia.json.zst and b/src/Nethermind/Chains/settlus-sepolia-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/shape-mainnet.json.zst b/src/Nethermind/Chains/shape-mainnet.json.zst
index a0d2fb851847..7a1e27d2b3ac 100644
Binary files a/src/Nethermind/Chains/shape-mainnet.json.zst and b/src/Nethermind/Chains/shape-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/shape-sepolia.json.zst b/src/Nethermind/Chains/shape-sepolia.json.zst
index 83fc7ea3d943..ade6b5df2c52 100644
Binary files a/src/Nethermind/Chains/shape-sepolia.json.zst and b/src/Nethermind/Chains/shape-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/snax-mainnet.json.zst b/src/Nethermind/Chains/snax-mainnet.json.zst
index e003e16b078f..8ad945e99415 100644
Binary files a/src/Nethermind/Chains/snax-mainnet.json.zst and b/src/Nethermind/Chains/snax-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/soneium-mainnet.json.zst b/src/Nethermind/Chains/soneium-mainnet.json.zst
index 101045bd9729..294f367fe33d 100644
Binary files a/src/Nethermind/Chains/soneium-mainnet.json.zst and b/src/Nethermind/Chains/soneium-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/soneium-minato-sepolia.json.zst b/src/Nethermind/Chains/soneium-minato-sepolia.json.zst
index b27bf8936d32..e99be38792e3 100644
Binary files a/src/Nethermind/Chains/soneium-minato-sepolia.json.zst and b/src/Nethermind/Chains/soneium-minato-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/sseed-mainnet.json.zst b/src/Nethermind/Chains/sseed-mainnet.json.zst
index 1b4631ce23a0..c8bb0b15d621 100644
Binary files a/src/Nethermind/Chains/sseed-mainnet.json.zst and b/src/Nethermind/Chains/sseed-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/swan-mainnet.json.zst b/src/Nethermind/Chains/swan-mainnet.json.zst
index 12fee6b15512..1d2a3f1f8c52 100644
Binary files a/src/Nethermind/Chains/swan-mainnet.json.zst and b/src/Nethermind/Chains/swan-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/swell-mainnet.json.zst b/src/Nethermind/Chains/swell-mainnet.json.zst
index 0aecfd71be14..ad42e1d7202a 100644
Binary files a/src/Nethermind/Chains/swell-mainnet.json.zst and b/src/Nethermind/Chains/swell-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/tbn-mainnet.json.zst b/src/Nethermind/Chains/tbn-mainnet.json.zst
index c5a68a72f169..cf339f6bdedf 100644
Binary files a/src/Nethermind/Chains/tbn-mainnet.json.zst and b/src/Nethermind/Chains/tbn-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/tbn-sepolia.json.zst b/src/Nethermind/Chains/tbn-sepolia.json.zst
index 129f99607809..b54801437f46 100644
Binary files a/src/Nethermind/Chains/tbn-sepolia.json.zst and b/src/Nethermind/Chains/tbn-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/unichain-mainnet.json.zst b/src/Nethermind/Chains/unichain-mainnet.json.zst
index 2095634e15a3..07604c8c2067 100644
Binary files a/src/Nethermind/Chains/unichain-mainnet.json.zst and b/src/Nethermind/Chains/unichain-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/unichain-sepolia.json.zst b/src/Nethermind/Chains/unichain-sepolia.json.zst
index 301c407b8531..4a2291427ef5 100644
Binary files a/src/Nethermind/Chains/unichain-sepolia.json.zst and b/src/Nethermind/Chains/unichain-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/worldchain-mainnet.json.zst b/src/Nethermind/Chains/worldchain-mainnet.json.zst
index c5d391b9f48c..a566e64111bb 100644
Binary files a/src/Nethermind/Chains/worldchain-mainnet.json.zst and b/src/Nethermind/Chains/worldchain-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/worldchain-sepolia.json.zst b/src/Nethermind/Chains/worldchain-sepolia.json.zst
index cbf0f2d87b13..e7439f335f93 100644
Binary files a/src/Nethermind/Chains/worldchain-sepolia.json.zst and b/src/Nethermind/Chains/worldchain-sepolia.json.zst differ
diff --git a/src/Nethermind/Chains/xterio-eth-mainnet.json.zst b/src/Nethermind/Chains/xterio-eth-mainnet.json.zst
index 2b1015e90d27..b36aabbac8ab 100644
Binary files a/src/Nethermind/Chains/xterio-eth-mainnet.json.zst and b/src/Nethermind/Chains/xterio-eth-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/zora-mainnet.json.zst b/src/Nethermind/Chains/zora-mainnet.json.zst
index da176a17eaac..32e1ce5d75f3 100644
Binary files a/src/Nethermind/Chains/zora-mainnet.json.zst and b/src/Nethermind/Chains/zora-mainnet.json.zst differ
diff --git a/src/Nethermind/Chains/zora-sepolia.json.zst b/src/Nethermind/Chains/zora-sepolia.json.zst
index f397523dd780..715fe88f32de 100644
Binary files a/src/Nethermind/Chains/zora-sepolia.json.zst and b/src/Nethermind/Chains/zora-sepolia.json.zst differ
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/BerlinBlockChainTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/BerlinBlockChainTests.cs
index 264bc859ca77..5e202049eaf8 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/BerlinBlockChainTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/BerlinBlockChainTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Ethereum.Test.Base;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/BerlinStateTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/BerlinStateTests.cs
index cdc20c50d11a..cc32ed244b0f 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/BerlinStateTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/BerlinStateTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using FluentAssertions;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ByzantiumBlockChainTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ByzantiumBlockChainTests.cs
index b6be913b4c5d..3583300d49c2 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ByzantiumBlockChainTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ByzantiumBlockChainTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Ethereum.Test.Base;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ByzantiumStateTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ByzantiumStateTests.cs
index a650f3c79666..7579dc2ed9fc 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ByzantiumStateTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ByzantiumStateTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using FluentAssertions;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/CancunBlockChainTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/CancunBlockChainTests.cs
index 62695ccc71fd..da29277f3419 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/CancunBlockChainTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/CancunBlockChainTests.cs
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: LGPL-3.0-only
using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Ethereum.Test.Base;
using FluentAssertions;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/CancunStateTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/CancunStateTests.cs
index f1f952b6adde..9a7d2402270d 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/CancunStateTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/CancunStateTests.cs
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: LGPL-3.0-only
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using FluentAssertions;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/FrontierBlockChainTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/FrontierBlockChainTests.cs
index fae15df4b213..0b3c9a4a6417 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/FrontierBlockChainTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/FrontierBlockChainTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Ethereum.Test.Base;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/FrontierStateTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/FrontierStateTests.cs
index 6011d779adf7..fbf265a22a8d 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/FrontierStateTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/FrontierStateTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using FluentAssertions;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/HomesteadBlockChainTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/HomesteadBlockChainTests.cs
index eba45011cbb3..fc6bc1c07b95 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/HomesteadBlockChainTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/HomesteadBlockChainTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Ethereum.Test.Base;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/HomesteadStateTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/HomesteadStateTests.cs
index 44ec8d4041f5..0fec88659d02 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/HomesteadStateTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/HomesteadStateTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using FluentAssertions;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/IstanbulBlockChainTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/IstanbulBlockChainTests.cs
index af62090dd9e9..4ad81bb85f3a 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/IstanbulBlockChainTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/IstanbulBlockChainTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Ethereum.Test.Base;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/IstanbulStateTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/IstanbulStateTests.cs
index a4daf560f351..fe0f84a61d36 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/IstanbulStateTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/IstanbulStateTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using FluentAssertions;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaBlockChainTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaBlockChainTests.cs
index 6e8cafbada58..99231fdd948d 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaBlockChainTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaBlockChainTests.cs
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: LGPL-3.0-only
using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Ethereum.Test.Base;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaEofTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaEofTests.cs
index 28326dea3909..874f6a40f6bb 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaEofTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaEofTests.cs
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: LGPL-3.0-only
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaStateTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaStateTests.cs
index 097c9c8f658c..d9c6248b9404 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaStateTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/OsakaStateTests.cs
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: LGPL-3.0-only
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using FluentAssertions;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ShanghaiBlockChainTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ShanghaiBlockChainTests.cs
index 2d273d715659..2e85ba8918d9 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ShanghaiBlockChainTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ShanghaiBlockChainTests.cs
@@ -2,7 +2,6 @@
// SPDX-License-Identifier: LGPL-3.0-only
using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Ethereum.Test.Base;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ShanghaiStateTests.cs b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ShanghaiStateTests.cs
index 5c75a9b80c63..b8e304a15167 100644
--- a/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ShanghaiStateTests.cs
+++ b/src/Nethermind/Ethereum.Blockchain.Pyspec.Test/ShanghaiStateTests.cs
@@ -1,5 +1,7 @@
+// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
+// SPDX-License-Identifier: LGPL-3.0-only
+
using System.Collections.Generic;
-using System.Linq;
using Ethereum.Test.Base;
using FluentAssertions;
using NUnit.Framework;
diff --git a/src/Nethermind/Ethereum.Test.Base/BlockchainTest.cs b/src/Nethermind/Ethereum.Test.Base/BlockchainTest.cs
index 6329281f660f..6916dd59eb53 100644
--- a/src/Nethermind/Ethereum.Test.Base/BlockchainTest.cs
+++ b/src/Nethermind/Ethereum.Test.Base/BlockchainTest.cs
@@ -20,6 +20,7 @@ public class BlockchainTest : EthereumTest
public TestBlockJson[]? Blocks { get; set; }
public TestBlockHeaderJson? GenesisBlockHeader { get; set; }
+ public TestEngineNewPayloadsJson[]? EngineNewPayloads { get; set; }
public Dictionary
? Pre { get; set; }
public Dictionary? PostState { get; set; }
diff --git a/src/Nethermind/Ethereum.Test.Base/BlockchainTestBase.cs b/src/Nethermind/Ethereum.Test.Base/BlockchainTestBase.cs
index a842f6883a99..374f738ab79d 100644
--- a/src/Nethermind/Ethereum.Test.Base/BlockchainTestBase.cs
+++ b/src/Nethermind/Ethereum.Test.Base/BlockchainTestBase.cs
@@ -31,8 +31,11 @@
using Nethermind.Specs.Test;
using Nethermind.Evm.State;
using Nethermind.Init.Modules;
-using Nethermind.TxPool;
using NUnit.Framework;
+using Nethermind.Merge.Plugin.Data;
+using Nethermind.Merge.Plugin;
+using Nethermind.JsonRpc;
+using System.Reflection;
namespace Ethereum.Test.Base;
@@ -40,14 +43,12 @@ public abstract class BlockchainTestBase
{
private static readonly ILogger _logger;
private static readonly ILogManager _logManager = new TestLogManager(LogLevel.Warn);
- private static ISealValidator Sealer { get; }
private static DifficultyCalculatorWrapper DifficultyCalculator { get; }
+ private const int _genesisProcessingTimeoutMs = 5000;
static BlockchainTestBase()
{
DifficultyCalculator = new DifficultyCalculatorWrapper();
- Sealer = new EthashSealValidator(_logManager, DifficultyCalculator, new CryptoRandom(), new Ethash(_logManager), Timestamper.Default); // temporarily keep reusing the same one as otherwise it would recreate cache for each test
-
_logManager ??= LimboLogs.Instance;
_logger = _logManager.GetClassLogger();
}
@@ -83,8 +84,13 @@ protected async Task RunTest(BlockchainTest test, Stopwatch?
test.Network = ChainUtils.ResolveSpec(test.Network, test.ChainId);
test.NetworkAfterTransition = ChainUtils.ResolveSpec(test.NetworkAfterTransition, test.ChainId);
+ bool isEngineTest = test.Blocks is null && test.EngineNewPayloads is not null;
+
List<(ForkActivation Activation, IReleaseSpec Spec)> transitions =
+ isEngineTest ?
+ [((ForkActivation)0, test.Network)] :
[((ForkActivation)0, test.GenesisSpec), ((ForkActivation)1, test.Network)]; // TODO: this thing took a lot of time to find after it was removed!, genesis block is always initialized with Frontier
+
if (test.NetworkAfterTransition is not null)
{
transitions.Add((test.TransitionForkActivation!.Value, test.NetworkAfterTransition));
@@ -92,7 +98,7 @@ protected async Task RunTest(BlockchainTest test, Stopwatch?
ISpecProvider specProvider = new CustomSpecProvider(test.ChainId, test.ChainId, transitions.ToArray());
- Assert.That(test.ChainId == GnosisSpecProvider.Instance.ChainId || specProvider.GenesisSpec == Frontier.Instance, "Expected genesis spec to be Frontier for blockchain tests");
+ Assert.That(isEngineTest || test.ChainId == GnosisSpecProvider.Instance.ChainId || specProvider.GenesisSpec == Frontier.Instance, "Expected genesis spec to be Frontier for blockchain tests");
if (test.Network is Cancun || test.NetworkAfterTransition is Cancun)
{
@@ -122,18 +128,23 @@ protected async Task RunTest(BlockchainTest test, Stopwatch?
IConfigProvider configProvider = new ConfigProvider();
// configProvider.GetConfig().PreWarmStateOnBlockProcessing = false;
- await using IContainer container = new ContainerBuilder()
+ ContainerBuilder containerBuilder = new ContainerBuilder()
.AddModule(new TestNethermindModule(configProvider))
.AddSingleton(specProvider)
.AddSingleton(_logManager)
.AddSingleton(rewardCalculator)
- .AddSingleton(DifficultyCalculator)
- .AddSingleton(NullTxPool.Instance)
- .Build();
+ .AddSingleton(DifficultyCalculator);
+
+ if (isEngineTest)
+ {
+ containerBuilder.AddModule(new TestMergeModule(configProvider));
+ }
+
+ await using IContainer container = containerBuilder.Build();
IMainProcessingContext mainBlockProcessingContext = container.Resolve();
IWorldState stateProvider = mainBlockProcessingContext.WorldState;
- IBlockchainProcessor blockchainProcessor = mainBlockProcessingContext.BlockchainProcessor;
+ BlockchainProcessor blockchainProcessor = (BlockchainProcessor)mainBlockProcessingContext.BlockchainProcessor;
IBlockTree blockTree = container.Resolve();
IBlockValidator blockValidator = container.Resolve();
blockchainProcessor.Start();
@@ -165,102 +176,66 @@ protected async Task RunTest(BlockchainTest test, Stopwatch?
{
if (args.Block.Number == 0)
{
- Assert.That(stateProvider.HasStateForBlock(genesisBlock.Header), Is.EqualTo(true));
+ Assert.That(stateProvider.HasStateForBlock(genesisBlock.Header), Is.True);
+ genesisProcessed.Set();
+ }
+ };
+
+ blockchainProcessor.BlockRemoved += (_, args) =>
+ {
+ if (args.ProcessingResult != ProcessingResult.Success && args.BlockHash == genesisBlock.Header.Hash)
+ {
+ Assert.Fail($"Failed to process genesis block: {args.Exception}");
genesisProcessed.Set();
}
};
blockTree.SuggestBlock(genesisBlock);
- genesisProcessed.WaitOne();
+ genesisProcessed.WaitOne(_genesisProcessingTimeoutMs);
parentHeader = genesisBlock.Header;
// Dispose genesis block's AccountChanges
genesisBlock.DisposeAccountChanges();
}
- List<(Block Block, string ExpectedException)> correctRlp = DecodeRlps(test, failOnInvalidRlp);
- for (int i = 0; i < correctRlp.Count; i++)
+ if (test.Blocks is not null)
{
- // Mimic the actual behaviour where block goes through validating sync manager
- correctRlp[i].Block.Header.IsPostMerge = correctRlp[i].Block.Difficulty == 0;
-
- // For tests with reorgs, find the actual parent header from block tree
- parentHeader = blockTree.FindHeader(correctRlp[i].Block.ParentHash) ?? parentHeader;
-
- Assert.That(correctRlp[i].Block.Hash is not null, $"null hash in {test.Name} block {i}");
-
- bool expectsException = correctRlp[i].ExpectedException is not null;
- // Validate block structure first (mimics SyncServer validation)
- if (blockValidator.ValidateSuggestedBlock(correctRlp[i].Block, parentHeader, out string? validationError))
- {
- Assert.That(!expectsException, $"Expected block {correctRlp[i].Block.Hash} to fail with '{correctRlp[i].ExpectedException}', but it passed validation");
- try
- {
- // All validations passed, suggest the block
- blockTree.SuggestBlock(correctRlp[i].Block);
-
- }
- catch (InvalidBlockException e)
- {
- // Exception thrown during block processing
- Assert.That(expectsException, $"Unexpected invalid block {correctRlp[i].Block.Hash}: {validationError}, Exception: {e}");
- // else: Expected to fail and did fail via exception → this is correct behavior
- }
- catch (Exception e)
- {
- Assert.Fail($"Unexpected exception during processing: {e}");
- }
- finally
- {
- // Dispose AccountChanges to prevent memory leaks in tests
- correctRlp[i].Block.DisposeAccountChanges();
- }
- }
-
- try
- {
- // Validate block structure first (mimics SyncServer validation)
- if (blockValidator.ValidateSuggestedBlock(correctRlp[i].Block, parentHeader, out var validationError))
- {
- // All validations passed, suggest the block
- blockTree.SuggestBlock(correctRlp[i].Block);
- }
- else
- {
- if (correctRlp[i].ExpectedException is not null)
- {
- Assert.Fail($"Unexpected invalid block {correctRlp[i].Block.Hash}: {validationError}");
- }
- }
- }
- catch (InvalidBlockException e)
- {
- // Validation FAILED
- Assert.That(expectsException, $"Unexpected invalid block {correctRlp[i].Block.Hash}: {validationError}");
- // else: Expected to fail and did fail → this is correct behavior
- }
-
- parentHeader = correctRlp[i].Block.Header;
+ // blockchain test
+ parentHeader = SuggestBlocks(test, failOnInvalidRlp, blockValidator, blockTree, parentHeader);
+ }
+ else if (test.EngineNewPayloads is not null)
+ {
+ // engine test
+ IEngineRpcModule engineRpcModule = container.Resolve();
+ await RunNewPayloads(test.EngineNewPayloads, engineRpcModule);
+ }
+ else
+ {
+ Assert.Fail("Invalid blockchain test, did not contain blocks or new payloads.");
}
// NOTE: Tracer removal must happen AFTER StopAsync to ensure all blocks are traced
// Blocks are queued asynchronously, so we need to wait for processing to complete
await blockchainProcessor.StopAsync(true);
-
stopwatch?.Stop();
IBlockCachePreWarmer? preWarmer = container.Resolve().LifetimeScope.ResolveOptional();
- if (preWarmer is not null)
+
+ // Caches are cleared async, which is a problem as read for the MainWorldState with prewarmer is not correct if its not cleared.
+ preWarmer?.ClearCaches();
+
+ Block? headBlock = blockTree.RetrieveHeadBlock();
+
+ Assert.That(headBlock, Is.Not.Null);
+ if (headBlock is null)
{
- // Caches are cleared async, which is a problem as read for the MainWorldState with prewarmer is not correct if its not cleared.
- preWarmer.ClearCaches();
+ return new EthereumTestResult(test.Name, null, false);
}
- Block? headBlock = blockTree.RetrieveHeadBlock();
List differences;
using (stateProvider.BeginScope(headBlock.Header))
{
- differences = RunAssertions(test, blockTree.RetrieveHeadBlock(), stateProvider);
+ differences = RunAssertions(test, headBlock, stateProvider);
}
bool testPassed = differences.Count == 0;
@@ -273,14 +248,8 @@ protected async Task RunTest(BlockchainTest test, Stopwatch?
blockchainProcessor.Tracers.Remove(tracer);
}
- Assert.That(differences.Count, Is.Zero, "differences");
-
- return new EthereumTestResult
- (
- test.Name,
- null,
- testPassed
- );
+ Assert.That(differences, Is.Empty, "differences");
+ return new EthereumTestResult(test.Name, null, testPassed);
}
catch (Exception)
{
@@ -289,9 +258,93 @@ protected async Task RunTest(BlockchainTest test, Stopwatch?
}
}
- private List<(Block Block, string ExpectedException)> DecodeRlps(BlockchainTest test, bool failOnInvalidRlp)
+ private static BlockHeader SuggestBlocks(BlockchainTest test, bool failOnInvalidRlp, IBlockValidator blockValidator, IBlockTree blockTree, BlockHeader parentHeader)
+ {
+ List<(Block Block, string ExpectedException)> correctRlp = DecodeRlps(test, failOnInvalidRlp);
+ for (int i = 0; i < correctRlp.Count; i++)
+ {
+ // Mimic the actual behaviour where block goes through validating sync manager
+ correctRlp[i].Block.Header.IsPostMerge = correctRlp[i].Block.Difficulty == 0;
+
+ // For tests with reorgs, find the actual parent header from block tree
+ parentHeader = blockTree.FindHeader(correctRlp[i].Block.ParentHash) ?? parentHeader;
+
+ Assert.That(correctRlp[i].Block.Hash, Is.Not.Null, $"null hash in {test.Name} block {i}");
+
+ bool expectsException = correctRlp[i].ExpectedException is not null;
+ // Validate block structure first (mimics SyncServer validation)
+ if (blockValidator.ValidateSuggestedBlock(correctRlp[i].Block, parentHeader, out string? validationError))
+ {
+ Assert.That(!expectsException, $"Expected block {correctRlp[i].Block.Hash} to fail with '{correctRlp[i].ExpectedException}', but it passed validation");
+ try
+ {
+ // All validations passed, suggest the block
+ blockTree.SuggestBlock(correctRlp[i].Block);
+
+ }
+ catch (InvalidBlockException e)
+ {
+ // Exception thrown during block processing
+ Assert.That(expectsException, $"Unexpected invalid block {correctRlp[i].Block.Hash}: {validationError}, Exception: {e}");
+ // else: Expected to fail and did fail via exception → this is correct behavior
+ }
+ catch (Exception e)
+ {
+ Assert.Fail($"Unexpected exception during processing: {e}");
+ }
+ finally
+ {
+ // Dispose AccountChanges to prevent memory leaks in tests
+ correctRlp[i].Block.DisposeAccountChanges();
+ }
+ }
+ else
+ {
+ // Validation FAILED
+ Assert.That(expectsException, $"Unexpected invalid block {correctRlp[i].Block.Hash}: {validationError}");
+ // else: Expected to fail and did fail → this is correct behavior
+ }
+
+ parentHeader = correctRlp[i].Block.Header;
+ }
+ return parentHeader;
+ }
+
+ private async static Task RunNewPayloads(TestEngineNewPayloadsJson[]? newPayloads, IEngineRpcModule engineRpcModule)
{
- List<(Block Block, string ExpectedException)> correctRlp = new();
+ (ExecutionPayloadV3, string[]?, string[]?, int, int)[] payloads = [.. JsonToEthereumTest.Convert(newPayloads)];
+
+ // blockchain test engine
+ foreach ((ExecutionPayload executionPayload, string[]? blobVersionedHashes, string[]? validationError, int newPayloadVersion, int fcuVersion) in payloads)
+ {
+ ResultWrapper res;
+ byte[]?[] hashes = blobVersionedHashes is null ? [] : [.. blobVersionedHashes.Select(x => Bytes.FromHexString(x))];
+
+ MethodInfo newPayloadMethod = engineRpcModule.GetType().GetMethod($"engine_newPayloadV{newPayloadVersion}");
+ List