@xyo-network/xl1-protocol-sdk 2.2.0 → 2.2.2

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 (67) 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/ProviderFactory.d.ts.map +1 -1
  4. package/dist/neutral/CreatableProvider/ProviderFactoryLocator.d.ts.map +1 -1
  5. package/dist/neutral/amount/index.d.ts +1 -1
  6. package/dist/neutral/amount/splitOnDecimalToString.d.ts.map +1 -1
  7. package/dist/neutral/amount/{XL1Amount.d.ts → xl1Amount.d.ts} +1 -1
  8. package/dist/neutral/amount/{XL1Amount.d.ts.map → xl1Amount.d.ts.map} +1 -1
  9. package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -1
  10. package/dist/neutral/block/hydrate/tryHydrateBlock.d.ts.map +1 -1
  11. package/dist/neutral/block/primitives/hashFromBlockNumber.d.ts.map +1 -1
  12. package/dist/neutral/block/primitives/validateTransactionOpcodes.d.ts.map +1 -1
  13. package/dist/neutral/config/adaptLegacyConfig.d.ts.map +1 -1
  14. package/dist/neutral/createDeclarationPayload.d.ts.map +1 -1
  15. package/dist/neutral/createTransferPayload.d.ts.map +1 -1
  16. package/dist/neutral/getFileConfig.d.ts.map +1 -1
  17. package/dist/neutral/getFileConfig.mjs +2 -1
  18. package/dist/neutral/getFileConfig.mjs.map +2 -2
  19. package/dist/neutral/index.mjs +398 -278
  20. package/dist/neutral/index.mjs.map +4 -4
  21. package/dist/neutral/model/CreatableProviderContext.zod.d.ts.map +1 -1
  22. package/dist/neutral/primitives/chain/step/chainStepRewardAddress.d.ts.map +1 -1
  23. package/dist/neutral/primitives/chain/step/stepRewardTotal.d.ts.map +1 -1
  24. package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts → externalBlockNumberFromXl1BlockNumber.d.ts} +1 -1
  25. package/dist/neutral/primitives/chain/time/{externalBlockNumberFromXL1BlockNumber.d.ts.map → externalBlockNumberFromXl1BlockNumber.d.ts.map} +1 -1
  26. package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts → externalBlockRangeFromXl1BlockRange.d.ts} +1 -1
  27. package/dist/neutral/primitives/chain/time/{externalBlockRangeFromXL1BlockRange.d.ts.map → externalBlockRangeFromXl1BlockRange.d.ts.map} +1 -1
  28. package/dist/neutral/primitives/chain/time/index.d.ts +2 -2
  29. package/dist/neutral/primitives/datalake/PayloadLocator.d.ts.map +1 -1
  30. package/dist/neutral/primitives/datalake/addDataLakePayloadsToPayloads.d.ts.map +1 -1
  31. package/dist/neutral/primitives/readPayloadMapFromStore.d.ts.map +1 -1
  32. package/dist/neutral/primitives/stake/activeStakeAtTimeByAddress.d.ts.map +1 -1
  33. package/dist/neutral/primitives/stake/activeStakeAtTimeByPosition.d.ts.map +1 -1
  34. package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts.map +1 -1
  35. package/dist/neutral/primitives/state/findMostRecentBlock.d.ts.map +1 -1
  36. package/dist/neutral/primitives/uncle/findUncles.d.ts.map +1 -1
  37. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +3 -6
  38. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts.map +1 -1
  39. package/dist/neutral/simple/block/SimpleBlockViewer.d.ts.map +1 -1
  40. package/dist/neutral/simple/blockInvalidation/SimpleBlockInvalidationViewer.d.ts.map +1 -1
  41. package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts.map +1 -1
  42. package/dist/neutral/simple/datalake/AbstractRestDataLake.d.ts.map +1 -1
  43. package/dist/neutral/simple/datalake/RestDataLakeRunner.d.ts.map +1 -1
  44. package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts.map +1 -1
  45. package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts.map +1 -1
  46. package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts.map +1 -1
  47. package/dist/neutral/simple/gateway/SimpleXyoGatewayRunner.d.ts.map +1 -1
  48. package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts.map +1 -1
  49. package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts +2 -0
  50. package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts.map +1 -1
  51. package/dist/neutral/simple/network/SimpleXyoNetwork.d.ts.map +1 -1
  52. package/dist/neutral/simple/timeSync2/SimpleTimeSyncViewer.d.ts.map +1 -1
  53. package/dist/neutral/simple/transactionInvalidation/SimpleTransactionInvalidationViewer.d.ts.map +1 -1
  54. package/dist/neutral/simple/transactionValidation/SimpleTransactionValidationViewer.d.ts.map +1 -1
  55. package/dist/neutral/summary/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -1
  56. package/dist/neutral/test/buildBlock.d.ts.map +1 -1
  57. package/dist/neutral/test/buildRandomChain.d.ts.map +1 -1
  58. package/dist/neutral/test/buildRandomGenesisBlock.d.ts.map +1 -1
  59. package/dist/neutral/test/buildRandomTransaction.d.ts.map +1 -1
  60. package/dist/neutral/test/createProducerChainStakeIntentTransaction.d.ts.map +1 -1
  61. package/dist/neutral/test/index.mjs +140 -88
  62. package/dist/neutral/test/index.mjs.map +3 -3
  63. package/dist/neutral/transaction/buildTransaction.d.ts.map +1 -1
  64. package/dist/neutral/transaction/buildUnsignedTransaction.d.ts.map +1 -1
  65. package/dist/neutral/transaction/confirmSubmittedTransaction.d.ts.map +1 -1
  66. package/dist/neutral/transaction/hydrateTransaction.d.ts.map +1 -1
  67. package/package.json +8 -8
@@ -27,11 +27,13 @@ var splitOnDecimalToString = (value, places = 18, maxDecimal = places, maxCharac
27
27
  const wholeCharacters = whole.toString(10).length;
28
28
  const calcMaxDecimalCharacters = maxCharacters === -1 ? places : wholeCharacters > maxCharacters ? 0 : maxCharacters - wholeCharacters;
29
29
  const maxDecimalCharacters = Math.min(maxDecimal, calcMaxDecimalCharacters);
30
- const formattedWhole = new Intl.NumberFormat(locale, {
30
+ const wholeFormatter = new Intl.NumberFormat(locale, {
31
31
  maximumFractionDigits: 0,
32
32
  useGrouping: true
33
- }).format(whole);
34
- const decimalSeparator = new Intl.NumberFormat(locale).formatToParts(1.1).find((part) => part.type === "decimal")?.value ?? ".";
33
+ });
34
+ const formattedWhole = wholeFormatter.format(whole);
35
+ const decimalFormatter = new Intl.NumberFormat(locale);
36
+ const decimalSeparator = decimalFormatter.formatToParts(1.1).find((part) => part.type === "decimal")?.value ?? ".";
35
37
  let paddedDecimal = decimal.toString().padStart(places, "0").slice(0, maxDecimalCharacters);
36
38
  while (paddedDecimal.length > minDecimals && paddedDecimal.endsWith("0")) {
37
39
  paddedDecimal = paddedDecimal.slice(0, -1);
@@ -54,7 +56,7 @@ var ShiftedBigInt = class _ShiftedBigInt {
54
56
  this.value = typeof value === "bigint" ? value : value.value;
55
57
  this.config = {
56
58
  ..._ShiftedBigInt.defaultConfig,
57
- ...typeof value === "bigint" ? {} : value.config,
59
+ ...typeof value !== "bigint" && value.config,
58
60
  ...config
59
61
  };
60
62
  }
@@ -98,7 +100,7 @@ var ShiftedBigInt = class _ShiftedBigInt {
98
100
  }
99
101
  };
100
102
 
101
- // src/amount/XL1Amount.ts
103
+ // src/amount/xl1Amount.ts
102
104
  import { assertEx } from "@xylabs/sdk-js";
103
105
  import {
104
106
  AttoXL1,
@@ -170,7 +172,7 @@ var XL1Amount = class _XL1Amount {
170
172
  }
171
173
  toString(places = Number(XL1Places.atto), config = {}) {
172
174
  assertEx(allowedPlaces.includes(BigInt(places)), () => `Invalid conversion places (${places} not in ${allowedPlaces.join(", ")})`);
173
- return new ShiftedBigInt(
175
+ const shifted = new ShiftedBigInt(
174
176
  this.value,
175
177
  {
176
178
  places,
@@ -180,7 +182,8 @@ var XL1Amount = class _XL1Amount {
180
182
  maxCharacters: places,
181
183
  ...config
182
184
  }
183
- ).toShortString();
185
+ );
186
+ return shifted.toShortString();
184
187
  }
185
188
  };
186
189
 
@@ -214,10 +217,11 @@ import { isUndefined } from "@xylabs/sdk-js";
214
217
  import { isAnyPayload, PayloadBuilder } from "@xyo-network/sdk-js";
215
218
  async function addDataLakePayloadsToPayloads(hashes, payloads, dataLakeViewer) {
216
219
  if (isUndefined(dataLakeViewer)) return [payloads, []];
217
- const missingPayloadHashes = hashes.filter((hash) => !payloads.some((p) => p._hash === hash));
218
- const payloadsFromDataLake = await PayloadBuilder.addHashMeta(
219
- await PayloadBuilder.addHashMeta((await dataLakeViewer.get(missingPayloadHashes)).filter(isAnyPayload))
220
- );
220
+ const missingPayloadHashes = hashes.filter((hash) => payloads.every((p) => p._hash !== hash));
221
+ const dataLakeResults = await dataLakeViewer.get(missingPayloadHashes);
222
+ const filteredDataLakePayloads = dataLakeResults.filter(isAnyPayload);
223
+ const payloadsWithHashMeta = await PayloadBuilder.addHashMeta(filteredDataLakePayloads);
224
+ const payloadsFromDataLake = await PayloadBuilder.addHashMeta(payloadsWithHashMeta);
221
225
  return [[...payloads, ...payloadsFromDataLake], payloadsFromDataLake.map((p) => p._hash)];
222
226
  }
223
227
 
@@ -280,10 +284,7 @@ var PayloadLocator = class {
280
284
  const buckets = hashes.map(() => []);
281
285
  for (const dl of this.datalakes) {
282
286
  const fetched = await Promise.all(hashes.map(async (h) => await this.fetchOne(dl, h)));
283
- for (const [i, p] of fetched.entries()) {
284
- if (isUndefined2(p)) continue;
285
- buckets[i].push({ payload: p, source: dl.name });
286
- }
287
+ collectFetchedIntoBuckets(fetched, dl, buckets);
287
288
  }
288
289
  for (const [i, h] of hashes.entries()) result.set(h, buckets[i]);
289
290
  return result;
@@ -297,16 +298,27 @@ var PayloadLocator = class {
297
298
  const needHashes = [];
298
299
  for (const h of hashes) if (remaining.has(h)) needHashes.push(h);
299
300
  const fetched = await Promise.all(needHashes.map(async (h) => await this.fetchOne(dl, h)));
300
- for (const [i, h] of needHashes.entries()) {
301
- const p = fetched[i];
302
- if (isUndefined2(p)) continue;
303
- result.set(h, { payload: p, source: dl.name });
304
- remaining.delete(h);
305
- }
301
+ collectFirstFetched(needHashes, fetched, dl, result, remaining);
306
302
  }
307
303
  return result;
308
304
  }
309
305
  };
306
+ function collectFetchedIntoBuckets(fetched, dl, buckets) {
307
+ for (const [i, p] of fetched.entries()) {
308
+ if (!isUndefined2(p)) {
309
+ buckets[i].push({ payload: p, source: dl.name });
310
+ }
311
+ }
312
+ }
313
+ function collectFirstFetched(needHashes, fetched, dl, result, remaining) {
314
+ for (const [i, h] of needHashes.entries()) {
315
+ const p = fetched[i];
316
+ if (!isUndefined2(p)) {
317
+ result.set(h, { payload: p, source: dl.name });
318
+ remaining.delete(h);
319
+ }
320
+ }
321
+ }
310
322
 
311
323
  // src/block/hydrate/BoundWitnessHydrator.ts
312
324
  var DEFAULT_CACHE_MAX = 5e3;
@@ -629,15 +641,18 @@ var hydrateBlock = async (context, hash, maxDepth = 1, minDepth = maxDepth) => {
629
641
  assertEx5(block, () => `block ${hash} not found`)
630
642
  ), () => `hash ${hash} is not a BlockBoundWitness`);
631
643
  if (maxDepth === 0) return [bw, []];
632
- const blkPayloads = (await chainMap.get(bw.payload_hashes)).map((p) => asAnyPayload(p, true));
644
+ const blockPayloadResults = await chainMap.get(bw.payload_hashes);
645
+ const blkPayloads = blockPayloadResults.map((p) => asAnyPayload(p, true));
633
646
  if (minDepth === 1) assertEx5(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`);
634
647
  if (maxDepth === 1) return [bw, blkPayloads];
635
648
  const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta);
636
649
  const transactionsPayloadHashes = transactions.flatMap((tx) => tx.payload_hashes);
637
- const transactionsPayloads = (await chainMap.get(transactionsPayloadHashes)).map((p) => asAnyPayload(p, true));
650
+ const transactionPayloadResults = await chainMap.get(transactionsPayloadHashes);
651
+ const transactionsPayloads = transactionPayloadResults.map((p) => asAnyPayload(p, true));
638
652
  assertEx5(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`);
639
653
  const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap((p) => p._hash));
640
- const allPayloads = (await chainMap.get([...allPayloadsHashes])).map((p) => asAnyPayload(p, true));
654
+ const allPayloadResults = await chainMap.get([...allPayloadsHashes]);
655
+ const allPayloads = allPayloadResults.map((p) => asAnyPayload(p, true));
641
656
  const allPayloadsFiltered = allPayloads.filter((p) => allPayloadsHashes.has(p._hash));
642
657
  if (maxDepth === 2) assertEx5(allHashesPresent(
643
658
  [...allPayloadsHashes],
@@ -657,7 +672,8 @@ import { assertEx as assertEx6 } from "@xylabs/sdk-js";
657
672
  import { isBlockBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta as isTransactionBoundWitnessWithStorageMeta2 } from "@xyo-network/xl1-protocol-lib";
658
673
  var tryHydrateBlock = async (archivist, hash, maxDepth = 1) => {
659
674
  assertEx6(maxDepth >= 0, () => "maxDepth must be greater than or equal to 0");
660
- const bw = (await archivist.get([hash])).find(isBlockBoundWitnessWithStorageMeta);
675
+ const archivistResults = await archivist.get([hash]);
676
+ const bw = archivistResults.find(isBlockBoundWitnessWithStorageMeta);
661
677
  if (!bw) return void 0;
662
678
  if (maxDepth === 0) return [bw, []];
663
679
  const blkPayloads = await archivist.get(bw.payload_hashes);
@@ -720,7 +736,7 @@ async function withContextCacheResponse(context, name, key, func, { max = 1e4 }
720
736
  // src/block/primitives/blockFromBlockNumber.ts
721
737
  async function blockFromBlockNumber(context, blockNumber) {
722
738
  return await spanAsync("blockFromBlockNumber", async () => {
723
- const cacheKey = `${blockNumber}`;
739
+ const cacheKey = String(blockNumber);
724
740
  const { chainMap, head } = context;
725
741
  return await withContextCacheResponse(context, "blockFromBlockNumber", cacheKey, async () => {
726
742
  const [result] = await chainMap.get([head._hash]);
@@ -818,7 +834,8 @@ function deepCalculateFramesFromRange(range, startingStep = StepSizes2.length -
818
834
 
819
835
  // src/block/primitives/hashFromBlockNumber.ts
820
836
  async function hashFromBlockNumber(context, blockNumber) {
821
- return (await blockFromBlockNumber(context, blockNumber))._hash;
837
+ const block = await blockFromBlockNumber(context, blockNumber);
838
+ return block._hash;
822
839
  }
823
840
 
824
841
  // src/block/primitives/model.ts
@@ -847,35 +864,41 @@ import {
847
864
  PayloadBuilder as PayloadBuilder3
848
865
  } from "@xyo-network/sdk-js";
849
866
  import { isExecutable } from "@xyo-network/xl1-protocol-lib";
867
+ async function processElevateOperation(opCode, args, txBw, txPayloads) {
868
+ const [hash, ...rest] = args;
869
+ const txPayloadsWithStorageMeta = await PayloadBuilder3.addStorageMeta(txPayloads);
870
+ assertEx7(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Too many Arguments`);
871
+ if (isHash(hash)) {
872
+ assertEx7(
873
+ txBw.payload_hashes.includes(hash),
874
+ () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Hash not in payload hashes => ${toSafeJsonString2(txBw, 20)}`
875
+ );
876
+ return assertEx7(
877
+ txPayloadsWithStorageMeta.find((p) => p._hash === hash),
878
+ () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Payload not found`
879
+ );
880
+ }
881
+ throw new Error(`Invalid elevate operation ${opCode} ${args.join(", ")} - Invalid hash`);
882
+ }
883
+ async function processOperation(opCode, args, txBw, txPayloads) {
884
+ switch (opCode) {
885
+ case "elevate": {
886
+ return await processElevateOperation(opCode, args, txBw, txPayloads);
887
+ }
888
+ default: {
889
+ throw new Error(`Invalid opCode ${opCode}`);
890
+ }
891
+ }
892
+ }
850
893
  async function validateTransactionsOpcodes(txs) {
851
894
  const txElevatedPayloads = [];
852
895
  for (const [txBw, txPayloads] of txs) {
853
896
  if (isExecutable(txBw)) {
854
897
  const operations = txBw.script.map((op) => op.split("|"));
855
898
  for (const [opCode, ...args] of operations) {
856
- switch (opCode) {
857
- case "elevate": {
858
- const [hash, ...rest] = args;
859
- const txPayloadsWithStorageMeta = await PayloadBuilder3.addStorageMeta(txPayloads);
860
- assertEx7(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Too many Arguments`);
861
- if (isHash(hash)) {
862
- assertEx7(
863
- txBw.payload_hashes.includes(hash),
864
- () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Hash not in payload hashes => ${toSafeJsonString2(txBw, 20)}`
865
- );
866
- const txPayload = assertEx7(
867
- txPayloadsWithStorageMeta.find((p) => p._hash === hash),
868
- () => `Invalid elevate operation ${opCode} ${args.join(", ")} - Payload not found`
869
- );
870
- txElevatedPayloads.push(txPayload);
871
- } else {
872
- throw new Error(`Invalid elevate operation ${opCode} ${args.join(", ")} - Invalid hash`);
873
- }
874
- break;
875
- }
876
- default: {
877
- throw new Error(`Invalid opCode ${opCode}`);
878
- }
899
+ const txPayload = await processOperation(opCode, args, txBw, txPayloads);
900
+ if (txPayload !== void 0) {
901
+ txElevatedPayloads.push(txPayload);
879
902
  }
880
903
  }
881
904
  }
@@ -893,7 +916,7 @@ function backingsSatisfied(required, available) {
893
916
  }
894
917
  function unmetBackings(required, available) {
895
918
  return required.filter((need) => {
896
- return !available.some((a) => a.backing === need.backing && (a.mode === "write" || need.mode === "read"));
919
+ return available.every((a) => !(a.backing === need.backing && (a.mode === "write" || need.mode === "read")));
897
920
  });
898
921
  }
899
922
 
@@ -914,7 +937,7 @@ var CapabilityRegistry = class {
914
937
  }
915
938
  toJson() {
916
939
  const result = {};
917
- for (const [id, cap] of this._entries.entries()) {
940
+ for (const [id, cap] of this._entries) {
918
941
  const { id: _, ...rest } = cap;
919
942
  result[id] = rest;
920
943
  }
@@ -1024,7 +1047,7 @@ function resolveProviders(needs, candidates, ctx, options = {}) {
1024
1047
  const rejected = [...backingRejected, ...preconditionRejected];
1025
1048
  const byCapability = groupByCapability(surviving, wanted);
1026
1049
  const { bindings, selectedById } = pickWinners(wanted, byCapability, rejected, candidates, options);
1027
- const selected = topoSort([...selectedById.values()], ctx);
1050
+ const selected = topoSort(selectedById.values().toArray(), ctx);
1028
1051
  return {
1029
1052
  bindings,
1030
1053
  rejected,
@@ -1083,15 +1106,20 @@ function filterByPreconditions(candidates, ctx) {
1083
1106
  }
1084
1107
  return { surviving, rejected };
1085
1108
  }
1109
+ function addDescriptorCapabilities(byCapability, descriptor, wanted) {
1110
+ for (const moniker of descriptor.satisfies) {
1111
+ if (!wanted.has(moniker)) {
1112
+ continue;
1113
+ }
1114
+ const list = byCapability.get(moniker) ?? [];
1115
+ list.push(descriptor);
1116
+ byCapability.set(moniker, list);
1117
+ }
1118
+ }
1086
1119
  function groupByCapability(surviving, wanted) {
1087
1120
  const byCapability = /* @__PURE__ */ new Map();
1088
1121
  for (const descriptor of surviving) {
1089
- for (const moniker of descriptor.satisfies) {
1090
- if (!wanted.has(moniker)) continue;
1091
- const list = byCapability.get(moniker) ?? [];
1092
- list.push(descriptor);
1093
- byCapability.set(moniker, list);
1094
- }
1122
+ addDescriptorCapabilities(byCapability, descriptor, wanted);
1095
1123
  }
1096
1124
  return byCapability;
1097
1125
  }
@@ -1101,7 +1129,7 @@ function pickWinners(wanted, byCapability, rejected, allCandidates, options) {
1101
1129
  for (const moniker of wanted) {
1102
1130
  let group = byCapability.get(moniker);
1103
1131
  const pinned = options.implementations?.[moniker];
1104
- if (pinned) {
1132
+ if (pinned !== void 0 && pinned !== "") {
1105
1133
  const pinnedGroup = group?.filter((descriptor) => descriptor.id === pinned);
1106
1134
  if (!pinnedGroup || pinnedGroup.length === 0) {
1107
1135
  throw new MissingCapabilityError(moniker, [`requested implementation '${pinned}' not available`]);
@@ -1683,7 +1711,9 @@ var DEFAULT_MAX_ATTEMPTS = 10;
1683
1711
  var calculateTimeRate = async (viewer, timeConfig, startBlockNumber, timeUnit, toleranceMs = DEFAULT_TOLERANCE_MS, maxAttempts = DEFAULT_MAX_ATTEMPTS) => {
1684
1712
  assertEx10(Object.keys(timeConfig ?? {}).length === 1, () => "Only one time unit should be specified in timeConfig");
1685
1713
  const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null;
1686
- const resolvedStartBlock = isDefinedNotNull(startBlock) ? startBlock[0] : (await viewer.currentBlock())[0];
1714
+ const currentBlockResult = await viewer.currentBlock();
1715
+ const blockResult = isDefinedNotNull(startBlock) ? startBlock : currentBlockResult;
1716
+ const resolvedStartBlock = blockResult[0];
1687
1717
  const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig);
1688
1718
  assertEx10(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
1689
1719
  const blocksPerMillisecondRate = 1 / (12 * 1e3);
@@ -1847,7 +1877,9 @@ async function chainStepRewardAddress(context, blockViewer, { block, step }) {
1847
1877
  const [transferIndex, transferCount] = stepTransferIndex(block, step);
1848
1878
  const [blockBw, payloads] = hydratedBlock;
1849
1879
  const transfersFromPool = payloads.filter(isTransfer).map((p) => asTransfer(p)).filter(exists).filter((t) => t.from === XYO_STEP_REWARD_ADDRESS);
1850
- const fromEntries = Object.entries(mergeTransfers(transfersFromPool)[XYO_STEP_REWARD_ADDRESS]);
1880
+ const mergedTransfers = mergeTransfers(transfersFromPool);
1881
+ const rewardEntry = Object.entries(mergedTransfers).find(([address]) => address === XYO_STEP_REWARD_ADDRESS);
1882
+ const fromEntries = Object.entries(rewardEntry?.[1] ?? {});
1851
1883
  const sortedTransferAmounts = fromEntries.toSorted(([, a], [, b]) => a > b ? -1 : a < b ? 1 : 0);
1852
1884
  assertEx14(
1853
1885
  sortedTransferAmounts.length === transferCount,
@@ -1959,8 +1991,10 @@ async function stepRewardTotal(context, blockViewer, { block, step }, multiplier
1959
1991
  payloads.find((p) => isTransfer5(p) && p.from === XYO_STEP_REWARD_ADDRESS2),
1960
1992
  () => `No step transfer found for step ${step} at block ${block} (${blockBw._hash})`
1961
1993
  );
1994
+ const netTransfers = netTransfersForPayloads(context, [stepTransfer]);
1995
+ const rewardEntry = Object.entries(netTransfers).find(([address]) => address === XYO_STEP_REWARD_ADDRESS2);
1962
1996
  const rewards = assertEx15(
1963
- netTransfersForPayloads(context, [stepTransfer])[XYO_STEP_REWARD_ADDRESS2],
1997
+ rewardEntry?.[1],
1964
1998
  () => `No rewards found for step reward address ${XYO_STEP_REWARD_ADDRESS2} at block ${block} (${blockBw._hash})`
1965
1999
  );
1966
2000
  const sortedTransfers = Object.entries(rewards).toSorted(([, a], [, b]) => a > b ? -1 : a < b ? 1 : 0);
@@ -2001,7 +2035,7 @@ async function stepsRewardTotal(context, blockViewer, steps, multipliers) {
2001
2035
  return asAttoXL12(totalRewards);
2002
2036
  }
2003
2037
 
2004
- // src/primitives/chain/time/externalBlockNumberFromXL1BlockNumber.ts
2038
+ // src/primitives/chain/time/externalBlockNumberFromXl1BlockNumber.ts
2005
2039
  import { assertEx as assertEx16, isArray } from "@xylabs/sdk-js";
2006
2040
  import {
2007
2041
  asBlockNumber,
@@ -2022,7 +2056,7 @@ async function externalBlockNumberFromXL1BlockNumber(context, blockViewer, xl1Bl
2022
2056
  });
2023
2057
  }
2024
2058
 
2025
- // src/primitives/chain/time/externalBlockRangeFromXL1BlockRange.ts
2059
+ // src/primitives/chain/time/externalBlockRangeFromXl1BlockRange.ts
2026
2060
  async function externalBlockRangeFromXL1BlockRange(context, blockViewer, xl1BlockRange, externalTimeName = "ethereum") {
2027
2061
  const start = await externalBlockNumberFromXL1BlockNumber(context, blockViewer, xl1BlockRange[0], externalTimeName);
2028
2062
  const end = await externalBlockNumberFromXL1BlockNumber(context, blockViewer, xl1BlockRange[1], externalTimeName);
@@ -2078,13 +2112,15 @@ function readPayloadMapFromStore(store) {
2078
2112
  if (isReadArchivist(store)) {
2079
2113
  return {
2080
2114
  get: async (hash) => {
2081
- return (await store.get([hash]))[0];
2115
+ const results = await store.get([hash]);
2116
+ return results[0];
2082
2117
  },
2083
2118
  getMany: async (hashes) => {
2084
2119
  return await store.get(hashes);
2085
2120
  },
2086
2121
  has: async (hash) => {
2087
- return isDefined12((await store.get([hash]))[0]);
2122
+ const results = await store.get([hash]);
2123
+ return isDefined12(results[0]);
2088
2124
  }
2089
2125
  };
2090
2126
  }
@@ -2094,13 +2130,15 @@ function payloadMapFromStore(store) {
2094
2130
  if (isReadWriteArchivist(store)) {
2095
2131
  return {
2096
2132
  get: async (hash) => {
2097
- return (await store.get([hash]))[0];
2133
+ const results = await store.get([hash]);
2134
+ return results[0];
2098
2135
  },
2099
2136
  getMany: async (hashes) => {
2100
2137
  return await store.get(hashes);
2101
2138
  },
2102
2139
  has: async (hash) => {
2103
- return isDefined12((await store.get([hash]))[0]);
2140
+ const results = await store.get([hash]);
2141
+ return isDefined12(results[0]);
2104
2142
  },
2105
2143
  clear: async () => {
2106
2144
  return await store.clear();
@@ -2160,7 +2198,8 @@ async function mergedAddRemoveStakeEventsByStaker(chainEvents, range, staked, st
2160
2198
 
2161
2199
  // src/primitives/stake/activeStakeAtTimeByAddress.ts
2162
2200
  async function activeStakeAtTimeByAddress(chain, staked, time, staker) {
2163
- const stakeEvents = (await mergedAddRemoveStakeEventsByStaker(chain, [0, time], staked, staker)).toSorted((a, b) => a.time - b.time);
2201
+ const mergedEvents = await mergedAddRemoveStakeEventsByStaker(chain, [0, time], staked, staker);
2202
+ const stakeEvents = mergedEvents.toSorted((a, b) => a.time - b.time);
2164
2203
  let result = 0n;
2165
2204
  for (const event of stakeEvents) {
2166
2205
  if (event.time > time) break;
@@ -2190,7 +2229,8 @@ async function mergedAddRemoveStakeEventsByPosition(chainEvents, range, position
2190
2229
 
2191
2230
  // src/primitives/stake/activeStakeAtTimeByPosition.ts
2192
2231
  async function activeStakeAtTimeByPosition(chainStakeEvents, externalTime, position) {
2193
- const stakeEvents = (await mergedAddRemoveStakeEventsByPosition(chainStakeEvents, [0, externalTime], position)).toSorted((a, b) => a.time - b.time);
2232
+ const mergedEvents = await mergedAddRemoveStakeEventsByPosition(chainStakeEvents, [0, externalTime], position);
2233
+ const stakeEvents = mergedEvents.toSorted((a, b) => a.time - b.time);
2194
2234
  let result = 0n;
2195
2235
  for (const event of stakeEvents) {
2196
2236
  if (event.time > externalTime) break;
@@ -2245,16 +2285,17 @@ async function weightedStakeForRangeByPosition(context, blockViewer, stakeEvents
2245
2285
  return await withContextCacheResponse(context, "weightedStakeForRangeByPosition", cacheKey, async () => {
2246
2286
  let weightedStakeSum = 0n;
2247
2287
  if (isDefined14(positionId)) {
2248
- const mergedEvents = (await mergedAddRemoveStakeEventsByPosition(
2288
+ const mergedEventsResult = await mergedAddRemoveStakeEventsByPosition(
2249
2289
  stakeEventsViewer,
2250
2290
  [0, externalRange[1]],
2251
2291
  positionId
2252
- )).toSorted((a, b) => a.time - b.time);
2253
- let currentTime = externalRange[0];
2254
- let currentStake = 0n;
2292
+ );
2293
+ const mergedEvents = mergedEventsResult.toSorted((a, b) => a.time - b.time);
2255
2294
  if (isDefined14(staked) && mergedEvents.at(0)?.args.staked !== staked) {
2256
2295
  return 0n;
2257
2296
  }
2297
+ let currentTime = externalRange[0];
2298
+ let currentStake = 0n;
2258
2299
  for (const event of mergedEvents) {
2259
2300
  if (event.time > currentTime) {
2260
2301
  weightedStakeSum += currentStake * BigInt(event.time - currentTime);
@@ -2299,7 +2340,7 @@ async function networkStakeStepRewardPositionWeight(context, blockViewer, stakeE
2299
2340
  // src/primitives/state/findMostRecentBlock.ts
2300
2341
  import { isSignedBlockBoundWitnessWithStorageMeta } from "@xyo-network/xl1-protocol-lib";
2301
2342
  var DEFAULT_NEXT_OPTIONS = { limit: 50 };
2302
- var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations = Number.POSITIVE_INFINITY) => {
2343
+ var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTIONS, maxIterations = Infinity) => {
2303
2344
  let mostRecentBlock;
2304
2345
  let cursor;
2305
2346
  let batch;
@@ -2315,9 +2356,8 @@ var findMostRecentBlock = async (chainArchivist, nextOptions = DEFAULT_NEXT_OPTI
2315
2356
  if (last) {
2316
2357
  mostRecentBlock = last;
2317
2358
  break;
2318
- } else {
2319
- cursor = batch.at(-1)?._sequence;
2320
2359
  }
2360
+ cursor = batch.at(-1)?._sequence;
2321
2361
  iterations = iterations + 1;
2322
2362
  } while (batch.length > 0 && iterations < maxIterations);
2323
2363
  return mostRecentBlock;
@@ -2330,7 +2370,7 @@ async function hydratedBlockByNumber(context, blockNumber) {
2330
2370
  if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`);
2331
2371
  if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`);
2332
2372
  if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`);
2333
- const cacheKey = `${blockNumber}`;
2373
+ const cacheKey = String(blockNumber);
2334
2374
  return await withContextCacheResponse(context, "hydratedBlockByNumber", cacheKey, async () => {
2335
2375
  const block = assertEx17(
2336
2376
  await blockFromBlockNumber(context, blockNumber),
@@ -2343,7 +2383,7 @@ async function hydratedBlockByNumber(context, blockNumber) {
2343
2383
 
2344
2384
  // src/primitives/uncle/getProducerKey.ts
2345
2385
  function getProducerKey(block) {
2346
- return block[0].addresses.toSorted().join(",");
2386
+ return block[0].addresses.toSorted((a, b) => a.localeCompare(b)).join(",");
2347
2387
  }
2348
2388
 
2349
2389
  // src/primitives/uncle/scoreUncle.ts
@@ -2352,7 +2392,7 @@ function scoreUncle(finalizedWindowedChain, blocks) {
2352
2392
  if (blocks.length === 0) return 0;
2353
2393
  let score = blocks.length;
2354
2394
  const head = finalizedWindowedChain.at(-1);
2355
- if (head && blocks[0]) {
2395
+ if (head !== void 0 && blocks[0] !== void 0) {
2356
2396
  const headProducer = getProducerKey(head);
2357
2397
  const candidateProducer = getProducerKey(blocks[0]);
2358
2398
  if (headProducer !== candidateProducer) {
@@ -2387,6 +2427,19 @@ import {
2387
2427
  exists as exists2
2388
2428
  } from "@xylabs/sdk-js";
2389
2429
  import { isTransactionBoundWitness as isTransactionBoundWitness2 } from "@xyo-network/xl1-protocol-lib";
2430
+ function extendUncleChain(block, map) {
2431
+ const uncle = [block];
2432
+ let previous = block[0].previous ? map.get(block[0].previous) : void 0;
2433
+ while (previous) {
2434
+ if (previous[0].block === uncle[0][0].block - 1) {
2435
+ uncle.unshift(previous);
2436
+ previous = previous[0].previous ? map.get(previous[0].previous) : void 0;
2437
+ } else {
2438
+ return [];
2439
+ }
2440
+ }
2441
+ return uncle;
2442
+ }
2390
2443
  function blocksToChains(blocks) {
2391
2444
  const chains = [];
2392
2445
  const map = /* @__PURE__ */ new Map();
@@ -2394,17 +2447,7 @@ function blocksToChains(blocks) {
2394
2447
  map.set(block[0]._hash, block);
2395
2448
  }
2396
2449
  for (const block of blocks) {
2397
- let uncle = [block];
2398
- let previous = block[0].previous ? map.get(block[0].previous) : void 0;
2399
- while (previous) {
2400
- if (previous[0].block === uncle[0][0].block - 1) {
2401
- uncle.unshift(previous);
2402
- previous = previous[0].previous ? map.get(previous[0].previous) : void 0;
2403
- } else {
2404
- uncle = [];
2405
- break;
2406
- }
2407
- }
2450
+ const uncle = extendUncleChain(block, map);
2408
2451
  if (uncle.length > 0) {
2409
2452
  chains.push(uncle);
2410
2453
  }
@@ -2590,23 +2633,26 @@ function synthesizeS3Transports(s3) {
2590
2633
  }
2591
2634
  return transports;
2592
2635
  }
2636
+ function hasTransport(transports, key) {
2637
+ return Object.hasOwn(transports, key) && transports[key] !== void 0;
2638
+ }
2593
2639
  function synthesizeProviderBindings(transports) {
2594
2640
  const bindings = {};
2595
- if (transports[DEFAULT_RPC_TRANSPORT]) {
2641
+ if (hasTransport(transports, DEFAULT_RPC_TRANSPORT)) {
2596
2642
  bindings.BlockViewer = { transport: DEFAULT_RPC_TRANSPORT };
2597
2643
  bindings.MempoolViewer = { transport: DEFAULT_RPC_TRANSPORT };
2598
2644
  bindings.FinalizationViewer = { transport: DEFAULT_RPC_TRANSPORT };
2599
2645
  bindings.TransactionViewer = { transport: DEFAULT_RPC_TRANSPORT };
2600
2646
  bindings.AccountBalanceViewer = { transport: DEFAULT_RPC_TRANSPORT };
2601
2647
  }
2602
- if (transports[S3_FINALIZED_TRANSPORT]) {
2648
+ if (hasTransport(transports, S3_FINALIZED_TRANSPORT)) {
2603
2649
  bindings.BlockPublishRunner = { transport: S3_FINALIZED_TRANSPORT };
2604
2650
  }
2605
- if (transports[S3_CHAIN_STATE_TRANSPORT]) {
2651
+ if (hasTransport(transports, S3_CHAIN_STATE_TRANSPORT)) {
2606
2652
  bindings.ChainStateViewer = { transport: S3_CHAIN_STATE_TRANSPORT };
2607
2653
  bindings.ChainStatePublishRunner = { transport: S3_CHAIN_STATE_TRANSPORT };
2608
2654
  }
2609
- if (transports[S3_INDEX_TRANSPORT]) {
2655
+ if (hasTransport(transports, S3_INDEX_TRANSPORT)) {
2610
2656
  bindings.IndexPublishRunner = { transport: S3_INDEX_TRANSPORT };
2611
2657
  }
2612
2658
  return bindings;
@@ -2722,8 +2768,8 @@ import {
2722
2768
  } from "@xylabs/sdk-js";
2723
2769
  import { CachingContextZod } from "@xyo-network/xl1-protocol-lib";
2724
2770
  import { z as z25 } from "zod/mini";
2725
- var RuntimeStatusMonitorZod = z25.custom((val) => val && typeof val === "object");
2726
- var ProviderFactoryLocatorZod = z25.lazy(() => z25.custom((val) => val && typeof val === "object" && "context" in val && "registry" in val));
2771
+ var RuntimeStatusMonitorZod = z25.custom((val) => val !== null && val !== void 0 && typeof val === "object");
2772
+ var ProviderFactoryLocatorZod = z25.lazy(() => z25.custom((val) => val !== null && val !== void 0 && typeof val === "object" && "context" in val && "registry" in val));
2727
2773
  var BaseConfigContextZod = z25.extend(CachingContextZod, {
2728
2774
  config: z25.looseObject(BaseConfigZod.shape),
2729
2775
  locator: z25.optional(ProviderFactoryLocatorZod)
@@ -2771,7 +2817,9 @@ var hydratedBlockToPayloadBundle = (transaction) => {
2771
2817
  };
2772
2818
  var bundle = (root, transaction) => {
2773
2819
  const payloads = flattenHydratedBlock(transaction).flatMap((p) => PayloadBuilder6.omitStorageMeta(p));
2774
- return new PayloadBuilder6({ schema: PayloadBundleSchema }).fields({ payloads, root }).build();
2820
+ const payloadBuilder = new PayloadBuilder6({ schema: PayloadBundleSchema });
2821
+ const builder = payloadBuilder.fields({ payloads, root });
2822
+ return builder.build();
2775
2823
  };
2776
2824
 
2777
2825
  // src/model/PayloadBundle/hydratedTransactionToPayloadBundle.ts
@@ -2802,10 +2850,7 @@ async function buildTransaction(chain, onChainPayloads, offChainPayloads, signer
2802
2850
  exp
2803
2851
  };
2804
2852
  const elevatedHashes = await PayloadBuilder7.hashes(onChainPayloads);
2805
- const script = [];
2806
- for (const elevatedHash of elevatedHashes) {
2807
- script.push(`elevate|${elevatedHash}`);
2808
- }
2853
+ const script = Array.from(elevatedHashes, (elevatedHash) => `elevate|${elevatedHash}`);
2809
2854
  const fields = {
2810
2855
  ...txBoundWitnessFields,
2811
2856
  from: from ?? (Array.isArray(signer) ? assertEx19(signer.at(0)?.address) : signer.address)
@@ -2813,7 +2858,9 @@ async function buildTransaction(chain, onChainPayloads, offChainPayloads, signer
2813
2858
  if (script.length > 0) {
2814
2859
  fields.script = script;
2815
2860
  }
2816
- const [tx, txPayloads] = await new BoundWitnessBuilder().fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]).signers(Array.isArray(signer) ? signer : [signer]).build();
2861
+ const boundWitnessBuilder = new BoundWitnessBuilder();
2862
+ const builder = boundWitnessBuilder.fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]).signers(Array.isArray(signer) ? signer : [signer]);
2863
+ const [tx, txPayloads] = await builder.build();
2817
2864
  return [await PayloadBuilder7.addHashMeta(tx), await PayloadBuilder7.addHashMeta(txPayloads.map((p) => asAnyPayload2(p, true)))];
2818
2865
  }
2819
2866
 
@@ -2834,10 +2881,7 @@ async function buildUnsignedTransaction(chain, onChainPayloads, offChainPayloads
2834
2881
  exp
2835
2882
  };
2836
2883
  const elevatedHashes = await PayloadBuilder8.hashes(onChainPayloads);
2837
- const script = [];
2838
- for (const elevatedHash of elevatedHashes) {
2839
- script.push(`elevate|${elevatedHash}`);
2840
- }
2884
+ const script = Array.from(elevatedHashes, (elevatedHash) => `elevate|${elevatedHash}`);
2841
2885
  const fields = {
2842
2886
  ...txBoundWitnessFields,
2843
2887
  from
@@ -2845,7 +2889,9 @@ async function buildUnsignedTransaction(chain, onChainPayloads, offChainPayloads
2845
2889
  if (script.length > 0) {
2846
2890
  fields.script = script;
2847
2891
  }
2848
- const [tx, txPayloads] = await new BoundWitnessBuilder2().fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]).build(false);
2892
+ const boundWitnessBuilder = new BoundWitnessBuilder2();
2893
+ const builder = boundWitnessBuilder.fields(fields).meta({ $signatures: [] }).payloads([...onChainPayloads, ...offChainPayloads]);
2894
+ const [tx, txPayloads] = await builder.build(false);
2849
2895
  return [tx, txPayloads];
2850
2896
  }
2851
2897
 
@@ -2877,19 +2923,17 @@ var confirmSubmittedTransaction = async (viewer, txHash, options) => {
2877
2923
  if (isDefined16(tx)) {
2878
2924
  options?.logger?.debug("Transaction confirmed", txHash);
2879
2925
  return tx;
2880
- } else {
2881
- if (isNumber(exp)) {
2882
- await assertNotExpired(viewer, txHash, exp, options);
2883
- }
2884
- attempts++;
2885
- if (attempts > maxAttempts) {
2886
- options?.logger?.error(`\u26A0\uFE0F Transaction not confirmed after ${maxAttempts} attempts`);
2887
- throw new Error(`Transaction ${txHash} not confirmed after ${maxAttempts} attempts`);
2888
- } else {
2889
- options?.logger?.debug(`Transaction not confirmed yet, attempt ${attempts}. Retrying...`, txHash);
2890
- await delay(attemptDelay);
2891
- }
2892
2926
  }
2927
+ if (isNumber(exp)) {
2928
+ await assertNotExpired(viewer, txHash, exp, options);
2929
+ }
2930
+ attempts++;
2931
+ if (attempts > maxAttempts) {
2932
+ options?.logger?.error(`\u26A0\uFE0F Transaction not confirmed after ${maxAttempts} attempts`);
2933
+ throw new Error(`Transaction ${txHash} not confirmed after ${maxAttempts} attempts`);
2934
+ }
2935
+ options?.logger?.debug(`Transaction not confirmed yet, attempt ${attempts}. Retrying...`, txHash);
2936
+ await delay(attemptDelay);
2893
2937
  }
2894
2938
  };
2895
2939
 
@@ -2908,9 +2952,7 @@ import {
2908
2952
  var tryHydrateTransaction = async ({ chainMap }, hash) => {
2909
2953
  return await tryHydrateTypedBoundWitness(
2910
2954
  {
2911
- get(hashes) {
2912
- return chainMap.get(hashes);
2913
- },
2955
+ get: (hashes) => chainMap.get(hashes),
2914
2956
  next() {
2915
2957
  throw new Error("Not implemented");
2916
2958
  }
@@ -2922,9 +2964,7 @@ var tryHydrateTransaction = async ({ chainMap }, hash) => {
2922
2964
  var hydrateTransaction = async ({ chainMap }, hash) => {
2923
2965
  return await hydrateTypedBoundWitness(
2924
2966
  {
2925
- get(hashes) {
2926
- return chainMap.get(hashes);
2927
- },
2967
+ get: (hashes) => chainMap.get(hashes),
2928
2968
  next() {
2929
2969
  throw new Error("Not implemented");
2930
2970
  }
@@ -3185,7 +3225,9 @@ var hydratedTransactionToPayloadBundle = (transaction) => {
3185
3225
  };
3186
3226
  var bundle2 = (root, transaction) => {
3187
3227
  const payloads = flattenHydratedTransaction(transaction);
3188
- return new PayloadBuilder12({ schema: PayloadBundleSchema2 }).fields({ payloads, root }).build();
3228
+ const payloadBuilder = new PayloadBuilder12({ schema: PayloadBundleSchema2 });
3229
+ const builder = payloadBuilder.fields({ payloads, root });
3230
+ return builder.build();
3189
3231
  };
3190
3232
 
3191
3233
  // src/context/Actor.ts
@@ -3231,7 +3273,7 @@ var ProviderFactory = class _ProviderFactory {
3231
3273
  get resolvedMoniker() {
3232
3274
  const labels = this.labels ?? {};
3233
3275
  const labelString = Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(",");
3234
- return labelString.length === 0 ? `${this.defaultMoniker}` : `${this.defaultMoniker}|${labelString}`;
3276
+ return labelString.length === 0 ? this.defaultMoniker : `${this.defaultMoniker}|${labelString}`;
3235
3277
  }
3236
3278
  get uniqueId() {
3237
3279
  return this._uniqueId;
@@ -3246,8 +3288,7 @@ var ProviderFactory = class _ProviderFactory {
3246
3288
  let scopeObject;
3247
3289
  switch (this.scope) {
3248
3290
  case "global": {
3249
- globalThis.xyoServiceSingletons ??= {};
3250
- scopeObject = globalThis.xyoServiceSingletons;
3291
+ scopeObject = getOrCreateGlobalSingletons();
3251
3292
  break;
3252
3293
  }
3253
3294
  case "context": {
@@ -3284,6 +3325,15 @@ var ProviderFactory = class _ProviderFactory {
3284
3325
  }
3285
3326
  }
3286
3327
  };
3328
+ function getOrCreateGlobalSingletons() {
3329
+ const existing = globalThis.xyoServiceSingletons;
3330
+ if (existing !== void 0) {
3331
+ return existing;
3332
+ }
3333
+ const singletons = {};
3334
+ Reflect.set(globalThis, "xyoServiceSingletons", singletons);
3335
+ return singletons;
3336
+ }
3287
3337
 
3288
3338
  // src/CreatableProvider/AbstractCreatableProvider.ts
3289
3339
  var AbstractCreatableProvider = class extends AbstractCreatable {
@@ -3469,7 +3519,7 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
3469
3519
  );
3470
3520
  }
3471
3521
  has(moniker) {
3472
- return !!this._registry[moniker];
3522
+ return Object.hasOwn(this._registry, moniker);
3473
3523
  }
3474
3524
  /**
3475
3525
  * Locates a provider factory that matches the supplied moniker and labels
@@ -3486,10 +3536,11 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
3486
3536
  merge(locator) {
3487
3537
  const registry = { ...this.registry };
3488
3538
  for (const moniker in locator.registry) {
3489
- if (registry[moniker]) {
3490
- registry[moniker].push(...locator.registry[moniker] ?? []);
3491
- } else {
3539
+ const existing = registry[moniker];
3540
+ if (existing === void 0) {
3492
3541
  registry[moniker] = locator.registry[moniker];
3542
+ } else {
3543
+ existing.push(...locator.registry[moniker] ?? []);
3493
3544
  }
3494
3545
  }
3495
3546
  return new _ProviderFactoryLocator(this.context, registry);
@@ -3519,13 +3570,13 @@ var ProviderFactoryLocator = class _ProviderFactoryLocator {
3519
3570
  return this;
3520
3571
  }
3521
3572
  registered(moniker) {
3522
- return !!this.registry[moniker] || (this._parent?.registered(moniker) ?? false);
3573
+ return Object.hasOwn(this.registry, moniker) || (this._parent?.registered(moniker) ?? false);
3523
3574
  }
3524
3575
  async tryGetInstance(moniker, { start = true, labels } = {}) {
3525
3576
  const resolvedParams = { context: this.context };
3526
3577
  const factory = this.tryLocate(moniker, labels);
3527
- if (factory) {
3528
- if (this.context.singletons[factory.uniqueId]) {
3578
+ if (factory !== void 0) {
3579
+ if (Object.hasOwn(this.context.singletons, factory.uniqueId)) {
3529
3580
  return this.context.singletons[factory.uniqueId];
3530
3581
  }
3531
3582
  this.logger?.debug(`Creating provider instance for moniker [${moniker}]${labels ? ` with labels [${JSON.stringify(labels)}]` : ""} using factory [${factory.uniqueId.description}]`);
@@ -3593,13 +3644,14 @@ import {
3593
3644
  } from "@xyo-network/xl1-protocol-lib";
3594
3645
  var createDeclarationIntent = (address, intent, nbf, exp) => {
3595
3646
  const expiration = isDefined17(exp) ? exp : nbf + 1e4;
3596
- const redeclarationIntent = new PayloadBuilder13({ schema: ChainStakeIntentSchema }).fields({
3647
+ const payloadBuilder = new PayloadBuilder13({ schema: ChainStakeIntentSchema });
3648
+ const builder = payloadBuilder.fields({
3597
3649
  from: address,
3598
3650
  intent,
3599
3651
  nbf,
3600
3652
  exp: expiration
3601
- }).build();
3602
- return redeclarationIntent;
3653
+ });
3654
+ return builder.build();
3603
3655
  };
3604
3656
 
3605
3657
  // src/createTransferPayload.ts
@@ -3607,12 +3659,14 @@ import { toHex as toHex3 } from "@xylabs/sdk-js";
3607
3659
  import { PayloadBuilder as PayloadBuilder14 } from "@xyo-network/sdk-js";
3608
3660
  import { TransferSchema } from "@xyo-network/xl1-protocol-lib";
3609
3661
  function createTransferPayload(from, transfers, context) {
3610
- return new PayloadBuilder14({ schema: TransferSchema }).fields({
3662
+ const payloadBuilder = new PayloadBuilder14({ schema: TransferSchema });
3663
+ const builder = payloadBuilder.fields({
3611
3664
  epoch: Date.now(),
3612
3665
  from,
3613
3666
  transfers: Object.fromEntries(Object.entries(transfers).map(([k, v]) => [k, toHex3(v)])),
3614
3667
  context
3615
- }).build();
3668
+ });
3669
+ return builder.build();
3616
3670
  }
3617
3671
 
3618
3672
  // src/eip-712/Payloads/EIP712Data.ts
@@ -3746,11 +3800,11 @@ var isPositiveBigInt = (value) => {
3746
3800
  var parseSignedBigInt = (value) => {
3747
3801
  if (isNegativeBigInt(value)) {
3748
3802
  return -hexToBigInt5(value.negative);
3749
- } else if (isPositiveBigInt(value)) {
3803
+ }
3804
+ if (isPositiveBigInt(value)) {
3750
3805
  return hexToBigInt5(value.positive);
3751
- } else {
3752
- throw new Error("Invalid balance type");
3753
3806
  }
3807
+ throw new Error("Invalid balance type");
3754
3808
  };
3755
3809
  var toSignedBigInt = (value) => {
3756
3810
  return value < 0n ? { negative: toHex4(-value) } : { positive: toHex4(value) };
@@ -3867,39 +3921,38 @@ async function balancesStepSummaryFromRange(context, semaphores, blockViewer, su
3867
3921
  const summaryResult = await summaryMap.get(`${frameHead._hash}|${frameSize}`);
3868
3922
  if (isAnyPayload3(summaryResult)) {
3869
3923
  return summaryResult;
3870
- } else {
3871
- await semaphores[step].acquire();
3872
- try {
3873
- const subRanges = deepCalculateFramesFromRange(range, step - 1);
3874
- const promises = subRanges.map((subRange) => balancesStepSummaryFromRange(
3875
- context,
3876
- semaphores,
3877
- blockViewer,
3878
- summaryMap,
3879
- subRange
3880
- ));
3881
- const subResults = await Promise.all(promises);
3882
- const bigIntBalances = {};
3883
- for (const subResult of subResults) {
3884
- for (const [address, balance] of Object.entries(subResult.balances)) {
3885
- bigIntBalances[address] = (bigIntBalances[address] ?? 0n) + parseSignedBigInt(balance);
3886
- }
3887
- }
3888
- const balances = {};
3889
- for (const [address, balance] of Object.entries(bigIntBalances)) {
3890
- balances[address] = toSignedBigInt(balance);
3924
+ }
3925
+ await semaphores[step].acquire();
3926
+ try {
3927
+ const subRanges = deepCalculateFramesFromRange(range, step - 1);
3928
+ const promises = subRanges.map((subRange) => balancesStepSummaryFromRange(
3929
+ context,
3930
+ semaphores,
3931
+ blockViewer,
3932
+ summaryMap,
3933
+ subRange
3934
+ ));
3935
+ const subResults = await Promise.all(promises);
3936
+ const bigIntBalances = {};
3937
+ for (const subResult of subResults) {
3938
+ for (const [address, balance] of Object.entries(subResult.balances)) {
3939
+ bigIntBalances[address] = (bigIntBalances[address] ?? 0n) + parseSignedBigInt(balance);
3891
3940
  }
3892
- const result = {
3893
- schema: BalancesStepSummarySchema,
3894
- hash: frameHead._hash,
3895
- stepSize: frameSize,
3896
- balances
3897
- };
3898
- await summaryMap.set(key, result);
3899
- return result;
3900
- } finally {
3901
- semaphores[step].release();
3902
3941
  }
3942
+ const balances = {};
3943
+ for (const [address, balance] of Object.entries(bigIntBalances)) {
3944
+ balances[address] = toSignedBigInt(balance);
3945
+ }
3946
+ const result = {
3947
+ schema: BalancesStepSummarySchema,
3948
+ hash: frameHead._hash,
3949
+ stepSize: frameSize,
3950
+ balances
3951
+ };
3952
+ await summaryMap.set(key, result);
3953
+ return result;
3954
+ } finally {
3955
+ semaphores[step].release();
3903
3956
  }
3904
3957
  }, { ...context, timeBudgetLimit: 500 });
3905
3958
  }, { ...context, timeBudgetLimit: 500 });
@@ -4254,14 +4307,16 @@ var SimpleAccountBalanceViewer = class extends AbstractCreatableProvider {
4254
4307
  return balances[address] ?? AttoXL13(0n);
4255
4308
  }
4256
4309
  async accountBalanceHistories(addresses, config = {}) {
4257
- return (await this.qualifiedAccountBalanceHistories(addresses, config))[0];
4310
+ const [histories] = await this.qualifiedAccountBalanceHistories(addresses, config);
4311
+ return histories;
4258
4312
  }
4259
4313
  async accountBalanceHistory(address, config) {
4260
4314
  return await this.spanAsync("accountBalanceHistory", async () => {
4261
4315
  const range = isChainQualifiedRangeConfig4(config) ? config.range : void 0;
4262
4316
  const startingRange = asXL1BlockRange10(range ?? [0, await this.blockViewer.currentBlockNumber()], true);
4263
4317
  const blockNumbers = await this.distillTransferHistory(address, startingRange);
4264
- const blocks = (await Promise.all(blockNumbers.map(async (bn) => await this.blockViewer.blockByNumber(bn)))).filter(exists3);
4318
+ const blockResults = await Promise.all(blockNumbers.map(async (bn) => await this.blockViewer.blockByNumber(bn)));
4319
+ const blocks = blockResults.filter(exists3);
4265
4320
  const result = [];
4266
4321
  for (const block of blocks) {
4267
4322
  const transferIndexes = block[0].payload_schemas.map((schema, index) => schema === TransferSchema2 ? index : void 0).filter(exists3);
@@ -4393,7 +4448,8 @@ var SimpleAccountBalanceViewer = class extends AbstractCreatableProvider {
4393
4448
  const [head] = assertEx33(isDefined18(headHash) ? await this.blockViewer.blockByHash(headHash) : await this.blockViewer.currentBlock(), () => "Could not resolve head block");
4394
4449
  const startingRange = asXL1BlockRange10(range ?? [0, head.block], true);
4395
4450
  const blockNumbers = await this.distillTransferHistory(address, startingRange);
4396
- const blocks = (await Promise.all(blockNumbers.map(async (bn) => await this.blockViewer.blockByNumber(bn)))).filter(exists3);
4451
+ const blockResults = await Promise.all(blockNumbers.map(async (bn) => await this.blockViewer.blockByNumber(bn)));
4452
+ const blocks = blockResults.filter(exists3);
4397
4453
  const result = [];
4398
4454
  for (const block of blocks) {
4399
4455
  const transferIndexes = block[0].payload_schemas.map((schema, index) => schema === TransferSchema2 ? index : void 0).filter(exists3);
@@ -4585,7 +4641,7 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
4585
4641
  }
4586
4642
  async blocksByStep(stepLevel, stepIndex) {
4587
4643
  return await this.spanAsync("blocksByStep", async () => {
4588
- assertEx34(Number.isInteger(stepIndex) && stepIndex >= 0, () => "stepIndex must be a non-negative integer");
4644
+ assertEx34(Number.isSafeInteger(stepIndex) && stepIndex >= 0, () => "stepIndex must be a non-negative integer");
4589
4645
  const size = stepSize2(stepLevel);
4590
4646
  assertEx34(
4591
4647
  stepLevel <= blocksMaxStep,
@@ -4609,7 +4665,12 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
4609
4665
  }
4610
4666
  async chainId(blockNumber = "latest") {
4611
4667
  return await this.spanAsync("chainId", async () => {
4612
- return blockNumber === "latest" ? (await this.finalizationViewer.headBlock()).chain : assertEx34(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`)[0].chain;
4668
+ if (blockNumber === "latest") {
4669
+ const headBlock = await this.finalizationViewer.headBlock();
4670
+ return headBlock.chain;
4671
+ }
4672
+ const block = assertEx34(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`);
4673
+ return block[0].chain;
4613
4674
  }, this.context);
4614
4675
  }
4615
4676
  async createHandler() {
@@ -4658,9 +4719,10 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
4658
4719
  };
4659
4720
  }
4660
4721
  async getChainContextRead() {
4722
+ const headBlock = await this.finalizationViewer.head();
4661
4723
  return {
4662
4724
  ...this.getBlockContextRead(),
4663
- head: (await this.finalizationViewer.head())[0]
4725
+ head: headBlock[0]
4664
4726
  };
4665
4727
  }
4666
4728
  async startHandler() {
@@ -4707,10 +4769,11 @@ var SimpleBlockViewer = class extends AbstractCreatableProvider {
4707
4769
  }, this.headPollIntervalMs);
4708
4770
  }
4709
4771
  stopHeadPolling() {
4710
- if (this._headPollTimer) {
4711
- clearInterval(this._headPollTimer);
4712
- this._headPollTimer = null;
4772
+ if (!this._headPollTimer) {
4773
+ return;
4713
4774
  }
4775
+ clearInterval(this._headPollTimer);
4776
+ this._headPollTimer = null;
4714
4777
  }
4715
4778
  };
4716
4779
  __publicField(SimpleBlockViewer, "defaultMoniker", BlockViewerMoniker2);
@@ -4791,13 +4854,18 @@ var SimpleBlockValidationViewer = class extends AbstractCreatableProvider {
4791
4854
  head: void 0
4792
4855
  };
4793
4856
  const blocksWithMeta = await Promise.all(blocks.map((b) => Promise.all([PayloadBuilder18.addHashMeta(b[0]), PayloadBuilder18.addHashMeta(b[1])])));
4794
- const head = isChainQualifiedHeadConfig5(config) ? assertEx35(
4795
- (await this.blockViewer.blockByHash(config.head))?.[0],
4796
- () => `Specified a head that is not in the chain [${config.head}]`
4797
- ) : void 0;
4798
- const headBlock = head ?? (await this.blockViewer.currentBlock())[0];
4799
- const validateProtocol = value ? this.doValidateProtocol.bind(this) : void 0;
4800
- const validateState = state ? this.doValidateState.bind(this) : void 0;
4857
+ let head;
4858
+ if (isChainQualifiedHeadConfig5(config)) {
4859
+ const headBlockResult = await this.blockViewer.blockByHash(config.head);
4860
+ head = headBlockResult == null ? assertEx35(
4861
+ void 0,
4862
+ () => `Specified a head that is not in the chain [${config.head}]`
4863
+ ) : headBlockResult[0];
4864
+ }
4865
+ const currentBlock = await this.blockViewer.currentBlock();
4866
+ const headBlock = head ?? currentBlock[0];
4867
+ const validateProtocol = value === true ? this.doValidateProtocol.bind(this) : void 0;
4868
+ const validateState = state === true ? this.doValidateState.bind(this) : void 0;
4801
4869
  const chainIdAtBlockNumber = (blockNumber) => this.chainContractViewer.chainIdAtBlockNumber(blockNumber);
4802
4870
  const qualification = { head: headBlock._hash, range: asXL1BlockRange12([0, headBlock.block], true) };
4803
4871
  const [protocolResults, stateResults] = await Promise.all([
@@ -4820,13 +4888,16 @@ var SimpleBlockValidationViewer = class extends AbstractCreatableProvider {
4820
4888
  throw new Error("Method not implemented.");
4821
4889
  }
4822
4890
  async validateBlock(block, config) {
4823
- return (await this.validateBlocks([block], config))[0];
4891
+ const results = await this.validateBlocks([block], config);
4892
+ return results[0];
4824
4893
  }
4825
4894
  async validateBlocks(blocks, config) {
4826
- return (await this.qualifiedValidateBlocks(blocks, config))[0];
4895
+ const results = await this.qualifiedValidateBlocks(blocks, config);
4896
+ return results[0];
4827
4897
  }
4828
4898
  async validateUncle(blocks, config) {
4829
- return (await this.qualifiedValidateUncle(blocks, config))[0];
4899
+ const results = await this.qualifiedValidateUncle(blocks, config);
4900
+ return results[0];
4830
4901
  }
4831
4902
  async doValidateProtocol(blocks, chainIdAtBlockNumber) {
4832
4903
  return await Promise.all(blocks.map(async (block) => {
@@ -4884,7 +4955,7 @@ var SimpleChainContractViewer = class extends AbstractCreatableProvider {
4884
4955
  return this.finalizationViewer.chainId();
4885
4956
  }
4886
4957
  async chainIdAtBlockNumber(blockNumber) {
4887
- return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", `${blockNumber}`, async () => {
4958
+ return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
4888
4959
  let chainId = this.chainId();
4889
4960
  let contractViewer = this;
4890
4961
  let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
@@ -4967,14 +5038,16 @@ var AbstractRestDataLake = class extends AbstractCreatableProvider {
4967
5038
  return this.params.endpoint;
4968
5039
  }
4969
5040
  async get(hashes) {
4970
- return (await Promise.all(hashes.map((hash) => this.getOne(hash)))).filter(exists5);
5041
+ const results = await Promise.all(hashes.map((hash) => this.getOne(hash)));
5042
+ return results.filter(exists5);
4971
5043
  }
4972
5044
  next(_options) {
4973
5045
  throw new Error("Method not implemented.");
4974
5046
  }
4975
5047
  async getOne(hash) {
4976
5048
  try {
4977
- return asAnyPayload4((await this.client.get(`${this.params.endpoint}/get/${hash}`)).data);
5049
+ const response = await this.client.get(`${this.params.endpoint}/get/${hash}`);
5050
+ return asAnyPayload4(response.data);
4978
5051
  } catch (ex) {
4979
5052
  if (ex instanceof FetchClientError && (ex.response.status === 400 || ex.response.status === 404)) {
4980
5053
  return void 0;
@@ -4992,7 +5065,7 @@ var AbstractRestDataLake = class extends AbstractCreatableProvider {
4992
5065
  if (this.allowedSchemas && !this.allowedSchemas.includes(schema)) {
4993
5066
  return false;
4994
5067
  }
4995
- if (this.disallowedSchemas?.includes(schema)) {
5068
+ if (this.disallowedSchemas?.includes(schema) === true) {
4996
5069
  return false;
4997
5070
  }
4998
5071
  return true;
@@ -5019,9 +5092,8 @@ var RestDataLakeRunner = class extends AbstractRestDataLake {
5019
5092
  if (allowedItems.length > 0) {
5020
5093
  const result = await this.client.post(`${this.params.endpoint}/insert`, allowedItems);
5021
5094
  return z32.array(PayloadZodLoose).parse(result.data);
5022
- } else {
5023
- return [];
5024
5095
  }
5096
+ return [];
5025
5097
  }
5026
5098
  };
5027
5099
  __publicField(RestDataLakeRunner, "defaultMoniker", DataLakeRunnerMoniker);
@@ -5077,7 +5149,7 @@ var AbstractSimpleDataLake = class extends AbstractCreatableProvider {
5077
5149
  if (this.allowedSchemas && !this.allowedSchemas.includes(schema)) {
5078
5150
  return false;
5079
5151
  }
5080
- if (this.disallowedSchemas?.includes(schema)) {
5152
+ if (this.disallowedSchemas?.includes(schema) === true) {
5081
5153
  return false;
5082
5154
  }
5083
5155
  return true;
@@ -5091,10 +5163,12 @@ var SimpleDataLakeRunner = class extends AbstractSimpleDataLake {
5091
5163
  await this.map.clear();
5092
5164
  }
5093
5165
  async delete(hashes) {
5094
- return (await Promise.all(hashes.map(async (hash) => {
5166
+ const deleteResults = await Promise.all(hashes.map(async (hash) => {
5095
5167
  const payload = await this.map.get(hash);
5096
- return await this.map.delete(hash) ? payload : void 0;
5097
- }))).filter(exists7);
5168
+ const deleted = await this.map.delete(hash);
5169
+ return deleted ? payload : void 0;
5170
+ }));
5171
+ return deleteResults.filter(exists7);
5098
5172
  }
5099
5173
  async insert(items) {
5100
5174
  const payloads = items.filter(isAnyPayload10).filter((i) => this.isAllowed(i));
@@ -5137,7 +5211,8 @@ var SimpleFinalizationRunner = class extends AbstractCreatableProvider {
5137
5211
  this._store = { chainMap: this.params.finalizedArchivist };
5138
5212
  }
5139
5213
  async finalizeBlock(block) {
5140
- return (await this.finalizeBlocks([block]))[0];
5214
+ const results = await this.finalizeBlocks([block]);
5215
+ return results[0];
5141
5216
  }
5142
5217
  async finalizeBlocks(blocks) {
5143
5218
  const sortedBlocks = blocks.toSorted((a, b) => a[0].block - b[0].block);
@@ -5191,7 +5266,8 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
5191
5266
  }
5192
5267
  async createHandler() {
5193
5268
  await super.createHandler();
5194
- this._chainId = assertEx38(this.config.chain.id ?? (await findMostRecentBlock(this.params.finalizedArchivist))?.chain, () => "chain.id is required if empty archivist");
5269
+ const mostRecentBlock = await findMostRecentBlock(this.params.finalizedArchivist);
5270
+ this._chainId = assertEx38(this.config.chain.id ?? mostRecentBlock?.chain, () => "chain.id is required if empty archivist");
5195
5271
  this._store = { chainMap: this.params.finalizedArchivist };
5196
5272
  }
5197
5273
  async head() {
@@ -5206,13 +5282,16 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
5206
5282
  }, this.context);
5207
5283
  }
5208
5284
  async headBlock() {
5209
- return (await this.head())[0];
5285
+ const headBlock = await this.head();
5286
+ return headBlock[0];
5210
5287
  }
5211
5288
  async headHash() {
5212
- return (await this.headBlock())._hash;
5289
+ const headBlock = await this.headBlock();
5290
+ return headBlock._hash;
5213
5291
  }
5214
5292
  async headNumber() {
5215
- return (await this.headBlock()).block;
5293
+ const headBlock = await this.headBlock();
5294
+ return headBlock.block;
5216
5295
  }
5217
5296
  getBlockContextRead() {
5218
5297
  return {
@@ -5221,9 +5300,10 @@ var SimpleFinalizationViewer = class extends AbstractCreatableProvider {
5221
5300
  };
5222
5301
  }
5223
5302
  async getChainContextRead() {
5303
+ const headBlock = await this.head();
5224
5304
  return {
5225
5305
  ...this.getBlockContextRead(),
5226
- head: (await this.head())[0]
5306
+ head: headBlock[0]
5227
5307
  };
5228
5308
  }
5229
5309
  async getCurrentHead() {
@@ -5345,11 +5425,13 @@ var SimpleXyoGatewayRunner = class _SimpleXyoGatewayRunner extends AbstractCreat
5345
5425
  BigIntToJsonZod.parse(amount)
5346
5426
  ])
5347
5427
  );
5348
- const transfer = new PayloadBuilder20({ schema: TransferSchema3 }).fields({
5428
+ const payloadBuilder = new PayloadBuilder20({ schema: TransferSchema3 });
5429
+ const transferBuilder = payloadBuilder.fields({
5349
5430
  from,
5350
5431
  transfers: hexTransfers,
5351
5432
  epoch: Date.now()
5352
- }).build();
5433
+ });
5434
+ const transfer = transferBuilder.build();
5353
5435
  const [hash] = await this.addPayloadsToChain([transfer], [], options);
5354
5436
  return hash;
5355
5437
  }
@@ -5470,10 +5552,11 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
5470
5552
  const valid = blocks.map((b) => !!b);
5471
5553
  const remainingBlockMap = [];
5472
5554
  const remainingBlocks = blocks.map((b, i) => {
5473
- if (b) {
5474
- remainingBlockMap.push(i);
5475
- return b;
5555
+ if (!b) {
5556
+ return;
5476
5557
  }
5558
+ remainingBlockMap.push(i);
5559
+ return b;
5477
5560
  }).filter(exists8);
5478
5561
  assertEx40(
5479
5562
  remainingBlockMap.length === remainingBlocks.length,
@@ -5492,7 +5575,7 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
5492
5575
  valid[remainingBlockMap[i]] = validated;
5493
5576
  }
5494
5577
  const pruneHashes = bundles.map((p, i) => {
5495
- if (!valid[i]) {
5578
+ if (valid.at(i) !== true) {
5496
5579
  return p._hash;
5497
5580
  }
5498
5581
  }).filter(exists8);
@@ -5532,10 +5615,11 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
5532
5615
  const valid = transactions.map((t) => !!t);
5533
5616
  const remainingTransactionMap = [];
5534
5617
  const remainingTransactions = transactions.map((t, i) => {
5535
- if (t) {
5536
- remainingTransactionMap.push(i);
5537
- return t;
5618
+ if (!t) {
5619
+ return;
5538
5620
  }
5621
+ remainingTransactionMap.push(i);
5622
+ return t;
5539
5623
  }).filter(exists8);
5540
5624
  assertEx40(
5541
5625
  remainingTransactionMap.length === remainingTransactions.length,
@@ -5555,7 +5639,7 @@ var SimpleMempoolRunner = class extends AbstractCreatableProvider {
5555
5639
  valid[remainingTransactionMap[i]] = validated;
5556
5640
  }
5557
5641
  const pruneHashes = bundles.map((p, i) => {
5558
- if (!valid[i]) {
5642
+ if (valid.at(i) !== true) {
5559
5643
  return p._hash;
5560
5644
  }
5561
5645
  }).filter(exists8);
@@ -5860,7 +5944,8 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
5860
5944
  cursor
5861
5945
  });
5862
5946
  const filteredBundles = bundles.filter(isPayloadBundle2).filter(isHashMeta2);
5863
- return (await Promise.all(filteredBundles.map(async (bundle3) => await bundledPayloadToHydratedBlock(bundle3)))).filter(exists9);
5947
+ const hydratedBlocks = await Promise.all(filteredBundles.map(async (bundle3) => await bundledPayloadToHydratedBlock(bundle3)));
5948
+ return hydratedBlocks.filter(exists9);
5864
5949
  }
5865
5950
  async pendingTransactions({
5866
5951
  cursor: providedCursor,
@@ -5881,12 +5966,7 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
5881
5966
  });
5882
5967
  this.logger?.debug(`Fetched pending transactions: ${bundles.length} bundles`);
5883
5968
  const filteredBundles = bundles.filter(isPayloadBundle2).filter(isHashMeta2);
5884
- const hydratedWithBundle = (await Promise.all(
5885
- filteredBundles.map(async (bundle3) => {
5886
- const tx = await bundledPayloadToHydratedTransaction(bundle3);
5887
- return isDefined20(tx) ? { bundle: bundle3, tx } : void 0;
5888
- })
5889
- )).filter(exists9);
5969
+ const hydratedWithBundle = await this.hydratePendingBundles(filteredBundles);
5890
5970
  const currentBlock = await this.windowedBlockViewer.currentBlock();
5891
5971
  const currentBlockNumber = currentBlock[0].block;
5892
5972
  const evaluated = await Promise.all(
@@ -5907,9 +5987,7 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
5907
5987
  })
5908
5988
  );
5909
5989
  this.gcHandoutStats(currentBlockNumber);
5910
- const inclusionCandidates = (await Promise.all(validTransactions.map(async ({ bundle: bundle3, tx }) => {
5911
- if (await this.isInclusionCandidate(tx, currentBlock, false)) return { bundle: bundle3, tx };
5912
- }))).filter(exists9);
5990
+ const inclusionCandidates = await this.filterInclusionCandidates(validTransactions, currentBlock);
5913
5991
  const selectionRatio = this.params.mempoolSelectionRatio ?? DEFAULT_MEMPOOL_SELECTION_RATIO;
5914
5992
  const nonDemoted = inclusionCandidates.filter(({ bundle: bundle3 }) => !this.isDemoted(bundle3._hash));
5915
5993
  const demoted = inclusionCandidates.filter(({ bundle: bundle3 }) => this.isDemoted(bundle3._hash));
@@ -5933,12 +6011,27 @@ var SimpleMempoolViewer = class extends AbstractCreatableProvider {
5933
6011
  async deleteBundledTransaction(bundle3) {
5934
6012
  await this.pendingTransactionsArchivist.delete([bundle3._hash]);
5935
6013
  }
6014
+ async filterInclusionCandidates(validTransactions, currentBlock) {
6015
+ const inclusionResults = await Promise.all(validTransactions.map(async ({ bundle: bundle3, tx }) => {
6016
+ if (await this.isInclusionCandidate(tx, currentBlock, false)) return { bundle: bundle3, tx };
6017
+ }));
6018
+ return inclusionResults.filter(exists9);
6019
+ }
5936
6020
  gcHandoutStats(currentBlockNumber) {
5937
6021
  const ttl = this.handoutStatsTtlBlocks;
5938
6022
  for (const [hash, stats] of this._handoutStats) {
5939
6023
  if (currentBlockNumber - stats.firstHandoutAt > ttl) this._handoutStats.delete(hash);
5940
6024
  }
5941
6025
  }
6026
+ async hydratePendingBundles(filteredBundles) {
6027
+ const hydratedResults = await Promise.all(
6028
+ filteredBundles.map(async (bundle3) => {
6029
+ const tx = await bundledPayloadToHydratedTransaction(bundle3);
6030
+ return isDefined20(tx) ? { bundle: bundle3, tx } : void 0;
6031
+ })
6032
+ );
6033
+ return hydratedResults.filter(exists9);
6034
+ }
5942
6035
  /**
5943
6036
  * Evaluates a transaction to determine if it should be purged from the mempool.
5944
6037
  * @param tx The transaction to evaluate
@@ -5996,7 +6089,7 @@ SimpleMempoolViewer = __decorateClass([
5996
6089
  function deduplicateWithBundleBySigner(items) {
5997
6090
  const seen = /* @__PURE__ */ new Set();
5998
6091
  return items.filter(({ tx }) => {
5999
- const key = tx[0].addresses.toSorted().join(",");
6092
+ const key = tx[0].addresses.toSorted((a, b) => a.localeCompare(b)).join(",");
6000
6093
  if (seen.has(key)) return false;
6001
6094
  seen.add(key);
6002
6095
  return true;
@@ -6062,13 +6155,12 @@ var SimpleXyoNetwork = class {
6062
6155
  const response = await fetchJsonGet(url);
6063
6156
  if (isNetworkStatus(response.data)) {
6064
6157
  return response.data;
6065
- } else {
6066
- if (response.status === 200) {
6067
- this.logger?.error("Unknown network status response", response.data);
6068
- return unknownStatus;
6069
- }
6070
- return errorStatus;
6071
6158
  }
6159
+ if (response.status === 200) {
6160
+ this.logger?.error("Unknown network status response", response.data);
6161
+ return unknownStatus;
6162
+ }
6163
+ return errorStatus;
6072
6164
  } catch (error) {
6073
6165
  this.logger?.error("Error fetching network status", error);
6074
6166
  return errorStatus;
@@ -6649,7 +6741,8 @@ var SimpleTimeSyncViewer = class extends AbstractCreatableProvider {
6649
6741
  async currentTime(domain) {
6650
6742
  switch (domain) {
6651
6743
  case "xl1": {
6652
- return ["xl1", (await this.blockViewer.currentBlock())?.[0].block ?? -1];
6744
+ const currentBlock = await this.blockViewer.currentBlock();
6745
+ return ["xl1", currentBlock?.[0].block ?? -1];
6653
6746
  }
6654
6747
  case "epoch": {
6655
6748
  return ["epoch", Date.now()];
@@ -6761,13 +6854,18 @@ var SimpleTransactionValidationViewer = class extends AbstractCreatableProvider
6761
6854
  head: void 0
6762
6855
  };
6763
6856
  const transactionsWithMeta = await Promise.all(transactions.map((b) => Promise.all([PayloadBuilder24.addHashMeta(b[0]), PayloadBuilder24.addHashMeta(b[1])])));
6764
- const head = isChainQualifiedHeadConfig6(config) ? assertEx46(
6765
- (await this.blockViewer.blockByHash(config.head))?.[0],
6766
- () => `Specified a head that is not in the chain [${config.head}]`
6767
- ) : void 0;
6768
- const headBlock = head ?? (await this.blockViewer.currentBlock())[0];
6769
- const validateProtocol = value ? this.doValidateProtocol.bind(this) : void 0;
6770
- const validateState = state ? this.doValidateState.bind(this) : void 0;
6857
+ let head;
6858
+ if (isChainQualifiedHeadConfig6(config)) {
6859
+ const headBlockResult = await this.blockViewer.blockByHash(config.head);
6860
+ head = headBlockResult == null ? assertEx46(
6861
+ void 0,
6862
+ () => `Specified a head that is not in the chain [${config.head}]`
6863
+ ) : headBlockResult[0];
6864
+ }
6865
+ const currentBlock = await this.blockViewer.currentBlock();
6866
+ const headBlock = head ?? currentBlock[0];
6867
+ const validateProtocol = value === true ? this.doValidateProtocol.bind(this) : void 0;
6868
+ const validateState = state === true ? this.doValidateState.bind(this) : void 0;
6771
6869
  const chainId = headBlock.chain;
6772
6870
  const qualification = { head: headBlock._hash, range: asXL1BlockRange13([0, headBlock.block], true) };
6773
6871
  const [protocolResults, stateResults] = await Promise.all([
@@ -6790,10 +6888,12 @@ var SimpleTransactionValidationViewer = class extends AbstractCreatableProvider
6790
6888
  throw new Error("Method not implemented.");
6791
6889
  }
6792
6890
  async validateTransaction(block, config) {
6793
- return (await this.validateTransactions([block], config))[0];
6891
+ const results = await this.validateTransactions([block], config);
6892
+ return results[0];
6794
6893
  }
6795
6894
  async validateTransactions(transactions, config) {
6796
- return (await this.qualifiedValidateTransactions(transactions, config))[0];
6895
+ const results = await this.qualifiedValidateTransactions(transactions, config);
6896
+ return results[0];
6797
6897
  }
6798
6898
  async doValidateProtocol(transactions, chainId) {
6799
6899
  return await Promise.all(transactions.map(async (tx) => {
@@ -7091,8 +7191,8 @@ var LoggerStatusReporter = class {
7091
7191
  }
7092
7192
  report(name, status, progress) {
7093
7193
  this.statusMap[name] = status;
7094
- const starting = Object.entries(this.statusMap).map(([, value]) => value === "starting" ? 1 : 0).reduce((a, b) => a + b, 0);
7095
- const started = Object.entries(this.statusMap).map(([, value]) => value === "started" ? 1 : 0).reduce((a, b) => a + b, 0);
7194
+ const starting = Object.values(this.statusMap).map((value) => value === "starting" ? 1 : 0).reduce((a, b) => a + b, 0);
7195
+ const started = Object.values(this.statusMap).map((value) => value === "started" ? 1 : 0).reduce((a, b) => a + b, 0);
7096
7196
  this.logger.info(`${started}/${starting + started} ${name} status: ${status}`, { progress });
7097
7197
  }
7098
7198
  };
@@ -7253,6 +7353,26 @@ var isBuildNextBlockOptions = (value) => {
7253
7353
  function calculateCompletedStepReward(step, balance) {
7254
7354
  return AttoXL14(StepRewardFractions[step][0] * balance / StepRewardFractions[step][1]);
7255
7355
  }
7356
+ function buildStepHashes(blockNumber, inStepHashes, previousBlockHash, chainStepRewardAddress2, stepRewardPoolBalance) {
7357
+ const completedStepRewardTransfers = [];
7358
+ const step_hashes = [];
7359
+ for (const [i, step] of StepSizes14.entries()) {
7360
+ if (blockNumber < step) {
7361
+ break;
7362
+ }
7363
+ if (blockNumber % step === 0) {
7364
+ if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress2 !== XYO_ZERO_ADDRESS2) {
7365
+ const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step });
7366
+ const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance);
7367
+ completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress2, { [completedStepRewardHolderAddress]: completedStepReward }));
7368
+ }
7369
+ step_hashes.push(assertEx49(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`));
7370
+ } else if (isDefined23(inStepHashes.at(i))) {
7371
+ step_hashes.push(inStepHashes[i]);
7372
+ }
7373
+ }
7374
+ return { completedStepRewardTransfers, step_hashes };
7375
+ }
7256
7376
  async function buildBlock(options) {
7257
7377
  const previousBlockNumber = isBuildGenesisBlockOptions(options) ? -1 : options.previousBlockNumber;
7258
7378
  const blockNumber = asXL1BlockNumber13(previousBlockNumber + 1, true);
@@ -7267,7 +7387,6 @@ async function buildBlock(options) {
7267
7387
  protocol = XL1_PROTOCOL_VERSION,
7268
7388
  signers
7269
7389
  } = options;
7270
- const step_hashes = [];
7271
7390
  for (const [tx] of txs) {
7272
7391
  if (tx.nbf > blockNumber) {
7273
7392
  throw new Error(`Transaction ${await PayloadBuilder25.hash(tx)} not valid for block ${blockNumber} - NBF is ${tx.nbf}`);
@@ -7276,24 +7395,13 @@ async function buildBlock(options) {
7276
7395
  throw new Error(`Transaction ${await PayloadBuilder25.hash(tx)} not valid for block ${blockNumber} - EXP is ${tx.exp}`);
7277
7396
  }
7278
7397
  }
7279
- const completedStepRewardTransfers = [];
7280
- for (const [i, step] of StepSizes14.entries()) {
7281
- if (blockNumber < step) {
7282
- break;
7283
- }
7284
- if (blockNumber % step === 0) {
7285
- if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress2 !== XYO_ZERO_ADDRESS2) {
7286
- const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step });
7287
- const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance);
7288
- completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress2, { [completedStepRewardHolderAddress]: completedStepReward }));
7289
- }
7290
- step_hashes.push(assertEx49(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`));
7291
- } else {
7292
- if (isDefined23(inStepHashes.at(i))) {
7293
- step_hashes.push(inStepHashes[i]);
7294
- }
7295
- }
7296
- }
7398
+ const { step_hashes, completedStepRewardTransfers } = buildStepHashes(
7399
+ blockNumber,
7400
+ inStepHashes,
7401
+ previousBlockHash,
7402
+ chainStepRewardAddress2,
7403
+ stepRewardPoolBalance
7404
+ );
7297
7405
  const previous = previousBlockHash ?? null;
7298
7406
  const block = blockNumber;
7299
7407
  const txElevatedPayloads = await validateTransactionsOpcodes(txs);
@@ -7303,13 +7411,15 @@ async function buildBlock(options) {
7303
7411
  ...txElevatedPayloads,
7304
7412
  ...completedStepRewardTransfers
7305
7413
  ];
7306
- const [bw, txPayloads] = await new BoundWitnessBuilder3().fields({
7414
+ const boundWitnessBuilder = new BoundWitnessBuilder3();
7415
+ const builder = boundWitnessBuilder.fields({
7307
7416
  block,
7308
7417
  chain: chainId,
7309
7418
  previous,
7310
7419
  step_hashes,
7311
7420
  protocol
7312
- }).meta({ $epoch: Date.now(), $signatures: [] }).signers(signers).payloads(await PayloadBuilder25.addStorageMeta(payloads)).build();
7421
+ }).meta({ $epoch: Date.now(), $signatures: [] }).signers(signers).payloads(await PayloadBuilder25.addStorageMeta(payloads));
7422
+ const [bw, txPayloads] = await builder.build();
7313
7423
  assertEx49(isBlockBoundWitness(bw), () => "Build of BlockBoundWitness failed");
7314
7424
  return [await PayloadBuilder25.addStorageMeta(bw), txPayloads.map((p) => asAnyPayload5(p, true))];
7315
7425
  }
@@ -7365,7 +7475,8 @@ var buildRandomTransaction = async (chain, payloads, account, nbf = asXL1BlockNu
7365
7475
  const additionalPayloads = (payloads ?? []).filter((payload) => !isAllowedBlockPayload3(payload));
7366
7476
  const sender = account ?? await Account2.random();
7367
7477
  if (elevatedPayloads.length === 0) {
7368
- const receiver = receiverAddress ?? (await Account2.random()).address;
7478
+ const defaultReceiver = await Account2.random();
7479
+ const receiver = receiverAddress ?? defaultReceiver.address;
7369
7480
  const transferPayload = createTransferPayload(sender.address, { [receiver]: 1n });
7370
7481
  elevatedPayloads.push(transferPayload);
7371
7482
  }
@@ -7396,12 +7507,14 @@ import {
7396
7507
  defaultTransactionFees as defaultTransactionFees4
7397
7508
  } from "@xyo-network/xl1-protocol-lib";
7398
7509
  async function createProducerChainStakeIntent(from, exp, nbf = 0) {
7399
- return await PayloadBuilder27.addHashMeta(new PayloadBuilder27({ schema: ChainStakeIntentSchema2 }).fields({
7510
+ const payloadBuilder = new PayloadBuilder27({ schema: ChainStakeIntentSchema2 });
7511
+ const builder = payloadBuilder.fields({
7400
7512
  from,
7401
7513
  exp,
7402
7514
  nbf,
7403
7515
  intent: "producer"
7404
- }).build());
7516
+ });
7517
+ return await PayloadBuilder27.addHashMeta(builder.build());
7405
7518
  }
7406
7519
 
7407
7520
  // src/test/createGenesisBlock.ts
@@ -7445,13 +7558,20 @@ var buildRandomChain = async (blockProducer, count = 10, previousBlock, chainId,
7445
7558
  remaining = remaining - 1;
7446
7559
  lastBlock = block;
7447
7560
  }
7448
- const resolvedReceiverAddresses = receiverAddresses ?? [(await Account4.random()).address];
7561
+ const defaultReceiver = await Account4.random();
7562
+ const resolvedReceiverAddresses = receiverAddresses ?? [defaultReceiver.address];
7449
7563
  let saltCounter = 0;
7450
7564
  while (remaining > 0) {
7451
7565
  saltCounter += 1;
7452
- const payloads = [new PayloadBuilder29({ schema: IdSchema2 }).fields({ salt: `${Date.now()}-${saltCounter}` }).build()];
7566
+ const idPayloadBuilder = new PayloadBuilder29({ schema: IdSchema2 });
7567
+ const idBuilder = idPayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` });
7568
+ const payloads = [idBuilder.build()];
7453
7569
  saltCounter += 1;
7454
- const additionalPrivatePayloads = remaining % 2 === 0 ? [new PayloadBuilder29({ schema: asSchema9("network.xyo.private", true) }).fields({ salt: `${Date.now()}-${saltCounter}` }).build()] : [];
7570
+ const additionalPrivatePayloads = remaining % 2 === 0 ? (() => {
7571
+ const privatePayloadBuilder = new PayloadBuilder29({ schema: asSchema9("network.xyo.private", true) });
7572
+ const privateBuilder = privatePayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` });
7573
+ return [privateBuilder.build()];
7574
+ })() : [];
7455
7575
  const txs = [];
7456
7576
  for (const receiverAddress of resolvedReceiverAddresses) {
7457
7577
  txs.push(await buildRandomTransaction(