@lodestar/state-transition 1.51.0-dev.c6e566f915 → 1.51.0-dev.cda05d18f1

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 (107) hide show
  1. package/lib/block/index.d.ts +1 -1
  2. package/lib/block/index.d.ts.map +1 -1
  3. package/lib/block/index.js +2 -2
  4. package/lib/block/index.js.map +1 -1
  5. package/lib/block/processDeposit.d.ts.map +1 -1
  6. package/lib/block/processDeposit.js +1 -1
  7. package/lib/block/processDeposit.js.map +1 -1
  8. package/lib/block/processOperations.d.ts +1 -1
  9. package/lib/block/processOperations.d.ts.map +1 -1
  10. package/lib/block/processOperations.js +1 -1
  11. package/lib/block/processOperations.js.map +1 -1
  12. package/lib/cache/epochCache.d.ts +2 -2
  13. package/lib/cache/epochCache.d.ts.map +1 -1
  14. package/lib/cache/epochCache.js +1 -1
  15. package/lib/cache/epochCache.js.map +1 -1
  16. package/lib/cache/syncCommitteeCache.d.ts +1 -1
  17. package/lib/cache/syncCommitteeCache.d.ts.map +1 -1
  18. package/lib/epoch/index.d.ts +2 -2
  19. package/lib/epoch/index.d.ts.map +1 -1
  20. package/lib/epoch/index.js +2 -2
  21. package/lib/epoch/index.js.map +1 -1
  22. package/lib/epoch/processSyncCommitteeUpdates.js +1 -1
  23. package/lib/epoch/processSyncCommitteeUpdates.js.map +1 -1
  24. package/lib/lightClient/spec/store.d.ts +1 -1
  25. package/lib/lightClient/spec/store.d.ts.map +1 -1
  26. package/lib/lightClient/spec/utils.d.ts.map +1 -1
  27. package/lib/lightClient/spec/utils.js +1 -1
  28. package/lib/lightClient/spec/utils.js.map +1 -1
  29. package/lib/lightClient/spec/validateLightClientUpdate.d.ts.map +1 -1
  30. package/lib/lightClient/spec/validateLightClientUpdate.js +1 -1
  31. package/lib/lightClient/spec/validateLightClientUpdate.js.map +1 -1
  32. package/lib/rewards/attestationsRewards.d.ts +1 -1
  33. package/lib/rewards/attestationsRewards.d.ts.map +1 -1
  34. package/lib/rewards/syncCommitteeRewards.d.ts +1 -1
  35. package/lib/rewards/syncCommitteeRewards.d.ts.map +1 -1
  36. package/lib/stateView/beaconStateView.d.ts +1 -0
  37. package/lib/stateView/beaconStateView.d.ts.map +1 -1
  38. package/lib/stateView/beaconStateView.js +5 -1
  39. package/lib/stateView/beaconStateView.js.map +1 -1
  40. package/lib/stateView/interface.d.ts +2 -4
  41. package/lib/stateView/interface.d.ts.map +1 -1
  42. package/lib/stateView/interface.js.map +1 -1
  43. package/lib/stateView/nativeBeaconStateView.d.ts +15 -7
  44. package/lib/stateView/nativeBeaconStateView.d.ts.map +1 -1
  45. package/lib/stateView/nativeBeaconStateView.js +76 -26
  46. package/lib/stateView/nativeBeaconStateView.js.map +1 -1
  47. package/lib/stateView/stateViewFactory.d.ts.map +1 -1
  48. package/lib/stateView/stateViewFactory.js +5 -4
  49. package/lib/stateView/stateViewFactory.js.map +1 -1
  50. package/lib/testUtils/interopPubkeyCache.js +1 -1
  51. package/lib/testUtils/interopPubkeyCache.js.map +1 -1
  52. package/lib/testUtils/state.d.ts.map +1 -1
  53. package/lib/testUtils/state.js +1 -1
  54. package/lib/testUtils/state.js.map +1 -1
  55. package/lib/testUtils/util.d.ts +1 -1
  56. package/lib/testUtils/util.d.ts.map +1 -1
  57. package/lib/testUtils/util.js +2 -2
  58. package/lib/testUtils/util.js.map +1 -1
  59. package/lib/util/blindedBlock.d.ts.map +1 -1
  60. package/lib/util/blindedBlock.js +4 -12
  61. package/lib/util/blindedBlock.js.map +1 -1
  62. package/lib/util/epochShuffling.d.ts.map +1 -1
  63. package/lib/util/epochShuffling.js +1 -1
  64. package/lib/util/epochShuffling.js.map +1 -1
  65. package/lib/util/genesis.d.ts.map +1 -1
  66. package/lib/util/genesis.js +8 -1
  67. package/lib/util/genesis.js.map +1 -1
  68. package/lib/util/interop.d.ts +1 -1
  69. package/lib/util/interop.d.ts.map +1 -1
  70. package/lib/util/interop.js +1 -1
  71. package/lib/util/interop.js.map +1 -1
  72. package/lib/util/seed.js +1 -1
  73. package/lib/util/seed.js.map +1 -1
  74. package/lib/util/signatureSets.d.ts +1 -1
  75. package/lib/util/signatureSets.d.ts.map +1 -1
  76. package/lib/util/signatureSets.js +1 -1
  77. package/lib/util/signatureSets.js.map +1 -1
  78. package/lib/util/syncCommittee.d.ts.map +1 -1
  79. package/lib/util/syncCommittee.js +1 -1
  80. package/lib/util/syncCommittee.js.map +1 -1
  81. package/package.json +9 -9
  82. package/src/block/index.ts +11 -12
  83. package/src/block/processDeposit.ts +2 -2
  84. package/src/block/processOperations.ts +5 -5
  85. package/src/cache/epochCache.ts +2 -2
  86. package/src/cache/syncCommitteeCache.ts +1 -1
  87. package/src/epoch/index.ts +14 -15
  88. package/src/epoch/processSyncCommitteeUpdates.ts +1 -1
  89. package/src/lightClient/spec/store.ts +1 -1
  90. package/src/lightClient/spec/utils.ts +1 -1
  91. package/src/lightClient/spec/validateLightClientUpdate.ts +1 -1
  92. package/src/rewards/attestationsRewards.ts +1 -1
  93. package/src/rewards/syncCommitteeRewards.ts +1 -1
  94. package/src/stateView/beaconStateView.ts +5 -1
  95. package/src/stateView/interface.ts +1 -12
  96. package/src/stateView/nativeBeaconStateView.ts +77 -33
  97. package/src/stateView/stateViewFactory.ts +5 -4
  98. package/src/testUtils/interopPubkeyCache.ts +1 -1
  99. package/src/testUtils/state.ts +1 -1
  100. package/src/testUtils/util.ts +2 -2
  101. package/src/util/blindedBlock.ts +4 -12
  102. package/src/util/epochShuffling.ts +1 -1
  103. package/src/util/genesis.ts +9 -1
  104. package/src/util/interop.ts +1 -1
  105. package/src/util/seed.ts +1 -1
  106. package/src/util/signatureSets.ts +1 -1
  107. package/src/util/syncCommittee.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  import {CompactMultiProof} from "@chainsafe/persistent-merkle-tree";
2
2
  import {BitArray, ByteViews} from "@chainsafe/ssz";
3
3
  import type {BeaconConfig} from "@lodestar/config";
4
- import {ForkName, ForkSeq} from "@lodestar/params";
4
+ import {ForkName, ForkPostElectra, ForkSeq} from "@lodestar/params";
5
5
  import {
6
6
  BeaconBlock,
7
7
  BeaconState,
@@ -28,6 +28,7 @@ import {
28
28
  phase0,
29
29
  rewards,
30
30
  ssz,
31
+ sszTypesFor,
31
32
  } from "@lodestar/types";
32
33
  import {Checkpoint, Fork} from "@lodestar/types/phase0";
33
34
  import {VoluntaryExitValidity} from "../block/processVoluntaryExit.js";
@@ -39,6 +40,7 @@ import {SyncCommitteeWitness} from "../lightClient/types.js";
39
40
  import {StateTransitionModules, StateTransitionOpts} from "../stateTransition.js";
40
41
  import {EpochShuffling} from "../util/epochShuffling.js";
41
42
  import {PreVerifyBuilderDepositsResult} from "../util/preVerifyBuilderDeposits.js";
43
+ import {getStateSlotFromBytes} from "../util/sszBytes.js";
42
44
  import {computeNewStateRootStateTransitionOpts, getComputeNewStateRootResult} from "./computeNewStateRoot.js";
43
45
  import {
44
46
  BlockSTFInput,
@@ -47,8 +49,15 @@ import {
47
49
  IBeaconStateViewGloas,
48
50
  IBeaconStateViewLatestFork,
49
51
  IBeaconStateViewNative,
52
+ isStatePostGloas,
50
53
  } from "./interface.js";
51
54
 
55
+ export function assertNativeForkSupported(config: BeaconConfig, slot: Slot): void {
56
+ if (config.getForkSeq(slot) > ForkSeq.gloas) {
57
+ throw Error(`Native state transition does not support ${config.getForkName(slot)}`);
58
+ }
59
+ }
60
+
52
61
  /**
53
62
  * Wraps a native binding (the auto-generated JS interface produced by a `.node`
54
63
  * file) and exposes it as a fully-conformant `IBeaconStateViewLatestFork`.
@@ -115,6 +124,14 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
115
124
  private cachedPendingConsolidationsCount: number | null = null;
116
125
  // fulu
117
126
  private cachedProposerLookahead: fulu.ProposerLookahead | null = null;
127
+ // gloas
128
+ private cachedLatestBlockHash: Bytes32 | null = null;
129
+ private cachedExecutionPayloadAvailability: BitArray | null = null;
130
+ private cachedLatestExecutionPayloadBid: ExecutionPayloadBid | null = null;
131
+ private cachedPayloadExpectedWithdrawals: capella.Withdrawal[] | null = null;
132
+ private cachedBuilderPendingPayments: gloas.BuilderPendingPayments | null = null;
133
+ private cachedBuilderPendingWithdrawals: gloas.BuilderPendingWithdrawals | null = null;
134
+ private cachedBuildersLength: number | null = null;
118
135
  // Per-argument caches for argument-taking methods. The binding is treated as
119
136
  // immutable for the view's lifetime, so a given argument always yields the
120
137
  // same result. Maps grow only with touched arguments — typical call patterns
@@ -174,7 +191,11 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
174
191
  }
175
192
 
176
193
  get executionPayloadAvailability(): BitArray {
177
- throw new Error("NativeBeaconStateView does not support Gloas");
194
+ if (this.cachedExecutionPayloadAvailability === null) {
195
+ const {uint8Array, bitLen} = this.binding.executionPayloadAvailability;
196
+ this.cachedExecutionPayloadAvailability = new BitArray(uint8Array, bitLen);
197
+ }
198
+ return this.cachedExecutionPayloadAvailability;
178
199
  }
179
200
 
180
201
  // ─── phase0 ──────────────────────────────────────────────────────────────
@@ -598,6 +619,7 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
598
619
  seedValidatorsBytes?: Uint8Array,
599
620
  opts?: {preloadValidatorsAndBalances?: boolean}
600
621
  ): IBeaconStateView {
622
+ assertNativeForkSupported(this.config, getStateSlotFromBytes(stateBytes));
601
623
  return new NativeBeaconStateView(this.config, this.binding.loadOtherState(stateBytes, seedValidatorsBytes, opts));
602
624
  }
603
625
 
@@ -663,6 +685,7 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
663
685
  options: StateTransitionOpts,
664
686
  _modules: StateTransitionModules
665
687
  ): IBeaconStateView {
688
+ assertNativeForkSupported(this.config, block.message.slot);
666
689
  const isBlinded = isBlindedBeaconBlock(block.message);
667
690
  const signedBlockBytes =
668
691
  ssz ??
@@ -675,6 +698,7 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
675
698
  }
676
699
 
677
700
  processSlots(slot: Slot, opts?: {dontTransferCache?: boolean}, _modules?: StateTransitionModules): IBeaconStateView {
701
+ assertNativeForkSupported(this.config, slot);
678
702
  return new NativeBeaconStateView(this.config, this.binding.processSlots(slot, opts));
679
703
  }
680
704
 
@@ -832,7 +856,8 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
832
856
 
833
857
  get pendingDeposits(): electra.PendingDeposits {
834
858
  if (this.cachedPendingDeposits === null) {
835
- this.cachedPendingDeposits = ssz.electra.PendingDeposits.deserialize(this.binding.pendingDeposits);
859
+ const type = sszTypesFor(this.forkName as ForkPostElectra).PendingDeposits;
860
+ this.cachedPendingDeposits = type.deserialize(this.binding.pendingDeposits);
836
861
  }
837
862
  return this.cachedPendingDeposits;
838
863
  }
@@ -846,9 +871,8 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
846
871
 
847
872
  get pendingPartialWithdrawals(): electra.PendingPartialWithdrawals {
848
873
  if (this.cachedPendingPartialWithdrawals === null) {
849
- this.cachedPendingPartialWithdrawals = ssz.electra.PendingPartialWithdrawals.deserialize(
850
- this.binding.pendingPartialWithdrawals
851
- );
874
+ const type = sszTypesFor(this.forkName as ForkPostElectra).PendingPartialWithdrawals;
875
+ this.cachedPendingPartialWithdrawals = type.deserialize(this.binding.pendingPartialWithdrawals);
852
876
  }
853
877
  return this.cachedPendingPartialWithdrawals;
854
878
  }
@@ -862,9 +886,8 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
862
886
 
863
887
  get pendingConsolidations(): electra.PendingConsolidations {
864
888
  if (this.cachedPendingConsolidations === null) {
865
- this.cachedPendingConsolidations = ssz.electra.PendingConsolidations.deserialize(
866
- this.binding.pendingConsolidations
867
- );
889
+ const type = sszTypesFor(this.forkName as ForkPostElectra).PendingConsolidations;
890
+ this.cachedPendingConsolidations = type.deserialize(this.binding.pendingConsolidations);
868
891
  }
869
892
  return this.cachedPendingConsolidations;
870
893
  }
@@ -885,64 +908,85 @@ export class NativeBeaconStateView implements IBeaconStateViewLatestFork {
885
908
  return this.cachedProposerLookahead;
886
909
  }
887
910
 
888
- preVerifyBuilderDepositsPreGloas(
889
- _maxBuilderDeposits: number,
890
- _maxDurationMs: number
891
- ): PreVerifyBuilderDepositsResult {
892
- throw new Error("NativeBeaconStateView does not support Gloas");
911
+ preVerifyBuilderDepositsPreGloas(maxBuilderDeposits: number, maxDurationMs: number): PreVerifyBuilderDepositsResult {
912
+ return this.binding.preVerifyBuilderDepositsPreGloas(maxBuilderDeposits, maxDurationMs);
893
913
  }
894
914
 
895
915
  clearPreGloasBuilderDepositCache(): void {
896
- throw new Error("NativeBeaconStateView does not support Gloas");
916
+ this.binding.clearPreGloasBuilderDepositCache();
897
917
  }
898
918
 
899
919
  // ─── gloas ───────────────────────────────────────────────────────────────
900
920
 
901
921
  get latestBlockHash(): Bytes32 {
902
- throw new Error("NativeBeaconStateView does not support Gloas");
922
+ if (this.cachedLatestBlockHash === null) {
923
+ this.cachedLatestBlockHash = this.binding.latestBlockHash;
924
+ }
925
+ return this.cachedLatestBlockHash;
903
926
  }
904
927
 
905
928
  get latestExecutionPayloadBid(): ExecutionPayloadBid {
906
- throw new Error("NativeBeaconStateView does not support Gloas");
929
+ if (this.cachedLatestExecutionPayloadBid === null) {
930
+ this.cachedLatestExecutionPayloadBid = this.binding.latestExecutionPayloadBid;
931
+ }
932
+ return this.cachedLatestExecutionPayloadBid;
907
933
  }
908
934
 
909
935
  get payloadExpectedWithdrawals(): capella.Withdrawal[] {
910
- throw new Error("NativeBeaconStateView does not support Gloas");
936
+ if (this.cachedPayloadExpectedWithdrawals === null) {
937
+ this.cachedPayloadExpectedWithdrawals = this.binding.payloadExpectedWithdrawals;
938
+ }
939
+ return this.cachedPayloadExpectedWithdrawals;
911
940
  }
912
941
 
913
942
  get builderPendingPayments(): gloas.BuilderPendingPayments {
914
- throw new Error("NativeBeaconStateView does not support Gloas");
943
+ if (this.cachedBuilderPendingPayments === null) {
944
+ this.cachedBuilderPendingPayments = this.binding.builderPendingPayments;
945
+ }
946
+ return this.cachedBuilderPendingPayments;
915
947
  }
916
948
 
917
949
  get builderPendingWithdrawals(): gloas.BuilderPendingWithdrawals {
918
- throw new Error("NativeBeaconStateView does not support Gloas");
950
+ if (this.cachedBuilderPendingWithdrawals === null) {
951
+ this.cachedBuilderPendingWithdrawals = this.binding.builderPendingWithdrawals;
952
+ }
953
+ return this.cachedBuilderPendingWithdrawals;
919
954
  }
920
955
 
921
- getBuilder(_index: BuilderIndex): gloas.Builder {
922
- throw new Error("NativeBeaconStateView does not support Gloas");
956
+ getBuilder(index: BuilderIndex): gloas.Builder {
957
+ return this.binding.getBuilder(index);
923
958
  }
924
959
 
925
960
  getBuildersLength(): number {
926
- throw new Error("NativeBeaconStateView does not support Gloas");
961
+ if (this.cachedBuildersLength === null) {
962
+ this.cachedBuildersLength = this.binding.getBuildersLength();
963
+ }
964
+ return this.cachedBuildersLength;
927
965
  }
928
966
 
929
- canBuilderCoverBid(_builderIndex: BuilderIndex, _bidAmount: number): boolean {
930
- throw new Error("NativeBeaconStateView does not support Gloas");
967
+ canBuilderCoverBid(builderIndex: BuilderIndex, bidAmount: number): boolean {
968
+ return this.binding.canBuilderCoverBid(builderIndex, bidAmount);
931
969
  }
932
970
 
933
- getEpochPTCs(_epoch: Epoch): Uint32Array[] {
934
- throw new Error("NativeBeaconStateView does not support Gloas");
971
+ getEpochPTCs(epoch: Epoch): Uint32Array[] {
972
+ return this.binding.getEpochPTCs(epoch);
935
973
  }
936
974
 
937
- getPayloadTimelinessCommittee(_slot: Slot): Uint32Array {
938
- throw new Error("NativeBeaconStateView does not support Gloas");
975
+ getPayloadTimelinessCommittee(slot: Slot): Uint32Array {
976
+ return this.binding.getPayloadTimelinessCommittee(slot);
939
977
  }
940
978
 
941
- getIndicesInPayloadTimelinessCommittee(_validatorIndex: ValidatorIndex, _slot: Slot): number[] {
942
- throw new Error("NativeBeaconStateView does not support Gloas");
979
+ getIndicesInPayloadTimelinessCommittee(validatorIndex: ValidatorIndex, slot: Slot): number[] {
980
+ return this.binding.getIndicesInPayloadTimelinessCommittee(validatorIndex, slot);
943
981
  }
944
982
 
945
- withParentPayloadApplied(_executionRequests: gloas.ExecutionRequests): IBeaconStateViewGloas {
946
- throw new Error("NativeBeaconStateView does not support Gloas");
983
+ withParentPayloadApplied(executionRequests: gloas.ExecutionRequests): IBeaconStateViewGloas {
984
+ const bytes = ssz.gloas.ExecutionRequests.serialize(executionRequests);
985
+ const state = new NativeBeaconStateView(this.config, this.binding.withParentPayloadApplied(bytes));
986
+ if (!isStatePostGloas(state)) {
987
+ state.release();
988
+ throw Error("Expected Gloas state after applying the parent payload");
989
+ }
990
+ return state;
947
991
  }
948
992
  }
@@ -1,11 +1,11 @@
1
- import bindings from "@chainsafe/lodestar-z";
2
- import {pubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
3
1
  import {BeaconConfig} from "@lodestar/config";
2
+ import bindings from "@lodestar/native";
3
+ import {pubkeyCache} from "@lodestar/native/pubkeys";
4
4
  import {createCachedBeaconState} from "../cache/stateCache.js";
5
- import {getStateTypeFromBytes} from "../util/sszBytes.js";
5
+ import {getStateSlotFromBytes, getStateTypeFromBytes} from "../util/sszBytes.js";
6
6
  import {BeaconStateView} from "./beaconStateView.js";
7
7
  import {IBeaconStateView, IBeaconStateViewNative} from "./interface.js";
8
- import {NativeBeaconStateView} from "./nativeBeaconStateView.js";
8
+ import {NativeBeaconStateView, assertNativeForkSupported} from "./nativeBeaconStateView.js";
9
9
 
10
10
  // ---- createBeaconStateView (startup path) ----
11
11
 
@@ -62,6 +62,7 @@ export function createBeaconStateViewForHistoricalRegen(opts: RegenNodeJSOpts |
62
62
  }
63
63
 
64
64
  function createNativeBeaconStateView(config: BeaconConfig, stateBytes: Uint8Array): IBeaconStateView {
65
+ assertNativeForkSupported(config, getStateSlotFromBytes(stateBytes));
65
66
  const nativeConfig = new bindings.BeaconConfig(config, config.genesisValidatorsRoot);
66
67
  return new NativeBeaconStateView(
67
68
  config,
@@ -1,6 +1,6 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import {pubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
3
+ import {pubkeyCache} from "@lodestar/native/pubkeys";
4
4
  import {interopSecretKey} from "../util/interop.js";
5
5
  import {testCachePath} from "./cache.js";
6
6
 
@@ -1,6 +1,6 @@
1
- import {pubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
2
1
  import {ChainForkConfig, createBeaconConfig} from "@lodestar/config";
3
2
  import {config, config as minimalConfig} from "@lodestar/config/default";
3
+ import {pubkeyCache} from "@lodestar/native/pubkeys";
4
4
  import {
5
5
  EPOCHS_PER_HISTORICAL_VECTOR,
6
6
  EPOCHS_PER_SLASHINGS_VECTOR,
@@ -1,8 +1,8 @@
1
- import {PublicKey, SecretKey} from "@chainsafe/lodestar-z/blst";
2
- import {pubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
3
1
  import {BitArray, fromHexString} from "@chainsafe/ssz";
4
2
  import {BeaconConfig, createBeaconConfig, createChainForkConfig} from "@lodestar/config";
5
3
  import {config} from "@lodestar/config/default";
4
+ import {PublicKey, SecretKey} from "@lodestar/native/blst";
5
+ import {pubkeyCache} from "@lodestar/native/pubkeys";
6
6
  import {
7
7
  BUILDER_WITHDRAWAL_PREFIX,
8
8
  DOMAIN_DEPOSIT,
@@ -33,13 +33,9 @@ export function blindedOrFullBlockHashTreeRoot(
33
33
  ): Root {
34
34
  return isBlindedBeaconBlock(blindedOrFull)
35
35
  ? // Blinded
36
- config
37
- .getPostBellatrixForkTypes(blindedOrFull.slot)
38
- .BlindedBeaconBlock.hashTreeRoot(blindedOrFull)
36
+ config.getPostBellatrixForkTypes(blindedOrFull.slot).BlindedBeaconBlock.hashTreeRoot(blindedOrFull)
39
37
  : // Full
40
- config
41
- .getForkTypes(blindedOrFull.slot)
42
- .BeaconBlock.hashTreeRoot(blindedOrFull);
38
+ config.getForkTypes(blindedOrFull.slot).BeaconBlock.hashTreeRoot(blindedOrFull);
43
39
  }
44
40
 
45
41
  export function blindedOrFullBlockToHeader(
@@ -48,13 +44,9 @@ export function blindedOrFullBlockToHeader(
48
44
  ): BeaconBlockHeader {
49
45
  const bodyRoot = isBlindedBeaconBlock(blindedOrFull)
50
46
  ? // Blinded
51
- config
52
- .getPostBellatrixForkTypes(blindedOrFull.slot)
53
- .BlindedBeaconBlockBody.hashTreeRoot(blindedOrFull.body)
47
+ config.getPostBellatrixForkTypes(blindedOrFull.slot).BlindedBeaconBlockBody.hashTreeRoot(blindedOrFull.body)
54
48
  : // Full
55
- config
56
- .getForkTypes(blindedOrFull.slot)
57
- .BeaconBlockBody.hashTreeRoot(blindedOrFull.body);
49
+ config.getForkTypes(blindedOrFull.slot).BeaconBlockBody.hashTreeRoot(blindedOrFull.body);
58
50
 
59
51
  return {
60
52
  slot: blindedOrFull.slot,
@@ -1,5 +1,5 @@
1
- import {unshuffleList} from "@chainsafe/lodestar-z/shuffle";
2
1
  import {BeaconConfig} from "@lodestar/config";
2
+ import {unshuffleList} from "@lodestar/native/shuffle";
3
3
  import {
4
4
  DOMAIN_BEACON_ATTESTER,
5
5
  GENESIS_SLOT,
@@ -8,9 +8,10 @@ import {
8
8
  GENESIS_EPOCH,
9
9
  GENESIS_SLOT,
10
10
  MAX_EFFECTIVE_BALANCE,
11
+ MIN_SEED_LOOKAHEAD,
11
12
  UNSET_DEPOSIT_REQUESTS_START_INDEX,
12
13
  } from "@lodestar/params";
13
- import {Bytes32, Root, TimeSeconds, phase0, ssz} from "@lodestar/types";
14
+ import {Bytes32, Root, TimeSeconds, ValidatorIndex, phase0, ssz} from "@lodestar/types";
14
15
  import {applyDeposit, processDeposit} from "../block/processDeposit.js";
15
16
  import {EpochCacheImmutableData} from "../cache/epochCache.js";
16
17
  import {createCachedBeaconState} from "../cache/stateCache.js";
@@ -26,6 +27,7 @@ import {
26
27
  import {newFilledArray} from "./array.js";
27
28
  import {getTemporaryBlockHeader} from "./blockRoot.js";
28
29
  import {computeEpochAtSlot} from "./epoch.js";
30
+ import {computeProposerIndices} from "./seed.js";
29
31
  import {getNextSyncCommittee} from "./syncCommittee.js";
30
32
  import {getActiveValidatorIndices, getMaxEffectiveBalance} from "./validator.js";
31
33
 
@@ -352,6 +354,12 @@ export function initializeBeaconStateFromEth1(
352
354
  // Fulu retires the legacy bridge after the genesis deposits.
353
355
  stateFulu.depositRequestsStartIndex = BigInt(stateFulu.eth1DepositIndex);
354
356
  }
357
+ const proposerLookahead: ValidatorIndex[] = [];
358
+ for (let epoch = GENESIS_EPOCH; epoch <= GENESIS_EPOCH + MIN_SEED_LOOKAHEAD; epoch++) {
359
+ const activeIndices = getActiveValidatorIndices(state, epoch);
360
+ proposerLookahead.push(...computeProposerIndices(fork, state, {activeIndices}, epoch));
361
+ }
362
+ stateFulu.proposerLookahead = ssz.fulu.ProposerLookahead.toViewDU(proposerLookahead);
355
363
  }
356
364
 
357
365
  if (fork >= ForkSeq.gloas) {
@@ -1,6 +1,6 @@
1
1
  import {toBufferBE} from "@vekexasia/bigint-buffer2";
2
2
  import {digest} from "@chainsafe/as-sha256";
3
- import {SecretKey} from "@chainsafe/lodestar-z/blst";
3
+ import {SecretKey} from "@lodestar/native/blst";
4
4
  import {bytesToBigInt, intToBytes} from "@lodestar/utils";
5
5
 
6
6
  let curveOrder: bigint;
package/src/util/seed.ts CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  computePtcIndicesForEpoch,
4
4
  computeProposerIndex as nativeComputeProposerIndex,
5
5
  computeSyncCommitteeIndices as nativeComputeSyncCommitteeIndices,
6
- } from "@chainsafe/lodestar-z/shuffle";
6
+ } from "@lodestar/native/shuffle";
7
7
  import {
8
8
  DOMAIN_BEACON_PROPOSER,
9
9
  DOMAIN_PTC_ATTESTER,
@@ -1,4 +1,4 @@
1
- import {BLS_VERIFIER_SET_TYPE, type BlsSignatureSet, verifySignatureSets} from "@chainsafe/lodestar-z/bls-verifier";
1
+ import {BLS_VERIFIER_SET_TYPE, type BlsSignatureSet, verifySignatureSets} from "@lodestar/native/bls-verifier";
2
2
  import {Root} from "@lodestar/types";
3
3
 
4
4
  export enum SignatureSetType {
@@ -1,5 +1,5 @@
1
- import {aggregateSerializedPublicKeys} from "@chainsafe/lodestar-z/blst";
2
1
  import {ChainConfig} from "@lodestar/config";
2
+ import {aggregateSerializedPublicKeys} from "@lodestar/native/blst";
3
3
  import {
4
4
  BASE_REWARD_FACTOR,
5
5
  EFFECTIVE_BALANCE_INCREMENT,