Skip to content

Merge from upstream - #60

Merged
pdobacz merged 29 commits into
forks/monad_ninefrom
from-upstream
Oct 1, 2026
Merged

pdobacz merged 29 commits into
forks/monad_ninefrom
from-upstream

Conversation

@pdobacz

@pdobacz pdobacz commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

IMPORTANT: Merge with merge commit !

RetriggerConfidence Score: 3/5

The PR should not merge until fixture-merge retries preserve all entries and Nethermind verifies the exact requested fixture.

Fix All in Claude CodeFindings

  1. P1 Interrupted cleanup loses fixtures ▶
  2. P1 Filter can verify wrong fixture ▶
Fix with agent prompt
### Issue 1
packages/testing/src/execution_testing/fixtures/collector.py:122-123
If a merge stops after deleting one worker’s partial index but before deleting the others, a retry rebuilds the target from only the indexes that remain. It overwrites the complete fixture file, so entries from the deleted index disappear.

### Issue 2
packages/testing/src/execution_testing/client_clis/clis/nethermind.py:127
If the requested blockchain fixture is missing but another fixture’s name ends with the requested name, this filter can select the other fixture. The result check accepts any passing, nonempty response without checking its name, so verification can pass without running the requested fixture.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

This upstream merge expands fork and regression tests, updates fixture generation and client verification, and adds storage-clear tracking and RLP size measurement.

  • Fixture-merge cleanup can lose entries if interrupted and retried.
  • Nethermind’s blockchain filter can accept results for a different fixture.

Reviews (1) · Last reviewed commit: "propagate the upstream fork changes into..."

chfast and others added 29 commits September 22, 2026 16:44
* 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.
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>
@pdobacz
pdobacz requested a review from QEDK as a code owner September 30, 2026 10:13
@pdobacz
pdobacz requested a review from mijovic as a code owner September 30, 2026 10:13
Comment thread packages/testing/src/execution_testing/fixtures/collector.py
@pdobacz
pdobacz merged commit b5f3d1c into forks/monad_nine Oct 1, 2026
19 checks passed
@pdobacz
pdobacz deleted the from-upstream branch October 1, 2026 13:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.