@xyo-network/xl1-protocol-sdk 2.2.0 → 3.0.0
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/dist/neutral/ChainContextHelpers.d.ts +1 -1
- package/dist/neutral/ChainContextHelpers.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts +35 -2
- package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/ProviderFactory.d.ts.map +1 -1
- package/dist/neutral/CreatableProvider/ProviderFactoryLocator.d.ts.map +1 -1
- package/dist/neutral/amount/index.d.ts +1 -1
- package/dist/neutral/amount/splitOnDecimalToString.d.ts.map +1 -1
- package/dist/neutral/amount/{XL1Amount.d.ts → xl1Amount.d.ts} +1 -1
- package/dist/neutral/amount/{XL1Amount.d.ts.map → xl1Amount.d.ts.map} +1 -1
- package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -1
- package/dist/neutral/block/hydrate/tryHydrateBlock.d.ts.map +1 -1
- package/dist/neutral/block/primitives/hashFromBlockNumber.d.ts.map +1 -1
- package/dist/neutral/block/primitives/validateTransactionOpcodes.d.ts.map +1 -1
- package/dist/neutral/capabilities/Capability.d.ts +1 -8
- package/dist/neutral/capabilities/Capability.d.ts.map +1 -1
- package/dist/neutral/capabilities/Provider.d.ts +14 -23
- package/dist/neutral/capabilities/Provider.d.ts.map +1 -1
- package/dist/neutral/capabilities/connectionTypes.d.ts +9 -0
- package/dist/neutral/capabilities/connectionTypes.d.ts.map +1 -0
- package/dist/neutral/capabilities/index.d.ts +1 -0
- package/dist/neutral/capabilities/index.d.ts.map +1 -1
- package/dist/neutral/capabilities/resolveProviders.d.ts +27 -20
- package/dist/neutral/capabilities/resolveProviders.d.ts.map +1 -1
- package/dist/neutral/config/Actor.d.ts +216 -12
- package/dist/neutral/config/Actor.d.ts.map +1 -1
- package/dist/neutral/config/Actors.d.ts +41 -2
- package/dist/neutral/config/Actors.d.ts.map +1 -1
- package/dist/neutral/config/Base.d.ts +41 -2
- package/dist/neutral/config/Base.d.ts.map +1 -1
- package/dist/neutral/config/Config.d.ts +152 -8
- package/dist/neutral/config/Config.d.ts.map +1 -1
- package/dist/neutral/config/HostActor.d.ts +216 -12
- package/dist/neutral/config/HostActor.d.ts.map +1 -1
- package/dist/neutral/config/ProviderBinding.d.ts +4 -5
- package/dist/neutral/config/ProviderBinding.d.ts.map +1 -1
- package/dist/neutral/config/adaptLegacyConfig.d.ts +2 -3
- package/dist/neutral/config/adaptLegacyConfig.d.ts.map +1 -1
- package/dist/neutral/config/connections/index.d.ts +6 -0
- package/dist/neutral/config/connections/index.d.ts.map +1 -0
- package/dist/neutral/config/index.d.ts +2 -0
- package/dist/neutral/config/index.d.ts.map +1 -1
- package/dist/neutral/config/normalizeConnectionsConfig.d.ts +20 -0
- package/dist/neutral/config/normalizeConnectionsConfig.d.ts.map +1 -0
- package/dist/neutral/config/transports/Transport.d.ts +18 -3
- package/dist/neutral/config/transports/Transport.d.ts.map +1 -1
- package/dist/neutral/context/Actor.d.ts +216 -12
- package/dist/neutral/context/Actor.d.ts.map +1 -1
- package/dist/neutral/context/HostActor.d.ts +216 -12
- package/dist/neutral/context/HostActor.d.ts.map +1 -1
- package/dist/neutral/createDeclarationPayload.d.ts.map +1 -1
- package/dist/neutral/createTransferPayload.d.ts.map +1 -1
- package/dist/neutral/getFileConfig.d.ts +70 -4
- package/dist/neutral/getFileConfig.d.ts.map +1 -1
- package/dist/neutral/getFileConfig.mjs +206 -192
- package/dist/neutral/getFileConfig.mjs.map +4 -4
- package/dist/neutral/index.mjs +953 -656
- package/dist/neutral/index.mjs.map +4 -4
- package/dist/neutral/model/CreatableProviderContext.zod.d.ts +216 -12
- package/dist/neutral/model/CreatableProviderContext.zod.d.ts.map +1 -1
- package/dist/neutral/primitives/chain/step/chainStepRewardAddress.d.ts.map +1 -1
- package/dist/neutral/primitives/chain/step/stepRewardTotal.d.ts.map +1 -1
- package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts → externalBlockNumberFromXl1BlockNumber.d.ts} +1 -1
- package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts.map → externalBlockNumberFromXl1BlockNumber.d.ts.map} +1 -1
- package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts → externalBlockRangeFromXl1BlockRange.d.ts} +1 -1
- package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts.map → externalBlockRangeFromXl1BlockRange.d.ts.map} +1 -1
- package/dist/neutral/primitives/chain/time/index.d.ts +2 -2
- package/dist/neutral/primitives/datalake/PayloadLocator.d.ts.map +1 -1
- package/dist/neutral/primitives/datalake/addDataLakePayloadsToPayloads.d.ts.map +1 -1
- package/dist/neutral/primitives/readPayloadMapFromStore.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/activeStakeAtTimeByAddress.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/activeStakeAtTimeByPosition.d.ts.map +1 -1
- package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts.map +1 -1
- package/dist/neutral/primitives/state/findMostRecentBlock.d.ts.map +1 -1
- package/dist/neutral/primitives/uncle/findUncles.d.ts.map +1 -1
- package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +3 -6
- package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts.map +1 -1
- package/dist/neutral/simple/block/SimpleBlockViewer.d.ts.map +1 -1
- package/dist/neutral/simple/blockInvalidation/SimpleBlockInvalidationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/datalake/AbstractRestDataLake.d.ts.map +1 -1
- package/dist/neutral/simple/datalake/RestDataLakeRunner.d.ts.map +1 -1
- package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts.map +1 -1
- package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts.map +1 -1
- package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/gateway/SimpleXyoGatewayRunner.d.ts.map +1 -1
- package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts +1 -1
- package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts.map +1 -1
- package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts +2 -0
- package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts.map +1 -1
- package/dist/neutral/simple/network/SimpleXyoNetwork.d.ts.map +1 -1
- package/dist/neutral/simple/timeSync2/SimpleTimeSyncViewer.d.ts.map +1 -1
- package/dist/neutral/simple/transactionInvalidation/SimpleTransactionInvalidationViewer.d.ts.map +1 -1
- package/dist/neutral/simple/transactionValidation/SimpleTransactionValidationViewer.d.ts.map +1 -1
- package/dist/neutral/summary/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -1
- package/dist/neutral/test/buildBlock.d.ts.map +1 -1
- package/dist/neutral/test/buildRandomChain.d.ts.map +1 -1
- package/dist/neutral/test/buildRandomGenesisBlock.d.ts.map +1 -1
- package/dist/neutral/test/buildRandomTransaction.d.ts.map +1 -1
- package/dist/neutral/test/createProducerChainStakeIntentTransaction.d.ts.map +1 -1
- package/dist/neutral/test/index.mjs +344 -279
- package/dist/neutral/test/index.mjs.map +4 -4
- package/dist/neutral/transaction/buildTransaction.d.ts.map +1 -1
- package/dist/neutral/transaction/buildUnsignedTransaction.d.ts.map +1 -1
- package/dist/neutral/transaction/confirmSubmittedTransaction.d.ts.map +1 -1
- package/dist/neutral/transaction/hydrateTransaction.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -54,15 +54,18 @@ var hydrateBlock = async (context, hash, maxDepth = 1, minDepth = maxDepth) => {
|
|
|
54
54
|
assertEx(block, () => `block ${hash} not found`)
|
|
55
55
|
), () => `hash ${hash} is not a BlockBoundWitness`);
|
|
56
56
|
if (maxDepth === 0) return [bw, []];
|
|
57
|
-
const
|
|
57
|
+
const blockPayloadResults = await chainMap.get(bw.payload_hashes);
|
|
58
|
+
const blkPayloads = blockPayloadResults.map((p) => asAnyPayload(p, true));
|
|
58
59
|
if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`);
|
|
59
60
|
if (maxDepth === 1) return [bw, blkPayloads];
|
|
60
61
|
const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta);
|
|
61
62
|
const transactionsPayloadHashes = transactions.flatMap((tx) => tx.payload_hashes);
|
|
62
|
-
const
|
|
63
|
+
const transactionPayloadResults = await chainMap.get(transactionsPayloadHashes);
|
|
64
|
+
const transactionsPayloads = transactionPayloadResults.map((p) => asAnyPayload(p, true));
|
|
63
65
|
assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`);
|
|
64
66
|
const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap((p) => p._hash));
|
|
65
|
-
const
|
|
67
|
+
const allPayloadResults = await chainMap.get([...allPayloadsHashes]);
|
|
68
|
+
const allPayloads = allPayloadResults.map((p) => asAnyPayload(p, true));
|
|
66
69
|
const allPayloadsFiltered = allPayloads.filter((p) => allPayloadsHashes.has(p._hash));
|
|
67
70
|
if (maxDepth === 2) assertEx(allHashesPresent(
|
|
68
71
|
[...allPayloadsHashes],
|
|
@@ -120,7 +123,7 @@ async function withContextCacheResponse(context, name, key, func, { max = 1e4 }
|
|
|
120
123
|
// src/block/primitives/blockFromBlockNumber.ts
|
|
121
124
|
async function blockFromBlockNumber(context, blockNumber) {
|
|
122
125
|
return await spanAsync("blockFromBlockNumber", async () => {
|
|
123
|
-
const cacheKey =
|
|
126
|
+
const cacheKey = String(blockNumber);
|
|
124
127
|
const { chainMap, head } = context;
|
|
125
128
|
return await withContextCacheResponse(context, "blockFromBlockNumber", cacheKey, async () => {
|
|
126
129
|
const [result] = await chainMap.get([head._hash]);
|
|
@@ -226,35 +229,41 @@ import {
|
|
|
226
229
|
PayloadBuilder
|
|
227
230
|
} from "@xyo-network/sdk-js";
|
|
228
231
|
import { isExecutable } from "@xyo-network/xl1-protocol-lib";
|
|
232
|
+
async function processElevateOperation(opCode, args, txBw, txPayloads) {
|
|
233
|
+
const [hash, ...rest] = args;
|
|
234
|
+
const txPayloadsWithStorageMeta = await PayloadBuilder.addStorageMeta(txPayloads);
|
|
235
|
+
assertEx2(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Too many Arguments`);
|
|
236
|
+
if (isHash(hash)) {
|
|
237
|
+
assertEx2(
|
|
238
|
+
txBw.payload_hashes.includes(hash),
|
|
239
|
+
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Hash not in payload hashes => ${toSafeJsonString2(txBw, 20)}`
|
|
240
|
+
);
|
|
241
|
+
return assertEx2(
|
|
242
|
+
txPayloadsWithStorageMeta.find((p) => p._hash === hash),
|
|
243
|
+
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Payload not found`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
throw new Error(`Invalid elevate operation ${opCode} ${args.join(", ")} - Invalid hash`);
|
|
247
|
+
}
|
|
248
|
+
async function processOperation(opCode, args, txBw, txPayloads) {
|
|
249
|
+
switch (opCode) {
|
|
250
|
+
case "elevate": {
|
|
251
|
+
return await processElevateOperation(opCode, args, txBw, txPayloads);
|
|
252
|
+
}
|
|
253
|
+
default: {
|
|
254
|
+
throw new Error(`Invalid opCode ${opCode}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
229
258
|
async function validateTransactionsOpcodes(txs) {
|
|
230
259
|
const txElevatedPayloads = [];
|
|
231
260
|
for (const [txBw, txPayloads] of txs) {
|
|
232
261
|
if (isExecutable(txBw)) {
|
|
233
262
|
const operations = txBw.script.map((op) => op.split("|"));
|
|
234
263
|
for (const [opCode, ...args] of operations) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
const txPayloadsWithStorageMeta = await PayloadBuilder.addStorageMeta(txPayloads);
|
|
239
|
-
assertEx2(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Too many Arguments`);
|
|
240
|
-
if (isHash(hash)) {
|
|
241
|
-
assertEx2(
|
|
242
|
-
txBw.payload_hashes.includes(hash),
|
|
243
|
-
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Hash not in payload hashes => ${toSafeJsonString2(txBw, 20)}`
|
|
244
|
-
);
|
|
245
|
-
const txPayload = assertEx2(
|
|
246
|
-
txPayloadsWithStorageMeta.find((p) => p._hash === hash),
|
|
247
|
-
() => `Invalid elevate operation ${opCode} ${args.join(", ")} - Payload not found`
|
|
248
|
-
);
|
|
249
|
-
txElevatedPayloads.push(txPayload);
|
|
250
|
-
} else {
|
|
251
|
-
throw new Error(`Invalid elevate operation ${opCode} ${args.join(", ")} - Invalid hash`);
|
|
252
|
-
}
|
|
253
|
-
break;
|
|
254
|
-
}
|
|
255
|
-
default: {
|
|
256
|
-
throw new Error(`Invalid opCode ${opCode}`);
|
|
257
|
-
}
|
|
264
|
+
const txPayload = await processOperation(opCode, args, txBw, txPayloads);
|
|
265
|
+
if (txPayload !== void 0) {
|
|
266
|
+
txElevatedPayloads.push(txPayload);
|
|
258
267
|
}
|
|
259
268
|
}
|
|
260
269
|
}
|
|
@@ -292,12 +301,14 @@ import { toHex } from "@xylabs/sdk-js";
|
|
|
292
301
|
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk-js";
|
|
293
302
|
import { TransferSchema } from "@xyo-network/xl1-protocol-lib";
|
|
294
303
|
function createTransferPayload(from, transfers, context) {
|
|
295
|
-
|
|
304
|
+
const payloadBuilder = new PayloadBuilder2({ schema: TransferSchema });
|
|
305
|
+
const builder = payloadBuilder.fields({
|
|
296
306
|
epoch: Date.now(),
|
|
297
307
|
from,
|
|
298
308
|
transfers: Object.fromEntries(Object.entries(transfers).map(([k, v]) => [k, toHex(v)])),
|
|
299
309
|
context
|
|
300
|
-
})
|
|
310
|
+
});
|
|
311
|
+
return builder.build();
|
|
301
312
|
}
|
|
302
313
|
|
|
303
314
|
// src/test/BuildBlockOptions.ts
|
|
@@ -352,6 +363,26 @@ var isBuildNextBlockOptions = (value) => {
|
|
|
352
363
|
function calculateCompletedStepReward(step, balance) {
|
|
353
364
|
return AttoXL1(StepRewardFractions[step][0] * balance / StepRewardFractions[step][1]);
|
|
354
365
|
}
|
|
366
|
+
function buildStepHashes(blockNumber, inStepHashes, previousBlockHash, chainStepRewardAddress, stepRewardPoolBalance) {
|
|
367
|
+
const completedStepRewardTransfers = [];
|
|
368
|
+
const step_hashes = [];
|
|
369
|
+
for (const [i, step] of StepSizes3.entries()) {
|
|
370
|
+
if (blockNumber < step) {
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
if (blockNumber % step === 0) {
|
|
374
|
+
if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress !== XYO_ZERO_ADDRESS) {
|
|
375
|
+
const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step });
|
|
376
|
+
const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance);
|
|
377
|
+
completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress, { [completedStepRewardHolderAddress]: completedStepReward }));
|
|
378
|
+
}
|
|
379
|
+
step_hashes.push(assertEx3(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`));
|
|
380
|
+
} else if (isDefined3(inStepHashes.at(i))) {
|
|
381
|
+
step_hashes.push(inStepHashes[i]);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return { completedStepRewardTransfers, step_hashes };
|
|
385
|
+
}
|
|
355
386
|
async function buildBlock(options) {
|
|
356
387
|
const previousBlockNumber = isBuildGenesisBlockOptions(options) ? -1 : options.previousBlockNumber;
|
|
357
388
|
const blockNumber = asXL1BlockNumber2(previousBlockNumber + 1, true);
|
|
@@ -366,7 +397,6 @@ async function buildBlock(options) {
|
|
|
366
397
|
protocol = XL1_PROTOCOL_VERSION,
|
|
367
398
|
signers
|
|
368
399
|
} = options;
|
|
369
|
-
const step_hashes = [];
|
|
370
400
|
for (const [tx] of txs) {
|
|
371
401
|
if (tx.nbf > blockNumber) {
|
|
372
402
|
throw new Error(`Transaction ${await PayloadBuilder3.hash(tx)} not valid for block ${blockNumber} - NBF is ${tx.nbf}`);
|
|
@@ -375,24 +405,13 @@ async function buildBlock(options) {
|
|
|
375
405
|
throw new Error(`Transaction ${await PayloadBuilder3.hash(tx)} not valid for block ${blockNumber} - EXP is ${tx.exp}`);
|
|
376
406
|
}
|
|
377
407
|
}
|
|
378
|
-
const completedStepRewardTransfers =
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step });
|
|
386
|
-
const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance);
|
|
387
|
-
completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress, { [completedStepRewardHolderAddress]: completedStepReward }));
|
|
388
|
-
}
|
|
389
|
-
step_hashes.push(assertEx3(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`));
|
|
390
|
-
} else {
|
|
391
|
-
if (isDefined3(inStepHashes.at(i))) {
|
|
392
|
-
step_hashes.push(inStepHashes[i]);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
408
|
+
const { step_hashes, completedStepRewardTransfers } = buildStepHashes(
|
|
409
|
+
blockNumber,
|
|
410
|
+
inStepHashes,
|
|
411
|
+
previousBlockHash,
|
|
412
|
+
chainStepRewardAddress,
|
|
413
|
+
stepRewardPoolBalance
|
|
414
|
+
);
|
|
396
415
|
const previous = previousBlockHash ?? null;
|
|
397
416
|
const block = blockNumber;
|
|
398
417
|
const txElevatedPayloads = await validateTransactionsOpcodes(txs);
|
|
@@ -402,13 +421,15 @@ async function buildBlock(options) {
|
|
|
402
421
|
...txElevatedPayloads,
|
|
403
422
|
...completedStepRewardTransfers
|
|
404
423
|
];
|
|
405
|
-
const
|
|
424
|
+
const boundWitnessBuilder = new BoundWitnessBuilder();
|
|
425
|
+
const builder = boundWitnessBuilder.fields({
|
|
406
426
|
block,
|
|
407
427
|
chain: chainId,
|
|
408
428
|
previous,
|
|
409
429
|
step_hashes,
|
|
410
430
|
protocol
|
|
411
|
-
}).meta({ $epoch: Date.now(), $signatures: [] }).signers(signers).payloads(await PayloadBuilder3.addStorageMeta(payloads))
|
|
431
|
+
}).meta({ $epoch: Date.now(), $signatures: [] }).signers(signers).payloads(await PayloadBuilder3.addStorageMeta(payloads));
|
|
432
|
+
const [bw, txPayloads] = await builder.build();
|
|
412
433
|
assertEx3(isBlockBoundWitness(bw), () => "Build of BlockBoundWitness failed");
|
|
413
434
|
return [await PayloadBuilder3.addStorageMeta(bw), txPayloads.map((p) => asAnyPayload2(p, true))];
|
|
414
435
|
}
|
|
@@ -484,10 +505,7 @@ async function buildTransaction(chain, onChainPayloads, offChainPayloads, signer
|
|
|
484
505
|
exp
|
|
485
506
|
};
|
|
486
507
|
const elevatedHashes = await PayloadBuilder4.hashes(onChainPayloads);
|
|
487
|
-
const script =
|
|
488
|
-
for (const elevatedHash of elevatedHashes) {
|
|
489
|
-
script.push(`elevate|${elevatedHash}`);
|
|
490
|
-
}
|
|
508
|
+
const script = Array.from(elevatedHashes, (elevatedHash) => `elevate|${elevatedHash}`);
|
|
491
509
|
const fields = {
|
|
492
510
|
...txBoundWitnessFields,
|
|
493
511
|
from: from ?? (Array.isArray(signer) ? assertEx4(signer.at(0)?.address) : signer.address)
|
|
@@ -495,7 +513,9 @@ async function buildTransaction(chain, onChainPayloads, offChainPayloads, signer
|
|
|
495
513
|
if (script.length > 0) {
|
|
496
514
|
fields.script = script;
|
|
497
515
|
}
|
|
498
|
-
const
|
|
516
|
+
const boundWitnessBuilder = new BoundWitnessBuilder2();
|
|
517
|
+
const builder = boundWitnessBuilder.fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]).signers(Array.isArray(signer) ? signer : [signer]);
|
|
518
|
+
const [tx, txPayloads] = await builder.build();
|
|
499
519
|
return [await PayloadBuilder4.addHashMeta(tx), await PayloadBuilder4.addHashMeta(txPayloads.map((p) => asAnyPayload3(p, true)))];
|
|
500
520
|
}
|
|
501
521
|
|
|
@@ -505,7 +525,8 @@ var buildRandomTransaction = async (chain, payloads, account, nbf = asXL1BlockNu
|
|
|
505
525
|
const additionalPayloads = (payloads ?? []).filter((payload) => !isAllowedBlockPayload(payload));
|
|
506
526
|
const sender = account ?? await Account.random();
|
|
507
527
|
if (elevatedPayloads.length === 0) {
|
|
508
|
-
const
|
|
528
|
+
const defaultReceiver = await Account.random();
|
|
529
|
+
const receiver = receiverAddress ?? defaultReceiver.address;
|
|
509
530
|
const transferPayload = createTransferPayload(sender.address, { [receiver]: 1n });
|
|
510
531
|
elevatedPayloads.push(transferPayload);
|
|
511
532
|
}
|
|
@@ -536,12 +557,14 @@ import {
|
|
|
536
557
|
defaultTransactionFees as defaultTransactionFees2
|
|
537
558
|
} from "@xyo-network/xl1-protocol-lib";
|
|
538
559
|
async function createProducerChainStakeIntent(from, exp, nbf = 0) {
|
|
539
|
-
|
|
560
|
+
const payloadBuilder = new PayloadBuilder6({ schema: ChainStakeIntentSchema });
|
|
561
|
+
const builder = payloadBuilder.fields({
|
|
540
562
|
from,
|
|
541
563
|
exp,
|
|
542
564
|
nbf,
|
|
543
565
|
intent: "producer"
|
|
544
|
-
})
|
|
566
|
+
});
|
|
567
|
+
return await PayloadBuilder6.addHashMeta(builder.build());
|
|
545
568
|
}
|
|
546
569
|
|
|
547
570
|
// src/test/createGenesisBlock.ts
|
|
@@ -585,13 +608,20 @@ var buildRandomChain = async (blockProducer, count = 10, previousBlock, chainId,
|
|
|
585
608
|
remaining = remaining - 1;
|
|
586
609
|
lastBlock = block;
|
|
587
610
|
}
|
|
588
|
-
const
|
|
611
|
+
const defaultReceiver = await Account3.random();
|
|
612
|
+
const resolvedReceiverAddresses = receiverAddresses ?? [defaultReceiver.address];
|
|
589
613
|
let saltCounter = 0;
|
|
590
614
|
while (remaining > 0) {
|
|
591
615
|
saltCounter += 1;
|
|
592
|
-
const
|
|
616
|
+
const idPayloadBuilder = new PayloadBuilder8({ schema: IdSchema2 });
|
|
617
|
+
const idBuilder = idPayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` });
|
|
618
|
+
const payloads = [idBuilder.build()];
|
|
593
619
|
saltCounter += 1;
|
|
594
|
-
const additionalPrivatePayloads = remaining % 2 === 0 ?
|
|
620
|
+
const additionalPrivatePayloads = remaining % 2 === 0 ? (() => {
|
|
621
|
+
const privatePayloadBuilder = new PayloadBuilder8({ schema: asSchema2("network.xyo.private", true) });
|
|
622
|
+
const privateBuilder = privatePayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` });
|
|
623
|
+
return [privateBuilder.build()];
|
|
624
|
+
})() : [];
|
|
595
625
|
const txs = [];
|
|
596
626
|
for (const receiverAddress of resolvedReceiverAddresses) {
|
|
597
627
|
txs.push(await buildRandomTransaction(
|
|
@@ -661,7 +691,7 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
661
691
|
get resolvedMoniker() {
|
|
662
692
|
const labels = this.labels ?? {};
|
|
663
693
|
const labelString = Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(",");
|
|
664
|
-
return labelString.length === 0 ?
|
|
694
|
+
return labelString.length === 0 ? this.defaultMoniker : `${this.defaultMoniker}|${labelString}`;
|
|
665
695
|
}
|
|
666
696
|
get uniqueId() {
|
|
667
697
|
return this._uniqueId;
|
|
@@ -676,8 +706,7 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
676
706
|
let scopeObject;
|
|
677
707
|
switch (this.scope) {
|
|
678
708
|
case "global": {
|
|
679
|
-
|
|
680
|
-
scopeObject = globalThis.xyoServiceSingletons;
|
|
709
|
+
scopeObject = getOrCreateGlobalSingletons();
|
|
681
710
|
break;
|
|
682
711
|
}
|
|
683
712
|
case "context": {
|
|
@@ -714,6 +743,15 @@ var ProviderFactory = class _ProviderFactory {
|
|
|
714
743
|
}
|
|
715
744
|
}
|
|
716
745
|
};
|
|
746
|
+
function getOrCreateGlobalSingletons() {
|
|
747
|
+
const existing = globalThis.xyoServiceSingletons;
|
|
748
|
+
if (existing !== void 0) {
|
|
749
|
+
return existing;
|
|
750
|
+
}
|
|
751
|
+
const singletons = {};
|
|
752
|
+
Reflect.set(globalThis, "xyoServiceSingletons", singletons);
|
|
753
|
+
return singletons;
|
|
754
|
+
}
|
|
717
755
|
|
|
718
756
|
// src/CreatableProvider/AbstractCreatableProvider.ts
|
|
719
757
|
var AbstractCreatableProvider = class extends AbstractCreatable {
|
|
@@ -883,7 +921,7 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
883
921
|
);
|
|
884
922
|
}
|
|
885
923
|
has(moniker) {
|
|
886
|
-
return
|
|
924
|
+
return Object.hasOwn(this._registry, moniker);
|
|
887
925
|
}
|
|
888
926
|
/**
|
|
889
927
|
* Locates a provider factory that matches the supplied moniker and labels
|
|
@@ -900,10 +938,11 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
900
938
|
merge(locator) {
|
|
901
939
|
const registry = { ...this.registry };
|
|
902
940
|
for (const moniker in locator.registry) {
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
} else {
|
|
941
|
+
const existing = registry[moniker];
|
|
942
|
+
if (existing === void 0) {
|
|
906
943
|
registry[moniker] = locator.registry[moniker];
|
|
944
|
+
} else {
|
|
945
|
+
existing.push(...locator.registry[moniker] ?? []);
|
|
907
946
|
}
|
|
908
947
|
}
|
|
909
948
|
return new _ProviderFactoryLocator(this.context, registry);
|
|
@@ -933,13 +972,13 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
|
|
|
933
972
|
return this;
|
|
934
973
|
}
|
|
935
974
|
registered(moniker) {
|
|
936
|
-
return
|
|
975
|
+
return Object.hasOwn(this.registry, moniker) || (this._parent?.registered(moniker) ?? false);
|
|
937
976
|
}
|
|
938
977
|
async tryGetInstance(moniker, { start = true, labels } = {}) {
|
|
939
978
|
const resolvedParams = { context: this.context };
|
|
940
979
|
const factory = this.tryLocate(moniker, labels);
|
|
941
|
-
if (factory) {
|
|
942
|
-
if (this.context.singletons
|
|
980
|
+
if (factory !== void 0) {
|
|
981
|
+
if (Object.hasOwn(this.context.singletons, factory.uniqueId)) {
|
|
943
982
|
return this.context.singletons[factory.uniqueId];
|
|
944
983
|
}
|
|
945
984
|
this.logger?.debug(`Creating provider instance for moniker [${moniker}]${labels ? ` with labels [${JSON.stringify(labels)}]` : ""} using factory [${factory.uniqueId.description}]`);
|
|
@@ -1012,16 +1051,167 @@ var ChainConfigZod = z.object({
|
|
|
1012
1051
|
})
|
|
1013
1052
|
});
|
|
1014
1053
|
|
|
1054
|
+
// src/config/transports/Transport.ts
|
|
1055
|
+
import { globalRegistry as globalRegistry4, z as z5 } from "zod";
|
|
1056
|
+
|
|
1057
|
+
// src/config/Remote.ts
|
|
1058
|
+
import { globalRegistry as globalRegistry2, z as z2 } from "zod";
|
|
1059
|
+
var RpcRemoteConfigBaseZod = z2.object({
|
|
1060
|
+
protocol: z2.string("http").register(globalRegistry2, {
|
|
1061
|
+
description: "Protocol for the RPC connection",
|
|
1062
|
+
type: "string"
|
|
1063
|
+
})
|
|
1064
|
+
}).describe("Base configuration for the remote RPC");
|
|
1065
|
+
var HttpRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({
|
|
1066
|
+
protocol: z2.string("http").register(globalRegistry2, {
|
|
1067
|
+
description: "Protocol for the RPC connection",
|
|
1068
|
+
type: "string"
|
|
1069
|
+
}).default("http"),
|
|
1070
|
+
url: z2.string().register(globalRegistry2, {
|
|
1071
|
+
description: "URL for the Chain RPC API",
|
|
1072
|
+
type: "string"
|
|
1073
|
+
})
|
|
1074
|
+
}).describe("Configuration for the remote RPC using Http");
|
|
1075
|
+
var PostMessageRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({
|
|
1076
|
+
protocol: z2.string().register(globalRegistry2, {
|
|
1077
|
+
description: "Protocol for the RPC connection",
|
|
1078
|
+
type: "string"
|
|
1079
|
+
}).default("postMessage"),
|
|
1080
|
+
networkId: z2.string().register(globalRegistry2, {
|
|
1081
|
+
description: "Network ID to use for the postMessage RPC connection",
|
|
1082
|
+
type: "string"
|
|
1083
|
+
}),
|
|
1084
|
+
sessionId: z2.string().register(globalRegistry2, {
|
|
1085
|
+
description: "Session ID to use for the postMessage RPC connection",
|
|
1086
|
+
type: "string"
|
|
1087
|
+
})
|
|
1088
|
+
}).describe("Configuration for the remote RPC using postMessage");
|
|
1089
|
+
var RpcRemoteConfigZod = z2.union([HttpRpcRemoteConfigZod, PostMessageRpcRemoteConfigZod]).describe("Configuration for a remote RPC connection, either Http or postMessage");
|
|
1090
|
+
var RemoteConfigZod = z2.object({ rpc: RpcRemoteConfigZod.optional() }).describe("Configuration for remote connections, including RPC");
|
|
1091
|
+
|
|
1092
|
+
// src/config/storage/driver/Mongo.ts
|
|
1093
|
+
import { isDefined as isDefined4, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
|
|
1094
|
+
import { globalRegistry as globalRegistry3, z as z3 } from "zod";
|
|
1095
|
+
var MongoConfigZod = z3.object({
|
|
1096
|
+
// TODO: Create from other arguments
|
|
1097
|
+
connectionString: z3.string().nonempty().optional().register(globalRegistry3, {
|
|
1098
|
+
description: "MongoDB connection string",
|
|
1099
|
+
title: "storage.mongo.connectionString",
|
|
1100
|
+
type: "string"
|
|
1101
|
+
}),
|
|
1102
|
+
database: z3.string().nonempty().optional().register(globalRegistry3, {
|
|
1103
|
+
description: "MongoDB database name",
|
|
1104
|
+
title: "storage.mongo.database",
|
|
1105
|
+
type: "string"
|
|
1106
|
+
}),
|
|
1107
|
+
domain: z3.string().nonempty().optional().register(globalRegistry3, {
|
|
1108
|
+
description: "MongoDB domain",
|
|
1109
|
+
title: "storage.mongo.domain",
|
|
1110
|
+
type: "string"
|
|
1111
|
+
}),
|
|
1112
|
+
password: z3.string().nonempty().optional().register(globalRegistry3, {
|
|
1113
|
+
description: "MongoDB password",
|
|
1114
|
+
title: "storage.mongo.password",
|
|
1115
|
+
type: "string"
|
|
1116
|
+
}),
|
|
1117
|
+
username: z3.string().nonempty().optional().register(globalRegistry3, {
|
|
1118
|
+
description: "MongoDB username",
|
|
1119
|
+
title: "storage.mongo.username",
|
|
1120
|
+
type: "string"
|
|
1121
|
+
})
|
|
1122
|
+
});
|
|
1123
|
+
|
|
1124
|
+
// src/config/storage/driver/S3.ts
|
|
1125
|
+
import { isDefined as isDefined5 } from "@xylabs/sdk-js";
|
|
1126
|
+
import { z as z4 } from "zod";
|
|
1127
|
+
var S3BucketConfigZod = z4.object({
|
|
1128
|
+
accessKeyId: z4.string().nonempty().optional().describe("S3-compatible access key id for this bucket (overrides the shared default)"),
|
|
1129
|
+
accountId: z4.string().nonempty().optional().describe("Account id for this bucket; on Cloudflare R2 it forms the endpoint (overrides the shared default)"),
|
|
1130
|
+
bucket: z4.string().nonempty().optional().describe("S3-compatible bucket name"),
|
|
1131
|
+
prefix: z4.string().nonempty().optional().describe("Optional key prefix within the bucket"),
|
|
1132
|
+
readUrl: z4.string().nonempty().optional().describe("Public HTTP/CDN base URL for anonymous reads of this bucket"),
|
|
1133
|
+
secretAccessKey: z4.string().nonempty().optional().describe("S3-compatible secret access key for this bucket (overrides the shared default)")
|
|
1134
|
+
});
|
|
1135
|
+
var S3ConfigZod = z4.object({
|
|
1136
|
+
accessKeyId: z4.string().nonempty().optional().describe("Shared S3-compatible access key id (default for all buckets)"),
|
|
1137
|
+
accountId: z4.string().nonempty().optional().describe("Shared account id (default for all buckets; on Cloudflare R2 it forms the endpoint)"),
|
|
1138
|
+
chainState: S3BucketConfigZod.optional().describe("Bucket for the mutable chain state (the head pointer)"),
|
|
1139
|
+
finalized: S3BucketConfigZod.optional().describe("Bucket for the finalized files (blocks, payloads, manifest)"),
|
|
1140
|
+
index: S3BucketConfigZod.optional().describe("Bucket for the chain index (the step-summary families)"),
|
|
1141
|
+
prefix: z4.string().nonempty().optional().describe("Shared key prefix (default for all buckets)"),
|
|
1142
|
+
secretAccessKey: z4.string().nonempty().optional().describe("Shared S3-compatible secret access key (default for all buckets)")
|
|
1143
|
+
});
|
|
1144
|
+
|
|
1145
|
+
// src/config/transports/Transport.ts
|
|
1146
|
+
var LmdbTransportConfigZod = z5.object({
|
|
1147
|
+
access: z5.enum(["read", "write"]).optional().register(globalRegistry4, {
|
|
1148
|
+
description: "Access mode for this LMDB connection (read or write)",
|
|
1149
|
+
title: "transports.lmdb.access",
|
|
1150
|
+
type: "string"
|
|
1151
|
+
}),
|
|
1152
|
+
root: z5.string().register(globalRegistry4, {
|
|
1153
|
+
description: "Root directory for local LMDB storage",
|
|
1154
|
+
title: "transports.lmdb.root",
|
|
1155
|
+
type: "string"
|
|
1156
|
+
}),
|
|
1157
|
+
store: z5.string().optional().register(globalRegistry4, {
|
|
1158
|
+
description: "Logical store name within the LMDB root (e.g. finalized-chain, mempool)",
|
|
1159
|
+
title: "transports.lmdb.store",
|
|
1160
|
+
type: "string"
|
|
1161
|
+
}),
|
|
1162
|
+
type: z5.literal("lmdb")
|
|
1163
|
+
}).describe("LMDB local storage transport");
|
|
1164
|
+
var MongoTransportConfigZod = z5.object({
|
|
1165
|
+
type: z5.literal("mongo"),
|
|
1166
|
+
connectionString: MongoConfigZod.shape.connectionString,
|
|
1167
|
+
database: MongoConfigZod.shape.database,
|
|
1168
|
+
domain: MongoConfigZod.shape.domain,
|
|
1169
|
+
password: MongoConfigZod.shape.password,
|
|
1170
|
+
username: MongoConfigZod.shape.username
|
|
1171
|
+
}).describe("MongoDB storage transport");
|
|
1172
|
+
var RpcTransportConfigZod = HttpRpcRemoteConfigZod.extend({ type: z5.literal("rpc") }).describe("XL1 JSON-RPC transport");
|
|
1173
|
+
var RestTransportConfigZod = z5.object({
|
|
1174
|
+
type: z5.literal("rest"),
|
|
1175
|
+
baseUrl: z5.string().register(globalRegistry4, {
|
|
1176
|
+
description: "HTTP base URL for REST reads",
|
|
1177
|
+
title: "transports.rest.baseUrl",
|
|
1178
|
+
type: "string"
|
|
1179
|
+
})
|
|
1180
|
+
}).describe("HTTP REST read transport");
|
|
1181
|
+
var S3TransportConfigZod = S3BucketConfigZod.extend({
|
|
1182
|
+
type: z5.literal("s3"),
|
|
1183
|
+
accessKeyId: z5.string().optional(),
|
|
1184
|
+
accountId: z5.string().optional(),
|
|
1185
|
+
secretAccessKey: z5.string().optional()
|
|
1186
|
+
}).describe("S3-compatible object storage transport");
|
|
1187
|
+
var EvmRpcTransportConfigZod = z5.object({
|
|
1188
|
+
type: z5.literal("evm-rpc"),
|
|
1189
|
+
url: z5.string().register(globalRegistry4, {
|
|
1190
|
+
description: "EVM JSON-RPC URL",
|
|
1191
|
+
title: "transports.evm-rpc.url",
|
|
1192
|
+
type: "string"
|
|
1193
|
+
})
|
|
1194
|
+
}).describe("EVM JSON-RPC transport");
|
|
1195
|
+
var TransportConfigZod = z5.discriminatedUnion("type", [
|
|
1196
|
+
LmdbTransportConfigZod,
|
|
1197
|
+
MongoTransportConfigZod,
|
|
1198
|
+
RpcTransportConfigZod,
|
|
1199
|
+
RestTransportConfigZod,
|
|
1200
|
+
S3TransportConfigZod,
|
|
1201
|
+
EvmRpcTransportConfigZod
|
|
1202
|
+
]);
|
|
1203
|
+
var TransportsConfigZod = z5.record(z5.string(), TransportConfigZod).default({});
|
|
1204
|
+
|
|
1015
1205
|
// src/config/DataLake/DataLake.ts
|
|
1016
|
-
import { z as
|
|
1206
|
+
import { z as z9 } from "zod";
|
|
1017
1207
|
|
|
1018
1208
|
// src/config/DataLake/RestDataLakeConfig.ts
|
|
1019
|
-
import { globalRegistry as
|
|
1209
|
+
import { globalRegistry as globalRegistry6, z as z7 } from "zod";
|
|
1020
1210
|
|
|
1021
1211
|
// src/config/DataLake/DataLakeRemoteConfig.ts
|
|
1022
|
-
import { globalRegistry as
|
|
1023
|
-
var DataLakeDriverConfigBaseZod =
|
|
1024
|
-
driver:
|
|
1212
|
+
import { globalRegistry as globalRegistry5, z as z6 } from "zod";
|
|
1213
|
+
var DataLakeDriverConfigBaseZod = z6.object({
|
|
1214
|
+
driver: z6.string().register(globalRegistry5, {
|
|
1025
1215
|
description: "Driver for the data lake",
|
|
1026
1216
|
type: "string"
|
|
1027
1217
|
})
|
|
@@ -1029,55 +1219,55 @@ var DataLakeDriverConfigBaseZod = z2.object({
|
|
|
1029
1219
|
|
|
1030
1220
|
// src/config/DataLake/RestDataLakeConfig.ts
|
|
1031
1221
|
var RestDataLakeConfigZod = DataLakeDriverConfigBaseZod.extend({
|
|
1032
|
-
driver:
|
|
1222
|
+
driver: z7.literal("rest").register(globalRegistry6, {
|
|
1033
1223
|
description: "Driver for the REST data lake",
|
|
1034
1224
|
type: "string"
|
|
1035
1225
|
}),
|
|
1036
|
-
url:
|
|
1226
|
+
url: z7.string().register(globalRegistry6, {
|
|
1037
1227
|
description: "URL for the REST data lake",
|
|
1038
1228
|
type: "string"
|
|
1039
1229
|
})
|
|
1040
1230
|
}).describe("Configuration for the REST data lake driver");
|
|
1041
1231
|
|
|
1042
1232
|
// src/config/DataLake/RouterDataLakeConfig.ts
|
|
1043
|
-
import { globalRegistry as
|
|
1044
|
-
var RouterDataLakeConfigZod =
|
|
1045
|
-
driver:
|
|
1233
|
+
import { globalRegistry as globalRegistry7, z as z8 } from "zod";
|
|
1234
|
+
var RouterDataLakeConfigZod = z8.object({
|
|
1235
|
+
driver: z8.literal("router").register(globalRegistry7, {
|
|
1046
1236
|
description: "Driver for the router data lake",
|
|
1047
1237
|
type: "string"
|
|
1048
1238
|
}),
|
|
1049
|
-
children:
|
|
1239
|
+
children: z8.array(z8.lazy(() => DataLakeConfigZod)).register(globalRegistry7, {
|
|
1050
1240
|
description: "Child data lake drivers",
|
|
1051
1241
|
type: "array"
|
|
1052
1242
|
})
|
|
1053
1243
|
}).describe("Configuration for the router data lake driver");
|
|
1054
1244
|
|
|
1055
1245
|
// src/config/DataLake/DataLake.ts
|
|
1056
|
-
var DataLakeConfigZod =
|
|
1246
|
+
var DataLakeConfigZod = z9.lazy(() => z9.union([RestDataLakeConfigZod, RouterDataLakeConfigZod])).describe("Configuration for a data lake");
|
|
1057
1247
|
|
|
1058
1248
|
// src/config/Evm.ts
|
|
1059
|
-
import { globalRegistry as
|
|
1060
|
-
var EvmInfuraConfigZod =
|
|
1061
|
-
projectId:
|
|
1249
|
+
import { globalRegistry as globalRegistry8, z as z10 } from "zod";
|
|
1250
|
+
var EvmInfuraConfigZod = z10.object({
|
|
1251
|
+
projectId: z10.string().optional().register(globalRegistry8, {
|
|
1062
1252
|
description: "Infura project ID",
|
|
1063
1253
|
title: "evm.infura.projectId",
|
|
1064
1254
|
type: "string"
|
|
1065
1255
|
}),
|
|
1066
|
-
projectSecret:
|
|
1256
|
+
projectSecret: z10.string().optional().register(globalRegistry8, {
|
|
1067
1257
|
description: "Infura project secret",
|
|
1068
1258
|
title: "evm.infura.projectSecret",
|
|
1069
1259
|
type: "string"
|
|
1070
1260
|
})
|
|
1071
1261
|
});
|
|
1072
|
-
var EvmJsonRpcConfigZod =
|
|
1073
|
-
url:
|
|
1262
|
+
var EvmJsonRpcConfigZod = z10.object({
|
|
1263
|
+
url: z10.url().optional().register(globalRegistry8, {
|
|
1074
1264
|
description: "JSON-RPC URL",
|
|
1075
1265
|
title: "evm.jsonRpc.url",
|
|
1076
1266
|
type: "string"
|
|
1077
1267
|
})
|
|
1078
1268
|
});
|
|
1079
|
-
var EvmConfigZod =
|
|
1080
|
-
chainId:
|
|
1269
|
+
var EvmConfigZod = z10.object({
|
|
1270
|
+
chainId: z10.string().optional().register(globalRegistry8, {
|
|
1081
1271
|
description: "EVM chain ID",
|
|
1082
1272
|
title: "evm.chainId",
|
|
1083
1273
|
type: "string"
|
|
@@ -1088,17 +1278,17 @@ var EvmConfigZod = z6.object({
|
|
|
1088
1278
|
|
|
1089
1279
|
// src/config/Log.ts
|
|
1090
1280
|
import { LogLevel } from "@xylabs/sdk-js";
|
|
1091
|
-
import { globalRegistry as
|
|
1281
|
+
import { globalRegistry as globalRegistry9, z as z11 } from "zod";
|
|
1092
1282
|
var LogLevelNames = Object.keys(LogLevel);
|
|
1093
|
-
var LogConfigZod =
|
|
1094
|
-
logLevel:
|
|
1283
|
+
var LogConfigZod = z11.object({
|
|
1284
|
+
logLevel: z11.enum(LogLevelNames).default("info").register(globalRegistry9, {
|
|
1095
1285
|
choices: LogLevelNames,
|
|
1096
1286
|
default: "info",
|
|
1097
1287
|
description: "Desired process verbosity",
|
|
1098
1288
|
title: "logLevel",
|
|
1099
1289
|
type: "string"
|
|
1100
1290
|
}),
|
|
1101
|
-
silent:
|
|
1291
|
+
silent: z11.boolean().default(false).register(globalRegistry9, {
|
|
1102
1292
|
default: false,
|
|
1103
1293
|
description: "Whether to run in silent mode",
|
|
1104
1294
|
title: "silent",
|
|
@@ -1107,23 +1297,23 @@ var LogConfigZod = z7.object({
|
|
|
1107
1297
|
});
|
|
1108
1298
|
|
|
1109
1299
|
// src/config/ProviderBinding.ts
|
|
1110
|
-
import { globalRegistry as
|
|
1111
|
-
var ProviderBindingConfigZod =
|
|
1112
|
-
|
|
1113
|
-
description: "
|
|
1114
|
-
title: "providerBindings.
|
|
1300
|
+
import { globalRegistry as globalRegistry10, z as z12 } from "zod";
|
|
1301
|
+
var ProviderBindingConfigZod = z12.object({
|
|
1302
|
+
connection: z12.string().optional().register(globalRegistry10, {
|
|
1303
|
+
description: "Named connection from the top-level connections map",
|
|
1304
|
+
title: "providerBindings.connection",
|
|
1115
1305
|
type: "string"
|
|
1116
1306
|
}),
|
|
1117
|
-
transport:
|
|
1118
|
-
description: "
|
|
1307
|
+
transport: z12.string().optional().register(globalRegistry10, {
|
|
1308
|
+
description: "Deprecated alias for connection (kept in sync during migration)",
|
|
1119
1309
|
title: "providerBindings.transport",
|
|
1120
1310
|
type: "string"
|
|
1121
1311
|
})
|
|
1122
|
-
}).describe("Provider
|
|
1123
|
-
var ProviderBindingsConfigZod =
|
|
1312
|
+
}).describe("Provider connection binding");
|
|
1313
|
+
var ProviderBindingsConfigZod = z12.record(z12.string(), ProviderBindingConfigZod).default({});
|
|
1124
1314
|
|
|
1125
1315
|
// src/config/Providers.ts
|
|
1126
|
-
import
|
|
1316
|
+
import z14 from "zod";
|
|
1127
1317
|
|
|
1128
1318
|
// src/config/Provider.ts
|
|
1129
1319
|
import {
|
|
@@ -1131,111 +1321,23 @@ import {
|
|
|
1131
1321
|
zodIsFactory,
|
|
1132
1322
|
zodToFactory
|
|
1133
1323
|
} from "@xylabs/sdk-js";
|
|
1134
|
-
import { z as
|
|
1135
|
-
var ProviderConfigZod =
|
|
1136
|
-
moniker:
|
|
1137
|
-
labels:
|
|
1324
|
+
import { z as z13 } from "zod";
|
|
1325
|
+
var ProviderConfigZod = z13.object({
|
|
1326
|
+
moniker: z13.string(),
|
|
1327
|
+
labels: z13.array(z13.string()).optional()
|
|
1138
1328
|
}).describe("Configuration for a Provider");
|
|
1139
1329
|
var isProviderConfig = zodIsFactory(ProviderConfigZod);
|
|
1140
1330
|
var asProviderConfig = zodAsFactory(ProviderConfigZod, "asProviderConfig");
|
|
1141
1331
|
var toProviderConfig = zodToFactory(ProviderConfigZod, "toProviderConfig");
|
|
1142
1332
|
|
|
1143
1333
|
// src/config/Providers.ts
|
|
1144
|
-
var ProvidersConfigZod =
|
|
1145
|
-
|
|
1146
|
-
// src/config/Remote.ts
|
|
1147
|
-
import { globalRegistry as globalRegistry8, z as z11 } from "zod";
|
|
1148
|
-
var RpcRemoteConfigBaseZod = z11.object({
|
|
1149
|
-
protocol: z11.string("http").register(globalRegistry8, {
|
|
1150
|
-
description: "Protocol for the RPC connection",
|
|
1151
|
-
type: "string"
|
|
1152
|
-
})
|
|
1153
|
-
}).describe("Base configuration for the remote RPC");
|
|
1154
|
-
var HttpRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({
|
|
1155
|
-
protocol: z11.string("http").register(globalRegistry8, {
|
|
1156
|
-
description: "Protocol for the RPC connection",
|
|
1157
|
-
type: "string"
|
|
1158
|
-
}).default("http"),
|
|
1159
|
-
url: z11.string().register(globalRegistry8, {
|
|
1160
|
-
description: "URL for the Chain RPC API",
|
|
1161
|
-
type: "string"
|
|
1162
|
-
})
|
|
1163
|
-
}).describe("Configuration for the remote RPC using Http");
|
|
1164
|
-
var PostMessageRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({
|
|
1165
|
-
protocol: z11.string().register(globalRegistry8, {
|
|
1166
|
-
description: "Protocol for the RPC connection",
|
|
1167
|
-
type: "string"
|
|
1168
|
-
}).default("postMessage"),
|
|
1169
|
-
networkId: z11.string().register(globalRegistry8, {
|
|
1170
|
-
description: "Network ID to use for the postMessage RPC connection",
|
|
1171
|
-
type: "string"
|
|
1172
|
-
}),
|
|
1173
|
-
sessionId: z11.string().register(globalRegistry8, {
|
|
1174
|
-
description: "Session ID to use for the postMessage RPC connection",
|
|
1175
|
-
type: "string"
|
|
1176
|
-
})
|
|
1177
|
-
}).describe("Configuration for the remote RPC using postMessage");
|
|
1178
|
-
var RpcRemoteConfigZod = z11.union([HttpRpcRemoteConfigZod, PostMessageRpcRemoteConfigZod]).describe("Configuration for a remote RPC connection, either Http or postMessage");
|
|
1179
|
-
var RemoteConfigZod = z11.object({ rpc: RpcRemoteConfigZod.optional() }).describe("Configuration for remote connections, including RPC");
|
|
1180
|
-
|
|
1181
|
-
// src/config/storage/driver/Mongo.ts
|
|
1182
|
-
import { isDefined as isDefined4, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
|
|
1183
|
-
import { globalRegistry as globalRegistry9, z as z12 } from "zod";
|
|
1184
|
-
var MongoConfigZod = z12.object({
|
|
1185
|
-
// TODO: Create from other arguments
|
|
1186
|
-
connectionString: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1187
|
-
description: "MongoDB connection string",
|
|
1188
|
-
title: "storage.mongo.connectionString",
|
|
1189
|
-
type: "string"
|
|
1190
|
-
}),
|
|
1191
|
-
database: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1192
|
-
description: "MongoDB database name",
|
|
1193
|
-
title: "storage.mongo.database",
|
|
1194
|
-
type: "string"
|
|
1195
|
-
}),
|
|
1196
|
-
domain: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1197
|
-
description: "MongoDB domain",
|
|
1198
|
-
title: "storage.mongo.domain",
|
|
1199
|
-
type: "string"
|
|
1200
|
-
}),
|
|
1201
|
-
password: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1202
|
-
description: "MongoDB password",
|
|
1203
|
-
title: "storage.mongo.password",
|
|
1204
|
-
type: "string"
|
|
1205
|
-
}),
|
|
1206
|
-
username: z12.string().nonempty().optional().register(globalRegistry9, {
|
|
1207
|
-
description: "MongoDB username",
|
|
1208
|
-
title: "storage.mongo.username",
|
|
1209
|
-
type: "string"
|
|
1210
|
-
})
|
|
1211
|
-
});
|
|
1212
|
-
|
|
1213
|
-
// src/config/storage/driver/S3.ts
|
|
1214
|
-
import { isDefined as isDefined5 } from "@xylabs/sdk-js";
|
|
1215
|
-
import { z as z13 } from "zod";
|
|
1216
|
-
var S3BucketConfigZod = z13.object({
|
|
1217
|
-
accessKeyId: z13.string().nonempty().optional().describe("S3-compatible access key id for this bucket (overrides the shared default)"),
|
|
1218
|
-
accountId: z13.string().nonempty().optional().describe("Account id for this bucket; on Cloudflare R2 it forms the endpoint (overrides the shared default)"),
|
|
1219
|
-
bucket: z13.string().nonempty().optional().describe("S3-compatible bucket name"),
|
|
1220
|
-
prefix: z13.string().nonempty().optional().describe("Optional key prefix within the bucket"),
|
|
1221
|
-
readUrl: z13.string().nonempty().optional().describe("Public HTTP/CDN base URL for anonymous reads of this bucket"),
|
|
1222
|
-
secretAccessKey: z13.string().nonempty().optional().describe("S3-compatible secret access key for this bucket (overrides the shared default)")
|
|
1223
|
-
});
|
|
1224
|
-
var S3ConfigZod = z13.object({
|
|
1225
|
-
accessKeyId: z13.string().nonempty().optional().describe("Shared S3-compatible access key id (default for all buckets)"),
|
|
1226
|
-
accountId: z13.string().nonempty().optional().describe("Shared account id (default for all buckets; on Cloudflare R2 it forms the endpoint)"),
|
|
1227
|
-
chainState: S3BucketConfigZod.optional().describe("Bucket for the mutable chain state (the head pointer)"),
|
|
1228
|
-
finalized: S3BucketConfigZod.optional().describe("Bucket for the finalized files (blocks, payloads, manifest)"),
|
|
1229
|
-
index: S3BucketConfigZod.optional().describe("Bucket for the chain index (the step-summary families)"),
|
|
1230
|
-
prefix: z13.string().nonempty().optional().describe("Shared key prefix (default for all buckets)"),
|
|
1231
|
-
secretAccessKey: z13.string().nonempty().optional().describe("Shared S3-compatible secret access key (default for all buckets)")
|
|
1232
|
-
});
|
|
1334
|
+
var ProvidersConfigZod = z14.array(ProviderConfigZod.loose()).describe("Configuration for providers").default([]);
|
|
1233
1335
|
|
|
1234
1336
|
// src/config/storage/Storage.ts
|
|
1235
|
-
import { globalRegistry as
|
|
1236
|
-
var StorageConfigZod =
|
|
1337
|
+
import { globalRegistry as globalRegistry11, z as z15 } from "zod";
|
|
1338
|
+
var StorageConfigZod = z15.object({
|
|
1237
1339
|
mongo: MongoConfigZod.optional().describe("Configuration for the MongoD storage driver"),
|
|
1238
|
-
root:
|
|
1340
|
+
root: z15.string().optional().register(globalRegistry11, {
|
|
1239
1341
|
description: "Root directory for local storage",
|
|
1240
1342
|
title: "storage.root",
|
|
1241
1343
|
type: "string"
|
|
@@ -1244,87 +1346,36 @@ var StorageConfigZod = z14.object({
|
|
|
1244
1346
|
}).describe("Storage configuration options");
|
|
1245
1347
|
|
|
1246
1348
|
// src/config/Telemetry.ts
|
|
1247
|
-
import { globalRegistry as
|
|
1248
|
-
var MetricsScrapeConfigZod =
|
|
1249
|
-
path:
|
|
1349
|
+
import { globalRegistry as globalRegistry12, z as z16 } from "zod";
|
|
1350
|
+
var MetricsScrapeConfigZod = z16.object({
|
|
1351
|
+
path: z16.string().default("/metrics").register(globalRegistry12, {
|
|
1250
1352
|
default: "/metrics",
|
|
1251
1353
|
description: "Path for the metrics scrape endpoint",
|
|
1252
1354
|
title: "telemetry.metrics.scrape.path",
|
|
1253
1355
|
type: "string"
|
|
1254
1356
|
}),
|
|
1255
|
-
port:
|
|
1357
|
+
port: z16.coerce.number().int().positive().optional().register(globalRegistry12, {
|
|
1256
1358
|
description: "Port for the metrics scrape endpoint",
|
|
1257
1359
|
title: "telemetry.metrics.scrape.port",
|
|
1258
1360
|
type: "number"
|
|
1259
1361
|
})
|
|
1260
1362
|
}).describe("Metrics scrape configuration");
|
|
1261
|
-
var MetricsConfigZod =
|
|
1262
|
-
var OpenTelemetryConfigZod =
|
|
1363
|
+
var MetricsConfigZod = z16.object({ scrape: MetricsScrapeConfigZod }).describe("Metrics configuration options");
|
|
1364
|
+
var OpenTelemetryConfigZod = z16.object({
|
|
1263
1365
|
// OpenTelemetry options
|
|
1264
|
-
otlpEndpoint:
|
|
1366
|
+
otlpEndpoint: z16.url().optional().register(globalRegistry12, {
|
|
1265
1367
|
description: "OTLP endpoint for exporting telemetry data",
|
|
1266
1368
|
title: "telemetry.otel.otlpEndpoint",
|
|
1267
1369
|
type: "string"
|
|
1268
1370
|
})
|
|
1269
1371
|
});
|
|
1270
|
-
var TelemetryConfigZod =
|
|
1372
|
+
var TelemetryConfigZod = z16.object({
|
|
1271
1373
|
// Metrics configuration
|
|
1272
1374
|
metrics: MetricsConfigZod.optional().describe("Metrics configuration"),
|
|
1273
1375
|
// OpenTelemetry configuration
|
|
1274
1376
|
otel: OpenTelemetryConfigZod.optional().describe("OpenTelemetry configuration")
|
|
1275
1377
|
}).describe("Telemetry configuration options");
|
|
1276
1378
|
|
|
1277
|
-
// src/config/transports/Transport.ts
|
|
1278
|
-
import { globalRegistry as globalRegistry12, z as z16 } from "zod";
|
|
1279
|
-
var LmdbTransportConfigZod = z16.object({
|
|
1280
|
-
type: z16.literal("lmdb"),
|
|
1281
|
-
root: z16.string().register(globalRegistry12, {
|
|
1282
|
-
description: "Root directory for local LMDB storage",
|
|
1283
|
-
title: "transports.lmdb.root",
|
|
1284
|
-
type: "string"
|
|
1285
|
-
})
|
|
1286
|
-
}).describe("LMDB local storage transport");
|
|
1287
|
-
var MongoTransportConfigZod = z16.object({
|
|
1288
|
-
type: z16.literal("mongo"),
|
|
1289
|
-
connectionString: MongoConfigZod.shape.connectionString,
|
|
1290
|
-
database: MongoConfigZod.shape.database,
|
|
1291
|
-
domain: MongoConfigZod.shape.domain,
|
|
1292
|
-
password: MongoConfigZod.shape.password,
|
|
1293
|
-
username: MongoConfigZod.shape.username
|
|
1294
|
-
}).describe("MongoDB storage transport");
|
|
1295
|
-
var RpcTransportConfigZod = HttpRpcRemoteConfigZod.extend({ type: z16.literal("rpc") }).describe("XL1 JSON-RPC transport");
|
|
1296
|
-
var RestTransportConfigZod = z16.object({
|
|
1297
|
-
type: z16.literal("rest"),
|
|
1298
|
-
baseUrl: z16.string().register(globalRegistry12, {
|
|
1299
|
-
description: "HTTP base URL for REST reads",
|
|
1300
|
-
title: "transports.rest.baseUrl",
|
|
1301
|
-
type: "string"
|
|
1302
|
-
})
|
|
1303
|
-
}).describe("HTTP REST read transport");
|
|
1304
|
-
var S3TransportConfigZod = S3BucketConfigZod.extend({
|
|
1305
|
-
type: z16.literal("s3"),
|
|
1306
|
-
accessKeyId: z16.string().optional(),
|
|
1307
|
-
accountId: z16.string().optional(),
|
|
1308
|
-
secretAccessKey: z16.string().optional()
|
|
1309
|
-
}).describe("S3-compatible object storage transport");
|
|
1310
|
-
var EvmRpcTransportConfigZod = z16.object({
|
|
1311
|
-
type: z16.literal("evm-rpc"),
|
|
1312
|
-
url: z16.string().register(globalRegistry12, {
|
|
1313
|
-
description: "EVM JSON-RPC URL",
|
|
1314
|
-
title: "transports.evm-rpc.url",
|
|
1315
|
-
type: "string"
|
|
1316
|
-
})
|
|
1317
|
-
}).describe("EVM JSON-RPC transport");
|
|
1318
|
-
var TransportConfigZod = z16.discriminatedUnion("type", [
|
|
1319
|
-
LmdbTransportConfigZod,
|
|
1320
|
-
MongoTransportConfigZod,
|
|
1321
|
-
RpcTransportConfigZod,
|
|
1322
|
-
RestTransportConfigZod,
|
|
1323
|
-
S3TransportConfigZod,
|
|
1324
|
-
EvmRpcTransportConfigZod
|
|
1325
|
-
]);
|
|
1326
|
-
var TransportsConfigZod = z16.record(z16.string(), TransportConfigZod).default({});
|
|
1327
|
-
|
|
1328
1379
|
// src/config/Validation.ts
|
|
1329
1380
|
import { XyoAddressZod as XyoAddressZod2 } from "@xyo-network/sdk-js";
|
|
1330
1381
|
import { globalRegistry as globalRegistry13, z as z17 } from "zod";
|
|
@@ -1454,7 +1505,9 @@ var DEFAULT_MAX_ATTEMPTS = 10;
|
|
|
1454
1505
|
var calculateTimeRate = async (viewer, timeConfig, startBlockNumber, timeUnit, toleranceMs = DEFAULT_TOLERANCE_MS, maxAttempts = DEFAULT_MAX_ATTEMPTS) => {
|
|
1455
1506
|
assertEx12(Object.keys(timeConfig ?? {}).length === 1, () => "Only one time unit should be specified in timeConfig");
|
|
1456
1507
|
const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null;
|
|
1457
|
-
const
|
|
1508
|
+
const currentBlockResult = await viewer.currentBlock();
|
|
1509
|
+
const blockResult = isDefinedNotNull(startBlock) ? startBlock : currentBlockResult;
|
|
1510
|
+
const resolvedStartBlock = blockResult[0];
|
|
1458
1511
|
const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig);
|
|
1459
1512
|
assertEx12(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
|
|
1460
1513
|
const blocksPerMillisecondRate = 1 / (12 * 1e3);
|
|
@@ -1519,7 +1572,7 @@ var findEndBlockRecursive = async (viewer, startBlock, targetTimeMs, estimatedBl
|
|
|
1519
1572
|
// src/primitives/state/findMostRecentBlock.ts
|
|
1520
1573
|
import { isSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol-lib";
|
|
1521
1574
|
var DEFAULT_NEXT_OPTIONS = { limit: 50 };
|
|
1522
|
-
var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations =
|
|
1575
|
+
var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations = Infinity) => {
|
|
1523
1576
|
let mostRecentBlock;
|
|
1524
1577
|
let cursor;
|
|
1525
1578
|
let batch;
|
|
@@ -1535,9 +1588,8 @@ var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTI
|
|
|
1535
1588
|
if (last) {
|
|
1536
1589
|
mostRecentBlock = last;
|
|
1537
1590
|
break;
|
|
1538
|
-
} else {
|
|
1539
|
-
cursor = batch.at(-1)?._sequence;
|
|
1540
1591
|
}
|
|
1592
|
+
cursor = batch.at(-1)?._sequence;
|
|
1541
1593
|
iterations = iterations + 1;
|
|
1542
1594
|
} while (batch.length > 0 && iterations < maxIterations);
|
|
1543
1595
|
return mostRecentBlock;
|
|
@@ -1550,7 +1602,7 @@ async function hydratedBlockByNumber(context, blockNumber) {
|
|
|
1550
1602
|
if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`);
|
|
1551
1603
|
if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`);
|
|
1552
1604
|
if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`);
|
|
1553
|
-
const cacheKey =
|
|
1605
|
+
const cacheKey = String(blockNumber);
|
|
1554
1606
|
return await withContextCacheResponse(context, "hydratedBlockByNumber", cacheKey, async () => {
|
|
1555
1607
|
const block = assertEx13(
|
|
1556
1608
|
await blockFromBlockNumber(context, blockNumber),
|
|
@@ -1597,10 +1649,11 @@ var BaseConfigZod = z18.object({
|
|
|
1597
1649
|
dataLake: z18.optional(DataLakeConfigZod).check(z18.describe("Configuration for data lakes")),
|
|
1598
1650
|
evm: z18._default(EvmConfigZod, EvmConfigZod.parse({})).check(z18.describe("Configuration for EVM-backed services")),
|
|
1599
1651
|
log: z18._default(LogConfigZod, LogConfigZod.parse({})).check(z18.describe("Configuration for logging")),
|
|
1600
|
-
|
|
1652
|
+
connections: z18._default(TransportsConfigZod, TransportsConfigZod.parse({})).check(z18.describe("Named connection profiles (rpc, rest, s3, lmdb, mongo, evm-rpc)")),
|
|
1653
|
+
providerBindings: z18._default(ProviderBindingsConfigZod, ProviderBindingsConfigZod.parse({})).check(z18.describe("Per-moniker provider connection bindings")),
|
|
1601
1654
|
providers: z18._default(ProvidersConfigZod, ProvidersConfigZod.parse([])).check(z18.describe("Configuration for providers")),
|
|
1602
1655
|
remote: z18._default(RemoteConfigZod, RemoteConfigZod.parse({})).check(z18.describe("Configuration for remote services")),
|
|
1603
|
-
transports: z18._default(TransportsConfigZod, TransportsConfigZod.parse({})).check(z18.describe("
|
|
1656
|
+
transports: z18._default(TransportsConfigZod, TransportsConfigZod.parse({})).check(z18.describe("Deprecated alias for connections (kept in sync during migration)")),
|
|
1604
1657
|
storage: z18._default(StorageConfigZod, StorageConfigZod.parse({})).check(z18.describe("Configuration for the storage")),
|
|
1605
1658
|
telemetry: z18._default(TelemetryConfigZod, TelemetryConfigZod.parse({})).check(z18.describe("Configuration for telemetry")),
|
|
1606
1659
|
validation: z18._default(ValidationConfigZod, ValidationConfigZod.parse({})).check(z18.describe("Configuration for validation"))
|
|
@@ -1859,7 +1912,7 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
1859
1912
|
}
|
|
1860
1913
|
async blocksByStep(stepLevel, stepIndex) {
|
|
1861
1914
|
return await this.spanAsync("blocksByStep", async () => {
|
|
1862
|
-
assertEx15(Number.
|
|
1915
|
+
assertEx15(Number.isSafeInteger(stepIndex) && stepIndex >= 0, () => "stepIndex must be a non-negative integer");
|
|
1863
1916
|
const size = stepSize2(stepLevel);
|
|
1864
1917
|
assertEx15(
|
|
1865
1918
|
stepLevel <= blocksMaxStep,
|
|
@@ -1883,7 +1936,12 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
1883
1936
|
}
|
|
1884
1937
|
async chainId(blockNumber = "latest") {
|
|
1885
1938
|
return await this.spanAsync("chainId", async () => {
|
|
1886
|
-
|
|
1939
|
+
if (blockNumber === "latest") {
|
|
1940
|
+
const headBlock = await this.finalizationViewer.headBlock();
|
|
1941
|
+
return headBlock.chain;
|
|
1942
|
+
}
|
|
1943
|
+
const block = assertEx15(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`);
|
|
1944
|
+
return block[0].chain;
|
|
1887
1945
|
}, this.context);
|
|
1888
1946
|
}
|
|
1889
1947
|
async createHandler() {
|
|
@@ -1932,9 +1990,10 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
1932
1990
|
};
|
|
1933
1991
|
}
|
|
1934
1992
|
async getChainContextRead() {
|
|
1993
|
+
const headBlock = await this.finalizationViewer.head();
|
|
1935
1994
|
return {
|
|
1936
1995
|
...this.getBlockContextRead(),
|
|
1937
|
-
head:
|
|
1996
|
+
head: headBlock[0]
|
|
1938
1997
|
};
|
|
1939
1998
|
}
|
|
1940
1999
|
async startHandler() {
|
|
@@ -1981,10 +2040,11 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
|
|
|
1981
2040
|
}, this.headPollIntervalMs);
|
|
1982
2041
|
}
|
|
1983
2042
|
stopHeadPolling() {
|
|
1984
|
-
if (this._headPollTimer) {
|
|
1985
|
-
|
|
1986
|
-
this._headPollTimer = null;
|
|
2043
|
+
if (!this._headPollTimer) {
|
|
2044
|
+
return;
|
|
1987
2045
|
}
|
|
2046
|
+
clearInterval(this._headPollTimer);
|
|
2047
|
+
this._headPollTimer = null;
|
|
1988
2048
|
}
|
|
1989
2049
|
};
|
|
1990
2050
|
__publicField(SimpleBlockViewer, "defaultMoniker", BlockViewerMoniker);
|
|
@@ -2007,7 +2067,7 @@ var SimpleChainContractViewer = class extends AbstractCreatableProvider {
|
|
|
2007
2067
|
return this.finalizationViewer.chainId();
|
|
2008
2068
|
}
|
|
2009
2069
|
async chainIdAtBlockNumber(blockNumber) {
|
|
2010
|
-
return await withContextCacheResponse(this.context, "chainIdAtBlockNumber",
|
|
2070
|
+
return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
|
|
2011
2071
|
let chainId = this.chainId();
|
|
2012
2072
|
let contractViewer = this;
|
|
2013
2073
|
let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
|
|
@@ -2090,7 +2150,8 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
2090
2150
|
}
|
|
2091
2151
|
async createHandler() {
|
|
2092
2152
|
await super.createHandler();
|
|
2093
|
-
|
|
2153
|
+
const mostRecentBlock = await findMostRecentBlock(this.params.finalizedArchivist);
|
|
2154
|
+
this._chainId = assertEx17(this.config.chain.id ?? mostRecentBlock?.chain, () => "chain.id is required if empty archivist");
|
|
2094
2155
|
this._store = { chainMap: this.params.finalizedArchivist };
|
|
2095
2156
|
}
|
|
2096
2157
|
async head() {
|
|
@@ -2105,13 +2166,16 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
2105
2166
|
}, this.context);
|
|
2106
2167
|
}
|
|
2107
2168
|
async headBlock() {
|
|
2108
|
-
|
|
2169
|
+
const headBlock = await this.head();
|
|
2170
|
+
return headBlock[0];
|
|
2109
2171
|
}
|
|
2110
2172
|
async headHash() {
|
|
2111
|
-
|
|
2173
|
+
const headBlock = await this.headBlock();
|
|
2174
|
+
return headBlock._hash;
|
|
2112
2175
|
}
|
|
2113
2176
|
async headNumber() {
|
|
2114
|
-
|
|
2177
|
+
const headBlock = await this.headBlock();
|
|
2178
|
+
return headBlock.block;
|
|
2115
2179
|
}
|
|
2116
2180
|
getBlockContextRead() {
|
|
2117
2181
|
return {
|
|
@@ -2120,9 +2184,10 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
|
|
|
2120
2184
|
};
|
|
2121
2185
|
}
|
|
2122
2186
|
async getChainContextRead() {
|
|
2187
|
+
const headBlock = await this.head();
|
|
2123
2188
|
return {
|
|
2124
2189
|
...this.getBlockContextRead(),
|
|
2125
|
-
head:
|
|
2190
|
+
head: headBlock[0]
|
|
2126
2191
|
};
|
|
2127
2192
|
}
|
|
2128
2193
|
async getCurrentHead() {
|