@xyo-network/xl1-protocol-sdk 2.1.9 → 2.2.1

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 (166) 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 +36 -3
  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/resolveProviders.d.ts +6 -0
  16. package/dist/neutral/capabilities/resolveProviders.d.ts.map +1 -1
  17. package/dist/neutral/config/Actor.d.ts +216 -18
  18. package/dist/neutral/config/Actor.d.ts.map +1 -1
  19. package/dist/neutral/config/Actors.d.ts +36 -3
  20. package/dist/neutral/config/Actors.d.ts.map +1 -1
  21. package/dist/neutral/config/Base.d.ts +36 -3
  22. package/dist/neutral/config/Base.d.ts.map +1 -1
  23. package/dist/neutral/config/Chain.d.ts +1 -1
  24. package/dist/neutral/config/Config.d.ts +144 -12
  25. package/dist/neutral/config/Config.d.ts.map +1 -1
  26. package/dist/neutral/config/HostActor.d.ts +216 -18
  27. package/dist/neutral/config/HostActor.d.ts.map +1 -1
  28. package/dist/neutral/config/ProviderBinding.d.ts +18 -0
  29. package/dist/neutral/config/ProviderBinding.d.ts.map +1 -0
  30. package/dist/neutral/config/Validation.d.ts +2 -2
  31. package/dist/neutral/config/adaptLegacyConfig.d.ts +9 -0
  32. package/dist/neutral/config/adaptLegacyConfig.d.ts.map +1 -0
  33. package/dist/neutral/config/index.d.ts +3 -0
  34. package/dist/neutral/config/index.d.ts.map +1 -1
  35. package/dist/neutral/config/transports/Transport.d.ts +111 -0
  36. package/dist/neutral/config/transports/Transport.d.ts.map +1 -0
  37. package/dist/neutral/config/transports/index.d.ts +2 -0
  38. package/dist/neutral/config/transports/index.d.ts.map +1 -0
  39. package/dist/neutral/context/Actor.d.ts +216 -18
  40. package/dist/neutral/context/Actor.d.ts.map +1 -1
  41. package/dist/neutral/context/HostActor.d.ts +216 -18
  42. package/dist/neutral/context/HostActor.d.ts.map +1 -1
  43. package/dist/neutral/createDeclarationPayload.d.ts +1 -1
  44. package/dist/neutral/createDeclarationPayload.d.ts.map +1 -1
  45. package/dist/neutral/createTransferPayload.d.ts +1 -1
  46. package/dist/neutral/createTransferPayload.d.ts.map +1 -1
  47. package/dist/neutral/getFileConfig.d.ts +72 -6
  48. package/dist/neutral/getFileConfig.d.ts.map +1 -1
  49. package/dist/neutral/getFileConfig.mjs +151 -81
  50. package/dist/neutral/getFileConfig.mjs.map +4 -4
  51. package/dist/neutral/index.mjs +776 -442
  52. package/dist/neutral/index.mjs.map +4 -4
  53. package/dist/neutral/instances/Address.d.ts +1 -1
  54. package/dist/neutral/instances/Address.d.ts.map +1 -1
  55. package/dist/neutral/instances/Signature.d.ts +1 -1
  56. package/dist/neutral/instances/Signature.d.ts.map +1 -1
  57. package/dist/neutral/model/CreatableProviderContext.zod.d.ts +216 -18
  58. package/dist/neutral/model/CreatableProviderContext.zod.d.ts.map +1 -1
  59. package/dist/neutral/payloads/AddressPairPayload.d.ts +1 -2
  60. package/dist/neutral/payloads/AddressPairPayload.d.ts.map +1 -1
  61. package/dist/neutral/payloads/netBalancesForPayloads.d.ts +2 -2
  62. package/dist/neutral/payloads/netBalancesForPayloads.d.ts.map +1 -1
  63. package/dist/neutral/payloads/netSchemasForPayloads.d.ts +2 -2
  64. package/dist/neutral/payloads/netSchemasForPayloads.d.ts.map +1 -1
  65. package/dist/neutral/payloads/netTransfersForPayloads.d.ts +1 -2
  66. package/dist/neutral/payloads/netTransfersForPayloads.d.ts.map +1 -1
  67. package/dist/neutral/primitives/chain/step/chainStepRewardAddress.d.ts +1 -1
  68. package/dist/neutral/primitives/chain/step/chainStepRewardAddress.d.ts.map +1 -1
  69. package/dist/neutral/primitives/chain/step/stepRewardTotal.d.ts.map +1 -1
  70. package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts → externalBlockNumberFromXl1BlockNumber.d.ts} +1 -1
  71. package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts.map → externalBlockNumberFromXl1BlockNumber.d.ts.map} +1 -1
  72. package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts → externalBlockRangeFromXl1BlockRange.d.ts} +1 -1
  73. package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts.map → externalBlockRangeFromXl1BlockRange.d.ts.map} +1 -1
  74. package/dist/neutral/primitives/chain/time/index.d.ts +2 -2
  75. package/dist/neutral/primitives/datalake/PayloadLocator.d.ts.map +1 -1
  76. package/dist/neutral/primitives/datalake/addDataLakePayloadsToPayloads.d.ts.map +1 -1
  77. package/dist/neutral/primitives/payload/mergeTransfers.d.ts +1 -1
  78. package/dist/neutral/primitives/payload/mergeTransfers.d.ts.map +1 -1
  79. package/dist/neutral/primitives/readPayloadMapFromStore.d.ts.map +1 -1
  80. package/dist/neutral/primitives/stake/activeStakeAtTimeByAddress.d.ts +1 -1
  81. package/dist/neutral/primitives/stake/activeStakeAtTimeByAddress.d.ts.map +1 -1
  82. package/dist/neutral/primitives/stake/activeStakeAtTimeByPosition.d.ts.map +1 -1
  83. package/dist/neutral/primitives/stake/allStakersForRange.d.ts +1 -1
  84. package/dist/neutral/primitives/stake/allStakersForRange.d.ts.map +1 -1
  85. package/dist/neutral/primitives/stake/allStakersForStep.d.ts +1 -1
  86. package/dist/neutral/primitives/stake/allStakersForStep.d.ts.map +1 -1
  87. package/dist/neutral/primitives/stake/mergedAddRemoveStakeEventsByStaker.d.ts +1 -1
  88. package/dist/neutral/primitives/stake/mergedAddRemoveStakeEventsByStaker.d.ts.map +1 -1
  89. package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts +1 -1
  90. package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts.map +1 -1
  91. package/dist/neutral/primitives/state/findMostRecentBlock.d.ts.map +1 -1
  92. package/dist/neutral/primitives/uncle/findUncles.d.ts +2 -2
  93. package/dist/neutral/primitives/uncle/findUncles.d.ts.map +1 -1
  94. package/dist/neutral/services/AccountTransfersService.d.ts +1 -1
  95. package/dist/neutral/services/AccountTransfersService.d.ts.map +1 -1
  96. package/dist/neutral/services/Election.d.ts +1 -2
  97. package/dist/neutral/services/Election.d.ts.map +1 -1
  98. package/dist/neutral/services/StakeIntentService/StakeIntentService.d.ts +1 -1
  99. package/dist/neutral/services/StakeIntentService/StakeIntentService.d.ts.map +1 -1
  100. package/dist/neutral/simple/StakeTotalsViewer/SimpleStakeTotalsViewer.d.ts +1 -1
  101. package/dist/neutral/simple/StakeTotalsViewer/SimpleStakeTotalsViewer.d.ts.map +1 -1
  102. package/dist/neutral/simple/StakeViewer/SimpleStakeViewer.d.ts +1 -1
  103. package/dist/neutral/simple/StakeViewer/SimpleStakeViewer.d.ts.map +1 -1
  104. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +12 -16
  105. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts.map +1 -1
  106. package/dist/neutral/simple/block/SimpleBlockViewer.d.ts.map +1 -1
  107. package/dist/neutral/simple/blockInvalidation/SimpleBlockInvalidationViewer.d.ts +1 -1
  108. package/dist/neutral/simple/blockInvalidation/SimpleBlockInvalidationViewer.d.ts.map +1 -1
  109. package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts +1 -1
  110. package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts.map +1 -1
  111. package/dist/neutral/simple/chainContractViewer/SimpleChainContractViewer.d.ts +3 -3
  112. package/dist/neutral/simple/chainContractViewer/SimpleChainContractViewer.d.ts.map +1 -1
  113. package/dist/neutral/simple/datalake/AbstractRestDataLake.d.ts.map +1 -1
  114. package/dist/neutral/simple/datalake/RestDataLakeRunner.d.ts.map +1 -1
  115. package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts.map +1 -1
  116. package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts.map +1 -1
  117. package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts.map +1 -1
  118. package/dist/neutral/simple/gateway/SimpleXyoGatewayRunner.d.ts +1 -2
  119. package/dist/neutral/simple/gateway/SimpleXyoGatewayRunner.d.ts.map +1 -1
  120. package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts +1 -1
  121. package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts.map +1 -1
  122. package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts +2 -0
  123. package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts.map +1 -1
  124. package/dist/neutral/simple/network/SimpleXyoNetwork.d.ts.map +1 -1
  125. package/dist/neutral/simple/signer/SimpleXyoSigner.d.ts +1 -2
  126. package/dist/neutral/simple/signer/SimpleXyoSigner.d.ts.map +1 -1
  127. package/dist/neutral/simple/timeSync2/SimpleTimeSyncViewer.d.ts +1 -1
  128. package/dist/neutral/simple/timeSync2/SimpleTimeSyncViewer.d.ts.map +1 -1
  129. package/dist/neutral/simple/transactionInvalidation/SimpleTransactionInvalidationViewer.d.ts +1 -1
  130. package/dist/neutral/simple/transactionInvalidation/SimpleTransactionInvalidationViewer.d.ts.map +1 -1
  131. package/dist/neutral/simple/transactionValidation/SimpleTransactionValidationViewer.d.ts +1 -1
  132. package/dist/neutral/simple/transactionValidation/SimpleTransactionValidationViewer.d.ts.map +1 -1
  133. package/dist/neutral/summary/model/BalancesStepSummary.d.ts +1 -2
  134. package/dist/neutral/summary/model/BalancesStepSummary.d.ts.map +1 -1
  135. package/dist/neutral/summary/model/TransfersSummary.d.ts +1 -2
  136. package/dist/neutral/summary/model/TransfersSummary.d.ts.map +1 -1
  137. package/dist/neutral/summary/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -1
  138. package/dist/neutral/summary/primitives/balances/balancesSummary.d.ts +1 -1
  139. package/dist/neutral/summary/primitives/balances/balancesSummary.d.ts.map +1 -1
  140. package/dist/neutral/summary/primitives/transfers/transfersSummary.d.ts +1 -1
  141. package/dist/neutral/summary/primitives/transfers/transfersSummary.d.ts.map +1 -1
  142. package/dist/neutral/test/BuildBlockOptions.d.ts +1 -2
  143. package/dist/neutral/test/BuildBlockOptions.d.ts.map +1 -1
  144. package/dist/neutral/test/buildBlock.d.ts.map +1 -1
  145. package/dist/neutral/test/buildNextBlock.d.ts +1 -2
  146. package/dist/neutral/test/buildNextBlock.d.ts.map +1 -1
  147. package/dist/neutral/test/buildRandomChain.d.ts +1 -2
  148. package/dist/neutral/test/buildRandomChain.d.ts.map +1 -1
  149. package/dist/neutral/test/buildRandomGenesisBlock.d.ts.map +1 -1
  150. package/dist/neutral/test/buildRandomTransaction.d.ts +1 -2
  151. package/dist/neutral/test/buildRandomTransaction.d.ts.map +1 -1
  152. package/dist/neutral/test/createGenesisBlock.d.ts +1 -2
  153. package/dist/neutral/test/createGenesisBlock.d.ts.map +1 -1
  154. package/dist/neutral/test/createProducerChainStakeIntentTransaction.d.ts +1 -2
  155. package/dist/neutral/test/createProducerChainStakeIntentTransaction.d.ts.map +1 -1
  156. package/dist/neutral/test/getSimpleBlockViewerLocator.d.ts +1 -2
  157. package/dist/neutral/test/getSimpleBlockViewerLocator.d.ts.map +1 -1
  158. package/dist/neutral/test/index.mjs +287 -166
  159. package/dist/neutral/test/index.mjs.map +4 -4
  160. package/dist/neutral/transaction/buildTransaction.d.ts +1 -2
  161. package/dist/neutral/transaction/buildTransaction.d.ts.map +1 -1
  162. package/dist/neutral/transaction/buildUnsignedTransaction.d.ts +1 -2
  163. package/dist/neutral/transaction/buildUnsignedTransaction.d.ts.map +1 -1
  164. package/dist/neutral/transaction/confirmSubmittedTransaction.d.ts.map +1 -1
  165. package/dist/neutral/transaction/hydrateTransaction.d.ts.map +1 -1
  166. package/package.json +8 -10
@@ -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}]`);
@@ -990,14 +1029,14 @@ import {
990
1029
  zodIsFactory as zodIsFactory2,
991
1030
  zodToFactory as zodToFactory2
992
1031
  } from "@xylabs/sdk-js";
993
- import { globalRegistry as globalRegistry12, z as z17 } from "zod/mini";
1032
+ import { globalRegistry as globalRegistry14, z as z19 } from "zod/mini";
994
1033
 
995
1034
  // src/config/Base.ts
996
- import { z as z16 } from "zod/mini";
1035
+ import { z as z18 } from "zod/mini";
997
1036
 
998
1037
  // src/config/Chain.ts
999
1038
  import { HexZod } from "@xylabs/sdk-js";
1000
- import { XyoAddressZod } from "@xyo-network/address";
1039
+ import { XyoAddressZod } from "@xyo-network/sdk-js";
1001
1040
  import { globalRegistry, z } from "zod/mini";
1002
1041
  var ChainConfigZod = z.object({
1003
1042
  id: z.optional(HexZod).register(globalRegistry, {
@@ -1106,8 +1145,24 @@ var LogConfigZod = z7.object({
1106
1145
  })
1107
1146
  });
1108
1147
 
1148
+ // src/config/ProviderBinding.ts
1149
+ import { globalRegistry as globalRegistry7, z as z8 } from "zod";
1150
+ var ProviderBindingConfigZod = z8.object({
1151
+ implementation: z8.string().optional().register(globalRegistry7, {
1152
+ description: "Installed provider implementation id (descriptor id)",
1153
+ title: "providerBindings.implementation",
1154
+ type: "string"
1155
+ }),
1156
+ transport: z8.string().optional().register(globalRegistry7, {
1157
+ description: "Named transport from the top-level transports map",
1158
+ title: "providerBindings.transport",
1159
+ type: "string"
1160
+ })
1161
+ }).describe("Provider implementation and transport binding");
1162
+ var ProviderBindingsConfigZod = z8.record(z8.string(), ProviderBindingConfigZod).default({});
1163
+
1109
1164
  // src/config/Providers.ts
1110
- import z9 from "zod";
1165
+ import z10 from "zod";
1111
1166
 
1112
1167
  // src/config/Provider.ts
1113
1168
  import {
@@ -1115,79 +1170,79 @@ import {
1115
1170
  zodIsFactory,
1116
1171
  zodToFactory
1117
1172
  } from "@xylabs/sdk-js";
1118
- import { z as z8 } from "zod";
1119
- var ProviderConfigZod = z8.object({
1120
- moniker: z8.string(),
1121
- labels: z8.array(z8.string()).optional()
1173
+ import { z as z9 } from "zod";
1174
+ var ProviderConfigZod = z9.object({
1175
+ moniker: z9.string(),
1176
+ labels: z9.array(z9.string()).optional()
1122
1177
  }).describe("Configuration for a Provider");
1123
1178
  var isProviderConfig = zodIsFactory(ProviderConfigZod);
1124
1179
  var asProviderConfig = zodAsFactory(ProviderConfigZod, "asProviderConfig");
1125
1180
  var toProviderConfig = zodToFactory(ProviderConfigZod, "toProviderConfig");
1126
1181
 
1127
1182
  // src/config/Providers.ts
1128
- var ProvidersConfigZod = z9.array(ProviderConfigZod.loose()).describe("Configuration for providers").default([]);
1183
+ var ProvidersConfigZod = z10.array(ProviderConfigZod.loose()).describe("Configuration for providers").default([]);
1129
1184
 
1130
1185
  // src/config/Remote.ts
1131
- import { globalRegistry as globalRegistry7, z as z10 } from "zod";
1132
- var RpcRemoteConfigBaseZod = z10.object({
1133
- protocol: z10.string("http").register(globalRegistry7, {
1186
+ import { globalRegistry as globalRegistry8, z as z11 } from "zod";
1187
+ var RpcRemoteConfigBaseZod = z11.object({
1188
+ protocol: z11.string("http").register(globalRegistry8, {
1134
1189
  description: "Protocol for the RPC connection",
1135
1190
  type: "string"
1136
1191
  })
1137
1192
  }).describe("Base configuration for the remote RPC");
1138
1193
  var HttpRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({
1139
- protocol: z10.string("http").register(globalRegistry7, {
1194
+ protocol: z11.string("http").register(globalRegistry8, {
1140
1195
  description: "Protocol for the RPC connection",
1141
1196
  type: "string"
1142
1197
  }).default("http"),
1143
- url: z10.string().register(globalRegistry7, {
1198
+ url: z11.string().register(globalRegistry8, {
1144
1199
  description: "URL for the Chain RPC API",
1145
1200
  type: "string"
1146
1201
  })
1147
1202
  }).describe("Configuration for the remote RPC using Http");
1148
1203
  var PostMessageRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({
1149
- protocol: z10.string().register(globalRegistry7, {
1204
+ protocol: z11.string().register(globalRegistry8, {
1150
1205
  description: "Protocol for the RPC connection",
1151
1206
  type: "string"
1152
1207
  }).default("postMessage"),
1153
- networkId: z10.string().register(globalRegistry7, {
1208
+ networkId: z11.string().register(globalRegistry8, {
1154
1209
  description: "Network ID to use for the postMessage RPC connection",
1155
1210
  type: "string"
1156
1211
  }),
1157
- sessionId: z10.string().register(globalRegistry7, {
1212
+ sessionId: z11.string().register(globalRegistry8, {
1158
1213
  description: "Session ID to use for the postMessage RPC connection",
1159
1214
  type: "string"
1160
1215
  })
1161
1216
  }).describe("Configuration for the remote RPC using postMessage");
1162
- var RpcRemoteConfigZod = z10.union([HttpRpcRemoteConfigZod, PostMessageRpcRemoteConfigZod]).describe("Configuration for a remote RPC connection, either Http or postMessage");
1163
- var RemoteConfigZod = z10.object({ rpc: RpcRemoteConfigZod.optional() }).describe("Configuration for remote connections, including RPC");
1217
+ var RpcRemoteConfigZod = z11.union([HttpRpcRemoteConfigZod, PostMessageRpcRemoteConfigZod]).describe("Configuration for a remote RPC connection, either Http or postMessage");
1218
+ var RemoteConfigZod = z11.object({ rpc: RpcRemoteConfigZod.optional() }).describe("Configuration for remote connections, including RPC");
1164
1219
 
1165
1220
  // src/config/storage/driver/Mongo.ts
1166
1221
  import { isDefined as isDefined4, isUndefined as isUndefined2 } from "@xylabs/sdk-js";
1167
- import { globalRegistry as globalRegistry8, z as z11 } from "zod";
1168
- var MongoConfigZod = z11.object({
1222
+ import { globalRegistry as globalRegistry9, z as z12 } from "zod";
1223
+ var MongoConfigZod = z12.object({
1169
1224
  // TODO: Create from other arguments
1170
- connectionString: z11.string().nonempty().optional().register(globalRegistry8, {
1225
+ connectionString: z12.string().nonempty().optional().register(globalRegistry9, {
1171
1226
  description: "MongoDB connection string",
1172
1227
  title: "storage.mongo.connectionString",
1173
1228
  type: "string"
1174
1229
  }),
1175
- database: z11.string().nonempty().optional().register(globalRegistry8, {
1230
+ database: z12.string().nonempty().optional().register(globalRegistry9, {
1176
1231
  description: "MongoDB database name",
1177
1232
  title: "storage.mongo.database",
1178
1233
  type: "string"
1179
1234
  }),
1180
- domain: z11.string().nonempty().optional().register(globalRegistry8, {
1235
+ domain: z12.string().nonempty().optional().register(globalRegistry9, {
1181
1236
  description: "MongoDB domain",
1182
1237
  title: "storage.mongo.domain",
1183
1238
  type: "string"
1184
1239
  }),
1185
- password: z11.string().nonempty().optional().register(globalRegistry8, {
1240
+ password: z12.string().nonempty().optional().register(globalRegistry9, {
1186
1241
  description: "MongoDB password",
1187
1242
  title: "storage.mongo.password",
1188
1243
  type: "string"
1189
1244
  }),
1190
- username: z11.string().nonempty().optional().register(globalRegistry8, {
1245
+ username: z12.string().nonempty().optional().register(globalRegistry9, {
1191
1246
  description: "MongoDB username",
1192
1247
  title: "storage.mongo.username",
1193
1248
  type: "string"
@@ -1196,30 +1251,30 @@ var MongoConfigZod = z11.object({
1196
1251
 
1197
1252
  // src/config/storage/driver/S3.ts
1198
1253
  import { isDefined as isDefined5 } from "@xylabs/sdk-js";
1199
- import { z as z12 } from "zod";
1200
- var S3BucketConfigZod = z12.object({
1201
- accessKeyId: z12.string().nonempty().optional().describe("S3-compatible access key id for this bucket (overrides the shared default)"),
1202
- accountId: z12.string().nonempty().optional().describe("Account id for this bucket; on Cloudflare R2 it forms the endpoint (overrides the shared default)"),
1203
- bucket: z12.string().nonempty().optional().describe("S3-compatible bucket name"),
1204
- prefix: z12.string().nonempty().optional().describe("Optional key prefix within the bucket"),
1205
- readUrl: z12.string().nonempty().optional().describe("Public HTTP/CDN base URL for anonymous reads of this bucket"),
1206
- secretAccessKey: z12.string().nonempty().optional().describe("S3-compatible secret access key for this bucket (overrides the shared default)")
1254
+ import { z as z13 } from "zod";
1255
+ var S3BucketConfigZod = z13.object({
1256
+ accessKeyId: z13.string().nonempty().optional().describe("S3-compatible access key id for this bucket (overrides the shared default)"),
1257
+ accountId: z13.string().nonempty().optional().describe("Account id for this bucket; on Cloudflare R2 it forms the endpoint (overrides the shared default)"),
1258
+ bucket: z13.string().nonempty().optional().describe("S3-compatible bucket name"),
1259
+ prefix: z13.string().nonempty().optional().describe("Optional key prefix within the bucket"),
1260
+ readUrl: z13.string().nonempty().optional().describe("Public HTTP/CDN base URL for anonymous reads of this bucket"),
1261
+ secretAccessKey: z13.string().nonempty().optional().describe("S3-compatible secret access key for this bucket (overrides the shared default)")
1207
1262
  });
1208
- var S3ConfigZod = z12.object({
1209
- accessKeyId: z12.string().nonempty().optional().describe("Shared S3-compatible access key id (default for all buckets)"),
1210
- accountId: z12.string().nonempty().optional().describe("Shared account id (default for all buckets; on Cloudflare R2 it forms the endpoint)"),
1263
+ var S3ConfigZod = z13.object({
1264
+ accessKeyId: z13.string().nonempty().optional().describe("Shared S3-compatible access key id (default for all buckets)"),
1265
+ accountId: z13.string().nonempty().optional().describe("Shared account id (default for all buckets; on Cloudflare R2 it forms the endpoint)"),
1211
1266
  chainState: S3BucketConfigZod.optional().describe("Bucket for the mutable chain state (the head pointer)"),
1212
1267
  finalized: S3BucketConfigZod.optional().describe("Bucket for the finalized files (blocks, payloads, manifest)"),
1213
1268
  index: S3BucketConfigZod.optional().describe("Bucket for the chain index (the step-summary families)"),
1214
- prefix: z12.string().nonempty().optional().describe("Shared key prefix (default for all buckets)"),
1215
- secretAccessKey: z12.string().nonempty().optional().describe("Shared S3-compatible secret access key (default for all buckets)")
1269
+ prefix: z13.string().nonempty().optional().describe("Shared key prefix (default for all buckets)"),
1270
+ secretAccessKey: z13.string().nonempty().optional().describe("Shared S3-compatible secret access key (default for all buckets)")
1216
1271
  });
1217
1272
 
1218
1273
  // src/config/storage/Storage.ts
1219
- import { globalRegistry as globalRegistry9, z as z13 } from "zod";
1220
- var StorageConfigZod = z13.object({
1274
+ import { globalRegistry as globalRegistry10, z as z14 } from "zod";
1275
+ var StorageConfigZod = z14.object({
1221
1276
  mongo: MongoConfigZod.optional().describe("Configuration for the MongoD storage driver"),
1222
- root: z13.string().optional().register(globalRegistry9, {
1277
+ root: z14.string().optional().register(globalRegistry10, {
1223
1278
  description: "Root directory for local storage",
1224
1279
  title: "storage.root",
1225
1280
  type: "string"
@@ -1228,39 +1283,90 @@ var StorageConfigZod = z13.object({
1228
1283
  }).describe("Storage configuration options");
1229
1284
 
1230
1285
  // src/config/Telemetry.ts
1231
- import { globalRegistry as globalRegistry10, z as z14 } from "zod";
1232
- var MetricsScrapeConfigZod = z14.object({
1233
- path: z14.string().default("/metrics").register(globalRegistry10, {
1286
+ import { globalRegistry as globalRegistry11, z as z15 } from "zod";
1287
+ var MetricsScrapeConfigZod = z15.object({
1288
+ path: z15.string().default("/metrics").register(globalRegistry11, {
1234
1289
  default: "/metrics",
1235
1290
  description: "Path for the metrics scrape endpoint",
1236
1291
  title: "telemetry.metrics.scrape.path",
1237
1292
  type: "string"
1238
1293
  }),
1239
- port: z14.coerce.number().int().positive().optional().register(globalRegistry10, {
1294
+ port: z15.coerce.number().int().positive().optional().register(globalRegistry11, {
1240
1295
  description: "Port for the metrics scrape endpoint",
1241
1296
  title: "telemetry.metrics.scrape.port",
1242
1297
  type: "number"
1243
1298
  })
1244
1299
  }).describe("Metrics scrape configuration");
1245
- var MetricsConfigZod = z14.object({ scrape: MetricsScrapeConfigZod }).describe("Metrics configuration options");
1246
- var OpenTelemetryConfigZod = z14.object({
1300
+ var MetricsConfigZod = z15.object({ scrape: MetricsScrapeConfigZod }).describe("Metrics configuration options");
1301
+ var OpenTelemetryConfigZod = z15.object({
1247
1302
  // OpenTelemetry options
1248
- otlpEndpoint: z14.url().optional().register(globalRegistry10, {
1303
+ otlpEndpoint: z15.url().optional().register(globalRegistry11, {
1249
1304
  description: "OTLP endpoint for exporting telemetry data",
1250
1305
  title: "telemetry.otel.otlpEndpoint",
1251
1306
  type: "string"
1252
1307
  })
1253
1308
  });
1254
- var TelemetryConfigZod = z14.object({
1309
+ var TelemetryConfigZod = z15.object({
1255
1310
  // Metrics configuration
1256
1311
  metrics: MetricsConfigZod.optional().describe("Metrics configuration"),
1257
1312
  // OpenTelemetry configuration
1258
1313
  otel: OpenTelemetryConfigZod.optional().describe("OpenTelemetry configuration")
1259
1314
  }).describe("Telemetry configuration options");
1260
1315
 
1316
+ // src/config/transports/Transport.ts
1317
+ import { globalRegistry as globalRegistry12, z as z16 } from "zod";
1318
+ var LmdbTransportConfigZod = z16.object({
1319
+ type: z16.literal("lmdb"),
1320
+ root: z16.string().register(globalRegistry12, {
1321
+ description: "Root directory for local LMDB storage",
1322
+ title: "transports.lmdb.root",
1323
+ type: "string"
1324
+ })
1325
+ }).describe("LMDB local storage transport");
1326
+ var MongoTransportConfigZod = z16.object({
1327
+ type: z16.literal("mongo"),
1328
+ connectionString: MongoConfigZod.shape.connectionString,
1329
+ database: MongoConfigZod.shape.database,
1330
+ domain: MongoConfigZod.shape.domain,
1331
+ password: MongoConfigZod.shape.password,
1332
+ username: MongoConfigZod.shape.username
1333
+ }).describe("MongoDB storage transport");
1334
+ var RpcTransportConfigZod = HttpRpcRemoteConfigZod.extend({ type: z16.literal("rpc") }).describe("XL1 JSON-RPC transport");
1335
+ var RestTransportConfigZod = z16.object({
1336
+ type: z16.literal("rest"),
1337
+ baseUrl: z16.string().register(globalRegistry12, {
1338
+ description: "HTTP base URL for REST reads",
1339
+ title: "transports.rest.baseUrl",
1340
+ type: "string"
1341
+ })
1342
+ }).describe("HTTP REST read transport");
1343
+ var S3TransportConfigZod = S3BucketConfigZod.extend({
1344
+ type: z16.literal("s3"),
1345
+ accessKeyId: z16.string().optional(),
1346
+ accountId: z16.string().optional(),
1347
+ secretAccessKey: z16.string().optional()
1348
+ }).describe("S3-compatible object storage transport");
1349
+ var EvmRpcTransportConfigZod = z16.object({
1350
+ type: z16.literal("evm-rpc"),
1351
+ url: z16.string().register(globalRegistry12, {
1352
+ description: "EVM JSON-RPC URL",
1353
+ title: "transports.evm-rpc.url",
1354
+ type: "string"
1355
+ })
1356
+ }).describe("EVM JSON-RPC transport");
1357
+ var TransportConfigZod = z16.discriminatedUnion("type", [
1358
+ LmdbTransportConfigZod,
1359
+ MongoTransportConfigZod,
1360
+ RpcTransportConfigZod,
1361
+ RestTransportConfigZod,
1362
+ S3TransportConfigZod,
1363
+ EvmRpcTransportConfigZod
1364
+ ]);
1365
+ var TransportsConfigZod = z16.record(z16.string(), TransportConfigZod).default({});
1366
+
1261
1367
  // src/config/Validation.ts
1262
- import { XyoAddressZod as XyoAddressZod2 } from "@xyo-network/address";
1263
- import { globalRegistry as globalRegistry11, z as z15 } from "zod";
1368
+ import { XyoAddressZod as XyoAddressZod2 } from "@xyo-network/sdk-js";
1369
+ import { globalRegistry as globalRegistry13, z as z17 } from "zod";
1264
1370
 
1265
1371
  // src/primitives/block/rate/blockRate.ts
1266
1372
  import { isDefined as isDefined7, isFalsy } from "@xylabs/sdk-js";
@@ -1387,7 +1493,9 @@ var DEFAULT_MAX_ATTEMPTS = 10;
1387
1493
  var calculateTimeRate = async (viewer, timeConfig, startBlockNumber, timeUnit, toleranceMs = DEFAULT_TOLERANCE_MS, maxAttempts = DEFAULT_MAX_ATTEMPTS) => {
1388
1494
  assertEx12(Object.keys(timeConfig ?? {}).length === 1, () => "Only one time unit should be specified in timeConfig");
1389
1495
  const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null;
1390
- const resolvedStartBlock = isDefinedNotNull(startBlock) ? startBlock[0] : (await viewer.currentBlock())[0];
1496
+ const currentBlockResult = await viewer.currentBlock();
1497
+ const blockResult = isDefinedNotNull(startBlock) ? startBlock : currentBlockResult;
1498
+ const resolvedStartBlock = blockResult[0];
1391
1499
  const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig);
1392
1500
  assertEx12(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
1393
1501
  const blocksPerMillisecondRate = 1 / (12 * 1e3);
@@ -1452,7 +1560,7 @@ var findEndBlockRecursive = async (viewer, startBlock, targetTimeMs, estimatedBl
1452
1560
  // src/primitives/state/findMostRecentBlock.ts
1453
1561
  import { isSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol-lib";
1454
1562
  var DEFAULT_NEXT_OPTIONS = { limit: 50 };
1455
- var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations = Number.POSITIVE_INFINITY) => {
1563
+ var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations = Infinity) => {
1456
1564
  let mostRecentBlock;
1457
1565
  let cursor;
1458
1566
  let batch;
@@ -1468,9 +1576,8 @@ var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTI
1468
1576
  if (last) {
1469
1577
  mostRecentBlock = last;
1470
1578
  break;
1471
- } else {
1472
- cursor = batch.at(-1)?._sequence;
1473
1579
  }
1580
+ cursor = batch.at(-1)?._sequence;
1474
1581
  iterations = iterations + 1;
1475
1582
  } while (batch.length > 0 && iterations < maxIterations);
1476
1583
  return mostRecentBlock;
@@ -1483,7 +1590,7 @@ async function hydratedBlockByNumber(context, blockNumber) {
1483
1590
  if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`);
1484
1591
  if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`);
1485
1592
  if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`);
1486
- const cacheKey = `${blockNumber}`;
1593
+ const cacheKey = String(blockNumber);
1487
1594
  return await withContextCacheResponse(context, "hydratedBlockByNumber", cacheKey, async () => {
1488
1595
  const block = assertEx13(
1489
1596
  await blockFromBlockNumber(context, blockNumber),
@@ -1499,24 +1606,24 @@ var DEFAULT_MIN_CANDIDATES = 1;
1499
1606
  var DEFAULT_BACKOFF_MS = 12e4;
1500
1607
 
1501
1608
  // src/config/Validation.ts
1502
- var ValidationConfigZod = z15.object({
1503
- allowedRewardRedeemers: z15.array(XyoAddressZod2).optional().register(globalRegistry11, {
1609
+ var ValidationConfigZod = z17.object({
1610
+ allowedRewardRedeemers: z17.array(XyoAddressZod2).optional().register(globalRegistry13, {
1504
1611
  description: "List of allowed reward redeemer addresses, if undefined anyone can participate",
1505
1612
  title: "allowedRewardRedeemers",
1506
1613
  type: "array"
1507
1614
  }),
1508
- allowedRewardEscrowAccountSigners: z15.array(XyoAddressZod2).optional().register(globalRegistry11, {
1615
+ allowedRewardEscrowAccountSigners: z17.array(XyoAddressZod2).optional().register(globalRegistry13, {
1509
1616
  description: "List of allowed reward escrow account signer addresses, if undefined anyone can participate",
1510
1617
  title: "allowedRewardEscrowAccountSigners",
1511
1618
  type: "array"
1512
1619
  }),
1513
- minCandidates: z15.coerce.number().default(DEFAULT_MIN_CANDIDATES).register(globalRegistry11, {
1620
+ minCandidates: z17.coerce.number().default(DEFAULT_MIN_CANDIDATES).register(globalRegistry13, {
1514
1621
  default: DEFAULT_MIN_CANDIDATES,
1515
1622
  description: "Minimum number of uncle candidates before selecting the best uncle",
1516
1623
  title: "validation.minCandidates",
1517
1624
  type: "number"
1518
1625
  }),
1519
- backoffMs: z15.coerce.number().default(DEFAULT_BACKOFF_MS).register(globalRegistry11, {
1626
+ backoffMs: z17.coerce.number().default(DEFAULT_BACKOFF_MS).register(globalRegistry13, {
1520
1627
  default: DEFAULT_BACKOFF_MS,
1521
1628
  description: "Back-off timeout in ms. If head age exceeds this, minCandidates is ignored",
1522
1629
  title: "validation.backoffMs",
@@ -1525,26 +1632,28 @@ var ValidationConfigZod = z15.object({
1525
1632
  });
1526
1633
 
1527
1634
  // src/config/Base.ts
1528
- var BaseConfigZod = z16.object({
1529
- chain: z16._default(ChainConfigZod, ChainConfigZod.parse({})).check(z16.describe("Configuration for the chain")),
1530
- dataLake: z16.optional(DataLakeConfigZod).check(z16.describe("Configuration for data lakes")),
1531
- evm: z16._default(EvmConfigZod, EvmConfigZod.parse({})).check(z16.describe("Configuration for EVM-backed services")),
1532
- log: z16._default(LogConfigZod, LogConfigZod.parse({})).check(z16.describe("Configuration for logging")),
1533
- providers: z16._default(ProvidersConfigZod, ProvidersConfigZod.parse([])).check(z16.describe("Configuration for providers")),
1534
- remote: z16._default(RemoteConfigZod, RemoteConfigZod.parse({})).check(z16.describe("Configuration for remote services")),
1535
- storage: z16._default(StorageConfigZod, StorageConfigZod.parse({})).check(z16.describe("Configuration for the storage")),
1536
- telemetry: z16._default(TelemetryConfigZod, TelemetryConfigZod.parse({})).check(z16.describe("Configuration for telemetry")),
1537
- validation: z16._default(ValidationConfigZod, ValidationConfigZod.parse({})).check(z16.describe("Configuration for validation"))
1635
+ var BaseConfigZod = z18.object({
1636
+ chain: z18._default(ChainConfigZod, ChainConfigZod.parse({})).check(z18.describe("Configuration for the chain")),
1637
+ dataLake: z18.optional(DataLakeConfigZod).check(z18.describe("Configuration for data lakes")),
1638
+ evm: z18._default(EvmConfigZod, EvmConfigZod.parse({})).check(z18.describe("Configuration for EVM-backed services")),
1639
+ log: z18._default(LogConfigZod, LogConfigZod.parse({})).check(z18.describe("Configuration for logging")),
1640
+ providerBindings: z18._default(ProviderBindingsConfigZod, ProviderBindingsConfigZod.parse({})).check(z18.describe("Per-moniker provider implementation and transport bindings")),
1641
+ providers: z18._default(ProvidersConfigZod, ProvidersConfigZod.parse([])).check(z18.describe("Configuration for providers")),
1642
+ remote: z18._default(RemoteConfigZod, RemoteConfigZod.parse({})).check(z18.describe("Configuration for remote services")),
1643
+ transports: z18._default(TransportsConfigZod, TransportsConfigZod.parse({})).check(z18.describe("Named connection profiles (rpc, rest, s3, lmdb, mongo, evm-rpc)")),
1644
+ storage: z18._default(StorageConfigZod, StorageConfigZod.parse({})).check(z18.describe("Configuration for the storage")),
1645
+ telemetry: z18._default(TelemetryConfigZod, TelemetryConfigZod.parse({})).check(z18.describe("Configuration for telemetry")),
1646
+ validation: z18._default(ValidationConfigZod, ValidationConfigZod.parse({})).check(z18.describe("Configuration for validation"))
1538
1647
  });
1539
1648
 
1540
1649
  // src/config/Actor.ts
1541
- var AccountPathZod = z17.string().check(z17.regex(
1650
+ var AccountPathZod = z19.string().check(z19.regex(
1542
1651
  /^(m(\/\d+'?)+|\d+'?(\/\d+'?)*)$/,
1543
1652
  `Invalid BIP-32 derivation path. Use either an absolute path like "m/44'/60'/0'/0/0" or a relative path like "0", "0/1", or "44'/60'/0'/0/0".`
1544
1653
  ));
1545
- var ActorConfigZod = z17.extend(BaseConfigZod, {
1546
- name: z17.string(),
1547
- accountPath: z17.optional(AccountPathZod).register(globalRegistry12, {
1654
+ var ActorConfigZod = z19.extend(BaseConfigZod, {
1655
+ name: z19.string(),
1656
+ accountPath: z19.optional(AccountPathZod).register(globalRegistry14, {
1548
1657
  description: 'BIP-32 derivation path for the actor wallet. Absolute when it starts with "m/"; otherwise relative to the root wallet base path. Each actor must derive to a distinct path.',
1549
1658
  title: "accountPath",
1550
1659
  type: "string"
@@ -1555,22 +1664,22 @@ var asActorConfig = zodAsFactory2(ActorConfigZod, "asActorConfig");
1555
1664
  var toActorConfig = zodToFactory2(ActorConfigZod, "toActorConfig");
1556
1665
 
1557
1666
  // src/config/Actors.ts
1558
- import { z as z18 } from "zod/mini";
1559
- var ActorsConfigZod = z18._default(
1560
- z18.array(z18.looseObject(ActorConfigZod.shape)).check(z18.describe("Actor-specific configurations that override the base configuration when the actor is running")),
1667
+ import { z as z20 } from "zod/mini";
1668
+ var ActorsConfigZod = z20._default(
1669
+ z20.array(z20.looseObject(ActorConfigZod.shape)).check(z20.describe("Actor-specific configurations that override the base configuration when the actor is running")),
1561
1670
  []
1562
1671
  );
1563
1672
 
1564
1673
  // src/config/Config.ts
1565
- import { globalRegistry as globalRegistry13, z as z19 } from "zod/mini";
1566
- var ConfigZod = z19.extend(BaseConfigZod, {
1674
+ import { globalRegistry as globalRegistry15, z as z21 } from "zod/mini";
1675
+ var ConfigZod = z21.extend(BaseConfigZod, {
1567
1676
  actors: ActorsConfigZod,
1568
- healthCheckPort: z19.optional(z19.coerce.number()).register(globalRegistry13, {
1677
+ healthCheckPort: z21.optional(z21.coerce.number()).register(globalRegistry15, {
1569
1678
  description: "Port for the system-wide health, readiness, and liveness endpoints (/healthz, /livez, /readyz). Set to 0 to disable.",
1570
1679
  title: "healthCheckPort",
1571
1680
  type: "number"
1572
1681
  })
1573
- }).check(z19.describe("The complete configuration for the protocol, including global settings and actor-specific overrides"));
1682
+ }).check(z21.describe("The complete configuration for the protocol, including global settings and actor-specific overrides"));
1574
1683
 
1575
1684
  // src/summary/primitives/blocks/blocksMaxStep.ts
1576
1685
  var blocksMaxStep = 3;
@@ -1790,7 +1899,7 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
1790
1899
  }
1791
1900
  async blocksByStep(stepLevel, stepIndex) {
1792
1901
  return await this.spanAsync("blocksByStep", async () => {
1793
- assertEx15(Number.isInteger(stepIndex) && stepIndex >= 0, () => "stepIndex must be a non-negative integer");
1902
+ assertEx15(Number.isSafeInteger(stepIndex) && stepIndex >= 0, () => "stepIndex must be a non-negative integer");
1794
1903
  const size = stepSize2(stepLevel);
1795
1904
  assertEx15(
1796
1905
  stepLevel <= blocksMaxStep,
@@ -1814,7 +1923,12 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
1814
1923
  }
1815
1924
  async chainId(blockNumber = "latest") {
1816
1925
  return await this.spanAsync("chainId", async () => {
1817
- return blockNumber === "latest" ? (await this.finalizationViewer.headBlock()).chain : assertEx15(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`)[0].chain;
1926
+ if (blockNumber === "latest") {
1927
+ const headBlock = await this.finalizationViewer.headBlock();
1928
+ return headBlock.chain;
1929
+ }
1930
+ const block = assertEx15(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`);
1931
+ return block[0].chain;
1818
1932
  }, this.context);
1819
1933
  }
1820
1934
  async createHandler() {
@@ -1863,9 +1977,10 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
1863
1977
  };
1864
1978
  }
1865
1979
  async getChainContextRead() {
1980
+ const headBlock = await this.finalizationViewer.head();
1866
1981
  return {
1867
1982
  ...this.getBlockContextRead(),
1868
- head: (await this.finalizationViewer.head())[0]
1983
+ head: headBlock[0]
1869
1984
  };
1870
1985
  }
1871
1986
  async startHandler() {
@@ -1912,10 +2027,11 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
1912
2027
  }, this.headPollIntervalMs);
1913
2028
  }
1914
2029
  stopHeadPolling() {
1915
- if (this._headPollTimer) {
1916
- clearInterval(this._headPollTimer);
1917
- this._headPollTimer = null;
2030
+ if (!this._headPollTimer) {
2031
+ return;
1918
2032
  }
2033
+ clearInterval(this._headPollTimer);
2034
+ this._headPollTimer = null;
1919
2035
  }
1920
2036
  };
1921
2037
  __publicField(SimpleBlockViewer, "defaultMoniker", BlockViewerMoniker);
@@ -1938,7 +2054,7 @@ var SimpleChainContractViewer = class extends AbstractCreatableProvider {
1938
2054
  return this.finalizationViewer.chainId();
1939
2055
  }
1940
2056
  async chainIdAtBlockNumber(blockNumber) {
1941
- return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", `${blockNumber}`, async () => {
2057
+ return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
1942
2058
  let chainId = this.chainId();
1943
2059
  let contractViewer = this;
1944
2060
  let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
@@ -2021,7 +2137,8 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
2021
2137
  }
2022
2138
  async createHandler() {
2023
2139
  await super.createHandler();
2024
- this._chainId = assertEx17(this.config.chain.id ?? (await findMostRecentBlock(this.params.finalizedArchivist))?.chain, () => "chain.id is required if empty archivist");
2140
+ const mostRecentBlock = await findMostRecentBlock(this.params.finalizedArchivist);
2141
+ this._chainId = assertEx17(this.config.chain.id ?? mostRecentBlock?.chain, () => "chain.id is required if empty archivist");
2025
2142
  this._store = { chainMap: this.params.finalizedArchivist };
2026
2143
  }
2027
2144
  async head() {
@@ -2036,13 +2153,16 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
2036
2153
  }, this.context);
2037
2154
  }
2038
2155
  async headBlock() {
2039
- return (await this.head())[0];
2156
+ const headBlock = await this.head();
2157
+ return headBlock[0];
2040
2158
  }
2041
2159
  async headHash() {
2042
- return (await this.headBlock())._hash;
2160
+ const headBlock = await this.headBlock();
2161
+ return headBlock._hash;
2043
2162
  }
2044
2163
  async headNumber() {
2045
- return (await this.headBlock()).block;
2164
+ const headBlock = await this.headBlock();
2165
+ return headBlock.block;
2046
2166
  }
2047
2167
  getBlockContextRead() {
2048
2168
  return {
@@ -2051,9 +2171,10 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
2051
2171
  };
2052
2172
  }
2053
2173
  async getChainContextRead() {
2174
+ const headBlock = await this.head();
2054
2175
  return {
2055
2176
  ...this.getBlockContextRead(),
2056
- head: (await this.head())[0]
2177
+ head: headBlock[0]
2057
2178
  };
2058
2179
  }
2059
2180
  async getCurrentHead() {