@lodestar/beacon-node 1.43.0-dev.7622a1076c → 1.43.0-dev.7733cd3832

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 (199) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +6 -5
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/lodestar/index.js +1 -1
  5. package/lib/api/impl/lodestar/index.js.map +1 -1
  6. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  7. package/lib/chain/blocks/importBlock.js +6 -3
  8. package/lib/chain/blocks/importBlock.js.map +1 -1
  9. package/lib/chain/blocks/importExecutionPayload.d.ts +19 -8
  10. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  11. package/lib/chain/blocks/importExecutionPayload.js +31 -20
  12. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  13. package/lib/chain/blocks/index.d.ts +5 -3
  14. package/lib/chain/blocks/index.d.ts.map +1 -1
  15. package/lib/chain/blocks/index.js +28 -9
  16. package/lib/chain/blocks/index.js.map +1 -1
  17. package/lib/chain/blocks/payloadEnvelopeProcessor.js +2 -2
  18. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  19. package/lib/chain/blocks/types.d.ts +2 -2
  20. package/lib/chain/blocks/types.d.ts.map +1 -1
  21. package/lib/chain/blocks/utils/chainSegment.d.ts +23 -2
  22. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  23. package/lib/chain/blocks/utils/chainSegment.js +81 -12
  24. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  25. package/lib/chain/blocks/verifyBlock.d.ts +3 -2
  26. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  27. package/lib/chain/blocks/verifyBlock.js +30 -5
  28. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  29. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  30. package/lib/chain/blocks/verifyBlocksSanityChecks.js +15 -4
  31. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  32. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +2 -2
  33. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  34. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  35. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +1 -10
  36. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  37. package/lib/chain/chain.d.ts +5 -3
  38. package/lib/chain/chain.d.ts.map +1 -1
  39. package/lib/chain/chain.js +17 -4
  40. package/lib/chain/chain.js.map +1 -1
  41. package/lib/chain/errors/blockError.d.ts +8 -1
  42. package/lib/chain/errors/blockError.d.ts.map +1 -1
  43. package/lib/chain/errors/blockError.js +2 -0
  44. package/lib/chain/errors/blockError.js.map +1 -1
  45. package/lib/chain/errors/index.d.ts +1 -0
  46. package/lib/chain/errors/index.d.ts.map +1 -1
  47. package/lib/chain/errors/index.js +1 -0
  48. package/lib/chain/errors/index.js.map +1 -1
  49. package/lib/chain/errors/proposerPreferences.d.ts +33 -0
  50. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  51. package/lib/chain/errors/proposerPreferences.js +13 -0
  52. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  53. package/lib/chain/interface.d.ts +5 -3
  54. package/lib/chain/interface.d.ts.map +1 -1
  55. package/lib/chain/interface.js.map +1 -1
  56. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  57. package/lib/chain/prepareNextSlot.js +30 -10
  58. package/lib/chain/prepareNextSlot.js.map +1 -1
  59. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  60. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  61. package/lib/chain/produceBlock/produceBlockBody.js +34 -14
  62. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  63. package/lib/chain/regen/interface.d.ts +1 -0
  64. package/lib/chain/regen/interface.d.ts.map +1 -1
  65. package/lib/chain/regen/interface.js +1 -0
  66. package/lib/chain/regen/interface.js.map +1 -1
  67. package/lib/chain/seenCache/index.d.ts +1 -0
  68. package/lib/chain/seenCache/index.d.ts.map +1 -1
  69. package/lib/chain/seenCache/index.js +1 -0
  70. package/lib/chain/seenCache/index.js.map +1 -1
  71. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +11 -4
  72. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  73. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +20 -18
  74. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  75. package/lib/chain/seenCache/seenProposerPreferences.d.ts +15 -0
  76. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  77. package/lib/chain/seenCache/seenProposerPreferences.js +25 -0
  78. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  79. package/lib/chain/validation/block.d.ts.map +1 -1
  80. package/lib/chain/validation/block.js +1 -0
  81. package/lib/chain/validation/block.js.map +1 -1
  82. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  83. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  84. package/lib/chain/validation/proposerPreferences.js +69 -0
  85. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  86. package/lib/metrics/metrics/lodestar.d.ts +1 -0
  87. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  88. package/lib/metrics/metrics/lodestar.js +4 -0
  89. package/lib/metrics/metrics/lodestar.js.map +1 -1
  90. package/lib/network/gossip/interface.d.ts +7 -1
  91. package/lib/network/gossip/interface.d.ts.map +1 -1
  92. package/lib/network/gossip/interface.js +1 -0
  93. package/lib/network/gossip/interface.js.map +1 -1
  94. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  95. package/lib/network/gossip/scoringParameters.js +12 -1
  96. package/lib/network/gossip/scoringParameters.js.map +1 -1
  97. package/lib/network/gossip/topic.d.ts +8 -0
  98. package/lib/network/gossip/topic.d.ts.map +1 -1
  99. package/lib/network/gossip/topic.js +6 -0
  100. package/lib/network/gossip/topic.js.map +1 -1
  101. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  102. package/lib/network/processor/gossipHandlers.js +10 -6
  103. package/lib/network/processor/gossipHandlers.js.map +1 -1
  104. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  105. package/lib/network/processor/gossipQueues/index.js +5 -0
  106. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  107. package/lib/network/processor/index.d.ts.map +1 -1
  108. package/lib/network/processor/index.js +1 -0
  109. package/lib/network/processor/index.js.map +1 -1
  110. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  111. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  112. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  113. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  114. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  115. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  116. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  117. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  118. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  119. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  120. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  121. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  122. package/lib/node/notifier.js +7 -1
  123. package/lib/node/notifier.js.map +1 -1
  124. package/lib/sync/range/batch.d.ts +12 -2
  125. package/lib/sync/range/batch.d.ts.map +1 -1
  126. package/lib/sync/range/batch.js +56 -30
  127. package/lib/sync/range/batch.js.map +1 -1
  128. package/lib/sync/range/chain.d.ts +6 -2
  129. package/lib/sync/range/chain.d.ts.map +1 -1
  130. package/lib/sync/range/chain.js +4 -3
  131. package/lib/sync/range/chain.js.map +1 -1
  132. package/lib/sync/range/range.d.ts.map +1 -1
  133. package/lib/sync/range/range.js +17 -6
  134. package/lib/sync/range/range.js.map +1 -1
  135. package/lib/sync/types.d.ts +34 -0
  136. package/lib/sync/types.d.ts.map +1 -1
  137. package/lib/sync/types.js +34 -0
  138. package/lib/sync/types.js.map +1 -1
  139. package/lib/sync/unknownBlock.d.ts +24 -1
  140. package/lib/sync/unknownBlock.d.ts.map +1 -1
  141. package/lib/sync/unknownBlock.js +649 -53
  142. package/lib/sync/unknownBlock.js.map +1 -1
  143. package/lib/sync/utils/downloadByRange.d.ts +46 -10
  144. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  145. package/lib/sync/utils/downloadByRange.js +147 -24
  146. package/lib/sync/utils/downloadByRange.js.map +1 -1
  147. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  148. package/lib/sync/utils/downloadByRoot.js +6 -2
  149. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  150. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  151. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  152. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  153. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  154. package/package.json +16 -15
  155. package/src/api/impl/beacon/blocks/index.ts +8 -5
  156. package/src/api/impl/lodestar/index.ts +1 -1
  157. package/src/chain/blocks/importBlock.ts +4 -2
  158. package/src/chain/blocks/importExecutionPayload.ts +36 -21
  159. package/src/chain/blocks/index.ts +44 -12
  160. package/src/chain/blocks/payloadEnvelopeProcessor.ts +2 -2
  161. package/src/chain/blocks/types.ts +2 -2
  162. package/src/chain/blocks/utils/chainSegment.ts +106 -17
  163. package/src/chain/blocks/verifyBlock.ts +35 -6
  164. package/src/chain/blocks/verifyBlocksSanityChecks.ts +16 -7
  165. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +2 -2
  166. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +8 -17
  167. package/src/chain/chain.ts +26 -3
  168. package/src/chain/errors/blockError.ts +4 -1
  169. package/src/chain/errors/index.ts +1 -0
  170. package/src/chain/errors/proposerPreferences.ts +39 -0
  171. package/src/chain/interface.ts +9 -1
  172. package/src/chain/prepareNextSlot.ts +42 -12
  173. package/src/chain/produceBlock/produceBlockBody.ts +37 -12
  174. package/src/chain/regen/interface.ts +1 -0
  175. package/src/chain/seenCache/index.ts +1 -0
  176. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +22 -20
  177. package/src/chain/seenCache/seenProposerPreferences.ts +29 -0
  178. package/src/chain/validation/block.ts +1 -0
  179. package/src/chain/validation/proposerPreferences.ts +91 -0
  180. package/src/metrics/metrics/lodestar.ts +4 -0
  181. package/src/network/gossip/interface.ts +6 -0
  182. package/src/network/gossip/scoringParameters.ts +14 -1
  183. package/src/network/gossip/topic.ts +6 -0
  184. package/src/network/processor/gossipHandlers.ts +15 -6
  185. package/src/network/processor/gossipQueues/index.ts +5 -0
  186. package/src/network/processor/index.ts +1 -0
  187. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  188. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  189. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  190. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  191. package/src/node/notifier.ts +8 -1
  192. package/src/sync/range/batch.ts +90 -35
  193. package/src/sync/range/chain.ts +13 -5
  194. package/src/sync/range/range.ts +18 -6
  195. package/src/sync/types.ts +72 -0
  196. package/src/sync/unknownBlock.ts +810 -57
  197. package/src/sync/utils/downloadByRange.ts +256 -39
  198. package/src/sync/utils/downloadByRoot.ts +12 -2
  199. package/src/sync/utils/pendingBlocksTree.ts +0 -15
@@ -4,6 +4,7 @@ import {ErrorAborted, LodestarError, Logger, toRootHex} from "@lodestar/utils";
4
4
  import {isBlockInputBlobs, isBlockInputColumns} from "../../chain/blocks/blockInput/blockInput.js";
5
5
  import {BlockInputErrorCode} from "../../chain/blocks/blockInput/errors.js";
6
6
  import {IBlockInput} from "../../chain/blocks/blockInput/types.js";
7
+ import {PayloadEnvelopeInput} from "../../chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
7
8
  import {BlobSidecarErrorCode} from "../../chain/errors/blobSidecarError.js";
8
9
  import {DataColumnSidecarErrorCode} from "../../chain/errors/dataColumnSidecarError.js";
9
10
  import {Metrics} from "../../metrics/metrics.js";
@@ -44,13 +45,19 @@ export type SyncChainFns = {
44
45
  * Must return if ALL blocks are processed successfully
45
46
  * If SOME blocks are processed must throw BlockProcessorError()
46
47
  */
47
- processChainSegment: (blocks: IBlockInput[], syncType: RangeSyncType) => Promise<void>;
48
+ processChainSegment: (
49
+ blocks: IBlockInput[],
50
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
51
+ syncType: RangeSyncType
52
+ ) => Promise<void>;
48
53
  /** Must download blocks, and validate their range */
49
54
  downloadByRange: (
50
55
  peer: PeerSyncMeta,
51
56
  batch: Batch,
52
57
  syncType: RangeSyncType
53
- ) => Promise<WarnResult<IBlockInput[], DownloadByRangeError>>;
58
+ ) => Promise<
59
+ WarnResult<{blocks: IBlockInput[]; payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null}, DownloadByRangeError>
60
+ >;
54
61
  /** Report peer for negative actions. Decouples from the full network instance */
55
62
  reportPeer: (peer: PeerIdStr, action: PeerAction, actionName: string) => void;
56
63
  /** Gets current peer custodyColumns and earliestAvailableSlot */
@@ -516,7 +523,8 @@ export class SyncChain {
516
523
  });
517
524
  this.metrics?.syncRange.downloadByRange.success.inc();
518
525
  const {warnings, result} = res.result;
519
- const downloadSuccessOutput = batch.downloadingSuccess(peer.peerId, result);
526
+ const {blocks: downloadedBlocks, payloadEnvelopes} = result;
527
+ const downloadSuccessOutput = batch.downloadingSuccess(peer.peerId, downloadedBlocks, payloadEnvelopes);
520
528
  const logMeta: Record<string, number> = {
521
529
  blockCount: downloadSuccessOutput.blocks.length,
522
530
  };
@@ -578,10 +586,10 @@ export class SyncChain {
578
586
  * Sends `batch` to the processor. Note: batch may be empty
579
587
  */
580
588
  private async processBatch(batch: Batch): Promise<void> {
581
- const blocks = batch.startProcessing();
589
+ const {blocks, payloadEnvelopes} = batch.startProcessing();
582
590
 
583
591
  // wrapError ensures to never call both batch success() and batch error()
584
- const res = await wrapError(this.processChainSegment(blocks, this.syncType));
592
+ const res = await wrapError(this.processChainSegment(blocks, payloadEnvelopes, this.syncType));
585
593
 
586
594
  if (!res.err) {
587
595
  batch.processingSuccess();
@@ -172,7 +172,7 @@ export class RangeSync extends (EventEmitter as {new (): RangeSyncEmitter}) {
172
172
  }
173
173
 
174
174
  /** Convenience method for `SyncChain` */
175
- private processChainSegment: SyncChainFns["processChainSegment"] = async (blocks, syncType) => {
175
+ private processChainSegment: SyncChainFns["processChainSegment"] = async (blocks, payloadEnvelopes, syncType) => {
176
176
  // Not trusted, verify signatures
177
177
  const flags: ImportBlockOpts = {
178
178
  // Only skip importing attestations for finalized sync. For head sync attestation are valuable.
@@ -192,9 +192,15 @@ export class RangeSync extends (EventEmitter as {new (): RangeSyncEmitter}) {
192
192
 
193
193
  if (this.opts?.disableProcessAsChainSegment) {
194
194
  // Should only be used for debugging or testing
195
- for (const block of blocks) await this.chain.processBlock(block, flags);
195
+ for (const block of blocks) {
196
+ await this.chain.processBlock(block, flags);
197
+ const payloadEnvelope = payloadEnvelopes?.get(block.slot);
198
+ if (payloadEnvelope) {
199
+ await this.chain.processExecutionPayload(payloadEnvelope);
200
+ }
201
+ }
196
202
  } else {
197
- await this.chain.processChainSegment(blocks, flags);
203
+ await this.chain.processChainSegment(blocks, payloadEnvelopes, flags);
198
204
  }
199
205
  };
200
206
 
@@ -209,13 +215,19 @@ export class RangeSync extends (EventEmitter as {new (): RangeSyncEmitter}) {
209
215
  peerDasMetrics: this.chain.metrics?.peerDas,
210
216
  ...batch.getRequestsForPeer(peer),
211
217
  });
212
- const cached = cacheByRangeResponses({
218
+ const {responses, payloadEnvelopes: downloadedPayloadEnvelopes} = result;
219
+ const {blocks, payloadEnvelopes} = cacheByRangeResponses({
213
220
  cache: this.chain.seenBlockInputCache,
221
+ seenPayloadEnvelopeInputCache: this.chain.seenPayloadEnvelopeInputCache,
214
222
  peerIdStr: peer.peerId,
215
- responses: result,
223
+ responses,
216
224
  batchBlocks,
225
+ downloadedPayloadEnvelopes,
226
+ existingPayloadEnvelopes: batch.getPayloadEnvelopes(),
227
+ custodyConfig: this.chain.custodyConfig,
228
+ seenTimestampSec: Date.now() / 1000,
217
229
  });
218
- return {result: cached, warnings};
230
+ return {result: {blocks, payloadEnvelopes}, warnings};
219
231
  };
220
232
 
221
233
  private pruneBlockInputs: SyncChainFns["pruneBlockInputs"] = (blocks: IBlockInput[]) => {
package/src/sync/types.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  import {RootHex, Slot} from "@lodestar/types";
2
+ import {SignedExecutionPayloadEnvelope} from "@lodestar/types/gloas";
3
+ import {toRootHex} from "@lodestar/utils";
2
4
  import {IBlockInput} from "../chain/blocks/blockInput/index.js";
5
+ import {PayloadEnvelopeInput} from "../chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
3
6
 
4
7
  export enum PendingBlockType {
5
8
  /**
@@ -26,6 +29,14 @@ export enum PendingBlockInputStatus {
26
29
  processing = "processing",
27
30
  }
28
31
 
32
+ export enum PendingPayloadInputStatus {
33
+ pending = "pending",
34
+ fetching = "fetching",
35
+ waitingForBlock = "waiting_for_block",
36
+ downloaded = "downloaded",
37
+ processing = "processing",
38
+ }
39
+
29
40
  export type PendingBlockInput = {
30
41
  status: PendingBlockInputStatus;
31
42
  blockInput: IBlockInput;
@@ -44,10 +55,47 @@ export type PendingRootHex = {
44
55
 
45
56
  export type BlockInputSyncCacheItem = PendingBlockInput | PendingRootHex;
46
57
 
58
+ export type PendingPayloadInput = {
59
+ status:
60
+ | PendingPayloadInputStatus.pending
61
+ | PendingPayloadInputStatus.fetching
62
+ | PendingPayloadInputStatus.downloaded
63
+ | PendingPayloadInputStatus.processing;
64
+ payloadInput: PayloadEnvelopeInput;
65
+ timeAddedSec: number;
66
+ timeSyncedSec?: number;
67
+ peerIdStrings: Set<string>;
68
+ };
69
+
70
+ export type PendingPayloadRootHex = {
71
+ status: PendingPayloadInputStatus.pending | PendingPayloadInputStatus.fetching;
72
+ rootHex: RootHex;
73
+ timeAddedSec: number;
74
+ timeSyncedSec?: number;
75
+ peerIdStrings: Set<string>;
76
+ };
77
+
78
+ export type PendingPayloadEnvelope = {
79
+ status: PendingPayloadInputStatus.waitingForBlock;
80
+ envelope: SignedExecutionPayloadEnvelope;
81
+ timeAddedSec: number;
82
+ peerIdStrings: Set<string>;
83
+ };
84
+
85
+ export type PayloadSyncCacheItem = PendingPayloadInput | PendingPayloadRootHex | PendingPayloadEnvelope;
86
+
47
87
  export function isPendingBlockInput(pending: BlockInputSyncCacheItem): pending is PendingBlockInput {
48
88
  return "blockInput" in pending;
49
89
  }
50
90
 
91
+ export function isPendingPayloadInput(pending: PayloadSyncCacheItem): pending is PendingPayloadInput {
92
+ return "payloadInput" in pending;
93
+ }
94
+
95
+ export function isPendingPayloadEnvelope(pending: PayloadSyncCacheItem): pending is PendingPayloadEnvelope {
96
+ return "envelope" in pending;
97
+ }
98
+
51
99
  export function getBlockInputSyncCacheItemRootHex(block: BlockInputSyncCacheItem): RootHex {
52
100
  return isPendingBlockInput(block) ? block.blockInput.blockRootHex : block.rootHex;
53
101
  }
@@ -55,3 +103,27 @@ export function getBlockInputSyncCacheItemRootHex(block: BlockInputSyncCacheItem
55
103
  export function getBlockInputSyncCacheItemSlot(block: BlockInputSyncCacheItem): Slot | string {
56
104
  return isPendingBlockInput(block) ? block.blockInput.slot : "unknown";
57
105
  }
106
+
107
+ export function getPayloadSyncCacheItemRootHex(payload: PayloadSyncCacheItem): RootHex {
108
+ if (isPendingPayloadInput(payload)) {
109
+ return payload.payloadInput.blockRootHex;
110
+ }
111
+
112
+ if (isPendingPayloadEnvelope(payload)) {
113
+ return toRootHex(payload.envelope.message.beaconBlockRoot);
114
+ }
115
+
116
+ return payload.rootHex;
117
+ }
118
+
119
+ export function getPayloadSyncCacheItemSlot(payload: PayloadSyncCacheItem): Slot | string {
120
+ if (isPendingPayloadInput(payload)) {
121
+ return payload.payloadInput.slot;
122
+ }
123
+
124
+ if (isPendingPayloadEnvelope(payload)) {
125
+ return payload.envelope.message.payload.slotNumber;
126
+ }
127
+
128
+ return "unknown";
129
+ }