@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.
Files changed (107) hide show
  1. package/dist/neutral/ChainContextHelpers.d.ts +1 -1
  2. package/dist/neutral/ChainContextHelpers.d.ts.map +1 -1
  3. package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts +35 -2
  4. package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts.map +1 -1
  5. package/dist/neutral/CreatableProvider/ProviderFactory.d.ts.map +1 -1
  6. package/dist/neutral/CreatableProvider/ProviderFactoryLocator.d.ts.map +1 -1
  7. package/dist/neutral/amount/index.d.ts +1 -1
  8. package/dist/neutral/amount/splitOnDecimalToString.d.ts.map +1 -1
  9. package/dist/neutral/amount/{XL1Amount.d.ts → xl1Amount.d.ts} +1 -1
  10. package/dist/neutral/amount/{XL1Amount.d.ts.map → xl1Amount.d.ts.map} +1 -1
  11. package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -1
  12. package/dist/neutral/block/hydrate/tryHydrateBlock.d.ts.map +1 -1
  13. package/dist/neutral/block/primitives/hashFromBlockNumber.d.ts.map +1 -1
  14. package/dist/neutral/block/primitives/validateTransactionOpcodes.d.ts.map +1 -1
  15. package/dist/neutral/capabilities/Capability.d.ts +1 -8
  16. package/dist/neutral/capabilities/Capability.d.ts.map +1 -1
  17. package/dist/neutral/capabilities/Provider.d.ts +14 -23
  18. package/dist/neutral/capabilities/Provider.d.ts.map +1 -1
  19. package/dist/neutral/capabilities/connectionTypes.d.ts +9 -0
  20. package/dist/neutral/capabilities/connectionTypes.d.ts.map +1 -0
  21. package/dist/neutral/capabilities/index.d.ts +1 -0
  22. package/dist/neutral/capabilities/index.d.ts.map +1 -1
  23. package/dist/neutral/capabilities/resolveProviders.d.ts +27 -20
  24. package/dist/neutral/capabilities/resolveProviders.d.ts.map +1 -1
  25. package/dist/neutral/config/Actor.d.ts +216 -12
  26. package/dist/neutral/config/Actor.d.ts.map +1 -1
  27. package/dist/neutral/config/Actors.d.ts +41 -2
  28. package/dist/neutral/config/Actors.d.ts.map +1 -1
  29. package/dist/neutral/config/Base.d.ts +41 -2
  30. package/dist/neutral/config/Base.d.ts.map +1 -1
  31. package/dist/neutral/config/Config.d.ts +152 -8
  32. package/dist/neutral/config/Config.d.ts.map +1 -1
  33. package/dist/neutral/config/HostActor.d.ts +216 -12
  34. package/dist/neutral/config/HostActor.d.ts.map +1 -1
  35. package/dist/neutral/config/ProviderBinding.d.ts +4 -5
  36. package/dist/neutral/config/ProviderBinding.d.ts.map +1 -1
  37. package/dist/neutral/config/adaptLegacyConfig.d.ts +2 -3
  38. package/dist/neutral/config/adaptLegacyConfig.d.ts.map +1 -1
  39. package/dist/neutral/config/connections/index.d.ts +6 -0
  40. package/dist/neutral/config/connections/index.d.ts.map +1 -0
  41. package/dist/neutral/config/index.d.ts +2 -0
  42. package/dist/neutral/config/index.d.ts.map +1 -1
  43. package/dist/neutral/config/normalizeConnectionsConfig.d.ts +20 -0
  44. package/dist/neutral/config/normalizeConnectionsConfig.d.ts.map +1 -0
  45. package/dist/neutral/config/transports/Transport.d.ts +18 -3
  46. package/dist/neutral/config/transports/Transport.d.ts.map +1 -1
  47. package/dist/neutral/context/Actor.d.ts +216 -12
  48. package/dist/neutral/context/Actor.d.ts.map +1 -1
  49. package/dist/neutral/context/HostActor.d.ts +216 -12
  50. package/dist/neutral/context/HostActor.d.ts.map +1 -1
  51. package/dist/neutral/createDeclarationPayload.d.ts.map +1 -1
  52. package/dist/neutral/createTransferPayload.d.ts.map +1 -1
  53. package/dist/neutral/getFileConfig.d.ts +70 -4
  54. package/dist/neutral/getFileConfig.d.ts.map +1 -1
  55. package/dist/neutral/getFileConfig.mjs +206 -192
  56. package/dist/neutral/getFileConfig.mjs.map +4 -4
  57. package/dist/neutral/index.mjs +953 -656
  58. package/dist/neutral/index.mjs.map +4 -4
  59. package/dist/neutral/model/CreatableProviderContext.zod.d.ts +216 -12
  60. package/dist/neutral/model/CreatableProviderContext.zod.d.ts.map +1 -1
  61. package/dist/neutral/primitives/chain/step/chainStepRewardAddress.d.ts.map +1 -1
  62. package/dist/neutral/primitives/chain/step/stepRewardTotal.d.ts.map +1 -1
  63. package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts → externalBlockNumberFromXl1BlockNumber.d.ts} +1 -1
  64. package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts.map → externalBlockNumberFromXl1BlockNumber.d.ts.map} +1 -1
  65. package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts → externalBlockRangeFromXl1BlockRange.d.ts} +1 -1
  66. package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts.map → externalBlockRangeFromXl1BlockRange.d.ts.map} +1 -1
  67. package/dist/neutral/primitives/chain/time/index.d.ts +2 -2
  68. package/dist/neutral/primitives/datalake/PayloadLocator.d.ts.map +1 -1
  69. package/dist/neutral/primitives/datalake/addDataLakePayloadsToPayloads.d.ts.map +1 -1
  70. package/dist/neutral/primitives/readPayloadMapFromStore.d.ts.map +1 -1
  71. package/dist/neutral/primitives/stake/activeStakeAtTimeByAddress.d.ts.map +1 -1
  72. package/dist/neutral/primitives/stake/activeStakeAtTimeByPosition.d.ts.map +1 -1
  73. package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts.map +1 -1
  74. package/dist/neutral/primitives/state/findMostRecentBlock.d.ts.map +1 -1
  75. package/dist/neutral/primitives/uncle/findUncles.d.ts.map +1 -1
  76. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +3 -6
  77. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts.map +1 -1
  78. package/dist/neutral/simple/block/SimpleBlockViewer.d.ts.map +1 -1
  79. package/dist/neutral/simple/blockInvalidation/SimpleBlockInvalidationViewer.d.ts.map +1 -1
  80. package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts.map +1 -1
  81. package/dist/neutral/simple/datalake/AbstractRestDataLake.d.ts.map +1 -1
  82. package/dist/neutral/simple/datalake/RestDataLakeRunner.d.ts.map +1 -1
  83. package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts.map +1 -1
  84. package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts.map +1 -1
  85. package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts.map +1 -1
  86. package/dist/neutral/simple/gateway/SimpleXyoGatewayRunner.d.ts.map +1 -1
  87. package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts +1 -1
  88. package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts.map +1 -1
  89. package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts +2 -0
  90. package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts.map +1 -1
  91. package/dist/neutral/simple/network/SimpleXyoNetwork.d.ts.map +1 -1
  92. package/dist/neutral/simple/timeSync2/SimpleTimeSyncViewer.d.ts.map +1 -1
  93. package/dist/neutral/simple/transactionInvalidation/SimpleTransactionInvalidationViewer.d.ts.map +1 -1
  94. package/dist/neutral/simple/transactionValidation/SimpleTransactionValidationViewer.d.ts.map +1 -1
  95. package/dist/neutral/summary/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -1
  96. package/dist/neutral/test/buildBlock.d.ts.map +1 -1
  97. package/dist/neutral/test/buildRandomChain.d.ts.map +1 -1
  98. package/dist/neutral/test/buildRandomGenesisBlock.d.ts.map +1 -1
  99. package/dist/neutral/test/buildRandomTransaction.d.ts.map +1 -1
  100. package/dist/neutral/test/createProducerChainStakeIntentTransaction.d.ts.map +1 -1
  101. package/dist/neutral/test/index.mjs +344 -279
  102. package/dist/neutral/test/index.mjs.map +4 -4
  103. package/dist/neutral/transaction/buildTransaction.d.ts.map +1 -1
  104. package/dist/neutral/transaction/buildUnsignedTransaction.d.ts.map +1 -1
  105. package/dist/neutral/transaction/confirmSubmittedTransaction.d.ts.map +1 -1
  106. package/dist/neutral/transaction/hydrateTransaction.d.ts.map +1 -1
  107. 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 blkPayloads = (await chainMap.get(bw.payload_hashes)).map((p) => asAnyPayload(p, true));
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 transactionsPayloads = (await chainMap.get(transactionsPayloadHashes)).map((p) => asAnyPayload(p, true));
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 allPayloads = (await chainMap.get([...allPayloadsHashes])).map((p) => asAnyPayload(p, true));
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 = `${blockNumber}`;
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
- switch (opCode) {
236
- case "elevate": {
237
- const [hash, ...rest] = args;
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
- return new PayloadBuilder2({ schema: TransferSchema }).fields({
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
- }).build();
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
- for (const [i, step] of StepSizes3.entries()) {
380
- if (blockNumber < step) {
381
- break;
382
- }
383
- if (blockNumber % step === 0) {
384
- if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress !== XYO_ZERO_ADDRESS) {
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 [bw, txPayloads] = await new BoundWitnessBuilder().fields({
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)).build();
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 [tx, txPayloads] = await new BoundWitnessBuilder2().fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]).signers(Array.isArray(signer) ? signer : [signer]).build();
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 receiver = receiverAddress ?? (await Account.random()).address;
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
- return await PayloadBuilder6.addHashMeta(new PayloadBuilder6({ schema: ChainStakeIntentSchema }).fields({
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
- }).build());
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 resolvedReceiverAddresses = receiverAddresses ?? [(await Account3.random()).address];
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 payloads = [new PayloadBuilder8({ schema: IdSchema2 }).fields({ salt: `${Date.now()}-${saltCounter}` }).build()];
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 ? [new PayloadBuilder8({ schema: asSchema2("network.xyo.private", true) }).fields({ salt: `${Date.now()}-${saltCounter}` }).build()] : [];
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 ? `${this.defaultMoniker}` : `${this.defaultMoniker}|${labelString}`;
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
- globalThis.xyoServiceSingletons ??= {};
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 !!this._registry[moniker];
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
- if (registry[moniker]) {
904
- registry[moniker].push(...locator.registry[moniker] ?? []);
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 !!this.registry[moniker] || (this._parent?.registered(moniker) ?? false);
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[factory.uniqueId]) {
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 z5 } from "zod";
1206
+ import { z as z9 } from "zod";
1017
1207
 
1018
1208
  // src/config/DataLake/RestDataLakeConfig.ts
1019
- import { globalRegistry as globalRegistry3, z as z3 } from "zod";
1209
+ import { globalRegistry as globalRegistry6, z as z7 } from "zod";
1020
1210
 
1021
1211
  // src/config/DataLake/DataLakeRemoteConfig.ts
1022
- import { globalRegistry as globalRegistry2, z as z2 } from "zod";
1023
- var DataLakeDriverConfigBaseZod = z2.object({
1024
- driver: z2.string().register(globalRegistry2, {
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: z3.literal("rest").register(globalRegistry3, {
1222
+ driver: z7.literal("rest").register(globalRegistry6, {
1033
1223
  description: "Driver for the REST data lake",
1034
1224
  type: "string"
1035
1225
  }),
1036
- url: z3.string().register(globalRegistry3, {
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 globalRegistry4, z as z4 } from "zod";
1044
- var RouterDataLakeConfigZod = z4.object({
1045
- driver: z4.literal("router").register(globalRegistry4, {
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: z4.array(z4.lazy(() => DataLakeConfigZod)).register(globalRegistry4, {
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 = z5.lazy(() => z5.union([RestDataLakeConfigZod, RouterDataLakeConfigZod])).describe("Configuration for a data lake");
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 globalRegistry5, z as z6 } from "zod";
1060
- var EvmInfuraConfigZod = z6.object({
1061
- projectId: z6.string().optional().register(globalRegistry5, {
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: z6.string().optional().register(globalRegistry5, {
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 = z6.object({
1073
- url: z6.url().optional().register(globalRegistry5, {
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 = z6.object({
1080
- chainId: z6.string().optional().register(globalRegistry5, {
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 globalRegistry6, z as z7 } from "zod";
1281
+ import { globalRegistry as globalRegistry9, z as z11 } from "zod";
1092
1282
  var LogLevelNames = Object.keys(LogLevel);
1093
- var LogConfigZod = z7.object({
1094
- logLevel: z7.enum(LogLevelNames).default("info").register(globalRegistry6, {
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: z7.boolean().default(false).register(globalRegistry6, {
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 globalRegistry7, z as z8 } from "zod";
1111
- var ProviderBindingConfigZod = z8.object({
1112
- implementation: z8.string().optional().register(globalRegistry7, {
1113
- description: "Installed provider implementation id (descriptor id)",
1114
- title: "providerBindings.implementation",
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: z8.string().optional().register(globalRegistry7, {
1118
- description: "Named transport from the top-level transports map",
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 implementation and transport binding");
1123
- var ProviderBindingsConfigZod = z8.record(z8.string(), ProviderBindingConfigZod).default({});
1312
+ }).describe("Provider connection binding");
1313
+ var ProviderBindingsConfigZod = z12.record(z12.string(), ProviderBindingConfigZod).default({});
1124
1314
 
1125
1315
  // src/config/Providers.ts
1126
- import z10 from "zod";
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 z9 } from "zod";
1135
- var ProviderConfigZod = z9.object({
1136
- moniker: z9.string(),
1137
- labels: z9.array(z9.string()).optional()
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 = z10.array(ProviderConfigZod.loose()).describe("Configuration for providers").default([]);
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 globalRegistry10, z as z14 } from "zod";
1236
- var StorageConfigZod = z14.object({
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: z14.string().optional().register(globalRegistry10, {
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 globalRegistry11, z as z15 } from "zod";
1248
- var MetricsScrapeConfigZod = z15.object({
1249
- path: z15.string().default("/metrics").register(globalRegistry11, {
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: z15.coerce.number().int().positive().optional().register(globalRegistry11, {
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 = z15.object({ scrape: MetricsScrapeConfigZod }).describe("Metrics configuration options");
1262
- var OpenTelemetryConfigZod = z15.object({
1363
+ var MetricsConfigZod = z16.object({ scrape: MetricsScrapeConfigZod }).describe("Metrics configuration options");
1364
+ var OpenTelemetryConfigZod = z16.object({
1263
1365
  // OpenTelemetry options
1264
- otlpEndpoint: z15.url().optional().register(globalRegistry11, {
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 = z15.object({
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 resolvedStartBlock = isDefinedNotNull(startBlock) ? startBlock[0] : (await viewer.currentBlock())[0];
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 = Number.POSITIVE_INFINITY) => {
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 = `${blockNumber}`;
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
- providerBindings: z18._default(ProviderBindingsConfigZod, ProviderBindingsConfigZod.parse({})).check(z18.describe("Per-moniker provider implementation and transport bindings")),
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("Named connection profiles (rpc, rest, s3, lmdb, mongo, evm-rpc)")),
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.isInteger(stepIndex) && stepIndex >= 0, () => "stepIndex must be a non-negative integer");
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
- return blockNumber === "latest" ? (await this.finalizationViewer.headBlock()).chain : assertEx15(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`)[0].chain;
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: (await this.finalizationViewer.head())[0]
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
- clearInterval(this._headPollTimer);
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", `${blockNumber}`, async () => {
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
- this._chainId = assertEx17(this.config.chain.id ?? (await findMostRecentBlock(this.params.finalizedArchivist))?.chain, () => "chain.id is required if empty archivist");
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
- return (await this.head())[0];
2169
+ const headBlock = await this.head();
2170
+ return headBlock[0];
2109
2171
  }
2110
2172
  async headHash() {
2111
- return (await this.headBlock())._hash;
2173
+ const headBlock = await this.headBlock();
2174
+ return headBlock._hash;
2112
2175
  }
2113
2176
  async headNumber() {
2114
- return (await this.headBlock()).block;
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: (await this.head())[0]
2190
+ head: headBlock[0]
2126
2191
  };
2127
2192
  }
2128
2193
  async getCurrentHead() {