Skip to content

Develop to main#167

Merged
F4ever merged 40 commits into
mainfrom
develop
May 26, 2026
Merged

Develop to main#167
F4ever merged 40 commits into
mainfrom
develop

Conversation

@eddort
Copy link
Copy Markdown
Member

@eddort eddort commented May 18, 2026

No description provided.

F4ever and others added 30 commits December 9, 2025 11:19
Operators with multiple endpoints can now identify which URL[i] failed
without cross-referencing env config.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
makeFallback now mirrors broadcastAll: when every URL fails, throws
AggregateError carrying every cause for diagnostics rather than only
the last endpoint's error.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds explicit warning that JWT_SECRET_PATH applies to every URL in
EXECUTION_NODE, so operators with heterogeneous EL clients must sync
their jwt.hex files manually or skip JWT entirely.

Also captures pending multi-URL example/comment updates from the
broader fallback feature.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EL endpoints sometimes return HTTP 200 with a JSON-RPC error envelope
(e.g. -32603 internal, -32005 limit exceeded, -32000 server error).
Without this fix, a single broken provider returning RPC errors holds
the whole pool hostage because the response passes notOkError(), then
trips the DTO into ValidationError (terminal, no rotation).

Now elRequest inspects parsed JSON for an error.code in the server-error
set and throws HttpException(rpcErr, 502) so the fallback rotates to
the next URL. Deterministic codes (-32602, -32600) still pass through
unchanged - rotating won't help with malformed requests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Issues eth_chainId to every EXECUTION_NODE URL and reads
deposit_contract.chain_id from every CONSENSUS_NODE URL at boot,
refusing to start if any pair disagrees. Catches misconfigured
mixed-network URL lists (e.g. mainnet + testnet pasted together)
before any chain-specific signing happens.

Adds iterateAll() helper to src/lib/fallback for per-URL
success/failure capture without the short-circuiting that
makeFallback and broadcastAll do.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Silences IDE diagnostics for environments that don't pick up
tsconfig's vitest/globals types. Functionally equivalent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Updates TODO.md to reflect the five survey-identified follow-ups landed
on this branch (commits cd6d284, 4ef76c0, 4017009, 14305ba, 0da3ca8 +
a0d43a1). Refreshes test inventory counts (fallback 14→19, consistency
new=7, EL spec 8→10), updates verification results, adds a note about
test-fallback.ts not yet covering the new behaviours, and trims the
per-task code sketches now that the work is on disk.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EXECUTION_NODE and CONSENSUS_NODE now accept either a single URL or a
comma-separated list. The new url_list maker splits on commas, trims
whitespace, strips trailing slashes (any number), and rejects empty
results. Single-URL configs are unchanged (length-1 array).

Also adds optional VOTING_EVENTS_FRAME_BLOCKS (default 216_000 ~30d)
so e2e tests can shrink the dominant motion-event lookback.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ry exits

clRequest(path, cfg?) now wraps each consensus request in the fallback
helper, eliminating per-call ${normalizedUrl}/eth/v1/... concatenation.
All 9 call sites migrated. validatorInfo and exitRequest pass
notOkError() so 5xx triggers fallback rotation.

exitRequest now uses broadcastAll instead of clRequest: voluntary
exits fan out in parallel to every configured CL endpoint to maximise
gossip propagation; succeed if at least one accepts, AggregateError
otherwise.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Production default unchanged (216_000 ~= 30 days). Tests can now set
it to 1 to drop the dominant motion-event lookback, taking the
exit-logs e2e from 256s to 107s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Index [0] in places that previously held a single string. Mechanical
follow-on from EXECUTION_NODE/CONSENSUS_NODE becoming arrays.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Eight scenarios covering happy path, 5xx rotation, broadcast (full
success / partial success / total failure), single bad URL,
exhaustion, and JWT-with-bad-secret. Reads URLs from env so no
secrets live in source. retry(0) + abort(5_000) so bad-URL scenarios
complete in ~5s rather than ~45s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Working notes were transient; the PR description carries the feature
summary going forward.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat: multi-endpoint EL/CL fallback with broadcast for voluntary exits
@F4ever F4ever merged commit bd04f1c into main May 26, 2026
7 checks passed
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.

3 participants