@lodestar/state-transition 1.45.0-dev.fadf0fbb1f → 1.46.0-dev.8fc4e297d2

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 (105) hide show
  1. package/lib/block/processAttestationsAltair.d.ts +4 -1
  2. package/lib/block/processAttestationsAltair.d.ts.map +1 -1
  3. package/lib/block/processAttestationsAltair.js +7 -5
  4. package/lib/block/processAttestationsAltair.js.map +1 -1
  5. package/lib/block/processBuilderDepositRequest.d.ts.map +1 -1
  6. package/lib/block/processBuilderDepositRequest.js +13 -7
  7. package/lib/block/processBuilderDepositRequest.js.map +1 -1
  8. package/lib/block/processOperations.d.ts.map +1 -1
  9. package/lib/block/processOperations.js +17 -1
  10. package/lib/block/processOperations.js.map +1 -1
  11. package/lib/block/processParentExecutionPayload.d.ts.map +1 -1
  12. package/lib/block/processParentExecutionPayload.js +15 -1
  13. package/lib/block/processParentExecutionPayload.js.map +1 -1
  14. package/lib/block/processWithdrawals.js +1 -1
  15. package/lib/block/processWithdrawals.js.map +1 -1
  16. package/lib/cache/stateCache.d.ts.map +1 -1
  17. package/lib/cache/stateCache.js +2 -4
  18. package/lib/cache/stateCache.js.map +1 -1
  19. package/lib/epoch/processParticipationFlagUpdates.d.ts +2 -2
  20. package/lib/epoch/processParticipationFlagUpdates.d.ts.map +1 -1
  21. package/lib/epoch/processParticipationFlagUpdates.js +13 -0
  22. package/lib/epoch/processParticipationFlagUpdates.js.map +1 -1
  23. package/lib/epoch/processRewardsAndPenalties.d.ts.map +1 -1
  24. package/lib/epoch/processRewardsAndPenalties.js +1 -2
  25. package/lib/epoch/processRewardsAndPenalties.js.map +1 -1
  26. package/lib/lightClient/proofs.d.ts.map +1 -1
  27. package/lib/lightClient/proofs.js +28 -2
  28. package/lib/lightClient/proofs.js.map +1 -1
  29. package/lib/lightClient/spec/index.d.ts.map +1 -1
  30. package/lib/lightClient/spec/index.js +7 -4
  31. package/lib/lightClient/spec/index.js.map +1 -1
  32. package/lib/lightClient/spec/processLightClientUpdate.d.ts.map +1 -1
  33. package/lib/lightClient/spec/processLightClientUpdate.js +8 -2
  34. package/lib/lightClient/spec/processLightClientUpdate.js.map +1 -1
  35. package/lib/lightClient/spec/utils.d.ts +7 -2
  36. package/lib/lightClient/spec/utils.d.ts.map +1 -1
  37. package/lib/lightClient/spec/utils.js +130 -19
  38. package/lib/lightClient/spec/utils.js.map +1 -1
  39. package/lib/lightClient/spec/validateLightClientBootstrap.d.ts.map +1 -1
  40. package/lib/lightClient/spec/validateLightClientBootstrap.js +2 -7
  41. package/lib/lightClient/spec/validateLightClientBootstrap.js.map +1 -1
  42. package/lib/lightClient/spec/validateLightClientUpdate.d.ts.map +1 -1
  43. package/lib/lightClient/spec/validateLightClientUpdate.js +6 -5
  44. package/lib/lightClient/spec/validateLightClientUpdate.js.map +1 -1
  45. package/lib/lightClient/types.d.ts +3 -1
  46. package/lib/lightClient/types.d.ts.map +1 -1
  47. package/lib/metrics.js +2 -4
  48. package/lib/metrics.js.map +1 -1
  49. package/lib/slot/upgradeStateToAltair.js +1 -1
  50. package/lib/slot/upgradeStateToAltair.js.map +1 -1
  51. package/lib/slot/upgradeStateToGloas.d.ts.map +1 -1
  52. package/lib/slot/upgradeStateToGloas.js +48 -9
  53. package/lib/slot/upgradeStateToGloas.js.map +1 -1
  54. package/lib/stateView/beaconStateView.d.ts +0 -1
  55. package/lib/stateView/beaconStateView.d.ts.map +1 -1
  56. package/lib/stateView/beaconStateView.js +0 -8
  57. package/lib/stateView/beaconStateView.js.map +1 -1
  58. package/lib/stateView/interface.d.ts +0 -1
  59. package/lib/stateView/interface.d.ts.map +1 -1
  60. package/lib/stateView/interface.js.map +1 -1
  61. package/lib/stateView/nativeBeaconStateView.d.ts +0 -2
  62. package/lib/stateView/nativeBeaconStateView.d.ts.map +1 -1
  63. package/lib/stateView/nativeBeaconStateView.js +0 -9
  64. package/lib/stateView/nativeBeaconStateView.js.map +1 -1
  65. package/lib/util/execution.d.ts.map +1 -1
  66. package/lib/util/execution.js +7 -2
  67. package/lib/util/execution.js.map +1 -1
  68. package/lib/util/gloas.d.ts +3 -1
  69. package/lib/util/gloas.d.ts.map +1 -1
  70. package/lib/util/gloas.js +8 -11
  71. package/lib/util/gloas.js.map +1 -1
  72. package/lib/util/index.d.ts +1 -0
  73. package/lib/util/index.d.ts.map +1 -1
  74. package/lib/util/index.js +1 -0
  75. package/lib/util/index.js.map +1 -1
  76. package/lib/util/ssz.d.ts +9 -0
  77. package/lib/util/ssz.d.ts.map +1 -0
  78. package/lib/util/ssz.js +39 -0
  79. package/lib/util/ssz.js.map +1 -0
  80. package/package.json +11 -11
  81. package/src/block/processAttestationsAltair.ts +9 -6
  82. package/src/block/processBuilderDepositRequest.ts +21 -8
  83. package/src/block/processOperations.ts +28 -1
  84. package/src/block/processParentExecutionPayload.ts +26 -1
  85. package/src/block/processWithdrawals.ts +1 -1
  86. package/src/cache/stateCache.ts +2 -4
  87. package/src/epoch/processParticipationFlagUpdates.ts +20 -2
  88. package/src/epoch/processRewardsAndPenalties.ts +1 -2
  89. package/src/lightClient/proofs.ts +36 -1
  90. package/src/lightClient/spec/index.ts +8 -4
  91. package/src/lightClient/spec/processLightClientUpdate.ts +13 -1
  92. package/src/lightClient/spec/utils.ts +200 -30
  93. package/src/lightClient/spec/validateLightClientBootstrap.ts +3 -10
  94. package/src/lightClient/spec/validateLightClientUpdate.ts +11 -21
  95. package/src/lightClient/types.ts +3 -1
  96. package/src/metrics.ts +2 -4
  97. package/src/slot/upgradeStateToAltair.ts +1 -1
  98. package/src/slot/upgradeStateToGloas.ts +84 -9
  99. package/src/stateView/beaconStateView.ts +0 -8
  100. package/src/stateView/interface.ts +0 -1
  101. package/src/stateView/nativeBeaconStateView.ts +0 -10
  102. package/src/util/execution.ts +9 -4
  103. package/src/util/gloas.ts +9 -14
  104. package/src/util/index.ts +1 -0
  105. package/src/util/ssz.ts +42 -0
@@ -61,7 +61,9 @@ export declare function initiateBuilderExit(state: CachedBeaconStateGloas, build
61
61
  * May consider builder pubkey cache if performance becomes an issue.
62
62
  */
63
63
  export declare function findBuilderIndexByPubkey(state: CachedBeaconStateGloas, pubkey: Uint8Array): BuilderIndex | null;
64
- export declare function isAttestationSameSlot(state: CachedBeaconStateGloas, data: AttestationData): boolean;
64
+ /**
65
+ * Use cached block roots to avoid repeated state root lookups while matching the spec's is_attestation_same_slot behavior.
66
+ */
65
67
  export declare function isAttestationSameSlotRootCache(rootCache: RootCache, data: AttestationData): boolean;
66
68
  export declare function initializePtcWindow(state: CachedBeaconStateFulu): Uint32Array[];
67
69
  export declare function getPtcWindowEpochCacheData(state: CachedBeaconStateGloas): {
@@ -1 +1 @@
1
- {"version":3,"file":"gloas.d.ts","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAc9C,OAAO,EAAC,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAM,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAC,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAK1E,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAKzC,wBAAgB,6BAA6B,CAAC,qBAAqB,EAAE,UAAU,GAAG,OAAO,CAExF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAMtF;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,CAG9F;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAGhG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,GAAG,OAAO,CAEtF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAU1F;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAEpH;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,GACzB,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAWnG;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAO/G;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAOnG;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAOnG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,WAAW,EAAE,CAqB/E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,sBAAsB,GAAG;IACzE,mCAAmC,EAAE,WAAW,EAAE,CAAC;IACnD,2BAA2B,EAAE,WAAW,EAAE,CAAC;IAC3C,+BAA+B,EAAE,WAAW,EAAE,CAAC;CAChD,CAaA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,UAAU,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CA2BN;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,UAAU,EAClB,qBAAqB,EAAE,UAAU,EACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,UAAU,GACpB,OAAO,CAWT"}
1
+ {"version":3,"file":"gloas.d.ts","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAc9C,OAAO,EAAC,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAM,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAC,qBAAqB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAI1E,OAAO,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAKzC,wBAAgB,6BAA6B,CAAC,qBAAqB,EAAE,UAAU,GAAG,OAAO,CAExF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAQtF;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,CAG9F;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,cAAc,EAAE,cAAc,GAAG,YAAY,CAGhG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,GAAG,OAAO,CAEtF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAU1F;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAEpH;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,GACzB,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,sBAAsB,EAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAWnG;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAO/G;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAOnG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,WAAW,EAAE,CAqB/E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,sBAAsB,GAAG;IACzE,mCAAmC,EAAE,WAAW,EAAE,CAAC;IACnD,2BAA2B,EAAE,WAAW,EAAE,CAAC;IAC3C,+BAA+B,EAAE,WAAW,EAAE,CAAC;CAChD,CAaA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,UAAU,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CA2BN;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,UAAU,EAClB,qBAAqB,EAAE,UAAU,EACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,UAAU,GACpB,OAAO,CAWT"}
package/lib/util/gloas.js CHANGED
@@ -3,7 +3,6 @@ import { BUILDER_INDEX_FLAG, BUILDER_PAYMENT_THRESHOLD_DENOMINATOR, BUILDER_PAYM
3
3
  import { ssz } from "@lodestar/types";
4
4
  import { byteArrayEquals } from "@lodestar/utils";
5
5
  import { ZERO_HASH } from "../constants/index.js";
6
- import { getBlockRootAtSlot } from "./blockRoot.js";
7
6
  import { computeDomain } from "./domain.js";
8
7
  import { computeEpochAtSlot } from "./epoch.js";
9
8
  import { computeEpochShuffling } from "./epochShuffling.js";
@@ -14,9 +13,11 @@ export function isBuilderWithdrawalCredential(withdrawalCredentials) {
14
13
  return withdrawalCredentials[0] === BUILDER_WITHDRAWAL_PREFIX;
15
14
  }
16
15
  export function getBuilderPaymentQuorumThreshold(state) {
17
- const quorum = Math.floor((state.epochCtx.totalActiveBalanceIncrements * EFFECTIVE_BALANCE_INCREMENT) / SLOTS_PER_EPOCH) *
18
- BUILDER_PAYMENT_THRESHOLD_NUMERATOR;
19
- return Math.floor(quorum / BUILDER_PAYMENT_THRESHOLD_DENOMINATOR);
16
+ // total active balance exceeds Number.MAX_SAFE_INTEGER at mainnet scale, keep the intermediate math in bigint
17
+ const perSlotBalance = (BigInt(state.epochCtx.totalActiveBalanceIncrements) * BigInt(EFFECTIVE_BALANCE_INCREMENT)) /
18
+ BigInt(SLOTS_PER_EPOCH);
19
+ const quorum = perSlotBalance * BigInt(BUILDER_PAYMENT_THRESHOLD_NUMERATOR);
20
+ return Number(quorum / BigInt(BUILDER_PAYMENT_THRESHOLD_DENOMINATOR));
20
21
  }
21
22
  function hasBuilderIndexFlag(index) {
22
23
  // Equivalent to `(index & BUILDER_INDEX_FLAG) != 0`
@@ -140,13 +141,9 @@ export function findBuilderIndexByPubkey(state, pubkey) {
140
141
  }
141
142
  return null;
142
143
  }
143
- export function isAttestationSameSlot(state, data) {
144
- if (data.slot === 0)
145
- return true;
146
- const isMatchingBlockRoot = byteArrayEquals(data.beaconBlockRoot, getBlockRootAtSlot(state, data.slot));
147
- const isCurrentBlockRoot = !byteArrayEquals(data.beaconBlockRoot, getBlockRootAtSlot(state, data.slot - 1));
148
- return isMatchingBlockRoot && isCurrentBlockRoot;
149
- }
144
+ /**
145
+ * Use cached block roots to avoid repeated state root lookups while matching the spec's is_attestation_same_slot behavior.
146
+ */
150
147
  export function isAttestationSameSlotRootCache(rootCache, data) {
151
148
  if (data.slot === 0)
152
149
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"gloas.js","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EACL,kBAAkB,EAClB,qCAAqC,EACrC,mCAAmC,EACnC,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,QAAQ,EACR,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAA6C,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAEhF,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAC,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAC,kBAAkB,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAC,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAC,0CAA0C,EAAC,MAAM,WAAW,CAAC;AACrE,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,yBAAyB,EAAC,MAAM,gBAAgB,CAAC;AAEzD,MAAM,UAAU,6BAA6B,CAAC,qBAAiC,EAAW;IACxF,OAAO,qBAAqB,CAAC,CAAC,CAAC,KAAK,yBAAyB,CAAC;AAAA,CAC/D;AAED,MAAM,UAAU,gCAAgC,CAAC,KAA6B,EAAU;IACtF,MAAM,MAAM,GACV,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,4BAA4B,GAAG,2BAA2B,CAAC,GAAG,eAAe,CAAC;QACzG,mCAAmC,CAAC;IAEtC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,qCAAqC,CAAC,CAAC;AAAA,CACnE;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAW;IACnD,oDAAoD;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,CACzD;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,cAAsB,EAAW;IAC9D,uGAAuG;IACvG,OAAO,mBAAmB,CAAC,cAAc,CAAC,CAAC;AAAA,CAC5C;AAED;;;GAGG;AACH,MAAM,UAAU,mCAAmC,CAAC,YAA0B,EAAkB;IAC9F,sGAAsG;IACtG,OAAO,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,kBAAkB,CAAC;AAAA,CAC7F;AAED;;;GAGG;AACH,MAAM,UAAU,mCAAmC,CAAC,cAA8B,EAAgB;IAChG,uGAAuG;IACvG,OAAO,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC;AAAA,CACnG;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB,EAAE,cAAqB,EAAW;IACtF,OAAO,OAAO,CAAC,YAAY,GAAG,cAAc,IAAI,OAAO,CAAC,iBAAiB,KAAK,gBAAgB,CAAC;AAAA,CAChG;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,cAAsB,EAAE,cAAsB,EAAU;IAC1F,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAEjF,IAAI,cAAc,GAAG,cAAc,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,cAAc,GAAG,cAAc,CAAC;QAChD,OAAO,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,GAAG,cAAc,CAAC;IAChD,OAAO,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;AAAA,CAClE;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAAsB,EAAE,QAAgB,EAAE,cAAsB,EAAW;IACpH,OAAO,QAAQ,KAAK,mBAAmB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AAAA,CACzE;AAED;;;GAGG;AACH,MAAM,UAAU,qCAAqC,CACnD,KAA6B,EAC7B,YAA0B,EAClB;IACR,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,0BAA0B;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,UAAU,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;YAC7C,cAAc,IAAI,UAAU,CAAC,MAAM,CAAC;QACtC,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;YACrD,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AAAA,CACvB;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA6B,EAC7B,YAA0B,EAC1B,SAAiB,EACR;IACT,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,qCAAqC,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,kBAAkB,GAAG,cAAc,CAAC;IAEvD,IAAI,OAAO,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,GAAG,UAAU,IAAI,SAAS,CAAC;AAAA,CAClD;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA6B,EAAE,YAA0B,EAAQ;IACnG,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEjD,2CAA2C;IAC3C,IAAI,OAAO,CAAC,iBAAiB,KAAK,gBAAgB,EAAE,CAAC;QACnD,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,iBAAiB,GAAG,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC;AAAA,CAC3F;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAA6B,EAAE,MAAkB,EAAuB;IAC/G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,IAAI,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACb;AAED,MAAM,UAAU,qBAAqB,CAAC,KAA6B,EAAE,IAAqB,EAAW;IACnG,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,mBAAmB,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,MAAM,kBAAkB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAE5G,OAAO,mBAAmB,IAAI,kBAAkB,CAAC;AAAA,CAClD;AAED,MAAM,UAAU,8BAA8B,CAAC,SAAoB,EAAE,IAAqB,EAAW;IACnG,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,mBAAmB,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3G,MAAM,kBAAkB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAE/G,OAAO,mBAAmB,IAAI,kBAAkB,CAAC;AAAA,CAClD;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA4B,EAAiB;IAC/E,MAAM,SAAS,GAAkB,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,eAAe,EAAC,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxG,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IAE1C,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,IAAI,kBAAkB,EAAE,WAAW,EAAE,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;QACzC,MAAM,SAAS,GACb,KAAK,CAAC,QAAQ,CAAC,yBAAyB,CAAC,KAAK,CAAC;YAC/C,qBAAqB,CAAC,KAAK,EAAE,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QAE/E,SAAS,CAAC,IAAI,CACZ,GAAG,0CAA0C,CAC3C,KAAK,EACL,KAAK,EACL,SAAS,CAAC,UAAU,EACpB,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAC1C,CACF,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AAAA,CAClB;AAED,MAAM,UAAU,0BAA0B,CAAC,KAA6B,EAItE;IACA,MAAM,cAAc,GAAG,CAAC,KAA4D,EAAE,EAAE,CACtF,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEjD,MAAM,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACjF,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAC9F,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,GAAG,eAAe,EAAE,eAAe,CAAC,CAAC;IAE/F,OAAO;QACL,mCAAmC,EAAE,cAAc,CAAC,iBAAiB,CAAC;QACtE,2BAA2B,EAAE,cAAc,CAAC,gBAAgB,CAAC;QAC7D,+BAA+B,EAAE,cAAc,CAAC,aAAa,CAAC;KAC/D,CAAC;AAAA,CACH;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAA6B,EAC7B,MAAkB,EAClB,OAAe,EACf,gBAA4B,EAC5B,MAAc,EACd,IAAY,EACN;IACN,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,iBAAiB,IAAI,YAAY,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACvE,YAAY,GAAG,CAAC,CAAC;YACjB,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5C,MAAM;QACN,OAAO;QACP,gBAAgB;QAChB,OAAO,EAAE,MAAM;QACf,YAAY;QACZ,iBAAiB,EAAE,gBAAgB;KACpC,CAAC,CAAC;IAEH,IAAI,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACzC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;AAAA,CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,8BAA8B,CAC5C,MAAoB,EACpB,MAAkB,EAClB,qBAAiC,EACjC,MAAc,EACd,SAAqB,EACZ;IACT,MAAM,cAAc,GAAG,EAAC,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,aAAa,CAAC,sBAAsB,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;IAC7F,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC1F,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;AAAA,CACF"}
1
+ {"version":3,"file":"gloas.js","sourceRoot":"","sources":["../../src/util/gloas.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ export * from "./shuffling.js";
25
25
  export * from "./signatureSets.js";
26
26
  export * from "./signingRoot.js";
27
27
  export * from "./slot.js";
28
+ export * from "./ssz.js";
28
29
  export * from "./syncCommittee.js";
29
30
  export * from "./validator.js";
30
31
  export * from "./weakSubjectivity.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
package/lib/util/index.js CHANGED
@@ -25,6 +25,7 @@ export * from "./shuffling.js";
25
25
  export * from "./signatureSets.js";
26
26
  export * from "./signingRoot.js";
27
27
  export * from "./slot.js";
28
+ export * from "./ssz.js";
28
29
  export * from "./syncCommittee.js";
29
30
  export * from "./validator.js";
30
31
  export * from "./weakSubjectivity.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Node } from "@chainsafe/persistent-merkle-tree";
2
+ /** Root node (chunks + length mix-in) of a zero-filled ProgressiveListBasicType of `length` items */
3
+ export declare function zeroProgressiveListBasicRootNode(itemsPerChunk: number, length: number): Node;
4
+ /**
5
+ * Root node of a progressive list from its chunk/element nodes + length mix-in.
6
+ * `nodes` are packed 32-byte chunk leaves for basic lists, or element root nodes for composite lists.
7
+ */
8
+ export declare function progressiveListRootNode(nodes: Node[], length: number): Node;
9
+ //# sourceMappingURL=ssz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssz.d.ts","sourceRoot":"","sources":["../../src/util/ssz.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,IAAI,EAAW,MAAM,mCAAmC,CAAC;AAKvF,qGAAqG;AACrG,wBAAgB,gCAAgC,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAS5F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE3E"}
@@ -0,0 +1,39 @@
1
+ import { BranchNode, LeafNode, zeroNode } from "@chainsafe/persistent-merkle-tree";
2
+ import { progressiveSubtreeFillToContents } from "@chainsafe/ssz";
3
+ // TODO: move these utils to @chainsafe/ssz (progressive.ts, next to progressiveSubtreeFillToContents)
4
+ /** Root node (chunks + length mix-in) of a zero-filled ProgressiveListBasicType of `length` items */
5
+ export function zeroProgressiveListBasicRootNode(itemsPerChunk, length) {
6
+ const chunkCount = Math.ceil(length / itemsPerChunk);
7
+ // mirrors ssz's progressiveSubtreeCount (subtree capacities 1, 4, 16, ...)
8
+ let numSubtrees = 0;
9
+ for (let remaining = chunkCount, subtreeLength = 1; remaining > 0; subtreeLength *= 4) {
10
+ remaining -= Math.min(remaining, subtreeLength);
11
+ numSubtrees++;
12
+ }
13
+ return new BranchNode(zeroProgressiveNode(numSubtrees), LeafNode.fromUint32(length));
14
+ }
15
+ /**
16
+ * Root node of a progressive list from its chunk/element nodes + length mix-in.
17
+ * `nodes` are packed 32-byte chunk leaves for basic lists, or element root nodes for composite lists.
18
+ */
19
+ export function progressiveListRootNode(nodes, length) {
20
+ return new BranchNode(progressiveSubtreeFillToContents(nodes), LeafNode.fromUint32(length));
21
+ }
22
+ /**
23
+ * Return the chunks node of a zero-filled progressive merkle list spanning `numSubtrees`
24
+ * balanced subtrees (chunk capacities 1, 4, 16, ... = 4^i; depths 0, 2, 4, ... = 2i).
25
+ *
26
+ * Not memoized: the zero data is already fully shared via the cached zeroNode(2i) subtrees;
27
+ * only the O(numSubtrees) spine BranchNodes (~10 at 2M validators) are allocated per call.
28
+ */
29
+ function zeroProgressiveNode(numSubtrees) {
30
+ // chain(k) = B(zeroNode(0), B(zeroNode(2), ... B(zeroNode(2(k-1)), zeroNode(0))))
31
+ let node = zeroNode(0); // terminator
32
+ for (let i = numSubtrees - 1; i >= 0; i--) {
33
+ // BranchNode(left: balanced subtree i, right: rest of chain) — chain grows to the right,
34
+ // same as ssz progressiveSubtreeFillToContents: `root = new BranchNode(subtreeRoots[i], root)`
35
+ node = new BranchNode(zeroNode(2 * i), node);
36
+ }
37
+ return node;
38
+ }
39
+ //# sourceMappingURL=ssz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssz.js","sourceRoot":"","sources":["../../src/util/ssz.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAQ,QAAQ,EAAC,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAC,gCAAgC,EAAC,MAAM,gBAAgB,CAAC;AAEhE,sGAAsG;AAEtG,qGAAqG;AACrG,MAAM,UAAU,gCAAgC,CAAC,aAAqB,EAAE,MAAc,EAAQ;IAC5F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IACrD,2EAA2E;IAC3E,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,SAAS,GAAG,UAAU,EAAE,aAAa,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,aAAa,IAAI,CAAC,EAAE,CAAC;QACtF,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAChD,WAAW,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,CACtF;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,MAAc,EAAQ;IAC3E,OAAO,IAAI,UAAU,CAAC,gCAAgC,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,CAC7F;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,WAAmB,EAAQ;IACtD,kFAAkF;IAClF,IAAI,IAAI,GAAS,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;IAC3C,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,yFAAyF;QACzF,+FAA+F;QAC/F,IAAI,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACb"}
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.45.0-dev.fadf0fbb1f",
14
+ "version": "1.46.0-dev.8fc4e297d2",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -61,24 +61,24 @@
61
61
  "lint:fix": "pnpm run lint --write",
62
62
  "test": "pnpm test:unit",
63
63
  "test:unit": "vitest run --project unit --project unit-minimal",
64
- "check-readme": "pnpm exec ts-node ../../scripts/check_readme.ts"
64
+ "check-readme": "pnpm exec tsx ../../scripts/check_readme.ts"
65
65
  },
66
66
  "types": "lib/index.d.ts",
67
67
  "dependencies": {
68
- "@chainsafe/as-sha256": "^1.2.0",
68
+ "@chainsafe/as-sha256": "^1.2.4",
69
69
  "@chainsafe/blst": "^2.2.0",
70
- "@chainsafe/persistent-merkle-tree": "^1.2.5",
70
+ "@chainsafe/persistent-merkle-tree": "^1.3.0",
71
71
  "@chainsafe/pubkey-index-map": "^3.0.0",
72
- "@chainsafe/ssz": "^1.4.0",
72
+ "@chainsafe/ssz": "^1.6.2",
73
73
  "@chainsafe/swap-or-not-shuffle": "^1.2.1",
74
- "@lodestar/config": "^1.45.0-dev.fadf0fbb1f",
75
- "@lodestar/params": "^1.45.0-dev.fadf0fbb1f",
76
- "@lodestar/types": "^1.45.0-dev.fadf0fbb1f",
77
- "@lodestar/utils": "^1.45.0-dev.fadf0fbb1f",
74
+ "@lodestar/config": "^1.46.0-dev.8fc4e297d2",
75
+ "@lodestar/params": "^1.46.0-dev.8fc4e297d2",
76
+ "@lodestar/types": "^1.46.0-dev.8fc4e297d2",
77
+ "@lodestar/utils": "^1.46.0-dev.8fc4e297d2",
78
78
  "@vekexasia/bigint-buffer2": "^1.1.1"
79
79
  },
80
80
  "devDependencies": {
81
- "@lodestar/api": "^1.45.0-dev.fadf0fbb1f"
81
+ "@lodestar/api": "^1.46.0-dev.8fc4e297d2"
82
82
  },
83
83
  "keywords": [
84
84
  "ethereum",
@@ -86,5 +86,5 @@
86
86
  "beacon",
87
87
  "blockchain"
88
88
  ],
89
- "gitHead": "3c79c57c7b5f21ae8bdf32e48167216cf2cab5d2"
89
+ "gitHead": "c2a9e6cb14fc9deaf272eca7289ef323ebbe2e47"
90
90
  }
@@ -20,7 +20,7 @@ import {BeaconStateTransitionMetrics} from "../metrics.js";
20
20
  import {getAttestationWithIndicesSignatureSet} from "../signatureSets/indexedAttestation.js";
21
21
  import {BeaconStateView} from "../stateView/beaconStateView.js";
22
22
  import {CachedBeaconStateAltair, CachedBeaconStateGloas} from "../types.js";
23
- import {isAttestationSameSlot, isAttestationSameSlotRootCache} from "../util/gloas.js";
23
+ import {isAttestationSameSlotRootCache} from "../util/gloas.js";
24
24
  import {increaseBalance, verifySignatureSet} from "../util/index.js";
25
25
  import {RootCache} from "../util/rootCache.js";
26
26
  import {checkpointToStr, isTimelyTarget, validateAttestation} from "./processAttestationPhase0.js";
@@ -76,7 +76,7 @@ export function processAttestationsAltair(
76
76
  // Count how much additional weight added to current or previous epoch's builder pending payment (in ETH increment)
77
77
  let paymentWeightToAdd = 0;
78
78
 
79
- const flagsAttestation = getAttestationParticipationStatus(
79
+ const {flags: flagsAttestation, isSameSlotAttestation} = getAttestationParticipationStatus(
80
80
  fork,
81
81
  data,
82
82
  stateSlot - data.slot,
@@ -132,7 +132,7 @@ export function processAttestationsAltair(
132
132
  }
133
133
  }
134
134
 
135
- if (fork >= ForkSeq.gloas && flagsNewSet !== 0 && isAttestationSameSlot(state as CachedBeaconStateGloas, data)) {
135
+ if (isSameSlotAttestation && flagsNewSet !== 0) {
136
136
  paymentWeightToAdd += effectiveBalanceIncrements[validatorIndex];
137
137
  }
138
138
  }
@@ -180,7 +180,7 @@ export function getAttestationParticipationStatus(
180
180
  currentEpoch: Epoch,
181
181
  rootCache: RootCache,
182
182
  executionPayloadAvailability: BitArray | null
183
- ): number {
183
+ ): {flags: number; isSameSlotAttestation: boolean} {
184
184
  const justifiedCheckpoint =
185
185
  data.target.epoch === currentEpoch ? rootCache.currentJustifiedCheckpoint : rootCache.previousJustifiedCheckpoint;
186
186
 
@@ -206,10 +206,13 @@ export function getAttestationParticipationStatus(
206
206
  let isMatchingHead =
207
207
  isMatchingTarget && byteArrayEquals(data.beaconBlockRoot, rootCache.getBlockRootAtSlot(data.slot));
208
208
 
209
+ let isSameSlotAttestation = false;
210
+
209
211
  if (fork >= ForkSeq.gloas) {
210
212
  let isMatchingPayload = false;
213
+ isSameSlotAttestation = isAttestationSameSlotRootCache(rootCache, data);
211
214
 
212
- if (isAttestationSameSlotRootCache(rootCache, data)) {
215
+ if (isSameSlotAttestation) {
213
216
  if (data.index !== 0) {
214
217
  throw new Error("Attesting same slot must indicate empty payload");
215
218
  }
@@ -235,7 +238,7 @@ export function getAttestationParticipationStatus(
235
238
  if (isMatchingTarget && isTimelyTarget(fork, inclusionDelay)) flags |= TIMELY_TARGET;
236
239
  if (isMatchingHead && inclusionDelay === MIN_ATTESTATION_INCLUSION_DELAY) flags |= TIMELY_HEAD;
237
240
 
238
- return flags;
241
+ return {flags, isSameSlotAttestation};
239
242
  }
240
243
 
241
244
  export function checkpointValueEquals(cp1: phase0.Checkpoint, cp2: phase0.Checkpoint): boolean {
@@ -1,8 +1,13 @@
1
- import {FAR_FUTURE_EPOCH} from "@lodestar/params";
1
+ import {FAR_FUTURE_EPOCH, PAYLOAD_BUILDER_VERSION} from "@lodestar/params";
2
2
  import {gloas} from "@lodestar/types";
3
3
  import {CachedBeaconStateGloas} from "../types.js";
4
4
  import {computeEpochAtSlot} from "../util/epoch.js";
5
- import {addBuilderToRegistry, findBuilderIndexByPubkey, isValidBuilderDepositSignature} from "../util/gloas.js";
5
+ import {
6
+ addBuilderToRegistry,
7
+ findBuilderIndexByPubkey,
8
+ isBuilderWithdrawalCredential,
9
+ isValidBuilderDepositSignature,
10
+ } from "../util/gloas.js";
6
11
 
7
12
  /**
8
13
  * Process a builder deposit request from the execution layer: register a new builder
@@ -15,6 +20,12 @@ export function processBuilderDepositRequest(
15
20
  request: gloas.BuilderDepositRequest
16
21
  ): void {
17
22
  const {pubkey, withdrawalCredentials, amount, signature} = request;
23
+
24
+ // Ignore deposits with unexpected withdrawal credential prefixes.
25
+ if (!isBuilderWithdrawalCredential(withdrawalCredentials)) {
26
+ return;
27
+ }
28
+
18
29
  const builderIndex = findBuilderIndexByPubkey(state, pubkey);
19
30
 
20
31
  if (builderIndex === null) {
@@ -22,7 +33,7 @@ export function processBuilderDepositRequest(
22
33
  addBuilderToRegistry(
23
34
  state,
24
35
  pubkey,
25
- withdrawalCredentials[0],
36
+ PAYLOAD_BUILDER_VERSION,
26
37
  withdrawalCredentials.subarray(12),
27
38
  amount,
28
39
  state.slot
@@ -33,11 +44,13 @@ export function processBuilderDepositRequest(
33
44
 
34
45
  const builder = state.builders.get(builderIndex);
35
46
 
36
- // Increase balance by deposit amount
37
- builder.balance += amount;
38
-
39
- // If exited, reset the withdrawable epoch
40
- if (builder.withdrawableEpoch !== FAR_FUTURE_EPOCH) {
47
+ // If the builder has exited and been fully swept (balance drained to 0), reset the
48
+ // withdrawable epoch so this top-up becomes withdrawable again. Must run before the
49
+ // balance increase, since the reset is gated on the current balance being 0.
50
+ if (builder.withdrawableEpoch !== FAR_FUTURE_EPOCH && builder.balance === 0) {
41
51
  builder.withdrawableEpoch = computeEpochAtSlot(state.slot) + state.config.MIN_BUILDER_WITHDRAWABILITY_DELAY;
42
52
  }
53
+
54
+ // Increase balance by deposit amount
55
+ builder.balance += amount;
43
56
  }
@@ -1,4 +1,12 @@
1
- import {ForkSeq} from "@lodestar/params";
1
+ import {
2
+ ForkSeq,
3
+ MAX_ATTESTATIONS_ELECTRA,
4
+ MAX_ATTESTER_SLASHINGS_ELECTRA,
5
+ MAX_BLS_TO_EXECUTION_CHANGES,
6
+ MAX_PAYLOAD_ATTESTATIONS,
7
+ MAX_PROPOSER_SLASHINGS,
8
+ MAX_VOLUNTARY_EXITS,
9
+ } from "@lodestar/params";
2
10
  import {BeaconBlockBody, capella, electra, gloas} from "@lodestar/types";
3
11
  import {BeaconStateTransitionMetrics} from "../metrics.js";
4
12
  import {
@@ -39,6 +47,10 @@ export function processOperations(
39
47
  opts: ProcessBlockOpts = {verifySignatures: true},
40
48
  metrics?: BeaconStateTransitionMetrics | null
41
49
  ): void {
50
+ if (fork >= ForkSeq.gloas) {
51
+ assertGloasOperationLimits(body as gloas.BeaconBlockBody);
52
+ }
53
+
42
54
  // verify that outstanding deposits are processed up to the maximum number of deposits.
43
55
  // From Fulu the eth1 bridge deposit mechanism was removed, so blocks must not contain any deposits.
44
56
  const maxDeposits = fork >= ForkSeq.fulu ? 0 : getEth1DepositCount(state);
@@ -94,3 +106,18 @@ export function processOperations(
94
106
  }
95
107
  }
96
108
  }
109
+
110
+ function assertGloasOperationLimits(body: gloas.BeaconBlockBody): void {
111
+ assertMaxLength("proposerSlashings", body.proposerSlashings.length, MAX_PROPOSER_SLASHINGS);
112
+ assertMaxLength("attesterSlashings", body.attesterSlashings.length, MAX_ATTESTER_SLASHINGS_ELECTRA);
113
+ assertMaxLength("attestations", body.attestations.length, MAX_ATTESTATIONS_ELECTRA);
114
+ assertMaxLength("voluntaryExits", body.voluntaryExits.length, MAX_VOLUNTARY_EXITS);
115
+ assertMaxLength("blsToExecutionChanges", body.blsToExecutionChanges.length, MAX_BLS_TO_EXECUTION_CHANGES);
116
+ assertMaxLength("payloadAttestations", body.payloadAttestations.length, MAX_PAYLOAD_ATTESTATIONS);
117
+ }
118
+
119
+ function assertMaxLength(name: string, length: number, limit: number): void {
120
+ if (length > limit) {
121
+ throw new Error(`Block contains too many ${name}: count=${length} limit=${limit}`);
122
+ }
123
+ }
@@ -1,4 +1,12 @@
1
- import {ForkPostGloas, SLOTS_PER_EPOCH, SLOTS_PER_HISTORICAL_ROOT} from "@lodestar/params";
1
+ import {
2
+ ForkPostGloas,
3
+ MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD,
4
+ MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD,
5
+ MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD,
6
+ MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD,
7
+ SLOTS_PER_EPOCH,
8
+ SLOTS_PER_HISTORICAL_ROOT,
9
+ } from "@lodestar/params";
2
10
  import {BeaconBlock, gloas, ssz} from "@lodestar/types";
3
11
  import {byteArrayEquals, toRootHex} from "@lodestar/utils";
4
12
  import {CachedBeaconStateGloas} from "../types.js";
@@ -47,6 +55,8 @@ export function processParentExecutionPayload(state: CachedBeaconStateGloas, blo
47
55
  * Spec: https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.6/specs/gloas/beacon-chain.md#new-apply_parent_execution_payload
48
56
  */
49
57
  export function applyParentExecutionPayload(state: CachedBeaconStateGloas, requests: gloas.ExecutionRequests): void {
58
+ assertExecutionRequestsWithinLimits(requests);
59
+
50
60
  const fork = state.config.getForkSeq(state.slot);
51
61
  const parentBid = state.latestExecutionPayloadBid;
52
62
  const parentSlot = parentBid.slot;
@@ -116,6 +126,21 @@ function settleBuilderPayment(state: CachedBeaconStateGloas, paymentIndex: numbe
116
126
  state.builderPendingPayments.set(paymentIndex, ssz.gloas.BuilderPendingPayment.defaultViewDU());
117
127
  }
118
128
 
129
+ function assertExecutionRequestsWithinLimits(requests: gloas.ExecutionRequests): void {
130
+ assertMaxLength("withdrawals", requests.withdrawals.length, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD);
131
+ assertMaxLength("consolidations", requests.consolidations.length, MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD);
132
+ // New in GLOAS:EIP8282
133
+ assertMaxLength("builderDeposits", requests.builderDeposits.length, MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD);
134
+ // New in GLOAS:EIP8282
135
+ assertMaxLength("builderExits", requests.builderExits.length, MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD);
136
+ }
137
+
138
+ function assertMaxLength(name: string, length: number, limit: number): void {
139
+ if (length > limit) {
140
+ throw new Error(`Too many parent execution request ${name} count=${length} limit=${limit}`);
141
+ }
142
+ }
143
+
119
144
  function assertEmptyExecutionRequests(requests: gloas.ExecutionRequests): void {
120
145
  if (
121
146
  requests.deposits.length !== 0 ||
@@ -99,7 +99,7 @@ export function processWithdrawals(
99
99
  const stateGloas = state as CachedBeaconStateGloas;
100
100
 
101
101
  // Store expected withdrawals for verification
102
- stateGloas.payloadExpectedWithdrawals = ssz.capella.Withdrawals.toViewDU(expectedWithdrawals);
102
+ stateGloas.payloadExpectedWithdrawals = ssz.gloas.Withdrawals.toViewDU(expectedWithdrawals);
103
103
 
104
104
  // Update builder pending withdrawals queue
105
105
  stateGloas.builderPendingWithdrawals = stateGloas.builderPendingWithdrawals.sliceFrom(
@@ -254,11 +254,9 @@ export function isCachedBeaconState<T extends BeaconStateAllForks>(
254
254
  // This cache is populated during epoch transition, and should be preserved for performance.
255
255
  // If the cache is missing too often, means that our clone strategy is not working well.
256
256
  export function isStateValidatorsNodesPopulated(state: CachedBeaconStateAllForks): boolean {
257
- // biome-ignore lint/complexity/useLiteralKeys: It is a private attribute
258
- return state.validators["nodesPopulated"] === true;
257
+ return (state.validators as unknown as {nodesPopulated?: boolean}).nodesPopulated === true;
259
258
  }
260
259
 
261
260
  export function isStateBalancesNodesPopulated(state: CachedBeaconStateAllForks): boolean {
262
- // biome-ignore lint/complexity/useLiteralKeys: It is a private attribute
263
- return state.balances["nodesPopulated"] === true;
261
+ return (state.balances as unknown as {nodesPopulated?: boolean}).nodesPopulated === true;
264
262
  }
@@ -1,6 +1,8 @@
1
1
  import {zeroNode} from "@chainsafe/persistent-merkle-tree";
2
2
  import {ssz} from "@lodestar/types";
3
- import {CachedBeaconStateAltair} from "../types.js";
3
+ import type {BeaconStateAltair, BeaconStateGloas} from "../types.js";
4
+ import {isGloasStateType} from "../util/execution.js";
5
+ import {zeroProgressiveListBasicRootNode} from "../util/ssz.js";
4
6
 
5
7
  /**
6
8
  * Updates `state.previousEpochParticipation` with precalculated epoch participation. Creates a new empty tree for
@@ -9,7 +11,12 @@ import {CachedBeaconStateAltair} from "../types.js";
9
11
  * PERF: Cost = 'proportional' $VALIDATOR_COUNT. Since it updates all of them at once, it will always recreate both
10
12
  * trees completely.
11
13
  */
12
- export function processParticipationFlagUpdates(state: CachedBeaconStateAltair): void {
14
+ export function processParticipationFlagUpdates(state: BeaconStateAltair | BeaconStateGloas): void {
15
+ if (isGloasStateType(state)) {
16
+ processParticipationFlagUpdatesGloas(state);
17
+ return;
18
+ }
19
+
13
20
  // Set view and tree from currentEpochParticipation to previousEpochParticipation
14
21
  state.previousEpochParticipation = state.currentEpochParticipation;
15
22
 
@@ -25,3 +32,14 @@ export function processParticipationFlagUpdates(state: CachedBeaconStateAltair):
25
32
 
26
33
  state.currentEpochParticipation = ssz.altair.EpochParticipation.getViewDU(currentEpochParticipationNode);
27
34
  }
35
+
36
+ function processParticipationFlagUpdatesGloas(state: BeaconStateGloas): void {
37
+ state.previousEpochParticipation = state.currentEpochParticipation;
38
+
39
+ // Same trick as the altair path above, adapted to the progressive-list tree shape: all chunks
40
+ // are zero so the chunks tree is a chain of pre-computed zeroNodes, built in O(log n) instead
41
+ // of re-merkleizing a validator-count-sized array every epoch.
42
+ state.currentEpochParticipation = ssz.gloas.EpochParticipation.getViewDU(
43
+ zeroProgressiveListBasicRootNode(ssz.gloas.EpochParticipation.itemsPerChunk, state.currentEpochParticipation.length)
44
+ );
45
+ }
@@ -1,5 +1,4 @@
1
1
  import {ForkSeq, GENESIS_EPOCH} from "@lodestar/params";
2
- import {ssz} from "@lodestar/types";
3
2
  import {
4
3
  CachedBeaconStateAllForks,
5
4
  CachedBeaconStateAltair,
@@ -39,7 +38,7 @@ export function processRewardsAndPenalties(
39
38
 
40
39
  // important: do not change state one balance at a time. Set them all at once, constructing the tree in one go
41
40
  // cache the balances array, too
42
- state.balances = ssz.phase0.Balances.toViewDU(balances);
41
+ state.balances = state.type.fields.balances.toViewDU(balances);
43
42
 
44
43
  // For processEffectiveBalanceUpdates() to prevent having to re-compute the balances array.
45
44
  // For validator metrics
@@ -1,11 +1,15 @@
1
1
  import {Tree} from "@chainsafe/persistent-merkle-tree";
2
2
  import {
3
3
  BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX,
4
+ CURRENT_SYNC_COMMITTEE_GINDEX_GLOAS,
4
5
  FINALIZED_ROOT_GINDEX,
5
6
  FINALIZED_ROOT_GINDEX_ELECTRA,
7
+ FINALIZED_ROOT_GINDEX_GLOAS,
6
8
  ForkName,
7
9
  ForkPostBellatrix,
10
+ NEXT_SYNC_COMMITTEE_GINDEX_GLOAS,
8
11
  isForkPostElectra,
12
+ isForkPostGloas,
9
13
  } from "@lodestar/params";
10
14
  import {BeaconBlockBody, SSZTypesFor, ssz} from "@lodestar/types";
11
15
  import {BeaconStateAllForks, CachedBeaconStateAllForks} from "../types.js";
@@ -17,6 +21,24 @@ export function getSyncCommitteesWitness(fork: ForkName, state: BeaconStateAllFo
17
21
  let currentSyncCommitteeRoot: Uint8Array;
18
22
  let nextSyncCommitteeRoot: Uint8Array;
19
23
 
24
+ if (isForkPostGloas(fork)) {
25
+ const tree = new Tree(state.node);
26
+ const currentSyncCommitteeGindex = BigInt(CURRENT_SYNC_COMMITTEE_GINDEX_GLOAS);
27
+ const nextSyncCommitteeGindex = BigInt(NEXT_SYNC_COMMITTEE_GINDEX_GLOAS);
28
+
29
+ currentSyncCommitteeRoot = tree.getRoot(currentSyncCommitteeGindex);
30
+ nextSyncCommitteeRoot = tree.getRoot(nextSyncCommitteeGindex);
31
+ witness = [];
32
+
33
+ return {
34
+ witness,
35
+ currentSyncCommitteeRoot,
36
+ nextSyncCommitteeRoot,
37
+ currentSyncCommitteeBranch: tree.getSingleProof(currentSyncCommitteeGindex),
38
+ nextSyncCommitteeBranch: tree.getSingleProof(nextSyncCommitteeGindex),
39
+ };
40
+ }
41
+
20
42
  if (isForkPostElectra(fork)) {
21
43
  const n2 = n1.left;
22
44
  const n5 = n2.right;
@@ -60,17 +82,30 @@ export function getSyncCommitteesWitness(fork: ForkName, state: BeaconStateAllFo
60
82
  }
61
83
 
62
84
  export function getNextSyncCommitteeBranch(syncCommitteesWitness: SyncCommitteeWitness): Uint8Array[] {
85
+ if (syncCommitteesWitness.nextSyncCommitteeBranch) {
86
+ return syncCommitteesWitness.nextSyncCommitteeBranch;
87
+ }
88
+
63
89
  // Witness branch is sorted by descending gindex
64
90
  return [syncCommitteesWitness.currentSyncCommitteeRoot, ...syncCommitteesWitness.witness];
65
91
  }
66
92
 
67
93
  export function getCurrentSyncCommitteeBranch(syncCommitteesWitness: SyncCommitteeWitness): Uint8Array[] {
94
+ if (syncCommitteesWitness.currentSyncCommitteeBranch) {
95
+ return syncCommitteesWitness.currentSyncCommitteeBranch;
96
+ }
97
+
68
98
  // Witness branch is sorted by descending gindex
69
99
  return [syncCommitteesWitness.nextSyncCommitteeRoot, ...syncCommitteesWitness.witness];
70
100
  }
71
101
 
72
102
  export function getFinalizedRootProof(state: CachedBeaconStateAllForks): Uint8Array[] {
73
- const finalizedRootGindex = state.epochCtx.isPostElectra() ? FINALIZED_ROOT_GINDEX_ELECTRA : FINALIZED_ROOT_GINDEX;
103
+ const fork = state.config.getForkName(state.slot);
104
+ const finalizedRootGindex = isForkPostGloas(fork)
105
+ ? FINALIZED_ROOT_GINDEX_GLOAS
106
+ : state.epochCtx.isPostElectra()
107
+ ? FINALIZED_ROOT_GINDEX_ELECTRA
108
+ : FINALIZED_ROOT_GINDEX;
74
109
  return new Tree(state.node).getSingleProof(BigInt(finalizedRootGindex));
75
110
  }
76
111
 
@@ -14,7 +14,7 @@ import {
14
14
  processLightClientUpdate,
15
15
  } from "./processLightClientUpdate.js";
16
16
  import {type ILightClientStore, LightClientStore, type LightClientStoreEvents} from "./store.js";
17
- import {ZERO_HEADER, ZERO_SYNC_COMMITTEE, getZeroFinalityBranch, getZeroSyncCommitteeBranch} from "./utils.js";
17
+ import {ZERO_SYNC_COMMITTEE, getZeroFinalityBranch, getZeroSyncCommitteeBranch} from "./utils.js";
18
18
 
19
19
  export type {LightClientUpdateSummary} from "./isBetterUpdate.js";
20
20
  export {isBetterUpdate, toLightClientUpdateSummary} from "./isBetterUpdate.js";
@@ -76,12 +76,16 @@ export class LightclientSpec {
76
76
  }
77
77
 
78
78
  onOptimisticUpdate(currentSlot: Slot, optimisticUpdate: LightClientOptimisticUpdate): void {
79
+ const fork = this.config.getForkName(optimisticUpdate.signatureSlot);
80
+
79
81
  this.onUpdate(currentSlot, {
80
82
  attestedHeader: optimisticUpdate.attestedHeader,
81
83
  nextSyncCommittee: ZERO_SYNC_COMMITTEE,
82
- nextSyncCommitteeBranch: getZeroSyncCommitteeBranch(this.config.getForkName(optimisticUpdate.signatureSlot)),
83
- finalizedHeader: {beacon: ZERO_HEADER},
84
- finalityBranch: getZeroFinalityBranch(this.config.getForkName(optimisticUpdate.signatureSlot)),
84
+ nextSyncCommitteeBranch: getZeroSyncCommitteeBranch(fork),
85
+ finalizedHeader: this.config
86
+ .getPostAltairForkTypes(optimisticUpdate.signatureSlot)
87
+ .LightClientHeader.defaultValue(),
88
+ finalityBranch: getZeroFinalityBranch(fork),
85
89
  syncAggregate: optimisticUpdate.syncAggregate,
86
90
  signatureSlot: optimisticUpdate.signatureSlot,
87
91
  });