@lodestar/fork-choice 1.43.0-dev.2870b59b6a → 1.43.0-dev.35940ffd61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@ import { ForkChoiceMetrics } from "../metrics.js";
6
6
  import { BlockExecutionStatus, LVHExecResponse, PayloadExecutionStatus, PayloadStatus, ProtoBlock, ProtoNode } from "../protoArray/interface.js";
7
7
  import { ProtoArray } from "../protoArray/protoArray.js";
8
8
  import { AncestorResult, EpochDifference, IForkChoice, NotReorgedReason, ShouldOverrideForkChoiceUpdateResult } from "./interface.js";
9
- import { CheckpointWithPayloadStatus, IForkChoiceStore } from "./store.js";
9
+ import { CheckpointWithHex, IForkChoiceStore } from "./store.js";
10
10
  export type ForkChoiceOpts = {
11
11
  proposerBoost?: boolean;
12
12
  proposerBoostReorg?: boolean;
@@ -142,6 +142,11 @@ export declare class ForkChoice implements IForkChoice {
142
142
  * Get the proposer boost root
143
143
  */
144
144
  getProposerBoostRoot(): RootHex;
145
+ /**
146
+ * Decides whether to extend an available payload from the previous slot,
147
+ * corresponding to the beacon block `blockRoot`.
148
+ */
149
+ shouldExtendPayload(blockRoot: RootHex): boolean;
145
150
  /**
146
151
  * To predict the proposer head of the next slot. That is, to predict if proposer-boost-reorg could happen.
147
152
  * Reason why we can't be certain is because information of the head block is not fully available yet
@@ -189,8 +194,8 @@ export declare class ForkChoice implements IForkChoice {
189
194
  getHeads(): ProtoBlock[];
190
195
  /** This is for the debug API only */
191
196
  getAllNodes(): ProtoNode[];
192
- getFinalizedCheckpoint(): CheckpointWithPayloadStatus;
193
- getJustifiedCheckpoint(): CheckpointWithPayloadStatus;
197
+ getFinalizedCheckpoint(): CheckpointWithHex;
198
+ getJustifiedCheckpoint(): CheckpointWithHex;
194
199
  /**
195
200
  * Add `block` to the fork choice DAG.
196
201
  *
@@ -247,7 +252,7 @@ export declare class ForkChoice implements IForkChoice {
247
252
  * Creates the FULL variant of a Gloas block when the payload becomes available
248
253
  * Spec: gloas/fork-choice.md#new-on_execution_payload
249
254
  */
250
- onExecutionPayload(blockRoot: RootHex, executionPayloadBlockHash: RootHex, executionPayloadNumber: number, executionPayloadStateRoot: RootHex, executionStatus: PayloadExecutionStatus): void;
255
+ onExecutionPayload(blockRoot: RootHex, executionPayloadBlockHash: RootHex, executionPayloadNumber: number, executionStatus: PayloadExecutionStatus, dataAvailabilityStatus: DataAvailabilityStatus): void;
251
256
  /**
252
257
  * Call `onTick` for all slots between `fcStore.getCurrentSlot()` and the provided `currentSlot`.
253
258
  * This should only be called once per slot because:
@@ -285,6 +290,7 @@ export declare class ForkChoice implements IForkChoice {
285
290
  * Same as hasPayloadUnsafe but accepts a hex-encoded block root.
286
291
  */
287
292
  hasPayloadHexUnsafe(blockRoot: RootHex): boolean;
293
+ getPTCVotes(blockRootHex: RootHex): (boolean | null)[] | null;
288
294
  /**
289
295
  * Returns a MUTABLE `ProtoBlock` if the block is known **and** a descendant of the finalized root.
290
296
  */
@@ -323,8 +329,9 @@ export declare class ForkChoice implements IForkChoice {
323
329
  */
324
330
  iterateAncestorBlocks(blockRoot: RootHex, payloadStatus: PayloadStatus): IterableIterator<ProtoBlock>;
325
331
  /**
326
- * Returns all blocks backwards starting from a block root.
327
- * Return only the non-finalized blocks.
332
+ * Raw ancestor walk from `blockRoot` back toward the previous finalized block. Includes both
333
+ * `blockRoot` and the previous-finalized boundary as last element. Mirrors the semantics of
334
+ * `getAllAncestorAndNonAncestorBlocks.ancestors`
328
335
  */
329
336
  getAllAncestorBlocks(blockRoot: RootHex, payloadStatus: PayloadStatus): ProtoBlock[];
330
337
  /**
@@ -333,17 +340,29 @@ export declare class ForkChoice implements IForkChoice {
333
340
  getAllNonAncestorBlocks(blockRoot: RootHex, payloadStatus: PayloadStatus): ProtoBlock[];
334
341
  /**
335
342
  * Returns both ancestor and non-ancestor blocks in a single traversal.
343
+ *
344
+ * `ancestors` is the raw walk and includes the previous finalized block as its last element —
345
+ * callers that don't want the boundary should slice it off themselves.
346
+ * Post-gloas for each block root, it returns exactly one variant of it.
336
347
  */
337
348
  getAllAncestorAndNonAncestorBlocks(blockRoot: RootHex, payloadStatus: PayloadStatus): {
338
349
  ancestors: ProtoBlock[];
339
350
  nonAncestors: ProtoBlock[];
340
351
  };
352
+ /**
353
+ * Same to getAllAncestorAndNonAncestorBlocks with default variant of ${blockRoot} to start with
354
+ */
355
+ getAllAncestorAndNonAncestorBlocksDefaultStatus(blockRoot: RootHex): {
356
+ ancestors: ProtoBlock[];
357
+ nonAncestors: ProtoBlock[];
358
+ };
341
359
  getCanonicalBlockByRoot(blockRoot: Root): ProtoBlock | null;
342
360
  getCanonicalBlockAtSlot(slot: Slot): ProtoBlock | null;
343
361
  getCanonicalBlockClosestLteSlot(slot: Slot): ProtoBlock | null;
344
362
  /** Very expensive function, iterates the entire ProtoArray. TODO: Is this function even necessary? */
345
363
  forwarditerateAncestorBlocks(): ProtoBlock[];
346
364
  forwardIterateDescendants(blockRoot: RootHex, payloadStatus: PayloadStatus): IterableIterator<ProtoBlock>;
365
+ forwardIterateDescendantsDefaultStatus(blockRoot: RootHex): IterableIterator<ProtoBlock>;
347
366
  /** Very expensive function, iterates the entire ProtoArray. TODO: Is this function even necessary? */
348
367
  getBlockSummariesByParentRoot(parentRoot: RootHex): ProtoBlock[];
349
368
  /** Very expensive function, iterates the entire ProtoArray. TODO: Is this function even necessary? */
@@ -386,8 +405,7 @@ export declare class ForkChoice implements IForkChoice {
386
405
  private isProposingOnTime;
387
406
  private getPreMergeExecStatus;
388
407
  private getPreMergeDataStatus;
389
- private getPreGloasExecStatus;
390
- private getPostGloasExecStatus;
408
+ private getPostMergeExecStatus;
391
409
  /**
392
410
  * Why `getJustifiedBalances` getter?
393
411
  * - updateCheckpoints() is called in both on_block and on_tick.
@@ -405,7 +423,7 @@ export declare class ForkChoice implements IForkChoice {
405
423
  *
406
424
  * **`on_tick`**
407
425
  * May need the justified balances of:
408
- * - unrealizedJustified: Already available in `CheckpointWithPayloadAndBalance`
426
+ * - unrealizedJustified: Already available in `CheckpointWithBalance`
409
427
  * Since this balances are already available the getter is just `() => balances`, without cache interaction
410
428
  */
411
429
  private updateCheckpoints;
@@ -463,15 +481,4 @@ export declare function getCommitteeFraction(justifiedTotalActiveBalanceByIncrem
463
481
  slotsPerEpoch: number;
464
482
  committeePercent: number;
465
483
  }): number;
466
- /**
467
- * Get the payload status for a checkpoint.
468
- *
469
- * Pre-Gloas: always FULL (payload embedded in block)
470
- * Gloas: determined by state.execution_payload_availability
471
- *
472
- * @param config - The chain fork config to determine fork at checkpoint slot
473
- * @param state - The state to check execution_payload_availability
474
- * @param checkpointEpoch - The epoch of the checkpoint
475
- */
476
- export declare function getCheckpointPayloadStatus(config: ChainForkConfig, state: IBeaconStateView, checkpointEpoch: number): PayloadStatus;
477
484
  //# sourceMappingURL=forkChoice.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"forkChoice.d.ts","sourceRoot":"","sources":["../../src/forkChoice/forkChoice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forkChoice.d.ts","sourceRoot":"","sources":["../../src/forkChoice/forkChoice.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { ForkSeq, SLOTS_PER_EPOCH, SLOTS_PER_HISTORICAL_ROOT } from "@lodestar/params";
2
- import { DataAvailabilityStatus, ZERO_HASH, computeEpochAtSlot, computeSlotsSinceEpochStart, computeStartSlotAtEpoch, getAttesterSlashableIndices, isExecutionBlockBodyType, isStatePostBellatrix, isStatePostGloas, } from "@lodestar/state-transition";
1
+ import { SLOTS_PER_EPOCH } from "@lodestar/params";
2
+ import { DataAvailabilityStatus, ZERO_HASH, computeEpochAtSlot, computeSlotsSinceEpochStart, computeStartSlotAtEpoch, getAttesterSlashableIndices, isExecutionBlockBodyType, isStatePostBellatrix, } from "@lodestar/state-transition";
3
3
  import { isGloasBeaconBlock, ssz, } from "@lodestar/types";
4
4
  import { MapDef, fromHex, toRootHex } from "@lodestar/utils";
5
5
  import { computeDeltas } from "../protoArray/computeDeltas.js";
@@ -7,7 +7,7 @@ import { ProtoArrayError, ProtoArrayErrorCode } from "../protoArray/errors.js";
7
7
  import { ExecutionStatus, HEX_ZERO_HASH, NULL_VOTE_INDEX, PayloadStatus, isGloasBlock, } from "../protoArray/interface.js";
8
8
  import { ForkChoiceError, ForkChoiceErrorCode, InvalidAttestationCode, InvalidBlockCode } from "./errors.js";
9
9
  import { AncestorStatus, NotReorgedReason, } from "./interface.js";
10
- import { toCheckpointWithPayload } from "./store.js";
10
+ import { toCheckpointWithHex } from "./store.js";
11
11
  export { UpdateHeadOpt };
12
12
  var UpdateHeadOpt;
13
13
  (function (UpdateHeadOpt) {
@@ -215,6 +215,13 @@ export class ForkChoice {
215
215
  getProposerBoostRoot() {
216
216
  return this.proposerBoostRoot ?? HEX_ZERO_HASH;
217
217
  }
218
+ /**
219
+ * Decides whether to extend an available payload from the previous slot,
220
+ * corresponding to the beacon block `blockRoot`.
221
+ */
222
+ shouldExtendPayload(blockRoot) {
223
+ return this.protoArray.shouldExtendPayload(blockRoot, this.proposerBoostRoot);
224
+ }
218
225
  /**
219
226
  * To predict the proposer head of the next slot. That is, to predict if proposer-boost-reorg could happen.
220
227
  * Reason why we can't be certain is because information of the head block is not fully available yet
@@ -481,8 +488,7 @@ export class ForkChoice {
481
488
  // Check block is a descendant of the finalized block at the checkpoint finalized slot.
482
489
  const blockAncestorNode = this.getAncestor(parentRootHex, finalizedSlot);
483
490
  const fcStoreFinalized = this.fcStore.finalizedCheckpoint;
484
- if (blockAncestorNode.blockRoot !== fcStoreFinalized.rootHex ||
485
- blockAncestorNode.payloadStatus !== fcStoreFinalized.payloadStatus) {
491
+ if (blockAncestorNode.blockRoot !== fcStoreFinalized.rootHex) {
486
492
  throw new ForkChoiceError({
487
493
  code: ForkChoiceErrorCode.INVALID_BLOCK,
488
494
  err: {
@@ -503,13 +509,9 @@ export class ForkChoice {
503
509
  this.proposerBoostRoot === null) {
504
510
  this.proposerBoostRoot = blockRootHex;
505
511
  }
506
- // Get justified checkpoint with payload status for Gloas
507
- const justifiedPayloadStatus = getCheckpointPayloadStatus(this.config, state, state.currentJustifiedCheckpoint.epoch);
508
- const justifiedCheckpoint = toCheckpointWithPayload(state.currentJustifiedCheckpoint, justifiedPayloadStatus);
512
+ const justifiedCheckpoint = toCheckpointWithHex(state.currentJustifiedCheckpoint);
509
513
  const stateJustifiedEpoch = justifiedCheckpoint.epoch;
510
- // Get finalized checkpoint with payload status for Gloas
511
- const finalizedPayloadStatus = getCheckpointPayloadStatus(this.config, state, state.finalizedCheckpoint.epoch);
512
- const finalizedCheckpoint = toCheckpointWithPayload(state.finalizedCheckpoint, finalizedPayloadStatus);
514
+ const finalizedCheckpoint = toCheckpointWithHex(state.finalizedCheckpoint);
513
515
  // Justified balances for `justifiedCheckpoint` are new to the fork-choice. Compute them on demand only if
514
516
  // the justified checkpoint changes
515
517
  this.updateCheckpoints(justifiedCheckpoint, finalizedCheckpoint, () => this.fcStore.justifiedBalancesGetter(justifiedCheckpoint, state));
@@ -532,32 +534,22 @@ export class ForkChoice {
532
534
  if (parentBlock.unrealizedJustifiedEpoch === blockEpoch &&
533
535
  parentBlock.unrealizedFinalizedEpoch + 1 >= blockEpoch) {
534
536
  // reuse from parent, happens at 1/3 last blocks of epoch as monitored in mainnet
535
- // Get payload status for unrealized justified checkpoint
536
- const unrealizedJustifiedPayloadStatus = getCheckpointPayloadStatus(this.config, state, parentBlock.unrealizedJustifiedEpoch);
537
537
  unrealizedJustifiedCheckpoint = {
538
538
  epoch: parentBlock.unrealizedJustifiedEpoch,
539
539
  root: fromHex(parentBlock.unrealizedJustifiedRoot),
540
540
  rootHex: parentBlock.unrealizedJustifiedRoot,
541
- payloadStatus: unrealizedJustifiedPayloadStatus,
542
541
  };
543
- // Get payload status for unrealized finalized checkpoint
544
- const unrealizedFinalizedPayloadStatus = getCheckpointPayloadStatus(this.config, state, parentBlock.unrealizedFinalizedEpoch);
545
542
  unrealizedFinalizedCheckpoint = {
546
543
  epoch: parentBlock.unrealizedFinalizedEpoch,
547
544
  root: fromHex(parentBlock.unrealizedFinalizedRoot),
548
545
  rootHex: parentBlock.unrealizedFinalizedRoot,
549
- payloadStatus: unrealizedFinalizedPayloadStatus,
550
546
  };
551
547
  }
552
548
  else {
553
549
  // compute new, happens 2/3 first blocks of epoch as monitored in mainnet
554
550
  const unrealized = state.computeUnrealizedCheckpoints();
555
- // Get payload status for unrealized justified checkpoint
556
- const unrealizedJustifiedPayloadStatus = getCheckpointPayloadStatus(this.config, state, unrealized.justifiedCheckpoint.epoch);
557
- unrealizedJustifiedCheckpoint = toCheckpointWithPayload(unrealized.justifiedCheckpoint, unrealizedJustifiedPayloadStatus);
558
- // Get payload status for unrealized finalized checkpoint
559
- const unrealizedFinalizedPayloadStatus = getCheckpointPayloadStatus(this.config, state, unrealized.finalizedCheckpoint.epoch);
560
- unrealizedFinalizedCheckpoint = toCheckpointWithPayload(unrealized.finalizedCheckpoint, unrealizedFinalizedPayloadStatus);
551
+ unrealizedJustifiedCheckpoint = toCheckpointWithHex(unrealized.justifiedCheckpoint);
552
+ unrealizedFinalizedCheckpoint = toCheckpointWithHex(unrealized.finalizedCheckpoint);
561
553
  }
562
554
  }
563
555
  else {
@@ -612,7 +604,7 @@ export class ForkChoice {
612
604
  // Fallback to parent block's number (we know it's post-merge from check above)
613
605
  return parentBlock.executionPayloadNumber;
614
606
  })(),
615
- executionStatus: this.getPostGloasExecStatus(executionStatus),
607
+ executionStatus: this.getPostMergeExecStatus(executionStatus),
616
608
  dataAvailabilityStatus,
617
609
  }
618
610
  : isExecutionBlockBodyType(block.body) &&
@@ -622,7 +614,7 @@ export class ForkChoice {
622
614
  ? {
623
615
  executionPayloadBlockHash: toRootHex(block.body.executionPayload.blockHash),
624
616
  executionPayloadNumber: block.body.executionPayload.blockNumber,
625
- executionStatus: this.getPreGloasExecStatus(executionStatus),
617
+ executionStatus: this.getPostMergeExecStatus(executionStatus),
626
618
  dataAvailabilityStatus,
627
619
  }
628
620
  : {
@@ -760,8 +752,8 @@ export class ForkChoice {
760
752
  * Creates the FULL variant of a Gloas block when the payload becomes available
761
753
  * Spec: gloas/fork-choice.md#new-on_execution_payload
762
754
  */
763
- onExecutionPayload(blockRoot, executionPayloadBlockHash, executionPayloadNumber, executionPayloadStateRoot, executionStatus) {
764
- this.protoArray.onExecutionPayload(blockRoot, this.fcStore.currentSlot, executionPayloadBlockHash, executionPayloadNumber, executionPayloadStateRoot, this.proposerBoostRoot, executionStatus);
755
+ onExecutionPayload(blockRoot, executionPayloadBlockHash, executionPayloadNumber, executionStatus, dataAvailabilityStatus) {
756
+ this.protoArray.onExecutionPayload(blockRoot, this.fcStore.currentSlot, executionPayloadBlockHash, executionPayloadNumber, this.proposerBoostRoot, executionStatus, dataAvailabilityStatus);
765
757
  }
766
758
  /**
767
759
  * Call `onTick` for all slots between `fcStore.getCurrentSlot()` and the provided `currentSlot`.
@@ -835,6 +827,12 @@ export class ForkChoice {
835
827
  hasPayloadHexUnsafe(blockRoot) {
836
828
  return this.protoArray.hasPayload(blockRoot);
837
829
  }
830
+ getPTCVotes(blockRootHex) {
831
+ const votes = this.protoArray.getPTCVotes(blockRootHex);
832
+ if (votes === null)
833
+ return null;
834
+ return votes.toBoolArray().map((v) => v ?? null);
835
+ }
838
836
  /**
839
837
  * Returns a MUTABLE `ProtoBlock` if the block is known **and** a descendant of the finalized root.
840
838
  */
@@ -872,8 +870,8 @@ export class ForkChoice {
872
870
  return this.protoArray.getBlockHexAndBlockHash(blockRoot, blockHash);
873
871
  }
874
872
  getJustifiedBlock() {
875
- const { rootHex, payloadStatus } = this.fcStore.justified.checkpoint;
876
- const block = this.getBlockHex(rootHex, payloadStatus);
873
+ const { rootHex } = this.fcStore.justified.checkpoint;
874
+ const block = this.getBlockHexDefaultStatus(rootHex);
877
875
  if (!block) {
878
876
  throw new ForkChoiceError({
879
877
  code: ForkChoiceErrorCode.MISSING_PROTO_ARRAY_BLOCK,
@@ -883,8 +881,8 @@ export class ForkChoice {
883
881
  return block;
884
882
  }
885
883
  getFinalizedBlock() {
886
- const { rootHex, payloadStatus } = this.fcStore.finalizedCheckpoint;
887
- const block = this.getBlockHex(rootHex, payloadStatus);
884
+ const { rootHex } = this.fcStore.finalizedCheckpoint;
885
+ const block = this.getBlockHexDefaultStatus(rootHex);
888
886
  if (!block) {
889
887
  throw new ForkChoiceError({
890
888
  code: ForkChoiceErrorCode.MISSING_PROTO_ARRAY_BLOCK,
@@ -947,13 +945,12 @@ export class ForkChoice {
947
945
  return this.protoArray.iterateAncestorNodes(blockRoot, payloadStatus);
948
946
  }
949
947
  /**
950
- * Returns all blocks backwards starting from a block root.
951
- * Return only the non-finalized blocks.
948
+ * Raw ancestor walk from `blockRoot` back toward the previous finalized block. Includes both
949
+ * `blockRoot` and the previous-finalized boundary as last element. Mirrors the semantics of
950
+ * `getAllAncestorAndNonAncestorBlocks.ancestors`
952
951
  */
953
952
  getAllAncestorBlocks(blockRoot, payloadStatus) {
954
- const blocks = this.protoArray.getAllAncestorNodes(blockRoot, payloadStatus);
955
- // the last node is the previous finalized one, it's there to check onBlock finalized checkpoint only.
956
- return blocks.slice(0, blocks.length - 1);
953
+ return this.protoArray.getAllAncestorNodes(blockRoot, payloadStatus);
957
954
  }
958
955
  /**
959
956
  * The same to iterateAncestorBlocks but this gets non-ancestor nodes instead of ancestor nodes.
@@ -963,14 +960,26 @@ export class ForkChoice {
963
960
  }
964
961
  /**
965
962
  * Returns both ancestor and non-ancestor blocks in a single traversal.
963
+ *
964
+ * `ancestors` is the raw walk and includes the previous finalized block as its last element —
965
+ * callers that don't want the boundary should slice it off themselves.
966
+ * Post-gloas for each block root, it returns exactly one variant of it.
966
967
  */
967
968
  getAllAncestorAndNonAncestorBlocks(blockRoot, payloadStatus) {
968
- const { ancestors, nonAncestors } = this.protoArray.getAllAncestorAndNonAncestorNodes(blockRoot, payloadStatus);
969
- return {
970
- // the last node is the previous finalized one, it's there to check onBlock finalized checkpoint only.
971
- ancestors: ancestors.slice(0, ancestors.length - 1),
972
- nonAncestors,
973
- };
969
+ return this.protoArray.getAllAncestorAndNonAncestorNodes(blockRoot, payloadStatus);
970
+ }
971
+ /**
972
+ * Same to getAllAncestorAndNonAncestorBlocks with default variant of ${blockRoot} to start with
973
+ */
974
+ getAllAncestorAndNonAncestorBlocksDefaultStatus(blockRoot) {
975
+ const defaultStatus = this.protoArray.getDefaultVariant(blockRoot);
976
+ if (defaultStatus === undefined) {
977
+ throw new ForkChoiceError({
978
+ code: ForkChoiceErrorCode.MISSING_PROTO_ARRAY_BLOCK,
979
+ root: blockRoot,
980
+ });
981
+ }
982
+ return this.getAllAncestorAndNonAncestorBlocks(blockRoot, defaultStatus);
974
983
  }
975
984
  getCanonicalBlockByRoot(blockRoot) {
976
985
  const blockRootHex = toRootHex(blockRoot);
@@ -1030,6 +1039,16 @@ export class ForkChoice {
1030
1039
  }
1031
1040
  }
1032
1041
  }
1042
+ forwardIterateDescendantsDefaultStatus(blockRoot) {
1043
+ const defaultStatus = this.protoArray.getDefaultVariant(blockRoot);
1044
+ if (defaultStatus === undefined) {
1045
+ throw new ForkChoiceError({
1046
+ code: ForkChoiceErrorCode.MISSING_PROTO_ARRAY_BLOCK,
1047
+ root: blockRoot,
1048
+ });
1049
+ }
1050
+ return this.forwardIterateDescendants(blockRoot, defaultStatus);
1051
+ }
1033
1052
  /** Very expensive function, iterates the entire ProtoArray. TODO: Is this function even necessary? */
1034
1053
  getBlockSummariesByParentRoot(parentRoot) {
1035
1054
  return this.protoArray.nodes.filter((node) => node.parentRoot === parentRoot);
@@ -1162,16 +1181,11 @@ export class ForkChoice {
1162
1181
  throw Error(`Invalid pre-merge data status: expected: ${DataAvailabilityStatus.PreData}, got ${dataAvailabilityStatus}`);
1163
1182
  return dataAvailabilityStatus;
1164
1183
  }
1165
- getPreGloasExecStatus(executionStatus) {
1166
- if (executionStatus === ExecutionStatus.PreMerge || executionStatus === ExecutionStatus.PayloadSeparated)
1184
+ getPostMergeExecStatus(executionStatus) {
1185
+ if (executionStatus === ExecutionStatus.PreMerge)
1167
1186
  throw Error(`Invalid post-merge execution status: expected: ${ExecutionStatus.Syncing} or ${ExecutionStatus.Valid}, got ${executionStatus}`);
1168
1187
  return executionStatus;
1169
1188
  }
1170
- getPostGloasExecStatus(executionStatus) {
1171
- if (executionStatus !== ExecutionStatus.PayloadSeparated)
1172
- throw Error(`Invalid post-gloas execution status: expected: ${ExecutionStatus.PayloadSeparated}, got ${executionStatus}`);
1173
- return executionStatus;
1174
- }
1175
1189
  /**
1176
1190
  * Why `getJustifiedBalances` getter?
1177
1191
  * - updateCheckpoints() is called in both on_block and on_tick.
@@ -1189,7 +1203,7 @@ export class ForkChoice {
1189
1203
  *
1190
1204
  * **`on_tick`**
1191
1205
  * May need the justified balances of:
1192
- * - unrealizedJustified: Already available in `CheckpointWithPayloadAndBalance`
1206
+ * - unrealizedJustified: Already available in `CheckpointWithBalance`
1193
1207
  * Since this balances are already available the getter is just `() => balances`, without cache interaction
1194
1208
  */
1195
1209
  updateCheckpoints(justifiedCheckpoint, finalizedCheckpoint, getJustifiedBalances) {
@@ -1520,31 +1534,4 @@ export function getCommitteeFraction(justifiedTotalActiveBalanceByIncrement, con
1520
1534
  const committeeWeight = Math.floor(justifiedTotalActiveBalanceByIncrement / config.slotsPerEpoch);
1521
1535
  return Math.floor((committeeWeight * config.committeePercent) / 100);
1522
1536
  }
1523
- /**
1524
- * Get the payload status for a checkpoint.
1525
- *
1526
- * Pre-Gloas: always FULL (payload embedded in block)
1527
- * Gloas: determined by state.execution_payload_availability
1528
- *
1529
- * @param config - The chain fork config to determine fork at checkpoint slot
1530
- * @param state - The state to check execution_payload_availability
1531
- * @param checkpointEpoch - The epoch of the checkpoint
1532
- */
1533
- export function getCheckpointPayloadStatus(config, state, checkpointEpoch) {
1534
- // Compute checkpoint slot first to determine the correct fork
1535
- const checkpointSlot = computeStartSlotAtEpoch(checkpointEpoch);
1536
- const fork = config.getForkSeq(checkpointSlot);
1537
- // Pre-Gloas: always FULL
1538
- if (fork < ForkSeq.gloas) {
1539
- return PayloadStatus.FULL;
1540
- }
1541
- if (!isStatePostGloas(state)) {
1542
- throw new Error(`Expected gloas+ state for checkpoint payload status, got fork=${state.forkName}`);
1543
- }
1544
- // For Gloas, check state.execution_payload_availability
1545
- // - For non-skipped slots at checkpoint: returns false (EMPTY) since payload hasn't arrived yet
1546
- // - For skipped slots at checkpoint: returns the actual availability status from state
1547
- const payloadAvailable = state.executionPayloadAvailability.get(checkpointSlot % SLOTS_PER_HISTORICAL_ROOT);
1548
- return payloadAvailable ? PayloadStatus.FULL : PayloadStatus.EMPTY;
1549
- }
1550
1537
  //# sourceMappingURL=forkChoice.js.map