# Lodestar: Gloas state and fork-transition review

Public-source review, 2026-10-27: **known onboarding spec-version lag** and **conditional large-builder-balance precision limitation**. Scope: Lodestar EIP-7732/EIP-8282 state/transition. No client/node or protocol execution. “Agrees” means source inspection, not a test pass.

## Pins and spec baseline

- `ChainSafe/lodestar` `unstable`: **`e4b4f615e68c1a4ea7c57632e6ed8d824624573f`**, commit timestamp `2026-10-27T17:31:55Z`. [Pin API](https://api.github.com/repos/ChainSafe/lodestar/commits/unstable).
- `ethereum/consensus-specs` `master`: **`8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2`**, commit timestamp `2026-10-27T16:28:12Z`. [Pin API](https://api.github.com/repos/ethereum/consensus-specs/commits/master).
- `Consensys-Incorporated/teku` `master`: **`2c35574b3373cbe8ad121a768d98f066aec05b73`**, commit timestamp `2026-10-27T16:51:17Z`. [Pin API](https://api.github.com/repos/Consensys-Incorporated/teku/commits/master).
- `ethereum/EIPs` `master`: **`d4c575521d99ec881a444ab3af604e684b5f0743`**, commit timestamp `2026-10-27T16:04:29Z`. [Pin API](https://api.github.com/repos/ethereum/EIPs/commits/master).
- `ethereum/execution-specs` `forks/amsterdam`: **`16898000911c1e3caa57be08509536c10ae92d3e`**, commit timestamp `2026-10-06T10:32:51Z`. [Pin API](https://api.github.com/repos/ethereum/execution-specs/commits/forks/amsterdam).

Client code was read from raw.githubusercontent.com at these pins, located with API trees, never GitHub HTML. Clickable citations use immutable blob URLs.

Lodestar explicitly targets **consensus-specs v1.7.0-beta.4** in [spec-tests-version.json#L1-L12][r1]. The onboarding implementation matches beta.4. Master includes [consensus-specs PR 5736](https://github.com/ethereum/consensus-specs/pull/5736) (merged 2026-10-26), hence C1. Raw-file comparison: `builder.md` is identical; the only behavioral difference in the three requested files is onboarding in `fork.md`; `beacon-chain.md` also corrects the comment `EIP-7521` to `EIP-7251` at [specs/gloas/beacon-chain.md#L1477-L1485][r2]. [Beta.4 fork](https://raw.githubusercontent.com/ethereum/consensus-specs/v1.7.0-beta.4/specs/gloas/fork.md), [beacon chain](https://raw.githubusercontent.com/ethereum/consensus-specs/v1.7.0-beta.4/specs/gloas/beacon-chain.md), [builder](https://raw.githubusercontent.com/ethereum/consensus-specs/v1.7.0-beta.4/specs/gloas/builder.md). Teku retains beta.4 onboarding (C1). Lighthouse/Prysm follow beta.4 per the brief (not independently checked).

Pinned EIP-7773 has no mainnet activation. Both findings are Gloas-only; no shared live-Fulu vulnerability details are disclosed.

### Scheduled scope and exact spec revisions

The pinned [EIP-7773](https://github.com/ethereum/EIPs/blob/d4c575521d99ec881a444ab3af604e684b5f0743/EIPS/eip-7773.md#L25-L90) schedules these **18** EIPs. Current text for each is `EIPS/eip-N.md` at the EIPs pin above; no separate semantic version exists. **ELref/X** means `tests/amsterdam/X/spec.py` at the EL pin. Revisions: ELref files and [Gloas inventory][r3]; EL inventory: `src/ethereum/forks/amsterdam/__init__.py#L1-L40`. 

| EIP / current text at EIPs pin | Current status | Layer / targeted EIP revision in spec repository |
|---|---|---|
| 2780 | Last Call | EL `ELref/eip2780_reduce_intrinsic_tx_gas#L14-L17` (`7243c92ba812437c64bae9fc6524ee269b29daa9`) |
| 7688 | Review | CL `f2e6d7fb01194d590e16fcdcae8061d06cf1a7f1` |
| 7708 | Last Call | EL `ELref/eip7708_eth_transfer_logs#L16-L18` (`f7230c46a743313957d8f38a159bda934cc735b2`) |
| 7732 | Last Call | CL `c36a2e58a4496ed21bef6b1c97505b03fd159f0a` |
| 7778 | Last Call | EL `ELref/eip7778_block_gas_accounting_without_refunds#L14-L16` (`4897aec97160c72d2080acf928b132f2efc1a886`) |
| 7843 | Last Call | EL `ELref/eip7843_slotnum#L14-L17` (`c3bfd4ba41cf0fcbfe8c404f33ba89f5174971e0`); CL `c3bfd4ba41cf0fcbfe8c404f33ba89f5174971e0` |
| 7928 | Last Call | EL `ELref/eip7928_block_level_access_lists#L14-L17` (`f834f0004aa5110a5f1ac0d6b80e3dc4b842d040`) |
| 7954 | Last Call | EL `ELref/eip7954_increase_max_contract_size#L14-L17` (`2e62d6a88aa596e4efbf3592cda7706f8a51dac3`) |
| 7976 | Last Call | EL `ELref/eip7976_increase_calldata_floor_cost#L14-L16` (`c998ef94eb16a6af8a9b8e2084f947b17ea14865`) |
| 7981 | Last Call | EL `ELref/eip7981_increase_access_list_cost#L14-L16` (`8da3cf91d4bc688c43cc25f2f03b7c86c7bbc257`) |
| 7997 | Last Call | EL `ELref/eip7997_deterministic_factory_contract#L16-L19` (`192193facea01dfb8b87ad59d67e8385bf9304b1`) |
| 8024 | Last Call | EL `ELref/eip8024_dupn_swapn_exchange#L15-L18` (`34b49095ca5f7343045da279f04e7ecd1e451393`) |
| 8037 | Last Call | EL `ELref/eip8037_state_creation_gas_cost_increase#L25-L27` (`19bdfb4f97064dfbeb3d41d31efac211265b49a6`) |
| 8038 | Last Call | EL `ELref/eip8038_state_access_gas_cost_increase#L14-L16` (`f83531466a3862853424a81d000727b3043ef2cc`) |
| 8045 | Last Call | CL `414a8404198c5afaa3cfed10a385a9aae1dfaae3` |
| 8061 | Last Call | CL `01f15c37c64114c478cb1136e0a6966084e4db14` |
| 8246 | Last Call | EL `ELref/eip8246_selfdestruct_no_burn#L14-L17` (`8be64cf6a01350938b93332cf0062ab7a3166f23`) |
| 8282 | Last Call | EL `ELref/eip8282_builder_execution_requests#L18-L21` (`45e570a246207d5b1fb095e259e3f98bb0922639`); CL `de4c6f02c7bec4686762c55f8ab6abcf97a77d7d` |

Supporting EIP-8070/8261 appear in CL inventory; EIP-7773 lists them separately from scheduled core proposals. References: Gloas `beacon-chain.md`, `fork.md`, `builder.md`, `fork-choice.md`, `p2p-interface.md`; [EIP-7732](https://eips.ethereum.org/EIPS/eip-7732), [EIP-8282](https://eips.ethereum.org/EIPS/eip-8282).

## C1 — spec-version lag: fork onboarding routes by key before credentials

**Known; high confidence; severity: consensus split relative to master.** This is a beta.4/master disagreement, not evidence of a beta.4 implementation bug.

1. **Spec, verbatim.** [specs/gloas/fork.md#L65-L125][r4] states:

   > Only deposits with builder withdrawal credentials can fund builders.
   > Other deposits stay queued, even if a builder uses the same public key.
   > A valid builder registration can use a validator's public key.

   Master tests credentials before builder lookup.

2. **Lodestar, quoted at its pin.** [packages/state-transition/src/slot/upgradeStateToGloas.ts#L211-L245][r5]:

   ```typescript
   if (isValidatorKnown(state, validatorIndex)) {
     pendingDeposits.push(deposit);
     pendingDepositsLookup.add(depositValue, pubkeyHex);
     kept++;
     continue;
   }
   ```

   Later, before the credential test:

   ```typescript
   if (builderIndex !== undefined) {
     // Top up an already-onboarded builder
     state.builders.get(builderIndex).balance += deposit.amount;
     topups++;
     continue;
   }
   ```

   Lines 239–245 also retain a builder registration when `hasPendingValidator(...)` is true, before checking its signature.

3. **Divergent conditions, in words.** At the Fulu→Gloas upgrade: (a) a valid builder-credential registration uses an existing validator’s key; or (b) an earlier valid ordinary validator deposit for that key is still queued, followed by a valid builder registration. Master creates the builder while Lodestar keeps the registration pending. Conversely, (c) a valid builder registration is followed by an ordinary non-builder-credential deposit for the same key, not already a validator: master preserves the latter in the validator queue, while Lodestar credits it to the builder and removes it from the queue. The upgrade state roots differ through builders/balances/pending deposits.

4. **Teku comparison.** [ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/gloas/forktransition/GloasStateUpgrade.java#L222-L268][r6] agrees with Lodestar/beta.4, not master: `if (validatorsUtil.getValidatorIndex(state, pubkey).isPresent())` retains the deposit, and `builder.copyWithNewBalance(builder.getBalance().plus(deposit.getAmount()))` runs before its credential check. Lines 251–254 also block same-key pending-validator registrations.

5. **Disproof attempted.** Raw beta.4/master comparison proves the old behavior is intentional compatibility. Traced the full onboarding loop and its signature cache: valid signatures cannot bypass the earlier key checks. Its builder-index map starts empty and is populated only after append, so map staleness is not the cause. **High confidence against master**, but beta.4 conformance disproves calling this a bug against Lodestar’s declared target.

6. **Severity and known-check.** **Consensus split** at upgrade against a master-following client; subsequent builder-bid acceptance can also differ. **Known:** [Lodestar PR #10428](https://github.com/ChainSafe/lodestar/pull/10428), **open/unmerged**, implements exactly PR 5736’s routing. The PR reports master vectors passing but five beta.4 mixed-key cases failing after its fix; these are author-reported, not rerun here. [Spec PR #5736](https://github.com/ethereum/consensus-specs/pull/5736), **closed/merged**, fixes [spec issue #5735](https://github.com/ethereum/consensus-specs/issues/5735). Spec-target coordination is required; this is already known.

## C2 — Gloas builder balance arithmetic has an economic rather than protocol precision bound

**Known representation limitation / conditional candidate; medium overall confidence; severity: consensus split.** High arithmetic confidence; economic reachability unverified.

1. **Spec, verbatim.** [specs/gloas/beacon-chain.md#L660-L667][r8] declares `balance: Gwei`; [specs/gloas/beacon-chain.md#L2334-L2361][r9] requires:

   ```python
   # Increase balance by deposit amount
   builder.balance += request.amount
   ```

   Amount is also `Gwei` in [specs/gloas/beacon-chain.md#L690-L695][r10]. No 53-bit bound is specified. [EIP-8282’s deposit rule](https://eips.ethereum.org/EIPS/eip-8282#deposit-requests) allows uint64-gwei deposit amounts, subject to minimum stake and matching value plus fee, not whole-ETH increments.

2. **Lodestar, quoted at its pin.** The Gloas-only [packages/types/src/gloas/sszTypes.ts#L286-L296][r11] declares `balance: UintNum64`; [packages/types/src/gloas/sszTypes.ts#L191-L204][r12] declares `amount: UintNum64` for `BuilderDepositRequest`. [packages/state-transition/src/block/processBuilderDepositRequest.ts#L34-L44][r13] executes:

   ```typescript
   // Increase balance by deposit amount
   builder.balance += amount;
   ```

   [packages/types/src/gloas/sszTypes.ts#L412-L426][r14] explicitly acknowledges for bid value that the bound is economic: “Balance itself isn't structurally bounded” and uses `value: UintNum64`. This concerns only Gloas builder fields and addition.

3. **Divergent condition, in words.** A Gloas builder has an exactly representable balance of **9,007,199,254,740,992 gwei** (two to the fifty-third), reached by funded builder deposits. Its parent payload carries an otherwise valid top-up of **1,000,000,001 gwei** with builder credentials, a safe representable request amount above the one-ETH minimum. Master’s next balance is **9,007,200,254,740,993 gwei**. JavaScript number addition rounds this odd integer to **9,007,200,254,740,992**, one gwei lower. Both operands are exact before addition. The child’s balance/state root differs. Funding requires about **9,007,199 ETH** in one builder; no cheap attack is claimed.

4. **Teku comparison.** [ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/state/versions/gloas/Builder.java#L38-L48][r15] uses `namedSchema("balance", SszPrimitiveSchemas.UINT64_SCHEMA)`; [ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/gloas/BuilderDepositRequestSchema.java#L30-L48][r16] uses the uint64 amount schema. [ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/gloas/execution/ExecutionRequestsProcessorGloas.java#L97-L101][r17] applies `modifiedBuilder.getBalance().plus(request.getAmount())` in `UInt64`, agreeing with the exact spec sum for this non-overflowing example.

5. **Disproof attempted.** The EL minimum allows this small odd-gwei top-up; the existing-builder path does not require a fresh signature. `canBuilderCoverBid` constrains bids, not deposits/builder balance. [Merged #9835](https://github.com/ChainSafe/lodestar/pull/9835) explicitly accepts the number-based subsystem on economic grounds (~9M ETH in one builder). No protocol invariant excludes this funded condition. Unlike retracted #9350, this sum is odd in gwei, not an effective-balance multiple of one billion. Static arithmetic only; **medium overall confidence** because funding/practical reachability was not demonstrated.

6. **Severity and known-check.** **Consensus split** (or rejection of a spec-valid child whose state root uses exact arithmetic) under the stated funded condition. **Known limitation:** [#9835](https://github.com/ChainSafe/lodestar/pull/9835), **closed/merged**, 2026-08-17; its accepted rationale concerns the same number-based builder balance/payment subsystem, although it does not demonstrate this exact small-top-up boundary. Exact top-up trigger not found in recorded queries; related representation limitation is known. No Hive/EST corroboration found.

## Rules checked with no additional discrepancy found

Table citations use the pins above: **ST/**=`packages/state-transition/src/`, **BN/**=`packages/beacon-node/src/`, **P/**=`packages/params/src/`, **SSZ**=`packages/types/src/gloas/sszTypes.ts` in Lodestar; **S/**=`specs/gloas/` in consensus-specs. Full path plus line range is resolved at its repository pin.

| Rule / edge inspected | Lodestar file and lines at pin | Spec at pin / result |
|---|---|---|
| Self-build amount zero and exact infinity signature; non-self active builder, payload-builder version and BLS | `ST/block/processExecutionPayloadBid.ts#L29-L65` | S/beacon-chain.md#L2162-L2181; agrees. |
| Bid slot equals state slot; no genesis bid; parent hash equals latest executed hash; block hash differs; parent beacon root at previous slot; pre-reveal RANDAO; blob count at epoch schedule | `ST/block/processExecutionPayloadBid.ts#L67-L100` | S/beacon-chain.md#L2183-L2200; agrees. |
| Bid cover: sum both queues; reject below minimum; equality accepts exactly remaining excess | `ST/util/gloas.ts#L117-L167` | S/beacon-chain.md#L1168-L1192; agrees within C2’s numeric qualification. |
| Pending payment initialized with zero weight, bid fee recipient/amount/builder, actual proposer; current-epoch half index | `ST/block/processExecutionPayloadBid.ts#L102-L115` | S/beacon-chain.md#L2202-L2218; agrees. |
| Attestation payment weight: only same-slot root, previously zero participation, at least one new flag; current/previous half; no double counting on repeated attestations | `ST/block/processAttestationsAltair.ts#L90-L168; ST/util/gloas.ts#L184-L192` | S/beacon-chain.md#L2432-L2480; agrees. |
| Parent EMPTY requires all five execution-request lists empty and no deferred effects; FULL verifies request commitment | `ST/block/processParentExecutionPayload.ts#L18-L37, #L123-L133` | S/beacon-chain.md#L1841-L1856; agrees. |
| Settle payment before exit request; same/previous epoch index; directly append older nonzero payment; request order deposits→withdrawals→consolidations→builder deposits→builder exits | `ST/block/processParentExecutionPayload.ts#L47-L103` | S/beacon-chain.md#L1784-L1830; agrees. |
| Request count limits for withdrawals/consolidations/builder deposits/builder exits | `SSZ#L179-L217` | S/beacon-chain.md#L1792-L1795; agrees. |
| Block processing ordering: parent effects before header, withdrawals before new bid, new bid before RANDAO | `ST/block/index.ts#L57-L119` | S/beacon-chain.md#L1754-L1772; agrees. |
| Withdrawals early return on empty parent; preserve expected withdrawals and indices on that return | `ST/block/processWithdrawals.ts#L35-L46` | S/beacon-chain.md#L2067-L2097; agrees. |
| Withdrawal priority: builder payments, pending partials, builder sweep, validator sweep; reserve one slot for validator sweep; debit balances immediately; consume only processed entries | `ST/block/processWithdrawals.ts#L144-L279, #L439-L517` | S/beacon-chain.md#L1861-L2097; agrees. |
| Builder sweep cursor modulo builder count; next validator cursor after final validator when payload full | `ST/block/processWithdrawals.ts#L105-L141` | S/beacon-chain.md#L2032-L2040; S/beacon-chain.md#L2090-L2098; agrees. |
| Envelope (post-block state): beacon/header and parent roots; committed builder, RANDAO/gas/hash/request root; slot, execution parent, timestamp, expected withdrawals | `BN/chain/blocks/verifyExecutionPayloadEnvelope.ts#L25-L121` | S/fork-choice.md#L683-L728; agrees. |
| Envelope self-build signature uses proposer, otherwise builder; domain 0x0B at envelope slot | `ST/signatureSets/executionPayloadEnvelope.ts#L13-L40` | S/beacon-chain.md#L2107-L2123; agrees. |
| Payload attestation previous slot and parent root; nonempty sorted indices, duplicates permitted, aggregate signature | `ST/block/processPayloadAttestation.ts#L7-L26; ST/block/isValidIndexedPayloadAttestation.ts#L7-L23` | S/beacon-chain.md#L1094-L1110; S/beacon-chain.md#L2488-L2500; agrees. |
| Payload-attestation gossip current slot, known block at matching slot, membership at every duplicate position, BLS | `BN/chain/validation/payloadAttestationMessage.ts#L42-L141` | S/p2p-interface.md#L891-L950; agrees. |
| PTC committees concatenated in order; SHA256 epoch seed plus LE slot; sample without extra shuffling; 16-bit little-endian random values, inclusive acceptance and duplicates | `ST/util/seed.ts#L275-L383` | S/beacon-chain.md#L1198-L1232; S/beacon-chain.md#L1266-L1283; agrees. |
| Quorum floors before multiply/divide; inclusive >= payment quorum; shift prior/current payment halves and clear new half | `ST/util/gloas.ts#L33-L41; ST/epoch/processBuilderPendingPayments.ts#L9-L27` | S/beacon-chain.md#L1433-L1440; S/beacon-chain.md#L1719-L1730; agrees. |
| PTC window shift forward; fill epoch current+MIN_SEED_LOOKAHEAD+1 after effective-balance updates | `ST/epoch/processPtcWindow.ts#L15-L45; ST/epoch/index.ts#L173-L226` | S/beacon-chain.md#L1633-L1655; S/beacon-chain.md#L1737-L1749; agrees. |
| Upgrade copies common fields, migrates progressive lists; initializes previous PTC epoch to zeros, current+lookahead PTCs; availability all true; latest hash and synthetic self-build bid; new queues/indices default empty/zero | `ST/slot/upgradeStateToGloas.ts#L32-L136; ST/util/gloas.ts#L193-L215` | S/fork.md#L36-L56; S/fork.md#L145-L261; agrees. |
| Builder post-fork deposit credentials, PoP domain, existing top-up, exited-and-swept delay reset; exit requires active+address+no pending funds | `ST/block/processBuilderDepositRequest.ts#L20-L44; ST/block/processBuilderExitRequest.ts#L1-L35; ST/util/gloas.ts#L281-L296` | S/beacon-chain.md#L2276-L2284; S/beacon-chain.md#L2334-L2385; agrees. |
| Constants: self-build uint64 max (local Infinity); flag 2^40; prefix 0xB0; version 0; domain first bytes 0x0B–0x0E; PTC_SIZE 512; quorum 6/10 | `P/index.ts#L154-L175, #L368-L371; P/presets/mainnet.ts#L145-L150; SSZ#L325-L331` | S/beacon-chain.md#L556-L600; agrees. |

Production PTC: [pnpm-workspace.yaml#L10-L20][r18] selects `@chainsafe/lodestar-z` 2.2.0. Its [package metadata](https://registry.npmjs.org/@chainsafe/lodestar-z/2.2.0) records `b8ca543b9babc4f9ae4e2241623739f76d20c6fa`. Read [src/swap_or_not_shuffle/root.zig#L542-L680](https://github.com/ChainSafe/lodestar-z/blob/b8ca543b9babc4f9ae4e2241623739f76d20c6fa/src/swap_or_not_shuffle/root.zig#L542-L680) and [bindings/napi/shuffle.zig#L116-L141](https://github.com/ChainSafe/lodestar-z/blob/b8ca543b9babc4f9ae4e2241623739f76d20c6fa/bindings/napi/shuffle.zig#L116-L141): 16-bit LE sampling, candidate traversal and inclusive comparison agree. No binary loaded. 

### SSZ field-order inventory

Field orders/active-field widths match for the requested beacon-chain and related P2P containers; C2 qualifies numbers. Client-only API/archive types excluded.

| Container(s) and field order | Lodestar at pin | Spec at pin / outcome |
|---|---|---|
| Builder: pubkey, version, execution_address, balance, deposit_epoch, withdrawable_epoch | `SSZ#L286-L296` | S/beacon-chain.md#L660-L667; order matches. |
| BuilderPendingPayment: weight, withdrawal, proposer_index; BuilderPendingWithdrawal: fee_recipient, amount, builder_index | `SSZ#L298-L317` | S/beacon-chain.md#L672-L685; order matches. |
| BuilderDepositRequest: pubkey, withdrawal_credentials, amount, signature; BuilderExitRequest: source_address, pubkey | `SSZ#L191-L217` | S/beacon-chain.md#L690-L703; order matches. |
| PayloadAttestationData: beacon_block_root, slot, payload_present, blob_data_available; PayloadAttestation: aggregation_bits, data, signature (width 3) | `SSZ#L333-L351` | S/beacon-chain.md#L708-L724; order matches. |
| PayloadAttestationMessage: validator_index, data, signature; IndexedPayloadAttestation: attesting_indices, data, signature (width 3) | `SSZ#L358-L375` | S/beacon-chain.md#L729-L744; order matches. |
| ExecutionPayloadBid: parent_block_hash, parent_block_root, block_hash, prev_randao, fee_recipient, gas_limit, builder_index, slot, value, execution_payment, blob_kzg_commitments, execution_requests_root (width 12); SignedExecutionPayloadBid: message, signature | `SSZ#L399-L435` | S/beacon-chain.md#L749-L772; order matches. |
| ExecutionPayloadEnvelope: payload, execution_requests, builder_index, beacon_block_root, parent_beacon_block_root (width 5); signed wrapper: message, signature | `SSZ#L494-L512` | S/beacon-chain.md#L777-L793; order matches. |
| Attestation: aggregation_bits, data, signature, committee_bits (width 4); IndexedAttestation: attesting_indices, data, signature (width 3); AttesterSlashing retains attestation_1, attestation_2 with upgraded element types | `SSZ#L121-L160` | S/beacon-chain.md#L801-L821; S/fork.md#L244-L268; order matches. |
| BeaconBlockBody: all 13 fields compared; inherited prefix through bls_to_execution_changes, then signed_execution_payload_bid, payload_attestations, parent_execution_requests | `SSZ#L560-L582` | S/beacon-chain.md#L829-L860; order matches. |
| BeaconState: all 46 fields compared in source order; latest_block_hash replaces payload header; final eight ePBS fields run builders→ptc_window as in spec | `SSZ#L670-L734` | S/beacon-chain.md#L866-L932; order matches. |
| ExecutionPayload: inherited execution prefix through excess_blob_gas; block_access_list, slot_number tail (width 19); ExecutionRequests: deposits, withdrawals, consolidations, builder_deposits, builder_exits (width 5); NewPayloadRequest: execution_payload, versioned_hashes, parent_beacon_block_root, execution_requests (width 4) | `SSZ#L219-L229, #L472-L492; packages/types/src/electra/sszTypes.ts#L181-L194` | S/beacon-chain.md#L940-L1000; order matches. |
| ProposerPreferences: dependent_root, proposal_slot, validator_index, fee_recipient, target_gas_limit; signed wrapper message, signature; DataColumnSidecar: index, column, kzg_proofs, slot, beacon_block_root | `SSZ#L377-L397, #L736-L748` | S/p2p-interface.md#L145-L184; order matches. |
| BeaconBlock and SignedBeaconBlock retain slot, proposer_index, parent_root, state_root, body and message, signature respectively; nested body changes only | `SSZ#L584-L600; packages/types/src/phase0/sszTypes.ts#L383-L401` | Inherited order matches; internal API/archive containers excluded. |

## Known-check ledger and public test-result limits

GitHub public issue search, without a state filter, covers open/closed issues and PRs. Reproduce via `https://api.github.com/search/issues?per_page=100&q=` plus the encoded query. Numeric matches include unrelated issue numbers; relevant hits were read.

| Candidate / check | Queries and disposition |
|---|---|
| C1 | `repo:ChainSafe/lodestar 7732`; `8282`; `gloas onboarding`; `epbs onboarding`; `onboard_builders_from_pending_deposits`; `5736`; and `repo:ChainSafe/lodestar in:title,body "onboardBuildersFromPendingDeposits"`. Found **#10428 open**, exact master-lag fix. #9397/#9861 are earlier optimizations. |
| C2 | `repo:ChainSafe/lodestar builder precision` and `can_builder_cover_bid` found **#9835 closed/merged**, same accepted economic bound. Additional `in:title,body` conjunctions: `"gloas" "deposit" "precision"`, `"epbs" "balance" "number"`, `"BuilderDepositRequest" "amount" "UintNum64"`, `"7732" "balance" "precision"`, `"8282" "precision"`: each returned zero. Exact top-up trigger **not found**; broad representation limitation **known**. |
| #9350 | [Closed/unmerged](https://github.com/ChainSafe/lodestar/pull/9350), quorum-overflow framing **retracted**. [Correction](https://github.com/ChainSafe/lodestar/pull/9350#issuecomment-4415673404) explains exactness of effective-balance multiples; [later audit](https://github.com/ChainSafe/lodestar/pull/9350#issuecomment-5602330566) notes current bigint intermediates. Not a retained candidate. |
| #9709 | [Closed/unmerged](https://github.com/ChainSafe/lodestar/pull/9709), **rejected** as unnecessary ([maintainer comment](https://github.com/ChainSafe/lodestar/pull/9709#issuecomment-5098978642)). No value-level encoding/root discrepancy established. |
| #8767 | [Closed/merged](https://github.com/ChainSafe/lodestar/pull/8767), 2026-01-21. Missing slotNumber was fixed; current SSZ includes it. Not a retained candidate. |

Public results: [Hive Glamsterdam](https://hive.ethpandaops.io/#/group/glamsterdam) returned no readable rows through the web reader; direct HTTP returned **403 Forbidden**. [Legacy Hive](https://hive-results.ethdevops.io/) was inaccessible. Searches `Lodestar Gloas Glamsterdam hive results builder onboarding 5736`, `site.hive.ethpandaops.io glamsterdam lodestar`, and `Glamsterdam hive results consensus Lodestar epbs state transition` found no candidate-specific run. [EST releases](https://github.com/ethereum/execution-spec-tests/releases) and Amsterdam reference files establish fixture versions, not Lodestar CL results. Search `site.github.com/ethereum/execution-spec-tests Glamsterdam results 8282` supplied no C1/C2 result. **Hive/EST status unverified for both candidates**; C1 has only #10428’s vector report, C2 no observed result. 

## URLs read and verification

Read set: all pin APIs above and recursive trees; every cited source path at `https://raw.githubusercontent.com/<owner>/<repo>/<pin>/<path>`; three beta.4 raw URLs; EIP-7773/7732/8282 public pages and scheduled EIP files at the EIPs pin; PR/issue API records and comments linked in the ledger; recorded issue searches and public Hive/EST pages. Dependency source inspected from [SSZ 1.9.0 metadata](https://registry.npmjs.org/@chainsafe/ssz/1.9.0) and [tarball](https://registry.npmjs.org/@chainsafe/ssz/-/ssz-1.9.0.tgz), specifically uint/progressive-list/container implementations; lodestar-z source cited above. Also read [devnet-11 notes](https://notes.ethereum.org/@ethpandaops/glamsterdam-devnet-11); not used to classify candidates.

Checks: pinned-source/beta.4 diffs, quotations, citation ranges, arithmetic and bytes. No client/protocol execution or independent test pass.

[r1]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/spec-tests-version.json#L1-L12
[r2]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md#L1477-L1485
[r3]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md#L163-L186
[r4]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/fork.md#L65-L125
[r5]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/state-transition/src/slot/upgradeStateToGloas.ts#L211-L245
[r6]: https://github.com/Consensys-Incorporated/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/gloas/forktransition/GloasStateUpgrade.java#L222-L268
[r8]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md#L660-L667
[r9]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md#L2334-L2361
[r10]: https://github.com/ethereum/consensus-specs/blob/8a80ffa82bd49aac0dd6db17f9e8150aa257fbc2/specs/gloas/beacon-chain.md#L690-L695
[r11]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/types/src/gloas/sszTypes.ts#L286-L296
[r12]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/types/src/gloas/sszTypes.ts#L191-L204
[r13]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/state-transition/src/block/processBuilderDepositRequest.ts#L34-L44
[r14]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/packages/types/src/gloas/sszTypes.ts#L412-L426
[r15]: https://github.com/Consensys-Incorporated/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/state/versions/gloas/Builder.java#L38-L48
[r16]: https://github.com/Consensys-Incorporated/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/gloas/BuilderDepositRequestSchema.java#L30-L48
[r17]: https://github.com/Consensys-Incorporated/teku/blob/2c35574b3373cbe8ad121a768d98f066aec05b73/ethereum/spec/src/main/java/tech/pegasys/teku/spec/logic/versions/gloas/execution/ExecutionRequestsProcessorGloas.java#L97-L101
[r18]: https://github.com/ChainSafe/lodestar/blob/e4b4f615e68c1a4ea7c57632e6ed8d824624573f/pnpm-workspace.yaml#L10-L20
