@lodestar/beacon-node 1.35.0-dev.e9dd48f165 → 1.35.0-dev.f45a2be721

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 (1374) hide show
  1. package/lib/api/impl/api.d.ts.map +1 -0
  2. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -0
  3. package/lib/api/impl/beacon/blocks/index.js +65 -47
  4. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  5. package/lib/api/impl/beacon/blocks/utils.d.ts.map +1 -0
  6. package/lib/api/impl/beacon/index.d.ts.map +1 -0
  7. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -0
  8. package/lib/api/impl/beacon/rewards/index.d.ts.map +1 -0
  9. package/lib/api/impl/beacon/state/index.d.ts.map +1 -0
  10. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -0
  11. package/lib/api/impl/config/constants.d.ts +13 -8
  12. package/lib/api/impl/config/constants.d.ts.map +1 -0
  13. package/lib/api/impl/config/constants.js +21 -9
  14. package/lib/api/impl/config/constants.js.map +1 -1
  15. package/lib/api/impl/config/index.d.ts.map +1 -0
  16. package/lib/api/impl/debug/index.d.ts.map +1 -0
  17. package/lib/api/impl/debug/index.js +1 -1
  18. package/lib/api/impl/debug/index.js.map +1 -1
  19. package/lib/api/impl/errors.d.ts.map +1 -0
  20. package/lib/api/impl/errors.js +2 -0
  21. package/lib/api/impl/errors.js.map +1 -1
  22. package/lib/api/impl/events/index.d.ts.map +1 -0
  23. package/lib/api/impl/index.d.ts +3 -3
  24. package/lib/api/impl/index.d.ts.map +1 -0
  25. package/lib/api/impl/index.js +3 -3
  26. package/lib/api/impl/index.js.map +1 -1
  27. package/lib/api/impl/lightclient/index.d.ts.map +1 -0
  28. package/lib/api/impl/lodestar/index.d.ts.map +1 -0
  29. package/lib/api/impl/lodestar/index.js +2 -2
  30. package/lib/api/impl/lodestar/index.js.map +1 -1
  31. package/lib/api/impl/node/index.d.ts.map +1 -0
  32. package/lib/api/impl/node/utils.d.ts.map +1 -0
  33. package/lib/api/impl/proof/index.d.ts.map +1 -0
  34. package/lib/api/impl/types.d.ts.map +1 -0
  35. package/lib/api/impl/utils.d.ts.map +1 -0
  36. package/lib/api/impl/validator/index.d.ts.map +1 -0
  37. package/lib/api/impl/validator/index.js +26 -34
  38. package/lib/api/impl/validator/index.js.map +1 -1
  39. package/lib/api/impl/validator/utils.d.ts.map +1 -0
  40. package/lib/api/index.d.ts.map +1 -0
  41. package/lib/api/options.d.ts.map +1 -0
  42. package/lib/api/rest/activeSockets.d.ts.map +1 -0
  43. package/lib/api/rest/activeSockets.js +3 -2
  44. package/lib/api/rest/activeSockets.js.map +1 -1
  45. package/lib/api/rest/base.d.ts +1 -1
  46. package/lib/api/rest/base.d.ts.map +1 -0
  47. package/lib/api/rest/base.js +6 -2
  48. package/lib/api/rest/base.js.map +1 -1
  49. package/lib/api/rest/index.d.ts.map +1 -0
  50. package/lib/api/rest/index.js +2 -0
  51. package/lib/api/rest/index.js.map +1 -1
  52. package/lib/api/rest/swaggerUI.d.ts.map +1 -0
  53. package/lib/api/rest/swaggerUI.js +4 -2
  54. package/lib/api/rest/swaggerUI.js.map +1 -1
  55. package/lib/bun-wrappers/prometheus-gc-stats.d.ts +2 -0
  56. package/lib/bun-wrappers/prometheus-gc-stats.d.ts.map +1 -0
  57. package/lib/bun-wrappers/prometheus-gc-stats.js +8 -0
  58. package/lib/bun-wrappers/prometheus-gc-stats.js.map +1 -0
  59. package/lib/chain/ColumnReconstructionTracker.d.ts +32 -0
  60. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -0
  61. package/lib/chain/ColumnReconstructionTracker.js +71 -0
  62. package/lib/chain/ColumnReconstructionTracker.js.map +1 -0
  63. package/lib/chain/GetBlobsTracker.d.ts +31 -0
  64. package/lib/chain/GetBlobsTracker.d.ts.map +1 -0
  65. package/lib/chain/GetBlobsTracker.js +82 -0
  66. package/lib/chain/GetBlobsTracker.js.map +1 -0
  67. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -0
  68. package/lib/chain/archiveStore/archiveStore.js +49 -38
  69. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  70. package/lib/chain/archiveStore/constants.d.ts.map +1 -0
  71. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -0
  72. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -0
  73. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +3 -0
  74. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  75. package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -0
  76. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -0
  77. package/lib/chain/archiveStore/historicalState/worker.d.ts.map +1 -0
  78. package/lib/chain/archiveStore/historicalState/worker.js +1 -1
  79. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  80. package/lib/chain/archiveStore/index.d.ts +1 -1
  81. package/lib/chain/archiveStore/index.d.ts.map +1 -0
  82. package/lib/chain/archiveStore/index.js +1 -1
  83. package/lib/chain/archiveStore/interface.d.ts.map +1 -0
  84. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -0
  85. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js +5 -0
  86. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  87. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -0
  88. package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -0
  89. package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +1 -0
  90. package/lib/chain/balancesCache.d.ts.map +1 -0
  91. package/lib/chain/balancesCache.js +1 -3
  92. package/lib/chain/balancesCache.js.map +1 -1
  93. package/lib/chain/beaconProposerCache.d.ts.map +1 -0
  94. package/lib/chain/beaconProposerCache.js +1 -0
  95. package/lib/chain/beaconProposerCache.js.map +1 -1
  96. package/lib/chain/blocks/blockInput/blockInput.d.ts +19 -7
  97. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -0
  98. package/lib/chain/blocks/blockInput/blockInput.js +135 -90
  99. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  100. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -0
  101. package/lib/chain/blocks/blockInput/index.d.ts +1 -1
  102. package/lib/chain/blocks/blockInput/index.d.ts.map +1 -0
  103. package/lib/chain/blocks/blockInput/index.js +1 -1
  104. package/lib/chain/blocks/blockInput/types.d.ts +19 -10
  105. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -0
  106. package/lib/chain/blocks/blockInput/types.js +1 -0
  107. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  108. package/lib/chain/blocks/blockInput/utils.d.ts +0 -4
  109. package/lib/chain/blocks/blockInput/utils.d.ts.map +1 -0
  110. package/lib/chain/blocks/blockInput/utils.js +6 -29
  111. package/lib/chain/blocks/blockInput/utils.js.map +1 -1
  112. package/lib/chain/blocks/importBlock.d.ts.map +1 -0
  113. package/lib/chain/blocks/importBlock.js +22 -17
  114. package/lib/chain/blocks/importBlock.js.map +1 -1
  115. package/lib/chain/blocks/index.d.ts +6 -5
  116. package/lib/chain/blocks/index.d.ts.map +1 -0
  117. package/lib/chain/blocks/index.js +5 -4
  118. package/lib/chain/blocks/index.js.map +1 -1
  119. package/lib/chain/blocks/types.d.ts +3 -106
  120. package/lib/chain/blocks/types.d.ts.map +1 -0
  121. package/lib/chain/blocks/types.js +0 -119
  122. package/lib/chain/blocks/types.js.map +1 -1
  123. package/lib/chain/blocks/utils/blowfishBanner.d.ts.map +1 -0
  124. package/lib/chain/blocks/utils/chainSegment.d.ts +2 -2
  125. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -0
  126. package/lib/chain/blocks/utils/chainSegment.js +2 -2
  127. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  128. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -0
  129. package/lib/chain/blocks/utils/giraffeBanner.d.ts.map +1 -0
  130. package/lib/chain/blocks/utils/ownBanner.d.ts.map +1 -0
  131. package/lib/chain/blocks/utils/pandaMergeTransitionBanner.d.ts.map +1 -0
  132. package/lib/chain/blocks/utils/zebraBanner.d.ts.map +1 -0
  133. package/lib/chain/blocks/verifyBlock.d.ts +3 -3
  134. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -0
  135. package/lib/chain/blocks/verifyBlock.js +15 -14
  136. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  137. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts +7 -22
  138. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -0
  139. package/lib/chain/blocks/verifyBlocksDataAvailability.js +23 -108
  140. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  141. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +4 -3
  142. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -0
  143. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +24 -22
  144. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  145. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +4 -3
  146. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -0
  147. package/lib/chain/blocks/verifyBlocksSanityChecks.js +2 -2
  148. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  149. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -0
  150. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -2
  151. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -0
  152. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +2 -2
  153. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  154. package/lib/chain/blocks/writeBlockInputToDb.d.ts +3 -3
  155. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -0
  156. package/lib/chain/blocks/writeBlockInputToDb.js +56 -67
  157. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  158. package/lib/chain/bls/index.d.ts.map +1 -0
  159. package/lib/chain/bls/interface.d.ts.map +1 -0
  160. package/lib/chain/bls/maybeBatch.d.ts.map +1 -0
  161. package/lib/chain/bls/multithread/index.d.ts.map +1 -0
  162. package/lib/chain/bls/multithread/index.js +168 -163
  163. package/lib/chain/bls/multithread/index.js.map +1 -1
  164. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -0
  165. package/lib/chain/bls/multithread/poolSize.d.ts.map +1 -0
  166. package/lib/chain/bls/multithread/types.d.ts.map +1 -0
  167. package/lib/chain/bls/multithread/utils.d.ts.map +1 -0
  168. package/lib/chain/bls/multithread/worker.d.ts.map +1 -0
  169. package/lib/chain/bls/singleThread.d.ts.map +1 -0
  170. package/lib/chain/bls/singleThread.js +1 -0
  171. package/lib/chain/bls/singleThread.js.map +1 -1
  172. package/lib/chain/bls/utils.d.ts.map +1 -0
  173. package/lib/chain/chain.d.ts +14 -12
  174. package/lib/chain/chain.d.ts.map +1 -0
  175. package/lib/chain/chain.js +83 -26
  176. package/lib/chain/chain.js.map +1 -1
  177. package/lib/chain/emitter.d.ts +43 -2
  178. package/lib/chain/emitter.d.ts.map +1 -0
  179. package/lib/chain/emitter.js +18 -0
  180. package/lib/chain/emitter.js.map +1 -1
  181. package/lib/chain/errors/attestationError.d.ts.map +1 -0
  182. package/lib/chain/errors/attesterSlashingError.d.ts.map +1 -0
  183. package/lib/chain/errors/blobSidecarError.d.ts +24 -0
  184. package/lib/chain/errors/blobSidecarError.d.ts.map +1 -0
  185. package/lib/chain/errors/blobSidecarError.js +10 -0
  186. package/lib/chain/errors/blobSidecarError.js.map +1 -1
  187. package/lib/chain/errors/blockError.d.ts.map +1 -0
  188. package/lib/chain/errors/blockError.js +1 -0
  189. package/lib/chain/errors/blockError.js.map +1 -1
  190. package/lib/chain/errors/blsToExecutionChangeError.d.ts.map +1 -0
  191. package/lib/chain/errors/dataColumnSidecarError.d.ts +42 -0
  192. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -0
  193. package/lib/chain/errors/dataColumnSidecarError.js +14 -0
  194. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
  195. package/lib/chain/errors/gossipValidation.d.ts.map +1 -0
  196. package/lib/chain/errors/gossipValidation.js +1 -0
  197. package/lib/chain/errors/gossipValidation.js.map +1 -1
  198. package/lib/chain/errors/index.d.ts +2 -2
  199. package/lib/chain/errors/index.d.ts.map +1 -0
  200. package/lib/chain/errors/index.js +2 -2
  201. package/lib/chain/errors/index.js.map +1 -1
  202. package/lib/chain/errors/lightClientError.d.ts.map +1 -0
  203. package/lib/chain/errors/proposerSlashingError.d.ts.map +1 -0
  204. package/lib/chain/errors/syncCommitteeError.d.ts.map +1 -0
  205. package/lib/chain/errors/voluntaryExitError.d.ts.map +1 -0
  206. package/lib/chain/forkChoice/index.d.ts.map +1 -0
  207. package/lib/chain/forkChoice/index.js.map +1 -1
  208. package/lib/chain/genesis/genesis.d.ts.map +1 -0
  209. package/lib/chain/genesis/genesis.js +16 -5
  210. package/lib/chain/genesis/genesis.js.map +1 -1
  211. package/lib/chain/genesis/interface.d.ts.map +1 -0
  212. package/lib/chain/index.d.ts +2 -2
  213. package/lib/chain/index.d.ts.map +1 -0
  214. package/lib/chain/index.js +2 -2
  215. package/lib/chain/index.js.map +1 -1
  216. package/lib/chain/initState.d.ts.map +1 -0
  217. package/lib/chain/interface.d.ts +12 -9
  218. package/lib/chain/interface.d.ts.map +1 -0
  219. package/lib/chain/interface.js.map +1 -1
  220. package/lib/chain/lightClient/index.d.ts +2 -2
  221. package/lib/chain/lightClient/index.d.ts.map +1 -0
  222. package/lib/chain/lightClient/index.js +18 -9
  223. package/lib/chain/lightClient/index.js.map +1 -1
  224. package/lib/chain/lightClient/proofs.d.ts.map +1 -0
  225. package/lib/chain/lightClient/proofs.js.map +1 -1
  226. package/lib/chain/lightClient/types.d.ts.map +1 -0
  227. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -0
  228. package/lib/chain/opPools/aggregatedAttestationPool.js +14 -9
  229. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  230. package/lib/chain/opPools/attestationPool.d.ts +2 -3
  231. package/lib/chain/opPools/attestationPool.d.ts.map +1 -0
  232. package/lib/chain/opPools/attestationPool.js +10 -7
  233. package/lib/chain/opPools/attestationPool.js.map +1 -1
  234. package/lib/chain/opPools/index.d.ts +1 -1
  235. package/lib/chain/opPools/index.d.ts.map +1 -0
  236. package/lib/chain/opPools/index.js +1 -1
  237. package/lib/chain/opPools/index.js.map +1 -1
  238. package/lib/chain/opPools/opPool.d.ts.map +1 -0
  239. package/lib/chain/opPools/opPool.js +10 -12
  240. package/lib/chain/opPools/opPool.js.map +1 -1
  241. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts +3 -2
  242. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -0
  243. package/lib/chain/opPools/syncCommitteeMessagePool.js +14 -10
  244. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  245. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -0
  246. package/lib/chain/opPools/syncContributionAndProofPool.js +5 -2
  247. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  248. package/lib/chain/opPools/types.d.ts +1 -1
  249. package/lib/chain/opPools/types.d.ts.map +1 -0
  250. package/lib/chain/opPools/types.js +1 -1
  251. package/lib/chain/opPools/types.js.map +1 -1
  252. package/lib/chain/opPools/utils.d.ts.map +1 -0
  253. package/lib/chain/options.d.ts.map +1 -0
  254. package/lib/chain/options.js +1 -1
  255. package/lib/chain/options.js.map +1 -1
  256. package/lib/chain/prepareNextSlot.d.ts +3 -3
  257. package/lib/chain/prepareNextSlot.d.ts.map +1 -0
  258. package/lib/chain/prepareNextSlot.js +145 -140
  259. package/lib/chain/prepareNextSlot.js.map +1 -1
  260. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -0
  261. package/lib/chain/produceBlock/index.d.ts.map +1 -0
  262. package/lib/chain/produceBlock/produceBlockBody.d.ts +2 -5
  263. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -0
  264. package/lib/chain/produceBlock/produceBlockBody.js +16 -14
  265. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  266. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts.map +1 -0
  267. package/lib/chain/regen/errors.d.ts.map +1 -0
  268. package/lib/chain/regen/errors.js +1 -0
  269. package/lib/chain/regen/errors.js.map +1 -1
  270. package/lib/chain/regen/index.d.ts +1 -1
  271. package/lib/chain/regen/index.d.ts.map +1 -0
  272. package/lib/chain/regen/index.js +1 -1
  273. package/lib/chain/regen/index.js.map +1 -1
  274. package/lib/chain/regen/interface.d.ts +1 -0
  275. package/lib/chain/regen/interface.d.ts.map +1 -0
  276. package/lib/chain/regen/interface.js +1 -0
  277. package/lib/chain/regen/interface.js.map +1 -1
  278. package/lib/chain/regen/queued.d.ts.map +1 -0
  279. package/lib/chain/regen/queued.js +35 -28
  280. package/lib/chain/regen/queued.js.map +1 -1
  281. package/lib/chain/regen/regen.d.ts.map +1 -0
  282. package/lib/chain/regen/regen.js +1 -0
  283. package/lib/chain/regen/regen.js.map +1 -1
  284. package/lib/chain/reprocess.d.ts.map +1 -0
  285. package/lib/chain/reprocess.js +3 -1
  286. package/lib/chain/reprocess.js.map +1 -1
  287. package/lib/chain/rewards/attestationsRewards.d.ts.map +1 -0
  288. package/lib/chain/rewards/blockRewards.d.ts.map +1 -0
  289. package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +1 -0
  290. package/lib/chain/seenCache/index.d.ts +1 -1
  291. package/lib/chain/seenCache/index.d.ts.map +1 -0
  292. package/lib/chain/seenCache/index.js +1 -1
  293. package/lib/chain/seenCache/index.js.map +1 -1
  294. package/lib/chain/seenCache/seenAggregateAndProof.d.ts.map +1 -0
  295. package/lib/chain/seenCache/seenAggregateAndProof.js +7 -6
  296. package/lib/chain/seenCache/seenAggregateAndProof.js.map +1 -1
  297. package/lib/chain/seenCache/seenAttestationData.d.ts.map +1 -0
  298. package/lib/chain/seenCache/seenAttestationData.js +5 -2
  299. package/lib/chain/seenCache/seenAttestationData.js.map +1 -1
  300. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -0
  301. package/lib/chain/seenCache/seenAttesters.js +2 -4
  302. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  303. package/lib/chain/seenCache/seenBlockAttesters.d.ts.map +1 -0
  304. package/lib/chain/seenCache/seenBlockProposers.d.ts.map +1 -0
  305. package/lib/chain/seenCache/seenBlockProposers.js +2 -4
  306. package/lib/chain/seenCache/seenBlockProposers.js.map +1 -1
  307. package/lib/chain/seenCache/seenCommittee.d.ts.map +1 -0
  308. package/lib/chain/seenCache/seenCommittee.js +1 -3
  309. package/lib/chain/seenCache/seenCommittee.js.map +1 -1
  310. package/lib/chain/seenCache/seenCommitteeContribution.d.ts.map +1 -0
  311. package/lib/chain/seenCache/seenCommitteeContribution.js +3 -2
  312. package/lib/chain/seenCache/seenCommitteeContribution.js.map +1 -1
  313. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +74 -78
  314. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -0
  315. package/lib/chain/seenCache/seenGossipBlockInput.js +242 -369
  316. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  317. package/lib/chain/serializeState.d.ts.map +1 -0
  318. package/lib/chain/shufflingCache.d.ts.map +1 -0
  319. package/lib/chain/shufflingCache.js +5 -2
  320. package/lib/chain/shufflingCache.js.map +1 -1
  321. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -0
  322. package/lib/chain/stateCache/blockStateCacheImpl.js +13 -7
  323. package/lib/chain/stateCache/blockStateCacheImpl.js.map +1 -1
  324. package/lib/chain/stateCache/datastore/db.d.ts.map +1 -0
  325. package/lib/chain/stateCache/datastore/db.js +1 -0
  326. package/lib/chain/stateCache/datastore/db.js.map +1 -1
  327. package/lib/chain/stateCache/datastore/file.d.ts.map +1 -0
  328. package/lib/chain/stateCache/datastore/file.js +1 -0
  329. package/lib/chain/stateCache/datastore/file.js.map +1 -1
  330. package/lib/chain/stateCache/datastore/index.d.ts +1 -1
  331. package/lib/chain/stateCache/datastore/index.d.ts.map +1 -0
  332. package/lib/chain/stateCache/datastore/index.js +1 -1
  333. package/lib/chain/stateCache/datastore/index.js.map +1 -1
  334. package/lib/chain/stateCache/datastore/types.d.ts.map +1 -0
  335. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -0
  336. package/lib/chain/stateCache/fifoBlockStateCache.js +10 -0
  337. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  338. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -0
  339. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +10 -4
  340. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -1
  341. package/lib/chain/stateCache/index.d.ts +1 -1
  342. package/lib/chain/stateCache/index.d.ts.map +1 -0
  343. package/lib/chain/stateCache/index.js +1 -1
  344. package/lib/chain/stateCache/index.js.map +1 -1
  345. package/lib/chain/stateCache/mapMetrics.d.ts.map +1 -0
  346. package/lib/chain/stateCache/mapMetrics.js +4 -4
  347. package/lib/chain/stateCache/mapMetrics.js.map +1 -1
  348. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -0
  349. package/lib/chain/stateCache/persistentCheckpointsCache.js +23 -14
  350. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  351. package/lib/chain/stateCache/types.d.ts.map +1 -0
  352. package/lib/chain/validation/aggregateAndProof.d.ts.map +1 -0
  353. package/lib/chain/validation/attestation.d.ts.map +1 -0
  354. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -0
  355. package/lib/chain/validation/blobSidecar.d.ts +8 -3
  356. package/lib/chain/validation/blobSidecar.d.ts.map +1 -0
  357. package/lib/chain/validation/blobSidecar.js +73 -31
  358. package/lib/chain/validation/blobSidecar.js.map +1 -1
  359. package/lib/chain/validation/block.d.ts.map +1 -0
  360. package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -0
  361. package/lib/chain/validation/dataColumnSidecar.d.ts +7 -9
  362. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -0
  363. package/lib/chain/validation/dataColumnSidecar.js +96 -58
  364. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  365. package/lib/chain/validation/index.d.ts +1 -1
  366. package/lib/chain/validation/index.d.ts.map +1 -0
  367. package/lib/chain/validation/index.js +1 -1
  368. package/lib/chain/validation/index.js.map +1 -1
  369. package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +1 -0
  370. package/lib/chain/validation/lightClientFinalityUpdate.js +4 -3
  371. package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
  372. package/lib/chain/validation/lightClientOptimisticUpdate.d.ts +6 -4
  373. package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +1 -0
  374. package/lib/chain/validation/lightClientOptimisticUpdate.js +11 -11
  375. package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
  376. package/lib/chain/validation/proposerSlashing.d.ts.map +1 -0
  377. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +1 -2
  378. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -0
  379. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  380. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -0
  381. package/lib/chain/validation/signatureSets/index.d.ts.map +1 -0
  382. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -0
  383. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -0
  384. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -0
  385. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -0
  386. package/lib/chain/validation/syncCommittee.d.ts.map +1 -0
  387. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -0
  388. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -0
  389. package/lib/chain/validatorMonitor.d.ts +1 -3
  390. package/lib/chain/validatorMonitor.d.ts.map +1 -0
  391. package/lib/chain/validatorMonitor.js +23 -16
  392. package/lib/chain/validatorMonitor.js.map +1 -1
  393. package/lib/constants/constants.d.ts.map +1 -0
  394. package/lib/constants/index.d.ts.map +1 -0
  395. package/lib/constants/network.d.ts.map +1 -0
  396. package/lib/db/beacon.d.ts.map +1 -0
  397. package/lib/db/beacon.js +24 -0
  398. package/lib/db/beacon.js.map +1 -1
  399. package/lib/db/buckets.d.ts +4 -4
  400. package/lib/db/buckets.d.ts.map +1 -0
  401. package/lib/db/buckets.js +4 -4
  402. package/lib/db/buckets.js.map +1 -1
  403. package/lib/db/index.d.ts +1 -1
  404. package/lib/db/index.d.ts.map +1 -0
  405. package/lib/db/index.js.map +1 -1
  406. package/lib/db/interface.d.ts.map +1 -0
  407. package/lib/db/options.d.ts.map +1 -0
  408. package/lib/db/repositories/attesterSlashing.d.ts.map +1 -0
  409. package/lib/db/repositories/backfilledRanges.d.ts.map +1 -0
  410. package/lib/db/repositories/blobSidecars.d.ts.map +1 -0
  411. package/lib/db/repositories/blobSidecars.js +1 -1
  412. package/lib/db/repositories/blobSidecars.js.map +1 -1
  413. package/lib/db/repositories/blobSidecarsArchive.d.ts.map +1 -0
  414. package/lib/db/repositories/blobSidecarsArchive.js +1 -1
  415. package/lib/db/repositories/blobSidecarsArchive.js.map +1 -1
  416. package/lib/db/repositories/block.d.ts.map +1 -0
  417. package/lib/db/repositories/blockArchive.d.ts.map +1 -0
  418. package/lib/db/repositories/blockArchive.js +2 -3
  419. package/lib/db/repositories/blockArchive.js.map +1 -1
  420. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  421. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -0
  422. package/lib/db/repositories/blsToExecutionChange.d.ts.map +1 -0
  423. package/lib/db/repositories/checkpointState.d.ts.map +1 -0
  424. package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -0
  425. package/lib/db/repositories/dataColumnSidecar.js +2 -2
  426. package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
  427. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -0
  428. package/lib/db/repositories/dataColumnSidecarArchive.js +2 -2
  429. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  430. package/lib/db/repositories/depositDataRoot.d.ts.map +1 -0
  431. package/lib/db/repositories/depositDataRoot.js +1 -0
  432. package/lib/db/repositories/depositDataRoot.js.map +1 -1
  433. package/lib/db/repositories/depositEvent.d.ts.map +1 -0
  434. package/lib/db/repositories/eth1Data.d.ts.map +1 -0
  435. package/lib/db/repositories/index.d.ts +10 -10
  436. package/lib/db/repositories/index.d.ts.map +1 -0
  437. package/lib/db/repositories/index.js +9 -9
  438. package/lib/db/repositories/index.js.map +1 -1
  439. package/lib/db/repositories/lightclientBestUpdate.d.ts.map +1 -0
  440. package/lib/db/repositories/lightclientCheckpointHeader.d.ts.map +1 -0
  441. package/lib/db/repositories/lightclientSyncCommittee.d.ts.map +1 -0
  442. package/lib/db/repositories/lightclientSyncCommitteeWitness.d.ts.map +1 -0
  443. package/lib/db/repositories/proposerSlashing.d.ts.map +1 -0
  444. package/lib/db/repositories/stateArchive.d.ts.map +1 -0
  445. package/lib/db/repositories/stateArchiveIndex.d.ts.map +1 -0
  446. package/lib/db/repositories/voluntaryExit.d.ts.map +1 -0
  447. package/lib/db/single/index.d.ts.map +1 -0
  448. package/lib/db/single/preGenesisState.d.ts.map +1 -0
  449. package/lib/db/single/preGenesisState.js +6 -0
  450. package/lib/db/single/preGenesisState.js.map +1 -1
  451. package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +1 -0
  452. package/lib/db/single/preGenesisStateLastProcessedBlock.js +5 -0
  453. package/lib/db/single/preGenesisStateLastProcessedBlock.js.map +1 -1
  454. package/lib/eth1/errors.d.ts.map +1 -0
  455. package/lib/eth1/eth1DataCache.d.ts.map +1 -0
  456. package/lib/eth1/eth1DataCache.js +2 -0
  457. package/lib/eth1/eth1DataCache.js.map +1 -1
  458. package/lib/eth1/eth1DepositDataTracker.d.ts.map +1 -0
  459. package/lib/eth1/eth1DepositDataTracker.js +18 -5
  460. package/lib/eth1/eth1DepositDataTracker.js.map +1 -1
  461. package/lib/eth1/eth1DepositsCache.d.ts.map +1 -0
  462. package/lib/eth1/eth1DepositsCache.js +3 -0
  463. package/lib/eth1/eth1DepositsCache.js.map +1 -1
  464. package/lib/eth1/eth1MergeBlockTracker.d.ts.map +1 -0
  465. package/lib/eth1/eth1MergeBlockTracker.js +10 -4
  466. package/lib/eth1/eth1MergeBlockTracker.js.map +1 -1
  467. package/lib/eth1/index.d.ts.map +1 -0
  468. package/lib/eth1/index.js +2 -0
  469. package/lib/eth1/index.js.map +1 -1
  470. package/lib/eth1/interface.d.ts.map +1 -0
  471. package/lib/eth1/options.d.ts.map +1 -0
  472. package/lib/eth1/provider/eth1Provider.d.ts +1 -2
  473. package/lib/eth1/provider/eth1Provider.d.ts.map +1 -0
  474. package/lib/eth1/provider/eth1Provider.js +6 -2
  475. package/lib/eth1/provider/eth1Provider.js.map +1 -1
  476. package/lib/eth1/provider/jsonRpcHttpClient.d.ts +1 -1
  477. package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +1 -0
  478. package/lib/eth1/provider/jsonRpcHttpClient.js +16 -2
  479. package/lib/eth1/provider/jsonRpcHttpClient.js.map +1 -1
  480. package/lib/eth1/provider/jwt.d.ts.map +1 -0
  481. package/lib/eth1/provider/jwt.js.map +1 -1
  482. package/lib/eth1/provider/utils.d.ts +5 -0
  483. package/lib/eth1/provider/utils.d.ts.map +1 -0
  484. package/lib/eth1/provider/utils.js +9 -1
  485. package/lib/eth1/provider/utils.js.map +1 -1
  486. package/lib/eth1/stream.d.ts.map +1 -0
  487. package/lib/eth1/utils/depositContract.d.ts.map +1 -0
  488. package/lib/eth1/utils/deposits.d.ts.map +1 -0
  489. package/lib/eth1/utils/deposits.js.map +1 -1
  490. package/lib/eth1/utils/eth1Data.d.ts.map +1 -0
  491. package/lib/eth1/utils/eth1DepositEvent.d.ts.map +1 -0
  492. package/lib/eth1/utils/eth1Vote.d.ts.map +1 -0
  493. package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +1 -0
  494. package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +1 -0
  495. package/lib/execution/builder/cache.d.ts.map +1 -0
  496. package/lib/execution/builder/cache.js +6 -0
  497. package/lib/execution/builder/cache.js.map +1 -1
  498. package/lib/execution/builder/http.d.ts.map +1 -0
  499. package/lib/execution/builder/http.js +14 -8
  500. package/lib/execution/builder/http.js.map +1 -1
  501. package/lib/execution/builder/index.d.ts.map +1 -0
  502. package/lib/execution/builder/index.js.map +1 -1
  503. package/lib/execution/builder/interface.d.ts.map +1 -0
  504. package/lib/execution/builder/utils.d.ts.map +1 -0
  505. package/lib/execution/engine/disabled.d.ts.map +1 -0
  506. package/lib/execution/engine/disabled.js +2 -4
  507. package/lib/execution/engine/disabled.js.map +1 -1
  508. package/lib/execution/engine/http.d.ts +2 -2
  509. package/lib/execution/engine/http.d.ts.map +1 -0
  510. package/lib/execution/engine/http.js +43 -11
  511. package/lib/execution/engine/http.js.map +1 -1
  512. package/lib/execution/engine/index.d.ts.map +1 -0
  513. package/lib/execution/engine/interface.d.ts +2 -2
  514. package/lib/execution/engine/interface.d.ts.map +1 -0
  515. package/lib/execution/engine/interface.js.map +1 -1
  516. package/lib/execution/engine/mock.d.ts +1 -0
  517. package/lib/execution/engine/mock.d.ts.map +1 -0
  518. package/lib/execution/engine/mock.js +16 -12
  519. package/lib/execution/engine/mock.js.map +1 -1
  520. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -0
  521. package/lib/execution/engine/payloadIdCache.js +1 -3
  522. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  523. package/lib/execution/engine/types.d.ts +5 -1
  524. package/lib/execution/engine/types.d.ts.map +1 -0
  525. package/lib/execution/engine/types.js +37 -8
  526. package/lib/execution/engine/types.js.map +1 -1
  527. package/lib/execution/engine/utils.d.ts.map +1 -0
  528. package/lib/execution/engine/utils.js +3 -3
  529. package/lib/execution/engine/utils.js.map +1 -1
  530. package/lib/execution/index.d.ts +2 -2
  531. package/lib/execution/index.d.ts.map +1 -0
  532. package/lib/execution/index.js +2 -2
  533. package/lib/execution/index.js.map +1 -1
  534. package/lib/index.d.ts +6 -6
  535. package/lib/index.d.ts.map +1 -0
  536. package/lib/index.js +5 -5
  537. package/lib/index.js.map +1 -1
  538. package/lib/metrics/index.d.ts +1 -1
  539. package/lib/metrics/index.d.ts.map +1 -0
  540. package/lib/metrics/index.js +1 -1
  541. package/lib/metrics/index.js.map +1 -1
  542. package/lib/metrics/metrics/beacon.d.ts +11 -5
  543. package/lib/metrics/metrics/beacon.d.ts.map +1 -0
  544. package/lib/metrics/metrics/beacon.js +40 -20
  545. package/lib/metrics/metrics/beacon.js.map +1 -1
  546. package/lib/metrics/metrics/lodestar.d.ts +56 -14
  547. package/lib/metrics/metrics/lodestar.d.ts.map +1 -0
  548. package/lib/metrics/metrics/lodestar.js +87 -10
  549. package/lib/metrics/metrics/lodestar.js.map +1 -1
  550. package/lib/metrics/metrics.d.ts +1 -1
  551. package/lib/metrics/metrics.d.ts.map +1 -0
  552. package/lib/metrics/metrics.js.map +1 -1
  553. package/lib/metrics/nodeJsMetrics.d.ts.map +1 -0
  554. package/lib/metrics/nodeJsMetrics.js +1 -1
  555. package/lib/metrics/nodeJsMetrics.js.map +1 -1
  556. package/lib/metrics/options.d.ts.map +1 -0
  557. package/lib/metrics/server/http.d.ts +1 -1
  558. package/lib/metrics/server/http.d.ts.map +1 -0
  559. package/lib/metrics/server/index.d.ts.map +1 -0
  560. package/lib/metrics/utils/avgMinMax.d.ts +1 -1
  561. package/lib/metrics/utils/avgMinMax.d.ts.map +1 -0
  562. package/lib/metrics/utils/avgMinMax.js +10 -6
  563. package/lib/metrics/utils/avgMinMax.js.map +1 -1
  564. package/lib/metrics/utils/gauge.d.ts +1 -1
  565. package/lib/metrics/utils/gauge.d.ts.map +1 -0
  566. package/lib/metrics/utils/gauge.js +1 -4
  567. package/lib/metrics/utils/gauge.js.map +1 -1
  568. package/lib/metrics/utils/registryMetricCreator.d.ts +1 -1
  569. package/lib/metrics/utils/registryMetricCreator.d.ts.map +1 -0
  570. package/lib/metrics/utils/registryMetricCreator.js.map +1 -1
  571. package/lib/monitoring/clientStats.d.ts.map +1 -0
  572. package/lib/monitoring/index.d.ts.map +1 -0
  573. package/lib/monitoring/options.d.ts.map +1 -0
  574. package/lib/monitoring/properties.d.ts.map +1 -0
  575. package/lib/monitoring/properties.js +4 -0
  576. package/lib/monitoring/properties.js.map +1 -1
  577. package/lib/monitoring/service.d.ts.map +1 -0
  578. package/lib/monitoring/service.js +13 -1
  579. package/lib/monitoring/service.js.map +1 -1
  580. package/lib/monitoring/system.d.ts.map +1 -0
  581. package/lib/monitoring/system.js +25 -27
  582. package/lib/monitoring/system.js.map +1 -1
  583. package/lib/monitoring/types.d.ts.map +1 -0
  584. package/lib/network/core/events.d.ts.map +1 -0
  585. package/lib/network/core/index.d.ts.map +1 -0
  586. package/lib/network/core/metrics.d.ts.map +1 -0
  587. package/lib/network/core/networkCore.d.ts +2 -2
  588. package/lib/network/core/networkCore.d.ts.map +1 -0
  589. package/lib/network/core/networkCore.js +67 -50
  590. package/lib/network/core/networkCore.js.map +1 -1
  591. package/lib/network/core/networkCoreWorker.d.ts.map +1 -0
  592. package/lib/network/core/networkCoreWorker.js +1 -1
  593. package/lib/network/core/networkCoreWorker.js.map +1 -1
  594. package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -2
  595. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -0
  596. package/lib/network/core/networkCoreWorkerHandler.js +14 -5
  597. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  598. package/lib/network/core/types.d.ts.map +1 -0
  599. package/lib/network/discv5/index.d.ts +2 -2
  600. package/lib/network/discv5/index.d.ts.map +1 -0
  601. package/lib/network/discv5/index.js +9 -3
  602. package/lib/network/discv5/index.js.map +1 -1
  603. package/lib/network/discv5/types.d.ts.map +1 -0
  604. package/lib/network/discv5/utils.d.ts.map +1 -0
  605. package/lib/network/discv5/worker.d.ts.map +1 -0
  606. package/lib/network/discv5/worker.js +3 -3
  607. package/lib/network/discv5/worker.js.map +1 -1
  608. package/lib/network/events.d.ts +2 -18
  609. package/lib/network/events.d.ts.map +1 -0
  610. package/lib/network/events.js +0 -7
  611. package/lib/network/events.js.map +1 -1
  612. package/lib/network/forks.d.ts.map +1 -0
  613. package/lib/network/gossip/constants.d.ts.map +1 -0
  614. package/lib/network/gossip/encoding.d.ts +1 -1
  615. package/lib/network/gossip/encoding.d.ts.map +1 -0
  616. package/lib/network/gossip/encoding.js +4 -2
  617. package/lib/network/gossip/encoding.js.map +1 -1
  618. package/lib/network/gossip/errors.d.ts.map +1 -0
  619. package/lib/network/gossip/errors.js +1 -0
  620. package/lib/network/gossip/errors.js.map +1 -1
  621. package/lib/network/gossip/gossipsub.d.ts +2 -1
  622. package/lib/network/gossip/gossipsub.d.ts.map +1 -0
  623. package/lib/network/gossip/gossipsub.js +44 -18
  624. package/lib/network/gossip/gossipsub.js.map +1 -1
  625. package/lib/network/gossip/index.d.ts +2 -2
  626. package/lib/network/gossip/index.d.ts.map +1 -0
  627. package/lib/network/gossip/index.js +2 -2
  628. package/lib/network/gossip/index.js.map +1 -1
  629. package/lib/network/gossip/interface.d.ts +2 -2
  630. package/lib/network/gossip/interface.d.ts.map +1 -0
  631. package/lib/network/gossip/metrics.d.ts +15 -7
  632. package/lib/network/gossip/metrics.d.ts.map +1 -0
  633. package/lib/network/gossip/metrics.js +16 -6
  634. package/lib/network/gossip/metrics.js.map +1 -1
  635. package/lib/network/gossip/scoringParameters.d.ts.map +1 -0
  636. package/lib/network/gossip/scoringParameters.js +4 -4
  637. package/lib/network/gossip/scoringParameters.js.map +1 -1
  638. package/lib/network/gossip/topic.d.ts +125 -105
  639. package/lib/network/gossip/topic.d.ts.map +1 -0
  640. package/lib/network/gossip/topic.js +4 -3
  641. package/lib/network/gossip/topic.js.map +1 -1
  642. package/lib/network/index.d.ts +3 -3
  643. package/lib/network/index.d.ts.map +1 -0
  644. package/lib/network/index.js +3 -3
  645. package/lib/network/index.js.map +1 -1
  646. package/lib/network/interface.d.ts +3 -2
  647. package/lib/network/interface.d.ts.map +1 -0
  648. package/lib/network/libp2p/error.d.ts.map +1 -0
  649. package/lib/network/libp2p/index.d.ts.map +1 -0
  650. package/lib/network/libp2p/index.js +11 -3
  651. package/lib/network/libp2p/index.js.map +1 -1
  652. package/lib/network/metadata.d.ts.map +1 -0
  653. package/lib/network/metadata.js +6 -1
  654. package/lib/network/metadata.js.map +1 -1
  655. package/lib/network/network.d.ts +5 -3
  656. package/lib/network/network.d.ts.map +1 -0
  657. package/lib/network/network.js +92 -76
  658. package/lib/network/network.js.map +1 -1
  659. package/lib/network/networkConfig.d.ts.map +1 -0
  660. package/lib/network/options.d.ts.map +1 -0
  661. package/lib/network/options.js +1 -1
  662. package/lib/network/options.js.map +1 -1
  663. package/lib/network/peers/client.d.ts.map +1 -0
  664. package/lib/network/peers/datastore.d.ts +2 -2
  665. package/lib/network/peers/datastore.d.ts.map +1 -0
  666. package/lib/network/peers/datastore.js +10 -4
  667. package/lib/network/peers/datastore.js.map +1 -1
  668. package/lib/network/peers/discover.d.ts.map +1 -0
  669. package/lib/network/peers/discover.js +75 -66
  670. package/lib/network/peers/discover.js.map +1 -1
  671. package/lib/network/peers/index.d.ts.map +1 -0
  672. package/lib/network/peers/peerManager.d.ts.map +1 -0
  673. package/lib/network/peers/peerManager.js +156 -131
  674. package/lib/network/peers/peerManager.js.map +1 -1
  675. package/lib/network/peers/peersData.d.ts +1 -1
  676. package/lib/network/peers/peersData.d.ts.map +1 -0
  677. package/lib/network/peers/peersData.js +1 -3
  678. package/lib/network/peers/peersData.js.map +1 -1
  679. package/lib/network/peers/score/constants.d.ts.map +1 -0
  680. package/lib/network/peers/score/index.d.ts +1 -1
  681. package/lib/network/peers/score/index.d.ts.map +1 -0
  682. package/lib/network/peers/score/index.js +1 -1
  683. package/lib/network/peers/score/index.js.map +1 -1
  684. package/lib/network/peers/score/interface.d.ts.map +1 -0
  685. package/lib/network/peers/score/score.d.ts.map +1 -0
  686. package/lib/network/peers/score/score.js +6 -0
  687. package/lib/network/peers/score/score.js.map +1 -1
  688. package/lib/network/peers/score/store.d.ts.map +1 -0
  689. package/lib/network/peers/score/store.js +3 -0
  690. package/lib/network/peers/score/store.js.map +1 -1
  691. package/lib/network/peers/score/utils.d.ts.map +1 -0
  692. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -0
  693. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -0
  694. package/lib/network/peers/utils/getConnectedPeerIds.d.ts.map +1 -0
  695. package/lib/network/peers/utils/index.d.ts.map +1 -0
  696. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -0
  697. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  698. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -0
  699. package/lib/network/peers/utils/subnetMap.js +2 -4
  700. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  701. package/lib/network/processor/aggregatorTracker.d.ts.map +1 -0
  702. package/lib/network/processor/aggregatorTracker.js +1 -3
  703. package/lib/network/processor/aggregatorTracker.js.map +1 -1
  704. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -0
  705. package/lib/network/processor/gossipHandlers.d.ts.map +1 -0
  706. package/lib/network/processor/gossipHandlers.js +145 -164
  707. package/lib/network/processor/gossipHandlers.js.map +1 -1
  708. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -0
  709. package/lib/network/processor/gossipQueues/indexed.d.ts.map +1 -0
  710. package/lib/network/processor/gossipQueues/indexed.js +11 -9
  711. package/lib/network/processor/gossipQueues/indexed.js.map +1 -1
  712. package/lib/network/processor/gossipQueues/linear.d.ts.map +1 -0
  713. package/lib/network/processor/gossipQueues/linear.js +9 -8
  714. package/lib/network/processor/gossipQueues/linear.js.map +1 -1
  715. package/lib/network/processor/gossipQueues/types.d.ts.map +1 -0
  716. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -0
  717. package/lib/network/processor/index.d.ts +2 -1
  718. package/lib/network/processor/index.d.ts.map +1 -0
  719. package/lib/network/processor/index.js +21 -8
  720. package/lib/network/processor/index.js.map +1 -1
  721. package/lib/network/processor/types.d.ts.map +1 -0
  722. package/lib/network/reqresp/ReqRespBeaconNode.d.ts +1 -1
  723. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -0
  724. package/lib/network/reqresp/ReqRespBeaconNode.js +11 -2
  725. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  726. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -0
  727. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -0
  728. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -0
  729. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -0
  730. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -0
  731. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -0
  732. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  733. package/lib/network/reqresp/handlers/index.d.ts.map +1 -0
  734. package/lib/network/reqresp/handlers/lightClientBootstrap.d.ts.map +1 -0
  735. package/lib/network/reqresp/handlers/lightClientFinalityUpdate.d.ts.map +1 -0
  736. package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.d.ts.map +1 -0
  737. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +1 -0
  738. package/lib/network/reqresp/index.d.ts +1 -3
  739. package/lib/network/reqresp/index.d.ts.map +1 -0
  740. package/lib/network/reqresp/index.js +1 -3
  741. package/lib/network/reqresp/index.js.map +1 -1
  742. package/lib/network/reqresp/interface.d.ts.map +1 -0
  743. package/lib/network/reqresp/protocols.d.ts.map +1 -0
  744. package/lib/network/reqresp/rateLimit.d.ts.map +1 -0
  745. package/lib/network/reqresp/rateLimit.js +11 -5
  746. package/lib/network/reqresp/rateLimit.js.map +1 -1
  747. package/lib/network/reqresp/score.d.ts.map +1 -0
  748. package/lib/network/reqresp/types.d.ts.map +1 -0
  749. package/lib/network/reqresp/utils/collect.d.ts.map +1 -0
  750. package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts.map +1 -0
  751. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -0
  752. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  753. package/lib/network/statusCache.d.ts.map +1 -0
  754. package/lib/network/statusCache.js +1 -0
  755. package/lib/network/statusCache.js.map +1 -1
  756. package/lib/network/subnets/attnetsService.d.ts.map +1 -0
  757. package/lib/network/subnets/attnetsService.js +73 -65
  758. package/lib/network/subnets/attnetsService.js.map +1 -1
  759. package/lib/network/subnets/index.d.ts.map +1 -0
  760. package/lib/network/subnets/interface.d.ts.map +1 -0
  761. package/lib/network/subnets/interface.js +1 -1
  762. package/lib/network/subnets/interface.js.map +1 -1
  763. package/lib/network/subnets/syncnetsService.d.ts.map +1 -0
  764. package/lib/network/subnets/syncnetsService.js +29 -22
  765. package/lib/network/subnets/syncnetsService.js.map +1 -1
  766. package/lib/network/subnets/util.d.ts.map +1 -0
  767. package/lib/network/subnets/util.js +1 -2
  768. package/lib/network/subnets/util.js.map +1 -1
  769. package/lib/network/util.d.ts.map +1 -0
  770. package/lib/node/index.d.ts.map +1 -0
  771. package/lib/node/nodejs.d.ts +1 -1
  772. package/lib/node/nodejs.d.ts.map +1 -0
  773. package/lib/node/nodejs.js +15 -0
  774. package/lib/node/nodejs.js.map +1 -1
  775. package/lib/node/notifier.d.ts.map +1 -0
  776. package/lib/node/notifier.js +2 -3
  777. package/lib/node/notifier.js.map +1 -1
  778. package/lib/node/options.d.ts.map +1 -0
  779. package/lib/node/options.js.map +1 -1
  780. package/lib/node/utils/interop/deposits.d.ts.map +1 -0
  781. package/lib/node/utils/interop/state.d.ts.map +1 -0
  782. package/lib/node/utils/interop/state.js +1 -2
  783. package/lib/node/utils/interop/state.js.map +1 -1
  784. package/lib/node/utils/lightclient.d.ts.map +1 -0
  785. package/lib/node/utils/state.d.ts.map +1 -0
  786. package/lib/sync/backfill/backfill.d.ts +1 -1
  787. package/lib/sync/backfill/backfill.d.ts.map +1 -0
  788. package/lib/sync/backfill/backfill.js +58 -16
  789. package/lib/sync/backfill/backfill.js.map +1 -1
  790. package/lib/sync/backfill/errors.d.ts.map +1 -0
  791. package/lib/sync/backfill/index.d.ts.map +1 -0
  792. package/lib/sync/backfill/verify.d.ts.map +1 -0
  793. package/lib/sync/constants.d.ts +2 -1
  794. package/lib/sync/constants.d.ts.map +1 -0
  795. package/lib/sync/constants.js +2 -1
  796. package/lib/sync/constants.js.map +1 -1
  797. package/lib/sync/index.d.ts.map +1 -0
  798. package/lib/sync/interface.d.ts +1 -59
  799. package/lib/sync/interface.d.ts.map +1 -0
  800. package/lib/sync/interface.js +0 -20
  801. package/lib/sync/interface.js.map +1 -1
  802. package/lib/sync/options.d.ts +1 -1
  803. package/lib/sync/options.d.ts.map +1 -0
  804. package/lib/sync/range/batch.d.ts +48 -32
  805. package/lib/sync/range/batch.d.ts.map +1 -0
  806. package/lib/sync/range/batch.js +201 -55
  807. package/lib/sync/range/batch.js.map +1 -1
  808. package/lib/sync/range/chain.d.ts +15 -10
  809. package/lib/sync/range/chain.d.ts.map +1 -0
  810. package/lib/sync/range/chain.js +141 -70
  811. package/lib/sync/range/chain.js.map +1 -1
  812. package/lib/sync/range/range.d.ts +3 -3
  813. package/lib/sync/range/range.d.ts.map +1 -0
  814. package/lib/sync/range/range.js +86 -54
  815. package/lib/sync/range/range.js.map +1 -1
  816. package/lib/sync/range/utils/batches.d.ts.map +1 -0
  817. package/lib/sync/range/utils/chainTarget.d.ts.map +1 -0
  818. package/lib/sync/range/utils/hashBlocks.d.ts +2 -2
  819. package/lib/sync/range/utils/hashBlocks.d.ts.map +1 -0
  820. package/lib/sync/range/utils/hashBlocks.js +6 -4
  821. package/lib/sync/range/utils/hashBlocks.js.map +1 -1
  822. package/lib/sync/range/utils/index.d.ts.map +1 -0
  823. package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -0
  824. package/lib/sync/range/utils/peerBalancer.js +18 -13
  825. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  826. package/lib/sync/range/utils/updateChains.d.ts.map +1 -0
  827. package/lib/sync/sync.d.ts +1 -2
  828. package/lib/sync/sync.d.ts.map +1 -0
  829. package/lib/sync/sync.js +95 -87
  830. package/lib/sync/sync.js.map +1 -1
  831. package/lib/sync/types.d.ts +43 -0
  832. package/lib/sync/types.d.ts.map +1 -0
  833. package/lib/sync/types.js +34 -0
  834. package/lib/sync/types.js.map +1 -0
  835. package/lib/sync/unknownBlock.d.ts +42 -29
  836. package/lib/sync/unknownBlock.d.ts.map +1 -0
  837. package/lib/sync/unknownBlock.js +407 -462
  838. package/lib/sync/unknownBlock.js.map +1 -1
  839. package/lib/sync/utils/downloadByRange.d.ts +187 -0
  840. package/lib/sync/utils/downloadByRange.d.ts.map +1 -0
  841. package/lib/sync/utils/downloadByRange.js +462 -0
  842. package/lib/sync/utils/downloadByRange.js.map +1 -0
  843. package/lib/sync/utils/downloadByRoot.d.ts +121 -0
  844. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -0
  845. package/lib/sync/utils/downloadByRoot.js +347 -0
  846. package/lib/sync/utils/downloadByRoot.js.map +1 -0
  847. package/lib/sync/utils/pendingBlocksTree.d.ts +14 -6
  848. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -0
  849. package/lib/sync/utils/pendingBlocksTree.js +24 -18
  850. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  851. package/lib/sync/utils/remoteSyncType.d.ts.map +1 -0
  852. package/lib/util/address.d.ts.map +1 -0
  853. package/lib/util/array.d.ts.map +1 -0
  854. package/lib/util/array.js +7 -3
  855. package/lib/util/array.js.map +1 -1
  856. package/lib/util/asyncIterableToEvents.d.ts.map +1 -0
  857. package/lib/util/asyncIterableToEvents.js +6 -3
  858. package/lib/util/asyncIterableToEvents.js.map +1 -1
  859. package/lib/util/binarySearch.d.ts.map +1 -0
  860. package/lib/util/binarySearch.js +2 -0
  861. package/lib/util/binarySearch.js.map +1 -1
  862. package/lib/util/bitArray.d.ts.map +1 -0
  863. package/lib/util/blobs.d.ts +2 -2
  864. package/lib/util/blobs.d.ts.map +1 -0
  865. package/lib/util/blobs.js +9 -7
  866. package/lib/util/blobs.js.map +1 -1
  867. package/lib/util/bufferPool.d.ts.map +1 -0
  868. package/lib/util/bufferPool.js +7 -2
  869. package/lib/util/bufferPool.js.map +1 -1
  870. package/lib/util/bytes.d.ts.map +1 -0
  871. package/lib/util/chunkify.d.ts.map +1 -0
  872. package/lib/util/clock.d.ts +9 -4
  873. package/lib/util/clock.d.ts.map +1 -0
  874. package/lib/util/clock.js +30 -22
  875. package/lib/util/clock.js.map +1 -1
  876. package/lib/util/dataColumns.d.ts +13 -10
  877. package/lib/util/dataColumns.d.ts.map +1 -0
  878. package/lib/util/dataColumns.js +95 -135
  879. package/lib/util/dataColumns.js.map +1 -1
  880. package/lib/util/dependentRoot.d.ts.map +1 -0
  881. package/lib/util/enum.d.ts.map +1 -0
  882. package/lib/util/error.d.ts.map +1 -0
  883. package/lib/util/eventLoop.d.ts.map +1 -0
  884. package/lib/util/execution.d.ts +20 -0
  885. package/lib/util/execution.d.ts.map +1 -0
  886. package/lib/util/execution.js +165 -0
  887. package/lib/util/execution.js.map +1 -0
  888. package/lib/util/file.d.ts.map +1 -0
  889. package/lib/util/forkChoice.d.ts.map +1 -0
  890. package/lib/util/forkName.d.ts.map +1 -0
  891. package/lib/util/graffiti.d.ts.map +1 -0
  892. package/lib/util/hex.d.ts.map +1 -0
  893. package/lib/util/index.d.ts.map +1 -0
  894. package/lib/util/ip.d.ts.map +1 -0
  895. package/lib/util/itTrigger.d.ts.map +1 -0
  896. package/lib/util/itTrigger.js +4 -4
  897. package/lib/util/itTrigger.js.map +1 -1
  898. package/lib/util/kzg.d.ts.map +1 -0
  899. package/lib/util/map.d.ts.map +1 -0
  900. package/lib/util/map.js +2 -0
  901. package/lib/util/map.js.map +1 -1
  902. package/lib/util/metadata.d.ts.map +1 -0
  903. package/lib/util/multifork.d.ts.map +1 -0
  904. package/lib/util/numpy.d.ts.map +1 -0
  905. package/lib/util/peerId.d.ts.map +1 -0
  906. package/lib/util/profile.d.ts.map +1 -0
  907. package/lib/util/promises.d.ts.map +1 -0
  908. package/lib/util/queue/errors.d.ts.map +1 -0
  909. package/lib/util/queue/fnQueue.d.ts.map +1 -0
  910. package/lib/util/queue/index.d.ts +1 -1
  911. package/lib/util/queue/index.d.ts.map +1 -0
  912. package/lib/util/queue/index.js +1 -1
  913. package/lib/util/queue/index.js.map +1 -1
  914. package/lib/util/queue/itemQueue.d.ts.map +1 -0
  915. package/lib/util/queue/itemQueue.js +52 -49
  916. package/lib/util/queue/itemQueue.js.map +1 -1
  917. package/lib/util/queue/options.d.ts.map +1 -0
  918. package/lib/util/serializedCache.d.ts.map +1 -0
  919. package/lib/util/serializedCache.js +1 -3
  920. package/lib/util/serializedCache.js.map +1 -1
  921. package/lib/util/set.d.ts.map +1 -0
  922. package/lib/util/set.js +2 -0
  923. package/lib/util/set.js.map +1 -1
  924. package/lib/util/shuffle.d.ts.map +1 -0
  925. package/lib/util/sortBy.d.ts.map +1 -0
  926. package/lib/util/sszBytes.d.ts +1 -0
  927. package/lib/util/sszBytes.d.ts.map +1 -0
  928. package/lib/util/sszBytes.js +1 -1
  929. package/lib/util/sszBytes.js.map +1 -1
  930. package/lib/util/strictEvents.d.ts.map +1 -0
  931. package/lib/util/time.d.ts.map +1 -0
  932. package/lib/util/timeSeries.d.ts.map +1 -0
  933. package/lib/util/timeSeries.js +3 -1
  934. package/lib/util/timeSeries.js.map +1 -1
  935. package/lib/util/types.d.ts +1 -1
  936. package/lib/util/types.d.ts.map +1 -0
  937. package/lib/util/types.js +2 -2
  938. package/lib/util/types.js.map +1 -1
  939. package/lib/util/workerEvents.d.ts.map +1 -0
  940. package/lib/util/wrapError.d.ts +7 -0
  941. package/lib/util/wrapError.d.ts.map +1 -0
  942. package/package.json +39 -23
  943. package/src/api/impl/api.ts +26 -0
  944. package/src/api/impl/beacon/blocks/index.ts +753 -0
  945. package/src/api/impl/beacon/blocks/utils.ts +75 -0
  946. package/src/api/impl/beacon/index.ts +35 -0
  947. package/src/api/impl/beacon/pool/index.ts +314 -0
  948. package/src/api/impl/beacon/rewards/index.ts +30 -0
  949. package/src/api/impl/beacon/state/index.ts +406 -0
  950. package/src/api/impl/beacon/state/utils.ts +189 -0
  951. package/src/api/impl/config/constants.ts +135 -0
  952. package/src/api/impl/config/index.ts +59 -0
  953. package/src/api/impl/debug/index.ts +131 -0
  954. package/src/api/impl/errors.ts +50 -0
  955. package/src/api/impl/events/index.ts +33 -0
  956. package/src/api/impl/index.ts +6 -0
  957. package/src/api/impl/lightclient/index.ts +64 -0
  958. package/src/api/impl/lodestar/index.ts +257 -0
  959. package/src/api/impl/node/index.ts +88 -0
  960. package/src/api/impl/node/utils.ts +51 -0
  961. package/src/api/impl/proof/index.ts +60 -0
  962. package/src/api/impl/types.ts +17 -0
  963. package/src/api/impl/utils.ts +25 -0
  964. package/src/api/impl/validator/index.ts +1526 -0
  965. package/src/api/impl/validator/utils.ts +85 -0
  966. package/src/api/index.ts +2 -0
  967. package/src/api/options.ts +16 -0
  968. package/src/api/rest/activeSockets.ts +109 -0
  969. package/src/api/rest/base.ts +216 -0
  970. package/src/api/rest/index.ts +63 -0
  971. package/src/api/rest/swaggerUI.ts +80 -0
  972. package/src/bun-wrappers/prometheus-gc-stats.ts +7 -0
  973. package/src/chain/ColumnReconstructionTracker.ts +90 -0
  974. package/src/chain/GetBlobsTracker.ts +115 -0
  975. package/src/chain/archiveStore/archiveStore.ts +222 -0
  976. package/src/chain/archiveStore/constants.ts +5 -0
  977. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +116 -0
  978. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +68 -0
  979. package/src/chain/archiveStore/historicalState/metrics.ts +214 -0
  980. package/src/chain/archiveStore/historicalState/types.ts +41 -0
  981. package/src/chain/archiveStore/historicalState/worker.ts +77 -0
  982. package/src/chain/archiveStore/index.ts +3 -0
  983. package/src/chain/archiveStore/interface.ts +75 -0
  984. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +138 -0
  985. package/src/chain/archiveStore/utils/archiveBlocks.ts +437 -0
  986. package/src/chain/archiveStore/utils/pruneHistory.ts +56 -0
  987. package/src/chain/archiveStore/utils/updateBackfillRange.ts +50 -0
  988. package/src/chain/balancesCache.ts +52 -0
  989. package/src/chain/beaconProposerCache.ts +43 -0
  990. package/src/chain/blocks/blockInput/blockInput.ts +854 -0
  991. package/src/chain/blocks/blockInput/errors.ts +48 -0
  992. package/src/chain/blocks/blockInput/index.ts +4 -0
  993. package/src/chain/blocks/blockInput/types.ts +145 -0
  994. package/src/chain/blocks/blockInput/utils.ts +21 -0
  995. package/src/chain/blocks/importBlock.ts +599 -0
  996. package/src/chain/blocks/index.ts +179 -0
  997. package/src/chain/blocks/types.ts +101 -0
  998. package/src/chain/blocks/utils/blowfishBanner.ts +28 -0
  999. package/src/chain/blocks/utils/chainSegment.ts +29 -0
  1000. package/src/chain/blocks/utils/checkpoint.ts +25 -0
  1001. package/src/chain/blocks/utils/giraffeBanner.ts +30 -0
  1002. package/src/chain/blocks/utils/ownBanner.ts +20 -0
  1003. package/src/chain/blocks/utils/pandaMergeTransitionBanner.ts +43 -0
  1004. package/src/chain/blocks/utils/zebraBanner.ts +45 -0
  1005. package/src/chain/blocks/verifyBlock.ts +242 -0
  1006. package/src/chain/blocks/verifyBlocksDataAvailability.ts +42 -0
  1007. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +438 -0
  1008. package/src/chain/blocks/verifyBlocksSanityChecks.ts +129 -0
  1009. package/src/chain/blocks/verifyBlocksSignatures.ts +105 -0
  1010. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +114 -0
  1011. package/src/chain/blocks/writeBlockInputToDb.ts +120 -0
  1012. package/src/chain/bls/index.ts +4 -0
  1013. package/src/chain/bls/interface.ts +68 -0
  1014. package/src/chain/bls/maybeBatch.ts +45 -0
  1015. package/src/chain/bls/multithread/index.ts +582 -0
  1016. package/src/chain/bls/multithread/jobItem.ts +119 -0
  1017. package/src/chain/bls/multithread/poolSize.ts +16 -0
  1018. package/src/chain/bls/multithread/types.ts +38 -0
  1019. package/src/chain/bls/multithread/utils.ts +19 -0
  1020. package/src/chain/bls/multithread/worker.ts +114 -0
  1021. package/src/chain/bls/singleThread.ts +87 -0
  1022. package/src/chain/bls/utils.ts +30 -0
  1023. package/src/chain/chain.ts +1352 -0
  1024. package/src/chain/emitter.ts +113 -0
  1025. package/src/chain/errors/attestationError.ts +194 -0
  1026. package/src/chain/errors/attesterSlashingError.ts +11 -0
  1027. package/src/chain/errors/blobSidecarError.ts +60 -0
  1028. package/src/chain/errors/blockError.ts +166 -0
  1029. package/src/chain/errors/blsToExecutionChangeError.ts +13 -0
  1030. package/src/chain/errors/dataColumnSidecarError.ts +80 -0
  1031. package/src/chain/errors/gossipValidation.ts +20 -0
  1032. package/src/chain/errors/index.ts +10 -0
  1033. package/src/chain/errors/lightClientError.ts +30 -0
  1034. package/src/chain/errors/proposerSlashingError.ts +11 -0
  1035. package/src/chain/errors/syncCommitteeError.ts +36 -0
  1036. package/src/chain/errors/voluntaryExitError.ts +13 -0
  1037. package/src/chain/forkChoice/index.ts +112 -0
  1038. package/src/chain/genesis/genesis.ts +190 -0
  1039. package/src/chain/genesis/interface.ts +14 -0
  1040. package/src/chain/index.ts +6 -0
  1041. package/src/chain/initState.ts +221 -0
  1042. package/src/chain/interface.ts +280 -0
  1043. package/src/chain/lightClient/index.ts +772 -0
  1044. package/src/chain/lightClient/proofs.ts +85 -0
  1045. package/src/chain/lightClient/types.ts +33 -0
  1046. package/src/chain/opPools/aggregatedAttestationPool.ts +1063 -0
  1047. package/src/chain/opPools/attestationPool.ts +282 -0
  1048. package/src/chain/opPools/index.ts +5 -0
  1049. package/src/chain/opPools/opPool.ts +462 -0
  1050. package/src/chain/opPools/syncCommitteeMessagePool.ts +169 -0
  1051. package/src/chain/opPools/syncContributionAndProofPool.ts +240 -0
  1052. package/src/chain/opPools/types.ts +35 -0
  1053. package/src/chain/opPools/utils.ts +65 -0
  1054. package/src/chain/options.ts +138 -0
  1055. package/src/chain/prepareNextSlot.ts +277 -0
  1056. package/src/chain/produceBlock/computeNewStateRoot.ts +55 -0
  1057. package/src/chain/produceBlock/index.ts +2 -0
  1058. package/src/chain/produceBlock/produceBlockBody.ts +799 -0
  1059. package/src/chain/produceBlock/validateBlobsAndKzgCommitments.ts +54 -0
  1060. package/src/chain/regen/errors.ts +30 -0
  1061. package/src/chain/regen/index.ts +4 -0
  1062. package/src/chain/regen/interface.ts +94 -0
  1063. package/src/chain/regen/queued.ts +317 -0
  1064. package/src/chain/regen/regen.ts +424 -0
  1065. package/src/chain/reprocess.ts +161 -0
  1066. package/src/chain/rewards/attestationsRewards.ts +196 -0
  1067. package/src/chain/rewards/blockRewards.ts +150 -0
  1068. package/src/chain/rewards/syncCommitteeRewards.ts +58 -0
  1069. package/src/chain/seenCache/index.ts +5 -0
  1070. package/src/chain/seenCache/seenAggregateAndProof.ts +120 -0
  1071. package/src/chain/seenCache/seenAttestationData.ts +145 -0
  1072. package/src/chain/seenCache/seenAttesters.ts +58 -0
  1073. package/src/chain/seenCache/seenBlockAttesters.ts +18 -0
  1074. package/src/chain/seenCache/seenBlockProposers.ts +48 -0
  1075. package/src/chain/seenCache/seenCommittee.ts +43 -0
  1076. package/src/chain/seenCache/seenCommitteeContribution.ts +104 -0
  1077. package/src/chain/seenCache/seenGossipBlockInput.ts +381 -0
  1078. package/src/chain/serializeState.ts +32 -0
  1079. package/src/chain/shufflingCache.ts +238 -0
  1080. package/src/chain/stateCache/blockStateCacheImpl.ts +150 -0
  1081. package/src/chain/stateCache/datastore/db.ts +36 -0
  1082. package/src/chain/stateCache/datastore/file.ts +53 -0
  1083. package/src/chain/stateCache/datastore/index.ts +2 -0
  1084. package/src/chain/stateCache/datastore/types.ts +13 -0
  1085. package/src/chain/stateCache/fifoBlockStateCache.ts +208 -0
  1086. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +198 -0
  1087. package/src/chain/stateCache/index.ts +3 -0
  1088. package/src/chain/stateCache/mapMetrics.ts +52 -0
  1089. package/src/chain/stateCache/persistentCheckpointsCache.ts +837 -0
  1090. package/src/chain/stateCache/types.ts +86 -0
  1091. package/src/chain/validation/aggregateAndProof.ts +258 -0
  1092. package/src/chain/validation/attestation.ts +885 -0
  1093. package/src/chain/validation/attesterSlashing.ts +61 -0
  1094. package/src/chain/validation/blobSidecar.ts +301 -0
  1095. package/src/chain/validation/block.ts +188 -0
  1096. package/src/chain/validation/blsToExecutionChange.ts +61 -0
  1097. package/src/chain/validation/dataColumnSidecar.ts +381 -0
  1098. package/src/chain/validation/index.ts +9 -0
  1099. package/src/chain/validation/lightClientFinalityUpdate.ts +46 -0
  1100. package/src/chain/validation/lightClientOptimisticUpdate.ts +68 -0
  1101. package/src/chain/validation/proposerSlashing.ts +54 -0
  1102. package/src/chain/validation/signatureSets/aggregateAndProof.ts +38 -0
  1103. package/src/chain/validation/signatureSets/contributionAndProof.ts +27 -0
  1104. package/src/chain/validation/signatureSets/index.ts +6 -0
  1105. package/src/chain/validation/signatureSets/selectionProof.ts +27 -0
  1106. package/src/chain/validation/signatureSets/syncCommittee.ts +22 -0
  1107. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +18 -0
  1108. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +27 -0
  1109. package/src/chain/validation/syncCommittee.ts +165 -0
  1110. package/src/chain/validation/syncCommitteeContributionAndProof.ts +122 -0
  1111. package/src/chain/validation/voluntaryExit.ts +58 -0
  1112. package/src/chain/validatorMonitor.ts +1310 -0
  1113. package/src/constants/constants.ts +15 -0
  1114. package/src/constants/index.ts +2 -0
  1115. package/src/constants/network.ts +52 -0
  1116. package/src/db/beacon.ts +113 -0
  1117. package/src/db/buckets.ts +80 -0
  1118. package/src/db/index.ts +2 -0
  1119. package/src/db/interface.ts +76 -0
  1120. package/src/db/options.ts +7 -0
  1121. package/src/db/repositories/attesterSlashing.ts +38 -0
  1122. package/src/db/repositories/backfilledRanges.ts +29 -0
  1123. package/src/db/repositories/blobSidecars.ts +37 -0
  1124. package/src/db/repositories/blobSidecarsArchive.ts +28 -0
  1125. package/src/db/repositories/block.ts +33 -0
  1126. package/src/db/repositories/blockArchive.ts +170 -0
  1127. package/src/db/repositories/blockArchiveIndex.ts +45 -0
  1128. package/src/db/repositories/blsToExecutionChange.ts +16 -0
  1129. package/src/db/repositories/checkpointState.ts +31 -0
  1130. package/src/db/repositories/dataColumnSidecar.ts +49 -0
  1131. package/src/db/repositories/dataColumnSidecarArchive.ts +56 -0
  1132. package/src/db/repositories/depositDataRoot.ts +80 -0
  1133. package/src/db/repositories/depositEvent.ts +32 -0
  1134. package/src/db/repositories/eth1Data.ts +33 -0
  1135. package/src/db/repositories/index.ts +20 -0
  1136. package/src/db/repositories/lightclientBestUpdate.ts +41 -0
  1137. package/src/db/repositories/lightclientCheckpointHeader.ts +32 -0
  1138. package/src/db/repositories/lightclientSyncCommittee.ts +16 -0
  1139. package/src/db/repositories/lightclientSyncCommitteeWitness.ts +77 -0
  1140. package/src/db/repositories/proposerSlashing.ts +15 -0
  1141. package/src/db/repositories/stateArchive.ts +69 -0
  1142. package/src/db/repositories/stateArchiveIndex.ts +18 -0
  1143. package/src/db/repositories/voluntaryExit.ts +15 -0
  1144. package/src/db/single/index.ts +2 -0
  1145. package/src/db/single/preGenesisState.ts +37 -0
  1146. package/src/db/single/preGenesisStateLastProcessedBlock.ts +34 -0
  1147. package/src/eth1/errors.ts +40 -0
  1148. package/src/eth1/eth1DataCache.ts +26 -0
  1149. package/src/eth1/eth1DepositDataTracker.ts +410 -0
  1150. package/src/eth1/eth1DepositsCache.ts +141 -0
  1151. package/src/eth1/eth1MergeBlockTracker.ts +328 -0
  1152. package/src/eth1/index.ts +157 -0
  1153. package/src/eth1/interface.ts +131 -0
  1154. package/src/eth1/options.ts +28 -0
  1155. package/src/eth1/provider/eth1Provider.ts +229 -0
  1156. package/src/eth1/provider/jsonRpcHttpClient.ts +390 -0
  1157. package/src/eth1/provider/jwt.ts +36 -0
  1158. package/src/eth1/provider/utils.ts +136 -0
  1159. package/src/eth1/stream.ts +75 -0
  1160. package/src/eth1/utils/depositContract.ts +37 -0
  1161. package/src/eth1/utils/deposits.ts +70 -0
  1162. package/src/eth1/utils/eth1Data.ts +100 -0
  1163. package/src/eth1/utils/eth1DepositEvent.ts +12 -0
  1164. package/src/eth1/utils/eth1Vote.ts +142 -0
  1165. package/src/eth1/utils/groupDepositEventsByBlock.ts +19 -0
  1166. package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +18 -0
  1167. package/src/execution/builder/cache.ts +39 -0
  1168. package/src/execution/builder/http.ts +229 -0
  1169. package/src/execution/builder/index.ts +27 -0
  1170. package/src/execution/builder/interface.ts +49 -0
  1171. package/src/execution/builder/utils.ts +19 -0
  1172. package/src/execution/engine/disabled.ts +35 -0
  1173. package/src/execution/engine/http.ts +644 -0
  1174. package/src/execution/engine/index.ts +63 -0
  1175. package/src/execution/engine/interface.ts +199 -0
  1176. package/src/execution/engine/mock.ts +493 -0
  1177. package/src/execution/engine/payloadIdCache.ts +54 -0
  1178. package/src/execution/engine/types.ts +640 -0
  1179. package/src/execution/engine/utils.ts +136 -0
  1180. package/src/execution/index.ts +4 -0
  1181. package/src/index.ts +20 -0
  1182. package/src/metrics/index.ts +4 -0
  1183. package/src/metrics/metrics/beacon.ts +390 -0
  1184. package/src/metrics/metrics/lodestar.ts +1870 -0
  1185. package/src/metrics/metrics.ts +43 -0
  1186. package/src/metrics/nodeJsMetrics.ts +19 -0
  1187. package/src/metrics/options.ts +22 -0
  1188. package/src/metrics/server/http.ts +114 -0
  1189. package/src/metrics/server/index.ts +1 -0
  1190. package/src/metrics/utils/avgMinMax.ts +87 -0
  1191. package/src/metrics/utils/gauge.ts +22 -0
  1192. package/src/metrics/utils/registryMetricCreator.ts +41 -0
  1193. package/src/monitoring/clientStats.ts +297 -0
  1194. package/src/monitoring/index.ts +2 -0
  1195. package/src/monitoring/options.ts +19 -0
  1196. package/src/monitoring/properties.ts +152 -0
  1197. package/src/monitoring/service.ts +235 -0
  1198. package/src/monitoring/system.ts +146 -0
  1199. package/src/monitoring/types.ts +21 -0
  1200. package/src/network/core/events.ts +59 -0
  1201. package/src/network/core/index.ts +3 -0
  1202. package/src/network/core/metrics.ts +304 -0
  1203. package/src/network/core/networkCore.ts +599 -0
  1204. package/src/network/core/networkCoreWorker.ts +176 -0
  1205. package/src/network/core/networkCoreWorkerHandler.ts +284 -0
  1206. package/src/network/core/types.ts +119 -0
  1207. package/src/network/discv5/index.ts +132 -0
  1208. package/src/network/discv5/types.ts +74 -0
  1209. package/src/network/discv5/utils.ts +50 -0
  1210. package/src/network/discv5/worker.ts +137 -0
  1211. package/src/network/events.ts +51 -0
  1212. package/src/network/forks.ts +94 -0
  1213. package/src/network/gossip/constants.ts +15 -0
  1214. package/src/network/gossip/encoding.ts +111 -0
  1215. package/src/network/gossip/errors.ts +7 -0
  1216. package/src/network/gossip/gossipsub.ts +384 -0
  1217. package/src/network/gossip/index.ts +4 -0
  1218. package/src/network/gossip/interface.ts +215 -0
  1219. package/src/network/gossip/metrics.ts +71 -0
  1220. package/src/network/gossip/scoringParameters.ts +333 -0
  1221. package/src/network/gossip/topic.ts +332 -0
  1222. package/src/network/index.ts +8 -0
  1223. package/src/network/interface.ts +134 -0
  1224. package/src/network/libp2p/error.ts +55 -0
  1225. package/src/network/libp2p/index.ts +153 -0
  1226. package/src/network/metadata.ts +162 -0
  1227. package/src/network/network.ts +767 -0
  1228. package/src/network/networkConfig.ts +12 -0
  1229. package/src/network/options.ts +70 -0
  1230. package/src/network/peers/client.ts +29 -0
  1231. package/src/network/peers/datastore.ts +188 -0
  1232. package/src/network/peers/discover.ts +647 -0
  1233. package/src/network/peers/index.ts +2 -0
  1234. package/src/network/peers/peerManager.ts +900 -0
  1235. package/src/network/peers/peersData.ts +65 -0
  1236. package/src/network/peers/score/constants.ts +34 -0
  1237. package/src/network/peers/score/index.ts +4 -0
  1238. package/src/network/peers/score/interface.ts +74 -0
  1239. package/src/network/peers/score/score.ts +200 -0
  1240. package/src/network/peers/score/store.ts +95 -0
  1241. package/src/network/peers/score/utils.ts +37 -0
  1242. package/src/network/peers/utils/assertPeerRelevance.ts +99 -0
  1243. package/src/network/peers/utils/enrSubnetsDeserialize.ts +27 -0
  1244. package/src/network/peers/utils/getConnectedPeerIds.ts +33 -0
  1245. package/src/network/peers/utils/index.ts +4 -0
  1246. package/src/network/peers/utils/prioritizePeers.ts +627 -0
  1247. package/src/network/peers/utils/subnetMap.ts +88 -0
  1248. package/src/network/processor/aggregatorTracker.ts +38 -0
  1249. package/src/network/processor/extractSlotRootFns.ts +64 -0
  1250. package/src/network/processor/gossipHandlers.ts +951 -0
  1251. package/src/network/processor/gossipQueues/index.ts +114 -0
  1252. package/src/network/processor/gossipQueues/indexed.ts +219 -0
  1253. package/src/network/processor/gossipQueues/linear.ts +162 -0
  1254. package/src/network/processor/gossipQueues/types.ts +57 -0
  1255. package/src/network/processor/gossipValidatorFn.ts +142 -0
  1256. package/src/network/processor/index.ts +496 -0
  1257. package/src/network/processor/types.ts +27 -0
  1258. package/src/network/reqresp/ReqRespBeaconNode.ts +373 -0
  1259. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +101 -0
  1260. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +49 -0
  1261. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +114 -0
  1262. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +62 -0
  1263. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +144 -0
  1264. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +88 -0
  1265. package/src/network/reqresp/handlers/index.ts +78 -0
  1266. package/src/network/reqresp/handlers/lightClientBootstrap.ts +31 -0
  1267. package/src/network/reqresp/handlers/lightClientFinalityUpdate.ts +21 -0
  1268. package/src/network/reqresp/handlers/lightClientOptimisticUpdate.ts +21 -0
  1269. package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +39 -0
  1270. package/src/network/reqresp/index.ts +2 -0
  1271. package/src/network/reqresp/interface.ts +45 -0
  1272. package/src/network/reqresp/protocols.ts +146 -0
  1273. package/src/network/reqresp/rateLimit.ts +112 -0
  1274. package/src/network/reqresp/score.ts +70 -0
  1275. package/src/network/reqresp/types.ts +174 -0
  1276. package/src/network/reqresp/utils/collect.ts +84 -0
  1277. package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +57 -0
  1278. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +99 -0
  1279. package/src/network/statusCache.ts +17 -0
  1280. package/src/network/subnets/attnetsService.ts +382 -0
  1281. package/src/network/subnets/index.ts +2 -0
  1282. package/src/network/subnets/interface.ts +66 -0
  1283. package/src/network/subnets/syncnetsService.ts +147 -0
  1284. package/src/network/subnets/util.ts +63 -0
  1285. package/src/network/util.ts +29 -0
  1286. package/src/node/index.ts +2 -0
  1287. package/src/node/nodejs.ts +349 -0
  1288. package/src/node/notifier.ts +206 -0
  1289. package/src/node/options.ts +51 -0
  1290. package/src/node/utils/interop/deposits.ts +53 -0
  1291. package/src/node/utils/interop/state.ts +59 -0
  1292. package/src/node/utils/lightclient.ts +7 -0
  1293. package/src/node/utils/state.ts +37 -0
  1294. package/src/sync/backfill/backfill.ts +893 -0
  1295. package/src/sync/backfill/errors.ts +23 -0
  1296. package/src/sync/backfill/index.ts +1 -0
  1297. package/src/sync/backfill/verify.ts +58 -0
  1298. package/src/sync/constants.ts +71 -0
  1299. package/src/sync/index.ts +2 -0
  1300. package/src/sync/interface.ts +55 -0
  1301. package/src/sync/options.ts +45 -0
  1302. package/src/sync/range/batch.ts +455 -0
  1303. package/src/sync/range/chain.ts +715 -0
  1304. package/src/sync/range/range.ts +354 -0
  1305. package/src/sync/range/utils/batches.ts +119 -0
  1306. package/src/sync/range/utils/chainTarget.ts +62 -0
  1307. package/src/sync/range/utils/hashBlocks.ts +27 -0
  1308. package/src/sync/range/utils/index.ts +5 -0
  1309. package/src/sync/range/utils/peerBalancer.ts +184 -0
  1310. package/src/sync/range/utils/updateChains.ts +66 -0
  1311. package/src/sync/sync.ts +290 -0
  1312. package/src/sync/types.ts +57 -0
  1313. package/src/sync/unknownBlock.ts +860 -0
  1314. package/src/sync/utils/downloadByRange.ts +814 -0
  1315. package/src/sync/utils/downloadByRoot.ts +568 -0
  1316. package/src/sync/utils/pendingBlocksTree.ts +97 -0
  1317. package/src/sync/utils/remoteSyncType.ts +144 -0
  1318. package/src/util/address.ts +3 -0
  1319. package/src/util/array.ts +311 -0
  1320. package/src/util/asyncIterableToEvents.ts +164 -0
  1321. package/src/util/binarySearch.ts +48 -0
  1322. package/src/util/bitArray.ts +84 -0
  1323. package/src/util/blobs.ts +210 -0
  1324. package/src/util/bufferPool.ts +95 -0
  1325. package/src/util/bytes.ts +11 -0
  1326. package/src/util/chunkify.ts +27 -0
  1327. package/src/util/clock.ts +212 -0
  1328. package/src/util/dataColumns.ts +424 -0
  1329. package/src/util/dependentRoot.ts +47 -0
  1330. package/src/util/enum.ts +17 -0
  1331. package/src/util/error.ts +56 -0
  1332. package/src/util/eventLoop.ts +22 -0
  1333. package/src/util/execution.ts +223 -0
  1334. package/src/util/file.ts +52 -0
  1335. package/src/util/forkChoice.ts +5 -0
  1336. package/src/util/forkName.ts +20 -0
  1337. package/src/util/graffiti.ts +39 -0
  1338. package/src/util/hex.ts +9 -0
  1339. package/src/util/index.ts +2 -0
  1340. package/src/util/ip.ts +6 -0
  1341. package/src/util/itTrigger.ts +49 -0
  1342. package/src/util/kzg.ts +3 -0
  1343. package/src/util/map.ts +77 -0
  1344. package/src/util/metadata.ts +22 -0
  1345. package/src/util/multifork.ts +69 -0
  1346. package/src/util/numpy.ts +8 -0
  1347. package/src/util/peerId.ts +16 -0
  1348. package/src/util/profile.ts +54 -0
  1349. package/src/util/promises.ts +14 -0
  1350. package/src/util/queue/errors.ts +14 -0
  1351. package/src/util/queue/fnQueue.ts +16 -0
  1352. package/src/util/queue/index.ts +4 -0
  1353. package/src/util/queue/itemQueue.ts +128 -0
  1354. package/src/util/queue/options.ts +37 -0
  1355. package/src/util/serializedCache.ts +20 -0
  1356. package/src/util/set.ts +62 -0
  1357. package/src/util/shuffle.ts +21 -0
  1358. package/src/util/sortBy.ts +19 -0
  1359. package/src/util/sszBytes.ts +481 -0
  1360. package/src/util/strictEvents.ts +8 -0
  1361. package/src/util/time.ts +13 -0
  1362. package/src/util/timeSeries.ts +118 -0
  1363. package/src/util/types.ts +31 -0
  1364. package/src/util/workerEvents.ts +142 -0
  1365. package/src/util/wrapError.ts +27 -0
  1366. package/lib/chain/seenCache/seenBlockInput.d.ts +0 -84
  1367. package/lib/chain/seenCache/seenBlockInput.js +0 -225
  1368. package/lib/chain/seenCache/seenBlockInput.js.map +0 -1
  1369. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +0 -28
  1370. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +0 -328
  1371. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +0 -1
  1372. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +0 -49
  1373. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +0 -499
  1374. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +0 -1
@@ -0,0 +1,1526 @@
1
+ import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
2
+ import {routes} from "@lodestar/api";
3
+ import {ApplicationMethods} from "@lodestar/api/server";
4
+ import {ExecutionStatus} from "@lodestar/fork-choice";
5
+ import {
6
+ ForkName,
7
+ ForkPostBellatrix,
8
+ ForkPreGloas,
9
+ ForkSeq,
10
+ GENESIS_SLOT,
11
+ SLOTS_PER_EPOCH,
12
+ SLOTS_PER_HISTORICAL_ROOT,
13
+ SYNC_COMMITTEE_SUBNET_SIZE,
14
+ isForkPostBellatrix,
15
+ isForkPostDeneb,
16
+ isForkPostElectra,
17
+ } from "@lodestar/params";
18
+ import {
19
+ CachedBeaconStateAllForks,
20
+ DataAvailabilityStatus,
21
+ attesterShufflingDecisionRoot,
22
+ beaconBlockToBlinded,
23
+ calculateCommitteeAssignments,
24
+ computeEpochAtSlot,
25
+ computeStartSlotAtEpoch,
26
+ computeTimeAtSlot,
27
+ createCachedBeaconState,
28
+ getBlockRootAtSlot,
29
+ getCurrentSlot,
30
+ loadState,
31
+ proposerShufflingDecisionRoot,
32
+ } from "@lodestar/state-transition";
33
+ import {
34
+ BLSSignature,
35
+ BeaconBlock,
36
+ BlindedBeaconBlock,
37
+ BlockContents,
38
+ Bytes32,
39
+ CommitteeIndex,
40
+ Epoch,
41
+ ProducedBlockSource,
42
+ Root,
43
+ Slot,
44
+ ValidatorIndex,
45
+ Wei,
46
+ bellatrix,
47
+ getValidatorStatus,
48
+ phase0,
49
+ ssz,
50
+ } from "@lodestar/types";
51
+ import {
52
+ TimeoutError,
53
+ defer,
54
+ formatWeiToEth,
55
+ fromHex,
56
+ prettyWeiToEth,
57
+ resolveOrRacePromises,
58
+ toHex,
59
+ toRootHex,
60
+ } from "@lodestar/utils";
61
+ import {MAX_BUILDER_BOOST_FACTOR} from "@lodestar/validator";
62
+ import {BlockInputSource} from "../../../chain/blocks/blockInput/types.js";
63
+ import {
64
+ AttestationError,
65
+ AttestationErrorCode,
66
+ GossipAction,
67
+ SyncCommitteeError,
68
+ SyncCommitteeErrorCode,
69
+ } from "../../../chain/errors/index.js";
70
+ import {ChainEvent, CheckpointHex, CommonBlockBody} from "../../../chain/index.js";
71
+ import {PREPARE_NEXT_SLOT_BPS} from "../../../chain/prepareNextSlot.js";
72
+ import {BlockType, ProduceFullDeneb} from "../../../chain/produceBlock/index.js";
73
+ import {RegenCaller} from "../../../chain/regen/index.js";
74
+ import {validateApiAggregateAndProof} from "../../../chain/validation/index.js";
75
+ import {validateSyncCommitteeGossipContributionAndProof} from "../../../chain/validation/syncCommitteeContributionAndProof.js";
76
+ import {ZERO_HASH} from "../../../constants/index.js";
77
+ import {BuilderStatus, NoBidReceived} from "../../../execution/builder/http.js";
78
+ import {validateGossipFnRetryUnknownRoot} from "../../../network/processor/gossipHandlers.js";
79
+ import {CommitteeSubscription} from "../../../network/subnets/index.js";
80
+ import {SyncState} from "../../../sync/index.js";
81
+ import {callInNextEventLoop} from "../../../util/eventLoop.js";
82
+ import {isOptimisticBlock} from "../../../util/forkChoice.js";
83
+ import {getDefaultGraffiti, toGraffitiBytes} from "../../../util/graffiti.js";
84
+ import {getLodestarClientVersion} from "../../../util/metadata.js";
85
+ import {ApiOptions} from "../../options.js";
86
+ import {getStateResponseWithRegen} from "../beacon/state/utils.js";
87
+ import {ApiError, FailureList, IndexedError, NodeIsSyncing, OnlySupportedByDVT} from "../errors.js";
88
+ import {ApiModules} from "../types.js";
89
+ import {computeSubnetForCommitteesAtSlot, getPubkeysForIndices, selectBlockProductionSource} from "./utils.js";
90
+
91
+ /**
92
+ * If the node is within this many epochs from the head, we declare it to be synced regardless of
93
+ * the network sync state.
94
+ *
95
+ * This helps prevent attacks where nodes can convince us that we're syncing some non-existent
96
+ * finalized head.
97
+ *
98
+ * TODO: Lighthouse uses 8 for the attack described above. However, 8 kills Lodestar since validators
99
+ * can trigger regen to fast-forward head state 8 epochs to be immediately invalidated as sync sets
100
+ * a new head. Then the checkpoint state cache grows unbounded with very different states (because
101
+ * they are 8 epochs apart) and causes an OOM. Research a proper solution once regen and the state
102
+ * caches are better.
103
+ */
104
+ export const SYNC_TOLERANCE_EPOCHS = 1;
105
+
106
+ /**
107
+ * Cutoff time to wait from start of the slot for execution and builder block production apis to resolve.
108
+ * Post this time, race execution and builder to pick whatever resolves first.
109
+ *
110
+ * Empirically the builder block resolves in ~1 second, and execution block resolves in <500 ms.
111
+ * A cutoff of 2 seconds gives enough time and if there are unexpected delays it ensures we publish
112
+ * in time as proposals post 4 seconds into the slot will likely be orphaned due to proposer boost reorg.
113
+ *
114
+ * TODO GLOAS: re-evaluate cutoff timing
115
+ */
116
+ const BLOCK_PRODUCTION_RACE_CUTOFF_MS = 2_000;
117
+ /** Overall timeout for execution and block production apis */
118
+ const BLOCK_PRODUCTION_RACE_TIMEOUT_MS = 12_000;
119
+
120
+ type ProduceBlockContentsRes = {executionPayloadValue: Wei; consensusBlockValue: Wei} & {
121
+ data: BlockContents;
122
+ version: ForkName;
123
+ };
124
+ type ProduceBlindedBlockRes = {executionPayloadValue: Wei; consensusBlockValue: Wei} & {
125
+ data: BlindedBeaconBlock;
126
+ version: ForkPostBellatrix;
127
+ };
128
+
129
+ type ProduceBlindedBlockOrBlockContentsRes = {executionPayloadSource: ProducedBlockSource} & (
130
+ | (ProduceBlockContentsRes & {executionPayloadBlinded: false})
131
+ | (ProduceBlindedBlockRes & {executionPayloadBlinded: true})
132
+ );
133
+
134
+ /**
135
+ * Engine block selection reasons tracked in metrics / logs
136
+ */
137
+ export enum EngineBlockSelectionReason {
138
+ BuilderDisabled = "builder_disabled",
139
+ BuilderError = "builder_error",
140
+ BuilderTimeout = "builder_timeout",
141
+ BuilderPending = "builder_pending",
142
+ BuilderNoBid = "builder_no_bid",
143
+ BuilderCensorship = "builder_censorship",
144
+ BlockValue = "block_value",
145
+ EnginePreferred = "engine_preferred",
146
+ }
147
+
148
+ /**
149
+ * Builder block selection reasons tracked in metrics / logs
150
+ */
151
+ export enum BuilderBlockSelectionReason {
152
+ EngineDisabled = "engine_disabled",
153
+ EngineError = "engine_error",
154
+ EnginePending = "engine_pending",
155
+ BlockValue = "block_value",
156
+ BuilderPreferred = "builder_preferred",
157
+ }
158
+
159
+ export type BlockSelectionResult =
160
+ | {
161
+ source: ProducedBlockSource.engine;
162
+ reason: EngineBlockSelectionReason;
163
+ }
164
+ | {
165
+ source: ProducedBlockSource.builder;
166
+ reason: BuilderBlockSelectionReason;
167
+ };
168
+
169
+ /**
170
+ * Server implementation for handling validator duties.
171
+ * See `@lodestar/validator/src/api` for the client implementation).
172
+ */
173
+ export function getValidatorApi(
174
+ opts: ApiOptions,
175
+ {chain, config, logger, metrics, network, sync}: ApiModules
176
+ ): ApplicationMethods<routes.validator.Endpoints> {
177
+ let genesisBlockRoot: Root | null = null;
178
+
179
+ /**
180
+ * Validator clock may be advanced from beacon's clock. If the validator requests a resource in a
181
+ * future slot, wait some time instead of rejecting the request because it's in the future.
182
+ * This value is the same to MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC.
183
+ * For very fast networks, reduce clock disparity to half a slot.
184
+ */
185
+ const MAX_API_CLOCK_DISPARITY_SEC = Math.min(0.5, config.SLOT_DURATION_MS / 2000);
186
+ const MAX_API_CLOCK_DISPARITY_MS = MAX_API_CLOCK_DISPARITY_SEC * 1000;
187
+
188
+ /** Compute and cache the genesis block root */
189
+ async function getGenesisBlockRoot(state: CachedBeaconStateAllForks): Promise<Root> {
190
+ if (!genesisBlockRoot) {
191
+ // Close to genesis the genesis block may not be available in the DB
192
+ if (state.slot < SLOTS_PER_HISTORICAL_ROOT) {
193
+ genesisBlockRoot = state.blockRoots.get(0);
194
+ }
195
+
196
+ const blockRes = await chain.getCanonicalBlockAtSlot(GENESIS_SLOT);
197
+ if (blockRes) {
198
+ genesisBlockRoot = config
199
+ .getForkTypes(blockRes.block.message.slot)
200
+ .SignedBeaconBlock.hashTreeRoot(blockRes.block);
201
+ }
202
+ }
203
+
204
+ // If for some reason the genesisBlockRoot is not able don't prevent validators from
205
+ // proposing or attesting. If the genesisBlockRoot is wrong, at worst it may trigger a re-fetch of the duties
206
+ return genesisBlockRoot || ZERO_HASH;
207
+ }
208
+
209
+ /**
210
+ * If advancing the local clock `MAX_API_CLOCK_DISPARITY_MS` ticks to the requested slot, wait for its start
211
+ * Prevents the validator from getting errors from the API if the clock is a bit advanced
212
+ */
213
+ async function waitForSlot(slot: Slot): Promise<void> {
214
+ if (slot <= 0) {
215
+ return;
216
+ }
217
+
218
+ const slotStartSec = computeTimeAtSlot(config, slot, chain.genesisTime);
219
+ const msToSlot = slotStartSec * 1000 - Date.now();
220
+
221
+ if (msToSlot > MAX_API_CLOCK_DISPARITY_MS) {
222
+ throw Error(`Requested slot ${slot} is in the future`);
223
+ }
224
+
225
+ if (msToSlot > 0) {
226
+ await chain.clock.waitForSlot(slot);
227
+ }
228
+
229
+ // else, clock already in slot or slot is in the past
230
+ }
231
+
232
+ /**
233
+ * If advancing the local clock `MAX_API_CLOCK_DISPARITY_MS` ticks to the next epoch, wait for slot 0 of the next epoch.
234
+ * Prevents a validator from not being able to get the attestater duties correctly if the beacon and validator clocks are off
235
+ */
236
+ async function waitForNextClosestEpoch(): Promise<void> {
237
+ const toNextEpochMs = msToNextEpoch();
238
+ if (toNextEpochMs > 0 && toNextEpochMs < MAX_API_CLOCK_DISPARITY_MS) {
239
+ const nextEpoch = chain.clock.currentEpoch + 1;
240
+ await chain.clock.waitForSlot(computeStartSlotAtEpoch(nextEpoch));
241
+ }
242
+ }
243
+
244
+ /**
245
+ * Compute ms to the next epoch.
246
+ */
247
+ function msToNextEpoch(): number {
248
+ const nextEpoch = chain.clock.currentEpoch + 1;
249
+ const secPerEpoch = (SLOTS_PER_EPOCH * config.SLOT_DURATION_MS) / 1000;
250
+ const nextEpochStartSec = chain.genesisTime + nextEpoch * secPerEpoch;
251
+ return nextEpochStartSec * 1000 - Date.now();
252
+ }
253
+
254
+ function currentEpochWithDisparity(): Epoch {
255
+ return computeEpochAtSlot(getCurrentSlot(config, chain.genesisTime - MAX_API_CLOCK_DISPARITY_SEC));
256
+ }
257
+
258
+ function getBlockValueLogInfo(
259
+ block: {executionPayloadValue: bigint; consensusBlockValue: bigint},
260
+ source?: ProducedBlockSource
261
+ ): Record<string, string> {
262
+ const executionValue = block.executionPayloadValue;
263
+ const consensusValue = block.consensusBlockValue;
264
+ const totalValue = executionValue + consensusValue;
265
+
266
+ if (source == null) {
267
+ return {
268
+ executionPayloadValue: prettyWeiToEth(executionValue),
269
+ consensusBlockValue: prettyWeiToEth(consensusValue),
270
+ blockTotalValue: prettyWeiToEth(totalValue),
271
+ };
272
+ }
273
+ if (source === ProducedBlockSource.builder) {
274
+ return {
275
+ builderExecutionPayloadValue: prettyWeiToEth(executionValue),
276
+ builderConsensusBlockValue: prettyWeiToEth(consensusValue),
277
+ builderBlockTotalValue: prettyWeiToEth(totalValue),
278
+ };
279
+ }
280
+ return {
281
+ engineExecutionPayloadValue: prettyWeiToEth(executionValue),
282
+ engineConsensusBlockValue: prettyWeiToEth(consensusValue),
283
+ engineBlockTotalValue: prettyWeiToEth(totalValue),
284
+ };
285
+ }
286
+
287
+ /**
288
+ * This function is called 1s before next epoch, usually at that time PrepareNextSlotScheduler finishes
289
+ * so we should have checkpoint state, otherwise wait for up to the slot 1 of epoch.
290
+ * slot epoch 0 1
291
+ * |------------|------------|
292
+ * ^ ^
293
+ * | |
294
+ * | |
295
+ * | waitForCheckpointState (1s before slot 0 of epoch, wait until slot 1 of epoch)
296
+ * |
297
+ * prepareNextSlot (4s before next slot)
298
+ */
299
+ async function waitForCheckpointState(cpHex: CheckpointHex): Promise<CachedBeaconStateAllForks | null> {
300
+ const cpState = chain.regen.getCheckpointStateSync(cpHex);
301
+ if (cpState) {
302
+ return cpState;
303
+ }
304
+ const cp = {
305
+ epoch: cpHex.epoch,
306
+ root: fromHex(cpHex.rootHex),
307
+ };
308
+ const slot0 = computeStartSlotAtEpoch(cp.epoch);
309
+ // if not, wait for ChainEvent.checkpoint event until slot 1 of epoch
310
+ let listener: ((eventCp: phase0.Checkpoint) => void) | null = null;
311
+ const foundCPState = await Promise.race([
312
+ new Promise((resolve) => {
313
+ listener = (eventCp) => {
314
+ resolve(ssz.phase0.Checkpoint.equals(eventCp, cp));
315
+ };
316
+ chain.emitter.once(ChainEvent.checkpoint, listener);
317
+ }),
318
+ // in rare case, checkpoint state cache may happen up to 6s of slot 0 of epoch
319
+ // so we wait for it until the slot 1 of epoch
320
+ chain.clock.waitForSlot(slot0 + 1),
321
+ ]);
322
+
323
+ if (listener != null) {
324
+ chain.emitter.off(ChainEvent.checkpoint, listener);
325
+ }
326
+
327
+ if (foundCPState === true) {
328
+ return chain.regen.getCheckpointStateSync(cpHex);
329
+ }
330
+
331
+ return null;
332
+ }
333
+
334
+ /**
335
+ * Reject any request while the node is syncing
336
+ */
337
+ function notWhileSyncing(): void {
338
+ // Consider node synced before or close to genesis
339
+ if (chain.clock.currentSlot < SLOTS_PER_EPOCH) {
340
+ return;
341
+ }
342
+
343
+ const syncState = sync.state;
344
+ switch (syncState) {
345
+ case SyncState.SyncingFinalized:
346
+ case SyncState.SyncingHead: {
347
+ const currentSlot = chain.clock.currentSlot;
348
+ const headSlot = chain.forkChoice.getHead().slot;
349
+ if (currentSlot - headSlot > SYNC_TOLERANCE_EPOCHS * SLOTS_PER_EPOCH) {
350
+ throw new NodeIsSyncing(`headSlot ${headSlot} currentSlot ${currentSlot}`);
351
+ }
352
+
353
+ return;
354
+ }
355
+
356
+ case SyncState.Synced:
357
+ return;
358
+
359
+ case SyncState.Stalled:
360
+ throw new NodeIsSyncing("waiting for peers");
361
+ }
362
+ }
363
+
364
+ /**
365
+ * Post merge, the CL and EL could be out of step in the sync, and could result in
366
+ * Syncing status of the chain head. To be precise:
367
+ * 1. CL could be ahead of the EL, with the validity of head payload not yet verified
368
+ * 2. CL could be on an invalid chain of execution blocks with a non-existent
369
+ * or non-available parent that never syncs up
370
+ *
371
+ * Both the above scenarios could be problematic and hence validator shouldn't participate
372
+ * or weigh its vote on a head till it resolves to a Valid execution status.
373
+ * Following activities should be skipped on an Optimistic head (with Syncing status):
374
+ * 1. Attestation if targetRoot is optimistic
375
+ * 2. SyncCommitteeContribution if if the root for which to produce contribution is Optimistic.
376
+ * 3. ProduceBlock if the parentRoot (chain's current head is optimistic). However this doesn't
377
+ * need to be checked/aborted here as assembleBody would call EL's api for the latest
378
+ * executionStatus of the parentRoot. If still not validated, produceBlock will throw error.
379
+ *
380
+ * TODO/PENDING: SyncCommitteeSignatures should also be aborted, the best way to address this
381
+ * is still in flux and will be updated as and when other CL's figure this out.
382
+ */
383
+
384
+ function notOnOptimisticBlockRoot(beaconBlockRoot: Root): void {
385
+ const protoBeaconBlock = chain.forkChoice.getBlock(beaconBlockRoot);
386
+ if (!protoBeaconBlock) {
387
+ throw new ApiError(404, `Block not in forkChoice, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`);
388
+ }
389
+
390
+ if (protoBeaconBlock.executionStatus === ExecutionStatus.Syncing)
391
+ throw new NodeIsSyncing(
392
+ `Block's execution payload not yet validated, executionPayloadBlockHash=${protoBeaconBlock.executionPayloadBlockHash} number=${protoBeaconBlock.executionPayloadNumber}`
393
+ );
394
+ }
395
+
396
+ function notOnOutOfRangeData(beaconBlockRoot: Root): void {
397
+ const protoBeaconBlock = chain.forkChoice.getBlock(beaconBlockRoot);
398
+ if (!protoBeaconBlock) {
399
+ throw new ApiError(404, `Block not in forkChoice, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`);
400
+ }
401
+
402
+ if (protoBeaconBlock.dataAvailabilityStatus === DataAvailabilityStatus.OutOfRange)
403
+ throw new NodeIsSyncing("Block's data is out of range and not validated");
404
+ }
405
+
406
+ async function produceBuilderBlindedBlock(
407
+ slot: Slot,
408
+ randaoReveal: BLSSignature,
409
+ graffiti: Bytes32,
410
+ // as of now fee recipient checks can not be performed because builder does not return bid recipient
411
+ {
412
+ commonBlockBodyPromise,
413
+ parentBlockRoot,
414
+ }: Omit<routes.validator.ExtraProduceBlockOpts, "builderSelection"> & {
415
+ commonBlockBodyPromise: Promise<CommonBlockBody>;
416
+ parentBlockRoot: Root;
417
+ }
418
+ ): Promise<ProduceBlindedBlockRes> {
419
+ const version = config.getForkName(slot);
420
+ if (!isForkPostBellatrix(version)) {
421
+ throw Error(`Invalid fork=${version} for produceBuilderBlindedBlock`);
422
+ }
423
+
424
+ const source = ProducedBlockSource.builder;
425
+ metrics?.blockProductionRequests.inc({source});
426
+
427
+ // Error early for builder if builder flow not active
428
+ if (!chain.executionBuilder) {
429
+ throw Error("External builder not configured");
430
+ }
431
+
432
+ switch (chain.executionBuilder.status) {
433
+ case BuilderStatus.disabled:
434
+ throw Error("External builder disabled due to failed status check");
435
+ case BuilderStatus.circuitBreaker:
436
+ throw Error("External builder circuit breaker is activated");
437
+ case BuilderStatus.enabled:
438
+ // continue
439
+ break;
440
+ }
441
+
442
+ let timer: undefined | ((opts: {source: ProducedBlockSource}) => number);
443
+ try {
444
+ timer = metrics?.blockProductionTime.startTimer();
445
+ const {block, executionPayloadValue, consensusBlockValue} = await chain.produceBlindedBlock({
446
+ slot,
447
+ parentBlockRoot,
448
+ randaoReveal,
449
+ graffiti,
450
+ commonBlockBodyPromise,
451
+ });
452
+
453
+ metrics?.blockProductionSuccess.inc({source});
454
+ metrics?.blockProductionNumAggregated.observe({source}, block.body.attestations.length);
455
+ metrics?.blockProductionConsensusBlockValue.observe({source}, Number(formatWeiToEth(consensusBlockValue)));
456
+ metrics?.blockProductionExecutionPayloadValue.observe({source}, Number(formatWeiToEth(executionPayloadValue)));
457
+ logger.verbose("Produced blinded block", {
458
+ slot,
459
+ executionPayloadValue,
460
+ consensusBlockValue,
461
+ root: toRootHex(config.getPostBellatrixForkTypes(slot).BlindedBeaconBlock.hashTreeRoot(block)),
462
+ });
463
+
464
+ if (chain.opts.persistProducedBlocks) {
465
+ void chain.persistBlock(block, "produced_builder_block");
466
+ }
467
+
468
+ return {data: block, version, executionPayloadValue, consensusBlockValue};
469
+ } finally {
470
+ if (timer) timer({source});
471
+ }
472
+ }
473
+
474
+ async function produceEngineBlockContents(
475
+ slot: Slot,
476
+ randaoReveal: BLSSignature,
477
+ graffiti: Bytes32,
478
+ {
479
+ feeRecipient,
480
+ strictFeeRecipientCheck,
481
+ commonBlockBodyPromise,
482
+ parentBlockRoot,
483
+ }: Omit<routes.validator.ExtraProduceBlockOpts, "builderSelection"> & {
484
+ commonBlockBodyPromise: Promise<CommonBlockBody>;
485
+ parentBlockRoot: Root;
486
+ }
487
+ ): Promise<ProduceBlockContentsRes & {shouldOverrideBuilder?: boolean}> {
488
+ const source = ProducedBlockSource.engine;
489
+ metrics?.blockProductionRequests.inc({source});
490
+
491
+ let timer: undefined | ((opts: {source: ProducedBlockSource}) => number);
492
+ try {
493
+ timer = metrics?.blockProductionTime.startTimer();
494
+ const {block, executionPayloadValue, consensusBlockValue, shouldOverrideBuilder} = await chain.produceBlock({
495
+ slot,
496
+ parentBlockRoot,
497
+ randaoReveal,
498
+ graffiti,
499
+ feeRecipient,
500
+ commonBlockBodyPromise,
501
+ });
502
+ const version = config.getForkName(block.slot);
503
+ if (strictFeeRecipientCheck && feeRecipient && isForkPostBellatrix(version)) {
504
+ const blockFeeRecipient = toHex((block as bellatrix.BeaconBlock).body.executionPayload.feeRecipient);
505
+ if (blockFeeRecipient !== feeRecipient) {
506
+ throw Error(`Invalid feeRecipient set in engine block expected=${feeRecipient} actual=${blockFeeRecipient}`);
507
+ }
508
+ }
509
+
510
+ metrics?.blockProductionSuccess.inc({source});
511
+ metrics?.blockProductionNumAggregated.observe({source}, block.body.attestations.length);
512
+ metrics?.blockProductionConsensusBlockValue.observe({source}, Number(formatWeiToEth(consensusBlockValue)));
513
+ metrics?.blockProductionExecutionPayloadValue.observe({source}, Number(formatWeiToEth(executionPayloadValue)));
514
+
515
+ const blockRoot = toRootHex(config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block));
516
+ logger.verbose("Produced execution block", {
517
+ slot,
518
+ executionPayloadValue,
519
+ consensusBlockValue,
520
+ root: blockRoot,
521
+ });
522
+ if (chain.opts.persistProducedBlocks) {
523
+ void chain.persistBlock(block, "produced_engine_block");
524
+ }
525
+ if (isForkPostDeneb(version)) {
526
+ const produceResult = chain.blockProductionCache.get(blockRoot);
527
+ if (produceResult === undefined) {
528
+ throw Error("production result missing in cache");
529
+ }
530
+ if (!isForkPostDeneb(produceResult.fork)) {
531
+ throw Error("production result is for pre-deneb fork");
532
+ }
533
+ if (produceResult.type !== BlockType.Full) {
534
+ throw Error("production result is not full block");
535
+ }
536
+ const blobsBundle = (produceResult as ProduceFullDeneb).blobsBundle;
537
+
538
+ return {
539
+ data: {
540
+ block,
541
+ blobs: blobsBundle.blobs,
542
+ kzgProofs: blobsBundle.proofs,
543
+ },
544
+ version,
545
+ executionPayloadValue,
546
+ consensusBlockValue,
547
+ shouldOverrideBuilder,
548
+ };
549
+ }
550
+
551
+ return {data: {block}, version, executionPayloadValue, consensusBlockValue, shouldOverrideBuilder};
552
+ } finally {
553
+ if (timer) timer({source});
554
+ }
555
+ }
556
+
557
+ async function produceEngineOrBuilderBlock(
558
+ slot: Slot,
559
+ randaoReveal: BLSSignature,
560
+ graffiti?: string,
561
+ // TODO deneb: skip randao verification
562
+ _skipRandaoVerification?: boolean,
563
+ builderBoostFactor?: bigint,
564
+ {feeRecipient, builderSelection, strictFeeRecipientCheck}: routes.validator.ExtraProduceBlockOpts = {}
565
+ ): Promise<ProduceBlindedBlockOrBlockContentsRes> {
566
+ notWhileSyncing();
567
+ await waitForSlot(slot); // Must never request for a future slot > currentSlot
568
+
569
+ const {blockRoot: parentBlockRootHex, slot: parentSlot} = chain.getProposerHead(slot);
570
+ const parentBlockRoot = fromHex(parentBlockRootHex);
571
+ notOnOutOfRangeData(parentBlockRoot);
572
+ metrics?.blockProductionSlotDelta.set(slot - parentSlot);
573
+
574
+ const fork = config.getForkName(slot);
575
+ // set some sensible opts
576
+ // builderSelection will be deprecated and will run in mode MaxProfit if builder is enabled
577
+ // and the actual selection will be determined using builderBoostFactor passed by the validator
578
+ builderSelection = builderSelection ?? routes.validator.BuilderSelection.MaxProfit;
579
+ builderBoostFactor = builderBoostFactor ?? BigInt(100);
580
+ if (builderBoostFactor > MAX_BUILDER_BOOST_FACTOR) {
581
+ throw new ApiError(400, `Invalid builderBoostFactor=${builderBoostFactor} > MAX_BUILDER_BOOST_FACTOR`);
582
+ }
583
+
584
+ const isBuilderEnabled =
585
+ ForkSeq[fork] >= ForkSeq.bellatrix &&
586
+ chain.executionBuilder !== undefined &&
587
+ builderSelection !== routes.validator.BuilderSelection.ExecutionOnly;
588
+
589
+ // At any point either the builder or execution or both flows should be active.
590
+ //
591
+ // Ideally such a scenario should be prevented on startup, but proposerSettingsFile or keymanager
592
+ // configurations could cause a validator pubkey to have builder disabled with builder selection builder only
593
+ // (TODO: independently make sure such an options update is not successful for a validator pubkey)
594
+ //
595
+ // So if builder is disabled ignore builder selection of builder only if caused by user mistake
596
+ // https://github.com/ChainSafe/lodestar/issues/6338
597
+ const isEngineEnabled = !isBuilderEnabled || builderSelection !== routes.validator.BuilderSelection.BuilderOnly;
598
+
599
+ if (!isEngineEnabled && !isBuilderEnabled) {
600
+ throw Error(
601
+ `Internal Error: Neither builder nor execution proposal flow activated isBuilderEnabled=${isBuilderEnabled} builderSelection=${builderSelection}`
602
+ );
603
+ }
604
+
605
+ const graffitiBytes = toGraffitiBytes(
606
+ graffiti ?? getDefaultGraffiti(getLodestarClientVersion(opts), chain.executionEngine.clientVersion, opts)
607
+ );
608
+
609
+ const loggerContext = {
610
+ slot,
611
+ parentSlot,
612
+ parentBlockRoot: parentBlockRootHex,
613
+ fork,
614
+ builderSelection,
615
+ isBuilderEnabled,
616
+ isEngineEnabled,
617
+ strictFeeRecipientCheck,
618
+ // winston logger doesn't like bigint
619
+ builderBoostFactor: `${builderBoostFactor}`,
620
+ };
621
+
622
+ logger.verbose("Assembling block with produceEngineOrBuilderBlock", loggerContext);
623
+
624
+ // Defer common block body production to make sure we sent async builder and engine requests before
625
+ const deferredCommonBlockBody = defer<CommonBlockBody>();
626
+ const commonBlockBodyPromise = deferredCommonBlockBody.promise;
627
+
628
+ // use abort controller to stop waiting for both block sources
629
+ const controller = new AbortController();
630
+
631
+ // Start calls for building execution and builder blocks
632
+ const builderPromise = isBuilderEnabled
633
+ ? produceBuilderBlindedBlock(slot, randaoReveal, graffitiBytes, {
634
+ feeRecipient,
635
+ // can't do fee recipient checks as builder bid doesn't return feeRecipient as of now
636
+ strictFeeRecipientCheck: false,
637
+ commonBlockBodyPromise,
638
+ parentBlockRoot,
639
+ })
640
+ : Promise.reject(new Error("Builder disabled"));
641
+
642
+ const enginePromise = isEngineEnabled
643
+ ? produceEngineBlockContents(slot, randaoReveal, graffitiBytes, {
644
+ feeRecipient,
645
+ strictFeeRecipientCheck,
646
+ commonBlockBodyPromise,
647
+ parentBlockRoot,
648
+ }).then((engineBlock) => {
649
+ // Once the engine returns a block, in the event of either:
650
+ // - suspected builder censorship
651
+ // - builder boost factor set to 0 or builder selection `executionalways`
652
+ // we don't need to wait for builder block as engine block will always be selected
653
+ if (
654
+ engineBlock.shouldOverrideBuilder ||
655
+ builderBoostFactor === BigInt(0) ||
656
+ builderSelection === routes.validator.BuilderSelection.ExecutionAlways
657
+ ) {
658
+ controller.abort();
659
+ }
660
+ return engineBlock;
661
+ })
662
+ : Promise.reject(new Error("Engine disabled"));
663
+
664
+ // Calculate cutoff time based on start of the slot
665
+ const cutoffMs = Math.max(0, BLOCK_PRODUCTION_RACE_CUTOFF_MS - chain.clock.msFromSlot(slot));
666
+
667
+ logger.verbose("Block production race (builder vs execution) starting", {
668
+ ...loggerContext,
669
+ cutoffMs,
670
+ timeoutMs: BLOCK_PRODUCTION_RACE_TIMEOUT_MS,
671
+ });
672
+
673
+ const blockProductionRacePromise = resolveOrRacePromises([builderPromise, enginePromise], {
674
+ resolveTimeoutMs: cutoffMs,
675
+ raceTimeoutMs: BLOCK_PRODUCTION_RACE_TIMEOUT_MS,
676
+ signal: controller.signal,
677
+ });
678
+
679
+ // Ensure builder and engine HTTP requests are sent before starting common block body production
680
+ // by deferring the call to next event loop iteration, allowing pending I/O operations like
681
+ // HTTP requests to be processed first and sent out early in slot.
682
+ callInNextEventLoop(() => {
683
+ logger.verbose("Producing common block body", loggerContext);
684
+ const commonBlockBodyStartedAt = Date.now();
685
+
686
+ chain
687
+ .produceCommonBlockBody({
688
+ slot,
689
+ parentBlockRoot,
690
+ randaoReveal,
691
+ graffiti: graffitiBytes,
692
+ })
693
+ .then((commonBlockBody) => {
694
+ deferredCommonBlockBody.resolve(commonBlockBody);
695
+ logger.verbose("Produced common block body", {
696
+ ...loggerContext,
697
+ durationMs: Date.now() - commonBlockBodyStartedAt,
698
+ });
699
+ })
700
+ .catch(deferredCommonBlockBody.reject);
701
+ });
702
+
703
+ const [builder, engine] = await blockProductionRacePromise;
704
+
705
+ if (builder.status === "pending" && engine.status === "pending") {
706
+ throw Error("Builder and engine both failed to produce the block within timeout");
707
+ }
708
+
709
+ if (builder.status === "pending" && !isEngineEnabled) {
710
+ throw Error("Builder failed to produce the block within timeout");
711
+ }
712
+
713
+ if (engine.status === "pending" && !isBuilderEnabled) {
714
+ throw Error("Engine failed to produce the block within timeout");
715
+ }
716
+
717
+ if (isEngineEnabled) {
718
+ if (engine.status === "rejected") {
719
+ logger.warn(
720
+ "Engine failed to produce the block",
721
+ {
722
+ ...loggerContext,
723
+ durationMs: engine.durationMs,
724
+ },
725
+ engine.reason
726
+ );
727
+ } else if (engine.status === "pending") {
728
+ logger.warn("Engine failed to produce the block within cutoff time", {
729
+ ...loggerContext,
730
+ cutoffMs,
731
+ });
732
+ }
733
+ }
734
+
735
+ if (isBuilderEnabled) {
736
+ if (builder.status === "rejected") {
737
+ if (builder.reason instanceof NoBidReceived) {
738
+ logger.info("Builder did not provide a bid", {
739
+ ...loggerContext,
740
+ durationMs: builder.durationMs,
741
+ });
742
+ } else {
743
+ logger.warn(
744
+ "Builder failed to produce the block",
745
+ {
746
+ ...loggerContext,
747
+ durationMs: builder.durationMs,
748
+ },
749
+ builder.reason
750
+ );
751
+ }
752
+ } else if (builder.status === "pending") {
753
+ logger.warn("Builder failed to produce the block within cutoff time", {
754
+ ...loggerContext,
755
+ cutoffMs,
756
+ });
757
+ }
758
+ }
759
+
760
+ if (builder.status === "rejected" && engine.status === "rejected") {
761
+ throw Error(
762
+ `${isBuilderEnabled && isEngineEnabled ? "Builder and engine both" : isBuilderEnabled ? "Builder" : "Engine"} failed to produce the block`
763
+ );
764
+ }
765
+
766
+ // handle shouldOverrideBuilder separately
767
+ if (engine.status === "fulfilled" && engine.value.shouldOverrideBuilder) {
768
+ logger.info("Selected engine block: censorship suspected in builder blocks", {
769
+ ...loggerContext,
770
+ durationMs: engine.durationMs,
771
+ shouldOverrideBuilder: engine.value.shouldOverrideBuilder,
772
+ ...getBlockValueLogInfo(engine.value),
773
+ });
774
+
775
+ metrics?.blockProductionSelectionResults.inc({
776
+ source: ProducedBlockSource.engine,
777
+ reason: EngineBlockSelectionReason.BuilderCensorship,
778
+ });
779
+
780
+ return {...engine.value, executionPayloadBlinded: false, executionPayloadSource: ProducedBlockSource.engine};
781
+ }
782
+
783
+ if (builder.status === "fulfilled" && engine.status !== "fulfilled") {
784
+ const reason =
785
+ isEngineEnabled === false
786
+ ? BuilderBlockSelectionReason.EngineDisabled
787
+ : engine.status === "pending"
788
+ ? BuilderBlockSelectionReason.EnginePending
789
+ : BuilderBlockSelectionReason.EngineError;
790
+
791
+ logger.info("Selected builder block: no engine block produced", {
792
+ reason,
793
+ ...loggerContext,
794
+ durationMs: builder.durationMs,
795
+ ...getBlockValueLogInfo(builder.value),
796
+ });
797
+
798
+ metrics?.blockProductionSelectionResults.inc({
799
+ source: ProducedBlockSource.builder,
800
+ reason,
801
+ });
802
+
803
+ return {...builder.value, executionPayloadBlinded: true, executionPayloadSource: ProducedBlockSource.builder};
804
+ }
805
+
806
+ if (engine.status === "fulfilled" && builder.status !== "fulfilled") {
807
+ const reason =
808
+ isBuilderEnabled === false
809
+ ? EngineBlockSelectionReason.BuilderDisabled
810
+ : builder.status === "pending"
811
+ ? EngineBlockSelectionReason.BuilderPending
812
+ : builder.reason instanceof NoBidReceived
813
+ ? EngineBlockSelectionReason.BuilderNoBid
814
+ : builder.reason instanceof TimeoutError
815
+ ? EngineBlockSelectionReason.BuilderTimeout
816
+ : EngineBlockSelectionReason.BuilderError;
817
+
818
+ logger.info("Selected engine block: no builder block produced", {
819
+ reason,
820
+ ...loggerContext,
821
+ durationMs: engine.durationMs,
822
+ ...getBlockValueLogInfo(engine.value),
823
+ });
824
+
825
+ metrics?.blockProductionSelectionResults.inc({
826
+ source: ProducedBlockSource.engine,
827
+ reason,
828
+ });
829
+
830
+ return {...engine.value, executionPayloadBlinded: false, executionPayloadSource: ProducedBlockSource.engine};
831
+ }
832
+
833
+ if (engine.status === "fulfilled" && builder.status === "fulfilled") {
834
+ const result = selectBlockProductionSource({
835
+ builderExecutionPayloadValue: builder.value.executionPayloadValue,
836
+ engineExecutionPayloadValue: engine.value.executionPayloadValue,
837
+ builderBoostFactor,
838
+ builderSelection,
839
+ });
840
+ const executionPayloadSource = result.source;
841
+
842
+ metrics?.blockProductionSelectionResults.inc(result);
843
+
844
+ logger.info(`Selected ${executionPayloadSource} block`, {
845
+ reason: result.reason,
846
+ ...loggerContext,
847
+ engineDurationMs: engine.durationMs,
848
+ ...getBlockValueLogInfo(engine.value, ProducedBlockSource.engine),
849
+ builderDurationMs: builder.durationMs,
850
+ ...getBlockValueLogInfo(builder.value, ProducedBlockSource.builder),
851
+ });
852
+
853
+ if (executionPayloadSource === ProducedBlockSource.engine) {
854
+ return {
855
+ ...engine.value,
856
+ executionPayloadBlinded: false,
857
+ executionPayloadSource,
858
+ };
859
+ }
860
+
861
+ return {
862
+ ...builder.value,
863
+ executionPayloadBlinded: true,
864
+ executionPayloadSource,
865
+ };
866
+ }
867
+
868
+ throw Error("Unreachable error occurred during the builder and execution block production");
869
+ }
870
+
871
+ return {
872
+ async produceBlockV3({slot, randaoReveal, graffiti, skipRandaoVerification, builderBoostFactor, ...opts}) {
873
+ const {data, ...meta} = await produceEngineOrBuilderBlock(
874
+ slot,
875
+ randaoReveal,
876
+ graffiti,
877
+ skipRandaoVerification,
878
+ builderBoostFactor,
879
+ opts
880
+ );
881
+
882
+ const fork = ForkSeq[meta.version];
883
+ if (opts.blindedLocal === true && fork >= ForkSeq.bellatrix && fork < ForkSeq.gloas) {
884
+ if (meta.executionPayloadBlinded) {
885
+ return {data, meta};
886
+ }
887
+
888
+ const {block} = data as BlockContents;
889
+ const blindedBlock = beaconBlockToBlinded(config, block as BeaconBlock<ForkPostBellatrix & ForkPreGloas>);
890
+ return {
891
+ data: blindedBlock,
892
+ meta: {...meta, executionPayloadBlinded: true},
893
+ };
894
+ }
895
+
896
+ return {data, meta};
897
+ },
898
+
899
+ async produceAttestationData({committeeIndex, slot}) {
900
+ notWhileSyncing();
901
+
902
+ await waitForSlot(slot); // Must never request for a future slot > currentSlot
903
+
904
+ // This needs a state in the same epoch as `slot` such that state.currentJustifiedCheckpoint is correct.
905
+ // Note: This may trigger an epoch transition if there skipped slots at the beginning of the epoch.
906
+ const headState = chain.getHeadState();
907
+ const headSlot = headState.slot;
908
+ const attEpoch = computeEpochAtSlot(slot);
909
+ const headBlockRootHex = chain.forkChoice.getHead().blockRoot;
910
+ const headBlockRoot = fromHex(headBlockRootHex);
911
+ const fork = config.getForkName(slot);
912
+
913
+ let index: CommitteeIndex;
914
+ if (isForkPostElectra(fork)) {
915
+ index = 0;
916
+ } else {
917
+ if (committeeIndex === undefined) {
918
+ throw new ApiError(400, `Committee index must be provided for pre-electra fork=${fork}`);
919
+ }
920
+ index = committeeIndex;
921
+ }
922
+
923
+ const beaconBlockRoot =
924
+ slot >= headSlot
925
+ ? // When attesting to the head slot or later, always use the head of the chain.
926
+ headBlockRoot
927
+ : // Permit attesting to slots *prior* to the current head. This is desirable when
928
+ // the VC and BN are out-of-sync due to time issues or overloading.
929
+ getBlockRootAtSlot(headState, slot);
930
+
931
+ const targetSlot = computeStartSlotAtEpoch(attEpoch);
932
+ const targetRoot =
933
+ targetSlot >= headSlot
934
+ ? // If the state is earlier than the target slot then the target *must* be the head block root.
935
+ headBlockRoot
936
+ : getBlockRootAtSlot(headState, targetSlot);
937
+
938
+ // Check the execution status as validator shouldn't vote on an optimistic head
939
+ // Check on target is sufficient as a valid target would imply a valid source
940
+ notOnOptimisticBlockRoot(targetRoot);
941
+ notOnOutOfRangeData(targetRoot);
942
+
943
+ // To get the correct source we must get a state in the same epoch as the attestation's epoch.
944
+ // An epoch transition may change state.currentJustifiedCheckpoint
945
+ const attEpochState = await chain.getHeadStateAtEpoch(attEpoch, RegenCaller.produceAttestationData);
946
+
947
+ // TODO confirm if the below is correct assertion
948
+ // notOnOutOfRangeData(attEpochState.currentJustifiedCheckpoint.root);
949
+
950
+ return {
951
+ data: {
952
+ slot,
953
+ index,
954
+ beaconBlockRoot,
955
+ source: attEpochState.currentJustifiedCheckpoint,
956
+ target: {epoch: attEpoch, root: targetRoot},
957
+ },
958
+ };
959
+ },
960
+
961
+ /**
962
+ * GET `/eth/v1/validator/sync_committee_contribution`
963
+ *
964
+ * Requests that the beacon node produce a sync committee contribution.
965
+ *
966
+ * https://github.com/ethereum/beacon-APIs/pull/138
967
+ *
968
+ * @param slot The slot for which a sync committee contribution should be created.
969
+ * @param subcommitteeIndex The subcommittee index for which to produce the contribution.
970
+ * @param beaconBlockRoot The block root for which to produce the contribution.
971
+ */
972
+ async produceSyncCommitteeContribution({slot, subcommitteeIndex, beaconBlockRoot}) {
973
+ // when a validator is configured with multiple beacon node urls, this beaconBlockRoot may come from another beacon node
974
+ // and it hasn't been in our forkchoice since we haven't seen / processing that block
975
+ // see https://github.com/ChainSafe/lodestar/issues/5063
976
+ if (!chain.forkChoice.hasBlock(beaconBlockRoot)) {
977
+ const rootHex = toRootHex(beaconBlockRoot);
978
+ network.searchUnknownSlotRoot({slot, root: rootHex}, BlockInputSource.api);
979
+ // if result of this call is false, i.e. block hasn't seen after 1 slot then the below notOnOptimisticBlockRoot call will throw error
980
+ await chain.waitForBlock(slot, rootHex);
981
+ }
982
+
983
+ // Check the execution status as validator shouldn't contribute on an optimistic head
984
+ notOnOptimisticBlockRoot(beaconBlockRoot);
985
+ notOnOutOfRangeData(beaconBlockRoot);
986
+
987
+ const contribution = chain.syncCommitteeMessagePool.getContribution(subcommitteeIndex, slot, beaconBlockRoot);
988
+ if (!contribution) {
989
+ throw new ApiError(
990
+ 404,
991
+ `No sync committee contribution for slot=${slot}, subnet=${subcommitteeIndex}, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`
992
+ );
993
+ }
994
+
995
+ metrics?.production.producedSyncContributionParticipants.observe(
996
+ contribution.aggregationBits.getTrueBitIndexes().length
997
+ );
998
+
999
+ return {data: contribution};
1000
+ },
1001
+
1002
+ async getProposerDuties({epoch}) {
1003
+ notWhileSyncing();
1004
+
1005
+ // Early check that epoch is no more than current_epoch + 1, or allow for pre-genesis
1006
+ const currentEpoch = currentEpochWithDisparity();
1007
+ const nextEpoch = currentEpoch + 1;
1008
+ if (currentEpoch >= 0 && epoch > nextEpoch) {
1009
+ throw new ApiError(400, `Requested epoch ${epoch} must not be more than one epoch in the future`);
1010
+ }
1011
+
1012
+ const head = chain.forkChoice.getHead();
1013
+ let state: CachedBeaconStateAllForks | undefined = undefined;
1014
+ const startSlot = computeStartSlotAtEpoch(epoch);
1015
+ const prepareNextSlotLookAheadMs =
1016
+ config.SLOT_DURATION_MS - config.getSlotComponentDurationMs(PREPARE_NEXT_SLOT_BPS);
1017
+ const toNextEpochMs = msToNextEpoch();
1018
+ // validators may request next epoch's duties when it's close to next epoch
1019
+ // this is to avoid missed block proposal due to 0 epoch look ahead
1020
+ if (epoch === nextEpoch && toNextEpochMs < prepareNextSlotLookAheadMs) {
1021
+ // wait for maximum 1 slot for cp state which is the timeout of validator api
1022
+ const cpState = await waitForCheckpointState({rootHex: head.blockRoot, epoch});
1023
+ if (cpState) {
1024
+ state = cpState;
1025
+ metrics?.duties.requestNextEpochProposalDutiesHit.inc();
1026
+ } else {
1027
+ metrics?.duties.requestNextEpochProposalDutiesMiss.inc();
1028
+ }
1029
+ }
1030
+
1031
+ if (!state) {
1032
+ if (epoch >= currentEpoch - 1) {
1033
+ // Cached beacon state stores proposers for previous, current and next epoch. The
1034
+ // requested epoch is within that range, we can use the head state at current epoch
1035
+ state = await chain.getHeadStateAtCurrentEpoch(RegenCaller.getDuties);
1036
+ } else {
1037
+ const res = await getStateResponseWithRegen(chain, startSlot);
1038
+
1039
+ const stateViewDU =
1040
+ res.state instanceof Uint8Array
1041
+ ? loadState(config, chain.getHeadState(), res.state).state
1042
+ : res.state.clone();
1043
+
1044
+ state = createCachedBeaconState(
1045
+ stateViewDU,
1046
+ {
1047
+ config: chain.config,
1048
+ // Not required to compute proposers
1049
+ pubkey2index: new PubkeyIndexMap(),
1050
+ index2pubkey: [],
1051
+ },
1052
+ {skipSyncPubkeys: true, skipSyncCommitteeCache: true}
1053
+ );
1054
+
1055
+ if (state.epochCtx.epoch !== epoch) {
1056
+ throw Error(`Loaded state epoch ${state.epochCtx.epoch} does not match requested epoch ${epoch}`);
1057
+ }
1058
+ }
1059
+ }
1060
+
1061
+ const stateEpoch = state.epochCtx.epoch;
1062
+ let indexes: ValidatorIndex[] = [];
1063
+
1064
+ switch (epoch) {
1065
+ case stateEpoch:
1066
+ indexes = state.epochCtx.getBeaconProposers();
1067
+ break;
1068
+
1069
+ case stateEpoch + 1:
1070
+ // make sure shuffling is calculated and ready for next call to calculate nextProposers
1071
+ await chain.shufflingCache.get(state.epochCtx.nextEpoch, state.epochCtx.nextDecisionRoot);
1072
+ // Requesting duties for next epoch is allowed since they can be predicted with high probabilities.
1073
+ // @see `epochCtx.getBeaconProposersNextEpoch` JSDocs for rationale.
1074
+ indexes = state.epochCtx.getBeaconProposersNextEpoch();
1075
+ break;
1076
+
1077
+ case stateEpoch - 1: {
1078
+ const indexesPrevEpoch = state.epochCtx.getBeaconProposersPrevEpoch();
1079
+ if (indexesPrevEpoch === null) {
1080
+ // Should not happen as previous proposer duties should be initialized for head state
1081
+ // and if we load state from `Uint8Array` it will always be the state of requested epoch
1082
+ throw Error(`Proposer duties for previous epoch ${epoch} not yet initialized`);
1083
+ }
1084
+ indexes = indexesPrevEpoch;
1085
+ break;
1086
+ }
1087
+
1088
+ default:
1089
+ // Should never happen, epoch is checked to be in bounds above
1090
+ throw Error(`Proposer duties for epoch ${epoch} not supported, current epoch ${stateEpoch}`);
1091
+ }
1092
+
1093
+ // NOTE: this is the fastest way of getting compressed pubkeys.
1094
+ // See benchmark -> packages/lodestar/test/perf/api/impl/validator/attester.test.ts
1095
+ // After dropping the flat caches attached to the CachedBeaconState it's no longer available.
1096
+ // TODO: Add a flag to just send 0x00 as pubkeys since the Lodestar validator does not need them.
1097
+ const pubkeys = getPubkeysForIndices(state.validators, indexes);
1098
+
1099
+ const duties: routes.validator.ProposerDuty[] = [];
1100
+ for (let i = 0; i < SLOTS_PER_EPOCH; i++) {
1101
+ duties.push({slot: startSlot + i, validatorIndex: indexes[i], pubkey: pubkeys[i]});
1102
+ }
1103
+
1104
+ // Returns `null` on the one-off scenario where the genesis block decides its own shuffling.
1105
+ // It should be set to the latest block applied to `self` or the genesis block root.
1106
+ const dependentRoot = proposerShufflingDecisionRoot(state) || (await getGenesisBlockRoot(state));
1107
+
1108
+ return {
1109
+ data: duties,
1110
+ meta: {
1111
+ dependentRoot: toRootHex(dependentRoot),
1112
+ executionOptimistic: isOptimisticBlock(head),
1113
+ },
1114
+ };
1115
+ },
1116
+
1117
+ async getAttesterDuties({epoch, indices}) {
1118
+ notWhileSyncing();
1119
+
1120
+ if (indices.length === 0) {
1121
+ throw new ApiError(400, "No validator to get attester duties");
1122
+ }
1123
+
1124
+ // May request for an epoch that's in the future
1125
+ await waitForNextClosestEpoch();
1126
+
1127
+ // should not compare to headEpoch in order to handle skipped slots
1128
+ // Check if the epoch is in the future after waiting for requested slot
1129
+ if (epoch > chain.clock.currentEpoch + 1) {
1130
+ throw new ApiError(400, "Cannot get duties for epoch more than one ahead");
1131
+ }
1132
+
1133
+ const head = chain.forkChoice.getHead();
1134
+ const state = await chain.getHeadStateAtCurrentEpoch(RegenCaller.getDuties);
1135
+
1136
+ // TODO: Determine what the current epoch would be if we fast-forward our system clock by
1137
+ // `MAXIMUM_GOSSIP_CLOCK_DISPARITY`.
1138
+ //
1139
+ // Most of the time, `tolerantCurrentEpoch` will be equal to `currentEpoch`. However, during
1140
+ // the first `MAXIMUM_GOSSIP_CLOCK_DISPARITY` duration of the epoch `tolerantCurrentEpoch`
1141
+ // will equal `currentEpoch + 1`
1142
+
1143
+ // Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
1144
+ const pubkeys = getPubkeysForIndices(state.validators, indices);
1145
+ const decisionRoot = state.epochCtx.getShufflingDecisionRoot(epoch);
1146
+ const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
1147
+ if (!shuffling) {
1148
+ throw new ApiError(
1149
+ 500,
1150
+ `No shuffling found to calculate committee assignments for epoch: ${epoch} and decisionRoot: ${decisionRoot}`
1151
+ );
1152
+ }
1153
+ const committeeAssignments = calculateCommitteeAssignments(shuffling, indices);
1154
+ const duties: routes.validator.AttesterDuty[] = [];
1155
+ for (let i = 0, len = indices.length; i < len; i++) {
1156
+ const validatorIndex = indices[i];
1157
+ const duty = committeeAssignments.get(validatorIndex) as routes.validator.AttesterDuty | undefined;
1158
+ if (duty) {
1159
+ // Mutate existing object instead of re-creating another new object with spread operator
1160
+ // Should be faster and require less memory
1161
+ duty.pubkey = pubkeys[i];
1162
+ duties.push(duty);
1163
+ }
1164
+ }
1165
+
1166
+ const dependentRoot = attesterShufflingDecisionRoot(state, epoch) || (await getGenesisBlockRoot(state));
1167
+
1168
+ return {
1169
+ data: duties,
1170
+ meta: {
1171
+ dependentRoot: toRootHex(dependentRoot),
1172
+ executionOptimistic: isOptimisticBlock(head),
1173
+ },
1174
+ };
1175
+ },
1176
+
1177
+ /**
1178
+ * `POST /eth/v1/validator/duties/sync/{epoch}`
1179
+ *
1180
+ * Requests the beacon node to provide a set of sync committee duties for a particular epoch.
1181
+ * - Although pubkey can be inferred from the index we return it to keep this call analogous with the one that
1182
+ * fetches attester duties.
1183
+ * - `sync_committee_index` is the index of the validator in the sync committee. This can be used to infer the
1184
+ * subnet to which the contribution should be broadcast. Note, there can be multiple per validator.
1185
+ *
1186
+ * https://github.com/ethereum/beacon-APIs/pull/134
1187
+ *
1188
+ * @param validatorIndices an array of the validator indices for which to obtain the duties.
1189
+ */
1190
+ async getSyncCommitteeDuties({epoch, indices}) {
1191
+ notWhileSyncing();
1192
+
1193
+ if (indices.length === 0) {
1194
+ throw new ApiError(400, "No validator to get attester duties");
1195
+ }
1196
+
1197
+ // May request for an epoch that's in the future
1198
+ await waitForNextClosestEpoch();
1199
+
1200
+ // sync committee duties have a lookahead of 1 day. Assuming the validator only requests duties for upcoming
1201
+ // epochs, the head state will very likely have the duties available for the requested epoch.
1202
+ // Note: does not support requesting past duties
1203
+ const head = chain.forkChoice.getHead();
1204
+ const state = chain.getHeadState();
1205
+
1206
+ // Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
1207
+ const pubkeys = getPubkeysForIndices(state.validators, indices);
1208
+ // Ensures `epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD <= current_epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD + 1`
1209
+ const syncCommitteeCache = state.epochCtx.getIndexedSyncCommitteeAtEpoch(epoch);
1210
+ const validatorSyncCommitteeIndexMap = syncCommitteeCache.validatorIndexMap;
1211
+
1212
+ const duties: routes.validator.SyncDuty[] = [];
1213
+ for (let i = 0, len = indices.length; i < len; i++) {
1214
+ const validatorIndex = indices[i];
1215
+ const validatorSyncCommitteeIndices = validatorSyncCommitteeIndexMap.get(validatorIndex);
1216
+ if (validatorSyncCommitteeIndices) {
1217
+ duties.push({
1218
+ pubkey: pubkeys[i],
1219
+ validatorIndex,
1220
+ validatorSyncCommitteeIndices,
1221
+ });
1222
+ }
1223
+ }
1224
+
1225
+ return {
1226
+ data: duties,
1227
+ meta: {executionOptimistic: isOptimisticBlock(head)},
1228
+ };
1229
+ },
1230
+
1231
+ async getAggregatedAttestation({attestationDataRoot, slot}) {
1232
+ notWhileSyncing();
1233
+
1234
+ await waitForSlot(slot); // Must never request for a future slot > currentSlot
1235
+
1236
+ const dataRootHex = toRootHex(attestationDataRoot);
1237
+ const aggregate = chain.attestationPool.getAggregate(slot, dataRootHex, null);
1238
+ const fork = chain.config.getForkName(slot);
1239
+
1240
+ if (isForkPostElectra(fork)) {
1241
+ throw new ApiError(
1242
+ 400,
1243
+ `Use getAggregatedAttestationV2 to retrieve aggregated attestations for post-electra fork=${fork}`
1244
+ );
1245
+ }
1246
+
1247
+ if (!aggregate) {
1248
+ throw new ApiError(404, `No aggregated attestation for slot=${slot}, dataRoot=${dataRootHex}`);
1249
+ }
1250
+
1251
+ metrics?.production.producedAggregateParticipants.observe(aggregate.aggregationBits.getTrueBitIndexes().length);
1252
+
1253
+ return {
1254
+ data: aggregate,
1255
+ };
1256
+ },
1257
+
1258
+ async getAggregatedAttestationV2({attestationDataRoot, slot, committeeIndex}) {
1259
+ notWhileSyncing();
1260
+
1261
+ await waitForSlot(slot); // Must never request for a future slot > currentSlot
1262
+
1263
+ const dataRootHex = toRootHex(attestationDataRoot);
1264
+ const aggregate = chain.attestationPool.getAggregate(slot, dataRootHex, committeeIndex);
1265
+
1266
+ if (!aggregate) {
1267
+ throw new ApiError(
1268
+ 404,
1269
+ `No aggregated attestation for slot=${slot}, dataRoot=${dataRootHex}, committeeIndex=${committeeIndex}`
1270
+ );
1271
+ }
1272
+
1273
+ metrics?.production.producedAggregateParticipants.observe(aggregate.aggregationBits.getTrueBitIndexes().length);
1274
+
1275
+ return {
1276
+ data: aggregate,
1277
+ meta: {version: config.getForkName(slot)},
1278
+ };
1279
+ },
1280
+
1281
+ async publishAggregateAndProofs({signedAggregateAndProofs}) {
1282
+ await this.publishAggregateAndProofsV2({signedAggregateAndProofs});
1283
+ },
1284
+
1285
+ async publishAggregateAndProofsV2({signedAggregateAndProofs}) {
1286
+ notWhileSyncing();
1287
+
1288
+ const seenTimestampSec = Date.now() / 1000;
1289
+ const failures: FailureList = [];
1290
+ const fork = chain.config.getForkName(chain.clock.currentSlot);
1291
+
1292
+ await Promise.all(
1293
+ signedAggregateAndProofs.map(async (signedAggregateAndProof, i) => {
1294
+ try {
1295
+ // TODO: Validate in batch
1296
+ const validateFn = () => validateApiAggregateAndProof(fork, chain, signedAggregateAndProof);
1297
+ const {slot, beaconBlockRoot} = signedAggregateAndProof.message.aggregate.data;
1298
+ // when a validator is configured with multiple beacon node urls, this attestation may come from another beacon node
1299
+ // and the block hasn't been in our forkchoice since we haven't seen / processing that block
1300
+ // see https://github.com/ChainSafe/lodestar/issues/5098
1301
+ const {indexedAttestation, committeeValidatorIndices, attDataRootHex} =
1302
+ await validateGossipFnRetryUnknownRoot(validateFn, network, chain, slot, beaconBlockRoot);
1303
+
1304
+ const insertOutcome = chain.aggregatedAttestationPool.add(
1305
+ signedAggregateAndProof.message.aggregate,
1306
+ attDataRootHex,
1307
+ indexedAttestation.attestingIndices.length,
1308
+ committeeValidatorIndices
1309
+ );
1310
+ metrics?.opPool.aggregatedAttestationPool.apiInsertOutcome.inc({insertOutcome});
1311
+
1312
+ const sentPeers = await network.publishBeaconAggregateAndProof(signedAggregateAndProof);
1313
+ chain.validatorMonitor?.onPoolSubmitAggregatedAttestation(seenTimestampSec, indexedAttestation, sentPeers);
1314
+ } catch (e) {
1315
+ const logCtx = {
1316
+ slot: signedAggregateAndProof.message.aggregate.data.slot,
1317
+ index: signedAggregateAndProof.message.aggregate.data.index,
1318
+ };
1319
+
1320
+ if (e instanceof AttestationError && e.type.code === AttestationErrorCode.AGGREGATOR_ALREADY_KNOWN) {
1321
+ logger.debug("Ignoring known signedAggregateAndProof", logCtx);
1322
+ return; // Ok to submit the same aggregate twice
1323
+ }
1324
+
1325
+ failures.push({index: i, message: (e as Error).message});
1326
+ logger.verbose(`Error on publishAggregateAndProofs [${i}]`, logCtx, e as Error);
1327
+ if (e instanceof AttestationError && e.action === GossipAction.REJECT) {
1328
+ chain.persistInvalidSszValue(ssz.phase0.SignedAggregateAndProof, signedAggregateAndProof, "api_reject");
1329
+ }
1330
+ }
1331
+ })
1332
+ );
1333
+
1334
+ if (failures.length > 0) {
1335
+ throw new IndexedError("Error processing aggregate and proofs", failures);
1336
+ }
1337
+ },
1338
+
1339
+ /**
1340
+ * POST `/eth/v1/validator/contribution_and_proofs`
1341
+ *
1342
+ * Publish multiple signed sync committee contribution and proofs
1343
+ *
1344
+ * https://github.com/ethereum/beacon-APIs/pull/137
1345
+ */
1346
+ async publishContributionAndProofs({contributionAndProofs}) {
1347
+ notWhileSyncing();
1348
+
1349
+ const failures: FailureList = [];
1350
+
1351
+ await Promise.all(
1352
+ contributionAndProofs.map(async (contributionAndProof, i) => {
1353
+ try {
1354
+ // TODO: Validate in batch
1355
+ const {syncCommitteeParticipantIndices} = await validateSyncCommitteeGossipContributionAndProof(
1356
+ chain,
1357
+ contributionAndProof,
1358
+ true // skip known participants check
1359
+ );
1360
+ const insertOutcome = chain.syncContributionAndProofPool.add(
1361
+ contributionAndProof.message,
1362
+ syncCommitteeParticipantIndices.length,
1363
+ true
1364
+ );
1365
+ metrics?.opPool.syncContributionAndProofPool.apiInsertOutcome.inc({insertOutcome});
1366
+ await network.publishContributionAndProof(contributionAndProof);
1367
+ } catch (e) {
1368
+ const logCtx = {
1369
+ slot: contributionAndProof.message.contribution.slot,
1370
+ subcommitteeIndex: contributionAndProof.message.contribution.subcommitteeIndex,
1371
+ };
1372
+
1373
+ if (
1374
+ e instanceof SyncCommitteeError &&
1375
+ e.type.code === SyncCommitteeErrorCode.SYNC_COMMITTEE_AGGREGATOR_ALREADY_KNOWN
1376
+ ) {
1377
+ logger.debug("Ignoring known contributionAndProof", logCtx);
1378
+ return; // Ok to submit the same aggregate twice
1379
+ }
1380
+
1381
+ failures.push({index: i, message: (e as Error).message});
1382
+ logger.verbose(`Error on publishContributionAndProofs [${i}]`, logCtx, e as Error);
1383
+ if (e instanceof SyncCommitteeError && e.action === GossipAction.REJECT) {
1384
+ chain.persistInvalidSszValue(ssz.altair.SignedContributionAndProof, contributionAndProof, "api_reject");
1385
+ }
1386
+ }
1387
+ })
1388
+ );
1389
+
1390
+ if (failures.length > 0) {
1391
+ throw new IndexedError("Error processing contribution and proofs", failures);
1392
+ }
1393
+ },
1394
+
1395
+ async prepareBeaconCommitteeSubnet({subscriptions}) {
1396
+ notWhileSyncing();
1397
+
1398
+ await network.prepareBeaconCommitteeSubnets(
1399
+ subscriptions.map(({validatorIndex, slot, isAggregator, committeesAtSlot, committeeIndex}) => ({
1400
+ validatorIndex: validatorIndex,
1401
+ subnet: computeSubnetForCommitteesAtSlot(slot, committeesAtSlot, committeeIndex),
1402
+ slot: slot,
1403
+ isAggregator: isAggregator,
1404
+ }))
1405
+ );
1406
+
1407
+ // TODO:
1408
+ // If the discovery mechanism isn't disabled, attempt to set up a peer discovery for the
1409
+ // required subnets.
1410
+
1411
+ if (metrics) {
1412
+ for (const subscription of subscriptions) {
1413
+ chain.validatorMonitor?.registerLocalValidator(subscription.validatorIndex);
1414
+ }
1415
+ }
1416
+ },
1417
+
1418
+ /**
1419
+ * POST `/eth/v1/validator/sync_committee_subscriptions`
1420
+ *
1421
+ * Subscribe to a number of sync committee subnets.
1422
+ * Sync committees are not present in phase0, but are required for Altair networks.
1423
+ * Subscribing to sync committee subnets is an action performed by VC to enable network participation in Altair networks,
1424
+ * and only required if the VC has an active validator in an active sync committee.
1425
+ *
1426
+ * https://github.com/ethereum/beacon-APIs/pull/136
1427
+ */
1428
+ async prepareSyncCommitteeSubnets({subscriptions}) {
1429
+ notWhileSyncing();
1430
+
1431
+ // A `validatorIndex` can be in multiple subnets, so compute the CommitteeSubscription with double for loop
1432
+ const subs: CommitteeSubscription[] = [];
1433
+ for (const sub of subscriptions) {
1434
+ for (const committeeIndex of sub.syncCommitteeIndices) {
1435
+ const subnet = Math.floor(committeeIndex / SYNC_COMMITTEE_SUBNET_SIZE);
1436
+ subs.push({
1437
+ validatorIndex: sub.validatorIndex,
1438
+ subnet: subnet,
1439
+ // Subscribe until the end of `untilEpoch`: https://github.com/ethereum/beacon-APIs/pull/136#issuecomment-840315097
1440
+ slot: computeStartSlotAtEpoch(sub.untilEpoch + 1),
1441
+ isAggregator: true,
1442
+ });
1443
+ }
1444
+ }
1445
+
1446
+ await network.prepareSyncCommitteeSubnets(subs);
1447
+
1448
+ if (metrics) {
1449
+ for (const subscription of subscriptions) {
1450
+ chain.validatorMonitor?.registerLocalValidatorInSyncCommittee(
1451
+ subscription.validatorIndex,
1452
+ subscription.untilEpoch
1453
+ );
1454
+ }
1455
+ }
1456
+ },
1457
+
1458
+ async prepareBeaconProposer({proposers}) {
1459
+ await chain.updateBeaconProposerData(chain.clock.currentEpoch, proposers);
1460
+ },
1461
+
1462
+ async submitBeaconCommitteeSelections() {
1463
+ throw new OnlySupportedByDVT();
1464
+ },
1465
+
1466
+ async submitSyncCommitteeSelections() {
1467
+ throw new OnlySupportedByDVT();
1468
+ },
1469
+
1470
+ async getLiveness({epoch, indices}) {
1471
+ if (indices.length === 0) {
1472
+ return {
1473
+ data: [],
1474
+ };
1475
+ }
1476
+ const currentEpoch = chain.clock.currentEpoch;
1477
+ if (epoch < currentEpoch - 1 || epoch > currentEpoch + 1) {
1478
+ throw new ApiError(
1479
+ 400,
1480
+ `Request epoch ${epoch} is more than one epoch before or after the current epoch ${currentEpoch}`
1481
+ );
1482
+ }
1483
+
1484
+ return {
1485
+ data: indices.map((index) => ({
1486
+ index,
1487
+ isLive: chain.validatorSeenAtEpoch(index, epoch),
1488
+ })),
1489
+ };
1490
+ },
1491
+
1492
+ async registerValidator({registrations}) {
1493
+ if (!chain.executionBuilder) {
1494
+ throw Error("External builder not configured");
1495
+ }
1496
+
1497
+ // should only send active or pending validator to builder
1498
+ // Spec: https://ethereum.github.io/builder-specs/#/Builder/registerValidator
1499
+ const headState = chain.getHeadState();
1500
+ const currentEpoch = chain.clock.currentEpoch;
1501
+
1502
+ const filteredRegistrations = registrations.filter((registration) => {
1503
+ const {pubkey} = registration.message;
1504
+ const validatorIndex = headState.epochCtx.pubkey2index.get(pubkey);
1505
+ if (validatorIndex === null) return false;
1506
+
1507
+ const validator = headState.validators.getReadonly(validatorIndex);
1508
+ const status = getValidatorStatus(validator, currentEpoch);
1509
+ return (
1510
+ status === "active_exiting" ||
1511
+ status === "active_ongoing" ||
1512
+ status === "active_slashed" ||
1513
+ status === "pending_initialized" ||
1514
+ status === "pending_queued"
1515
+ );
1516
+ });
1517
+
1518
+ await chain.executionBuilder.registerValidator(currentEpoch, filteredRegistrations);
1519
+
1520
+ logger.debug("Forwarded validator registrations to connected builder", {
1521
+ epoch: currentEpoch,
1522
+ count: filteredRegistrations.length,
1523
+ });
1524
+ },
1525
+ };
1526
+ }