@lodestar/beacon-node 1.35.0-dev.f80d2d52da → 1.35.0-dev.fd1dac853d

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