@xyo-network/chain-sdk 4.1.0 → 4.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 (113) hide show
  1. package/dist/browser/modules/ethereum/block/findContractDeploymentBlock.d.ts +25 -0
  2. package/dist/browser/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
  3. package/dist/browser/modules/ethereum/block/index.d.ts +1 -0
  4. package/dist/browser/modules/ethereum/block/index.d.ts.map +1 -1
  5. package/dist/browser/modules/ethereum/drivers/EvmStakeEventZod.d.ts +12 -12
  6. package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +43 -13
  7. package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  8. package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -1
  9. package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  10. package/dist/browser/modules/ethereum/index.d.ts +2 -0
  11. package/dist/browser/modules/ethereum/index.d.ts.map +1 -1
  12. package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
  13. package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
  14. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
  15. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
  16. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
  17. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
  18. package/dist/browser/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
  19. package/dist/browser/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
  20. package/dist/browser/modules/ethereum/indexing/index.d.ts +5 -0
  21. package/dist/browser/modules/ethereum/indexing/index.d.ts.map +1 -0
  22. package/dist/browser/modules/ethereum/rpc/index.d.ts +4 -0
  23. package/dist/browser/modules/ethereum/rpc/index.d.ts.map +1 -0
  24. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +15 -0
  25. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  26. package/dist/browser/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  27. package/dist/browser/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  28. package/dist/browser/modules/services/Election/BaseElectionService.d.ts +1 -0
  29. package/dist/browser/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  30. package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
  31. package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  32. package/dist/browser/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  33. package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  34. package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  35. package/dist/browser/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  36. package/dist/browser/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  37. package/dist/neutral/ethereum.mjs +413 -65
  38. package/dist/neutral/ethereum.mjs.map +4 -4
  39. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts +25 -0
  40. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
  41. package/dist/neutral/modules/ethereum/block/index.d.ts +1 -0
  42. package/dist/neutral/modules/ethereum/block/index.d.ts.map +1 -1
  43. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts +12 -12
  44. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +43 -13
  45. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  46. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -1
  47. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  48. package/dist/neutral/modules/ethereum/index.d.ts +2 -0
  49. package/dist/neutral/modules/ethereum/index.d.ts.map +1 -1
  50. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
  51. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
  52. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
  53. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
  54. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
  55. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
  56. package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
  57. package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
  58. package/dist/neutral/modules/ethereum/indexing/index.d.ts +5 -0
  59. package/dist/neutral/modules/ethereum/indexing/index.d.ts.map +1 -0
  60. package/dist/neutral/modules/ethereum/rpc/index.d.ts +4 -0
  61. package/dist/neutral/modules/ethereum/rpc/index.d.ts.map +1 -0
  62. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +15 -0
  63. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  64. package/dist/neutral/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  65. package/dist/neutral/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  66. package/dist/neutral/modules/services/Election/BaseElectionService.d.ts +1 -0
  67. package/dist/neutral/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  68. package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
  69. package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  70. package/dist/neutral/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  71. package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  72. package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  73. package/dist/neutral/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  74. package/dist/neutral/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  75. package/dist/neutral/services.mjs +46 -13
  76. package/dist/neutral/services.mjs.map +4 -4
  77. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts +25 -0
  78. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
  79. package/dist/node/modules/ethereum/block/index.d.ts +1 -0
  80. package/dist/node/modules/ethereum/block/index.d.ts.map +1 -1
  81. package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts +12 -12
  82. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +43 -13
  83. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  84. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -1
  85. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  86. package/dist/node/modules/ethereum/index.d.ts +2 -0
  87. package/dist/node/modules/ethereum/index.d.ts.map +1 -1
  88. package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
  89. package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
  90. package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
  91. package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
  92. package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
  93. package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
  94. package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
  95. package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
  96. package/dist/node/modules/ethereum/indexing/index.d.ts +5 -0
  97. package/dist/node/modules/ethereum/indexing/index.d.ts.map +1 -0
  98. package/dist/node/modules/ethereum/rpc/index.d.ts +4 -0
  99. package/dist/node/modules/ethereum/rpc/index.d.ts.map +1 -0
  100. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +15 -0
  101. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  102. package/dist/node/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  103. package/dist/node/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  104. package/dist/node/modules/services/Election/BaseElectionService.d.ts +1 -0
  105. package/dist/node/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  106. package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
  107. package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  108. package/dist/node/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  109. package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  110. package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  111. package/dist/node/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  112. package/dist/node/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  113. package/package.json +17 -19
@@ -198,6 +198,59 @@ async function estimateBlockNumberAt(provider, targetDate = DEFAULT_ESTIMATE_BLO
198
198
  return estimateBlockNumberFromHead(head.number, head.timestamp, targetDate, avgBlockTimeSec);
199
199
  }
200
200
 
201
+ // src/modules/ethereum/block/findContractDeploymentBlock.ts
202
+ var deploymentBlockSearches = /* @__PURE__ */ new WeakMap();
203
+ async function findContractDeploymentBlock(provider, address) {
204
+ let byAddress = deploymentBlockSearches.get(provider);
205
+ if (byAddress === void 0) {
206
+ byAddress = /* @__PURE__ */ new Map();
207
+ deploymentBlockSearches.set(provider, byAddress);
208
+ }
209
+ const key = address.toLowerCase();
210
+ const existing = byAddress.get(key);
211
+ if (existing !== void 0) return await existing;
212
+ const search = searchDeploymentBlock(provider, address);
213
+ byAddress.set(key, search);
214
+ const result = await search;
215
+ if (result === void 0) byAddress.delete(key);
216
+ return result;
217
+ }
218
+ function configuredDeploymentBlock(config) {
219
+ const chain = config?.chain;
220
+ const value = chain?.deploymentBlock;
221
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : void 0;
222
+ }
223
+ async function resolveContractDeploymentBlock(provider, address, logger) {
224
+ const found = await findContractDeploymentBlock(provider, address);
225
+ if (found !== void 0) {
226
+ logger?.log(`Resolved deployment block ${found} for ${address} via getCode search`);
227
+ return found;
228
+ }
229
+ const estimated = await estimateBlockNumberAt(provider);
230
+ logger?.warn(`Could not resolve deployment block for ${address} via getCode search; using date estimate ${estimated}`);
231
+ return estimated;
232
+ }
233
+ async function searchDeploymentBlock(provider, address) {
234
+ try {
235
+ const head = await provider.getBlockNumber();
236
+ if (await provider.getCode(address, head) === "0x") return void 0;
237
+ let lo = 0;
238
+ let hi = head;
239
+ while (lo < hi) {
240
+ const mid = Math.floor((lo + hi) / 2);
241
+ const code = await provider.getCode(address, mid);
242
+ if (code === "0x") {
243
+ lo = mid + 1;
244
+ } else {
245
+ hi = mid;
246
+ }
247
+ }
248
+ return lo;
249
+ } catch {
250
+ return void 0;
251
+ }
252
+ }
253
+
201
254
  // src/modules/ethereum/block/rate/blockRate.ts
202
255
  import { isDefined, isFalsy } from "@ariestools/sdk";
203
256
  import {
@@ -451,20 +504,17 @@ async function createChain(signer, stakingTokenAddress, initialBlockProducer, re
451
504
  // src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
452
505
  import {
453
506
  assertEx as assertEx10,
454
- exists,
455
507
  isDefined as isDefined3,
456
- toAddress as toAddress3,
457
- toEthAddress as toEthAddress8
508
+ toAddress as toAddress3
458
509
  } from "@ariestools/sdk";
459
- import {
460
- IAddressStakingEvents__factory
461
- } from "@xyo-network/typechain";
510
+ import { IAddressStakingEvents__factory } from "@xyo-network/typechain";
462
511
  import {
463
512
  creatableProvider as creatableProvider4,
464
513
  EvmChainViewerMoniker as EvmChainViewerMoniker4,
465
514
  StakeEventsViewerMoniker
466
515
  } from "@xyo-network/xl1-sdk";
467
516
  import { asAttoXL1 } from "@xyo-network/xl1-sdk";
517
+ import { EventLog } from "ethers";
468
518
 
469
519
  // src/modules/ethereum/providers/AbstractEvmProvider.ts
470
520
  import {
@@ -702,6 +752,56 @@ EvmStakeTotalsViewer = __decorateClass([
702
752
  creatableProvider3()
703
753
  ], EvmStakeTotalsViewer);
704
754
 
755
+ // src/modules/ethereum/rpc/isRpcRangeLimitError.ts
756
+ function collectErrorTexts(error) {
757
+ const seen = /* @__PURE__ */ new Set();
758
+ const queue = [error];
759
+ const texts = [];
760
+ while (queue.length > 0) {
761
+ const current = queue.pop();
762
+ if (current === void 0 || current === null || seen.has(current)) {
763
+ continue;
764
+ }
765
+ seen.add(current);
766
+ if (typeof current === "string") {
767
+ texts.push(current);
768
+ continue;
769
+ }
770
+ if (typeof current !== "object") {
771
+ continue;
772
+ }
773
+ if (Array.isArray(current)) {
774
+ const items = current;
775
+ queue.push(...items);
776
+ continue;
777
+ }
778
+ const record = current;
779
+ for (const key of ["message", "shortMessage", "reason", "error", "info", "data", "value", "body", "payload"]) {
780
+ if (key in record) {
781
+ queue.push(record[key]);
782
+ }
783
+ }
784
+ }
785
+ return texts;
786
+ }
787
+ function matchesRangeLimitText(text) {
788
+ const normalized = text.toLowerCase();
789
+ return /range \d+ exceeds limit/.test(normalized) || /exceeds? (?:the )?max(?:imum)? (?:block )?range/.test(normalized) || normalized.includes("block range is too") || normalized.includes("log response size exceeded") || normalized.includes("query returned more than") || normalized.includes("response size exceeded") || /getlogs (?:is )?limited to/.test(normalized);
790
+ }
791
+ function isRpcRangeLimitError(error) {
792
+ return collectErrorTexts(error).some((text) => matchesRangeLimitText(text));
793
+ }
794
+ function rpcRangeLimitFromError(error) {
795
+ for (const text of collectErrorTexts(error)) {
796
+ const match = /(?:exceeds )?limit(?:ed)? (?:of|to) (\d+)/i.exec(text);
797
+ if (match !== null) {
798
+ const limit = Number(match[1]);
799
+ if (Number.isSafeInteger(limit) && limit > 0) return limit;
800
+ }
801
+ }
802
+ return void 0;
803
+ }
804
+
705
805
  // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
706
806
  import { delay } from "@ariestools/sdk";
707
807
 
@@ -844,19 +944,26 @@ var asEvmStakeWithdrawnEvent = zodAsFactory(EvmStakeWithdrawnEventZod, "asEvmSta
844
944
  var toEvmStakeWithdrawnEvent = zodToFactory(EvmStakeWithdrawnEventZod, "toEvmStakeWithdrawnEvent");
845
945
 
846
946
  // src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
847
- var DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE = 2e3;
947
+ var DEFAULT_EVENT_QUERY_START_CHUNK_SIZE = 1e5;
948
+ var MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE = 1e3;
848
949
  var DEFAULT_EVENT_QUERY_MAX_ATTEMPTS = 8;
849
950
  var DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS = 1e3;
951
+ var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
850
952
  var EvmStakeEventsViewer = class extends AbstractEvmViewer {
851
953
  moniker = EvmStakeEventsViewer.defaultMoniker;
852
- /** Set at start when `params.deploymentBlock` is omitted (estimated 2025-06-01). */
954
+ /**
955
+ * Current adaptive chunk size — shrinks when the provider rejects a range
956
+ * and persists across loads so the tail catch-up reuses the learned limit.
957
+ */
958
+ adaptiveChunkSize;
959
+ /** Set at start when `params.deploymentBlock` is omitted (getCode binary search, date-estimate fallback). */
853
960
  defaultDeploymentBlock = 0;
854
961
  eventCache = /* @__PURE__ */ new Map();
855
962
  get deploymentBlock() {
856
- return this.params.deploymentBlock ?? this.defaultDeploymentBlock;
963
+ return this.params.deploymentBlock ?? this.config.chain?.deploymentBlock ?? this.defaultDeploymentBlock;
857
964
  }
858
965
  get eventQueryBlockChunkSize() {
859
- return this.params.eventQueryBlockChunkSize ?? DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE;
966
+ return this.fixedEventQueryBlockChunkSize ?? this.adaptiveChunkSize ?? DEFAULT_EVENT_QUERY_START_CHUNK_SIZE;
860
967
  }
861
968
  get eventQueryInitialDelayMs() {
862
969
  return this.params.eventQueryInitialDelayMs ?? DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS;
@@ -864,6 +971,15 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
864
971
  get eventQueryMaxAttempts() {
865
972
  return this.params.eventQueryMaxAttempts ?? DEFAULT_EVENT_QUERY_MAX_ATTEMPTS;
866
973
  }
974
+ /**
975
+ * Fixed eth_getLogs range: explicit param (deprecated), else the bound evm-rpc
976
+ * connection profile's `eventQueryBlockChunkSize`. Undefined → adaptive sizing.
977
+ */
978
+ get fixedEventQueryBlockChunkSize() {
979
+ if (isDefined3(this.params.eventQueryBlockChunkSize)) return this.params.eventQueryBlockChunkSize;
980
+ const bound = this.boundConnection;
981
+ return bound?.config.type === "evm-rpc" ? bound.config.eventQueryBlockChunkSize : void 0;
982
+ }
867
983
  async positionCount(range) {
868
984
  const events = await this.stakeEvents(range);
869
985
  const positionIds = events.map((e) => e.args.id);
@@ -928,7 +1044,7 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
928
1044
  const provider = assertEx10(this.contract.runner?.provider, () => new Error("Failed to get provider"));
929
1045
  const historyEndBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get currentEthBlock"));
930
1046
  if (!isDefined3(this.params.deploymentBlock)) {
931
- this.defaultDeploymentBlock = await estimateBlockNumberAt(provider);
1047
+ this.defaultDeploymentBlock = configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(provider, this.address, this.logger);
932
1048
  }
933
1049
  await this.loadHistoricalEvents(this.deploymentBlock, historyEndBlock);
934
1050
  await this.attachLiveListeners();
@@ -952,69 +1068,71 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
952
1068
  this.onEventHandler(staked, staker, id, amount, event);
953
1069
  });
954
1070
  }
1071
+ /**
1072
+ * Loads all stake events for the range with a single address-only sweep —
1073
+ * one eth_getLogs pass per chunk covers all three event types (demuxed by
1074
+ * event name client-side) instead of three filtered sweeps over the same
1075
+ * blocks. Chunk size adapts to the provider: on a range/result-limit error
1076
+ * the chunk shrinks (to the advertised limit when the error states one,
1077
+ * halving otherwise) and the window is retried; rate limits retry at the
1078
+ * same size with backoff.
1079
+ */
955
1080
  async loadHistoricalEvents(fromBlock, toBlock) {
956
1081
  if (fromBlock > toBlock) {
957
1082
  return;
958
1083
  }
959
- const stakeEventGroups = await Promise.all([
960
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeAdded" }),
961
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeRemoved" }),
962
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeWithdrawn" })
963
- ]);
964
- const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time);
965
- const chunks = blockRangeChunks(fromBlock, toBlock, this.eventQueryBlockChunkSize);
966
- this.logger?.log(
967
- `Cached ${allStakeEvents.length} stake events from blocks ${fromBlock}-${toBlock} (${chunks.length} chunk(s) of up to ${this.eventQueryBlockChunkSize} blocks)`
968
- );
969
- for (const event of allStakeEvents) {
970
- this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event);
971
- }
972
- }
973
- async stakeEventsNative(range = [0, "latest"], filter) {
974
- const name = filter?.name;
975
- if (!isDefined3(name)) {
976
- throw new Error("Only filtered stake events (by name) are supported");
977
- }
978
- const stakedFilter = filter?.args?.staked;
979
- const stakerFilter = filter?.args?.staker;
980
- const stakedFilterEth = isDefined3(stakedFilter) ? toEthAddress8(stakedFilter) : void 0;
981
- const stakerFilterEth = isDefined3(stakerFilter) ? toEthAddress8(stakerFilter) : void 0;
982
- const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth);
983
- const fromBlock = range[0];
984
- const toBlock = range[1] === "latest" ? assertEx10(await this.contract.runner?.provider?.getBlockNumber(), () => new Error("Failed to resolve latest block")) : range[1];
985
- if (fromBlock > toBlock) {
986
- return [];
987
- }
988
- const chunkSize = this.eventQueryBlockChunkSize;
989
- const chunks = blockRangeChunks(fromBlock, toBlock, chunkSize);
990
- const ethEventGroups = [];
991
- for (const [chunkFrom, chunkTo] of chunks) {
1084
+ let eventCount = 0;
1085
+ let chunkCount = 0;
1086
+ let cursor = fromBlock;
1087
+ while (cursor <= toBlock) {
1088
+ const chunkSize = this.eventQueryBlockChunkSize;
1089
+ const chunkTo = Math.min(cursor + chunkSize - 1, toBlock);
1090
+ let logs;
992
1091
  try {
993
- ethEventGroups.push(await withRpcRateLimitBackoff(
994
- () => this.contract.queryFilter(ethFilter, chunkFrom, chunkTo),
1092
+ logs = await withRpcRateLimitBackoff(
1093
+ // '*' = every event on the contract address; parsed against the ABI
1094
+ () => this.contract.queryFilter("*", cursor, chunkTo),
995
1095
  {
996
1096
  initialDelayMs: this.eventQueryInitialDelayMs,
997
1097
  maxAttempts: this.eventQueryMaxAttempts,
998
1098
  onRetry: (_error, attempt, delayMs) => {
999
1099
  this.logger?.warn(
1000
- `Rate limited fetching ${name} logs for blocks ${chunkFrom}-${chunkTo} (attempt ${attempt}/${this.eventQueryMaxAttempts}); backing off ${delayMs}ms`
1100
+ `Rate limited fetching logs for blocks ${cursor}-${chunkTo} (attempt ${attempt}/${this.eventQueryMaxAttempts}); backing off ${delayMs}ms`
1001
1101
  );
1002
1102
  }
1003
1103
  }
1004
- ));
1104
+ );
1005
1105
  } catch (error) {
1106
+ const isFixedSize = isDefined3(this.fixedEventQueryBlockChunkSize);
1107
+ if (!isFixedSize && isRpcRangeLimitError(error) && chunkSize > MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE) {
1108
+ const advertised = rpcRangeLimitFromError(error);
1109
+ const nextSize = Math.max(
1110
+ MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,
1111
+ Math.min(advertised ?? Number.MAX_SAFE_INTEGER, Math.floor(chunkSize / 2))
1112
+ );
1113
+ this.adaptiveChunkSize = nextSize;
1114
+ this.logger?.log(`eth_getLogs rejected a ${chunkSize}-block range; retrying at ${nextSize}`);
1115
+ continue;
1116
+ }
1006
1117
  this.logger?.error(
1007
- `eth_getLogs failed for ${name} blocks ${chunkFrom}-${chunkTo} after rate-limit retries (from=${fromBlock} to=${toBlock}):`,
1118
+ `eth_getLogs failed for blocks ${cursor}-${chunkTo} (from=${fromBlock} to=${toBlock}):`,
1008
1119
  error
1009
1120
  );
1010
1121
  throw error;
1011
1122
  }
1123
+ chunkCount++;
1124
+ for (const log of logs) {
1125
+ if (log instanceof EventLog && STAKE_EVENT_NAMES.has(log.eventName)) {
1126
+ const [staked, by, id, amount] = log.args;
1127
+ const event = this.onEventHandler(staked, by, id, amount, log, true);
1128
+ if (event !== void 0) eventCount++;
1129
+ }
1130
+ }
1131
+ cursor = chunkTo + 1;
1012
1132
  }
1013
- const ethEvents = ethEventGroups.flat();
1014
- return ethEvents.map((e) => {
1015
- assertEx10(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`);
1016
- return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e, true);
1017
- }).filter(exists);
1133
+ this.logger?.log(
1134
+ `Cached ${eventCount} stake events from blocks ${fromBlock}-${toBlock} (${chunkCount} chunk(s), final chunk size ${this.eventQueryBlockChunkSize})`
1135
+ );
1018
1136
  }
1019
1137
  };
1020
1138
  __publicField(EvmStakeEventsViewer, "connectionTypes", ["evm-rpc"]);
@@ -1029,9 +1147,8 @@ EvmStakeEventsViewer = __decorateClass([
1029
1147
  // src/modules/ethereum/drivers/EvmStakeViewer.ts
1030
1148
  import {
1031
1149
  assertEx as assertEx11,
1032
- isDefined as isDefined4,
1033
1150
  toAddress as toAddress4,
1034
- toEthAddress as toEthAddress9
1151
+ toEthAddress as toEthAddress8
1035
1152
  } from "@ariestools/sdk";
1036
1153
  import { IAddressStaking__factory } from "@xyo-network/typechain";
1037
1154
  import {
@@ -1070,12 +1187,12 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1070
1187
  }
1071
1188
  async activeByAddressStaked(address) {
1072
1189
  return await this._callMutex.runExclusive(async () => {
1073
- return await this.contract.activeByAddressStaked(toEthAddress9(address));
1190
+ return await this.contract.activeByAddressStaked(toEthAddress8(address));
1074
1191
  });
1075
1192
  }
1076
1193
  async activeByStaker(address) {
1077
1194
  return await this._callMutex.runExclusive(async () => {
1078
- return await this.contract.activeByStaker(toEthAddress9(address));
1195
+ return await this.contract.activeByStaker(toEthAddress8(address));
1079
1196
  });
1080
1197
  }
1081
1198
  activeStakes() {
@@ -1084,7 +1201,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1084
1201
  async createHandler() {
1085
1202
  await super.createHandler();
1086
1203
  this._stakeEventsViewer = await this.locator.getInstance(StakeEventsViewerMoniker2);
1087
- this._deploymentBlock = isDefined4(this.params.deploymentBlock) ? this.params.deploymentBlock : await estimateBlockNumberAt(this.provider);
1204
+ this._deploymentBlock = this.params.deploymentBlock ?? configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(this.provider, this.address, this.logger);
1088
1205
  }
1089
1206
  minWithdrawalBlocks() {
1090
1207
  return 0;
@@ -1096,7 +1213,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1096
1213
  }
1097
1214
  async pendingByStaker(staker) {
1098
1215
  return await this._callMutex.runExclusive(async () => {
1099
- return await this.contract.pendingByStaker(toEthAddress9(staker));
1216
+ return await this.contract.pendingByStaker(toEthAddress8(staker));
1100
1217
  });
1101
1218
  }
1102
1219
  removedStakes() {
@@ -1121,7 +1238,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1121
1238
  }
1122
1239
  async stakeByStaker(staker, slot) {
1123
1240
  return await this._callMutex.runExclusive(async () => {
1124
- const ethResult = await this.contract.getStake(toEthAddress9(staker), slot);
1241
+ const ethResult = await this.contract.getStake(toEthAddress8(staker), slot);
1125
1242
  const stake = ethStakeToStake(ethResult);
1126
1243
  this._stakeCache.set(stake.id, stake);
1127
1244
  return stake;
@@ -1163,7 +1280,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1163
1280
  }
1164
1281
  async withdrawnByStaker(staker) {
1165
1282
  return await this._callMutex.runExclusive(async () => {
1166
- return await this.contract.withdrawnByStaker(toEthAddress9(staker));
1283
+ return await this.contract.withdrawnByStaker(toEthAddress8(staker));
1167
1284
  });
1168
1285
  }
1169
1286
  withdrawnStakes() {
@@ -1243,7 +1360,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1243
1360
  };
1244
1361
  __publicField(EvmStakeViewer, "connectionTypes", ["evm-rpc"]);
1245
1362
  __publicField(EvmStakeViewer, "defaultMoniker", StakeViewerMoniker);
1246
- __publicField(EvmStakeViewer, "dependencies", [EvmChainViewerMoniker5]);
1363
+ __publicField(EvmStakeViewer, "dependencies", [EvmChainViewerMoniker5, StakeEventsViewerMoniker2]);
1247
1364
  __publicField(EvmStakeViewer, "monikers", [StakeViewerMoniker]);
1248
1365
  __publicField(EvmStakeViewer, "surface", "node");
1249
1366
  EvmStakeViewer = __decorateClass([
@@ -1259,19 +1376,234 @@ var getDefaultGasConfig = () => {
1259
1376
  gasPrice: parseUnits2("100", "gwei")
1260
1377
  };
1261
1378
  };
1379
+
1380
+ // src/modules/ethereum/indexing/EvmEventIndexModel.ts
1381
+ import {
1382
+ EthAddressZod as EthAddressZod2,
1383
+ HexRegExMinMaxMixedCaseWithPrefix as HexRegExMinMaxMixedCaseWithPrefix2,
1384
+ zodAsFactory as zodAsFactory2
1385
+ } from "@ariestools/sdk";
1386
+ import { z as z2 } from "zod/mini";
1387
+ var EvmHashZod = z2.string().check(z2.regex(HexRegExMinMaxMixedCaseWithPrefix2(32, 32)));
1388
+ var EvmDataZod = z2.string().check(z2.regex(/^0x[\dA-Fa-f]*$/));
1389
+ var EvmEventIndexLogZod = z2.object({
1390
+ address: EthAddressZod2,
1391
+ blockHash: EvmHashZod,
1392
+ blockNumber: z2.number(),
1393
+ data: EvmDataZod,
1394
+ index: z2.number(),
1395
+ topics: z2.array(EvmHashZod),
1396
+ transactionHash: EvmHashZod,
1397
+ transactionIndex: z2.number()
1398
+ });
1399
+ var EvmEventIndexFrameZod = z2.object({
1400
+ fromBlock: z2.number(),
1401
+ logs: z2.array(EvmEventIndexLogZod),
1402
+ toBlock: z2.number()
1403
+ });
1404
+ var EvmEventIndexManifestZod = z2.object({
1405
+ address: EthAddressZod2,
1406
+ chainId: z2.string(),
1407
+ deploymentBlock: z2.number(),
1408
+ frameSize: z2.number(),
1409
+ layout: z2.literal("evm-contract-events-v1")
1410
+ });
1411
+ var EvmEventIndexHeadZod = z2.object({
1412
+ address: EthAddressZod2,
1413
+ block: z2.number(),
1414
+ chainId: z2.string(),
1415
+ hash: EvmHashZod
1416
+ });
1417
+ var asEvmEventIndexFrame = zodAsFactory2(EvmEventIndexFrameZod, "asEvmEventIndexFrame");
1418
+ var asEvmEventIndexHead = zodAsFactory2(EvmEventIndexHeadZod, "asEvmEventIndexHead");
1419
+ var asEvmEventIndexManifest = zodAsFactory2(EvmEventIndexManifestZod, "asEvmEventIndexManifest");
1420
+
1421
+ // src/modules/ethereum/indexing/EvmEventIndexPaths.ts
1422
+ function root(address) {
1423
+ return `evm/events/${address.toLowerCase()}`;
1424
+ }
1425
+ function evmEventIndexFramePath(address, frameIndex) {
1426
+ return `${root(address)}/frames/${frameIndex}.json`;
1427
+ }
1428
+ function evmEventIndexHeadPath(address) {
1429
+ return `${root(address)}/head.json`;
1430
+ }
1431
+ function evmEventIndexManifestPath(address) {
1432
+ return `${root(address)}/manifest.json`;
1433
+ }
1434
+ function evmEventIndexTailPath(address) {
1435
+ return `${root(address)}/tail.json`;
1436
+ }
1437
+
1438
+ // src/modules/ethereum/indexing/EvmEventIndexPublishRunner.ts
1439
+ var EvmEventIndexPublishRunnerMoniker = "EvmEventIndexPublishRunner";
1440
+
1441
+ // src/modules/ethereum/indexing/RestStakeEventsViewer.ts
1442
+ import {
1443
+ assertEx as assertEx12,
1444
+ isDefined as isDefined4,
1445
+ toAddress as toAddress5,
1446
+ toEthAddress as toEthAddress9
1447
+ } from "@ariestools/sdk";
1448
+ import { IAddressStakingEvents__factory as IAddressStakingEvents__factory2 } from "@xyo-network/typechain";
1449
+ import {
1450
+ AbstractCreatableProvider as AbstractCreatableProvider2,
1451
+ asAttoXL1 as asAttoXL13,
1452
+ creatableProvider as creatableProvider6,
1453
+ resolveRestConnectionEndpoint,
1454
+ StakeEventsViewerMoniker as StakeEventsViewerMoniker3
1455
+ } from "@xyo-network/xl1-sdk";
1456
+ import { Interface } from "ethers";
1457
+ var STAKE_EVENT_NAMES2 = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
1458
+ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1459
+ moniker = RestStakeEventsViewer.defaultMoniker;
1460
+ completeFrames = /* @__PURE__ */ new Map();
1461
+ contractInterface = new Interface(IAddressStakingEvents__factory2.abi);
1462
+ currentHead;
1463
+ manifestPromise;
1464
+ stakeEventCache = [];
1465
+ syncPromise;
1466
+ tailFrame;
1467
+ get address() {
1468
+ return this.params.address;
1469
+ }
1470
+ get eventIndexBaseUrl() {
1471
+ return this.params.eventIndexBaseUrl;
1472
+ }
1473
+ get fetchFn() {
1474
+ return this.params.fetchFn ?? fetch.bind(globalThis);
1475
+ }
1476
+ static async paramsHandler(params) {
1477
+ const contextConfig = params.context?.config;
1478
+ const address = params.address ?? toEthAddress9(assertEx12(contextConfig?.chain?.id, () => "RestStakeEventsViewer requires an address param or config.chain.id"));
1479
+ const moniker = this.defaultMoniker;
1480
+ const eventIndexBaseUrl = isDefined4(params.eventIndexBaseUrl) && params.eventIndexBaseUrl !== "" ? params.eventIndexBaseUrl : resolveRestConnectionEndpoint(
1481
+ assertEx12(contextConfig, () => "Context config is required to resolve the EVM event index endpoint"),
1482
+ moniker
1483
+ );
1484
+ return {
1485
+ ...await super.paramsHandler(params),
1486
+ address,
1487
+ eventIndexBaseUrl: eventIndexBaseUrl.replace(/\/+$/, ""),
1488
+ fetchFn: params.fetchFn
1489
+ };
1490
+ }
1491
+ async positionCount(range) {
1492
+ const events = await this.stakeEvents(range);
1493
+ return Math.max(-1, ...events.map((event) => event.args.id)) + 1;
1494
+ }
1495
+ async stakeEvents(range = [0, "latest"], filter) {
1496
+ await this.sync();
1497
+ return this.stakeEventCache.filter((event) => this.matchesFilter(event, range, filter));
1498
+ }
1499
+ decodeIndexedStakeEvents() {
1500
+ const frames = [...this.completeFrames.entries()].sort(([a], [b]) => a - b).map(([, frame]) => frame);
1501
+ const logs = [...frames, ...this.tailFrame === void 0 ? [] : [this.tailFrame]].flatMap((frame) => frame.logs).sort((a, b) => a.blockNumber - b.blockNumber || a.transactionIndex - b.transactionIndex || a.index - b.index);
1502
+ return logs.flatMap((log) => {
1503
+ const event = this.stakeEventFromLog(log);
1504
+ return event === void 0 ? [] : [event];
1505
+ });
1506
+ }
1507
+ async fetchJson(path) {
1508
+ const response = await this.fetchFn(`${this.eventIndexBaseUrl}/${path}`);
1509
+ assertEx12(response.ok, () => `EVM event index request failed [${response.status}] for ${path}`);
1510
+ return await response.json();
1511
+ }
1512
+ async getManifest() {
1513
+ this.manifestPromise ??= (async () => {
1514
+ const manifest = asEvmEventIndexManifest(await this.fetchJson(evmEventIndexManifestPath(this.address)), true);
1515
+ assertEx12(manifest.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index manifest address mismatch");
1516
+ return manifest;
1517
+ })();
1518
+ return await this.manifestPromise;
1519
+ }
1520
+ // eslint-disable-next-line complexity
1521
+ matchesFilter(event, range, filter) {
1522
+ if (range[1] !== "latest" && event.time > range[1]) return false;
1523
+ if (event.time < range[0]) return false;
1524
+ if (isDefined4(filter?.name) && event.name !== filter.name) return false;
1525
+ if (isDefined4(filter?.args?.id) && event.args.id !== filter.args.id) return false;
1526
+ if (isDefined4(filter?.args?.staked) && event.args.staked !== filter.args.staked) return false;
1527
+ if (isDefined4(filter?.args?.staker) && event.args.staker !== filter.args.staker) return false;
1528
+ return true;
1529
+ }
1530
+ stakeEventFromLog(log) {
1531
+ const parsed = this.contractInterface.parseLog({ data: log.data, topics: log.topics });
1532
+ if (parsed === null || !STAKE_EVENT_NAMES2.has(parsed.name)) return;
1533
+ const [staked, staker, id, amount] = parsed.args;
1534
+ return {
1535
+ name: parsed.name,
1536
+ args: {
1537
+ amount: asAttoXL13(amount),
1538
+ id: Number(id),
1539
+ staked: toAddress5(staked),
1540
+ staker: toAddress5(staker)
1541
+ },
1542
+ time: log.blockNumber
1543
+ };
1544
+ }
1545
+ async sync() {
1546
+ this.syncPromise ??= this.syncFromHead().finally(() => {
1547
+ this.syncPromise = void 0;
1548
+ });
1549
+ await this.syncPromise;
1550
+ }
1551
+ async syncFromHead() {
1552
+ const manifest = await this.getManifest();
1553
+ const head = asEvmEventIndexHead(await this.fetchJson(evmEventIndexHeadPath(this.address)), true);
1554
+ assertEx12(head.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index head address mismatch");
1555
+ assertEx12(head.chainId === manifest.chainId, () => "EVM event index chain mismatch");
1556
+ if (this.currentHead?.block === head.block && this.currentHead.hash === head.hash) return;
1557
+ if (this.currentHead !== void 0 && (head.block < this.currentHead.block || head.block === this.currentHead.block && head.hash !== this.currentHead.hash)) {
1558
+ this.completeFrames.clear();
1559
+ this.tailFrame = void 0;
1560
+ }
1561
+ const indexedBlockCount = Math.max(0, head.block - manifest.deploymentBlock + 1);
1562
+ const completeFrameCount = Math.floor(indexedBlockCount / manifest.frameSize);
1563
+ const missingFrameIndexes = Array.from({ length: completeFrameCount }, (_, index) => index).filter((index) => !this.completeFrames.has(index));
1564
+ await Promise.all(missingFrameIndexes.map(async (index) => {
1565
+ const frame = asEvmEventIndexFrame(await this.fetchJson(evmEventIndexFramePath(this.address, index)), true);
1566
+ const expectedFrom = manifest.deploymentBlock + index * manifest.frameSize;
1567
+ assertEx12(frame.fromBlock === expectedFrom, () => `EVM event index frame ${index} starts at the wrong block`);
1568
+ assertEx12(frame.toBlock === expectedFrom + manifest.frameSize - 1, () => `EVM event index frame ${index} is incomplete`);
1569
+ this.completeFrames.set(index, frame);
1570
+ }));
1571
+ const tailStart = manifest.deploymentBlock + completeFrameCount * manifest.frameSize;
1572
+ this.tailFrame = tailStart <= head.block ? asEvmEventIndexFrame(await this.fetchJson(`${evmEventIndexTailPath(this.address)}?head=${head.hash}`), true) : void 0;
1573
+ if (this.tailFrame !== void 0) {
1574
+ assertEx12(this.tailFrame.fromBlock === tailStart, () => "EVM event index tail starts at the wrong block");
1575
+ assertEx12(this.tailFrame.toBlock === head.block, () => "EVM event index tail is stale relative to its head");
1576
+ }
1577
+ this.stakeEventCache = this.decodeIndexedStakeEvents();
1578
+ this.currentHead = head;
1579
+ }
1580
+ };
1581
+ __publicField(RestStakeEventsViewer, "connectionTypes", ["rest"]);
1582
+ __publicField(RestStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker3);
1583
+ __publicField(RestStakeEventsViewer, "dependencies", []);
1584
+ __publicField(RestStakeEventsViewer, "monikers", [StakeEventsViewerMoniker3]);
1585
+ __publicField(RestStakeEventsViewer, "surface", "node");
1586
+ RestStakeEventsViewer = __decorateClass([
1587
+ creatableProvider6()
1588
+ ], RestStakeEventsViewer);
1262
1589
  export {
1263
1590
  AbstractEvmProvider,
1264
1591
  AbstractEvmRunner,
1265
1592
  AbstractEvmViewer,
1266
1593
  BaseEthProvider,
1267
1594
  DEFAULT_ESTIMATE_BLOCK_DATE,
1268
- DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE,
1269
1595
  DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS,
1270
1596
  DEFAULT_EVENT_QUERY_MAX_ATTEMPTS,
1597
+ DEFAULT_EVENT_QUERY_START_CHUNK_SIZE,
1271
1598
  DEFAULT_EVM_BLOCK_TIME_SEC,
1272
1599
  EthHashRegEx,
1273
1600
  EthHashZod,
1274
1601
  EvmChainContractViewer,
1602
+ EvmEventIndexFrameZod,
1603
+ EvmEventIndexHeadZod,
1604
+ EvmEventIndexLogZod,
1605
+ EvmEventIndexManifestZod,
1606
+ EvmEventIndexPublishRunnerMoniker,
1275
1607
  EvmStakeAddedEventNameZod,
1276
1608
  EvmStakeAddedEventZod,
1277
1609
  EvmStakeEventArgsZod,
@@ -1285,6 +1617,11 @@ export {
1285
1617
  EvmStakeViewer,
1286
1618
  EvmStakeWithdrawnEventNameZod,
1287
1619
  EvmStakeWithdrawnEventZod,
1620
+ MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,
1621
+ RestStakeEventsViewer,
1622
+ asEvmEventIndexFrame,
1623
+ asEvmEventIndexHead,
1624
+ asEvmEventIndexManifest,
1288
1625
  asEvmStakeAddedEvent,
1289
1626
  asEvmStakeEvent,
1290
1627
  asEvmStakeRemovedEvent,
@@ -1292,23 +1629,34 @@ export {
1292
1629
  blockRangeChunks,
1293
1630
  calculateEthBlockRate,
1294
1631
  calculateEthTimeRate,
1632
+ configuredDeploymentBlock,
1295
1633
  createChain,
1296
1634
  createChainContract,
1297
1635
  createChainRewardsContract,
1298
1636
  estimateBlockNumberAt,
1299
1637
  estimateBlockNumberFromHead,
1300
1638
  ethBlockRate,
1639
+ evmEventIndexFramePath,
1640
+ evmEventIndexHeadPath,
1641
+ evmEventIndexManifestPath,
1642
+ evmEventIndexTailPath,
1643
+ findContractDeploymentBlock,
1301
1644
  getDefaultGasConfig,
1302
1645
  getEthBlockRateBlocks,
1303
1646
  isEvmStakeAddedEvent,
1304
1647
  isEvmStakeEvent,
1305
1648
  isEvmStakeRemovedEvent,
1306
1649
  isEvmStakeWithdrawnEvent,
1650
+ isRpcRangeLimitError,
1651
+ isRpcRateLimitError,
1307
1652
  nextContractAddress,
1308
1653
  nextContractAddressForAddress,
1654
+ resolveContractDeploymentBlock,
1655
+ rpcRangeLimitFromError,
1309
1656
  toEvmStakeAddedEvent,
1310
1657
  toEvmStakeEvent,
1311
1658
  toEvmStakeRemovedEvent,
1312
- toEvmStakeWithdrawnEvent
1659
+ toEvmStakeWithdrawnEvent,
1660
+ withRpcRateLimitBackoff
1313
1661
  };
1314
1662
  //# sourceMappingURL=ethereum.mjs.map