Conversation
F4ever patch 1
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
…s and execution nodes
…g and event handling
… retry logic for transient errors
…c in services and tests
…date related logic in execution API
…elated configurations and services
…ions in environment files
feat: implement EJECTOR_SCOPE for multi-module support
chore: add required var to .env samples to prevent docker error
Feat/ejector improvements
Develop next
F4ever
approved these changes
May 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.