Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
208 commits
Select commit Hold shift + click to select a range
023e98c
refactor(spec): unify forgotten gas constants in spec (#2383)
Carsons-Eels Mar 17, 2026
5d20c27
feat(ci): dual-publish fixture releases to EELS and EEST (#2350)
danceratopz Mar 17, 2026
905db26
feat(benchmarks): add BAL benchmarks for the optimization strategies …
jochem-brouwer Mar 17, 2026
d225d09
feat: verbose CI logs (#2456)
felix314159 Mar 18, 2026
9c88d60
chore(docs): don't include `ported_static` tests in mkdocs (#2525)
danceratopz Mar 18, 2026
53bb083
refactor: simplify BAL T8N by passing rlp bytes (#2486)
fselmo Mar 18, 2026
54b205c
refactor(test-benchmark): ensure no precompile cache issue (#2415)
LouisTsai-Csie Mar 19, 2026
40badcf
fix(benchmarks): correct gas accounting for account_query value > 0 (…
jochem-brouwer Mar 19, 2026
9a28923
chore(ci): warn when local markdownlint-cli2 version diverges from CI…
danceratopz Mar 19, 2026
3ffa9e7
fix(src): preserve custom chain ID in pre-alloc groups and `extract_c…
felix314159 Mar 19, 2026
f5a210f
chore(ci): enable ported static in py3 and split into 5 parallel fork…
danceratopz Mar 20, 2026
7bc95e1
feat(test-consume,deps): use `register_multi_test_client` to fix clie…
danceratopz Mar 20, 2026
eab8cfb
feat(test-benchmark): verify transaction status (#2527)
LouisTsai-Csie Mar 20, 2026
c9e90a2
fix(benchmarks): use factory which creates non-destructible contracts…
jochem-brouwer Mar 23, 2026
878ef15
fix(t8n): correct `Txs.transactions` type annotation (#2538)
jihoonsong Mar 23, 2026
aaa4481
feat(cli-evm-bytes): Detect repeating opcodes (#2502)
marioevz Mar 23, 2026
12c3ac0
chore(test-fill): don't collect tests for unsupported forks (#2540)
danceratopz Mar 23, 2026
b585abe
fix(fill): guard type-only pre_alloc import behind TYPE_CHECKING (#2541)
danceratopz Mar 23, 2026
a069849
refactor(tests): replace runtime skips with upfront parametrize filte…
danceratopz Mar 23, 2026
960c0bd
refactor(tests,test-fill): rename `json_loader` pytest marker to `eel…
danceratopz Mar 24, 2026
cf5d85f
fix(ci): separate Hive client build from dev mode startup (#2545)
danceratopz Mar 24, 2026
b1cb9eb
fix(test-logging): don't store empty logs (#2547)
felix314159 Mar 24, 2026
174e903
fix(ci): remove stale client Docker images before benchmark genesis b…
danceratopz Mar 24, 2026
25fce5b
feat(ci): cache mypy results in the static analysis job (#2546)
danceratopz Mar 24, 2026
0faeb8b
refactor(tests),feat(test-forks): add `filter_combinations` pytest ma…
danceratopz Mar 24, 2026
125ed98
refactor(test-benchmark): collect benchmark tests using testpath not …
LouisTsai-Csie Mar 24, 2026
21407ec
refactor(test-forks): Remove `block_number`/`timestamp` from all meth…
marioevz Mar 24, 2026
0958360
feat(test-fill): add --post-verifications flag to capture fill-time c…
spencer-tb Mar 25, 2026
def3a0c
refactor: label necessary marker (#2430)
LouisTsai-Csie Mar 26, 2026
80177d2
chore(test-client-clis): update besu exception mapper (#2565)
spencer-tb Mar 26, 2026
f2b2039
chore(test-client-clis): update erigon exception mapper (#2564)
spencer-tb Mar 26, 2026
0ada2de
fix(test-tests,ci): fix flakiness due to mutated `EnvironmentDefaults…
felix314159 Mar 26, 2026
5c198a3
refactor(test-benchmark): generic erc20 benchmark (#2569)
jochem-brouwer Mar 26, 2026
6e98103
chore(test-client-clis): update BAL exceptions for nethermind (#2550)
flcl42 Mar 26, 2026
51fc631
refactor(test-benchmark): use runtime gas checking in mixed SLOAD/SST…
CPerezz Mar 26, 2026
28c2bc3
fix(test-tests): restore` execute` chain-id defaults after in-process…
felix314159 Mar 27, 2026
c90d117
feat(test-types): improve error messages for invalid tx fields (#2551)
felix314159 Mar 27, 2026
3bfb78e
feat(tooling,docs): add pytester best practices skill and docs (#2573)
danceratopz Mar 27, 2026
dbf15aa
refactor(test-vm): optimize `Bytecode.__mul__` and `__add__` performa…
kevaundray Mar 27, 2026
65a3009
chore(test-client-clis): update geth exception mapper for BAL devnet-…
spencer-tb Mar 27, 2026
c1d8f42
feat(test-execute): Add execute remote unit tests (#2485)
marioevz Mar 27, 2026
42ed8cd
fix: path the receipt parser so a non-empty geth JSON root is treated…
felix314159 Mar 30, 2026
fd1dd63
feat(test-fixture): add `metadata` subfield to `_info` with `target_o…
LouisTsai-Csie Mar 30, 2026
9b90b4c
feat(tests): add worst-case BAL read test (#2033)
nerolation Mar 30, 2026
b7fe325
refactor(specs): add `has_access_list` fn for transaction types (#2582)
dzhalaevd Mar 30, 2026
9494cd8
fix(specs): remove None from trie Node type (#2596)
SamWilsn Mar 30, 2026
9ec843e
fix(ci): use master client builds for benchmark genesis extraction (#…
danceratopz Mar 30, 2026
35fd283
chore(ci): add configurable client and verbose logging to hive-consum…
danceratopz Mar 30, 2026
2e6a76e
feat(test-fill,test-benchmark): support stub accounts in `fill` via R…
LouisTsai-Csie Mar 31, 2026
f5b6d10
feat(tests): add `filler_to_python` converter and port static tests (…
leolara Mar 31, 2026
325eb90
fix(tests): resolve transition fork blob methods in EIP-4844 conftest…
danceratopz Mar 31, 2026
136f22a
fix(tests): resolve transition fork blob methods in EIP-7918 conftest…
danceratopz Mar 31, 2026
2dd38cf
fix(ci,test-benchmark): do not generate compute benchmarks (#2606)
danceratopz Apr 1, 2026
3037ba4
feat(test-benchmark): parametrize stateful benchmark stubs from `--ad…
LouisTsai-Csie Apr 1, 2026
2df7916
fix(test-forks): exclude transition target fork from `--until` bounda…
danceratopz Apr 1, 2026
65f9b8f
feat(tests): Add more EIP-7928 test cases (#1903)
jochem-brouwer Apr 1, 2026
1e49423
feat(ci,tooling): replace `tox` with `just` (#2555)
danceratopz Apr 1, 2026
4550e69
feat(test-forks): Add EIP classes (#2571)
marioevz Apr 1, 2026
26c98b9
feat(cli): Add --until option for checklist generation (#2593)
kclowes Apr 1, 2026
8ae9dcc
feat(test-benchmark): add missing target opcodes for SMOD, MOD and EX…
jsign Apr 2, 2026
9167dd9
feat(ci): split release builds across multiple runners; delete develo…
danceratopz Apr 3, 2026
89d153d
refactor: update target opcode count display name (#2591)
LouisTsai-Csie Apr 3, 2026
553b2d7
feat(benchmarks): add runtime delegated EIP-7702 benchmarks (#2598)
jochem-brouwer Apr 3, 2026
4bf8bbe
fix(test-benchmark): account access subcall OOG issue (#2614)
LouisTsai-Csie Apr 3, 2026
c08584c
feat(scripts): skip `@manually-enhanced` files in `filler_to_python`…
leolara Apr 7, 2026
b6ccb42
fix(ethrex): update GAS_USED_OVERFLOW exception mapper (#2632)
edg-l Apr 7, 2026
d986207
feat(test-fill): Add --verify-traces flag for trace comparison agains…
leolara Apr 7, 2026
d1e344c
fix: Remove inaccurate 'unimplemented stub' comments from all fork en…
Kubudak90 Apr 8, 2026
a352192
feat(tests): add state restoration tests for reverted sub-calls (#2494)
chfast Apr 8, 2026
9e7225a
feat(tests-execute): `EOA` pkey support for stub account (#2624)
LouisTsai-Csie Apr 8, 2026
cc21e89
chore(tooling,deps): update mypy to 1.20 (#2633)
SamWilsn Apr 8, 2026
fa12e99
feat(ci,tooling): add vulture dead code detection to just & ci (#2621)
knQzx Apr 9, 2026
249184e
tests(amsterdam): add BAL missing withdrawal account tests (#2652)
edg-l Apr 10, 2026
ddbc590
feat(test-plugins-forks): Introduce `pytest.mark.valid_before` (#2647)
marioevz Apr 10, 2026
7f3ab55
refactor(tests): Enhance heavy ported tests (#2623)
marioevz Apr 10, 2026
a48e0b3
fix(github): Fix just setup (#2655)
marioevz Apr 10, 2026
792e999
chore(tooling): ignore `.mypy_cache` (symlink) and `.python-version` …
danceratopz Apr 13, 2026
6216190
feat(test-benchmark): add cache strategy to storage benchmark (#2628)
LouisTsai-Csie Apr 13, 2026
ec74da4
fix(test-fill): resolve checklist path for EIPs referenced via `eip=[…
danceratopz Apr 13, 2026
f059c48
feat(tooling): add docs-serve just recipes and tidy docs env handling…
danceratopz Apr 13, 2026
47782b3
chore(doc): add skill for generating docstrings (#2669)
SamWilsn Apr 13, 2026
ed9d24e
feat(tooling,test-cli): add just checklist and `allowed_exit_codes` t…
kclowes Apr 14, 2026
a830dab
refactor(test-benchmark): remove unused bloatnet factory entries from…
kamilchodola Apr 14, 2026
f802a24
feat(docs): update content for post-weld execution-specs (#2662)
danceratopz Apr 14, 2026
81402c0
feat(tooling): add `shell-completions` recipe to print setup instruct…
danceratopz Apr 14, 2026
6048fe5
feat(test-fill): add `--include-benchmark` and scan both tests + test…
danceratopz Apr 14, 2026
eb84f4c
feat(docs): use orange eth diamond as favicon (#2674)
danceratopz Apr 14, 2026
6672cfe
feat(test-forks): enable multiple EIP to be specified in `fork.is_eip…
marioevz Apr 14, 2026
3687eb5
feat(test-benchmark): add uncacheable precompile benchmark (#2600)
LouisTsai-Csie Apr 14, 2026
c8c246c
feat(benchmark): Add deep-branch SLOAD stateful test (#2635)
jsign Apr 15, 2026
132c09d
feat(tests): add test for worst-case prefetcher performance (#2657)
nerolation Apr 15, 2026
d206d4f
feat: add more invalid BAL test cases; extend invalid case coverage (…
fselmo Apr 15, 2026
64dc4ac
fix(test-plugins-filler): aggregate --verify-traces results across xd…
leolara Apr 15, 2026
6fe032f
feat(test-forks): Devnet merging script
felix314159 Apr 13, 2026
363df20
refactor(specs): Add `count_tokens_in_data` helper
felix314159 Apr 14, 2026
8bd536b
feat(doc,test-benchmark): re-enable benchmark tests in test case refe…
danceratopz Apr 16, 2026
2bc7c79
feat(tests): improve robustness for EIP-7981 (#2696)
felix314159 Apr 16, 2026
71fe4d6
chore: remove unused stateful benchmark (#2686)
LouisTsai-Csie Apr 17, 2026
40461a6
feat(ci, test-fill): make `--generate-all-formats` optional via `feat…
spencer-tb Apr 17, 2026
c3462e0
feat(test-forks): Gas-limit-aware `Fork`, fork-aware `Environment` (#…
marioevz Apr 17, 2026
e8f01a6
feat(spec-specs, tests): add account-only BAL invalid test (#2712)
flcl42 Apr 18, 2026
554bd41
feat(spec-specs, tests): EIP-7928 - Update BAL index to uint64 (#2713)
nerolation Apr 20, 2026
668cde5
feat(spec-specs, tests): add system address BAL tests (#2715)
flcl42 Apr 20, 2026
464f61d
feat(test-client-clis): tolerate missing trace file for rejected txs …
leolara Apr 20, 2026
0345cf1
Open feat(tests): tighten invalid-path BAL coverage for EIP-2935 and …
junbyjun1238 Apr 20, 2026
4c47daa
feat(tests): prepare `test_scenarios` and `test_all_opcodes` for EIP-…
spencer-tb Apr 20, 2026
97c13c1
refactor: use uint32 instead of uint64 for block access index (#2730)
fselmo Apr 20, 2026
5502bd8
refactor(spec-specs): add opcode gas constants (#2396)
Carsons-Eels Apr 20, 2026
e8e9c38
feat(doc): add directory listings to py modules (#2658)
SamWilsn Apr 20, 2026
6f43bc6
Replace `Uint(len(...))` with `ulen(...)` (#2580)
SamWilsn Apr 22, 2026
739ecad
feat(doc): re-write readme/top-level docs and add specs section to ht…
danceratopz Apr 22, 2026
8a85b54
feat(test-fill): enable phase-1-only pre-alloc generation (#2720)
danceratopz Apr 22, 2026
49b882e
chore(test-types): adds extra modifier validation; adds unit tests (#…
fselmo Apr 22, 2026
610d538
refactor(specs): make `State` fork agnostic (#2381)
gurukamath Apr 22, 2026
d4c95a4
fix(evm_tools): avoid cloning unchanged fork template in ForkCache (#…
JackCC703 Apr 22, 2026
efb5636
fix: add missing raise for InvalidParameter in decode_g{1,2}_scalar_p…
astrion-coder Apr 22, 2026
8d8301c
fix(test-benchmark): zero tx included in `ecpairing` benchmark (#2749)
LouisTsai-Csie Apr 24, 2026
8db70f9
feat(ci,docs): build and publish a combined HTML and spec doc artifac…
danceratopz Apr 25, 2026
5a2cba1
fix(justfile): make json-loader pytest step collect filled fixtures (…
gurukamath Apr 26, 2026
e7043cc
feat(scripts): use dynamic addresses in ported static tests (#2695)
leolara Apr 26, 2026
93984e2
feat(tests): port stPreCompiledContracts/modexp 128-byte carry cases …
chfast Apr 27, 2026
1fdd7e3
fix(spec): fix bad formatting indroduced by large refactor (#2763)
Carsons-Eels Apr 27, 2026
c48ecea
feat(test-tools): t8n file streaming optimizations (#2751)
fselmo Apr 28, 2026
78fe5d2
feat(doc): sort fork directory listings chronologically (#2756)
SamWilsn Apr 28, 2026
6333758
fix(ci): install build deps in hive-consume dev mode (#2773)
danceratopz Apr 28, 2026
bf9dbb4
chore(ci): generate-all-formats for mainnet fixture releases (#2781)
danceratopz Apr 29, 2026
8a052aa
feat(doc): replace index with __init__.py (#2779)
SamWilsn Apr 30, 2026
e4c43d6
fix(tests) fix ported quadratic complexity tests (#2784)
danceratopz Apr 30, 2026
9d18733
fix(test-forks): treat transition fork variants as equal to canonical…
danceratopz Apr 30, 2026
8fa9a05
Update Nethermind exception mappings (#2794)
benaadams May 4, 2026
1f41b21
benchmarks/compute/precompile/test_sha256.py: Add 64 byte test cases.…
GottfriedHerold May 5, 2026
63b589e
feat(test-benchmark): storage initialization helper with 7702 authori…
LouisTsai-Csie May 6, 2026
2e71a20
feat(tools): use Hardfork for fork module loading (#2778)
JackCC703 May 6, 2026
5cdb055
chore(test-benchmark): re-enable `blockhash` benchmark (#2809)
LouisTsai-Csie May 6, 2026
2e120a0
feat(tests): add EIP-7928 BALs missing test when multiple consecutive…
0xEllie May 6, 2026
1292bce
test(test-benchmark): add `bn128_add` precompile special case benchma…
GottfriedHerold May 7, 2026
8671966
fix(tests): EIP-3860 & 1153 - parametrize max_code_size (#2780)
pdobacz May 7, 2026
0c25df6
refactor(tests): `tx_gas` and `cold_gas` for `gas_test` generator (#2…
pdobacz May 7, 2026
c9d8be0
chore(doc): remove unmaintained `docs/CHANGELOG` (#2810)
danceratopz May 7, 2026
462ee80
feat(test-forks): Revert gas-limit-aware `Fork`, fork-aware `Environm…
marioevz May 8, 2026
2eb175e
🧪 feat(tests): EIP-7928 BAL test for 7702 account call with low bala…
raxhvl May 11, 2026
f355726
chore(tests): stop mutating parametrize values in EL request helpers …
spencer-tb May 11, 2026
c29f894
refactor(test-benchmark): precompile input parameter format (#2817)
LouisTsai-Csie May 11, 2026
44923d4
feat(test-cli): always print full pytest command in ci & add to summa…
danceratopz May 11, 2026
87c52b4
refactor(specs): port state refactor to older forks (#2750)
gurukamath May 12, 2026
e45c0ed
feat(test): Increase BAL coverage with tests and BAL expectations for…
fselmo May 13, 2026
5c6cec7
Update besu repo reference from hyperledger/besu to besu-eth/besu (#2…
qu0b May 13, 2026
2037311
feat(spec-specs, spec-tests): add EIP-7708 ETH transfers emit a log (…
Carsons-Eels May 13, 2026
cd8c981
feat(spec-specs, spec-tests): add EIP-7778 block gas accounting witho…
LouisTsai-Csie May 13, 2026
b087114
fix(consume): add ethereum/execution-specs to SUPPORTED_REPOS (#2849)
edg-l May 13, 2026
cc8022a
refactor(tests): Use `filter_combinations` marker to drop infeasible …
danceratopz May 13, 2026
d61f7ac
feat(test-cli): Add support for testing block building via simulator …
fselmo May 13, 2026
c8117f2
feat(test-benchmark): add eth transfer cases for repricing (#2837)
jochem-brouwer May 14, 2026
267a2bd
test(tests): inter-dependent tx tests for BAL parallelization (#2851)
fselmo May 14, 2026
b3f5df5
feat(spec-specs, spec-tests): add EIP-7843 SLOTNUM opcode (#2853)
kclowes May 14, 2026
ea3552f
refactor(spec-specs,test-types): replace `pycryptodome` with `hashlib…
kevaundray May 15, 2026
c198ebf
feat(spec-specs, tests): add EIP-7954 Increase Maximum Contract Size …
Carsons-Eels May 15, 2026
78a79ee
bugfix(ci): bump hive start up timeout in CI (#2857)
kclowes May 15, 2026
ff14345
fix(tests): drop gas_price from EIP-7702 txs in BAL 7702 tests (#2862)
chfast May 15, 2026
892e6d1
feat(tests): eip7928 checklist v1 (#2859)
fselmo May 15, 2026
c6b7f17
chore(test-client-clis): update NethermindExceptionMapper strings for…
DarkLord017 May 18, 2026
8732abe
feat(tests): EIP-7843 Add test cases for multi-blocks and fork transi…
kclowes May 19, 2026
31d7e69
feat(tests): EIP-7778 multi-tx mixed gas regimes block accounting (#2…
chfast May 19, 2026
b7a2066
fix(ci): redirect Go caches to a per-job temp dir (#2774)
danceratopz May 19, 2026
852715c
feat(spec-specs, tests): Add EIP-7976 Increase Calldata Floor Cost (#…
felix314159 May 19, 2026
84b22c0
fix(specs): delay get_code calls in CALL-like opcodes (#2473)
jsign May 19, 2026
db42a89
feat(spec-specs, tests): Add EIP-7981 Increase Access List Cost (#2877)
felix314159 May 19, 2026
62b914c
fix(tests): call delegation access disambiguation (#2882)
gurukamath May 19, 2026
b522920
feat(spec-specs, tests): Add EIP-8024 Backward compatible SWAPN, DUPN…
felix314159 May 19, 2026
2150777
chore(spec-tool): check bpo forks in linter (#2803)
SamWilsn May 19, 2026
42fb0f6
fix(ci,tooling): skip code coverage of glacier/bpo/dao forks (#2886)
SamWilsn May 20, 2026
76f336f
chore(tests): create `spec.py` for EIP-7778 (#2887)
felix314159 May 20, 2026
bbacd74
feat(tests): EIP-7981 reject in access-list-byte floor gap with exact…
chfast May 20, 2026
c3a7b6b
feat(tests): EIP-7976 reject exact-balance tx in Prague/Amsterdam flo…
chfast May 20, 2026
89c133e
chore(specs): add missing type annotations (#2868)
SamWilsn May 20, 2026
1de389b
feat(tests): extend BALs coverage (#2854)
fselmo May 20, 2026
55d774b
chore: updated error mapping for reth devnet 7 (#2890)
Rimeeeeee May 21, 2026
29473de
feat(tests): EIP-7928 BAL withdrawal predeploy balance read across tx…
edg-l May 22, 2026
810c184
feat(tests): EIP-7928 self destruct to system address with 0 value (#…
taratorio May 22, 2026
2de6b9f
feat(test-benchmark): add more modexp precompile benchmark scenario (…
GottfriedHerold May 25, 2026
377a3aa
fix(test-client-clis): detect EELS-style OutOfGasError in GasExhausti…
leolara May 25, 2026
244afe0
feat(tests): Extend coverage for BAL (#2897)
raxhvl May 26, 2026
1596cf6
feat(tests): stateful test filling for benchmark tests (#2637)
fselmo May 26, 2026
1e2f3a3
chore: remove repricing tag for some bench (#2921)
LouisTsai-Csie May 27, 2026
d89c7ce
feat(tests,ci): Verify filled benchmark fixtures against EELS via jso…
danceratopz May 27, 2026
c67cd90
chore(specs): drop BAL type aliases except BlockAccessIndex (#2294)
kevaundray May 27, 2026
1787c74
refactor(tests): inline ids and descriptions in point evaluation para…
chfast May 27, 2026
0b18525
feat(test-consume): Validate RPC header fields in consume rlp (#2895)
kclowes May 27, 2026
d5b734b
refactor(src,tests): fix spelling error. KECCACK => KECCAK (#2931)
Carsons-Eels May 28, 2026
4441398
feat(tests): EIP-4844 point evaluation -G1 and G1 doubling vectors (#…
chfast May 28, 2026
efd53ff
feat(tests): extend BAL create collision test cases (#2917)
fselmo May 28, 2026
abf6ff6
feat(tests): BLOCKHASH recency window in state-test runner (#2943)
felix314159 Jun 1, 2026
d7def91
feat(tests): add EIP-8024 gas boundary and SWAPN invalid-immediate te…
chfast Jun 1, 2026
7df3b8b
chore(specs): refactor block reward and fee refunds
SamWilsn May 25, 2026
d964fd5
fix(test-tests): Add fork name to cached blob filename to prevent xdi…
kclowes Jun 2, 2026
cb77cc5
feat(tests): EIP-7928 catch per-tx no-op SSTORE after prior tx write …
pk910 Jun 2, 2026
14eca5d
docs: fix TransactionEnvironment docstring
nanookclaw May 28, 2026
7771d27
fix(tests): accept tx- or block-level exception for over-budget block…
chfast Jun 3, 2026
b47f025
feat(consume direct, tests): add erigon support, also add test to sho…
felix314159 Jun 3, 2026
6137bb3
chore: bump ethereum-types and ethereum-rlp (#2952)
SamWilsn Jun 4, 2026
21c515a
chore(packaging): ignore local memory files (CLAUDE.local.md, .mb/, m…
leolara Jun 8, 2026
e2f9ce8
chore(spec): pick up ethereum-types with UintFlag
SamWilsn Jun 8, 2026
f0ab153
chore(spec): rst -> md for MPT
SamWilsn May 6, 2026
9c2813e
chore(specs): add final decorator (#2934)
SamWilsn Jun 9, 2026
48e28d9
Merge remote-tracking branch 'upstream/forks/amsterdam' into upstream
pdobacz Jun 9, 2026
ab269dc
Port upstream refactors to monad_eight and monad_nine
pdobacz Jun 11, 2026
2f59088
Skip blob test collection for Monad forks
pdobacz Jun 10, 2026
be0dc67
Fix CI, incl. remove unnecessary workflows
pdobacz Jun 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
2 changes: 1 addition & 1 deletion .claude/commands/edit-workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

## Validation

Run `uvx tox -e static` before committing — this runs `actionlint` to validate YAML syntax and structure.
Run `just lint-actions` before committing to validate YAML syntax and structure.
13 changes: 6 additions & 7 deletions .claude/commands/lint.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,30 @@ Run the full static analysis suite and fix issues. This matches the CI check on
## Step 1: Run the Full Check

```bash
uvx tox -e static
just static
```

This runs ruff, mypy, codespell, ethereum-spec-lint, and actionlint in one pass. If everything passes, you're done.

## Step 2: Auto-Fix Formatting and Lint Issues

If tox reports ruff errors, run these first — they resolve most issues automatically:
If static checks report ruff errors, run the fix recipe first — it resolves most issues automatically:

```bash
uv run ruff format
uv run ruff check --fix
just fix
```

## Step 3: Resolve Remaining Issues Manually

After auto-fix, re-run to see what's left:

```bash
uvx tox -e static
just static
```

- **Remaining ruff issues**: fix manually (auto-fix can't handle all rules)
- **mypy errors**: fix type annotations, add missing types, correct signatures
- **codespell errors**: fix typos, or add intentional words to `whitelist.txt`
- **codespell errors**: fix typos, or add intentional words via `just whitelist <word>`
- **ethereum-spec-lint errors**: fix import isolation violations (see `/implement-eip` for import rules)
- **actionlint errors**: fix workflow YAML issues (see `/edit-workflow`)

Expand All @@ -38,5 +37,5 @@ uvx tox -e static
Re-run until clean:

```bash
uvx tox -e static
just static
```
36 changes: 36 additions & 0 deletions .claude/commands/pytester.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Pytester

Guide for pytester-based plugin/CLI tests. Run before writing or modifying these tests.

## Which execution mode to use

- **`runpytest()`** — default. In-process, fast, full `RunResult` API (`assert_outcomes()`, `fnmatch_lines()`).
- **`runpytest_subprocess()`** — use only when in-process causes state leakage (Pydantic cache pollution, global mutation in `pytest_configure`). Same `RunResult` API.
- **Raw `subprocess.run()`** — never use alongside pytester. Use `runpytest_subprocess()` instead.

Subprocess isolation masks bugs rather than fixing them. Prefer fixing the root cause and use subprocess as defense-in-depth.

## Expected inner failures

`runpytest_subprocess()` replays inner output to outer stdout (by design). Suppress with `capsys.readouterr()`:

```python
def test_expected_failure(pytester: Any, capsys: Any, pytestconfig: Any) -> None:
result = pytester.runpytest_subprocess(...)
capsys.readouterr() # suppress inner failure bleed
assert result.ret != 0
output = "\n".join(result.outlines + result.errlines)
# conditional print for -s debugging
if pytestconfig.getoption("capture") == "no":
with capsys.disabled():
print(output)
```

## RunResult API

Prefer `assert_outcomes()` and `fnmatch_lines()` over manual `any(... in line ...)` — better failure messages.

- `result.ret` — exit code
- `result.outlines` / `result.errlines` — line lists
- `result.assert_outcomes(passed=N, failed=N)`
- `result.stdout.fnmatch_lines(["*pattern*"])`
290 changes: 290 additions & 0 deletions .claude/commands/write-docstring.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,290 @@
# Write Docstring

Conventions for writing docstrings in `src/ethereum/`. Docstrings are the primary prose of the specification — they read as a narrative explaining how Ethereum works, not as traditional Python API documentation. They are rendered into HTML by docc, which parses them as **Markdown** (via mistletoe). Run this skill before writing or modifying docstrings.

## General Rules

- **Markdown only** — no reStructuredText (`.. directives::`, `:param:`, RST section underlines)
- 79-character line limit (same as code)
- Imperative mood for summaries ("Obtain" not "Obtains", "Return" not "Returns")
- Summary on the line after opening `"""`
- Blank line after the summary for multi-line docstrings
- For multi-line docstrings, the closing `"""` should be on its own line
- No `__init__` docstrings (D107 is disabled), only the class itself is documented
- Reference link definitions go at the end of the docstring, after a blank line
- Do not include constants/numeric values in the docstring (values in docstrings can easily desync with the code, and no tool will detect it)
- Avoid restating what the code is doing (the code should speak for itself)
- Avoid mentioning the current fork unnecessarily (creates noisy diffs between forks)
- Docstrings should be reserved for meaningful specification, while comments (`# ...`) can be used to explain particulars of the Python reference implementation

## Module Docstrings

Module docstrings introduce the concepts in the module. They should read as narrative prose — imagine a textbook chapter opening.

Start with a one-line summary, then expand with paragraphs that explain what the module contains and why. Use cross-references to link to the key types and functions defined in the module.

```python
"""
Ethash is a proof-of-work algorithm designed to be [ASIC] resistant through
[memory hardness][mem-hard].

To achieve memory hardness, computing Ethash requires access to subsets of a
large structure. The particular subsets chosen are based on the nonce and block
header, while the set itself is changed every [`epoch`].

At a high level, the Ethash algorithm is as follows:

1. Create a **seed** value, generated with [`generate_seed`] and based on the
preceding block numbers.
1. From the seed, compute a pseudorandom **cache** with [`generate_cache`].
1. From the cache, generate a **dataset** with [`generate_dataset`]. The
dataset grows over time based on [`DATASET_EPOCH_GROWTH_SIZE`].
1. Miners hash slices of the dataset together, which is where the memory
hardness is introduced. Verification of the proof-of-work only requires the
cache to be able to recompute a much smaller subset of the full dataset.

[`DATASET_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.DATASET_EPOCH_GROWTH_SIZE
[`generate_dataset`]: ref:ethereum.ethash.generate_dataset
[`generate_cache`]: ref:ethereum.ethash.generate_cache
[`generate_seed`]: ref:ethereum.ethash.generate_seed
[`epoch`]: ref:ethereum.ethash.epoch
[ASIC]: https://en.wikipedia.org/wiki/Application-specific_integrated_circuit
[mem-hard]: https://en.wikipedia.org/wiki/Memory-hard_function
"""
```

Short modules that need no narrative can use a single-line summary:

```python
"""
Utility functions used in this specification.
"""
```

## Function Docstrings

Function docstrings describe what the function does and why, as part of the specification narrative. Reference parameters inline with backticks — do **not** use formal `Parameters`, `Returns`, or `Raises` sections.

### Short (summary only)

```python
def convert(balance: str) -> U256:
"""
Convert a string in either hexadecimal or base-10 to a `U256`.
"""
```

### Multi-paragraph (with context)

```python
def add_genesis_block(
hardfork: GenesisFork, chain: Any, genesis: GenesisConfiguration
) -> None:
"""
Add the genesis block to an empty blockchain.

The genesis block is an entirely sui generis block (unique) that is not
governed by the general rules applying to all other Ethereum blocks.
Instead, the only consensus requirement is that it must be identical to
the block added by this function.

The initial state is populated with balances based on the Ethereum presale
that happened on the Bitcoin blockchain. Additional ether worth 1.98% of
the presale was given to the foundation.

The `nonce` field is `0x42` referencing Douglas Adams' "HitchHiker's Guide
to the Galaxy".

On testnets the genesis configuration usually allocates 1 wei to addresses
`0x00` to `0xFF` to avoid edge cases around precompiles being created or
cleared (by [EIP-161]).

[EIP-161]: https://eips.ethereum.org/EIPS/eip-161
"""
```

### With cross-references

```python
def cache_size(block_number: Uint) -> Uint:
"""
Obtain the cache size (in bytes) of the epoch to which `block_number`
belongs.

See [`INITIAL_CACHE_SIZE`] and [`CACHE_EPOCH_GROWTH_SIZE`] for the initial
size and linear growth rate, respectively. The cache is generated in
[`generate_cache`].

The actual cache size is smaller than simply multiplying
`CACHE_EPOCH_GROWTH_SIZE` by the epoch number to minimize the risk of
unintended cyclic behavior. It is defined as the highest prime number below
what linear growth would calculate.

[`INITIAL_CACHE_SIZE`]: ref:ethereum.ethash.INITIAL_CACHE_SIZE
[`CACHE_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.CACHE_EPOCH_GROWTH_SIZE
[`generate_cache`]: ref:ethereum.ethash.generate_cache
"""
```

## Class Docstrings

Brief summary of what the class represents, with optional narrative and cross-references.

```python
class GenesisConfiguration:
"""
Configuration for the first block of an Ethereum chain.

Specifies the allocation of ether set out in the pre-sale, and some of
the fields of the genesis block.
"""
```

```python
class EvmTracer(Protocol):
"""
[`Protocol`] that describes tracer functions.

See [`ethereum.trace`] for details about tracing in general, and
[`__call__`] for more on how to implement a tracer.

[`Protocol`]: https://docs.python.org/3/library/typing.html#typing.Protocol
[`ethereum.trace`]: ref:ethereum.trace
[`__call__`]: ref:ethereum.trace.EvmTracer.__call__
"""
```

## Attribute Docstrings

docc documents any assignment that is followed by a bare string literal. This is non-standard Python — normally only modules, classes, and functions can have docstrings. Place a triple-quoted string immediately after the assignment.

This works for **constants**, **class fields**, **module-level variables**, and **type aliases**.

### Constants

```python
EPOCH_SIZE = Uint(30000)
"""
Number of blocks before a dataset needs to be regenerated (known as an
"epoch".) See [`epoch`].

[`epoch`]: ref:ethereum.ethash.epoch
"""
```

### Class fields

```python
class Example:
chain_id: U64
"""
Discriminant between diverged blockchains; `1` for Ethereum's main network.
"""
```

### Module-level variables

```python
_evm_trace: EvmTracer = discard_evm_trace
"""
Active [`EvmTracer`] that is used for generating traces.

[`EvmTracer`]: ref:ethereum.trace.EvmTracer
"""
```

### Type aliases

```python
TraceEvent = (
TransactionStart
| TransactionEnd
| PrecompileStart
| PrecompileEnd
| OpStart
| OpEnd
| OpException
| EvmStop
| GasAndRefund
)
"""
All possible types of events that an [`EvmTracer`] is expected to handle.

[`EvmTracer`]: ref:ethereum.trace.EvmTracer
"""
```

## Cross-References

docc resolves Markdown reference links with the `ref:` scheme into hyperlinks in the generated documentation.

### Internal (to other Python objects)

Use backtick-wrapped names as the link text, with `ref:` pointing to the fully-qualified path:

```
[`ForkCriteria`]: ref:ethereum.fork_criteria.ForkCriteria
[`generate_cache`]: ref:ethereum.ethash.generate_cache
```

Short aliases work when the full name is unwieldy:

```
[ds]: ref:ethereum.ethash.DATASET_EPOCH_GROWTH_SIZE
```

### External URLs

Standard Markdown reference links:

```
[ASIC]: https://en.wikipedia.org/wiki/Application-specific_integrated_circuit
[EIP-3155]: https://eips.ethereum.org/EIPS/eip-3155
```

Bare URLs in angle brackets for inline use:

```
Available at <https://github.com/ethereum/genesis_block_generator>.
```

If a URL is too long to include because of the line length limit, you can add `# noqa: E501` after the trailing `"""` to squelch the warning (but this should be a last resort).

### Usage in text

Reference links are used inline with brackets:

```
For these intentional forks to succeed, all participants need to agree on
exactly when to switch rules. The agreed upon criteria are represented by
subclasses of [`ForkCriteria`], like [`ByBlockNumber`] and [`ByTimestamp`].
```

## Markdown Formatting

- `_italic_` to introduce domain terms: `_Genesis_ is the term for...`
- `**bold**` to highlight key concepts: `Create a **seed** value`
- Backticks for code references: `` `block_number` ``, `` `0x42` ``
- Numbered lists (`1.`) for sequential steps
- Bullet lists (`-`) for unordered items
- Markdown headings are rarely needed inside docstrings; use paragraphs instead

## Anti-Patterns

- **No RST directives**: `.. contents::`, `.. note::`, `:param:`, `:returns:` — these are outdated
- **No NumPy/Google sections**: no `Parameters\n----------` or `Args:` blocks
- **No RST section underlines**: `Introduction\n------------` is RST, not Markdown
- **No type repetition in docstrings**: types come from annotations, not prose
- **No empty boilerplate**: don't write `"""Ethereum Specification."""` with a `.. contents::` block — write real narrative or a concise summary
- **Don't skip attribute docstrings**: constants and fields deserve explanations

## Reference Files

For examples of well-written docstrings, see:

- `src/ethereum/ethash.py` — narrative module + function docstrings
- `src/ethereum/genesis.py` — class, attribute, and multi-paragraph function docstrings
- `src/ethereum/trace.py` — class, attribute, and protocol docstrings
- `src/ethereum/fork_criteria.py` — narrative module docstring with Markdown formatting

If these files no longer exist or are no longer good examples, abort with an appropriate error message.
4 changes: 4 additions & 0 deletions .claude/commands/write-test.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ Conventions and patterns for writing consensus tests. Run this skill before writ
- `@pytest.mark.parametrize("name", [pytest.param(val, id="label"), ...])` with descriptive `id=` strings
- Stack parametrize decorators for multiple dimensions

## Unit Tests (execution_testing package)

Plain pytest. Tests are co-located with each module under `packages/testing/src/execution_testing/` in a sibling `tests/` directory. When adding a guardrail or validation, verify the tests fail without the change and pass with it.

## After Writing Tests

After writing or modifying tests, ask the user: "Would you like me to load the `/fill-tests` skill to verify the new tests fill correctly? (This loads an additional skill into context.)" If they agree, run `/fill-tests`, fill the new tests, then inspect the generated fixture JSON to verify the fixture contents match what the test intends.
Expand Down
Loading