@lodestar/state-transition 1.41.0-dev.21f758891e → 1.41.0-dev.241ad7952a

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 (291) hide show
  1. package/lib/block/externalData.d.ts +2 -1
  2. package/lib/block/externalData.d.ts.map +1 -1
  3. package/lib/block/externalData.js +6 -2
  4. package/lib/block/externalData.js.map +1 -1
  5. package/lib/block/index.d.ts +3 -3
  6. package/lib/block/index.js.map +1 -1
  7. package/lib/block/initiateValidatorExit.js.map +1 -1
  8. package/lib/block/isValidIndexedAttestation.d.ts +3 -3
  9. package/lib/block/isValidIndexedAttestation.d.ts.map +1 -1
  10. package/lib/block/isValidIndexedAttestation.js +4 -4
  11. package/lib/block/isValidIndexedAttestation.js.map +1 -1
  12. package/lib/block/isValidIndexedPayloadAttestation.js +1 -1
  13. package/lib/block/isValidIndexedPayloadAttestation.js.map +1 -1
  14. package/lib/block/processAttestationPhase0.js +1 -1
  15. package/lib/block/processAttestationPhase0.js.map +1 -1
  16. package/lib/block/processAttestations.js.map +1 -1
  17. package/lib/block/processAttestationsAltair.js +1 -1
  18. package/lib/block/processAttestationsAltair.js.map +1 -1
  19. package/lib/block/processAttesterSlashing.d.ts +2 -2
  20. package/lib/block/processAttesterSlashing.d.ts.map +1 -1
  21. package/lib/block/processAttesterSlashing.js +3 -3
  22. package/lib/block/processAttesterSlashing.js.map +1 -1
  23. package/lib/block/processBlobKzgCommitments.js.map +1 -1
  24. package/lib/block/processBlockHeader.js.map +1 -1
  25. package/lib/block/processBlsToExecutionChange.js.map +1 -1
  26. package/lib/block/processConsolidationRequest.js.map +1 -1
  27. package/lib/block/processDeposit.js.map +1 -1
  28. package/lib/block/processDepositRequest.js.map +1 -1
  29. package/lib/block/processEth1Data.js.map +1 -1
  30. package/lib/block/processExecutionPayload.js.map +1 -1
  31. package/lib/block/processExecutionPayloadBid.d.ts +1 -1
  32. package/lib/block/processExecutionPayloadBid.js.map +1 -1
  33. package/lib/block/processExecutionPayloadEnvelope.d.ts +5 -2
  34. package/lib/block/processExecutionPayloadEnvelope.d.ts.map +1 -1
  35. package/lib/block/processExecutionPayloadEnvelope.js +25 -15
  36. package/lib/block/processExecutionPayloadEnvelope.js.map +1 -1
  37. package/lib/block/processOperations.js.map +1 -1
  38. package/lib/block/processPayloadAttestation.d.ts +1 -1
  39. package/lib/block/processPayloadAttestation.js.map +1 -1
  40. package/lib/block/processProposerSlashing.d.ts +2 -2
  41. package/lib/block/processProposerSlashing.d.ts.map +1 -1
  42. package/lib/block/processProposerSlashing.js +3 -3
  43. package/lib/block/processProposerSlashing.js.map +1 -1
  44. package/lib/block/processRandao.js +1 -1
  45. package/lib/block/processRandao.js.map +1 -1
  46. package/lib/block/processSyncCommittee.js +1 -1
  47. package/lib/block/processSyncCommittee.js.map +1 -1
  48. package/lib/block/processVoluntaryExit.js +3 -2
  49. package/lib/block/processVoluntaryExit.js.map +1 -1
  50. package/lib/block/processWithdrawalRequest.js +2 -2
  51. package/lib/block/processWithdrawalRequest.js.map +1 -1
  52. package/lib/block/processWithdrawals.js.map +1 -1
  53. package/lib/block/slashValidator.js.map +1 -1
  54. package/lib/block/types.js +2 -1
  55. package/lib/block/types.js.map +1 -1
  56. package/lib/cache/effectiveBalanceIncrements.js.map +1 -1
  57. package/lib/cache/epochCache.d.ts +8 -15
  58. package/lib/cache/epochCache.d.ts.map +1 -1
  59. package/lib/cache/epochCache.js +36 -34
  60. package/lib/cache/epochCache.js.map +1 -1
  61. package/lib/cache/epochTransitionCache.js.map +1 -1
  62. package/lib/cache/pubkeyCache.d.ts +21 -6
  63. package/lib/cache/pubkeyCache.d.ts.map +1 -1
  64. package/lib/cache/pubkeyCache.js +39 -14
  65. package/lib/cache/pubkeyCache.js.map +1 -1
  66. package/lib/cache/rewardCache.js.map +1 -1
  67. package/lib/cache/stateCache.d.ts +1 -1
  68. package/lib/cache/stateCache.d.ts.map +1 -1
  69. package/lib/cache/stateCache.js +3 -7
  70. package/lib/cache/stateCache.js.map +1 -1
  71. package/lib/cache/syncCommitteeCache.d.ts +3 -2
  72. package/lib/cache/syncCommitteeCache.d.ts.map +1 -1
  73. package/lib/cache/syncCommitteeCache.js +4 -4
  74. package/lib/cache/syncCommitteeCache.js.map +1 -1
  75. package/lib/epoch/computeUnrealizedCheckpoints.js.map +1 -1
  76. package/lib/epoch/getAttestationDeltas.js.map +1 -1
  77. package/lib/epoch/getRewardsAndPenalties.js.map +1 -1
  78. package/lib/epoch/index.d.ts +1 -1
  79. package/lib/epoch/index.js +2 -1
  80. package/lib/epoch/index.js.map +1 -1
  81. package/lib/epoch/processBuilderPendingPayments.d.ts +1 -1
  82. package/lib/epoch/processBuilderPendingPayments.js.map +1 -1
  83. package/lib/epoch/processEffectiveBalanceUpdates.js.map +1 -1
  84. package/lib/epoch/processEth1DataReset.js.map +1 -1
  85. package/lib/epoch/processHistoricalRootsUpdate.js.map +1 -1
  86. package/lib/epoch/processHistoricalSummariesUpdate.js.map +1 -1
  87. package/lib/epoch/processInactivityUpdates.js.map +1 -1
  88. package/lib/epoch/processJustificationAndFinalization.js.map +1 -1
  89. package/lib/epoch/processParticipationFlagUpdates.js.map +1 -1
  90. package/lib/epoch/processParticipationRecordUpdates.js.map +1 -1
  91. package/lib/epoch/processPendingAttestations.js.map +1 -1
  92. package/lib/epoch/processPendingConsolidations.js.map +1 -1
  93. package/lib/epoch/processPendingDeposits.js.map +1 -1
  94. package/lib/epoch/processProposerLookahead.js.map +1 -1
  95. package/lib/epoch/processRandaoMixesReset.js.map +1 -1
  96. package/lib/epoch/processRegistryUpdates.js.map +1 -1
  97. package/lib/epoch/processRewardsAndPenalties.js.map +1 -1
  98. package/lib/epoch/processSlashings.js.map +1 -1
  99. package/lib/epoch/processSlashingsReset.js.map +1 -1
  100. package/lib/epoch/processSyncCommitteeUpdates.js.map +1 -1
  101. package/lib/index.d.ts +3 -1
  102. package/lib/index.d.ts.map +1 -1
  103. package/lib/index.js +2 -1
  104. package/lib/index.js.map +1 -1
  105. package/lib/lightClient/proofs.d.ts +10 -0
  106. package/lib/lightClient/proofs.d.ts.map +1 -0
  107. package/lib/lightClient/proofs.js +63 -0
  108. package/lib/lightClient/proofs.js.map +1 -0
  109. package/lib/lightClient/types.d.ts +34 -0
  110. package/lib/lightClient/types.d.ts.map +1 -0
  111. package/lib/lightClient/types.js +2 -0
  112. package/lib/lightClient/types.js.map +1 -0
  113. package/lib/metrics.d.ts.map +1 -1
  114. package/lib/metrics.js.map +1 -1
  115. package/lib/rewards/attestationsRewards.d.ts +2 -2
  116. package/lib/rewards/attestationsRewards.d.ts.map +1 -1
  117. package/lib/rewards/attestationsRewards.js +4 -4
  118. package/lib/rewards/attestationsRewards.js.map +1 -1
  119. package/lib/rewards/blockRewards.js.map +1 -1
  120. package/lib/rewards/syncCommitteeRewards.d.ts +2 -2
  121. package/lib/rewards/syncCommitteeRewards.d.ts.map +1 -1
  122. package/lib/rewards/syncCommitteeRewards.js +5 -2
  123. package/lib/rewards/syncCommitteeRewards.js.map +1 -1
  124. package/lib/signatureSets/attesterSlashings.js.map +1 -1
  125. package/lib/signatureSets/blsToExecutionChange.js.map +1 -1
  126. package/lib/signatureSets/executionPayloadBid.js.map +1 -1
  127. package/lib/signatureSets/executionPayloadEnvelope.js.map +1 -1
  128. package/lib/signatureSets/index.js.map +1 -1
  129. package/lib/signatureSets/indexedAttestation.js.map +1 -1
  130. package/lib/signatureSets/indexedPayloadAttestation.js.map +1 -1
  131. package/lib/signatureSets/proposer.d.ts +2 -2
  132. package/lib/signatureSets/proposer.d.ts.map +1 -1
  133. package/lib/signatureSets/proposer.js +2 -2
  134. package/lib/signatureSets/proposer.js.map +1 -1
  135. package/lib/signatureSets/proposerSlashings.js.map +1 -1
  136. package/lib/signatureSets/randao.d.ts +2 -2
  137. package/lib/signatureSets/randao.d.ts.map +1 -1
  138. package/lib/signatureSets/randao.js +2 -2
  139. package/lib/signatureSets/randao.js.map +1 -1
  140. package/lib/signatureSets/voluntaryExits.d.ts +2 -2
  141. package/lib/signatureSets/voluntaryExits.d.ts.map +1 -1
  142. package/lib/signatureSets/voluntaryExits.js +2 -2
  143. package/lib/signatureSets/voluntaryExits.js.map +1 -1
  144. package/lib/slot/index.js.map +1 -1
  145. package/lib/slot/upgradeStateToAltair.js.map +1 -1
  146. package/lib/slot/upgradeStateToBellatrix.js.map +1 -1
  147. package/lib/slot/upgradeStateToCapella.js.map +1 -1
  148. package/lib/slot/upgradeStateToDeneb.js.map +1 -1
  149. package/lib/slot/upgradeStateToElectra.js.map +1 -1
  150. package/lib/slot/upgradeStateToFulu.js.map +1 -1
  151. package/lib/slot/upgradeStateToGloas.js.map +1 -1
  152. package/lib/stateTransition.d.ts +2 -1
  153. package/lib/stateTransition.d.ts.map +1 -1
  154. package/lib/stateTransition.js +6 -3
  155. package/lib/stateTransition.js.map +1 -1
  156. package/lib/stateView/beaconStateView.d.ts +160 -0
  157. package/lib/stateView/beaconStateView.d.ts.map +1 -0
  158. package/lib/stateView/beaconStateView.js +553 -0
  159. package/lib/stateView/beaconStateView.js.map +1 -0
  160. package/lib/stateView/index.d.ts +3 -0
  161. package/lib/stateView/index.d.ts.map +1 -0
  162. package/lib/stateView/index.js +3 -0
  163. package/lib/stateView/index.js.map +1 -0
  164. package/lib/stateView/interface.d.ts +135 -0
  165. package/lib/stateView/interface.d.ts.map +1 -0
  166. package/lib/stateView/interface.js +2 -0
  167. package/lib/stateView/interface.js.map +1 -0
  168. package/lib/testUtils/cache.d.ts +2 -0
  169. package/lib/testUtils/cache.d.ts.map +1 -0
  170. package/lib/testUtils/cache.js +7 -0
  171. package/lib/testUtils/cache.js.map +1 -0
  172. package/lib/testUtils/index.d.ts +6 -0
  173. package/lib/testUtils/index.d.ts.map +1 -0
  174. package/lib/testUtils/index.js +6 -0
  175. package/lib/testUtils/index.js.map +1 -0
  176. package/lib/testUtils/infura.d.ts +3 -0
  177. package/lib/testUtils/infura.d.ts.map +1 -0
  178. package/lib/testUtils/infura.js +8 -0
  179. package/lib/testUtils/infura.js.map +1 -0
  180. package/lib/testUtils/interop.d.ts +2 -0
  181. package/lib/testUtils/interop.d.ts.map +1 -0
  182. package/lib/testUtils/interop.js +24 -0
  183. package/lib/testUtils/interop.js.map +1 -0
  184. package/lib/testUtils/params.d.ts +18 -0
  185. package/lib/testUtils/params.d.ts.map +1 -0
  186. package/lib/testUtils/params.js +20 -0
  187. package/lib/testUtils/params.js.map +1 -0
  188. package/lib/testUtils/state.d.ts +20 -0
  189. package/lib/testUtils/state.d.ts.map +1 -0
  190. package/lib/testUtils/state.js +78 -0
  191. package/lib/testUtils/state.js.map +1 -0
  192. package/lib/testUtils/testFileCache.d.ts +17 -0
  193. package/lib/testUtils/testFileCache.d.ts.map +1 -0
  194. package/lib/testUtils/testFileCache.js +96 -0
  195. package/lib/testUtils/testFileCache.js.map +1 -0
  196. package/lib/testUtils/util.d.ts +50 -0
  197. package/lib/testUtils/util.d.ts.map +1 -0
  198. package/lib/testUtils/util.js +329 -0
  199. package/lib/testUtils/util.js.map +1 -0
  200. package/lib/util/aggregator.js.map +1 -1
  201. package/lib/util/altair.js.map +1 -1
  202. package/lib/util/array.js.map +1 -1
  203. package/lib/util/attestation.js.map +1 -1
  204. package/lib/util/attesterStatus.js.map +1 -1
  205. package/lib/util/balance.js.map +1 -1
  206. package/lib/util/blindedBlock.js.map +1 -1
  207. package/lib/util/blockRoot.js.map +1 -1
  208. package/lib/util/capella.js.map +1 -1
  209. package/lib/util/computeAnchorCheckpoint.js.map +1 -1
  210. package/lib/util/deposit.js.map +1 -1
  211. package/lib/util/domain.js.map +1 -1
  212. package/lib/util/electra.js.map +1 -1
  213. package/lib/util/epoch.js.map +1 -1
  214. package/lib/util/epochShuffling.js.map +1 -1
  215. package/lib/util/execution.js.map +1 -1
  216. package/lib/util/finality.js.map +1 -1
  217. package/lib/util/fulu.js.map +1 -1
  218. package/lib/util/genesis.js.map +1 -1
  219. package/lib/util/gloas.js.map +1 -1
  220. package/lib/util/interop.js.map +1 -1
  221. package/lib/util/loadState/findModifiedInactivityScores.js.map +1 -1
  222. package/lib/util/loadState/findModifiedValidators.js.map +1 -1
  223. package/lib/util/loadState/loadState.js.map +1 -1
  224. package/lib/util/loadState/loadValidator.js.map +1 -1
  225. package/lib/util/rootCache.d.ts.map +1 -1
  226. package/lib/util/rootCache.js.map +1 -1
  227. package/lib/util/seed.d.ts +0 -8
  228. package/lib/util/seed.d.ts.map +1 -1
  229. package/lib/util/seed.js +0 -64
  230. package/lib/util/seed.js.map +1 -1
  231. package/lib/util/shuffling.js +2 -1
  232. package/lib/util/shuffling.js.map +1 -1
  233. package/lib/util/signatureSets.d.ts +7 -7
  234. package/lib/util/signatureSets.d.ts.map +1 -1
  235. package/lib/util/signatureSets.js +20 -13
  236. package/lib/util/signatureSets.js.map +1 -1
  237. package/lib/util/signingRoot.js.map +1 -1
  238. package/lib/util/slot.js.map +1 -1
  239. package/lib/util/sszBytes.js.map +1 -1
  240. package/lib/util/syncCommittee.js.map +1 -1
  241. package/lib/util/targetUnslashedBalance.js.map +1 -1
  242. package/lib/util/validator.js.map +1 -1
  243. package/lib/util/weakSubjectivity.js +1 -1
  244. package/lib/util/weakSubjectivity.js.map +1 -1
  245. package/package.json +14 -9
  246. package/src/block/externalData.ts +2 -0
  247. package/src/block/index.ts +3 -3
  248. package/src/block/isValidIndexedAttestation.ts +5 -5
  249. package/src/block/isValidIndexedPayloadAttestation.ts +3 -3
  250. package/src/block/processAttestationPhase0.ts +1 -1
  251. package/src/block/processAttestationsAltair.ts +2 -2
  252. package/src/block/processAttesterSlashing.ts +4 -4
  253. package/src/block/processExecutionPayloadBid.ts +4 -4
  254. package/src/block/processExecutionPayloadEnvelope.ts +40 -22
  255. package/src/block/processOperations.ts +1 -1
  256. package/src/block/processPayloadAttestation.ts +2 -2
  257. package/src/block/processProposerSlashing.ts +4 -4
  258. package/src/block/processRandao.ts +1 -1
  259. package/src/block/processSyncCommittee.ts +1 -1
  260. package/src/block/processVoluntaryExit.ts +1 -1
  261. package/src/block/processWithdrawalRequest.ts +2 -2
  262. package/src/block/processWithdrawals.ts +1 -1
  263. package/src/cache/epochCache.ts +44 -36
  264. package/src/cache/pubkeyCache.ts +62 -21
  265. package/src/cache/stateCache.ts +4 -8
  266. package/src/cache/syncCommitteeCache.ts +4 -5
  267. package/src/epoch/index.ts +1 -1
  268. package/src/epoch/processBuilderPendingPayments.ts +2 -2
  269. package/src/index.ts +3 -1
  270. package/src/lightClient/proofs.ts +83 -0
  271. package/src/lightClient/types.ts +33 -0
  272. package/src/rewards/attestationsRewards.ts +5 -5
  273. package/src/rewards/syncCommitteeRewards.ts +6 -5
  274. package/src/signatureSets/proposer.ts +3 -3
  275. package/src/signatureSets/randao.ts +3 -7
  276. package/src/signatureSets/voluntaryExits.ts +3 -3
  277. package/src/stateTransition.ts +2 -1
  278. package/src/stateView/beaconStateView.ts +809 -0
  279. package/src/stateView/index.ts +2 -0
  280. package/src/stateView/interface.ts +213 -0
  281. package/src/testUtils/cache.ts +8 -0
  282. package/src/testUtils/index.ts +5 -0
  283. package/src/testUtils/infura.ts +10 -0
  284. package/src/testUtils/interop.ts +29 -0
  285. package/src/testUtils/params.ts +23 -0
  286. package/src/testUtils/state.ts +110 -0
  287. package/src/testUtils/testFileCache.ts +127 -0
  288. package/src/testUtils/util.ts +429 -0
  289. package/src/util/seed.ts +0 -71
  290. package/src/util/signatureSets.ts +23 -17
  291. package/src/util/weakSubjectivity.ts +1 -1
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.41.0-dev.21f758891e",
14
+ "version": "1.41.0-dev.241ad7952a",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -33,6 +33,11 @@
33
33
  "bun": "./src/slot/index.ts",
34
34
  "types": "./lib/slot/index.d.ts",
35
35
  "import": "./lib/slot/index.js"
36
+ },
37
+ "./test-utils": {
38
+ "bun": "./src/testUtils/index.ts",
39
+ "types": "./lib/testUtils/index.d.ts",
40
+ "import": "./lib/testUtils/index.js"
36
41
  }
37
42
  },
38
43
  "files": [
@@ -42,11 +47,11 @@
42
47
  ],
43
48
  "scripts": {
44
49
  "clean": "rm -rf lib && rm -f *.tsbuildinfo",
45
- "build": "tsc -p tsconfig.build.json",
50
+ "build": "tsgo -p tsconfig.build.json",
46
51
  "build:watch": "pnpm run build --watch",
47
52
  "build:release": "pnpm clean && pnpm build",
48
53
  "check-build": "node -e \"(async function() { await import('./lib/index.js') })()\"",
49
- "check-types": "tsc",
54
+ "check-types": "tsgo",
50
55
  "lint": "biome check src/ test/",
51
56
  "lint:fix": "pnpm run lint --write",
52
57
  "test": "pnpm test:unit",
@@ -62,14 +67,14 @@
62
67
  "@chainsafe/pubkey-index-map": "^3.0.0",
63
68
  "@chainsafe/ssz": "^1.2.2",
64
69
  "@chainsafe/swap-or-not-shuffle": "^1.2.1",
65
- "@lodestar/config": "^1.41.0-dev.21f758891e",
66
- "@lodestar/params": "^1.41.0-dev.21f758891e",
67
- "@lodestar/types": "^1.41.0-dev.21f758891e",
68
- "@lodestar/utils": "^1.41.0-dev.21f758891e",
70
+ "@lodestar/config": "^1.41.0-dev.241ad7952a",
71
+ "@lodestar/params": "^1.41.0-dev.241ad7952a",
72
+ "@lodestar/types": "^1.41.0-dev.241ad7952a",
73
+ "@lodestar/utils": "^1.41.0-dev.241ad7952a",
69
74
  "@vekexasia/bigint-buffer2": "^1.1.0"
70
75
  },
71
76
  "devDependencies": {
72
- "@lodestar/api": "^1.41.0-dev.21f758891e"
77
+ "@lodestar/api": "^1.41.0-dev.241ad7952a"
73
78
  },
74
79
  "keywords": [
75
80
  "ethereum",
@@ -77,5 +82,5 @@
77
82
  "beacon",
78
83
  "blockchain"
79
84
  ],
80
- "gitHead": "f70fd7027327c2d5bcf415b6743746b1550fa87d"
85
+ "gitHead": "e4b15800d2606e62f12ab5457bc72c170b5c7559"
81
86
  }
@@ -18,6 +18,8 @@ export enum DataAvailabilityStatus {
18
18
  /* validator activities can't be performed on out of range data */
19
19
  OutOfRange = "OutOfRange",
20
20
  Available = "Available",
21
+ /* Gloas: beacon blocks have no DA requirement, execution payload is separate */
22
+ NotRequired = "NotRequired",
21
23
  }
22
24
 
23
25
  export interface BlockExternalData {
@@ -13,10 +13,10 @@ import {processBlobKzgCommitments} from "./processBlobKzgCommitments.js";
13
13
  import {processBlockHeader} from "./processBlockHeader.js";
14
14
  import {processEth1Data} from "./processEth1Data.js";
15
15
  import {processExecutionPayload} from "./processExecutionPayload.js";
16
- import {processExecutionPayloadBid} from "./processExecutionPayloadBid.ts";
17
- import {processExecutionPayloadEnvelope} from "./processExecutionPayloadEnvelope.ts";
16
+ import {processExecutionPayloadBid} from "./processExecutionPayloadBid.js";
17
+ import {processExecutionPayloadEnvelope} from "./processExecutionPayloadEnvelope.js";
18
18
  import {processOperations} from "./processOperations.js";
19
- import {processPayloadAttestation} from "./processPayloadAttestation.ts";
19
+ import {processPayloadAttestation} from "./processPayloadAttestation.js";
20
20
  import {processRandao} from "./processRandao.js";
21
21
  import {processSyncAggregate} from "./processSyncCommittee.js";
22
22
  import {processWithdrawals} from "./processWithdrawals.js";
@@ -1,7 +1,7 @@
1
1
  import {BeaconConfig} from "@lodestar/config";
2
2
  import {ForkSeq, MAX_COMMITTEES_PER_SLOT, MAX_VALIDATORS_PER_COMMITTEE} from "@lodestar/params";
3
3
  import {IndexedAttestation, IndexedAttestationBigint, Slot} from "@lodestar/types";
4
- import {Index2PubkeyCache} from "../cache/pubkeyCache.js";
4
+ import {PubkeyCache} from "../cache/pubkeyCache.js";
5
5
  import {getIndexedAttestationBigintSignatureSet, getIndexedAttestationSignatureSet} from "../signatureSets/index.js";
6
6
  import {verifySignatureSet} from "../util/index.js";
7
7
 
@@ -10,7 +10,7 @@ import {verifySignatureSet} from "../util/index.js";
10
10
  */
11
11
  export function isValidIndexedAttestation(
12
12
  config: BeaconConfig,
13
- index2pubkey: Index2PubkeyCache,
13
+ pubkeyCache: PubkeyCache,
14
14
  stateSlot: Slot,
15
15
  validatorsLen: number,
16
16
  indexedAttestation: IndexedAttestation,
@@ -21,14 +21,14 @@ export function isValidIndexedAttestation(
21
21
  }
22
22
 
23
23
  if (verifySignature) {
24
- return verifySignatureSet(getIndexedAttestationSignatureSet(config, stateSlot, indexedAttestation), index2pubkey);
24
+ return verifySignatureSet(getIndexedAttestationSignatureSet(config, stateSlot, indexedAttestation), pubkeyCache);
25
25
  }
26
26
  return true;
27
27
  }
28
28
 
29
29
  export function isValidIndexedAttestationBigint(
30
30
  config: BeaconConfig,
31
- index2pubkey: Index2PubkeyCache,
31
+ pubkeyCache: PubkeyCache,
32
32
  stateSlot: Slot,
33
33
  validatorsLen: number,
34
34
  indexedAttestation: IndexedAttestationBigint,
@@ -41,7 +41,7 @@ export function isValidIndexedAttestationBigint(
41
41
  if (verifySignature) {
42
42
  return verifySignatureSet(
43
43
  getIndexedAttestationBigintSignatureSet(config, stateSlot, indexedAttestation),
44
- index2pubkey
44
+ pubkeyCache
45
45
  );
46
46
  }
47
47
  return true;
@@ -1,7 +1,7 @@
1
1
  import {gloas} from "@lodestar/types";
2
- import {getIndexedPayloadAttestationSignatureSet} from "../signatureSets/index.ts";
2
+ import {getIndexedPayloadAttestationSignatureSet} from "../signatureSets/index.js";
3
3
  import {CachedBeaconStateGloas} from "../types.js";
4
- import {verifySignatureSet} from "../util/index.ts";
4
+ import {verifySignatureSet} from "../util/index.js";
5
5
 
6
6
  export function isValidIndexedPayloadAttestation(
7
7
  state: CachedBeaconStateGloas,
@@ -18,7 +18,7 @@ export function isValidIndexedPayloadAttestation(
18
18
  if (verifySignature) {
19
19
  return verifySignatureSet(
20
20
  getIndexedPayloadAttestationSignatureSet(state.config, indexedPayloadAttestation),
21
- state.epochCtx.index2pubkey
21
+ state.epochCtx.pubkeyCache
22
22
  );
23
23
  }
24
24
 
@@ -53,7 +53,7 @@ export function processAttestationPhase0(
53
53
  if (
54
54
  !isValidIndexedAttestation(
55
55
  state.config,
56
- epochCtx.index2pubkey,
56
+ epochCtx.pubkeyCache,
57
57
  state.slot,
58
58
  state.validators.length,
59
59
  epochCtx.getIndexedAttestation(ForkSeq.phase0, attestation),
@@ -18,7 +18,7 @@ import {byteArrayEquals, intSqrt} from "@lodestar/utils";
18
18
  import {BeaconStateTransitionMetrics} from "../metrics.js";
19
19
  import {getAttestationWithIndicesSignatureSet} from "../signatureSets/indexedAttestation.js";
20
20
  import {CachedBeaconStateAltair, CachedBeaconStateGloas} from "../types.js";
21
- import {isAttestationSameSlot, isAttestationSameSlotRootCache} from "../util/gloas.ts";
21
+ import {isAttestationSameSlot, isAttestationSameSlotRootCache} from "../util/gloas.js";
22
22
  import {increaseBalance, verifySignatureSet} from "../util/index.js";
23
23
  import {RootCache} from "../util/rootCache.js";
24
24
  import {checkpointToStr, isTimelyTarget, validateAttestation} from "./processAttestationPhase0.js";
@@ -64,7 +64,7 @@ export function processAttestationsAltair(
64
64
  // we can verify only that and nothing else.
65
65
  if (verifySignature) {
66
66
  const sigSet = getAttestationWithIndicesSignatureSet(state.config, state.slot, attestation, attestingIndices);
67
- if (!verifySignatureSet(sigSet, state.epochCtx.index2pubkey)) {
67
+ if (!verifySignatureSet(sigSet, state.epochCtx.pubkeyCache)) {
68
68
  throw new Error("Attestation signature is not valid");
69
69
  }
70
70
  }
@@ -1,7 +1,7 @@
1
1
  import {BeaconConfig} from "@lodestar/config";
2
2
  import {ForkSeq} from "@lodestar/params";
3
3
  import {AttesterSlashing, Slot} from "@lodestar/types";
4
- import {Index2PubkeyCache} from "../cache/pubkeyCache.js";
4
+ import {PubkeyCache} from "../cache/pubkeyCache.js";
5
5
  import {CachedBeaconStateAllForks} from "../types.js";
6
6
  import {getAttesterSlashableIndices, isSlashableAttestationData, isSlashableValidator} from "../util/index.js";
7
7
  import {isValidIndexedAttestationBigint} from "./isValidIndexedAttestation.js";
@@ -22,7 +22,7 @@ export function processAttesterSlashing(
22
22
  const {epochCtx} = state;
23
23
  assertValidAttesterSlashing(
24
24
  state.config,
25
- epochCtx.index2pubkey,
25
+ epochCtx.pubkeyCache,
26
26
  state.slot,
27
27
  state.validators.length,
28
28
  attesterSlashing,
@@ -48,7 +48,7 @@ export function processAttesterSlashing(
48
48
 
49
49
  export function assertValidAttesterSlashing(
50
50
  config: BeaconConfig,
51
- index2pubkey: Index2PubkeyCache,
51
+ pubkeyCache: PubkeyCache,
52
52
  stateSlot: Slot,
53
53
  validatorsLen: number,
54
54
  attesterSlashing: AttesterSlashing,
@@ -66,7 +66,7 @@ export function assertValidAttesterSlashing(
66
66
  // can be any arbitrary value. Must use bigint variants to hash correctly to all possible values
67
67
  for (const [i, attestation] of [attestation1, attestation2].entries()) {
68
68
  if (
69
- !isValidIndexedAttestationBigint(config, index2pubkey, stateSlot, validatorsLen, attestation, verifySignatures)
69
+ !isValidIndexedAttestationBigint(config, pubkeyCache, stateSlot, validatorsLen, attestation, verifySignatures)
70
70
  ) {
71
71
  throw new Error(`AttesterSlashing attestation${i} is invalid`);
72
72
  }
@@ -2,11 +2,11 @@ import {PublicKey, Signature, verify} from "@chainsafe/blst";
2
2
  import {BUILDER_INDEX_SELF_BUILD, ForkPostGloas, SLOTS_PER_EPOCH} from "@lodestar/params";
3
3
  import {BeaconBlock, gloas, ssz} from "@lodestar/types";
4
4
  import {byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
5
- import {G2_POINT_AT_INFINITY} from "../constants/constants.ts";
5
+ import {G2_POINT_AT_INFINITY} from "../constants/constants.js";
6
6
  import {getExecutionPayloadBidSigningRoot} from "../signatureSets/executionPayloadBid.js";
7
- import {CachedBeaconStateGloas} from "../types.ts";
8
- import {canBuilderCoverBid, isActiveBuilder} from "../util/gloas.ts";
9
- import {getCurrentEpoch, getRandaoMix} from "../util/index.ts";
7
+ import {CachedBeaconStateGloas} from "../types.js";
8
+ import {canBuilderCoverBid, isActiveBuilder} from "../util/gloas.js";
9
+ import {getCurrentEpoch, getRandaoMix} from "../util/index.js";
10
10
 
11
11
  export function processExecutionPayloadBid(state: CachedBeaconStateGloas, block: BeaconBlock<ForkPostGloas>): void {
12
12
  const signedBid = block.body.signedExecutionPayloadBid;
@@ -7,18 +7,25 @@ import {
7
7
  } from "@lodestar/params";
8
8
  import {gloas, ssz} from "@lodestar/types";
9
9
  import {byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
10
- import {CachedBeaconStateGloas} from "../types.ts";
11
- import {computeSigningRoot, computeTimeAtSlot} from "../util/index.ts";
12
- import {processConsolidationRequest} from "./processConsolidationRequest.ts";
13
- import {processDepositRequest} from "./processDepositRequest.ts";
14
- import {processWithdrawalRequest} from "./processWithdrawalRequest.ts";
15
-
16
- // This function does not call execution engine to verify payload. Need to call it from other place
10
+ import {CachedBeaconStateGloas} from "../types.js";
11
+ import {computeSigningRoot, computeTimeAtSlot} from "../util/index.js";
12
+ import {processConsolidationRequest} from "./processConsolidationRequest.js";
13
+ import {processDepositRequest} from "./processDepositRequest.js";
14
+ import {processWithdrawalRequest} from "./processWithdrawalRequest.js";
15
+
16
+ export type ProcessExecutionPayloadEnvelopeOpts = {
17
+ dontTransferCache?: boolean;
18
+ };
19
+
20
+ // Unlike other block processing functions which mutate state in-place, this function
21
+ // clones the state and returns the post-state, similar to stateTransition().
22
+ // This function does not call execution engine to verify payload. Need to call it from other place.
17
23
  export function processExecutionPayloadEnvelope(
18
24
  state: CachedBeaconStateGloas,
19
25
  signedEnvelope: gloas.SignedExecutionPayloadEnvelope,
20
- verify: boolean
21
- ): void {
26
+ verify: boolean,
27
+ opts?: ProcessExecutionPayloadEnvelopeOpts
28
+ ): CachedBeaconStateGloas {
22
29
  const envelope = signedEnvelope.message;
23
30
  const payload = envelope.payload;
24
31
  const fork = state.config.getForkSeq(envelope.slot);
@@ -27,42 +34,49 @@ export function processExecutionPayloadEnvelope(
27
34
  throw Error(`Execution payload envelope has invalid signature builderIndex=${envelope.builderIndex}`);
28
35
  }
29
36
 
30
- validateExecutionPayloadEnvelope(state, envelope);
37
+ // .clone() before mutating state, similar to stateTransition()
38
+ const postState = state.clone(opts?.dontTransferCache) as CachedBeaconStateGloas;
39
+
40
+ validateExecutionPayloadEnvelope(postState, envelope);
31
41
 
32
42
  const requests = envelope.executionRequests;
33
43
 
34
44
  for (const deposit of requests.deposits) {
35
- processDepositRequest(fork, state, deposit);
45
+ processDepositRequest(fork, postState, deposit);
36
46
  }
37
47
 
38
48
  for (const withdrawal of requests.withdrawals) {
39
- processWithdrawalRequest(fork, state, withdrawal);
49
+ processWithdrawalRequest(fork, postState, withdrawal);
40
50
  }
41
51
 
42
52
  for (const consolidation of requests.consolidations) {
43
- processConsolidationRequest(state, consolidation);
53
+ processConsolidationRequest(postState, consolidation);
44
54
  }
45
55
 
46
56
  // Queue the builder payment
47
- const paymentIndex = SLOTS_PER_EPOCH + (state.slot % SLOTS_PER_EPOCH);
48
- const payment = state.builderPendingPayments.get(paymentIndex).clone();
57
+ const paymentIndex = SLOTS_PER_EPOCH + (postState.slot % SLOTS_PER_EPOCH);
58
+ const payment = postState.builderPendingPayments.get(paymentIndex).clone();
49
59
  const amount = payment.withdrawal.amount;
50
60
 
51
61
  if (amount > 0) {
52
- state.builderPendingWithdrawals.push(payment.withdrawal);
62
+ postState.builderPendingWithdrawals.push(payment.withdrawal);
53
63
  }
54
64
 
55
- state.builderPendingPayments.set(paymentIndex, ssz.gloas.BuilderPendingPayment.defaultViewDU());
65
+ postState.builderPendingPayments.set(paymentIndex, ssz.gloas.BuilderPendingPayment.defaultViewDU());
56
66
 
57
67
  // Cache the execution payload hash
58
- state.executionPayloadAvailability.set(state.slot % SLOTS_PER_HISTORICAL_ROOT, true);
59
- state.latestBlockHash = payload.blockHash;
68
+ postState.executionPayloadAvailability.set(postState.slot % SLOTS_PER_HISTORICAL_ROOT, true);
69
+ postState.latestBlockHash = payload.blockHash;
60
70
 
61
- if (verify && !byteArrayEquals(envelope.stateRoot, state.hashTreeRoot())) {
71
+ postState.commit();
72
+
73
+ if (verify && !byteArrayEquals(envelope.stateRoot, postState.hashTreeRoot())) {
62
74
  throw new Error(
63
- `Envelope's state root does not match state envelope=${toRootHex(envelope.stateRoot)} state=${toRootHex(state.hashTreeRoot())}`
75
+ `Envelope's state root does not match state envelope=${toRootHex(envelope.stateRoot)} state=${toRootHex(postState.hashTreeRoot())}`
64
76
  );
65
77
  }
78
+
79
+ return postState;
66
80
  }
67
81
 
68
82
  function validateExecutionPayloadEnvelope(
@@ -156,7 +170,11 @@ function verifyExecutionPayloadEnvelopeSignature(
156
170
 
157
171
  if (builderIndex === BUILDER_INDEX_SELF_BUILD) {
158
172
  const validatorIndex = state.latestBlockHeader.proposerIndex;
159
- publicKey = state.epochCtx.index2pubkey[validatorIndex];
173
+ const proposerPubkey = state.epochCtx.pubkeyCache.get(validatorIndex);
174
+ if (!proposerPubkey) {
175
+ return false;
176
+ }
177
+ publicKey = proposerPubkey;
160
178
  } else {
161
179
  publicKey = PublicKey.fromBytes(state.builders.getReadonly(builderIndex).pubkey);
162
180
  }
@@ -14,7 +14,7 @@ import {processBlsToExecutionChange} from "./processBlsToExecutionChange.js";
14
14
  import {processConsolidationRequest} from "./processConsolidationRequest.js";
15
15
  import {processDeposit} from "./processDeposit.js";
16
16
  import {processDepositRequest} from "./processDepositRequest.js";
17
- import {processPayloadAttestation} from "./processPayloadAttestation.ts";
17
+ import {processPayloadAttestation} from "./processPayloadAttestation.js";
18
18
  import {processProposerSlashing} from "./processProposerSlashing.js";
19
19
  import {processVoluntaryExit} from "./processVoluntaryExit.js";
20
20
  import {processWithdrawalRequest} from "./processWithdrawalRequest.js";
@@ -1,7 +1,7 @@
1
1
  import {gloas} from "@lodestar/types";
2
2
  import {byteArrayEquals} from "@lodestar/utils";
3
- import {CachedBeaconStateGloas} from "../types.ts";
4
- import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestation.ts";
3
+ import {CachedBeaconStateGloas} from "../types.js";
4
+ import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestation.js";
5
5
 
6
6
  export function processPayloadAttestation(
7
7
  state: CachedBeaconStateGloas,
@@ -2,7 +2,7 @@ import {BeaconConfig} from "@lodestar/config";
2
2
  import {ForkSeq, SLOTS_PER_EPOCH} from "@lodestar/params";
3
3
  import {Slot, phase0, ssz} from "@lodestar/types";
4
4
  import {Validator} from "@lodestar/types/phase0";
5
- import {Index2PubkeyCache} from "../cache/pubkeyCache.js";
5
+ import {PubkeyCache} from "../cache/pubkeyCache.js";
6
6
  import {getProposerSlashingSignatureSets} from "../signatureSets/index.js";
7
7
  import {CachedBeaconStateAllForks, CachedBeaconStateGloas} from "../types.js";
8
8
  import {computeEpochAtSlot, isSlashableValidator} from "../util/index.js";
@@ -24,7 +24,7 @@ export function processProposerSlashing(
24
24
  const proposer = state.validators.getReadonly(proposerSlashing.signedHeader1.message.proposerIndex);
25
25
  assertValidProposerSlashing(
26
26
  state.config,
27
- state.epochCtx.index2pubkey,
27
+ state.epochCtx.pubkeyCache,
28
28
  state.slot,
29
29
  proposerSlashing,
30
30
  proposer,
@@ -57,7 +57,7 @@ export function processProposerSlashing(
57
57
 
58
58
  export function assertValidProposerSlashing(
59
59
  config: BeaconConfig,
60
- index2pubkey: Index2PubkeyCache,
60
+ pubkeyCache: PubkeyCache,
61
61
  stateSlot: Slot,
62
62
  proposerSlashing: phase0.ProposerSlashing,
63
63
  proposer: Validator,
@@ -94,7 +94,7 @@ export function assertValidProposerSlashing(
94
94
  if (verifySignatures) {
95
95
  const signatureSets = getProposerSlashingSignatureSets(config, stateSlot, proposerSlashing);
96
96
  for (let i = 0; i < signatureSets.length; i++) {
97
- if (!verifySignatureSet(signatureSets[i], index2pubkey)) {
97
+ if (!verifySignatureSet(signatureSets[i], pubkeyCache)) {
98
98
  throw new Error(`ProposerSlashing header${i + 1} signature invalid`);
99
99
  }
100
100
  }
@@ -17,7 +17,7 @@ export function processRandao(state: CachedBeaconStateAllForks, block: BeaconBlo
17
17
  const randaoReveal = block.body.randaoReveal;
18
18
 
19
19
  // verify RANDAO reveal
20
- if (verifySignature && !verifyRandaoSignature(config, epochCtx.index2pubkey, block)) {
20
+ if (verifySignature && !verifyRandaoSignature(config, epochCtx.pubkeyCache, block)) {
21
21
  throw new Error("RANDAO reveal is an invalid signature");
22
22
  }
23
23
 
@@ -32,7 +32,7 @@ export function processSyncAggregate(
32
32
  participantIndices
33
33
  );
34
34
  // When there's no participation we consider the signature valid and just ignore it
35
- if (signatureSet !== null && !verifySignatureSet(signatureSet, state.epochCtx.index2pubkey)) {
35
+ if (signatureSet !== null && !verifySignatureSet(signatureSet, state.epochCtx.pubkeyCache)) {
36
36
  throw Error("Sync committee signature invalid");
37
37
  }
38
38
  }
@@ -131,7 +131,7 @@ export function getVoluntaryExitValidity(
131
131
 
132
132
  if (
133
133
  verifySignature &&
134
- !verifyVoluntaryExitSignature(state.config, epochCtx.index2pubkey, state.slot, signedVoluntaryExit)
134
+ !verifyVoluntaryExitSignature(state.config, epochCtx.pubkeyCache, state.slot, signedVoluntaryExit)
135
135
  ) {
136
136
  return VoluntaryExitValidity.invalidSignature;
137
137
  }
@@ -21,7 +21,7 @@ export function processWithdrawalRequest(
21
21
  const amount = Number(withdrawalRequest.amount);
22
22
  const {pendingPartialWithdrawals, validators, epochCtx} = state;
23
23
  // no need to use unfinalized pubkey cache from 6110 as validator won't be active anyway
24
- const {pubkey2index, config} = epochCtx;
24
+ const {pubkeyCache, config} = epochCtx;
25
25
  const isFullExitRequest = amount === FULL_EXIT_REQUEST_AMOUNT;
26
26
 
27
27
  // If partial withdrawal queue is full, only full exits are processed
@@ -31,7 +31,7 @@ export function processWithdrawalRequest(
31
31
 
32
32
  // bail out if validator is not in beacon state
33
33
  // note that we don't need to check for 6110 unfinalized vals as they won't be eligible for withdraw/exit anyway
34
- const validatorIndex = pubkey2index.get(withdrawalRequest.validatorPubkey);
34
+ const validatorIndex = pubkeyCache.getIndex(withdrawalRequest.validatorPubkey);
35
35
  if (validatorIndex === null) {
36
36
  return;
37
37
  }
@@ -16,7 +16,7 @@ import {
16
16
  convertValidatorIndexToBuilderIndex,
17
17
  isBuilderIndex,
18
18
  isParentBlockFull,
19
- } from "../util/gloas.ts";
19
+ } from "../util/gloas.js";
20
20
  import {
21
21
  decreaseBalance,
22
22
  getMaxEffectiveBalance,