Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
600a120
bug(test-base-types): Conversion methods use `ValueError` (#3394)
marioevz Aug 19, 2026
89f2f04
feat(tests): add BAL storage slot numeric ordering test (#3382)
spencer-tb Aug 19, 2026
ce0509a
fix(consume): map reth BAL slot-miss rejection (#3392)
mattsse Aug 19, 2026
3d473e8
feat(tests): EIP-7928 - union reverted storage reads across transacti…
chfast Aug 20, 2026
ac0bf4f
fix(evm-tools): restore state test compatibility (#3409)
danceratopz Aug 22, 2026
78d8b0d
feat(test-specs): add ssz model into the engine payload class (#3294)
RazorClient Aug 22, 2026
7ae0582
feat(tests): EIP-7702 - keep authority storage when clearing a delega…
chfast Aug 24, 2026
df93c00
feat(tests): EIP-7702 - precompile calls from a delegated frame (#3420)
chfast Aug 24, 2026
263606b
test(spec-specs): add unit tests for get_last_256_block_hashes (#3397)
shubham5080 Aug 24, 2026
b6209f2
perf(test-client-cli): skip redundant BAL hash (#3430)
jochem-brouwer Aug 24, 2026
786c0d4
perf(test-type): cache ecrecover and optimize function calls to ecrec…
jochem-brouwer Aug 24, 2026
2ce2191
chore(tests): remove EIP-7610 create collision tests (#3417)
spencer-tb Aug 25, 2026
74153f7
fix(test-execute): ignore tests/spec_tools during collection (#3450)
danceratopz Aug 26, 2026
bd443d9
feat(tests): expand create collision matrix and add balance-only case…
danceratopz Aug 26, 2026
6711bfd
feat(tests): EIP-8037 - consume spilled state gas along a halt chain …
chfast Aug 26, 2026
e73282e
feat(tests): EIP-8037 - pin gas on the unasserted child-halt spill te…
spencer-tb Aug 26, 2026
50f3df9
refactor(tests): EIP-8037 test gas calculation logic and post state v…
LouisTsai-Csie Aug 26, 2026
5a7cd6b
fix(evm-tools): accept empty hex transaction values (#3424)
danceratopz Aug 26, 2026
e221d0c
chore(tests): add genesis block header field BAL checklist (#3416)
shubham5080 Aug 26, 2026
20f7f62
refactor(test-benchmark): tidy SSTORE storage benchmark (#3442)
chfast Aug 26, 2026
abbe057
feat(test-fill): Optimistic grouping flag (#3390)
marioevz Aug 27, 2026
4add503
feat(test-vm): implement placeholder for bytecode (#2103)
LouisTsai-Csie Aug 27, 2026
d8a126e
fix(test-cli): ignore `tests/{json_loader,spec_tools}` with `eip_vers…
mkzung Aug 28, 2026
241f6a8
fix(tests): enhance & un-skip Amsterdam ported static SSTORE, refund …
spencer-tb Aug 28, 2026
d9bc249
fix(tests): undecodable BAL is an invalid payload (#3463)
nerolation Aug 28, 2026
c4deda5
refactor(tests): enhance EIP-8037 test coverage part 2 (#3449)
LouisTsai-Csie Aug 28, 2026
e8e9948
fix(consume): map geth empty system contract rejection to SYSTEM_CONT…
barnabasbusa Aug 31, 2026
aee3eb2
test(tests): ECRECOVER - cover R == -G with u1 < u2 and u1 == u2 (#3459)
chfast Aug 31, 2026
2ae4255
chore(deps): bump ethereum-hive to v0.1.0 (#3472)
danceratopz Aug 31, 2026
41e5999
fix(doc): remove broken GitPOAP badge (#3474)
danceratopz Aug 31, 2026
3e59e29
feat(test-cli): add JSON output and optimization analysis to `groupst…
danceratopz Aug 31, 2026
6a2a98b
fix(test-consume): better xdist detection for enginex (#2793)
danceratopz Aug 31, 2026
c7691a6
feat(tests): EIP-7928 - storage reads of a recreated destroyed accoun…
chfast Aug 31, 2026
c563375
chore(tooling): forbid Claude session links in commits and PRs (#3481)
spencer-tb Aug 31, 2026
6eb68ed
feat(tests): EIP-7928 max nonce boundary check for BAL; update refspe…
fselmo Aug 31, 2026
e5b6e3b
fix(test-forks): model the pre-Berlin gas and refund schedules (#3480)
spencer-tb Sep 1, 2026
4598727
fix(test-specs): calculate transaction fixture gas from context (#3491)
danceratopz Sep 1, 2026
2909015
feat(tests): add type-0 transaction RLP validity tests (#3156)
chfast Sep 1, 2026
ef914fe
chore(tests): clean up EIP-7928 spec.py ``Spec`` class (#3496)
fselmo Sep 1, 2026
70c3511
feat(tests): pin cross-frame state gas refund placement and settlemen…
spencer-tb Sep 1, 2026
117c924
fix(tests): assert zero withdrawal post-state (#3476)
iamomm-hack Sep 1, 2026
3d3d43b
refactor(tests): enhance EIP-8037 test coverage part 3 (#3485)
LouisTsai-Csie Sep 1, 2026
814b313
feat(tests): cover a cross-frame state gas refund after a delegation …
chfast Sep 2, 2026
8faf36a
feat(tests): cover a cross-frame state gas refund with a funded reser…
chfast Sep 2, 2026
76910d3
fix(test-specs): refuse RLP blockchain fixtures for engine-payload-on…
spencer-tb Sep 2, 2026
a7d4186
feat(tests): add precompile as block coinbase coverage (#3462)
shubham5080 Sep 2, 2026
1e7d0e7
fix(test-specs): fail loudly if a test sets env fields not supported …
spencer-tb Sep 2, 2026
ad19524
feat(tests): sweep the refund merge over every call and create opcode…
chfast Sep 2, 2026
0d9d919
feat(tests,test-specs): EIP-7928 - reject non-minimally encoded BAL s…
nerolation Sep 2, 2026
fc701a4
chore(test-specs): avoid silent mistakes when writing tests (#3510)
fselmo Sep 2, 2026
1855bb1
feat(tests): EIP-6110 maximum CL deposits test (#3483)
marioevz Sep 3, 2026
947ef52
fix(tests,test-fill): fix enginex fills for BAL forks and improve the…
spencer-tb Sep 3, 2026
b462ba2
refactor(tests): separate the gas window and receipt tests (#3512)
chfast Sep 3, 2026
1d340aa
feat(tooling): share agent skills across Codex and Claude (#3514)
spencer-tb Sep 3, 2026
fb781c3
Merge upstream/forks/amsterdam into from-upstream
pdobacz Sep 3, 2026
e436c56
resolve the upstream merge conflicts
pdobacz Sep 3, 2026
2e0b9de
propagate the upstream fork changes into the Monad forks
pdobacz Sep 3, 2026
a16a615
fix the statetest t8n senders_authorities input
pdobacz Sep 3, 2026
6f806d2
docs(skills): add the upstream merge skill
pdobacz Sep 3, 2026
9e5b1a6
docs(skills): list the fork's own skills in AGENTS.md
pdobacz Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: adopt-upstream-eip
description: Adopt a single upstream EIP into a work-in-progress Monad fork.
---

# Adopt Upstream EIP

Adopt a single upstream EIP into a work-in-progress Monad fork and release
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: assess-eip
description: Assess an EIP's implementation complexity and scope.
---

# Assess EIP

Structured assessment of EIP implementation complexity. When invoked with an EIP number or description, perform the following analysis.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,25 @@
---
name: audit-config
description: Check whether repository guidance and skills are still accurate.
---

# Audit Config

Periodic verification skill to prevent CLAUDE.md and skills from going stale. Run this manually to check freshness (e.g., after a major refactor, before a release, or when onboarding).
Periodic verification skill to prevent `AGENTS.md` and skills from going stale.
Run this manually to check freshness (e.g., after a major refactor, before a
release, or when onboarding).

## Checks to Perform

### 1. Verify File Paths

Check that every file path or directory referenced in `CLAUDE.md` and `.claude/commands/*.md` still exists. Report any broken references.
Check that every file path or directory referenced in `AGENTS.md` and
`.agents/skills/*/SKILL.md` still exists. Report any broken references.

Confirm that `CLAUDE.md` is a symlink to `AGENTS.md`. Confirm that every
`.agents/skills/<name>/` directory has a corresponding
`.claude/skills/<name>` symlink that points back to it, and that there are no
orphaned Claude skill links.

### 2. Verify CLI Commands

Expand All @@ -28,7 +41,8 @@ Spot-check code patterns mentioned in skills against actual code:

### 4. Verify Fork List

Check that the fork order and default branch mentioned in `CLAUDE.md` match reality by inspecting `src/ethereum/forks/` and git branch configuration.
Check that the fork order and default branch mentioned in `AGENTS.md` match
reality by inspecting `src/ethereum/forks/` and git branch configuration.

### 5. Verify Docs References

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: edit-workflow
description: Apply repository conventions when editing GitHub Actions workflows.
---

# Edit Workflow

GitHub Actions conventions. Run this skill before modifying workflow files in `.github/`.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: eip-checklist
description: Track EIP test coverage with the repository checklist system.
---

# EIP Checklist

Guide for using the EIP testing checklist system to track test coverage. Run this skill when working on EIP test coverage or checklists.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: enhance-ported-test
description: Clean up and future-proof a ported static test.
---

# Enhance Ported Test

Future-proof and clean up a test under `tests/ported_static/`. These tests were
Expand Down Expand Up @@ -125,7 +130,8 @@ to keep it.

### 2. Remove `gas_limit` from the transaction (if gas is not the subject)
This is the common case and belongs early. Omitting `gas_limit` maxes out the
gas the tx receives, so the body executes fully. See `write-test.md` "Transactions".
gas the tx receives, so the body executes fully. See the [Transactions section]
(../write-test/SKILL.md#transactions) of the `write-test` skill.
- **Remove it** when the test is about *behavior* and just needs to run to
completion. This also lets you delete any per-fork gas band-aids (e.g.
`fork.is_eip_enabled(8037)` budget bumps) and often the `fork` param itself.
Expand Down Expand Up @@ -526,69 +532,11 @@ persists with the sentinel) plus the callee-side observable already
separate the outcomes. Validated on
`test_contract_creation_make_call_that_ask_more_gas_then_transaction_provided`.

**Any *exact* budget off the intrinsic calculator needs the EIP-7623
kwarg.** `transaction_intrinsic_cost_calculator()` returns `max(intrinsic,
calldata_floor)`, but the floor is only compared against *after* execution —
it is never deducted up front. So whenever the derived number stands for
"gas taken before the first opcode" — a one-gas OOG boundary, an exact
success budget, an EIP-3529 refund cap — pass
`return_cost_deducted_prior_execution=True` if the transaction carries
calldata. **The bug hides until an EIP-7981 fork:** the delta is 0 from
Berlin through Osaka and 238 on Amsterdam for a 5-byte creation payload, so
a boundary tuned without the kwarg passes on every fork that exists today
and silently goes slack on the future one — and the symptom is an *OOG arm
that stops OOG-ing*, i.e. a test that fails only once someone runs
`--fork Amsterdam`.
**Keep the default (no kwarg) when the number is a validity floor** rather
than an execution budget: a tx whose `gas_limit` falls below
`max(intrinsic, floor)` is rejected outright, which is a different outcome
from running out of gas.
Validated on `test_refund_suicide50procent_cap` and
`test_transaction_collision_to_empty2`, whose OOG arm had been loosened to
"half the store's cost" to work around this, with a comment misattributing
it to a pre-Shanghai init-code word cost.

**Read the trace when a derived budget does not line up.** `fill --traces
--evm-dump-dir <dir>` writes, per transaction, `input/txs.json`,
`output/result.json` and a `trace-*.jsonl`. Subtracting the first trace
entry's `gas` from the tx `gas` gives the intrinsic the EVM *actually*
charged, which is what settles a disagreement with any calculator; on
EIP-8037 forks the per-step `gasCost`/`stateGasCost` split shows where a
composite's cost really lands. Far faster than bisecting `gas_limit` by
re-filling, and it produced the 238 above in one run.

**Gates are not costs, and `gas_cost()` only knows costs.** Several EVM
rules are *preconditions on `gas_left`* rather than charges, so a budget
derived from `gas_cost(fork)` is exactly right and still too small. The
canonical one is EIP-2200 (Istanbul+): **any** `SSTORE` halts when it runs
with `CALL_STIPEND` (2300) gas or less still available — including a
100-gas dirty-warm rewrite. No amount of fixing `_calculate_sstore*` can
express that, because it is not part of the price.

*Tell it apart in a trace:* a gated halt shows `gasCost: 0x0` next to an
`error`, while a genuine can't-afford shows the real cost. `SSTORE
gas_left=2300 cost=0 OutOfGasError` is the signature.

*Derive the headroom instead of padding.* The **last** gated op is the one
running closest to empty, so it sets the requirement:
```
last_charge = Op.SSTORE(key_warm=True, original_value=…, current_value=…,
new_value=…).gas_cost(fork) # bare `55`, no PUSHes
headroom = fork.gas_costs().CALL_STIPEND - last_charge + 1
gas_limit = overhead + code.gas_cost(fork) + headroom
```
A bare opcode carrying only metadata prices the charge alone (same trick as
`Op.RETURN(code_deposit_size=n)`). This is what turns "add 5,000 and hope"
into a real one-gas boundary — and because it targets only the *last* gated
op, it is invariant in how many precede it. Validated on
`test_out_of_gas_contract_creation`, whose arms now straddle
`gas_left = 2301` / `2300` exactly.

*Same family, when an "impossible" budget is really a gate:* an
`SSTORE` in a `STATICCALL` subtree, `RETURNDATACOPY` reading past the
return buffer, stack under/overflow, an EIP-684 address collision. Each
aborts the frame outright rather than charging for it, so the fix is
always to model the gate, never to inflate the budget until it passes.
**Refund-cap derivations need the EIP-7623 kwarg.** The EIP-3529 cap's
base is the gas deducted before execution, which excludes the calldata
floor: pass `return_cost_deducted_prior_execution=True` to the intrinsic
calculator whenever the tx has calldata, or the derived `executed` (and
the cap) overstate. Validated on `test_refund_suicide50procent_cap`.

**A CREATE address collision burns the child's gas allowance** (the
EIP-684 path): the withheld child grant is consumed, nothing is created,
Expand All @@ -609,27 +557,15 @@ a derived budget that must survive pre-Istanbul forks needs an explicit
headroom constant for it (named, commented). Observed on
`test_revert_depth_create_address_collision`'s ConstantinopleFix sweep.

**Code-deposit cost comes from `Op.RETURN`'s metadata — never a per-byte
formula.** Annotate the init code's terminator,
`Op.RETURN(offset=o, size=n, code_deposit_size=n)`, and `gas_cost(fork)`
includes the deposit charge, correct on both sides of the EIP-8037 boundary
(10 bytes costs 2,000 before it; 15,306 after, once the per-byte price became
state gas). The annotated and unannotated forms assemble to **identical
bytes**, so building both yields an exact two-sided boundary out of the fork's
own model, with no EIP branch:
```
child = stage + Op.RETURN(offset=o, size=n)
child_with_deposit = stage + Op.RETURN(offset=o, size=n, code_deposit_size=n)
assert child.gas_cost(fork) <= granted < child_with_deposit.gas_cost(fork)
```
`fork.gas_costs().CODE_DEPOSIT_PER_BYTE` (200) is a **last resort**: it is the
*pre-8037* constant and understates the real charge ~7.5x on 8037 forks. Use
it only where understating is the safe direction — a *sufficiency* budget
overshoots, an "is this unaffordable?" guard stays conservative — and never in
a one-gas-short *boundary*, which it silently funds on Amsterdam. Branching on
`fork.is_eip_enabled(8037)` to patch it up is the wrong fix; the metadata
removes the branch entirely. Validated on
`test_create_oog_after_init_code_returndata_size`.
**EIP-8037 repriced the code deposit's regular part — boundaries beware.**
On 8037 forks the deposit charges only the keccak word cost
(`OPCODE_KECCAK256_PER_WORD * ceil32(len)/32`, ~6 gas) as regular gas plus
`len * 1530` state; `fork.gas_costs().CODE_DEPOSIT_PER_BYTE` (200) is the
*pre-8037* constant. Using 200/byte in a *sufficiency* budget merely
overshoots (safe); using it in a one-gas-short *boundary* silently funds
the deposit on Amsterdam. Branch on `fork.is_eip_enabled(8037)` for exact
deposit boundaries. Validated on
`test_create_oo_gafter_init_code_returndata_size`.

**Match the intrinsic calculator's kwargs to the transaction's shape.**
`fork.transaction_intrinsic_cost_calculator()()` defaults to
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: fill-tests
description: Fill test fixtures with the repository fill command.
---

# Fill Tests

CLI reference for the `fill` command. Run this skill before filling test fixtures. The `fill` command is pytest-based — all standard pytest flags work.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: grammar-check
description: Audit grammar in documentation and code comments.
---

# Grammar Check

Audit grammar in documentation and code comments.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: implement-eip
description: Implement EIP specification changes using repository conventions.
---

# Implement EIP

Patterns for implementing spec changes in `src/ethereum/forks/`. Run this skill before implementing an EIP or modifying fork code.
Expand All @@ -10,7 +15,7 @@ Each fork lives at `src/ethereum/forks/<fork_name>/`. Explore the latest fork di
- `fork.py` — state transition functions
- `blocks.py` — block structure and validation
- `transactions.py` — transaction types and processing
- `state.py` — state trie operations
- `state_tracker.py` — fork-specific state tracking
- `vm/instructions/__init__.py` — Ops enum + `op_implementation` dict
- `vm/gas.py` — gas constants and calculations
- `vm/precompiled_contracts/__init__.py` — precompile address constants
Expand Down
5 changes: 5 additions & 0 deletions .claude/commands/lint.md → .agents/skills/lint/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: lint
description: Run and fix the repository static analysis suite.
---

# Lint

Run the full static analysis suite and fix issues. This matches the CI check on every PR.
Expand Down
89 changes: 89 additions & 0 deletions .agents/skills/merge-from-upstream/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
---
name: merge-from-upstream
description: Merge upstream execution-specs into the fork's from-upstream branch.
---

# Merge From Upstream

Merge the current default branch of `ethereum/execution-specs` into the
`from-upstream` branch of `monad-developers/execution-specs`, carry the
applicable changes into the Monad forks, and verify the result. Run this
skill before starting such work.

The commit sequence is the deliverable as much as the merged tree is: a
reviewer reads the conflict resolution and the Monad propagation as
separate diffs, so never fold them into the merge commit or into each
other.

## 1. Prepare the branch

- Check out `from-upstream`.
- Verify it is not the head branch of a currently open PR.
- Reset it to the `monad-developers/execution-specs` default branch.

## 2. Record the fixture set baseline

Collect the tests the `tests-monad` release job fills, with
`--collect-only`, and save the result for the closing comparison. The
fill parameters live under the `monad` key in
`.github/configs/feature.yaml`; `.github/actions/build-fixtures` and the
`fill-release` recipe in the `Justfile` add the rest.

The `N/M tests collected` summary counts items before the filler drops
the ones that generate no fixture for the fork range, so it overstates
the release set. Take the node IDs, not that number.

## 3. Merge

- Fetch the upstream remote.
- Merge upstream's default branch as a merge commit, **leaving the
conflicts unresolved in the merge commit**.
- Stage the conflicted paths explicitly. Staging everything would also
commit untracked directories left behind by other branches.

## 4. Resolve the conflicts

Put the resolution in a separate commit after the merge commit.

## 5. Propagate into the Monad forks

Analyze the changes upstream made to its own forks (Amsterdam, Osaka,
Prague and the rest). Filter them to those that apply to the `MONAD_*`
forks inheriting those upstream forks, and apply those to the WET
implementations in `src/ethereum/forks`.

These files do not conflict, so nothing flags them. They still have to
accommodate the upstream change whenever it applies — for instance
because the Monad fork adopted the same EIP.

Do these changes in a further commit.

## 6. Stop for review

If anything about the changes so far is doubtful, stop and request human
review before verifying.

## 7. Verify

Lint, then fill. Base the fill on the `tests-monad` release command and
pass `--maxfail 1` so breakage surfaces early. Fill fine-grained first,
over the tests related to the touched files and features, then sweep the
full set.

A full sweep runs for hours. Split it into chunks that partition the
collected set, so no single run is long enough to be interrupted, and
check the chunk totals add up to the collected count.

## 8. Fix what the verification finds

Use follow-up commits: fold related changes together, keep unrelated
changes separate.

## 9. Report the fixture set change

Collect the release tests again with `--collect-only`, compare against
the step 2 baseline, and report the change in the resulting fixture set.

## 10. Stop for review

Once verification succeeds, stop and request human review.
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: pytester
description: Write and run isolated pytester-based plugin tests.
---

# Pytester

Guide for pytester-based plugin/CLI tests. Run before writing or modifying these tests.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: write-docstring
description: Write specification docstrings using repository conventions.
---

# 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.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
name: write-test
description: Write consensus tests using repository patterns and fixtures.
---

# Write Test

Conventions and patterns for writing consensus tests. Run this skill before writing or modifying tests.
Expand Down
1 change: 1 addition & 0 deletions .claude/skills/adopt-upstream-eip
1 change: 1 addition & 0 deletions .claude/skills/assess-eip
1 change: 1 addition & 0 deletions .claude/skills/audit-config
1 change: 1 addition & 0 deletions .claude/skills/edit-workflow
1 change: 1 addition & 0 deletions .claude/skills/eip-checklist
1 change: 1 addition & 0 deletions .claude/skills/enhance-ported-test
1 change: 1 addition & 0 deletions .claude/skills/fill-tests
1 change: 1 addition & 0 deletions .claude/skills/grammar-check
1 change: 1 addition & 0 deletions .claude/skills/implement-eip
1 change: 1 addition & 0 deletions .claude/skills/lint
1 change: 1 addition & 0 deletions .claude/skills/merge-from-upstream
Loading