Skip to content

Tests: eth exec specs - #4064

Open
kollegian wants to merge 13 commits into
mainfrom
tests/exec-specs
Open

Tests: eth exec specs#4064
kollegian wants to merge 13 commits into
mainfrom
tests/exec-specs

Conversation

@kollegian

@kollegian kollegian commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add a standalone, informational post-merge workflow for Ethereum execution-spec coverage.
  • Run pinned ethereum/tests TransactionTests and RLPTests through Sei's go-ethereum fork.
  • Run Prague EEST across eight isolated devnet shards plus one converted legacy state-test runner.
  • Exclude the EIP-2929 precompile family until it has per-vector state isolation.

Testing performed

  • TransactionTests and RLPTests pass locally.
  • Verified the generated matrix contains eight regular shards and one ported-state runner.
  • Verified deterministic shard coverage with no duplicate or missing vectors.
  • Passed Ruff, shell syntax, actionlint, and whitespace checks.

@cursor

cursor Bot commented Sep 1, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Changes are confined to integration tests and post-merge CI; they do not alter chain consensus, RPC production code, or PR merge gates.

Overview
Adds integration_test/exec_specs/, a harness that runs pinned Ethereum execution-spec tests (EEST) in remote mode against live local Sei devnets, plus fast ethereum/tests TransactionTests/RLPTests through Sei’s go-ethereum fork.

The suite pins upstream revisions, applies sei-compat.patch (ordered tx submission, post-state polling, pending-tx RPC tolerance, funding/gas tweaks), and filters vectors via ignore/deselect lists and eest_plugin.py skips (known EIP-7623/EIP-6780 issues, persistent-chain limits). prepare_admin.ts funds an ephemeral seed account via existing precompile test helpers.

A new .github/workflows/execution-specs.yml runs only on main push (informational, not a PR gate): transaction/RLP job, matrix planning (8 shards + separate ported static state partition), shared GHCR devnet image build, per-shard devnet runs with JUnit artifacts, summarize step, and GHCR cleanup.

Reviewed by Cursor Bugbot for commit 7bd4bca. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

The latest Buf updates on your PR. Results from workflow Buf / buf (pull_request).

BuildFormatLintBreakingUpdated (UTC)
✅ passed✅ passed✅ passed✅ passedSep 2, 2026, 11:06 AM

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f497215. Configure here.

Comment thread .github/workflows/execution-specs.yml Outdated

@seidroid seidroid Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adds a post-merge, informational Ethereum execution-specs / legacy transaction-RLP harness (workflow, pinned upstream checkouts, a Sei compatibility patch, a pytest selection plugin, and reporting scripts). No production code is touched and I found no blockers; the findings are about CI signal, a destructive cache reset, and a few maintainability gaps in the selection/skip policy.

Findings: 0 blocking | 10 non-blocking | 7 posted inline

Blockers

  • None at the file/PR level.

Non-blocking

  • [suggestion] No tests cover the new Python helpers. eest_plugin.partition() / shard_for_nodeid() and plan_chains.build_matrix() decide which vectors run at all, and because every job is continue-on-error, a bug that silently deselects a whole shard looks identical to a green run. A small pytest for partition disjointness/completeness and for the emitted matrix would be cheap insurance.
  • [suggestion] patches/sei-compat.patch mutates upstream test bodies, not just the runner (removing @pytest.mark.pre_alloc_mutable from two ported_static tests, raising max_fee_per_gas in test_set_code_txs.py, adding pytest.skips in test_eip150_selfdestruct.py). Most of those hunks carry no rationale, so on the next revision bump there is no way to tell "required to run on a live chain" from "hides a Sei bug." A short comment per test-mutating hunk (or a note in the README) would make the rebase reviewable.
  • [suggestion] The push trigger still includes the author-marked # TEMP branch tests/exec-specs (.github/workflows/execution-specs.yml:8); remember to drop it before/right after merge so main does not carry a stray trigger.
  • 7 suggestion(s)/nit(s) flagged inline on specific lines.


# This checkout is a derived cache. Restore upstream before applying the
# versioned Sei compatibility patch.
git -C "${EEST_DIR}" reset --quiet --hard HEAD

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] reset --hard + clean --force -d (plus checkout --force above) silently destroy tracked and untracked work in EEST_DIR. That is safe for the default .cache/execution-specs, but EEST_DIR is user-overridable and pointing it at a real execution-specs checkout is exactly what someone iterating on sei-compat.patch would do. The sibling script already models the safe behavior — install_legacy_tests.sh refuses when git status --short is non-empty. Either refuse a dirty checkout here too, or restrict the destructive restore to the case where EEST_DIR is the default cache path.

Comment thread integration_test/exec_specs/patches/sei-compat.patch Outdated
Comment thread integration_test/exec_specs/plugin/eest_plugin.py Outdated
SkipRule(
id="eip7623-admission",
reason="Known Sei EIP-7623 transaction-admission issue.",
matches=_eip7623_admission,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] These rules skip vectors because of Sei defects ("Known Sei EIP-7623 transaction-admission issue", "Known Sei EIP-6780 repeated-SELFDESTRUCT issue"), which is different in kind from the surrounding rules that skip vectors unrepresentable on a persistent remote chain. Without a tracking issue on each SkipRule.id — and with the README listing no known-deviation table — these become permanent silent exclusions that nobody revisits once the bug is fixed. Adding the issue link to each reason (and a short deviations section in the README) keeps them auditable.

EEST_MAX_FEE_PER_BLOB_GAS="${EEST_MAX_FEE_PER_BLOB_GAS:-1}"
EEST_EOA_FUND_AMOUNT_DEFAULT="${EEST_EOA_FUND_AMOUNT_DEFAULT:-100000000000000000}"
EEST_SKIP_CLEANUP="${EEST_SKIP_CLEANUP:-1}"
EEST_TOLERATE_MALFORMED_PENDING_TX="${EEST_TOLERATE_MALFORMED_PENDING_TX:-1}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] EEST_TOLERATE_MALFORMED_PENDING_TX defaults to 1, so every run silently accepts eth_getTransactionByHash responses that fail schema validation as long as blockHash is null. The narrowing to pending responses is reasonable, but defaulting it on means a future regression in Sei's pending-transaction response shape is tolerated by the very suite meant to catch spec deviations, with no record of what the current deviation is. Worth documenting the specific malformed field(s) alongside the flag.


execution-specs:
name: Execution Specs (${{ matrix.name }})
needs: [ plan, prepare-cluster ]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] Because plan and prepare-cluster are both continue-on-error: true, a failure in either still lets this job start: all nine matrix entries claim ubuntu-large, reclaim disk, relocate the Docker data root, and then die at Download seid (or the matrix fails to evaluate at all when needs.plan.outputs.matrix is empty and fromJSON gets ''). Adding if: needs.prepare-cluster.result == 'success' && needs.plan.result == 'success' avoids burning nine large runners on a guaranteed failure.

Comment thread .github/workflows/execution-specs.yml Outdated
- name: Write run summary
run: |
python3 integration_test/exec_specs/scripts/summarize_reports.py \
integration_test/exec_specs/reports/downloaded || true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] summarize_reports.py deliberately returns 1 both when a report contains failures and when no reports were found, and || true (on top of continue-on-error: true on the job) throws both away. Since every job in this workflow is continue-on-error, the net effect is that "the harness broke and ran zero vectors" is indistinguishable from a healthy run. Keeping at least the no-reports case visible — drop || true here, or emit an explicit marker line into $GITHUB_STEP_SUMMARY — preserves that signal without making the workflow gate merges.

@codecov

codecov Bot commented Sep 1, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 60.23%. Comparing base (99debe3) to head (7bd4bca).
⚠️ Report is 7 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #4064      +/-   ##
==========================================
- Coverage   61.30%   60.23%   -1.08%     
==========================================
  Files        2161     2055     -106     
  Lines      189066   176721   -12345     
==========================================
- Hits       115909   106448    -9461     
+ Misses      62290    60430    -1860     
+ Partials    10867     9843    -1024     
Flag Coverage Δ
sei-db 69.80% <ø> (ø)
sei-db-state-db ?

Flags with carried forward coverage won't be shown. Click here to find out more.
see 106 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@masih masih left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exciting to see these landing 🙌

I need your help to understand the rationale behind continue on error and some of the patch work since as is they make the CI look green regardless or can shadow root causes.

+ # rejection tests. Only valid transactions should cause the
+ # remote pre-allocation layer to increase explicit funding.
+ if tx.error is not None:
+ continue

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm this would avoid funding every tx with error? This means we then mask expected errors with "insufficient funds".

I am curious, why?

An alternative is to fund invalid transactions as normal except for INSUFFICIENT_ACCOUNT_FUNDS?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are correct, updated the tests.

Comment thread .github/workflows/execution-specs.yml Outdated
name: Ethereum Transaction and RLP Tests
runs-on: ubuntu-latest
timeout-minutes: 20
continue-on-error: true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This means CI is effectively always green? ditto in other places.

What was the rationale for this ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this was an experiment from before and latest runs were all passing so I didnt notice. Getting too AI complacent I am afraid. Updated.

with:
pattern: exec-specs-*-${{ github.run_id }}
path: integration_test/exec_specs/reports/downloaded
- name: Write run summary

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should check expliclty the expected report name per chain, otherwise a partial failure gets swallowed up in a normal looking report?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated.


concurrency:
group: execution-specs-${{ github.ref }}
cancel-in-progress: false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this one remain false? I think it means if newer commits are pushed to branch, it doesn't cancel the older currently running ones. Setting to true can save runner time and cost.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This runs only when PR's are merged to main. I guess it would be good to have this running per merged PR so that we would know which PR is the issue.

@@ -0,0 +1,27 @@
/**

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was wondering do we need to use the mix of typescript, bash and python for these tests, or is it better if everything could be written in go?

@kollegian
kollegian requested a review from masih September 2, 2026 11:48

@masih masih left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🙌

)"
while read -r version; do
[[ -n "$version" ]] || continue
gh api --method DELETE "${base}/${package}/versions/${version}" || true

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would: remove || true; retry, attempt both packages, then fail if either operation failed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants