@lodestar/beacon-node 1.50.0 → 1.51.0-dev.02c5a19f35

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 (316) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +7 -2
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/state/index.js +8 -2
  6. package/lib/api/impl/beacon/state/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +2 -1
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.js +17 -9
  10. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  11. package/lib/api/impl/debug/index.d.ts.map +1 -1
  12. package/lib/api/impl/debug/index.js +3 -0
  13. package/lib/api/impl/debug/index.js.map +1 -1
  14. package/lib/api/impl/validator/index.d.ts.map +1 -1
  15. package/lib/api/impl/validator/index.js +133 -27
  16. package/lib/api/impl/validator/index.js.map +1 -1
  17. package/lib/chain/ColumnReconstructionTracker.d.ts +11 -13
  18. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  19. package/lib/chain/ColumnReconstructionTracker.js +49 -44
  20. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  21. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  22. package/lib/chain/archiveStore/utils/archiveBlocks.js +4 -5
  23. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  24. package/lib/chain/blocks/blockInput/blockInput.d.ts +1 -1
  25. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  26. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  27. package/lib/chain/blocks/blockInput/utils.js +2 -2
  28. package/lib/chain/blocks/blockInput/utils.js.map +1 -1
  29. package/lib/chain/blocks/importBlock.js +10 -6
  30. package/lib/chain/blocks/importBlock.js.map +1 -1
  31. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  32. package/lib/chain/blocks/importExecutionPayload.js +50 -2
  33. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  34. package/lib/chain/blocks/types.d.ts +4 -0
  35. package/lib/chain/blocks/types.d.ts.map +1 -1
  36. package/lib/chain/blocks/types.js +5 -0
  37. package/lib/chain/blocks/types.js.map +1 -1
  38. package/lib/chain/chain.d.ts +2 -1
  39. package/lib/chain/chain.d.ts.map +1 -1
  40. package/lib/chain/chain.js +8 -3
  41. package/lib/chain/chain.js.map +1 -1
  42. package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
  43. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  44. package/lib/chain/errors/executionPayloadBid.js +2 -0
  45. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  46. package/lib/chain/errors/inclusionList.d.ts +60 -0
  47. package/lib/chain/errors/inclusionList.d.ts.map +1 -0
  48. package/lib/chain/errors/inclusionList.js +19 -0
  49. package/lib/chain/errors/inclusionList.js.map +1 -0
  50. package/lib/chain/errors/index.d.ts +1 -0
  51. package/lib/chain/errors/index.d.ts.map +1 -1
  52. package/lib/chain/errors/index.js +1 -0
  53. package/lib/chain/errors/index.js.map +1 -1
  54. package/lib/chain/interface.d.ts +3 -2
  55. package/lib/chain/interface.d.ts.map +1 -1
  56. package/lib/chain/interface.js.map +1 -1
  57. package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
  58. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
  59. package/lib/chain/opPools/inclusionListStore.js +171 -0
  60. package/lib/chain/opPools/inclusionListStore.js.map +1 -0
  61. package/lib/chain/opPools/index.d.ts +1 -0
  62. package/lib/chain/opPools/index.d.ts.map +1 -1
  63. package/lib/chain/opPools/index.js +1 -0
  64. package/lib/chain/opPools/index.js.map +1 -1
  65. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  66. package/lib/chain/prepareNextSlot.js +4 -3
  67. package/lib/chain/prepareNextSlot.js.map +1 -1
  68. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  69. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  70. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -1
  71. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  72. package/lib/chain/produceBlock/produceBlockBody.js +37 -15
  73. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  74. package/lib/chain/regen/interface.d.ts +1 -0
  75. package/lib/chain/regen/interface.d.ts.map +1 -1
  76. package/lib/chain/regen/interface.js +1 -0
  77. package/lib/chain/regen/interface.js.map +1 -1
  78. package/lib/chain/reprocess.d.ts +2 -1
  79. package/lib/chain/reprocess.d.ts.map +1 -1
  80. package/lib/chain/reprocess.js +2 -1
  81. package/lib/chain/reprocess.js.map +1 -1
  82. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  83. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  84. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  85. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  86. package/lib/chain/stateCache/persistentCheckpointsCache.js +1 -1
  87. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  88. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  89. package/lib/chain/validation/executionPayloadBid.js +33 -1
  90. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  91. package/lib/chain/validation/inclusionList.d.ts +14 -0
  92. package/lib/chain/validation/inclusionList.d.ts.map +1 -0
  93. package/lib/chain/validation/inclusionList.js +150 -0
  94. package/lib/chain/validation/inclusionList.js.map +1 -0
  95. package/lib/chain/validation/index.d.ts +1 -0
  96. package/lib/chain/validation/index.d.ts.map +1 -1
  97. package/lib/chain/validation/index.js +1 -0
  98. package/lib/chain/validation/index.js.map +1 -1
  99. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  100. package/lib/chain/validatorMonitor.js +6 -4
  101. package/lib/chain/validatorMonitor.js.map +1 -1
  102. package/lib/constants/constants.d.ts +1 -0
  103. package/lib/constants/constants.d.ts.map +1 -1
  104. package/lib/constants/constants.js +1 -0
  105. package/lib/constants/constants.js.map +1 -1
  106. package/lib/db/repositories/blockArchive.js +2 -2
  107. package/lib/db/repositories/blockArchive.js.map +1 -1
  108. package/lib/db/repositories/blockArchiveIndex.d.ts +1 -1
  109. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  110. package/lib/db/repositories/blockArchiveIndex.js +1 -2
  111. package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
  112. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  113. package/lib/execution/builder/validateBid.js +14 -1
  114. package/lib/execution/builder/validateBid.js.map +1 -1
  115. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  116. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  117. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  118. package/lib/execution/engine/disabled.d.ts +1 -0
  119. package/lib/execution/engine/disabled.d.ts.map +1 -1
  120. package/lib/execution/engine/disabled.js +3 -0
  121. package/lib/execution/engine/disabled.js.map +1 -1
  122. package/lib/execution/engine/http.d.ts +8 -2
  123. package/lib/execution/engine/http.d.ts.map +1 -1
  124. package/lib/execution/engine/http.js +27 -4
  125. package/lib/execution/engine/http.js.map +1 -1
  126. package/lib/execution/engine/index.d.ts.map +1 -1
  127. package/lib/execution/engine/index.js +1 -1
  128. package/lib/execution/engine/index.js.map +1 -1
  129. package/lib/execution/engine/interface.d.ts +11 -2
  130. package/lib/execution/engine/interface.d.ts.map +1 -1
  131. package/lib/execution/engine/interface.js.map +1 -1
  132. package/lib/execution/engine/jsonRpcHttpClient.d.ts.map +1 -1
  133. package/lib/execution/engine/jsonRpcHttpClient.js +14 -4
  134. package/lib/execution/engine/jsonRpcHttpClient.js.map +1 -1
  135. package/lib/execution/engine/jsonRpcTransport.d.ts +3 -2
  136. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  137. package/lib/execution/engine/jsonRpcTransport.js +33 -9
  138. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  139. package/lib/execution/engine/mock.d.ts +1 -0
  140. package/lib/execution/engine/mock.d.ts.map +1 -1
  141. package/lib/execution/engine/mock.js +31 -7
  142. package/lib/execution/engine/mock.js.map +1 -1
  143. package/lib/execution/engine/payloadIdCache.d.ts +5 -3
  144. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  145. package/lib/execution/engine/payloadIdCache.js +15 -4
  146. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  147. package/lib/execution/engine/restTransport.d.ts +5 -2
  148. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  149. package/lib/execution/engine/restTransport.js +36 -21
  150. package/lib/execution/engine/restTransport.js.map +1 -1
  151. package/lib/execution/engine/sszTypes.d.ts +38 -38
  152. package/lib/execution/engine/transport.d.ts +5 -2
  153. package/lib/execution/engine/transport.d.ts.map +1 -1
  154. package/lib/execution/engine/transportMetrics.d.ts +5 -1
  155. package/lib/execution/engine/transportMetrics.d.ts.map +1 -1
  156. package/lib/execution/engine/types.d.ts +25 -1
  157. package/lib/execution/engine/types.d.ts.map +1 -1
  158. package/lib/execution/engine/types.js +29 -15
  159. package/lib/execution/engine/types.js.map +1 -1
  160. package/lib/metrics/metrics/beacon.d.ts +16 -0
  161. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  162. package/lib/metrics/metrics/beacon.js +35 -0
  163. package/lib/metrics/metrics/beacon.js.map +1 -1
  164. package/lib/metrics/metrics/lodestar.d.ts +20 -0
  165. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  166. package/lib/metrics/metrics/lodestar.js +51 -1
  167. package/lib/metrics/metrics/lodestar.js.map +1 -1
  168. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  169. package/lib/network/gossip/gossipsub.js +3 -1
  170. package/lib/network/gossip/gossipsub.js.map +1 -1
  171. package/lib/network/gossip/interface.d.ts +8 -2
  172. package/lib/network/gossip/interface.d.ts.map +1 -1
  173. package/lib/network/gossip/interface.js +1 -0
  174. package/lib/network/gossip/interface.js.map +1 -1
  175. package/lib/network/gossip/topic.d.ts +13 -19
  176. package/lib/network/gossip/topic.d.ts.map +1 -1
  177. package/lib/network/gossip/topic.js +13 -1
  178. package/lib/network/gossip/topic.js.map +1 -1
  179. package/lib/network/interface.d.ts +2 -1
  180. package/lib/network/interface.d.ts.map +1 -1
  181. package/lib/network/network.d.ts +2 -1
  182. package/lib/network/network.d.ts.map +1 -1
  183. package/lib/network/network.js +5 -0
  184. package/lib/network/network.js.map +1 -1
  185. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -1
  186. package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
  187. package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
  188. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  189. package/lib/network/processor/gossipHandlers.js +63 -17
  190. package/lib/network/processor/gossipHandlers.js.map +1 -1
  191. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  192. package/lib/network/processor/gossipQueues/index.js +6 -0
  193. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  194. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  195. package/lib/network/processor/gossipValidatorFn.js +5 -1
  196. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  197. package/lib/network/processor/index.d.ts +5 -0
  198. package/lib/network/processor/index.d.ts.map +1 -1
  199. package/lib/network/processor/index.js +40 -29
  200. package/lib/network/processor/index.js.map +1 -1
  201. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  202. package/lib/network/reqresp/ReqRespBeaconNode.js +6 -0
  203. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  204. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  205. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +4 -4
  206. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  207. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +3 -3
  208. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  209. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
  210. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
  211. package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
  212. package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
  213. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  214. package/lib/network/reqresp/handlers/index.js +5 -0
  215. package/lib/network/reqresp/handlers/index.js.map +1 -1
  216. package/lib/network/reqresp/protocols.d.ts +1 -0
  217. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  218. package/lib/network/reqresp/protocols.js +5 -0
  219. package/lib/network/reqresp/protocols.js.map +1 -1
  220. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  221. package/lib/network/reqresp/rateLimit.js +6 -2
  222. package/lib/network/reqresp/rateLimit.js.map +1 -1
  223. package/lib/network/reqresp/types.d.ts +5 -2
  224. package/lib/network/reqresp/types.d.ts.map +1 -1
  225. package/lib/network/reqresp/types.js +3 -0
  226. package/lib/network/reqresp/types.js.map +1 -1
  227. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  228. package/lib/network/subnets/attnetsService.js +3 -1
  229. package/lib/network/subnets/attnetsService.js.map +1 -1
  230. package/lib/node/notifier.d.ts.map +1 -1
  231. package/lib/node/notifier.js +12 -13
  232. package/lib/node/notifier.js.map +1 -1
  233. package/lib/sync/unknownBlock.d.ts.map +1 -1
  234. package/lib/sync/unknownBlock.js +45 -20
  235. package/lib/sync/unknownBlock.js.map +1 -1
  236. package/lib/util/clock.d.ts.map +1 -1
  237. package/lib/util/clock.js +3 -4
  238. package/lib/util/clock.js.map +1 -1
  239. package/lib/util/sszBytes.d.ts +2 -2
  240. package/lib/util/sszBytes.d.ts.map +1 -1
  241. package/lib/util/sszBytes.js +22 -14
  242. package/lib/util/sszBytes.js.map +1 -1
  243. package/package.json +30 -30
  244. package/src/api/impl/beacon/blocks/index.ts +10 -3
  245. package/src/api/impl/beacon/state/index.ts +10 -1
  246. package/src/api/impl/beacon/state/utils.ts +19 -9
  247. package/src/api/impl/debug/index.ts +4 -0
  248. package/src/api/impl/validator/index.ts +173 -29
  249. package/src/chain/ColumnReconstructionTracker.ts +63 -46
  250. package/src/chain/archiveStore/utils/archiveBlocks.ts +6 -7
  251. package/src/chain/blocks/blockInput/blockInput.ts +1 -1
  252. package/src/chain/blocks/blockInput/utils.ts +2 -2
  253. package/src/chain/blocks/importBlock.ts +11 -11
  254. package/src/chain/blocks/importExecutionPayload.ts +68 -2
  255. package/src/chain/blocks/types.ts +5 -0
  256. package/src/chain/chain.ts +8 -2
  257. package/src/chain/errors/executionPayloadBid.ts +12 -0
  258. package/src/chain/errors/inclusionList.ts +38 -0
  259. package/src/chain/errors/index.ts +1 -0
  260. package/src/chain/interface.ts +4 -1
  261. package/src/chain/opPools/inclusionListStore.ts +208 -0
  262. package/src/chain/opPools/index.ts +1 -0
  263. package/src/chain/prepareNextSlot.ts +7 -3
  264. package/src/chain/produceBlock/computeNewStateRoot.ts +9 -2
  265. package/src/chain/produceBlock/produceBlockBody.ts +70 -24
  266. package/src/chain/regen/interface.ts +1 -0
  267. package/src/chain/reprocess.ts +2 -1
  268. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -1
  269. package/src/chain/stateCache/persistentCheckpointsCache.ts +4 -1
  270. package/src/chain/validation/executionPayloadBid.ts +52 -2
  271. package/src/chain/validation/inclusionList.ts +192 -0
  272. package/src/chain/validation/index.ts +1 -0
  273. package/src/chain/validatorMonitor.ts +7 -4
  274. package/src/constants/constants.ts +1 -0
  275. package/src/db/repositories/blockArchive.ts +2 -2
  276. package/src/db/repositories/blockArchiveIndex.ts +2 -3
  277. package/src/execution/builder/validateBid.ts +23 -2
  278. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  279. package/src/execution/engine/disabled.ts +4 -0
  280. package/src/execution/engine/http.ts +40 -5
  281. package/src/execution/engine/index.ts +2 -1
  282. package/src/execution/engine/interface.ts +27 -3
  283. package/src/execution/engine/jsonRpcHttpClient.ts +12 -5
  284. package/src/execution/engine/jsonRpcTransport.ts +46 -9
  285. package/src/execution/engine/mock.ts +32 -7
  286. package/src/execution/engine/payloadIdCache.ts +24 -6
  287. package/src/execution/engine/restTransport.ts +68 -23
  288. package/src/execution/engine/transport.ts +7 -2
  289. package/src/execution/engine/transportMetrics.ts +2 -1
  290. package/src/execution/engine/types.ts +53 -16
  291. package/src/metrics/metrics/beacon.ts +37 -0
  292. package/src/metrics/metrics/lodestar.ts +53 -1
  293. package/src/network/gossip/gossipsub.ts +3 -1
  294. package/src/network/gossip/interface.ts +5 -0
  295. package/src/network/gossip/topic.ts +14 -0
  296. package/src/network/interface.ts +2 -0
  297. package/src/network/network.ts +11 -0
  298. package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
  299. package/src/network/processor/gossipHandlers.ts +80 -20
  300. package/src/network/processor/gossipQueues/index.ts +6 -0
  301. package/src/network/processor/gossipValidatorFn.ts +5 -0
  302. package/src/network/processor/index.ts +36 -27
  303. package/src/network/processor/types.ts +1 -1
  304. package/src/network/reqresp/ReqRespBeaconNode.ts +7 -0
  305. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +4 -10
  306. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +3 -3
  307. package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
  308. package/src/network/reqresp/handlers/index.ts +5 -0
  309. package/src/network/reqresp/protocols.ts +6 -0
  310. package/src/network/reqresp/rateLimit.ts +6 -2
  311. package/src/network/reqresp/types.ts +6 -0
  312. package/src/network/subnets/attnetsService.ts +8 -3
  313. package/src/node/notifier.ts +14 -13
  314. package/src/sync/unknownBlock.ts +50 -30
  315. package/src/util/clock.ts +3 -4
  316. package/src/util/sszBytes.ts +25 -12
@@ -1,4 +1,5 @@
1
1
  import crypto from "node:crypto";
2
+ import {SerializedList} from "@chainsafe/ssz";
2
3
  import {ChainConfig} from "@lodestar/config";
3
4
  import {
4
5
  BLOB_TX_TYPE,
@@ -137,10 +138,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
137
138
  engine_newPayloadV3: this.notifyNewPayload.bind(this),
138
139
  engine_newPayloadV4: this.notifyNewPayload.bind(this),
139
140
  engine_newPayloadV5: this.notifyNewPayload.bind(this),
141
+ engine_newPayloadV6: this.notifyNewPayload.bind(this),
140
142
  engine_forkchoiceUpdatedV1: this.notifyForkchoiceUpdate.bind(this),
141
143
  engine_forkchoiceUpdatedV2: this.notifyForkchoiceUpdate.bind(this),
142
144
  engine_forkchoiceUpdatedV3: this.notifyForkchoiceUpdate.bind(this),
143
145
  engine_forkchoiceUpdatedV4: this.notifyForkchoiceUpdate.bind(this),
146
+ engine_forkchoiceUpdatedV5: this.notifyForkchoiceUpdate.bind(this),
144
147
  engine_getPayloadV1: this.getPayloadV1.bind(this),
145
148
  engine_getPayloadV2: this.getPayloadV5.bind(this),
146
149
  engine_getPayloadV3: this.getPayloadV5.bind(this),
@@ -151,6 +154,7 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
151
154
  engine_getClientVersionV1: this.getClientVersionV1.bind(this),
152
155
  engine_getBlobsV1: this.getBlobs.bind(this),
153
156
  engine_getBlobsV2: this.getBlobsV2.bind(this),
157
+ engine_getInclusionListV1: this.getInclusionList.bind(this),
154
158
  };
155
159
  }
156
160
 
@@ -234,7 +238,13 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
234
238
  // IF the payload has been fully validated while processing the call
235
239
  // RETURN payload status from the Payload validation process
236
240
  // If validation succeeds, the response MUST contain {status: VALID, latestValidHash: payload.blockHash}
237
- return {status: ExecutionPayloadStatus.VALID, latestValidHash: blockHash, validationError: null};
241
+ // The mock does not check inclusion list constraints, so every payload satisfies them (PayloadStatusV2)
242
+ return {
243
+ status: ExecutionPayloadStatus.VALID,
244
+ latestValidHash: blockHash,
245
+ validationError: null,
246
+ inclusionListSatisfied: true,
247
+ };
238
248
  }
239
249
 
240
250
  /**
@@ -343,14 +353,14 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
343
353
  executionPayload.gasUsed = Math.floor(0.5 * INTEROP_GAS_LIMIT);
344
354
  executionPayload.timestamp = payloadAttributes.timestamp;
345
355
  executionPayload.blockHash = crypto.randomBytes(32);
346
- executionPayload.transactions = [];
356
+ const transactions: Uint8Array[] = [];
347
357
 
348
358
  // Between 0 and 4 transactions for all forks
349
359
  const eip1559TxCount = Math.round(4 * Math.random());
350
360
  for (let i = 0; i < eip1559TxCount; i++) {
351
361
  const tx = crypto.randomBytes(512);
352
362
  tx[0] = TX_TYPE_EIP1559;
353
- executionPayload.transactions.push(tx);
363
+ transactions.push(tx);
354
364
  }
355
365
 
356
366
  const commitments: deneb.KZGCommitment[] = [];
@@ -364,7 +374,7 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
364
374
  const blob = generateRandomBlob();
365
375
  const commitment = kzg.blobToKzgCommitment(blob);
366
376
  const {proofs: cellProofs} = kzg.computeCellsAndKzgProofs(blob);
367
- executionPayload.transactions.push(transactionForKzgCommitment(commitment));
377
+ transactions.push(transactionForKzgCommitment(commitment));
368
378
  commitments.push(commitment);
369
379
  blobs.push(blob);
370
380
  proofs.push(...cellProofs);
@@ -376,12 +386,13 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
376
386
  const blob = generateRandomBlob();
377
387
  const commitment = kzg.blobToKzgCommitment(blob);
378
388
  const proof = kzg.computeBlobKzgProof(blob, commitment);
379
- executionPayload.transactions.push(transactionForKzgCommitment(commitment));
389
+ transactions.push(transactionForKzgCommitment(commitment));
380
390
  commitments.push(commitment);
381
391
  blobs.push(blob);
382
392
  proofs.push(proof);
383
393
  }
384
394
  }
395
+ executionPayload.transactions = SerializedList.fromArray(transactions);
385
396
 
386
397
  if (ForkSeq[fork] >= ForkSeq.capella) {
387
398
  (executionPayload as ExecutionPayload<ForkPostCapella>).withdrawals = ssz.capella.Withdrawals.defaultValue();
@@ -409,7 +420,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
409
420
  // IF the payload is deemed VALID and the build process has begun
410
421
  // {payloadStatus: {status: VALID, latestValidHash: forkchoiceState.headBlockHash, validationError: null}, payloadId: buildProcessId}
411
422
  return {
412
- payloadStatus: {status: ExecutionPayloadStatus.VALID, latestValidHash: null, validationError: null},
423
+ payloadStatus: {
424
+ status: ExecutionPayloadStatus.VALID,
425
+ latestValidHash: null,
426
+ validationError: null,
427
+ inclusionListSatisfied: true,
428
+ },
413
429
  payloadId: String(payloadId as number),
414
430
  };
415
431
  }
@@ -418,7 +434,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
418
434
  // IF the payload is deemed VALID and a build process hasn't been started
419
435
  // {payloadStatus: {status: VALID, latestValidHash: forkchoiceState.headBlockHash, validationError: null}, payloadId: null}
420
436
  return {
421
- payloadStatus: {status: ExecutionPayloadStatus.VALID, latestValidHash: null, validationError: null},
437
+ payloadStatus: {
438
+ status: ExecutionPayloadStatus.VALID,
439
+ latestValidHash: null,
440
+ validationError: null,
441
+ inclusionListSatisfied: true,
442
+ },
422
443
  payloadId: null,
423
444
  };
424
445
  }
@@ -487,6 +508,10 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
487
508
  return null;
488
509
  }
489
510
 
511
+ private getInclusionList(): EngineApiRpcReturnTypes["engine_getInclusionListV1"] {
512
+ return [];
513
+ }
514
+
490
515
  private timestampToFork(timestamp: number): ForkPostBellatrix {
491
516
  if (timestamp >= this.gloasForkTimestamp) return ForkName.gloas;
492
517
  if (timestamp >= this.fuluForkTimestamp) return ForkName.fulu;
@@ -1,4 +1,6 @@
1
+ import {byteArrayEquals} from "@chainsafe/ssz";
1
2
  import {SLOTS_PER_EPOCH} from "@lodestar/params";
3
+ import {bellatrix} from "@lodestar/types";
2
4
  import {pruneSetToMax} from "@lodestar/utils";
3
5
  import {PayloadAttributesRpc} from "./types.js";
4
6
  import {DATA, QUANTITY} from "./utils.js";
@@ -17,13 +19,18 @@ export type WithdrawalV1 = {
17
19
  amount: QUANTITY;
18
20
  };
19
21
 
20
- type FcuAttributes = {headBlockHash: DATA; finalizedBlockHash: DATA} & Omit<PayloadAttributesRpc, "withdrawals">;
22
+ type FcuAttributes = {headBlockHash: DATA} & Omit<PayloadAttributesRpc, "withdrawals" | "inclusionListTransactions"> & {
23
+ inclusionListTransactions?: bellatrix.Transactions;
24
+ };
21
25
 
22
26
  export class PayloadIdCache {
23
- private readonly payloadIdByFcuAttributes = new Map<string, {payloadId: PayloadId; fullKey: string}>();
27
+ private readonly payloadIdByFcuAttributes = new Map<
28
+ string,
29
+ {payloadId: PayloadId; fullKey: string; inclusionListTransactions?: bellatrix.Transactions}
30
+ >();
24
31
 
25
- getFullKey({headBlockHash, finalizedBlockHash, timestamp, prevRandao, suggestedFeeRecipient}: FcuAttributes): string {
26
- return `${headBlockHash}-${finalizedBlockHash}-${timestamp}-${prevRandao}-${suggestedFeeRecipient}`;
32
+ getFullKey({headBlockHash, timestamp, prevRandao, suggestedFeeRecipient}: FcuAttributes): string {
33
+ return `${headBlockHash}-${timestamp}-${prevRandao}-${suggestedFeeRecipient}`;
27
34
  }
28
35
  getKey({timestamp}: Pick<FcuAttributes, "timestamp">): string {
29
36
  return timestamp;
@@ -37,7 +44,8 @@ export class PayloadIdCache {
37
44
  add(fcuAttributes: FcuAttributes, payloadId: PayloadId): void {
38
45
  const key = this.getKey(fcuAttributes);
39
46
  const fullKey = this.getFullKey(fcuAttributes);
40
- this.payloadIdByFcuAttributes.set(key, {payloadId, fullKey});
47
+ const {inclusionListTransactions} = fcuAttributes;
48
+ this.payloadIdByFcuAttributes.set(key, {payloadId, fullKey, inclusionListTransactions});
41
49
  }
42
50
 
43
51
  prune(): void {
@@ -49,6 +57,16 @@ export class PayloadIdCache {
49
57
  const key = this.getKey(fcuAttributes);
50
58
  const fullKey = this.getFullKey(fcuAttributes);
51
59
  const payloadInfo = this.payloadIdByFcuAttributes.get(key);
52
- return payloadInfo?.fullKey === fullKey ? payloadInfo.payloadId : undefined;
60
+ return payloadInfo?.fullKey === fullKey &&
61
+ isSameInclusionList(payloadInfo.inclusionListTransactions, fcuAttributes.inclusionListTransactions)
62
+ ? payloadInfo.payloadId
63
+ : undefined;
53
64
  }
54
65
  }
66
+
67
+ function isSameInclusionList(a?: bellatrix.Transactions, b?: bellatrix.Transactions): boolean {
68
+ if (a === undefined || b === undefined) {
69
+ return a === b;
70
+ }
71
+ return byteArrayEquals(a.bytes, b.bytes);
72
+ }
@@ -1,9 +1,19 @@
1
1
  import {Type} from "@chainsafe/ssz";
2
2
  import {CELLS_PER_EXT_BLOB, ForkName, ForkSeq, isForkPostBellatrix} from "@lodestar/params";
3
- import {ExecutionPayload, ExecutionRequests, Root, RootHex, capella, deneb, electra, gloas} from "@lodestar/types";
3
+ import {
4
+ ExecutionPayload,
5
+ ExecutionRequests,
6
+ Root,
7
+ RootHex,
8
+ bellatrix,
9
+ capella,
10
+ deneb,
11
+ electra,
12
+ gloas,
13
+ } from "@lodestar/types";
4
14
  import {BlobAndProof} from "@lodestar/types/deneb";
5
15
  import {BlobAndProofV2} from "@lodestar/types/fulu";
6
- import {LodestarError, fromHex, strip0xPrefix, toHex, toRootHex} from "@lodestar/utils";
16
+ import {EndTimer, LodestarError, fromHex, strip0xPrefix, toHex, toRootHex} from "@lodestar/utils";
7
17
  import {isValidBlobVersionedHashes} from "./blobVersionedHashes.js";
8
18
  import {
9
19
  ClientCode,
@@ -48,6 +58,7 @@ import {
48
58
  executionForkName,
49
59
  } from "./sszTypes.js";
50
60
  import {ForkchoiceUpdatedResult, GetPayloadResult, IEngineTransport, PayloadStatusResult} from "./transport.js";
61
+ import {EngineTransportMetrics} from "./transportMetrics.js";
51
62
  import {
52
63
  ExecutionPayloadBodyV2,
53
64
  assertReqSizeLimit,
@@ -102,7 +113,10 @@ export function formatClientVersionHeader(clientVersion: ClientVersion): string
102
113
  export class RestEngineTransport implements IEngineTransport {
103
114
  private limits = DEFAULT_LIMITS;
104
115
 
105
- constructor(private readonly client: EngineRestHttpClient) {}
116
+ constructor(
117
+ private readonly client: EngineRestHttpClient,
118
+ private readonly metrics?: EngineTransportMetrics | null
119
+ ) {}
106
120
 
107
121
  get emitter(): JsonRpcHttpClientEventEmitter {
108
122
  return this.client.emitter;
@@ -114,7 +128,7 @@ export class RestEngineTransport implements IEngineTransport {
114
128
  {method: "GET", path: "/capabilities", responseType: "json"},
115
129
  getCapabilitiesOpts
116
130
  );
117
- const capabilities = parseJson(body, "getCapabilities");
131
+ const capabilities = parseJson(body, "getCapabilities", this.metrics);
118
132
  if (
119
133
  !isRecord(capabilities) ||
120
134
  !Array.isArray(capabilities.supported_forks) ||
@@ -220,7 +234,7 @@ export class RestEngineTransport implements IEngineTransport {
220
234
  {method: "POST", path: "/payloads", executionFork: toExecutionForkName(fork), body, responseType: "ssz"},
221
235
  notifyNewPayloadOpts
222
236
  );
223
- return toPayloadStatusResult(deserializeResponse(PayloadStatus, res.body, "notifyNewPayload"));
237
+ return toPayloadStatusResult(deserializeResponse(PayloadStatus, res.body, "notifyNewPayload", this.metrics));
224
238
  }
225
239
 
226
240
  async forkchoiceUpdated(
@@ -268,7 +282,12 @@ export class RestEngineTransport implements IEngineTransport {
268
282
  {method: "POST", path: "/forkchoice", executionFork: toExecutionForkName(fork), body, responseType: "ssz"},
269
283
  fcUReqOpts
270
284
  );
271
- const {payloadStatus, payloadId} = deserializeResponse(ForkchoiceUpdateResponse, res.body, "forkchoiceUpdated");
285
+ const {payloadStatus, payloadId} = deserializeResponse(
286
+ ForkchoiceUpdateResponse,
287
+ res.body,
288
+ "forkchoiceUpdated",
289
+ this.metrics
290
+ );
272
291
  return {
273
292
  payloadStatus: toPayloadStatusResult(payloadStatus),
274
293
  payloadId: payloadId.length > 0 ? toHex(payloadId[0]) : null,
@@ -289,7 +308,8 @@ export class RestEngineTransport implements IEngineTransport {
289
308
  const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
290
309
  BuiltPayloadGloas,
291
310
  res.body,
292
- "getPayload"
311
+ "getPayload",
312
+ this.metrics
293
313
  );
294
314
  return {
295
315
  executionPayload: payload,
@@ -303,7 +323,8 @@ export class RestEngineTransport implements IEngineTransport {
303
323
  const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
304
324
  BuiltPayloadFulu,
305
325
  res.body,
306
- "getPayload"
326
+ "getPayload",
327
+ this.metrics
307
328
  );
308
329
  return {
309
330
  executionPayload: payload,
@@ -317,7 +338,8 @@ export class RestEngineTransport implements IEngineTransport {
317
338
  const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
318
339
  BuiltPayloadElectra,
319
340
  res.body,
320
- "getPayload"
341
+ "getPayload",
342
+ this.metrics
321
343
  );
322
344
  return {
323
345
  executionPayload: payload,
@@ -331,15 +353,16 @@ export class RestEngineTransport implements IEngineTransport {
331
353
  const {payload, blockValue, blobsBundle, shouldOverrideBuilder} = deserializeResponse(
332
354
  BuiltPayloadDeneb,
333
355
  res.body,
334
- "getPayload"
356
+ "getPayload",
357
+ this.metrics
335
358
  );
336
359
  return {executionPayload: payload, executionPayloadValue: blockValue, blobsBundle, shouldOverrideBuilder};
337
360
  }
338
361
  if (ForkSeq[fork] >= ForkSeq.capella) {
339
- const {payload, blockValue} = deserializeResponse(BuiltPayloadCapella, res.body, "getPayload");
362
+ const {payload, blockValue} = deserializeResponse(BuiltPayloadCapella, res.body, "getPayload", this.metrics);
340
363
  return {executionPayload: payload, executionPayloadValue: blockValue, shouldOverrideBuilder: false};
341
364
  }
342
- const {payload, blockValue} = deserializeResponse(BuiltPayloadBellatrix, res.body, "getPayload");
365
+ const {payload, blockValue} = deserializeResponse(BuiltPayloadBellatrix, res.body, "getPayload", this.metrics);
343
366
  return {executionPayload: payload, executionPayloadValue: blockValue, shouldOverrideBuilder: false};
344
367
  }
345
368
 
@@ -356,7 +379,7 @@ export class RestEngineTransport implements IEngineTransport {
356
379
  },
357
380
  getPayloadBodiesByHashOpts
358
381
  );
359
- const bodies = deserializeBodiesResponse(ForkName.gloas, res.body);
382
+ const bodies = deserializeBodiesResponse(ForkName.gloas, res.body, this.metrics);
360
383
  if (bodies.length !== blockHashes.length) {
361
384
  throw Error(`Invalid bodies response length=${bodies.length} blockHashes=${blockHashes.length}`);
362
385
  }
@@ -374,7 +397,7 @@ export class RestEngineTransport implements IEngineTransport {
374
397
  return versionedHashes.map(() => null);
375
398
  }
376
399
 
377
- const {entries} = deserializeResponse(BlobsV1Response, res.body, "getBlobsV1");
400
+ const {entries} = deserializeResponse(BlobsV1Response, res.body, "getBlobsV1", this.metrics);
378
401
  if (entries.length !== versionedHashes.length) {
379
402
  throw Error(`Invalid blobs/v1 response length=${entries.length} versionedHashes=${versionedHashes.length}`);
380
403
  }
@@ -397,7 +420,7 @@ export class RestEngineTransport implements IEngineTransport {
397
420
  return null;
398
421
  }
399
422
 
400
- const {entries} = deserializeResponse(BlobsV2Response, res.body, "getBlobsV2", {reuseBytes: true});
423
+ const {entries} = deserializeResponse(BlobsV2Response, res.body, "getBlobsV2", this.metrics, {reuseBytes: true});
401
424
  if (entries.length !== versionedHashes.length) {
402
425
  throw Error(`Invalid blobs/v2 response length=${entries.length} versionedHashes=${versionedHashes.length}`);
403
426
  }
@@ -418,7 +441,7 @@ export class RestEngineTransport implements IEngineTransport {
418
441
  {method: "GET", path: "/identity", responseType: "json"},
419
442
  getClientVersionOpts
420
443
  );
421
- const versions = parseJson(body, "getClientVersion");
444
+ const versions = parseJson(body, "getClientVersion", this.metrics);
422
445
  if (!Array.isArray(versions)) {
423
446
  throw new EngineRestResponseError("getClientVersion", "Expected an array of client versions");
424
447
  }
@@ -441,6 +464,10 @@ export class RestEngineTransport implements IEngineTransport {
441
464
  };
442
465
  });
443
466
  }
467
+
468
+ getInclusionList(): Promise<bellatrix.Transactions> {
469
+ throw Error("engine_getInclusionListV1 is not available over the REST engine API");
470
+ }
444
471
  }
445
472
 
446
473
  function toPayloadAttributesBellatrix(attributes: PayloadAttributes) {
@@ -502,36 +529,54 @@ function toPayloadStatusResult(payloadStatus: PayloadStatusSsz): PayloadStatusRe
502
529
  }
503
530
  }
504
531
 
505
- function deserializeBodiesResponse(fork: ForkName, data: Uint8Array): (ExecutionPayloadBodyV2 | null)[] {
532
+ function deserializeBodiesResponse(
533
+ fork: ForkName,
534
+ data: Uint8Array,
535
+ metrics?: EngineTransportMetrics | null
536
+ ): (ExecutionPayloadBodyV2 | null)[] {
506
537
  if (ForkSeq[fork] >= ForkSeq.gloas) {
507
- return deserializeResponse(BodiesResponseGloas, data, "getPayloadBodiesByHash").entries.map((entry) =>
538
+ return deserializeResponse(BodiesResponseGloas, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
508
539
  entry.available ? entry.body : null
509
540
  );
510
541
  }
511
542
  if (ForkSeq[fork] >= ForkSeq.capella) {
512
- return deserializeResponse(BodiesResponseCapella, data, "getPayloadBodiesByHash").entries.map((entry) =>
543
+ return deserializeResponse(BodiesResponseCapella, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
513
544
  entry.available ? {...entry.body, blockAccessList: null} : null
514
545
  );
515
546
  }
516
- return deserializeResponse(BodiesResponseBellatrix, data, "getPayloadBodiesByHash").entries.map((entry) =>
547
+ return deserializeResponse(BodiesResponseBellatrix, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
517
548
  entry.available ? {transactions: entry.body.transactions, withdrawals: null, blockAccessList: null} : null
518
549
  );
519
550
  }
520
551
 
521
552
  /** A 2xx response that does not decode is an execution client error, not an unreachable client */
522
- function deserializeResponse<T>(type: Type<T>, body: Uint8Array, routeId: string, opts?: {reuseBytes?: boolean}): T {
553
+ function deserializeResponse<T>(
554
+ type: Type<T>,
555
+ body: Uint8Array,
556
+ routeId: string,
557
+ metrics?: EngineTransportMetrics | null,
558
+ opts?: {reuseBytes?: boolean}
559
+ ): T {
560
+ const timer = metrics?.responseParseTime.startTimer({routeId, encoding: "ssz"});
523
561
  try {
524
562
  return type.deserialize(body, opts);
525
563
  } catch (e) {
526
564
  throw new EngineRestResponseError(routeId, `Invalid SSZ: ${(e as Error).message}`);
565
+ } finally {
566
+ timer?.();
527
567
  }
528
568
  }
529
569
 
530
- function parseJson(body: Uint8Array, routeId: string): unknown {
570
+ function parseJson(body: Uint8Array, routeId: string, metrics?: EngineTransportMetrics | null): unknown {
571
+ let timer: EndTimer | undefined;
531
572
  try {
532
- return JSON.parse(textDecoder.decode(body));
573
+ const text = textDecoder.decode(body);
574
+ timer = metrics?.responseParseTime.startTimer({routeId, encoding: "json"});
575
+ return JSON.parse(text);
533
576
  } catch (e) {
534
577
  throw new EngineRestResponseError(routeId, `Invalid JSON: ${(e as Error).message}`);
578
+ } finally {
579
+ timer?.();
535
580
  }
536
581
  }
537
582
 
@@ -1,5 +1,5 @@
1
1
  import {ForkName} from "@lodestar/params";
2
- import {BlobsBundle, ExecutionPayload, ExecutionRequests, Root, RootHex, Wei} from "@lodestar/types";
2
+ import {BlobsBundle, ExecutionPayload, ExecutionRequests, Root, RootHex, Wei, bellatrix} from "@lodestar/types";
3
3
  import {BlobAndProof} from "@lodestar/types/deneb";
4
4
  import {BlobAndProofV2} from "@lodestar/types/fulu";
5
5
  import {ClientVersion, ExecutionPayloadStatus, PayloadAttributes, PayloadId, VersionedHashes} from "./interface.js";
@@ -10,6 +10,8 @@ export type PayloadStatusResult = {
10
10
  status: ExecutionPayloadStatus;
11
11
  latestValidHash: RootHex | null;
12
12
  validationError: string | null;
13
+ /** PayloadStatusV2: whether a VALID payload satisfied the inclusion list constraints, null otherwise */
14
+ inclusionListSatisfied?: boolean | null;
13
15
  };
14
16
 
15
17
  export type ForkchoiceUpdatedResult = {
@@ -38,7 +40,8 @@ export interface IEngineTransport {
38
40
  executionPayload: ExecutionPayload,
39
41
  versionedHashes?: VersionedHashes,
40
42
  parentBeaconBlockRoot?: Root,
41
- executionRequests?: ExecutionRequests
43
+ executionRequests?: ExecutionRequests,
44
+ inclusionListTransactions?: bellatrix.Transactions
42
45
  ): Promise<PayloadStatusResult>;
43
46
 
44
47
  forkchoiceUpdated(
@@ -58,4 +61,6 @@ export interface IEngineTransport {
58
61
  getBlobsV2(versionedHashes: VersionedHashes, buffers?: Uint8Array[]): Promise<BlobAndProofV2[] | null>;
59
62
 
60
63
  getClientVersion(clientVersion: ClientVersion): Promise<ClientVersion[]>;
64
+
65
+ getInclusionList(): Promise<bellatrix.Transactions>;
61
66
  }
@@ -1,4 +1,4 @@
1
- import {Counter} from "@lodestar/utils";
1
+ import {Counter, Histogram} from "@lodestar/utils";
2
2
 
3
3
  /**
4
4
  * Common metrics type for both json rpc and ssz transport.
@@ -6,4 +6,5 @@ import {Counter} from "@lodestar/utils";
6
6
  export type EngineTransportMetrics = {
7
7
  requestBytes: Counter<{routeId: string}>;
8
8
  responseBytes: Counter<{routeId: string}>;
9
+ responseParseTime: Histogram<{routeId: string; encoding: "json" | "ssz"}>;
9
10
  };
@@ -1,3 +1,4 @@
1
+ import {SerializedList, Type} from "@chainsafe/ssz";
1
2
  import {
2
3
  BUILDER_DEPOSIT_REQUEST_TYPE,
3
4
  BUILDER_EXIT_REQUEST_TYPE,
@@ -53,6 +54,7 @@ export type EngineApiRpcParamTypes = {
53
54
  engine_newPayloadV3: [ExecutionPayloadRpc, VersionedHashesRpc, DATA];
54
55
  engine_newPayloadV4: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
55
56
  engine_newPayloadV5: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
57
+ engine_newPayloadV6: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc, InclusionListRpc];
56
58
  /**
57
59
  * 1. Object - Payload validity status with respect to the consensus rules:
58
60
  * - blockHash: DATA, 32 Bytes - block hash value of the payload
@@ -74,6 +76,10 @@ export type EngineApiRpcParamTypes = {
74
76
  forkChoiceData: {headBlockHash: DATA; safeBlockHash: DATA; finalizedBlockHash: DATA},
75
77
  payloadAttributes?: PayloadAttributesRpc,
76
78
  ];
79
+ engine_forkchoiceUpdatedV5: [
80
+ forkChoiceData: {headBlockHash: DATA; safeBlockHash: DATA; finalizedBlockHash: DATA},
81
+ payloadAttributes?: PayloadAttributesRpc,
82
+ ];
77
83
  /**
78
84
  * 1. payloadId: QUANTITY, 64 Bits - Identifier of the payload building process
79
85
  */
@@ -96,12 +102,16 @@ export type EngineApiRpcParamTypes = {
96
102
 
97
103
  engine_getBlobsV1: [DATA[]];
98
104
  engine_getBlobsV2: [DATA[]];
105
+
106
+ engine_getInclusionListV1: [];
99
107
  };
100
108
 
101
109
  export type PayloadStatus = {
102
110
  status: ExecutionPayloadStatus;
103
111
  latestValidHash: DATA | null;
104
112
  validationError: string | null;
113
+ /** PayloadStatusV2: whether a VALID payload satisfied the inclusion list constraints, null otherwise */
114
+ inclusionListSatisfied?: boolean | null;
105
115
  };
106
116
 
107
117
  export type EngineApiRpcReturnTypes = {
@@ -114,6 +124,7 @@ export type EngineApiRpcReturnTypes = {
114
124
  engine_newPayloadV3: PayloadStatus;
115
125
  engine_newPayloadV4: PayloadStatus;
116
126
  engine_newPayloadV5: PayloadStatus;
127
+ engine_newPayloadV6: PayloadStatus;
117
128
  engine_forkchoiceUpdatedV1: {
118
129
  payloadStatus: PayloadStatus;
119
130
  payloadId: QUANTITY | null;
@@ -130,6 +141,10 @@ export type EngineApiRpcReturnTypes = {
130
141
  payloadStatus: PayloadStatus;
131
142
  payloadId: QUANTITY | null;
132
143
  };
144
+ engine_forkchoiceUpdatedV5: {
145
+ payloadStatus: PayloadStatus;
146
+ payloadId: QUANTITY | null;
147
+ };
133
148
  /**
134
149
  * payloadId | Error: QUANTITY, 64 Bits - Identifier of the payload building process
135
150
  */
@@ -146,6 +161,8 @@ export type EngineApiRpcReturnTypes = {
146
161
 
147
162
  engine_getBlobsV1: (BlobAndProofRpc | null)[];
148
163
  engine_getBlobsV2: BlobAndProofV2Rpc[] | null;
164
+
165
+ engine_getInclusionListV1: InclusionListRpc;
149
166
  };
150
167
 
151
168
  type ExecutionPayloadRpcWithValue = {
@@ -164,7 +181,7 @@ export type ExecutionPayloadBodyRpc = {
164
181
  };
165
182
 
166
183
  export type ExecutionPayloadBody = {
167
- transactions: bellatrix.Transaction[];
184
+ transactions: bellatrix.Transactions;
168
185
  withdrawals: capella.Withdrawals | null;
169
186
  };
170
187
 
@@ -260,8 +277,13 @@ export type PayloadAttributesRpc = {
260
277
  slotNumber?: QUANTITY;
261
278
  /** QUANTITY, 64 Bits - target value for the gasLimit field of the new payload (GLOAS, execution-apis#796) */
262
279
  targetGasLimit?: QUANTITY;
280
+ /** Array of DATA - transactions that the built payload must include (PayloadAttributesV5, HEZE) */
281
+ inclusionListTransactions?: InclusionListRpc;
263
282
  };
264
283
 
284
+ /** Array of DATA - array of transaction objects */
285
+ export type InclusionListRpc = DATA[];
286
+
265
287
  export type ClientVersionRpc = {
266
288
  /** ClientCode */
267
289
  code: string;
@@ -294,7 +316,7 @@ export function serializeExecutionPayload(fork: ForkName, data: ExecutionPayload
294
316
  extraData: bytesToData(data.extraData),
295
317
  baseFeePerGas: numToQuantity(data.baseFeePerGas),
296
318
  blockHash: bytesToData(data.blockHash),
297
- transactions: data.transactions.map((tran) => bytesToData(tran)),
319
+ transactions: Array.from(data.transactions, (tran) => bytesToData(tran)),
298
320
  };
299
321
 
300
322
  // Capella adds withdrawals to the ExecutionPayload
@@ -378,7 +400,7 @@ export function parseExecutionPayload(
378
400
  extraData: dataToBytes(data.extraData, null),
379
401
  baseFeePerGas: quantityToBigint(data.baseFeePerGas),
380
402
  blockHash: dataToBytes(data.blockHash, 32),
381
- transactions: data.transactions.map((tran) => dataToBytes(tran, null)),
403
+ transactions: SerializedList.fromArray(data.transactions.map((tran) => dataToBytes(tran, null))),
382
404
  };
383
405
 
384
406
  if (ForkSeq[fork] >= ForkSeq.capella) {
@@ -441,6 +463,9 @@ export function serializePayloadAttributes(data: PayloadAttributes): PayloadAttr
441
463
  parentBeaconBlockRoot: data.parentBeaconBlockRoot ? bytesToData(data.parentBeaconBlockRoot) : undefined,
442
464
  slotNumber: data.slotNumber !== undefined ? numToQuantity(data.slotNumber) : undefined,
443
465
  targetGasLimit: data.targetGasLimit !== undefined ? numToQuantity(data.targetGasLimit) : undefined,
466
+ inclusionListTransactions: data.inclusionListTransactions
467
+ ? serializeInclusionList(data.inclusionListTransactions)
468
+ : undefined,
444
469
  };
445
470
  }
446
471
 
@@ -448,6 +473,14 @@ export function serializeBeaconBlockRoot(data: Root): DATA {
448
473
  return bytesToData(data);
449
474
  }
450
475
 
476
+ export function serializeInclusionList(data: bellatrix.Transactions): InclusionListRpc {
477
+ return Array.from(data, (transaction) => bytesToData(transaction));
478
+ }
479
+
480
+ export function deserializeInclusionList(data: InclusionListRpc): bellatrix.Transactions {
481
+ return SerializedList.fromArray(data.map((transaction) => dataToBytes(transaction, null)));
482
+ }
483
+
451
484
  export function deserializePayloadAttributes(data: PayloadAttributesRpc): PayloadAttributes {
452
485
  return {
453
486
  timestamp: quantityToNum(data.timestamp),
@@ -459,6 +492,9 @@ export function deserializePayloadAttributes(data: PayloadAttributesRpc): Payloa
459
492
  parentBeaconBlockRoot: data.parentBeaconBlockRoot ? dataToBytes(data.parentBeaconBlockRoot, 32) : undefined,
460
493
  slotNumber: data.slotNumber !== undefined ? quantityToNum(data.slotNumber) : undefined,
461
494
  targetGasLimit: data.targetGasLimit !== undefined ? quantityToBigint(data.targetGasLimit) : undefined,
495
+ inclusionListTransactions: data.inclusionListTransactions
496
+ ? deserializeInclusionList(data.inclusionListTransactions)
497
+ : undefined,
462
498
  };
463
499
  }
464
500
 
@@ -500,14 +536,15 @@ export function deserializeWithdrawal(serialized: WithdrawalRpc): capella.Withdr
500
536
  }
501
537
 
502
538
  /**
503
- * Prepend a single-byte requestType to requestsBytes
539
+ * Serialize requests prefixed with a single-byte requestType in one allocation
504
540
  */
505
- function prefixRequests(requestsBytes: Uint8Array, requestType: ExecutionRequestType): Uint8Array {
506
- const prefixedRequests = new Uint8Array(1 + requestsBytes.length);
507
- prefixedRequests[0] = requestType;
508
- prefixedRequests.set(requestsBytes, 1);
541
+ function serializePrefixedRequests<T>(type: Type<T>, requests: T, requestType: ExecutionRequestType): Uint8Array {
542
+ const uint8Array = new Uint8Array(1 + type.value_serializedSize(requests));
543
+ const dataView = new DataView(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength);
544
+ uint8Array[0] = requestType;
545
+ type.value_serializeToBytes({uint8Array, dataView}, 1, requests);
509
546
 
510
- return prefixedRequests;
547
+ return uint8Array;
511
548
  }
512
549
 
513
550
  /**
@@ -522,16 +559,16 @@ export function serializeExecutionRequestsToBytes(fork: ForkName, executionReque
522
559
  const result: Uint8Array[] = [];
523
560
 
524
561
  if (deposits.length !== 0) {
525
- result.push(prefixRequests(ssz.electra.DepositRequests.serialize(deposits), DEPOSIT_REQUEST_TYPE));
562
+ result.push(serializePrefixedRequests(ssz.electra.DepositRequests, deposits, DEPOSIT_REQUEST_TYPE));
526
563
  }
527
564
 
528
565
  if (withdrawals.length !== 0) {
529
- result.push(prefixRequests(ssz.electra.WithdrawalRequests.serialize(withdrawals), WITHDRAWAL_REQUEST_TYPE));
566
+ result.push(serializePrefixedRequests(ssz.electra.WithdrawalRequests, withdrawals, WITHDRAWAL_REQUEST_TYPE));
530
567
  }
531
568
 
532
569
  if (consolidations.length !== 0) {
533
570
  result.push(
534
- prefixRequests(ssz.electra.ConsolidationRequests.serialize(consolidations), CONSOLIDATION_REQUEST_TYPE)
571
+ serializePrefixedRequests(ssz.electra.ConsolidationRequests, consolidations, CONSOLIDATION_REQUEST_TYPE)
535
572
  );
536
573
  }
537
574
 
@@ -540,12 +577,12 @@ export function serializeExecutionRequestsToBytes(fork: ForkName, executionReque
540
577
 
541
578
  if (builderDeposits.length !== 0) {
542
579
  result.push(
543
- prefixRequests(ssz.gloas.BuilderDepositRequests.serialize(builderDeposits), BUILDER_DEPOSIT_REQUEST_TYPE)
580
+ serializePrefixedRequests(ssz.gloas.BuilderDepositRequests, builderDeposits, BUILDER_DEPOSIT_REQUEST_TYPE)
544
581
  );
545
582
  }
546
583
 
547
584
  if (builderExits.length !== 0) {
548
- result.push(prefixRequests(ssz.gloas.BuilderExitRequests.serialize(builderExits), BUILDER_EXIT_REQUEST_TYPE));
585
+ result.push(serializePrefixedRequests(ssz.gloas.BuilderExitRequests, builderExits, BUILDER_EXIT_REQUEST_TYPE));
549
586
  }
550
587
  }
551
588
 
@@ -633,7 +670,7 @@ export function deserializeExecutionRequests(fork: ForkName, serialized: Executi
633
670
  export function deserializeExecutionPayloadBody(data: ExecutionPayloadBodyRpc | null): ExecutionPayloadBody | null {
634
671
  return data
635
672
  ? {
636
- transactions: data.transactions.map((tran) => dataToBytes(tran, null)),
673
+ transactions: SerializedList.fromArray(data.transactions.map((tran) => dataToBytes(tran, null))),
637
674
  withdrawals: data.withdrawals ? data.withdrawals.map(deserializeWithdrawal) : null,
638
675
  }
639
676
  : null;
@@ -656,7 +693,7 @@ export function serializeExecutionPayloadBodyV2(data: ExecutionPayloadBodyV2 | n
656
693
  export function serializeExecutionPayloadBody(data: ExecutionPayloadBody | null): ExecutionPayloadBodyRpc | null {
657
694
  return data
658
695
  ? {
659
- transactions: data.transactions.map((tran) => bytesToData(tran)),
696
+ transactions: Array.from(data.transactions, (tran) => bytesToData(tran)),
660
697
  withdrawals: data.withdrawals ? data.withdrawals.map(serializeWithdrawal) : null,
661
698
  }
662
699
  : null;