lidofinance / lidofinance/validator-ejector
Incomplete consensus batches advance the cursor past valid exit requests
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 16
- Forks
- 19
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 7
Description
Locations
validator-ejector/src/services/consensus-api/service.ts:226-240validator-ejector/src/services/exit-logs/fetcher.ts:175-182validator-ejector/src/services/exit-logs/service.ts:139-150
Summary
A successful CL batch response may omit requested validators without failing validation. Events for omitted validators are treated as invalid and discarded before the execution-log cursor advances beyond them.
Root cause
validatePublicKeys accepts the partial result returned by fetchValidatorsBatch, logs each missing index, and returns a reduced set rather than reporting an indeterminate batch.
getValidatorExitRequestEventsfilters events solely through that reduced set.makeExitLogsService.getLogscannot distinguish dependency omission from deterministic identity rejection and advances the block header unconditionally.
Impact
A stale, syncing, or otherwise incomplete CL response can suppress required validator exits even if another configured endpoint has complete state.
- The HTTP 200 response does not activate endpoint fallback.
- Any omitted subset of a batch can be lost for the lifetime of the process.
- Recovery requires a restart within the configured lookback or an explicit historical rescan, supporting medium severity for temporary core ejection denial.
Scenario
- The EL returns a valid finalized
ValidatorExitRequestwhose index and pubkey match canonical CL state. - The selected CL endpoint returns HTTP 200 but omits that index from the batch, for example while serving stale state.
validatePublicKeysexcludes the index without throwing, so the fetcher drops the event.- The exit-log service treats the batch as successful and advances its header past the event's block.
- The CL endpoint later recovers, but ordinary cycles never reload the discarded request and no exit is dispatched.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Read the listed ranges in validator-ejector/src/services/consensus-api/service.ts, exit-logs/fetcher.ts, and exit-logs/service.ts, starting with validatePublicKeys and getValidatorExitRequestEvents. Trace how omitted validators reach makeExitLogsService.getLogs; done means an incomplete successful batch is not treated as complete, the cursor does not pass valid requests, and recovery or another configured endpoint can handle the omission.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100