Merge from upstream - #60
Merged
Merged
Conversation
* feat(tests): port the repeated ECRECOVER call fillers Fold Call50000_ecrec and static_Call50000_ecrec into a single parametrized test over every call opcode, with ten iterations instead of fifty thousand. The fillers repeat the call until the transaction runs out of gas, so their whole post-state is the empty one a reverted transaction leaves behind; running the loop to completion instead lets the residue be checked. What the precompile receives, stipend included, is exactly one gas short of its price, so every call fails: the success flags accumulate to their seeded base, the loop counter proves all ten iterations ran, the seeded return word survives and the precompile receives no value. One gas more and every call recovers instead. The input window stays as wide as the fillers made it, far wider than the 128 bytes the precompile reads. * refactor: docstring and test implementation --------- Co-authored-by: LouisTsai <q1030176@gmail.com>
Co-authored-by: fselmo <fselmo2@gmail.com> Co-authored-by: spencer-tb <spencer.tb@ethereum.org>
Co-authored-by: 72684086+LouisTsai-Csie@users.noreply.github.com
…nts (ethereum#3529) Add a regression test proving that a create frame failing on an alive destination refills no NEW_ACCOUNT state gas: the factory's gas is tuned so its probe SSTORE only fits when the reservoir funds it, and removing the refill guard fails all twelve no_reservoir fixtures. Correct the collision-test docstring (an alive target is never charged, so nothing is refunded) and record the EELS line-coverage evidence for the checklist: every EIP-8037 line is executed, with the remaining misses classified as pre-existing code.
… rollback (ethereum#3540) * feat(tests): cover block state budget after authorization preparation rollback * fix(tests): derive preparation rollback block gas budget * refactor: test implementation * fix(tests): annotate post and header in preparation rollback test --------- Co-authored-by: LouisTsai <q1030176@gmail.com>
…thereum#3613) Co-authored-by: spencer <spencer.tb@ethereum.org> Co-authored-by: danceratopz <danceratopz@gmail.com>
…the skip list (Pt. 2d) (ethereum#3322) Co-authored-by: marioevz <marioevz@gmail.com>
…Cancun onward (ethereum#3508) Co-authored-by: fselmo <fselmo2@gmail.com>
…t files (ethereum#3628) * refactor: stream fixture writes and merges through part files * refactor(test-fixtures): simplify .part merge + make safe to interrupt - Drop the existing-target seeding: the output directory must be empty when a session starts, so a target at merge time can only be a leftover from an interrupted merge, which is now overwritten. Unlink the partial index files before their parts, so an interrupted cleanup leaves orphan parts rather than an index pointing at deleted files. Create part files exclusively, so a name clash with a part left over from an earlier session fails instead of silently merging the wrong fixture. - Tests: fold the big-fixture helper into `_make_fixture`, move the streaming tests into `TestPartialFixtureFiles`, measure merge memory as a delta so the test also passes with tracemalloc already tracing, and replace the seeding test with one that redoes an interrupted merge. * refactor: resolve tracemalloc import issue --------- Co-authored-by: fselmo <fselmo2@gmail.com>
…thereum#3644) geth's t8n writes its opcode counts into every result, keyed by its own names: an undefined byte as "opcode 0xb8 not defined", and EOF opcodes the fork does not define by their EOF names. `OpcodeCount` rejected those keys, so the whole t8n result failed to parse whenever a block ran an undefined opcode. The count now normalizes names as the RPC path already did (moved here from `client_backend`): undefined bytes by value, unknown names dropped with a warning.
…REATE2` branches (ethereum#3625) * feat: add create_op wrapper * refactor: eip8037 suite to use create_op wrapper * refactor: all amsterdam suite to use wrapper * fix: linting issue * refactor: apply suggestion
…dest analysis (ethereum#3631) * feat(test-benchmark): pre-fund CREATE targets and add randomized jumpdest analysis Pre-fund each CREATE target so it skips NEW_ACCOUNT (EIP-8037), isolating the analysis cost; genesis pre-allocation in fill. Add non-repeating random initcode arms (four alphabets, one weighted) that defeat the branch predictor, delivered via EXTCODECOPY to avoid the calldata floor. New deploy_contracts_once lets the test derive CREATE addresses before the loop contract is deployed. Worst random arm per client, 60M-gas Amsterdam block on an isolated 3.97 GHz core (rest of the package at 3.6 GHz), lowest is most damaging: nethermind 35.8 MGas/s random_stop_jumpdest_push1 (approx: JIT, no timer) besu 36.3 MGas/s random_stop_jumpdest evmone 43.2 MGas/s random_stop_jumpdest reth/revm 45.8 MGas/s random_stop_jumpdest geth 50.8 MGas/s random_jumpdest_push1 erigon 74.9 MGas/s random_stop_jumpdest_2push1 The periodic warm-predictor arms run roughly 2-3x faster, so that gap is the branch-prediction cost this benchmark exposes. * refactor(test-benchmark): gate CREATE target pre-funding on the new account charge Pre-fund only where CREATE carries NEW_ACCOUNT, so forks before Amsterdam keep their fixtures unchanged. Shorten the docstring and comments, use the tx_gas_limit fixture, and restore the named calldata length. * refactor: code generator logic in the test --------- Co-authored-by: fselmo <fselmo2@gmail.com> Co-authored-by: LouisTsai <q1030176@gmail.com>
…#3637) * feat(test-benchmark): add TSTORE key-distribution benchmark test_tstore_key_distribution parametrizes over spread vs colliding transient storage keys. The colliding arm writes distinct slots that share one Arrays.hashCode, so every key maps to a single bucket of besu's transient store (a HashMap keyed by AdrressStorageSlotKey) and exercises its treeified single-bin path. Keys are constant literals independent of the contract address, so the scenario is replayable against a freshly deployed contract. * refactor: tstore benchmark nit --------- Co-authored-by: LouisTsai <q1030176@gmail.com>
…reum#3642) * refactor: measure block RLP size without encoding it * refactor: derive block RLP size from block_rlp_encode_list and add size tests
…ereum#3660) Add a `point_evaluation_unique_y` variant to `test_point_evaluation` that overwrites the input's y field with the current GAS before every call, so each STATICCALL runs a fresh KZG pairing no client can cache by input, while calldata stays a constant 192 bytes. The mutated input makes the call fail, so it forwards exactly the fixed precompile cost (a failing precompile consumes all gas forwarded to it, so Op.GAS would spend the whole budget on the first call). Its per-call cost matches the existing valid and `test_point_evaluation_uncachable` variants across geth/besu/evmone, but it needs no per-call proof generation and no long calldata. Maintainers may therefore want to consider consolidating the `test_point_evaluation_uncachable` test into this cheaper form.
…rrent EIP blob (ethereum#3622) * feat(tests): cover a null EIP-8070 custodyColumns and repin to the current EIP blob * fix(tests): send custodyColumns as ordered updates and cover null after a custody set Co-authored-by: 蔡佳誠 Louis Tsai <72684086+LouisTsai-Csie@users.noreply.github.com> --------- Co-authored-by: 蔡佳誠 Louis Tsai <72684086+LouisTsai-Csie@users.noreply.github.com>
…um#3654) * feat(tests): cover BAL same-index nonce keep and code replace Add a post-execution two-call fixture that CREATEs then value-CALLs at one block access index, hitting the previously untested keep/replace branches in add_nonce_change and add_code_change. Co-authored-by: Cursor <cursoragent@cursor.com> * style(tests): format same-index BAL coverage test Co-authored-by: Cursor <cursoragent@cursor.com> * refactor(tests): reach the same-index BAL branches with one call per predeploy * chore(tests): fix the eip7928 missed_lines entry and its re-verify command * chore(skills): update checklist skill wording for better results --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: fselmo <fselmo2@gmail.com>
…ct (ethereum#3674) `consume direct --bin nethtest` passed every block test without running it. Since NethermindEth/nethermind#10211, nethtest matches `--filter` against the fixture key after `.py::`, so the full key EELS passed matched nothing; and the result was read from the exit code alone, which nethtest leaves at 0 when a test fails. Filter on the part after `.py::`, and read the verdict from the JSON array on stdout, failing when it is empty. Fixes ethereum#3609.
…reum#3672) A test directory holding a pytest function that requests no spec fixture crashed `fill` with `INTERNALERROR> ValueError: No spec type format found in the test item.`: the filler's `pytest_collection_modifyitems` reached the item before the existing check in `pytest_runtest_call` could run. Move that check to a `tryfirst` `pytest_generate_tests`, so the module fails collection with a message naming the test, in a single process and under xdist alike. Fixes ethereum#3608.
…sponsored authorizations (ethereum#3671) A client that undoes applied authorizations one by one, rather than restoring a snapshot, can get the undo wrong when the halt follows an authority authorized twice or a self-sponsored authorization, and still pass every existing rollback test, which only use distinct third-party authorities. Add test_repeated_authority_rolled_back and test_self_sponsored_authorization_rolled_back, each crossed with a starved recipient NEW_ACCOUNT or delegation-access charge and a succeeds control. Share the repeated-authority setup via build_repeated_authority and let authorization_transaction_cost take a recipient type.
…precompile OOG after spill (ethereum#3673)
Conflict markers are committed as-is; resolved in the follow-up commit. Co-Authored-By: Claude <claude-fable-5-1>
Keep the fork's Monad-only release config and reduce the ported static conftest to the Monad marker now that upstream dropped its skip list. Co-Authored-By: Claude <claude-fable-5-1>
Record block-level storage wipes; drop MONAD_EIGHT's unreachable except. Co-Authored-By: Claude <claude-fable-5-1>
mijovic
approved these changes
Oct 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
IMPORTANT: Merge with merge commit !
The PR should not merge until fixture-merge retries preserve all entries and Nethermind verifies the exact requested fixture.
Fix with agent prompt
Summary
This upstream merge expands fork and regression tests, updates fixture generation and client verification, and adds storage-clear tracking and RLP size measurement.
Reviews (1) · Last reviewed commit: "propagate the upstream fork changes into..."