@lodestar/state-transition 1.41.0-dev.bb273175f2 → 1.41.0-dev.be5acbb8f7
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.
- package/lib/block/index.d.ts +3 -3
- package/lib/block/processExecutionPayloadBid.d.ts +1 -1
- package/lib/block/processExecutionPayloadEnvelope.d.ts +5 -2
- package/lib/block/processExecutionPayloadEnvelope.d.ts.map +1 -1
- package/lib/block/processExecutionPayloadEnvelope.js +20 -14
- package/lib/block/processExecutionPayloadEnvelope.js.map +1 -1
- package/lib/block/processPayloadAttestation.d.ts +1 -1
- package/lib/epoch/index.d.ts +1 -1
- package/lib/epoch/processBuilderPendingPayments.d.ts +1 -1
- package/lib/testUtils/cache.d.ts +2 -0
- package/lib/testUtils/cache.d.ts.map +1 -0
- package/lib/testUtils/cache.js +7 -0
- package/lib/testUtils/cache.js.map +1 -0
- package/lib/testUtils/index.d.ts +6 -0
- package/lib/testUtils/index.d.ts.map +1 -0
- package/lib/testUtils/index.js +6 -0
- package/lib/testUtils/index.js.map +1 -0
- package/lib/testUtils/infura.d.ts +3 -0
- package/lib/testUtils/infura.d.ts.map +1 -0
- package/lib/testUtils/infura.js +8 -0
- package/lib/testUtils/infura.js.map +1 -0
- package/lib/testUtils/interop.d.ts +2 -0
- package/lib/testUtils/interop.d.ts.map +1 -0
- package/lib/testUtils/interop.js +24 -0
- package/lib/testUtils/interop.js.map +1 -0
- package/lib/testUtils/params.d.ts +18 -0
- package/lib/testUtils/params.d.ts.map +1 -0
- package/lib/testUtils/params.js +20 -0
- package/lib/testUtils/params.js.map +1 -0
- package/lib/testUtils/state.d.ts +20 -0
- package/lib/testUtils/state.d.ts.map +1 -0
- package/lib/testUtils/state.js +78 -0
- package/lib/testUtils/state.js.map +1 -0
- package/lib/testUtils/testFileCache.d.ts +17 -0
- package/lib/testUtils/testFileCache.d.ts.map +1 -0
- package/lib/testUtils/testFileCache.js +96 -0
- package/lib/testUtils/testFileCache.js.map +1 -0
- package/lib/testUtils/util.d.ts +50 -0
- package/lib/testUtils/util.d.ts.map +1 -0
- package/lib/testUtils/util.js +329 -0
- package/lib/testUtils/util.js.map +1 -0
- package/package.json +12 -7
- package/src/block/index.ts +3 -3
- package/src/block/isValidIndexedPayloadAttestation.ts +2 -2
- package/src/block/processAttestationsAltair.ts +1 -1
- package/src/block/processExecutionPayloadBid.ts +4 -4
- package/src/block/processExecutionPayloadEnvelope.ts +35 -21
- package/src/block/processOperations.ts +1 -1
- package/src/block/processPayloadAttestation.ts +2 -2
- package/src/block/processWithdrawals.ts +1 -1
- package/src/epoch/index.ts +1 -1
- package/src/epoch/processBuilderPendingPayments.ts +2 -2
- package/src/testUtils/cache.ts +8 -0
- package/src/testUtils/index.ts +5 -0
- package/src/testUtils/infura.ts +10 -0
- package/src/testUtils/interop.ts +29 -0
- package/src/testUtils/params.ts +23 -0
- package/src/testUtils/state.ts +110 -0
- package/src/testUtils/testFileCache.ts +127 -0
- package/src/testUtils/util.ts +429 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { PublicKey } from "@chainsafe/blst";
|
|
2
|
+
import { BitArray, fromHexString } from "@chainsafe/ssz";
|
|
3
|
+
import { createBeaconConfig, createChainForkConfig } from "@lodestar/config";
|
|
4
|
+
import { config } from "@lodestar/config/default";
|
|
5
|
+
import { EPOCHS_PER_ETH1_VOTING_PERIOD, EPOCHS_PER_HISTORICAL_VECTOR, ForkSeq, MAX_ATTESTATIONS, MAX_EFFECTIVE_BALANCE, SLOTS_PER_EPOCH, SLOTS_PER_HISTORICAL_ROOT, } from "@lodestar/params";
|
|
6
|
+
import { ssz } from "@lodestar/types";
|
|
7
|
+
import { getEffectiveBalanceIncrements } from "../cache/effectiveBalanceIncrements.js";
|
|
8
|
+
import { computeCommitteeCount, computeEpochAtSlot, createCachedBeaconState, createPubkeyCache, interopSecretKey, newFilledArray, processSlots, } from "../index.js";
|
|
9
|
+
import { getNextSyncCommittee } from "../util/syncCommittee.js";
|
|
10
|
+
import { getActiveValidatorIndices } from "../util/validator.js";
|
|
11
|
+
import { interopPubkeysCached } from "./interop.js";
|
|
12
|
+
let phase0State = null;
|
|
13
|
+
let phase0CachedState23637 = null;
|
|
14
|
+
let phase0CachedState23638 = null;
|
|
15
|
+
let phase0SignedBlock = null;
|
|
16
|
+
let altairState = null;
|
|
17
|
+
let altairCachedState23637 = null;
|
|
18
|
+
let altairCachedState23638 = null;
|
|
19
|
+
/**
|
|
20
|
+
* Number of validators in prater is 210000 as of May 2021
|
|
21
|
+
*/
|
|
22
|
+
export const numValidators = 250000;
|
|
23
|
+
export const keypairsMod = 100;
|
|
24
|
+
/**
|
|
25
|
+
* As of Jul 07 2021, the performance state has
|
|
26
|
+
* out.prevEpochUnslashedStake.targetStake 7750000000000000n
|
|
27
|
+
* out.currEpochUnslashedTargetStake 7750000000000000n
|
|
28
|
+
* This prefix represent the total stake in Peta Wei
|
|
29
|
+
*/
|
|
30
|
+
export const perfStateId = `${numValidators} vs - 7PWei`;
|
|
31
|
+
/** Cache interop secret keys */
|
|
32
|
+
const secretKeyByModIndex = new Map();
|
|
33
|
+
const epoch = 23638;
|
|
34
|
+
export const perfStateEpoch = epoch;
|
|
35
|
+
export function getPubkeys(vc = numValidators) {
|
|
36
|
+
const pubkeysMod = interopPubkeysCached(keypairsMod);
|
|
37
|
+
const pubkeysModObj = pubkeysMod.map((pk) => PublicKey.fromBytes(pk));
|
|
38
|
+
const pubkeys = Array.from({ length: vc }, (_, i) => pubkeysMod[i % keypairsMod]);
|
|
39
|
+
return { pubkeysMod, pubkeysModObj, pubkeys };
|
|
40
|
+
}
|
|
41
|
+
/** Get secret key of a validatorIndex, if the pubkeys are generated with `getPubkeys()` */
|
|
42
|
+
export function getSecretKeyFromIndex(validatorIndex) {
|
|
43
|
+
return interopSecretKey(validatorIndex % keypairsMod);
|
|
44
|
+
}
|
|
45
|
+
/** Get secret key of a validatorIndex, if the pubkeys are generated with `getPubkeys()` */
|
|
46
|
+
export function getSecretKeyFromIndexCached(validatorIndex) {
|
|
47
|
+
const keyIndex = validatorIndex % keypairsMod;
|
|
48
|
+
let sk = secretKeyByModIndex.get(keyIndex);
|
|
49
|
+
if (!sk) {
|
|
50
|
+
sk = interopSecretKey(keyIndex);
|
|
51
|
+
secretKeyByModIndex.set(keyIndex, sk);
|
|
52
|
+
}
|
|
53
|
+
return sk;
|
|
54
|
+
}
|
|
55
|
+
function getPubkeyCaches({ pubkeysMod }) {
|
|
56
|
+
// Manually sync pubkeys to prevent doing BLS opts 110_000 times
|
|
57
|
+
const pubkeyCache = createPubkeyCache();
|
|
58
|
+
for (let i = 0; i < numValidators; i++) {
|
|
59
|
+
const pubkey = pubkeysMod[i % keypairsMod];
|
|
60
|
+
pubkeyCache.set(i, pubkey);
|
|
61
|
+
}
|
|
62
|
+
return { pubkeyCache };
|
|
63
|
+
}
|
|
64
|
+
export function generatePerfTestCachedStatePhase0(opts) {
|
|
65
|
+
// Generate only some publicKeys
|
|
66
|
+
const { pubkeys, pubkeysMod, pubkeysModObj } = getPubkeys();
|
|
67
|
+
const { pubkeyCache } = getPubkeyCaches({ pubkeys, pubkeysMod, pubkeysModObj });
|
|
68
|
+
if (!phase0State) {
|
|
69
|
+
const state = buildPerformanceStatePhase0();
|
|
70
|
+
// no justificationBits
|
|
71
|
+
phase0State = ssz.phase0.BeaconState.toViewDU(state);
|
|
72
|
+
// cache roots
|
|
73
|
+
phase0State.hashTreeRoot();
|
|
74
|
+
}
|
|
75
|
+
if (!phase0CachedState23637) {
|
|
76
|
+
const state = phase0State.clone();
|
|
77
|
+
state.slot -= 1;
|
|
78
|
+
phase0CachedState23637 = createCachedBeaconState(state, {
|
|
79
|
+
config: createBeaconConfig(config, state.genesisValidatorsRoot),
|
|
80
|
+
pubkeyCache,
|
|
81
|
+
});
|
|
82
|
+
const currentEpoch = computeEpochAtSlot(state.slot - 1);
|
|
83
|
+
const previousEpoch = currentEpoch - 1;
|
|
84
|
+
// previous epoch attestations
|
|
85
|
+
const numPrevAttestations = SLOTS_PER_EPOCH * MAX_ATTESTATIONS;
|
|
86
|
+
const activeValidatorCount = pubkeys.length;
|
|
87
|
+
const committeesPerSlot = computeCommitteeCount(activeValidatorCount);
|
|
88
|
+
for (let i = 0; i < numPrevAttestations; i++) {
|
|
89
|
+
const slotInEpoch = i % SLOTS_PER_EPOCH;
|
|
90
|
+
const slot = previousEpoch * SLOTS_PER_EPOCH + slotInEpoch;
|
|
91
|
+
const index = i % committeesPerSlot;
|
|
92
|
+
const shuffling = phase0CachedState23637.epochCtx.getShufflingAtEpoch(previousEpoch);
|
|
93
|
+
const committee = shuffling.committees[slotInEpoch][index];
|
|
94
|
+
phase0CachedState23637.previousEpochAttestations.push(ssz.phase0.PendingAttestation.toViewDU({
|
|
95
|
+
aggregationBits: BitArray.fromBoolArray(Array.from({ length: committee.length }, () => true)),
|
|
96
|
+
data: {
|
|
97
|
+
beaconBlockRoot: phase0CachedState23637.blockRoots.get(slotInEpoch % SLOTS_PER_HISTORICAL_ROOT),
|
|
98
|
+
index,
|
|
99
|
+
slot,
|
|
100
|
+
source: state.previousJustifiedCheckpoint,
|
|
101
|
+
target: state.currentJustifiedCheckpoint,
|
|
102
|
+
},
|
|
103
|
+
inclusionDelay: 1,
|
|
104
|
+
proposerIndex: i,
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
// current epoch attestations
|
|
108
|
+
const numCurAttestations = (SLOTS_PER_EPOCH - 1) * MAX_ATTESTATIONS;
|
|
109
|
+
for (let i = 0; i < numCurAttestations; i++) {
|
|
110
|
+
const slotInEpoch = i % SLOTS_PER_EPOCH;
|
|
111
|
+
const slot = currentEpoch * SLOTS_PER_EPOCH + slotInEpoch;
|
|
112
|
+
const index = i % committeesPerSlot;
|
|
113
|
+
const shuffling = phase0CachedState23637.epochCtx.getShufflingAtEpoch(previousEpoch);
|
|
114
|
+
const committee = shuffling.committees[slotInEpoch][index];
|
|
115
|
+
phase0CachedState23637.currentEpochAttestations.push(ssz.phase0.PendingAttestation.toViewDU({
|
|
116
|
+
aggregationBits: BitArray.fromBoolArray(Array.from({ length: committee.length }, () => true)),
|
|
117
|
+
data: {
|
|
118
|
+
beaconBlockRoot: phase0CachedState23637.blockRoots.get(slotInEpoch % SLOTS_PER_HISTORICAL_ROOT),
|
|
119
|
+
index,
|
|
120
|
+
slot,
|
|
121
|
+
source: state.currentJustifiedCheckpoint,
|
|
122
|
+
target: {
|
|
123
|
+
epoch: currentEpoch,
|
|
124
|
+
root: phase0CachedState23637.blockRoots.get((currentEpoch * SLOTS_PER_EPOCH) % SLOTS_PER_HISTORICAL_ROOT),
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
inclusionDelay: 1,
|
|
128
|
+
proposerIndex: i,
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!phase0CachedState23638) {
|
|
133
|
+
phase0CachedState23638 = processSlots(phase0CachedState23637, phase0CachedState23637.slot + 1);
|
|
134
|
+
phase0CachedState23638.slot += 1;
|
|
135
|
+
}
|
|
136
|
+
const resultingState = opts?.goBackOneSlot ? phase0CachedState23637 : phase0CachedState23638;
|
|
137
|
+
return resultingState.clone();
|
|
138
|
+
}
|
|
139
|
+
export function cachedStateAltairPopulateCaches(state) {
|
|
140
|
+
// Populate caches
|
|
141
|
+
state.blockRoots.getAllReadonly();
|
|
142
|
+
state.eth1DataVotes.getAllReadonly();
|
|
143
|
+
state.validators.getAllReadonly();
|
|
144
|
+
state.balances.getAll();
|
|
145
|
+
state.previousEpochParticipation.getAll();
|
|
146
|
+
state.currentEpochParticipation.getAll();
|
|
147
|
+
state.inactivityScores.getAll();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Warning: This function has side effects on the cached state
|
|
151
|
+
* The order in which the caches are populated is important and can cause stable tests to fail.
|
|
152
|
+
*/
|
|
153
|
+
export function generatePerfTestCachedStateAltair(opts) {
|
|
154
|
+
const { pubkeys, pubkeysMod, pubkeysModObj } = getPubkeys(opts?.vc);
|
|
155
|
+
const { pubkeyCache } = getPubkeyCaches({ pubkeys, pubkeysMod, pubkeysModObj });
|
|
156
|
+
const altairConfig = createChainForkConfig({ ALTAIR_FORK_EPOCH: 0 });
|
|
157
|
+
const origState = generatePerformanceStateAltair(pubkeys);
|
|
158
|
+
if (!altairCachedState23637) {
|
|
159
|
+
const state = origState.clone();
|
|
160
|
+
state.slot -= 1;
|
|
161
|
+
altairCachedState23637 = createCachedBeaconState(state, {
|
|
162
|
+
config: createBeaconConfig(altairConfig, state.genesisValidatorsRoot),
|
|
163
|
+
pubkeyCache,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (!altairCachedState23638) {
|
|
167
|
+
altairCachedState23638 = processSlots(altairCachedState23637, altairCachedState23637.slot + 1);
|
|
168
|
+
altairCachedState23638.slot += 1;
|
|
169
|
+
}
|
|
170
|
+
const resultingState = opts?.goBackOneSlot ? altairCachedState23637 : altairCachedState23638;
|
|
171
|
+
return resultingState.clone();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* This is generated from Medalla state 756416
|
|
175
|
+
*/
|
|
176
|
+
export function generatePerformanceStateAltair(pubkeysArg) {
|
|
177
|
+
if (!altairState) {
|
|
178
|
+
const pubkeys = pubkeysArg || getPubkeys().pubkeys;
|
|
179
|
+
const statePhase0 = buildPerformanceStatePhase0(pubkeys);
|
|
180
|
+
const state = statePhase0;
|
|
181
|
+
state.previousEpochParticipation = newFilledArray(pubkeys.length, 0b111);
|
|
182
|
+
state.currentEpochParticipation = state.previousEpochParticipation;
|
|
183
|
+
state.inactivityScores = Array.from({ length: pubkeys.length }, (_, i) => i % 2);
|
|
184
|
+
// Placeholder syncCommittees
|
|
185
|
+
state.currentSyncCommittee = ssz.altair.SyncCommittee.defaultValue();
|
|
186
|
+
state.nextSyncCommittee = state.currentSyncCommittee;
|
|
187
|
+
// Now the state is fully populated to convert to ViewDU
|
|
188
|
+
altairState = ssz.altair.BeaconState.toViewDU(state);
|
|
189
|
+
// Now set correct syncCommittees
|
|
190
|
+
const epoch = computeEpochAtSlot(state.slot);
|
|
191
|
+
const activeValidatorIndices = getActiveValidatorIndices(altairState, epoch);
|
|
192
|
+
const effectiveBalanceIncrements = getEffectiveBalanceIncrements(altairState);
|
|
193
|
+
const { syncCommittee } = getNextSyncCommittee(ForkSeq.altair, altairState, activeValidatorIndices, effectiveBalanceIncrements);
|
|
194
|
+
state.currentSyncCommittee = syncCommittee;
|
|
195
|
+
state.nextSyncCommittee = syncCommittee;
|
|
196
|
+
altairState = ssz.altair.BeaconState.toViewDU(state);
|
|
197
|
+
// cache roots
|
|
198
|
+
altairState.hashTreeRoot();
|
|
199
|
+
}
|
|
200
|
+
return altairState.clone();
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* This is generated from Medalla block 756417
|
|
204
|
+
*/
|
|
205
|
+
export function generatePerformanceBlockPhase0() {
|
|
206
|
+
if (!phase0SignedBlock) {
|
|
207
|
+
const block = ssz.phase0.SignedBeaconBlock.defaultValue();
|
|
208
|
+
const parentState = generatePerfTestCachedStatePhase0();
|
|
209
|
+
block.message.slot = parentState.slot;
|
|
210
|
+
block.message.proposerIndex = parentState.epochCtx.getBeaconProposer(parentState.slot);
|
|
211
|
+
block.message.parentRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(parentState.latestBlockHeader);
|
|
212
|
+
block.message.stateRoot = fromHexString("0x6c86ca3c4c6688cf189421b8a68bf2dbc91521609965e6f4e207d44347061fee");
|
|
213
|
+
block.message.body.randaoReveal = fromHexString("0x8a5d2673c48f22f6ed19462efec35645db490df29eed2f56321dbe4a89b2463b0c902095a7ab74a2dc5b7f67edb1a19507ea3d4361d5af9cb0a524945c91638dfd6568841486813a2c45142659d6d9403f5081febb123a7931edbc248b9d0025");
|
|
214
|
+
// eth1Data, graffiti, attestations
|
|
215
|
+
phase0SignedBlock = block;
|
|
216
|
+
}
|
|
217
|
+
return phase0SignedBlock;
|
|
218
|
+
}
|
|
219
|
+
function buildPerformanceStatePhase0(pubkeysArg) {
|
|
220
|
+
const slot = epoch * SLOTS_PER_EPOCH;
|
|
221
|
+
const pubkeys = pubkeysArg || getPubkeys().pubkeys;
|
|
222
|
+
const currentEpoch = computeEpochAtSlot(slot - 1);
|
|
223
|
+
return {
|
|
224
|
+
// Misc
|
|
225
|
+
genesisTime: 1596546008,
|
|
226
|
+
genesisValidatorsRoot: fromHexString("0x04700007fabc8282644aed6d1c7c9e21d38a03a0c4ba193f3afe428824b3a673"),
|
|
227
|
+
slot: epoch * SLOTS_PER_EPOCH,
|
|
228
|
+
fork: {
|
|
229
|
+
currentVersion: fromHexString("0x00000001"),
|
|
230
|
+
previousVersion: fromHexString("0x00000001"),
|
|
231
|
+
epoch: 0,
|
|
232
|
+
},
|
|
233
|
+
// History
|
|
234
|
+
latestBlockHeader: {
|
|
235
|
+
slot: slot - 1,
|
|
236
|
+
proposerIndex: 80882,
|
|
237
|
+
parentRoot: fromHexString("0x5b83c3078e474b86af60043eda82a34c3c2e5ebf83146b14d9d909aea4163ef2"),
|
|
238
|
+
stateRoot: fromHexString("0x2761ae355e8a53c11e0e37d5e417f8984db0c53fa83f1bc65f89c6af35a196a7"),
|
|
239
|
+
bodyRoot: fromHexString("0x249a1962eef90e122fa2447040bfac102798b1dba9c73e5593bc5aa32eb92bfd"),
|
|
240
|
+
},
|
|
241
|
+
blockRoots: Array.from({ length: SLOTS_PER_HISTORICAL_ROOT }, (_, i) => Buffer.alloc(32, i)),
|
|
242
|
+
stateRoots: Array.from({ length: SLOTS_PER_HISTORICAL_ROOT }, (_, i) => Buffer.alloc(32, i)),
|
|
243
|
+
historicalRoots: [],
|
|
244
|
+
// Eth1
|
|
245
|
+
eth1Data: {
|
|
246
|
+
depositCount: pubkeys.length,
|
|
247
|
+
depositRoot: fromHexString("0xcb1f89a924cfd31224823db5a41b1643f10faa7aedf231f1e28887f6ee98c047"),
|
|
248
|
+
blockHash: fromHexString("0x701fb2869ce16d0f1d14f6705725adb0dec6799da29006dfc6fff83960298f21"),
|
|
249
|
+
},
|
|
250
|
+
// minus one so that inserting 1 from block works
|
|
251
|
+
eth1DataVotes: newFilledArray(EPOCHS_PER_ETH1_VOTING_PERIOD * SLOTS_PER_EPOCH - 1, {
|
|
252
|
+
depositCount: 1,
|
|
253
|
+
depositRoot: Buffer.alloc(32, 1),
|
|
254
|
+
blockHash: Buffer.alloc(32, 1),
|
|
255
|
+
}),
|
|
256
|
+
eth1DepositIndex: pubkeys.length,
|
|
257
|
+
// Registry
|
|
258
|
+
validators: pubkeys.map((_, i) => ({
|
|
259
|
+
pubkey: pubkeys[i],
|
|
260
|
+
withdrawalCredentials: Buffer.alloc(32, i),
|
|
261
|
+
effectiveBalance: 31000000000,
|
|
262
|
+
slashed: false,
|
|
263
|
+
activationEligibilityEpoch: 0,
|
|
264
|
+
activationEpoch: 0,
|
|
265
|
+
exitEpoch: Infinity,
|
|
266
|
+
withdrawableEpoch: Infinity,
|
|
267
|
+
})),
|
|
268
|
+
balances: Array.from({ length: pubkeys.length }, () => 31217089836),
|
|
269
|
+
randaoMixes: Array.from({ length: EPOCHS_PER_HISTORICAL_VECTOR }, (_, i) => Buffer.alloc(32, i)),
|
|
270
|
+
// Slashings
|
|
271
|
+
slashings: ssz.phase0.Slashings.defaultValue(),
|
|
272
|
+
previousEpochAttestations: [],
|
|
273
|
+
currentEpochAttestations: [],
|
|
274
|
+
// Finality
|
|
275
|
+
justificationBits: BitArray.fromBitLen(4),
|
|
276
|
+
previousJustifiedCheckpoint: {
|
|
277
|
+
epoch: currentEpoch - 2,
|
|
278
|
+
root: fromHexString("0x3fe60bf06a57b0956cd1f8181d26649cf8bf79e48bf82f55562e04b33d4785d4"),
|
|
279
|
+
},
|
|
280
|
+
currentJustifiedCheckpoint: {
|
|
281
|
+
epoch: currentEpoch - 1,
|
|
282
|
+
root: fromHexString("0x3ba0913d2fb5e4cbcfb0d39eb15803157c1e769d63b8619285d8fdabbd8181c7"),
|
|
283
|
+
},
|
|
284
|
+
finalizedCheckpoint: {
|
|
285
|
+
epoch: currentEpoch - 3,
|
|
286
|
+
root: fromHexString("0x122b8ff579d0c8f8a8b66326bdfec3f685007d2842f01615a0768870961ccc17"),
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
export function generateTestCachedBeaconStateOnlyValidators({ vc, slot, }) {
|
|
291
|
+
// Generate only some publicKeys
|
|
292
|
+
const { pubkeys, pubkeysMod } = getPubkeys(vc);
|
|
293
|
+
// Manually sync pubkeys to prevent doing BLS opts 110_000 times
|
|
294
|
+
const pubkeyCache = createPubkeyCache();
|
|
295
|
+
for (let i = 0; i < vc; i++) {
|
|
296
|
+
const pubkey = pubkeysMod[i % keypairsMod];
|
|
297
|
+
pubkeyCache.set(i, pubkey);
|
|
298
|
+
}
|
|
299
|
+
const state = ssz.phase0.BeaconState.defaultViewDU();
|
|
300
|
+
state.slot = slot;
|
|
301
|
+
const activeValidator = ssz.phase0.Validator.toViewDU({
|
|
302
|
+
pubkey: Buffer.alloc(48, 0),
|
|
303
|
+
withdrawalCredentials: Buffer.alloc(32, 0),
|
|
304
|
+
effectiveBalance: MAX_EFFECTIVE_BALANCE,
|
|
305
|
+
slashed: false,
|
|
306
|
+
activationEligibilityEpoch: 0,
|
|
307
|
+
activationEpoch: 0,
|
|
308
|
+
exitEpoch: Infinity,
|
|
309
|
+
withdrawableEpoch: Infinity,
|
|
310
|
+
});
|
|
311
|
+
for (let i = 0; i < vc; i++) {
|
|
312
|
+
const validator = activeValidator.clone();
|
|
313
|
+
validator.pubkey = pubkeys[i];
|
|
314
|
+
state.validators.push(validator);
|
|
315
|
+
}
|
|
316
|
+
state.balances = ssz.phase0.Balances.toViewDU(newFilledArray(pubkeys.length, MAX_EFFECTIVE_BALANCE));
|
|
317
|
+
state.randaoMixes = ssz.phase0.RandaoMixes.toViewDU(newFilledArray(EPOCHS_PER_HISTORICAL_VECTOR, Buffer.alloc(32, 0xdd)));
|
|
318
|
+
// Commit ViewDU changes
|
|
319
|
+
state.commit();
|
|
320
|
+
// Sanity check for .commit() above
|
|
321
|
+
if (state.validators.length !== vc) {
|
|
322
|
+
throw Error(`Wrong number of validators in the state: ${state.validators.length} !== ${vc}`);
|
|
323
|
+
}
|
|
324
|
+
return createCachedBeaconState(state, {
|
|
325
|
+
config: createBeaconConfig(config, state.genesisValidatorsRoot),
|
|
326
|
+
pubkeyCache,
|
|
327
|
+
}, { skipSyncPubkeys: true });
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/testUtils/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAY,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAC,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAC;AAChD,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAE5B,OAAO,EACP,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAA4B,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAC,6BAA6B,EAAC,MAAM,wCAAwC,CAAC;AACrF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAC,yBAAyB,EAAC,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAC,oBAAoB,EAAC,MAAM,cAAc,CAAC;AAElD,IAAI,WAAW,GAA6B,IAAI,CAAC;AACjD,IAAI,sBAAsB,GAAmC,IAAI,CAAC;AAClE,IAAI,sBAAsB,GAAmC,IAAI,CAAC;AAClE,IAAI,iBAAiB,GAAoC,IAAI,CAAC;AAC9D,IAAI,WAAW,GAA6B,IAAI,CAAC;AACjD,IAAI,sBAAsB,GAAmC,IAAI,CAAC;AAClE,IAAI,sBAAsB,GAAmC,IAAI,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,aAAa,aAAa,CAAC;AAEzD,gCAAgC;AAChC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAqB,CAAC;AACzD,MAAM,KAAK,GAAG,KAAK,CAAC;AACpB,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,EAAE,GAAG,aAAa;IAC3C,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,EAAE,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAChF,OAAO,EAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAC,CAAC;AAC9C,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CAAC,cAAsB;IAC1D,OAAO,gBAAgB,CAAC,cAAc,GAAG,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,2BAA2B,CAAC,cAAsB;IAChE,MAAM,QAAQ,GAAG,cAAc,GAAG,WAAW,CAAC;IAC9C,IAAI,EAAE,GAAG,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAChC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,EAAC,UAAU,EAAgC;IAClE,gEAAgE;IAChE,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;QAC3C,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,EAAC,WAAW,EAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,IAA+B;IAC/E,gCAAgC;IAChC,MAAM,EAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAC,GAAG,UAAU,EAAE,CAAC;IAC1D,MAAM,EAAC,WAAW,EAAC,GAAG,eAAe,CAAC,EAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAC,CAAC,CAAC;IAE5E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC;QAE5C,uBAAuB;QACvB,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAErD,cAAc;QACd,WAAW,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QAChB,sBAAsB,GAAG,uBAAuB,CAAC,KAAK,EAAE;YACtD,MAAM,EAAE,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,qBAAqB,CAAC;YAC/D,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,YAAY,GAAG,CAAC,CAAC;QAEvC,8BAA8B;QAC9B,MAAM,mBAAmB,GAAG,eAAe,GAAG,gBAAgB,CAAC;QAC/D,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5C,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,CAAC;YACxC,MAAM,IAAI,GAAG,aAAa,GAAG,eAAe,GAAG,WAAW,CAAC;YAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,iBAAiB,CAAC;YACpC,MAAM,SAAS,GAAG,sBAAsB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YACrF,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3D,sBAAsB,CAAC,yBAAyB,CAAC,IAAI,CACnD,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC;gBACrC,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC3F,IAAI,EAAE;oBACJ,eAAe,EAAE,sBAAsB,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,GAAG,yBAAyB,CAAC;oBAC/F,KAAK;oBACL,IAAI;oBACJ,MAAM,EAAE,KAAK,CAAC,2BAA2B;oBACzC,MAAM,EAAE,KAAK,CAAC,0BAA0B;iBACzC;gBACD,cAAc,EAAE,CAAC;gBACjB,aAAa,EAAE,CAAC;aACjB,CAAC,CACH,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,kBAAkB,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC;QACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,CAAC;YACxC,MAAM,IAAI,GAAG,YAAY,GAAG,eAAe,GAAG,WAAW,CAAC;YAC1D,MAAM,KAAK,GAAG,CAAC,GAAG,iBAAiB,CAAC;YACpC,MAAM,SAAS,GAAG,sBAAsB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YACrF,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC;YAE3D,sBAAsB,CAAC,wBAAwB,CAAC,IAAI,CAClD,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC;gBACrC,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC3F,IAAI,EAAE;oBACJ,eAAe,EAAE,sBAAsB,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,GAAG,yBAAyB,CAAC;oBAC/F,KAAK;oBACL,IAAI;oBACJ,MAAM,EAAE,KAAK,CAAC,0BAA0B;oBACxC,MAAM,EAAE;wBACN,KAAK,EAAE,YAAY;wBACnB,IAAI,EAAE,sBAAsB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,eAAe,CAAC,GAAG,yBAAyB,CAAC;qBAC1G;iBACF;gBACD,cAAc,EAAE,CAAC;gBACjB,aAAa,EAAE,CAAC;aACjB,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,sBAAsB,GAAG,YAAY,CACnC,sBAAsB,EACtB,sBAAsB,CAAC,IAAI,GAAG,CAAC,CACL,CAAC;QAC7B,sBAAsB,CAAC,IAAI,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAE7F,OAAO,cAAc,CAAC,KAAK,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAA8B;IAC5E,kBAAkB;IAClB,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;IAClC,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;IACrC,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;IAClC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,0BAA0B,CAAC,MAAM,EAAE,CAAC;IAC1C,KAAK,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC;IACzC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,IAGjD;IACC,MAAM,EAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAC,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,EAAC,WAAW,EAAC,GAAG,eAAe,CAAC,EAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAC,CAAC,CAAC;IAE5E,MAAM,YAAY,GAAG,qBAAqB,CAAC,EAAC,iBAAiB,EAAE,CAAC,EAAC,CAAC,CAAC;IAEnE,MAAM,SAAS,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;IAE1D,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QAChB,sBAAsB,GAAG,uBAAuB,CAAC,KAAK,EAAE;YACtD,MAAM,EAAE,kBAAkB,CAAC,YAAY,EAAE,KAAK,CAAC,qBAAqB,CAAC;YACrE,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,sBAAsB,GAAG,YAAY,CACnC,sBAAsB,EACtB,sBAAsB,CAAC,IAAI,GAAG,CAAC,CACL,CAAC;QAC7B,sBAAsB,CAAC,IAAI,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAE7F,OAAO,cAAc,CAAC,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,UAAyB;IACtE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,UAAU,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC;QACnD,MAAM,WAAW,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,WAA0D,CAAC;QAEzE,KAAK,CAAC,0BAA0B,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzE,KAAK,CAAC,yBAAyB,GAAG,KAAK,CAAC,0BAA0B,CAAC;QACnE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/E,6BAA6B;QAC7B,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QACrE,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,oBAAoB,CAAC;QAErD,wDAAwD;QACxD,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAErD,iCAAiC;QACjC,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,sBAAsB,GAAG,yBAAyB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAE7E,MAAM,0BAA0B,GAAG,6BAA6B,CAAC,WAAW,CAAC,CAAC;QAC9E,MAAM,EAAC,aAAa,EAAC,GAAG,oBAAoB,CAC1C,OAAO,CAAC,MAAM,EACd,WAAW,EACX,sBAAsB,EACtB,0BAA0B,CAC3B,CAAC;QACF,KAAK,CAAC,oBAAoB,GAAG,aAAa,CAAC;QAC3C,KAAK,CAAC,iBAAiB,GAAG,aAAa,CAAC;QAExC,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrD,cAAc;QACd,WAAW,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,WAAW,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B;IAC5C,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,iCAAiC,EAAE,CAAC;QACxD,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;QACtC,KAAK,CAAC,OAAO,CAAC,aAAa,GAAG,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvF,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QACpG,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,aAAa,CAAC,oEAAoE,CAAC,CAAC;QAC9G,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG,aAAa,CAC7C,oMAAoM,CACrM,CAAC;QACF,mCAAmC;QACnC,iBAAiB,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,2BAA2B,CAAC,UAAyB;IAC5D,MAAM,IAAI,GAAG,KAAK,GAAG,eAAe,CAAC;IACrC,MAAM,OAAO,GAAG,UAAU,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC;IACnD,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAElD,OAAO;QACL,OAAO;QACP,WAAW,EAAE,UAAU;QACvB,qBAAqB,EAAE,aAAa,CAAC,oEAAoE,CAAC;QAC1G,IAAI,EAAE,KAAK,GAAG,eAAe;QAC7B,IAAI,EAAE;YACJ,cAAc,EAAE,aAAa,CAAC,YAAY,CAAC;YAC3C,eAAe,EAAE,aAAa,CAAC,YAAY,CAAC;YAC5C,KAAK,EAAE,CAAC;SACT;QACD,UAAU;QACV,iBAAiB,EAAE;YACjB,IAAI,EAAE,IAAI,GAAG,CAAC;YACd,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,aAAa,CAAC,oEAAoE,CAAC;YAC/F,SAAS,EAAE,aAAa,CAAC,oEAAoE,CAAC;YAC9F,QAAQ,EAAE,aAAa,CAAC,oEAAoE,CAAC;SAC9F;QACD,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,yBAAyB,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1F,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,yBAAyB,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1F,eAAe,EAAE,EAAE;QACnB,OAAO;QACP,QAAQ,EAAE;YACR,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,WAAW,EAAE,aAAa,CAAC,oEAAoE,CAAC;YAChG,SAAS,EAAE,aAAa,CAAC,oEAAoE,CAAC;SAC/F;QACD,iDAAiD;QACjD,aAAa,EAAE,cAAc,CAAC,6BAA6B,GAAG,eAAe,GAAG,CAAC,EAAE;YACjF,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;SAC/B,CAAC;QACF,gBAAgB,EAAE,OAAO,CAAC,MAAM;QAChC,WAAW;QACX,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAClB,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,gBAAgB,EAAE,WAAW;YAC7B,OAAO,EAAE,KAAK;YACd,0BAA0B,EAAE,CAAC;YAC7B,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,QAAQ;YACnB,iBAAiB,EAAE,QAAQ;SAC5B,CAAC,CAAC;QACH,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAC,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC;QACjE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,4BAA4B,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9F,YAAY;QACZ,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE;QAC9C,yBAAyB,EAAE,EAAE;QAC7B,wBAAwB,EAAE,EAAE;QAC5B,WAAW;QACX,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QACzC,2BAA2B,EAAE;YAC3B,KAAK,EAAE,YAAY,GAAG,CAAC;YACvB,IAAI,EAAE,aAAa,CAAC,oEAAoE,CAAC;SAC1F;QACD,0BAA0B,EAAE;YAC1B,KAAK,EAAE,YAAY,GAAG,CAAC;YACvB,IAAI,EAAE,aAAa,CAAC,oEAAoE,CAAC;SAC1F;QACD,mBAAmB,EAAE;YACnB,KAAK,EAAE,YAAY,GAAG,CAAC;YACvB,IAAI,EAAE,aAAa,CAAC,oEAAoE,CAAC;SAC1F;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2CAA2C,CAAC,EAC1D,EAAE,EACF,IAAI,GAIL;IACC,gCAAgC;IAChC,MAAM,EAAC,OAAO,EAAE,UAAU,EAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAE7C,gEAAgE;IAChE,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;QAC3C,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;IACrD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAElB,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;QACpD,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3B,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,gBAAgB,EAAE,qBAAqB;QACvC,OAAO,EAAE,KAAK;QACd,0BAA0B,EAAE,CAAC;QAC7B,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,QAAQ;QACnB,iBAAiB,EAAE,QAAQ;KAC5B,CAAC,CAAC;IAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1C,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACrG,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CACjD,cAAc,CAAC,4BAA4B,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CACrE,CAAC;IAEF,wBAAwB;IACxB,KAAK,CAAC,MAAM,EAAE,CAAC;IAEf,mCAAmC;IACnC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACnC,MAAM,KAAK,CAAC,4CAA4C,KAAK,CAAC,UAAU,CAAC,MAAM,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,uBAAuB,CAC5B,KAAK,EACL;QACE,MAAM,EAAE,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,qBAAqB,CAAC;QAC/D,WAAW;KACZ,EACD,EAAC,eAAe,EAAE,IAAI,EAAC,CACxB,CAAC;AACJ,CAAC"}
|
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.
|
|
14
|
+
"version": "1.41.0-dev.be5acbb8f7",
|
|
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": [
|
|
@@ -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.
|
|
66
|
-
"@lodestar/params": "^1.41.0-dev.
|
|
67
|
-
"@lodestar/types": "^1.41.0-dev.
|
|
68
|
-
"@lodestar/utils": "^1.41.0-dev.
|
|
70
|
+
"@lodestar/config": "^1.41.0-dev.be5acbb8f7",
|
|
71
|
+
"@lodestar/params": "^1.41.0-dev.be5acbb8f7",
|
|
72
|
+
"@lodestar/types": "^1.41.0-dev.be5acbb8f7",
|
|
73
|
+
"@lodestar/utils": "^1.41.0-dev.be5acbb8f7",
|
|
69
74
|
"@vekexasia/bigint-buffer2": "^1.1.0"
|
|
70
75
|
},
|
|
71
76
|
"devDependencies": {
|
|
72
|
-
"@lodestar/api": "^1.41.0-dev.
|
|
77
|
+
"@lodestar/api": "^1.41.0-dev.be5acbb8f7"
|
|
73
78
|
},
|
|
74
79
|
"keywords": [
|
|
75
80
|
"ethereum",
|
|
@@ -77,5 +82,5 @@
|
|
|
77
82
|
"beacon",
|
|
78
83
|
"blockchain"
|
|
79
84
|
],
|
|
80
|
-
"gitHead": "
|
|
85
|
+
"gitHead": "daf32e31b38dd272b28016e37de0d0419ce72864"
|
|
81
86
|
}
|
package/src/block/index.ts
CHANGED
|
@@ -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.
|
|
17
|
-
import {processExecutionPayloadEnvelope} from "./processExecutionPayloadEnvelope.
|
|
16
|
+
import {processExecutionPayloadBid} from "./processExecutionPayloadBid.js";
|
|
17
|
+
import {processExecutionPayloadEnvelope} from "./processExecutionPayloadEnvelope.js";
|
|
18
18
|
import {processOperations} from "./processOperations.js";
|
|
19
|
-
import {processPayloadAttestation} from "./processPayloadAttestation.
|
|
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 {gloas} from "@lodestar/types";
|
|
2
|
-
import {getIndexedPayloadAttestationSignatureSet} from "../signatureSets/index.
|
|
2
|
+
import {getIndexedPayloadAttestationSignatureSet} from "../signatureSets/index.js";
|
|
3
3
|
import {CachedBeaconStateGloas} from "../types.js";
|
|
4
|
-
import {verifySignatureSet} from "../util/index.
|
|
4
|
+
import {verifySignatureSet} from "../util/index.js";
|
|
5
5
|
|
|
6
6
|
export function isValidIndexedPayloadAttestation(
|
|
7
7
|
state: CachedBeaconStateGloas,
|
|
@@ -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.
|
|
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";
|
|
@@ -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.
|
|
5
|
+
import {G2_POINT_AT_INFINITY} from "../constants/constants.js";
|
|
6
6
|
import {getExecutionPayloadBidSigningRoot} from "../signatureSets/executionPayloadBid.js";
|
|
7
|
-
import {CachedBeaconStateGloas} from "../types.
|
|
8
|
-
import {canBuilderCoverBid, isActiveBuilder} from "../util/gloas.
|
|
9
|
-
import {getCurrentEpoch, getRandaoMix} from "../util/index.
|
|
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.
|
|
11
|
-
import {computeSigningRoot, computeTimeAtSlot} from "../util/index.
|
|
12
|
-
import {processConsolidationRequest} from "./processConsolidationRequest.
|
|
13
|
-
import {processDepositRequest} from "./processDepositRequest.
|
|
14
|
-
import {processWithdrawalRequest} from "./processWithdrawalRequest.
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
45
|
+
processDepositRequest(fork, postState, deposit);
|
|
36
46
|
}
|
|
37
47
|
|
|
38
48
|
for (const withdrawal of requests.withdrawals) {
|
|
39
|
-
processWithdrawalRequest(fork,
|
|
49
|
+
processWithdrawalRequest(fork, postState, withdrawal);
|
|
40
50
|
}
|
|
41
51
|
|
|
42
52
|
for (const consolidation of requests.consolidations) {
|
|
43
|
-
processConsolidationRequest(
|
|
53
|
+
processConsolidationRequest(postState, consolidation);
|
|
44
54
|
}
|
|
45
55
|
|
|
46
56
|
// Queue the builder payment
|
|
47
|
-
const paymentIndex = SLOTS_PER_EPOCH + (
|
|
48
|
-
const payment =
|
|
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
|
-
|
|
62
|
+
postState.builderPendingWithdrawals.push(payment.withdrawal);
|
|
53
63
|
}
|
|
54
64
|
|
|
55
|
-
|
|
65
|
+
postState.builderPendingPayments.set(paymentIndex, ssz.gloas.BuilderPendingPayment.defaultViewDU());
|
|
56
66
|
|
|
57
67
|
// Cache the execution payload hash
|
|
58
|
-
|
|
59
|
-
|
|
68
|
+
postState.executionPayloadAvailability.set(postState.slot % SLOTS_PER_HISTORICAL_ROOT, true);
|
|
69
|
+
postState.latestBlockHash = payload.blockHash;
|
|
60
70
|
|
|
61
|
-
|
|
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(
|
|
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(
|
|
@@ -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.
|
|
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.
|
|
4
|
-
import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestation.
|
|
3
|
+
import {CachedBeaconStateGloas} from "../types.js";
|
|
4
|
+
import {isValidIndexedPayloadAttestation} from "./isValidIndexedPayloadAttestation.js";
|
|
5
5
|
|
|
6
6
|
export function processPayloadAttestation(
|
|
7
7
|
state: CachedBeaconStateGloas,
|
package/src/epoch/index.ts
CHANGED
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
CachedBeaconStatePhase0,
|
|
17
17
|
EpochTransitionCache,
|
|
18
18
|
} from "../types.js";
|
|
19
|
-
import {processBuilderPendingPayments} from "./processBuilderPendingPayments.
|
|
19
|
+
import {processBuilderPendingPayments} from "./processBuilderPendingPayments.js";
|
|
20
20
|
import {processEffectiveBalanceUpdates} from "./processEffectiveBalanceUpdates.js";
|
|
21
21
|
import {processEth1DataReset} from "./processEth1DataReset.js";
|
|
22
22
|
import {processHistoricalRootsUpdate} from "./processHistoricalRootsUpdate.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {SLOTS_PER_EPOCH} from "@lodestar/params";
|
|
2
2
|
import {ssz} from "@lodestar/types";
|
|
3
|
-
import {CachedBeaconStateGloas} from "../types.
|
|
4
|
-
import {getBuilderPaymentQuorumThreshold} from "../util/gloas.
|
|
3
|
+
import {CachedBeaconStateGloas} from "../types.js";
|
|
4
|
+
import {getBuilderPaymentQuorumThreshold} from "../util/gloas.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Processes the builder pending payments from the previous epoch.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import {fileURLToPath} from "node:url";
|
|
3
|
+
|
|
4
|
+
// Global variable __dirname no longer available in ES6 modules.
|
|
5
|
+
// Solutions: https://stackoverflow.com/questions/46745014/alternative-for-dirname-in-node-js-when-using-es6-modules
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
|
|
8
|
+
export const testCachePath = path.join(__dirname, "../../test/test-cache");
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import {NetworkName} from "@lodestar/config/networks";
|
|
2
|
+
|
|
3
|
+
export function getInfuraBeaconUrl(network: NetworkName): string {
|
|
4
|
+
const INFURA_ETH2_CREDENTIALS = process.env.INFURA_ETH2_CREDENTIALS;
|
|
5
|
+
if (!INFURA_ETH2_CREDENTIALS) {
|
|
6
|
+
throw Error("Must set ENV INFURA_ETH2_CREDENTIALS");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
return `https://${INFURA_ETH2_CREDENTIALS}@eth2-beacon-${network}.infura.io`;
|
|
10
|
+
}
|