@lodestar/beacon-node 1.44.0-dev.1557420d0a → 1.44.0-dev.171f6028ff

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.
Files changed (174) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +36 -33
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +0 -25
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/config/constants.d.ts +5 -0
  8. package/lib/api/impl/config/constants.d.ts.map +1 -1
  9. package/lib/api/impl/config/constants.js +6 -1
  10. package/lib/api/impl/config/constants.js.map +1 -1
  11. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  12. package/lib/api/impl/lodestar/index.js +28 -0
  13. package/lib/api/impl/lodestar/index.js.map +1 -1
  14. package/lib/api/impl/validator/index.d.ts.map +1 -1
  15. package/lib/api/impl/validator/index.js +20 -27
  16. package/lib/api/impl/validator/index.js.map +1 -1
  17. package/lib/chain/archiveStore/archiveStore.d.ts +0 -1
  18. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  19. package/lib/chain/archiveStore/archiveStore.js +0 -4
  20. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  21. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  22. package/lib/chain/blocks/importBlock.js +3 -2
  23. package/lib/chain/blocks/importBlock.js.map +1 -1
  24. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  25. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +3 -3
  26. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  27. package/lib/chain/chain.d.ts +2 -2
  28. package/lib/chain/chain.d.ts.map +1 -1
  29. package/lib/chain/chain.js +9 -2
  30. package/lib/chain/chain.js.map +1 -1
  31. package/lib/chain/emitter.d.ts +2 -1
  32. package/lib/chain/emitter.d.ts.map +1 -1
  33. package/lib/chain/emitter.js.map +1 -1
  34. package/lib/chain/errors/blockError.d.ts +0 -7
  35. package/lib/chain/errors/blockError.d.ts.map +1 -1
  36. package/lib/chain/errors/blockError.js +0 -3
  37. package/lib/chain/errors/blockError.js.map +1 -1
  38. package/lib/chain/errors/executionPayloadBid.d.ts +12 -0
  39. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  40. package/lib/chain/errors/executionPayloadBid.js +2 -0
  41. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  42. package/lib/chain/forkChoice/index.d.ts +4 -4
  43. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  44. package/lib/chain/forkChoice/index.js +10 -7
  45. package/lib/chain/forkChoice/index.js.map +1 -1
  46. package/lib/chain/interface.d.ts +2 -2
  47. package/lib/chain/interface.d.ts.map +1 -1
  48. package/lib/chain/interface.js.map +1 -1
  49. package/lib/chain/options.d.ts.map +1 -1
  50. package/lib/chain/options.js +1 -0
  51. package/lib/chain/options.js.map +1 -1
  52. package/lib/chain/produceBlock/produceBlockBody.d.ts +2 -2
  53. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  54. package/lib/chain/produceBlock/produceBlockBody.js +4 -4
  55. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  56. package/lib/chain/regen/interface.d.ts +0 -1
  57. package/lib/chain/regen/interface.d.ts.map +1 -1
  58. package/lib/chain/regen/queued.d.ts +0 -1
  59. package/lib/chain/regen/queued.d.ts.map +1 -1
  60. package/lib/chain/regen/queued.js +0 -4
  61. package/lib/chain/regen/queued.js.map +1 -1
  62. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +0 -5
  63. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  64. package/lib/chain/stateCache/fifoBlockStateCache.js +0 -5
  65. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  66. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +1 -4
  67. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  68. package/lib/chain/stateCache/persistentCheckpointsCache.js +5 -2
  69. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  70. package/lib/chain/stateCache/types.d.ts +0 -2
  71. package/lib/chain/stateCache/types.d.ts.map +1 -1
  72. package/lib/chain/stateCache/types.js.map +1 -1
  73. package/lib/chain/validation/block.d.ts +5 -1
  74. package/lib/chain/validation/block.d.ts.map +1 -1
  75. package/lib/chain/validation/block.js +4 -14
  76. package/lib/chain/validation/block.js.map +1 -1
  77. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  78. package/lib/chain/validation/executionPayloadBid.js +23 -1
  79. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  80. package/lib/chain/validation/executionPayloadEnvelope.js +1 -3
  81. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  82. package/lib/execution/engine/http.js +1 -1
  83. package/lib/execution/engine/http.js.map +1 -1
  84. package/lib/execution/engine/interface.d.ts +2 -2
  85. package/lib/execution/engine/interface.d.ts.map +1 -1
  86. package/lib/execution/engine/interface.js +6 -2
  87. package/lib/execution/engine/interface.js.map +1 -1
  88. package/lib/execution/engine/mock.d.ts.map +1 -1
  89. package/lib/execution/engine/mock.js +3 -5
  90. package/lib/execution/engine/mock.js.map +1 -1
  91. package/lib/execution/engine/types.d.ts +15 -7
  92. package/lib/execution/engine/types.d.ts.map +1 -1
  93. package/lib/execution/engine/types.js +47 -9
  94. package/lib/execution/engine/types.js.map +1 -1
  95. package/lib/metrics/metrics/lodestar.d.ts +4 -0
  96. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  97. package/lib/metrics/metrics/lodestar.js +10 -0
  98. package/lib/metrics/metrics/lodestar.js.map +1 -1
  99. package/lib/network/gossip/topic.d.ts +22 -2
  100. package/lib/network/gossip/topic.d.ts.map +1 -1
  101. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  102. package/lib/network/processor/gossipHandlers.js +9 -2
  103. package/lib/network/processor/gossipHandlers.js.map +1 -1
  104. package/lib/network/processor/index.d.ts +2 -2
  105. package/lib/network/processor/index.d.ts.map +1 -1
  106. package/lib/network/processor/index.js +25 -23
  107. package/lib/network/processor/index.js.map +1 -1
  108. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  109. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +9 -5
  110. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  111. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  112. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +8 -3
  113. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  114. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +2 -1
  115. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  116. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +13 -3
  117. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  118. package/lib/network/reqresp/handlers/index.js +2 -2
  119. package/lib/network/reqresp/handlers/index.js.map +1 -1
  120. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -1
  121. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +15 -5
  122. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  123. package/lib/sync/types.d.ts +9 -1
  124. package/lib/sync/types.d.ts.map +1 -1
  125. package/lib/sync/types.js +9 -2
  126. package/lib/sync/types.js.map +1 -1
  127. package/lib/sync/unknownBlock.d.ts.map +1 -1
  128. package/lib/sync/unknownBlock.js +64 -30
  129. package/lib/sync/unknownBlock.js.map +1 -1
  130. package/lib/util/dataColumns.d.ts.map +1 -1
  131. package/lib/util/dataColumns.js +16 -11
  132. package/lib/util/dataColumns.js.map +1 -1
  133. package/lib/util/sszBytes.js +1 -1
  134. package/package.json +15 -15
  135. package/src/api/impl/beacon/blocks/index.ts +40 -42
  136. package/src/api/impl/beacon/pool/index.ts +1 -41
  137. package/src/api/impl/config/constants.ts +10 -0
  138. package/src/api/impl/lodestar/index.ts +30 -0
  139. package/src/api/impl/validator/index.ts +29 -39
  140. package/src/chain/archiveStore/archiveStore.ts +0 -5
  141. package/src/chain/blocks/importBlock.ts +7 -5
  142. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +3 -5
  143. package/src/chain/chain.ts +12 -4
  144. package/src/chain/emitter.ts +3 -2
  145. package/src/chain/errors/blockError.ts +0 -4
  146. package/src/chain/errors/executionPayloadBid.ts +14 -0
  147. package/src/chain/forkChoice/index.ts +13 -0
  148. package/src/chain/interface.ts +1 -2
  149. package/src/chain/options.ts +1 -0
  150. package/src/chain/produceBlock/produceBlockBody.ts +7 -7
  151. package/src/chain/regen/interface.ts +0 -1
  152. package/src/chain/regen/queued.ts +0 -5
  153. package/src/chain/stateCache/fifoBlockStateCache.ts +0 -6
  154. package/src/chain/stateCache/persistentCheckpointsCache.ts +6 -2
  155. package/src/chain/stateCache/types.ts +0 -2
  156. package/src/chain/validation/block.ts +12 -16
  157. package/src/chain/validation/executionPayloadBid.ts +25 -1
  158. package/src/chain/validation/executionPayloadEnvelope.ts +1 -3
  159. package/src/execution/engine/http.ts +1 -1
  160. package/src/execution/engine/interface.ts +12 -2
  161. package/src/execution/engine/mock.ts +6 -5
  162. package/src/execution/engine/types.ts +75 -14
  163. package/src/metrics/metrics/lodestar.ts +11 -0
  164. package/src/network/processor/gossipHandlers.ts +9 -2
  165. package/src/network/processor/index.ts +27 -27
  166. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +12 -5
  167. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +11 -3
  168. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +19 -3
  169. package/src/network/reqresp/handlers/index.ts +2 -2
  170. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +14 -5
  171. package/src/sync/types.ts +11 -2
  172. package/src/sync/unknownBlock.ts +70 -31
  173. package/src/util/dataColumns.ts +17 -12
  174. package/src/util/sszBytes.ts +1 -1
@@ -9,7 +9,7 @@ import {
9
9
  isForkPostGloas,
10
10
  } from "@lodestar/params";
11
11
  import {isStatePostAltair} from "@lodestar/state-transition";
12
- import {Attestation, Epoch, SingleAttestation, isElectraAttestation, ssz, sszTypesFor} from "@lodestar/types";
12
+ import {Epoch, SingleAttestation, isElectraAttestation, ssz, sszTypesFor} from "@lodestar/types";
13
13
  import {toRootHex} from "@lodestar/utils";
14
14
  import {
15
15
  AttestationError,
@@ -40,25 +40,6 @@ export function getBeaconPoolApi({
40
40
  network,
41
41
  }: Pick<ApiModules, "chain" | "logger" | "metrics" | "network">): ApplicationMethods<routes.beacon.pool.Endpoints> {
42
42
  return {
43
- async getPoolAttestations({slot, committeeIndex}) {
44
- // Already filtered by slot
45
- let attestations: Attestation[] = chain.aggregatedAttestationPool.getAll(slot);
46
- const fork = chain.config.getForkName(slot ?? chain.clock.currentSlot);
47
-
48
- if (isForkPostElectra(fork)) {
49
- throw new ApiError(
50
- 400,
51
- `Use getPoolAttestationsV2 to retrieve pool attestations for post-electra fork=${fork}`
52
- );
53
- }
54
-
55
- if (committeeIndex !== undefined) {
56
- attestations = attestations.filter((attestation) => committeeIndex === attestation.data.index);
57
- }
58
-
59
- return {data: attestations};
60
- },
61
-
62
43
  async getPoolAttestationsV2({slot, committeeIndex}) {
63
44
  // Already filtered by slot
64
45
  let attestations = chain.aggregatedAttestationPool.getAll(slot);
@@ -134,19 +115,6 @@ export function getBeaconPoolApi({
134
115
  }
135
116
  },
136
117
 
137
- async getPoolAttesterSlashings() {
138
- const fork = chain.config.getForkName(chain.clock.currentSlot);
139
-
140
- if (isForkPostElectra(fork)) {
141
- throw new ApiError(
142
- 400,
143
- `Use getPoolAttesterSlashingsV2 to retrieve pool attester slashings for post-electra fork=${fork}`
144
- );
145
- }
146
-
147
- return {data: chain.opPool.getAllAttesterSlashings()};
148
- },
149
-
150
118
  async getPoolAttesterSlashingsV2() {
151
119
  const fork = chain.config.getForkName(chain.clock.currentSlot);
152
120
  return {data: chain.opPool.getAllAttesterSlashings(), meta: {version: fork}};
@@ -164,10 +132,6 @@ export function getBeaconPoolApi({
164
132
  return {data: chain.opPool.getAllBlsToExecutionChanges().map(({data}) => data)};
165
133
  },
166
134
 
167
- async submitPoolAttestations({signedAttestations}) {
168
- await this.submitPoolAttestationsV2({signedAttestations});
169
- },
170
-
171
135
  async submitPoolAttestationsV2({signedAttestations}) {
172
136
  const fork = chain.config.getForkName(chain.clock.currentSlot);
173
137
  const seenTimestampSec = Date.now() / 1000;
@@ -247,10 +211,6 @@ export function getBeaconPoolApi({
247
211
  }
248
212
  },
249
213
 
250
- async submitPoolAttesterSlashings({attesterSlashing}) {
251
- await this.submitPoolAttesterSlashingsV2({attesterSlashing});
252
- },
253
-
254
214
  async submitPoolAttesterSlashingsV2({attesterSlashing}) {
255
215
  await validateApiAttesterSlashing(chain, attesterSlashing);
256
216
  const fork = chain.config.getForkName(Number(attesterSlashing.attestation1.data.slot));
@@ -5,6 +5,8 @@ import {
5
5
  BASE_REWARDS_PER_EPOCH,
6
6
  BLOB_TX_TYPE,
7
7
  BLS_WITHDRAWAL_PREFIX,
8
+ BUILDER_DEPOSIT_REQUEST_TYPE,
9
+ BUILDER_EXIT_REQUEST_TYPE,
8
10
  BUILDER_INDEX_FLAG,
9
11
  BUILDER_INDEX_SELF_BUILD,
10
12
  BUILDER_PAYMENT_THRESHOLD_DENOMINATOR,
@@ -21,6 +23,7 @@ import {
21
23
  DOMAIN_BEACON_BUILDER,
22
24
  DOMAIN_BEACON_PROPOSER,
23
25
  DOMAIN_BLS_TO_EXECUTION_CHANGE,
26
+ DOMAIN_BUILDER_DEPOSIT,
24
27
  DOMAIN_CONTRIBUTION_AND_PROOF,
25
28
  DOMAIN_DEPOSIT,
26
29
  DOMAIN_PROPOSER_PREFERENCES,
@@ -38,6 +41,7 @@ import {
38
41
  JUSTIFICATION_BITS_LENGTH,
39
42
  MAX_CONCURRENT_REQUESTS,
40
43
  NODE_ID_BITS,
44
+ PAYLOAD_BUILDER_VERSION,
41
45
  PROPOSER_WEIGHT,
42
46
  SYNC_COMMITTEE_SUBNET_COUNT,
43
47
  SYNC_REWARD_WEIGHT,
@@ -53,6 +57,7 @@ import {
53
57
  VERSIONED_HASH_VERSION_KZG,
54
58
  WEIGHT_DENOMINATOR,
55
59
  WITHDRAWAL_REQUEST_TYPE,
60
+ ZERO_HASH_HEX,
56
61
  } from "@lodestar/params";
57
62
 
58
63
  /**
@@ -69,6 +74,7 @@ export const specConstants = {
69
74
  DEPOSIT_CONTRACT_TREE_DEPTH,
70
75
  JUSTIFICATION_BITS_LENGTH,
71
76
  ENDIANNESS: "little",
77
+ EMPTY_BLOCK_HASH: ZERO_HASH_HEX,
72
78
  // ## Withdrawal prefixes
73
79
  BLS_WITHDRAWAL_PREFIX: toHexByte(BLS_WITHDRAWAL_PREFIX),
74
80
  ETH1_ADDRESS_WITHDRAWAL_PREFIX: toHexByte(ETH1_ADDRESS_WITHDRAWAL_PREFIX),
@@ -138,6 +144,10 @@ export const specConstants = {
138
144
  BUILDER_INDEX_SELF_BUILD,
139
145
  BUILDER_PAYMENT_THRESHOLD_NUMERATOR,
140
146
  BUILDER_PAYMENT_THRESHOLD_DENOMINATOR,
147
+ PAYLOAD_BUILDER_VERSION,
148
+ DOMAIN_BUILDER_DEPOSIT,
149
+ BUILDER_DEPOSIT_REQUEST_TYPE: toHexByte(BUILDER_DEPOSIT_REQUEST_TYPE),
150
+ BUILDER_EXIT_REQUEST_TYPE: toHexByte(BUILDER_EXIT_REQUEST_TYPE),
141
151
  };
142
152
 
143
153
  /** Convert single-byte numbers to hex strings for API spec compliance */
@@ -280,6 +280,36 @@ export function getLodestarApi({
280
280
  };
281
281
  },
282
282
 
283
+ async getFastConfirmationInfo() {
284
+ const confirmedRoot = chain.forkChoice.getConfirmedRoot();
285
+ const confirmedBlock = chain.forkChoice.getConfirmedBlock();
286
+ const justifiedCheckpoint = chain.forkChoice.getJustifiedCheckpoint();
287
+ const finalizedCheckpoint = chain.forkChoice.getFinalizedCheckpoint();
288
+ const headRoot = chain.forkChoice.getHeadRoot();
289
+ const head = chain.forkChoice.getHead();
290
+
291
+ return {
292
+ data: {
293
+ confirmed: {
294
+ rootHex: confirmedRoot,
295
+ slot: confirmedBlock?.slot ?? null,
296
+ },
297
+ head: {
298
+ rootHex: headRoot,
299
+ slot: head.slot,
300
+ },
301
+ justifiedCheckpoint: {
302
+ rootHex: justifiedCheckpoint.rootHex,
303
+ epoch: justifiedCheckpoint.epoch,
304
+ },
305
+ finalizedCheckpoint: {
306
+ rootHex: finalizedCheckpoint.rootHex,
307
+ epoch: finalizedCheckpoint.epoch,
308
+ },
309
+ },
310
+ };
311
+ },
312
+
283
313
  async getAttesterSlashingsFromBlocks({signedBlocks}) {
284
314
  const attestations = new Map<Epoch, Attestation[]>();
285
315
 
@@ -1207,7 +1207,10 @@ export function getValidatorApi(
1207
1207
  const isPostFulu = isForkPostFulu(config.getForkName(startSlot));
1208
1208
  const maxFutureEpoch = isPostFulu && nearNextEpoch && opts?.v2 ? nextEpoch + 1 : nextEpoch;
1209
1209
  if (currentEpoch >= 0 && epoch > maxFutureEpoch) {
1210
- throw new ApiError(400, `Requested epoch ${epoch} must not be more than one epoch in the future`);
1210
+ throw new ApiError(
1211
+ 400,
1212
+ `Requested epoch ${epoch} must not be more than ${maxFutureEpoch}, currentEpoch=${currentEpoch}, v2=${opts?.v2 ?? false}`
1213
+ );
1211
1214
  }
1212
1215
 
1213
1216
  const head = chain.forkChoice.getHead();
@@ -1291,17 +1294,35 @@ export function getValidatorApi(
1291
1294
  duties.push({slot: startSlot + i, validatorIndex: indexes[i], pubkey: pubkeys[i]});
1292
1295
  }
1293
1296
 
1294
- // Returns `null` on the one-off scenario where the genesis block decides its own shuffling.
1295
- // It should be set to the latest block applied to `self` or the genesis block root.
1296
- const dependentRoot =
1297
- // In v2 the dependent root is different after fulu due to deterministic proposer lookahead
1298
- proposerShufflingDecisionRoot(opts?.v2 ? config.getForkName(startSlot) : ForkName.phase0, state, epoch) ||
1299
- (await getGenesisBlockRoot(state));
1297
+ // In v2 the dependent root is different after fulu due to deterministic proposer lookahead
1298
+ let dependentRoot = proposerShufflingDecisionRoot(
1299
+ opts?.v2 ? config.getForkName(startSlot) : ForkName.phase0,
1300
+ state,
1301
+ epoch
1302
+ );
1303
+ const logCtx = {
1304
+ epoch,
1305
+ stateSlot: state.slot,
1306
+ stateEpoch: state.epoch,
1307
+ v2: opts?.v2 ?? false,
1308
+ };
1309
+ if (dependentRoot === null) {
1310
+ // fallback to get_proposer_duties() v1, also in lodestar v1.43
1311
+ logger.verbose("Proposer duties decision root not in state, falling back to state epoch", logCtx);
1312
+ dependentRoot = proposerShufflingDecisionRoot(ForkName.phase0, state, state.epoch);
1313
+ }
1314
+ if (dependentRoot === null) {
1315
+ logger.verbose("Proposer duties decision root not in state, falling back to genesis block root", logCtx);
1316
+ dependentRoot = await getGenesisBlockRoot(state);
1317
+ }
1318
+
1319
+ const dependentRootHex = toRootHex(dependentRoot);
1320
+ logger.verbose("Computed proposer duties decision root", {...logCtx, dependentRoot: dependentRootHex});
1300
1321
 
1301
1322
  return {
1302
1323
  data: duties,
1303
1324
  meta: {
1304
- dependentRoot: toRootHex(dependentRoot),
1325
+ dependentRoot: dependentRootHex,
1305
1326
  executionOptimistic: isOptimisticBlock(head),
1306
1327
  },
1307
1328
  };
@@ -1480,33 +1501,6 @@ export function getValidatorApi(
1480
1501
  };
1481
1502
  },
1482
1503
 
1483
- async getAggregatedAttestation({attestationDataRoot, slot}) {
1484
- notWhileSyncing();
1485
-
1486
- await waitForSlot(slot); // Must never request for a future slot > currentSlot
1487
-
1488
- const dataRootHex = toRootHex(attestationDataRoot);
1489
- const aggregate = chain.attestationPool.getAggregate(slot, dataRootHex, null);
1490
- const fork = chain.config.getForkName(slot);
1491
-
1492
- if (isForkPostElectra(fork)) {
1493
- throw new ApiError(
1494
- 400,
1495
- `Use getAggregatedAttestationV2 to retrieve aggregated attestations for post-electra fork=${fork}`
1496
- );
1497
- }
1498
-
1499
- if (!aggregate) {
1500
- throw new ApiError(404, `No aggregated attestation for slot=${slot}, dataRoot=${dataRootHex}`);
1501
- }
1502
-
1503
- metrics?.production.producedAggregateParticipants.observe(aggregate.aggregationBits.getTrueBitIndexes().length);
1504
-
1505
- return {
1506
- data: aggregate,
1507
- };
1508
- },
1509
-
1510
1504
  async getAggregatedAttestationV2({attestationDataRoot, slot, committeeIndex}) {
1511
1505
  notWhileSyncing();
1512
1506
 
@@ -1530,10 +1524,6 @@ export function getValidatorApi(
1530
1524
  };
1531
1525
  },
1532
1526
 
1533
- async publishAggregateAndProofs({signedAggregateAndProofs}) {
1534
- await this.publishAggregateAndProofsV2({signedAggregateAndProofs});
1535
- },
1536
-
1537
1527
  async publishAggregateAndProofsV2({signedAggregateAndProofs}) {
1538
1528
  notWhileSyncing();
1539
1529
 
@@ -30,7 +30,6 @@ export enum ArchiveStoreTask {
30
30
  PruneHistory = "prune_history",
31
31
  OnFinalizedCheckpoint = "on_finalized_checkpoint",
32
32
  MaybeArchiveState = "maybe_archive_state",
33
- RegenPruneOnFinalized = "regen_prune_on_finalized",
34
33
  ForkchoicePrune = "forkchoice_prune",
35
34
  UpdateBackfillRange = "update_backfill_range",
36
35
  }
@@ -229,10 +228,6 @@ export class ArchiveStore {
229
228
  await this.statesArchiverStrategy.maybeArchiveState(finalized, this.metrics);
230
229
  timer?.({source: ArchiveStoreTask.MaybeArchiveState});
231
230
 
232
- timer = this.metrics?.processFinalizedCheckpoint.durationByTask.startTimer();
233
- this.chain.regen.pruneOnFinalized(finalizedEpoch);
234
- timer?.({source: ArchiveStoreTask.RegenPruneOnFinalized});
235
-
236
231
  // tasks rely on extended fork choice
237
232
  timer = this.metrics?.processFinalizedCheckpoint.durationByTask.startTimer();
238
233
  const prunedBlocks = this.chain.forkChoice.prune(finalized.rootHex);
@@ -22,7 +22,7 @@ import {
22
22
  } from "@lodestar/state-transition";
23
23
  import {Attestation, BeaconBlock, altair, capella, electra, isGloasBeaconBlock, phase0, ssz} from "@lodestar/types";
24
24
  import {isErrorAborted, toRootHex} from "@lodestar/utils";
25
- import {ZERO_HASH_HEX} from "../../constants/index.js";
25
+ import {GENESIS_SLOT, ZERO_HASH_HEX} from "../../constants/index.js";
26
26
  import {callInNextEventLoop} from "../../util/eventLoop.js";
27
27
  import {isOptimisticBlock} from "../../util/forkChoice.js";
28
28
  import {isQueueErrorAborted} from "../../util/queue/index.js";
@@ -189,10 +189,12 @@ export async function importBlock(
189
189
  this.seenBlockAttesters.addIndices(blockEpoch, indexedAttestation.attestingIndices);
190
190
 
191
191
  const correctHead = ssz.Root.equals(rootCache.getBlockRootAtSlot(attestation.data.slot), beaconBlockRoot);
192
- const missedSlotVote = ssz.Root.equals(
193
- rootCache.getBlockRootAtSlot(attestation.data.slot - 1),
194
- rootCache.getBlockRootAtSlot(attestation.data.slot)
195
- );
192
+ const missedSlotVote =
193
+ attestation.data.slot > GENESIS_SLOT &&
194
+ ssz.Root.equals(
195
+ rootCache.getBlockRootAtSlot(attestation.data.slot - 1),
196
+ rootCache.getBlockRootAtSlot(attestation.data.slot)
197
+ );
196
198
  this.validatorMonitor?.registerAttestationInBlock(
197
199
  indexedAttestation,
198
200
  parentBlockSlot,
@@ -61,10 +61,8 @@ export function verifyExecutionPayloadEnvelope(
61
61
  `Prev randao mismatch between bid and payload bid=${toHex(bid.prevRandao)} payload=${toHex(payload.prevRandao)}`
62
62
  );
63
63
  }
64
- if (Number(bid.gasLimit) !== payload.gasLimit) {
65
- throw new Error(
66
- `Gas limit mismatch between payload and bid payload=${payload.gasLimit} bid=${Number(bid.gasLimit)}`
67
- );
64
+ if (bid.gasLimit !== payload.gasLimit) {
65
+ throw new Error(`Gas limit mismatch between payload and bid payload=${payload.gasLimit} bid=${bid.gasLimit}`);
68
66
  }
69
67
  if (!byteArrayEquals(bid.blockHash, payload.blockHash)) {
70
68
  throw new Error(
@@ -74,7 +72,7 @@ export function verifyExecutionPayloadEnvelope(
74
72
  // Verify execution_requests_root matches bid commitment.
75
73
  // Can be skipped if already verified during gossip validation.
76
74
  if (verifyExecutionRequestsRoot) {
77
- const requestsRoot = ssz.electra.ExecutionRequests.hashTreeRoot(envelope.executionRequests);
75
+ const requestsRoot = ssz.gloas.ExecutionRequests.hashTreeRoot(envelope.executionRequests);
78
76
  if (!byteArrayEquals(requestsRoot, bid.executionRequestsRoot)) {
79
77
  throw new Error(
80
78
  `Execution requests root mismatch envelope=${toRootHex(requestsRoot)} bid=${toRootHex(bid.executionRequestsRoot)}`
@@ -2,7 +2,7 @@ import path from "node:path";
2
2
  import {PrivateKey} from "@libp2p/interface";
3
3
  import {Type} from "@chainsafe/ssz";
4
4
  import {BeaconConfig} from "@lodestar/config";
5
- import {CheckpointWithHex, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
5
+ import {CheckpointWithHex, ForkChoiceStateGetter, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
6
6
  import {LoggerNode} from "@lodestar/logger/node";
7
7
  import {
8
8
  EFFECTIVE_BALANCE_INCREMENT,
@@ -40,7 +40,6 @@ import {
40
40
  ValidatorIndex,
41
41
  Wei,
42
42
  deneb,
43
- electra,
44
43
  gloas,
45
44
  isBlindedBeaconBlock,
46
45
  phase0,
@@ -382,6 +381,14 @@ export class BeaconChain implements IBeaconChain {
382
381
  blockStateCache.setHeadState(anchorState);
383
382
  checkpointStateCache.add(checkpoint, anchorState);
384
383
 
384
+ const forkChoiceStateGetter: ForkChoiceStateGetter = ({stateRoot, checkpoint}) => {
385
+ if (stateRoot) return blockStateCache.get(stateRoot);
386
+
387
+ if (checkpoint) return checkpointStateCache.get({epoch: checkpoint.epoch, rootHex: checkpoint.rootHex});
388
+
389
+ return null;
390
+ };
391
+
385
392
  const forkChoice = initializeForkChoice(
386
393
  config,
387
394
  emitter,
@@ -390,6 +397,7 @@ export class BeaconChain implements IBeaconChain {
390
397
  isAnchorStateFinalized,
391
398
  opts,
392
399
  this.justifiedBalancesGetter.bind(this),
400
+ forkChoiceStateGetter,
393
401
  metrics,
394
402
  logger
395
403
  );
@@ -916,10 +924,10 @@ export class BeaconChain implements IBeaconChain {
916
924
  async getParentExecutionRequests(
917
925
  parentBlockSlot: Slot,
918
926
  parentBlockRootHex: RootHex
919
- ): Promise<electra.ExecutionRequests> {
927
+ ): Promise<gloas.ExecutionRequests> {
920
928
  // at the fork boundary, parent is pre-gloas
921
929
  if (!isForkPostGloas(this.config.getForkName(parentBlockSlot))) {
922
- return ssz.electra.ExecutionRequests.defaultValue();
930
+ return ssz.gloas.ExecutionRequests.defaultValue();
923
931
  }
924
932
  const envelope = await this.getExecutionPayloadEnvelope(parentBlockSlot, parentBlockRootHex);
925
933
  if (envelope === null) {
@@ -3,7 +3,7 @@ import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
4
  import {CheckpointWithHex} from "@lodestar/fork-choice";
5
5
  import {IBeaconStateView} from "@lodestar/state-transition";
6
- import {DataColumnSidecar, RootHex, deneb, phase0} from "@lodestar/types";
6
+ import {DataColumnSidecar, RootHex, Slot, deneb, phase0} from "@lodestar/types";
7
7
  import {PeerIdStr} from "../util/peerId.js";
8
8
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
9
9
  import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
@@ -94,7 +94,8 @@ export type ChainEventData = {
94
94
  peer: PeerIdStr;
95
95
  source: BlockInputSource;
96
96
  };
97
- [ChainEvent.unknownEnvelopeBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
97
+ // slot is the message slot, not necessarily the envelope's slot, but useful as a logging/prune hint
98
+ [ChainEvent.unknownEnvelopeBlockRoot]: {rootHex: RootHex; slot: Slot; peer?: PeerIdStr; source: BlockInputSource};
98
99
  };
99
100
 
100
101
  export type IChainEvents = ApiEvents & {
@@ -61,9 +61,6 @@ export enum BlockErrorCode {
61
61
  TRANSACTIONS_TOO_BIG = "BLOCK_ERROR_TRANSACTIONS_TOO_BIG",
62
62
  /** Execution engine is unavailable, syncing, or api call errored. Peers must not be downscored on this code */
63
63
  EXECUTION_ENGINE_ERROR = "BLOCK_ERROR_EXECUTION_ERROR",
64
- /** The attestation head block is too far behind the attestation slot, causing many skip slots.
65
- This is deemed a DoS risk */
66
- TOO_MANY_SKIPPED_SLOTS = "TOO_MANY_SKIPPED_SLOTS",
67
64
  /** The blobs are unavailable */
68
65
  DATA_UNAVAILABLE = "BLOCK_ERROR_DATA_UNAVAILABLE",
69
66
  /** Block contains too many kzg commitments */
@@ -89,7 +86,6 @@ export type BlockErrorType =
89
86
  | {code: BlockErrorCode.FUTURE_SLOT; blockSlot: Slot; currentSlot: Slot}
90
87
  | {code: BlockErrorCode.STATE_ROOT_MISMATCH}
91
88
  | {code: BlockErrorCode.GENESIS_BLOCK}
92
- | {code: BlockErrorCode.TOO_MANY_SKIPPED_SLOTS; parentSlot: Slot; blockSlot: Slot}
93
89
  | {code: BlockErrorCode.WOULD_REVERT_FINALIZED_SLOT; blockSlot: Slot; finalizedSlot: Slot}
94
90
  | {code: BlockErrorCode.ALREADY_KNOWN; root: RootHex}
95
91
  | {code: BlockErrorCode.REPEAT_PROPOSAL; proposerIndex: ValidatorIndex}
@@ -3,6 +3,7 @@ import {GossipActionError} from "./gossipValidation.js";
3
3
 
4
4
  export enum ExecutionPayloadBidErrorCode {
5
5
  BUILDER_NOT_ELIGIBLE = "EXECUTION_PAYLOAD_BID_ERROR_BUILDER_NOT_ELIGIBLE",
6
+ INVALID_BUILDER_VERSION = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_BUILDER_VERSION",
6
7
  NON_ZERO_EXECUTION_PAYMENT = "EXECUTION_PAYLOAD_BID_ERROR_NON_ZERO_EXECUTION_PAYMENT",
7
8
  BID_ALREADY_KNOWN = "EXECUTION_PAYLOAD_BID_ERROR_BID_ALREADY_KNOWN",
8
9
  BID_TOO_LOW = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_LOW",
@@ -12,6 +13,7 @@ export enum ExecutionPayloadBidErrorCode {
12
13
  UNKNOWN_PARENT_BLOCK_HASH = "EXECUTION_PAYLOAD_BID_ERROR_UNKNOWN_PARENT_BLOCK_HASH",
13
14
  INVALID_SLOT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SLOT",
14
15
  NOT_LATER_THAN_PARENT = "EXECUTION_PAYLOAD_BID_ERROR_NOT_LATER_THAN_PARENT",
16
+ INVALID_PREV_RANDAO = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_PREV_RANDAO",
15
17
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SIGNATURE",
16
18
  NO_MATCHING_PROPOSER_PREFERENCES = "EXECUTION_PAYLOAD_BID_ERROR_NO_MATCHING_PROPOSER_PREFERENCES",
17
19
  PROPOSER_PREFERENCES_FEE_RECIPIENT_MISMATCH = "EXECUTION_PAYLOAD_BID_ERROR_PROPOSER_PREFERENCES_FEE_RECIPIENT_MISMATCH",
@@ -20,6 +22,12 @@ export enum ExecutionPayloadBidErrorCode {
20
22
 
21
23
  export type ExecutionPayloadBidErrorType =
22
24
  | {code: ExecutionPayloadBidErrorCode.BUILDER_NOT_ELIGIBLE; builderIndex: BuilderIndex}
25
+ | {
26
+ code: ExecutionPayloadBidErrorCode.INVALID_BUILDER_VERSION;
27
+ builderIndex: BuilderIndex;
28
+ version: number;
29
+ expectedVersion: number;
30
+ }
23
31
  | {
24
32
  code: ExecutionPayloadBidErrorCode.NON_ZERO_EXECUTION_PAYMENT;
25
33
  builderIndex: BuilderIndex;
@@ -43,6 +51,12 @@ export type ExecutionPayloadBidErrorType =
43
51
  | {code: ExecutionPayloadBidErrorCode.UNKNOWN_PARENT_BLOCK_HASH; parentBlockHash: RootHex}
44
52
  | {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
45
53
  | {code: ExecutionPayloadBidErrorCode.NOT_LATER_THAN_PARENT; parentSlot: Slot; slot: Slot}
54
+ | {
55
+ code: ExecutionPayloadBidErrorCode.INVALID_PREV_RANDAO;
56
+ builderIndex: BuilderIndex;
57
+ bidPrevRandao: string;
58
+ expectedPrevRandao: string;
59
+ }
46
60
  | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot}
47
61
  | {
48
62
  code: ExecutionPayloadBidErrorCode.NO_MATCHING_PROPOSER_PREFERENCES;
@@ -1,7 +1,9 @@
1
+ import {routes} from "@lodestar/api";
1
2
  import {ChainForkConfig} from "@lodestar/config";
2
3
  import {
3
4
  ExecutionStatus,
4
5
  ForkChoice,
6
+ ForkChoiceStateGetter,
5
7
  ForkChoiceStore,
6
8
  JustifiedBalancesGetter,
7
9
  PayloadStatus,
@@ -45,6 +47,7 @@ export function initializeForkChoice(
45
47
  isFinalizedState: boolean,
46
48
  opts: ForkChoiceOpts,
47
49
  justifiedBalancesGetter: JustifiedBalancesGetter,
50
+ stateGetter: ForkChoiceStateGetter,
48
51
  metrics: Metrics | null,
49
52
  logger?: Logger
50
53
  ): ForkChoice {
@@ -56,6 +59,7 @@ export function initializeForkChoice(
56
59
  state,
57
60
  opts,
58
61
  justifiedBalancesGetter,
62
+ stateGetter,
59
63
  metrics,
60
64
  logger
61
65
  )
@@ -66,6 +70,7 @@ export function initializeForkChoice(
66
70
  state,
67
71
  opts,
68
72
  justifiedBalancesGetter,
73
+ stateGetter,
69
74
  metrics,
70
75
  logger
71
76
  );
@@ -81,6 +86,7 @@ export function initializeForkChoiceFromFinalizedState(
81
86
  state: IBeaconStateView,
82
87
  opts: ForkChoiceOpts,
83
88
  justifiedBalancesGetter: JustifiedBalancesGetter,
89
+ stateGetter: ForkChoiceStateGetter,
84
90
  metrics: Metrics | null,
85
91
  logger?: Logger
86
92
  ): ForkChoice {
@@ -112,9 +118,12 @@ export function initializeForkChoiceFromFinalizedState(
112
118
  finalizedCheckpoint,
113
119
  justifiedBalances,
114
120
  justifiedBalancesGetter,
121
+ stateGetter,
115
122
  {
116
123
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
117
124
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
125
+ onFastConfirmation: ({block, slot, currentSlot}) =>
126
+ emitter.emit(routes.events.EventType.fastConfirmation, {block, slot, currentSlot}),
118
127
  }
119
128
  ),
120
129
 
@@ -172,6 +181,7 @@ export function initializeForkChoiceFromUnfinalizedState(
172
181
  unfinalizedState: IBeaconStateView,
173
182
  opts: ForkChoiceOpts,
174
183
  justifiedBalancesGetter: JustifiedBalancesGetter,
184
+ stateGetter: ForkChoiceStateGetter,
175
185
  metrics: Metrics | null,
176
186
  logger?: Logger
177
187
  ): ForkChoice {
@@ -203,9 +213,12 @@ export function initializeForkChoiceFromUnfinalizedState(
203
213
  finalizedCheckpoint,
204
214
  justifiedBalances,
205
215
  justifiedBalancesGetter,
216
+ stateGetter,
206
217
  {
207
218
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
208
219
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
220
+ onFastConfirmation: ({block, slot, currentSlot}) =>
221
+ emitter.emit(routes.events.EventType.fastConfirmation, {block, slot, currentSlot}),
209
222
  }
210
223
  );
211
224
 
@@ -18,7 +18,6 @@ import {
18
18
  altair,
19
19
  capella,
20
20
  deneb,
21
- electra,
22
21
  gloas,
23
22
  phase0,
24
23
  rewards,
@@ -236,7 +235,7 @@ export interface IBeaconChain {
236
235
  blockSlot: Slot,
237
236
  blockRootHex: string
238
237
  ): Promise<gloas.SignedExecutionPayloadEnvelope | null>;
239
- getParentExecutionRequests(parentBlockSlot: Slot, parentBlockRootHex: RootHex): Promise<electra.ExecutionRequests>;
238
+ getParentExecutionRequests(parentBlockSlot: Slot, parentBlockRootHex: RootHex): Promise<gloas.ExecutionRequests>;
240
239
 
241
240
  produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody>;
242
241
  produceBlock(blockAttributes: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}): Promise<{
@@ -105,6 +105,7 @@ export const defaultChainOptions: IChainOptions = {
105
105
  proposerBoost: true,
106
106
  proposerBoostReorg: true,
107
107
  computeUnrealized: true,
108
+ fastConfirmation: false,
108
109
  suggestedFeeRecipient: defaultValidatorOptions.suggestedFeeRecipient,
109
110
  serveHistoricalState: false,
110
111
  assertCorrectProgressiveBalances: false,
@@ -108,7 +108,7 @@ export type ProduceFullGloas = {
108
108
  type: BlockType.Full;
109
109
  fork: ForkPostGloas;
110
110
  executionPayload: ExecutionPayload<ForkPostGloas>;
111
- executionRequests: electra.ExecutionRequests;
111
+ executionRequests: gloas.ExecutionRequests;
112
112
  blobsBundle: BlobsBundle<ForkPostGloas>;
113
113
  cells: fulu.Cell[][];
114
114
  parentBlockRoot: Root;
@@ -228,7 +228,7 @@ export async function produceBlockBody<T extends BlockType>(
228
228
  );
229
229
  const parentExecutionRequests = isExtendingPayload
230
230
  ? await this.getParentExecutionRequests(parentBlock.slot, parentBlock.blockRoot)
231
- : ssz.electra.ExecutionRequests.defaultValue();
231
+ : ssz.gloas.ExecutionRequests.defaultValue();
232
232
  executionPayloadValue = BigInt(builderBid.message.value) * GWEI_TO_WEI;
233
233
 
234
234
  const commonBlockBody = await commonBlockBodyPromise;
@@ -272,7 +272,7 @@ export async function produceBlockBody<T extends BlockType>(
272
272
 
273
273
  // Get execution payload from EL
274
274
  let parentBlockHash: Bytes32;
275
- let parentExecutionRequests: electra.ExecutionRequests;
275
+ let parentExecutionRequests: gloas.ExecutionRequests;
276
276
  // Apply parent payload once here as it's reused by EL prep and voluntary exit filtering below
277
277
  let stateAfterParentPayload: IBeaconStateViewBellatrix = currentState;
278
278
  // Spec: should_build_on_full(store, head). `parentBlock` is the proposer's head
@@ -285,7 +285,7 @@ export async function produceBlockBody<T extends BlockType>(
285
285
  stateAfterParentPayload = currentState.withParentPayloadApplied(parentExecutionRequests);
286
286
  } else {
287
287
  parentBlockHash = currentState.latestExecutionPayloadBid.parentBlockHash;
288
- parentExecutionRequests = ssz.electra.ExecutionRequests.defaultValue();
288
+ parentExecutionRequests = ssz.gloas.ExecutionRequests.defaultValue();
289
289
  }
290
290
  const prepareRes = await prepareExecutionPayload(
291
291
  this,
@@ -344,13 +344,13 @@ export async function produceBlockBody<T extends BlockType>(
344
344
  blockHash: executionPayload.blockHash,
345
345
  prevRandao: currentState.getRandaoMix(currentState.epoch),
346
346
  feeRecipient: executionPayload.feeRecipient,
347
- gasLimit: BigInt(executionPayload.gasLimit),
347
+ gasLimit: executionPayload.gasLimit,
348
348
  builderIndex: BUILDER_INDEX_SELF_BUILD,
349
349
  slot: blockSlot,
350
350
  value: 0,
351
351
  executionPayment: 0,
352
352
  blobKzgCommitments: blobsBundle.commitments,
353
- executionRequestsRoot: ssz.electra.ExecutionRequests.hashTreeRoot(executionRequests),
353
+ executionRequestsRoot: ssz.gloas.ExecutionRequests.hashTreeRoot(executionRequests as gloas.ExecutionRequests),
354
354
  };
355
355
  const signedBid: gloas.SignedExecutionPayloadBid = {
356
356
  message: bid,
@@ -375,7 +375,7 @@ export async function produceBlockBody<T extends BlockType>(
375
375
  // Store execution payload data required to construct execution payload envelope later
376
376
  const gloasResult = produceResult as ProduceFullGloas;
377
377
  gloasResult.executionPayload = executionPayload as ExecutionPayload<ForkPostGloas>;
378
- gloasResult.executionRequests = executionRequests;
378
+ gloasResult.executionRequests = executionRequests as gloas.ExecutionRequests;
379
379
  gloasResult.blobsBundle = blobsBundle;
380
380
  gloasResult.cells = cells;
381
381
  gloasResult.parentBlockRoot = fromHex(parentBlock.blockRoot);
@@ -47,7 +47,6 @@ export interface IStateRegenerator extends IStateRegeneratorInternal {
47
47
  getCheckpointStateSync(cp: CheckpointHex): IBeaconStateView | null;
48
48
  getClosestHeadState(head: ProtoBlock): IBeaconStateView | null;
49
49
  pruneOnCheckpoint(finalizedEpoch: Epoch, justifiedEpoch: Epoch, headStateRoot: RootHex): void;
50
- pruneOnFinalized(finalizedEpoch: Epoch): void;
51
50
  processState(blockRootHex: RootHex, postState: IBeaconStateView): void;
52
51
  addCheckpointState(cp: phase0.Checkpoint, item: IBeaconStateView): void;
53
52
  updateHeadState(newHead: ProtoBlock, maybeHeadState: IBeaconStateView): void;
@@ -143,11 +143,6 @@ export class QueuedStateRegenerator implements IStateRegenerator {
143
143
  this.blockStateCache.prune(headStateRoot);
144
144
  }
145
145
 
146
- pruneOnFinalized(finalizedEpoch: number): void {
147
- this.checkpointStateCache.pruneFinalized(finalizedEpoch);
148
- this.blockStateCache.deleteAllBeforeEpoch(finalizedEpoch);
149
- }
150
-
151
146
  processState(blockRootHex: RootHex, postState: IBeaconStateView): void {
152
147
  this.blockStateCache.add(postState);
153
148
  this.checkpointStateCache.processState(blockRootHex, postState).catch((e) => {
@@ -167,12 +167,6 @@ export class FIFOBlockStateCache implements BlockStateCache {
167
167
  }
168
168
  }
169
169
 
170
- /**
171
- * No need for this implementation
172
- * This is only to conform to the old api
173
- */
174
- deleteAllBeforeEpoch(): void {}
175
-
176
170
  /**
177
171
  * ONLY FOR DEBUGGING PURPOSES. For lodestar debug API.
178
172
  */