# Lodestar — EIP-7732 Gloas fork choice and networking

Review date: 2026-10-27. Public source inspection only; no client, node, RPC, devnet experiment, or exploit was run. Findings concern Gloas-only branches; no live-Fulu vulnerability details are included.

## Pins and specification baseline

- **ChainSafe/lodestar `unstable`: `e4b4f615e68c1a4ea7c57632e6ed8d824624573f`**, committer date 2026-10-27T17:31:55Z; [head API](https://api.github.com/repos/ChainSafe/lodestar/commits/unstable).
- **ethereum/consensus-specs `master`: `8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2`**, committer date 2026-10-27T16:28:12Z; [head API](https://api.github.com/repos/ethereum/consensus-specs/commits/master).
- **Consensys/teku `master`: `2c35574b3373cbe8ad121a768d98f066aec05b73`**, committer date 2026-10-27T16:51:17Z; [head API](https://api.github.com/repos/Consensys/teku/commits/master).

The requested `Consensys-Incorporated/teku` head API returned the same Teku pin; citations use `Consensys/teku`. Cited Lodestar code was re-read from raw.githubusercontent.com at the pin, not GitHub HTML. All file links carry immutable commits and line ranges.

The [Glamsterdam meta EIP](https://eips.ethereum.org/EIPS/eip-7773#eips-scheduled-for-inclusion) schedules **2780, 7688, 7708, 7732, 7778, 7843, 7928, 7954, 7976, 7981, 7997, 8024, 8037, 8038, 8045, 8061, 8246, 8282**; networking/informational lists are separate, mainnet activation unspecified. Prose version: [EIPs master `d4c575521d99ec881a444ab3af604e684b5f0743`](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7773.md). EIPs have no independent semantic version. [EIP-7732](https://eips.ethereum.org/EIPS/eip-7732), Last Call, delegates CL rules to consensus-specs.

EL cross-check: [Amsterdam `16898000911c1e3caa57be08509536c10ae92d3e`](https://github.com/ethereum/execution-specs/blob/16898000911c1e3caa57be08509536c10ae92d3e/src/ethereum/forks/amsterdam/__init__.py#L1-L23), via `api.github.com/repos/ethereum/execution-specs/commits/forks/amsterdam`, lists the EL subset; CL additions are 7688, 7732, 8045, 8061. Detailed version/implementation analysis here is limited to 7732 and relevant onboarding.

Lodestar explicitly targets **v1.7.0-beta.4** in [L:spec-tests-version.json#L1-L12][target]. Direct byte comparisons of the tag's Gloas `fork-choice.md`, `p2p-interface.md` and `validator.md` against the pinned master copies were **identical**. `fork.md` differs in onboarding, as in [spec PR 5736](https://github.com/ethereum/consensus-specs/pull/5736) (merged 2026-10-26). [Full comparison](https://github.com/ethereum/consensus-specs/compare/v1.7.0-beta.4...8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2).

## Candidates

Five static candidates remain; none was experimentally reproduced.

### C1 — Spec-version lag: mixed-key deposits at the Gloas upgrade

1. **Spec:** `if not is_builder_withdrawal_credential(deposit.withdrawal_credentials):` then `pending_deposits.append(deposit)`. Master routes by credentials first and permits a builder registration using a validator key. [S:fork.md#L60-L119][sfork].
2. **Lodestar:** `if (isValidatorKnown(state, validatorIndex)) {` precedes builder processing; `state.builders.get(builderIndex).balance += deposit.amount;` precedes the credential check. [L:upgradeStateToGloas.ts#L208-L245][lonboard].
3. **Condition:** At upgrade, a valid builder deposit using an existing validator key, or one with an earlier valid queued validator deposit, remains queued in Lodestar but registers a builder in master. Conversely, a new builder registration followed by a validator-credential deposit for that key sends the second deposit to the builder in Lodestar, while master queues it. Registry, balances, pending deposits and state root differ.
4. **Teku: agrees with Lodestar's older rule**, testing existing validators, then existing builders, before credentials. [T:GloasStateUpgrade.java#L222-L260][tonboard].
5. **High confidence. Disproof:** Directly compared tag/master; Lodestar correctly reflects its declared beta.4 baseline. This is **spec-version lag**, not a claim that beta.4 vectors should fail. Master deliberately changes routing.
6. **Severity: consensus split** between old/master upgrade rules on these states. **Known:** [Lodestar 10428](https://github.com/ChainSafe/lodestar/pull/10428), **open**; [spec 5736](https://github.com/ethereum/consensus-specs/pull/5736), **merged/closed**. Queries: `gloas`, `epbs`, `7732`, `onboard` within ChainSafe/lodestar, both states. No candidate-specific public Hive/EEST verdict obtained.

### C2 — In-block PTC votes do not expand duplicate-validator positions

1. **Spec:** `for idx in indexed_payload_attestation.attesting_indices:` dispatches each signer to the message handler; `ptc_indices.append(ptc_index)` collects every occurrence of that signer. [S:fork-choice.md#L268-L288][snotify], [#L1156-L1187][spositions]. Indexed extraction selects validators by bits; signature validation does not require selecting all occurrences. [S:beacon-chain.md#L1091-L1115][sindexed], [#L1407-L1428][sbits].
2. **Lodestar:** `ptcIndices.push(i);` forwards raw set-bit positions from the block. [L:importBlock.ts#L280-L298][lblockptc]. The recipient updates only `for (const ptcIndex of ptcIndices) {`. [L:protoArray.ts#L758-L789][lnotify].
3. **Condition:** A validator occupies multiple PTC positions. A valid next-block aggregate selects one occurrence but omits another, with the signature for the selected occurrence(s). The observer missed the direct gossip vote. The spec updates all occurrences; Lodestar updates selected ones only. A head witness has otherwise matching positive timeliness and DA counts of 256 in Lodestar, 257 after expansion, a verified parent payload, and a timely boosted child choosing EMPTY. Previous-slot FULL/EMPTY weights are zero: spec quorum prefers FULL; Lodestar's missing quorum allows the boosted EMPTY choice. Stored votes and head differ. Opposite votes can likewise overwrite different positions.
4. **Teku: agrees with spec**, converting block aggregates into messages and calculating every committee position. [T:ForkChoice.java#L1268-L1307][tptc]. Its [regression test](https://github.com/Consensys/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/forkchoice/ForkChoiceTest.java#L718-L750) expands one selected occurrence to three. Read, not run.
5. **High confidence. Disproof:** Block validation checks parent root, previous slot and indexed signature, not all-occurrences bits. [L:processPayloadAttestation.ts#L7-L26][lprocessptc]. Normal gossip already expands all positions, masking this when received directly; it does not repair an observer importing only the block. The witness uses strict >256, not >=256.
6. **Severity: fork-choice divergence. Not found for block-import expansion.** Both-state queries: `gloas`, `epbs`, `7732`, `"PTC" "duplicate"`, `"notifyPtcMessages"`. Related [9369](https://github.com/ChainSafe/lodestar/pull/9369), **merged/closed**, fixes gossip/pool duplicates; its [changed files](https://api.github.com/repos/ChainSafe/lodestar/pulls/9369/files) exclude block import. No matching Hive/EEST verdict obtained.

### C3 — Index-1 gossip checks existence, not optimism/invalidation

1. **Spec:** `raise GossipIgnore("attested payload is optimistic")`; `raise GossipReject("attested payload is invalid")`. [S:p2p-interface.md#L426-L463][spayloadstatus]. The helper is called for [aggregates, #L789-L808][saggregatecall] and [singles, #L1265-L1281][ssinglecall].
2. **Lodestar:** Both validators only test `!chain.forkChoice.hasPayloadHexUnsafe(toRootHex(attData.beaconBlockRoot))`. [L:attestation.ts#L294-L335][lattstatus], [L:aggregateAndProof.ts#L76-L113][laggstatus]. The predicate is `return this.getNodeIndexByRootAndStatus(blockRoot, PayloadStatus.FULL) !== undefined;`. [L:protoArray.ts#L2071-L2079][lhaspayload].
3. **Condition:** An otherwise valid new index-1 vote references an earlier-slot Gloas block with an imported FULL variant still SYNCING/ACCEPTED. Lodestar can ACCEPT/forward; spec IGNOREs. If FULL was later invalidated but remains indexed, Lodestar can ACCEPT instead of REJECT. Immediate-invalid import with **no** FULL is not this witness: the existence guard ignores it.
4. **Teku: agrees with spec**, rejecting tracked invalid roots, deferring missing payloads and checking optimism on FULL. [T:GossipValidationHelper.java#L244-L298][tgossipstatus].
5. **High confidence for gossip verdict. Disproof:** Preprocessing waits only for absent FULL, not existing optimistic FULL. [L:processor/index.ts#L568-L586][lpreprocess]. Envelope import permits SYNCING/ACCEPTED and inserts that status. [L:importExecutionPayload.ts#L250-L277][loptimisticimport], [#L323-L332][limportfc]. Normal signatures/targets/committee checks must still pass; no head-divergence experiment was run.
6. **Severity: cosmetic** under the required taxonomy: specifically gossip-verdict/propagation divergence, not formatting. **Known:** [10438](https://github.com/ChainSafe/lodestar/pull/10438), **open**, covers invalid FULL and explicitly leaves optimistic IGNORE undone; [9637](https://github.com/ChainSafe/lodestar/pull/9637), **open**, earlier invalid-payload proposal. Located through both-state `gloas`/`epbs`/`7732` searches and rule-name matches in those PRs. No matching Hive/EEST verdict obtained.

### C4 — Zero-count EnvelopesByRange returns InvalidRequest

1. **Spec:** “The response MUST contain no more than `count` blocks.” [S:phase0/p2p-interface.md#L1553-L1570][srangebase]. Gloas inherits the range semantics with envelope content; count is Uint64 with no positive minimum stated. [S:gloas/p2p-interface.md#L1396-L1431][srange].
2. **Lodestar:** `throw new ResponseError(RespStatus.INVALID_REQUEST, "count < 1");`. [L:executionPayloadEnvelopesByRange.ts#L111-L134][lrangezero].
3. **Condition:** A well-encoded zero-count request with an in-retention Gloas start slot describes an empty range; Lodestar responds with an error instead of zero chunks.
4. **Teku: agrees with empty-range interpretation.** Validates overflow/maximum only, then completes an empty range. [T:ExecutionPayloadEnvelopesByRangeMessageHandler.java#L82-L174][trangevalid].
5. **Low confidence. Disproof:** No positive minimum found in inherited text, but the response bound alone does not explicitly prohibit InvalidRequest for zero. A clarification permitting that rejection would disprove this candidate.
6. **Severity: cosmetic. Not found.** Both-state queries: `gloas`, `epbs`, `7732`, `"EnvelopesByRange"`, `"envelopes" "zero count"` (last: zero hits). No matching Hive/EEST verdict obtained.

### C5 — Weak-head equivocation term can substitute head-state balances

1. **Spec:** `justified_state.validators[index].effective_balance`: use head-state committees but justified-state balances for equivocators. [S:fork-choice.md#L810-L832][sweak].
2. **Lodestar:** `if (!balance) {` falls back to `balance = state.effectiveBalanceIncrements[validatorIndex];` inside the **Gloas-only** branch. [L:forkChoice.ts#L1717-L1754][lweak]. The fallback uses a slashed/inactive-zeroed cache ([balance.ts#L51-L82][lbalcache]), losing raw balance for this extra term.
3. **Condition:** An equivocating head-committee member is already slashed in the justified state but remains assigned duties before exit. Its actual justified effective balance differs from its later head balance. The fallback adds the latter; near the reorg threshold, weakness, proposer reorg or boost suppression can differ. Zeroed cache alone, with equal actual balances, does not suffice.
4. **Teku: agrees with spec**, reading `justifiedState.getValidators().get(validatorIndex).getEffectiveBalance().longValue();` while traversing head committees. [T:ForkChoiceUtilGloas.java#L463-L488][tweak], used in [#L506-L536][tweakuse].
5. **Medium confidence. Disproof:** Cache zeroing includes already-slashed validators, not just missing indices. Equal head/justified balances reproduce no discrepancy. A complete reachable threshold-crossing chain fixture was not built; this remains conditional. The shared utility is not alleged faulty: the Gloas-only consumer substitutes the wrong state's balance. General committee-equivocator weight is implemented.
6. **Severity: fork-choice divergence. Not found for balance-source edge.** Both-state queries: `"is_head_weak"`, `"is_head_weak" "balance"`, `"isHeadWeak" "balance"`, `gloas`, `epbs`, `7732`. Related [9232](https://github.com/ChainSafe/lodestar/issues/9232), **open**, [9339](https://github.com/ChainSafe/lodestar/pull/9339), **closed/unmerged**, and [9654](https://github.com/ChainSafe/lodestar/pull/9654), **merged/closed**, concern implementing equivocation weight, not this balance source. [Lighthouse 9593](https://github.com/sigp/lighthouse/issues/9593), **open**, concerns a different total-weight approximation. No matching Hive/EEST verdict obtained.

## Rules checked without a surviving discrepancy in the stated case

L = pinned Lodestar, S = pinned consensus-specs, T = pinned Teku. Link targets give full paths, pins and line ranges; disputed spec text is cited above.

| Rule / boundary | Static result and Lodestar source |
|---|---|
| `on_block` order | Parent resolved by root/hash; future/finalized/ancestry checks precede insertion. PTC votes from a block arrive after successful validation/import. No pre-validation PTC mutation witness. [forkChoice.ts#L765-L825][lonblock], [verifyBlocksSanityChecks.ts#L94-L122][lparentsanity], [importBlock.ts#L132-L167][limportorder] and [#L278-L309][lptcorder]. |
| Envelope import | State/bid linkage, builder, randao, gas limit, hash, requests root, slot, parent hash, timestamp, withdrawals checked before FULL insertion; upstream DA wait. [verifyExecutionPayloadEnvelope.ts#L25-L110][lverifyenv], [verifyPayloadsDataAvailability.ts#L21-L51][ldawait]. EL/signature outcomes are separate; see C3. |
| Previous-slot EMPTY/FULL weight | Both have zero effective comparison weight; PENDING retains its weight. [protoArray.ts#L1597-L1613][lzero]. |
| Payload tiebreaker | Previous-slot EMPTY ranks between FULL's extend/don't-extend outcomes; older FULL outranks EMPTY. Internal enum numbers differ, but comparison order matches. [protoArray.ts#L1290-L1323][ltie]. |
| Strict PTC threshold | Positive and negative counts both use strictly greater than half. Attendance bits exclude absent votes from negative counts. [protoArray.ts#L869-L912][lthreshold]. C2 changes inputs. |
| Proposer-equivocation reorg | Previous-slot equivocation plus weak head can bypass ordinary reorg conditions; chosen parent variant follows the head's parent execution hash. [forkChoice.ts#L519-L552][lreorg]. C5 concerns balance source. |
| Fork-choice attestation indices | Rejects indices outside 0/1 and same-slot index 1; older index 1 needs FULL. [forkChoice.ts#L2142-L2189][lfcatt]. |
| Unseen proposer preferences | Unknown dependent root or absent matching preferences gives IGNORE. [executionPayloadBid.ts#L240-L268][lprefs]. |
| Attestation gossip | Same-slot index 1 / index above 1 REJECT; absent FULL queues/ignores older index 1. [attestation.ts#L294-L335][lattstatus], [aggregateAndProof.ts#L76-L113][laggstatus], [processor/index.ts#L568-L586][lpreprocess]. Optimism remains C3. |
| Envelope gossip | Unknown root/duplicate IGNORE; slot/builder/hash/requests-root/signature mismatch REJECT. Progressive SSZ limits disprove the apparent missing runtime-limit lead. [executionPayloadEnvelope.ts#L35-L154][lenvgossip], [sszTypes.ts#L104-L217][lrequesttypes]. TODO comments alone did not establish another ACCEPT witness. |
| PTC gossip | Pre-fork REJECT; noncurrent/duplicate/unknown root/wrong block slot IGNORE; nonmember/bad signature REJECT. Uses referenced post-state and expands duplicate positions. [payloadAttestationMessage.ts#L39-L136][lptcgossip]. C2 is the different block-import path. |
| Range canonical-only; root requests | Range follows head ancestry and only FULL; archive migration also filters canonical FULL. ByRoot need not be canonical-only. [executionPayloadEnvelopesByRange.ts#L70-L97][lrangecanon], [archiveBlocks.ts#L429-L446][larchive], [executionPayloadEnvelopesByRoot.ts#L27-L89][lroot]. Zero count is C4. |
| Fork-boundary payload deadlines | PTC routine fork-gated, retries duties at first Gloas slot; timeliness uses envelope arrival before payload deadline, not input creation. Durations select message-slot fork. [ptc.ts#L51-L85][lptcdeadline], [validator/index.ts#L1428-L1455][lvoteproduction], [forkConfig/index.ts#L255-L270][ldeadlinecfg]. No claim about every custom-config rounding case. |

### Restart / replay: no independent violation established

The loader restores regeneration/pool/preferences, without envelope replay: [L:chain.ts#L623-L628][lstartup]. Gloas anchors begin PENDING/EMPTY: [L:forkChoice/index.ts#L140-L173][lanchor]. Stored envelopes do not imply restored FULL. Teku rebuilds FULL from metadata: [T:ForkChoiceModelGloas.java#L330-L373][treplay]. However, spec fresh stores also have empty payloads ([S:fork-choice.md#L228-L255][sanchor]); Lodestar permits fetching missing anchor envelopes ([L:verifyBlocksSanityChecks.ts#L94-L122][lparentsanity]). No identical-head-after-restart requirement or recovery failure was established, so absent eager replay is not promoted. Related [9005](https://github.com/ChainSafe/lodestar/pull/9005), closed/unmerged, and [9691](https://github.com/ChainSafe/lodestar/issues/9691), open, were read; their issue text is not proof against current spec.

## Known-check, public results, and validation limits

GitHub API searches had no open/closed restriction. All query terms above are prefixed `repo:ChainSafe/lodestar`; API form: `https://api.github.com/search/issues?q=<query>&per_page=100`. Broad searches returned 769 `gloas`, 105 `epbs`, 68 `7732` hits; only their first 100 results were retrieved. Specific rule queries supplemented them. **“Not found” is bounded by those results, not proof of novelty.**

| Pre-indexed item | State / disposition |
|---|---|
| [10484](https://github.com/ChainSafe/lodestar/pull/10484) | Open; envelope API execution_optimistic derives from parent/PENDING rather than own FULL. Known API issue, distinct from C3. |
| [10481](https://github.com/ChainSafe/lodestar/issues/10481) | Open; serial DA waits delay other imports. Queuing unavailable payloads is spec-permitted; no extra validity mismatch established here. Fix 10485 appeared open in search. |
| [10468](https://github.com/ChainSafe/lodestar/pull/10468) | Merged/closed, 2026-10-26; known fork-epoch PTC duties-root fix. |
| [10005](https://github.com/ChainSafe/lodestar/pull/10005) | Merged/closed, 2026-09-04; known orphan-envelope historical-sync fix. Remaining [10008](https://github.com/ChainSafe/lodestar/issues/10008) is open. Its devnet-9 observations are author-reported, not reproduced here or evidence testing C2–C5. |

[Hive](https://hive.ethpandaops.io/) yielded no readable result rows through the web tool; direct retrieval returned **403 Forbidden**. [Alternate host](https://hive-results.ethdevops.io/) was unavailable. Searches `site:hive.ethpandaops.io Glamsterdam Lodestar`, `site:github.com/ethereum/execution-spec-tests Glamsterdam Lodestar`, and API `repo:ChainSafe/lodestar gloas hive` (zero hits) supplied no candidate-specific verdict at these pins. The [EEST changelog](https://github.com/ethereum/execution-spec-tests/blob/main/docs/CHANGELOG.md) and [execution-specs releases](https://github.com/ethereum/execution-specs/releases) describe EL fixtures, not Lodestar CL fork-choice/gossip verdicts. No candidate is claimed new, reproduced or disproved from absent Hive/EEST results.

**Local checks:** re-read/compared pinned raw Lodestar sources; compared requested specs to beta.4; traced import callers, DA/signature/EL gates, PTC bit expansion and threshold counterexample; checked SSZ bounds to discard a false lead; verified report anchors and byte limit. No executable client/spec tests were run.

**URLs read:** all pinned source, head API, issue/PR/search and results URLs cited here; additionally `api.github.com/repos/ethereum/EIPs/commits/master`, `api.github.com/repos/ethereum/execution-specs`, and PR 9369's `/files` API. Tag comparisons used raw.githubusercontent.com/ethereum/consensus-specs/v1.7.0-beta.4/specs/gloas/{fork-choice.md,p2p-interface.md,validator.md,fork.md}. Lodestar blob citations correspond to the same commit/path on raw.githubusercontent.com. Only public sources were used.

[target]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/spec-tests-version.json#L1-L12
[sfork]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/fork.md#L60-L119
[lonboard]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/state-transition/src/slot/upgradeStateToGloas.ts#L208-L245
[tonboard]: https://github.com/Consensys/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/gloas/forktransition/GloasStateUpgrade.java#L222-L260
[snotify]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/fork-choice.md#L268-L288
[spositions]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/fork-choice.md#L1156-L1187
[sindexed]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md#L1091-L1115
[sbits]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md#L1407-L1428
[lblockptc]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/blocks/importBlock.ts#L280-L298
[lnotify]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/protoArray/protoArray.ts#L758-L789
[tptc]: https://github.com/Consensys/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/forkchoice/ForkChoice.java#L1268-L1307
[lprocessptc]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/state-transition/src/block/processPayloadAttestation.ts#L7-L26
[spayloadstatus]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/p2p-interface.md#L426-L463
[saggregatecall]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/p2p-interface.md#L789-L808
[ssinglecall]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/p2p-interface.md#L1265-L1281
[lattstatus]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/validation/attestation.ts#L294-L335
[laggstatus]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/validation/aggregateAndProof.ts#L76-L113
[lhaspayload]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/protoArray/protoArray.ts#L2071-L2079
[tgossipstatus]: https://github.com/Consensys/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/validation/GossipValidationHelper.java#L244-L298
[lpreprocess]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/network/processor/index.ts#L568-L586
[loptimisticimport]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/blocks/importExecutionPayload.ts#L250-L277
[limportfc]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/blocks/importExecutionPayload.ts#L323-L332
[srangebase]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/phase0/p2p-interface.md#L1553-L1570
[srange]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/p2p-interface.md#L1396-L1431
[lrangezero]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts#L111-L134
[trangevalid]: https://github.com/Consensys/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/rpc/beaconchain/methods/ExecutionPayloadEnvelopesByRangeMessageHandler.java#L82-L174
[sweak]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/fork-choice.md#L810-L832
[lweak]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/forkChoice/forkChoice.ts#L1717-L1754
[tweak]: https://github.com/Consensys/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/gloas/util/ForkChoiceUtilGloas.java#L463-L488
[tweakuse]: https://github.com/Consensys/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/gloas/util/ForkChoiceUtilGloas.java#L506-L536
[lonblock]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/forkChoice/forkChoice.ts#L765-L825
[lparentsanity]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/blocks/verifyBlocksSanityChecks.ts#L94-L122
[limportorder]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/blocks/importBlock.ts#L132-L167
[lptcorder]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/blocks/importBlock.ts#L278-L309
[lverifyenv]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/blocks/verifyExecutionPayloadEnvelope.ts#L25-L110
[ldawait]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/blocks/verifyPayloadsDataAvailability.ts#L21-L51
[lzero]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/protoArray/protoArray.ts#L1597-L1613
[ltie]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/protoArray/protoArray.ts#L1290-L1323
[lthreshold]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/protoArray/protoArray.ts#L869-L912
[lreorg]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/forkChoice/forkChoice.ts#L519-L552
[lfcatt]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/fork-choice/src/forkChoice/forkChoice.ts#L2142-L2189
[lprefs]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/validation/executionPayloadBid.ts#L240-L268
[lenvgossip]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/validation/executionPayloadEnvelope.ts#L35-L154
[lrequesttypes]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/types/src/gloas/sszTypes.ts#L104-L217
[lptcgossip]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/validation/payloadAttestationMessage.ts#L39-L136
[lrangecanon]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts#L70-L97
[larchive]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/archiveStore/utils/archiveBlocks.ts#L429-L446
[lroot]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts#L27-L89
[lptcdeadline]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/validator/src/services/ptc.ts#L51-L85
[lvoteproduction]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/api/impl/validator/index.ts#L1428-L1455
[ldeadlinecfg]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/config/src/forkConfig/index.ts#L255-L270
[lstartup]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/chain.ts#L623-L628
[lanchor]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/beacon-node/src/chain/forkChoice/index.ts#L140-L173
[treplay]: https://github.com/Consensys/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/storage/src/main/java/tech/pegasys/teku/storage/protoarray/ForkChoiceModelGloas.java#L330-L373
[sanchor]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/fork-choice.md#L228-L255
[lbalcache]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/state-transition/src/util/balance.ts#L51-L82
