@xyo-network/chain-sdk 4.0.6 → 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 (140) 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 +44 -14
  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/providers/AbstractEvmProvider.d.ts +4 -1
  23. package/dist/browser/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  24. package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts +5 -1
  25. package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  26. package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -2
  27. package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  28. package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -1
  29. package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  30. package/dist/browser/modules/ethereum/rpc/index.d.ts +4 -0
  31. package/dist/browser/modules/ethereum/rpc/index.d.ts.map +1 -0
  32. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +15 -0
  33. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  34. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -1
  35. package/dist/browser/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  36. package/dist/browser/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  37. package/dist/browser/modules/services/Election/BaseElectionService.d.ts +1 -0
  38. package/dist/browser/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  39. package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -2
  40. package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  41. package/dist/browser/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  42. package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  43. package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  44. package/dist/browser/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  45. package/dist/browser/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  46. package/dist/neutral/ethereum.mjs +469 -95
  47. package/dist/neutral/ethereum.mjs.map +4 -4
  48. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts +25 -0
  49. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
  50. package/dist/neutral/modules/ethereum/block/index.d.ts +1 -0
  51. package/dist/neutral/modules/ethereum/block/index.d.ts.map +1 -1
  52. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts +12 -12
  53. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +44 -14
  54. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  55. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -1
  56. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  57. package/dist/neutral/modules/ethereum/index.d.ts +2 -0
  58. package/dist/neutral/modules/ethereum/index.d.ts.map +1 -1
  59. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
  60. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
  61. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
  62. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
  63. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
  64. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
  65. package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
  66. package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
  67. package/dist/neutral/modules/ethereum/indexing/index.d.ts +5 -0
  68. package/dist/neutral/modules/ethereum/indexing/index.d.ts.map +1 -0
  69. package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts +4 -1
  70. package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  71. package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts +5 -1
  72. package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  73. package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -2
  74. package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  75. package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -1
  76. package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  77. package/dist/neutral/modules/ethereum/rpc/index.d.ts +4 -0
  78. package/dist/neutral/modules/ethereum/rpc/index.d.ts.map +1 -0
  79. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +15 -0
  80. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  81. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -1
  82. package/dist/neutral/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  83. package/dist/neutral/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  84. package/dist/neutral/modules/services/Election/BaseElectionService.d.ts +1 -0
  85. package/dist/neutral/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  86. package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -2
  87. package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  88. package/dist/neutral/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  89. package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  90. package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  91. package/dist/neutral/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  92. package/dist/neutral/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  93. package/dist/neutral/services.mjs +46 -13
  94. package/dist/neutral/services.mjs.map +4 -4
  95. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts +25 -0
  96. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
  97. package/dist/node/modules/ethereum/block/index.d.ts +1 -0
  98. package/dist/node/modules/ethereum/block/index.d.ts.map +1 -1
  99. package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts +12 -12
  100. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +44 -14
  101. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  102. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -1
  103. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  104. package/dist/node/modules/ethereum/index.d.ts +2 -0
  105. package/dist/node/modules/ethereum/index.d.ts.map +1 -1
  106. package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
  107. package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
  108. package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
  109. package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
  110. package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
  111. package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
  112. package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
  113. package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
  114. package/dist/node/modules/ethereum/indexing/index.d.ts +5 -0
  115. package/dist/node/modules/ethereum/indexing/index.d.ts.map +1 -0
  116. package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts +4 -1
  117. package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  118. package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts +5 -1
  119. package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  120. package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -2
  121. package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  122. package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -1
  123. package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  124. package/dist/node/modules/ethereum/rpc/index.d.ts +4 -0
  125. package/dist/node/modules/ethereum/rpc/index.d.ts.map +1 -0
  126. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +15 -0
  127. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  128. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -1
  129. package/dist/node/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  130. package/dist/node/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  131. package/dist/node/modules/services/Election/BaseElectionService.d.ts +1 -0
  132. package/dist/node/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  133. package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -2
  134. package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  135. package/dist/node/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  136. package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  137. package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  138. package/dist/node/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  139. package/dist/node/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  140. package/package.json +21 -45
@@ -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 {
@@ -450,47 +503,66 @@ async function createChain(signer, stakingTokenAddress, initialBlockProducer, re
450
503
 
451
504
  // src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
452
505
  import {
453
- assertEx as assertEx8,
454
- exists,
506
+ assertEx as assertEx10,
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,
513
+ EvmChainViewerMoniker as EvmChainViewerMoniker4,
464
514
  StakeEventsViewerMoniker
465
515
  } from "@xyo-network/xl1-sdk";
466
516
  import { asAttoXL1 } from "@xyo-network/xl1-sdk";
517
+ import { EventLog } from "ethers";
467
518
 
468
519
  // src/modules/ethereum/providers/AbstractEvmProvider.ts
469
- import { toEthAddress as toEthAddress4 } from "@ariestools/sdk";
520
+ import {
521
+ assertEx as assertEx6,
522
+ toEthAddress as toEthAddress4
523
+ } from "@ariestools/sdk";
470
524
  import { AbstractCreatableProvider } from "@xyo-network/xl1-sdk";
471
525
  var AbstractEvmProvider = class extends AbstractCreatableProvider {
472
526
  _contract;
527
+ _address;
528
+ get address() {
529
+ return assertEx6(this._address, () => "EVM contract address not initialized");
530
+ }
473
531
  get contract() {
474
532
  return this._contract;
475
533
  }
476
534
  async createHandler() {
477
535
  await super.createHandler();
478
- this._contract = this.connectContract(toEthAddress4(this.params.address));
536
+ this._address = this.params.address ?? toEthAddress4(assertEx6(this.config?.chain?.id, () => "EVM provider requires an address param or config.chain.id"));
537
+ this._contract = this.connectContract(this._address);
479
538
  }
480
539
  };
481
540
 
482
541
  // src/modules/ethereum/providers/AbstractEvmRunner.ts
483
- import { assertEx as assertEx6 } from "@ariestools/sdk";
542
+ import { assertEx as assertEx8 } from "@ariestools/sdk";
484
543
 
485
544
  // src/modules/ethereum/providers/AbstractEvmViewer.ts
545
+ import { assertEx as assertEx7 } from "@ariestools/sdk";
546
+ import { EvmChainViewerMoniker } from "@xyo-network/xl1-sdk";
486
547
  var AbstractEvmViewer = class extends AbstractEvmProvider {
548
+ _provider;
549
+ get provider() {
550
+ return assertEx7(this.params.provider ?? this._provider, () => "EVM provider not initialized");
551
+ }
552
+ async createHandler() {
553
+ if (this.params.provider === void 0) {
554
+ const evmChainViewer = await this.locateAndCreate(EvmChainViewerMoniker);
555
+ this._provider = await evmChainViewer.provider();
556
+ }
557
+ await super.createHandler();
558
+ }
487
559
  };
488
560
 
489
561
  // src/modules/ethereum/providers/AbstractEvmRunner.ts
490
562
  var AbstractEvmRunner = class extends AbstractEvmViewer {
491
563
  static async paramsHandler(params) {
492
- const runner = assertEx6(params?.runner, () => new Error("No runner defined"));
493
- const provider = assertEx6(runner.provider, () => new Error("Runner must have a provider defined"));
564
+ const runner = assertEx8(params?.runner, () => new Error("No runner defined"));
565
+ const provider = assertEx8(runner.provider, () => new Error("Runner must have a provider defined"));
494
566
  return { ...await super.paramsHandler({ ...params, provider }), runner };
495
567
  }
496
568
  };
@@ -498,7 +570,7 @@ var AbstractEvmRunner = class extends AbstractEvmViewer {
498
570
  // src/modules/ethereum/providers/EvmChainContractViewer.ts
499
571
  import {
500
572
  asHash,
501
- assertEx as assertEx7,
573
+ assertEx as assertEx9,
502
574
  toAddress as toAddress2,
503
575
  toEthAddress as toEthAddress5,
504
576
  toHex
@@ -507,6 +579,7 @@ import { IStakedXyoChain__factory } from "@xyo-network/typechain";
507
579
  import {
508
580
  ChainContractViewerMoniker,
509
581
  creatableProvider,
582
+ EvmChainViewerMoniker as EvmChainViewerMoniker2,
510
583
  toXL1BlockNumber,
511
584
  withContextCacheResponse
512
585
  } from "@xyo-network/xl1-sdk";
@@ -519,11 +592,8 @@ var EvmChainContractViewer = class extends AbstractEvmViewer {
519
592
  _minWithdrawalBlocks;
520
593
  _rewardsContract;
521
594
  _stakingTokenAddress;
522
- get address() {
523
- return this.params.address;
524
- }
525
595
  chainId() {
526
- return toHex(this.params.address, { prefix: false });
596
+ return toHex(this.address, { prefix: false });
527
597
  }
528
598
  async chainIdAtBlockNumber(blockNumber) {
529
599
  return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
@@ -531,7 +601,7 @@ var EvmChainContractViewer = class extends AbstractEvmViewer {
531
601
  let contractViewer = this;
532
602
  let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
533
603
  while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {
534
- contractViewer = assertEx7(await contractViewer.forkedChainContractViewer(), () => "Forked chain contract viewer is undefined");
604
+ contractViewer = assertEx9(await contractViewer.forkedChainContractViewer(), () => "Forked chain contract viewer is undefined");
535
605
  forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
536
606
  chainId = await contractViewer.chainId();
537
607
  }
@@ -556,7 +626,11 @@ var EvmChainContractViewer = class extends AbstractEvmViewer {
556
626
  async forkedChainContractViewer() {
557
627
  this._forkedChainContractViewer = this._forkedChainContractViewer ?? (async () => {
558
628
  const address = await this.forkedChainId();
559
- return EvmChainContractViewer.create({ ...this.params, address: toEthAddress5(address) });
629
+ return EvmChainContractViewer.create({
630
+ ...this.params,
631
+ address: toEthAddress5(address),
632
+ provider: this.provider
633
+ });
560
634
  })();
561
635
  return await this._forkedChainContractViewer;
562
636
  }
@@ -583,12 +657,12 @@ var EvmChainContractViewer = class extends AbstractEvmViewer {
583
657
  return await this._stakingTokenAddress;
584
658
  }
585
659
  connectContract(address) {
586
- return IStakedXyoChain__factory.connect(address, this.params.provider);
660
+ return IStakedXyoChain__factory.connect(address, this.provider);
587
661
  }
588
662
  };
589
663
  __publicField(EvmChainContractViewer, "connectionTypes", ["evm-rpc"]);
590
664
  __publicField(EvmChainContractViewer, "defaultMoniker", ChainContractViewerMoniker);
591
- __publicField(EvmChainContractViewer, "dependencies", []);
665
+ __publicField(EvmChainContractViewer, "dependencies", [EvmChainViewerMoniker2]);
592
666
  __publicField(EvmChainContractViewer, "monikers", [ChainContractViewerMoniker]);
593
667
  __publicField(EvmChainContractViewer, "surface", "node");
594
668
  EvmChainContractViewer = __decorateClass([
@@ -638,6 +712,7 @@ import { toEthAddress as toEthAddress7 } from "@ariestools/sdk";
638
712
  import { IStakedXyoChain__factory as IStakedXyoChain__factory3 } from "@xyo-network/typechain";
639
713
  import {
640
714
  creatableProvider as creatableProvider3,
715
+ EvmChainViewerMoniker as EvmChainViewerMoniker3,
641
716
  StakeTotalsViewerMoniker
642
717
  } from "@xyo-network/xl1-sdk";
643
718
  import { getAddress as getAddress2 } from "ethers/address";
@@ -665,18 +740,68 @@ var EvmStakeTotalsViewer = class extends AbstractEvmViewer {
665
740
  return await this.contract.withdrawnByStaker(getAddress2(staker));
666
741
  }
667
742
  connectContract(address) {
668
- return IStakedXyoChain__factory3.connect(address, this.params.provider);
743
+ return IStakedXyoChain__factory3.connect(address, this.provider);
669
744
  }
670
745
  };
671
746
  __publicField(EvmStakeTotalsViewer, "connectionTypes", ["evm-rpc"]);
672
747
  __publicField(EvmStakeTotalsViewer, "defaultMoniker", StakeTotalsViewerMoniker);
673
- __publicField(EvmStakeTotalsViewer, "dependencies", []);
748
+ __publicField(EvmStakeTotalsViewer, "dependencies", [EvmChainViewerMoniker3]);
674
749
  __publicField(EvmStakeTotalsViewer, "monikers", [StakeTotalsViewerMoniker]);
675
750
  __publicField(EvmStakeTotalsViewer, "surface", "node");
676
751
  EvmStakeTotalsViewer = __decorateClass([
677
752
  creatableProvider3()
678
753
  ], EvmStakeTotalsViewer);
679
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
+
680
805
  // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
681
806
  import { delay } from "@ariestools/sdk";
682
807
 
@@ -725,11 +850,11 @@ function isRpcRateLimitError(error) {
725
850
  return false;
726
851
  }
727
852
  function isRateLimitCode(code) {
728
- return code === 429 || code === -32005 || code === -32016;
853
+ return code === 429 || code === -32005 || code === -32007 || code === -32016;
729
854
  }
730
855
  function matchesRateLimitText(text) {
731
856
  const normalized = text.toLowerCase();
732
- return normalized.includes("too many requests") || normalized.includes("rate limit") || normalized.includes("rate exceeded") || normalized.includes("call rate limit") || normalized.includes("exceeded the quota");
857
+ return normalized.includes("too many requests") || normalized.includes("rate limit") || normalized.includes("rate exceeded") || normalized.includes("call rate limit") || normalized.includes("request limit") || normalized.includes("exceeded the quota");
733
858
  }
734
859
 
735
860
  // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
@@ -819,19 +944,26 @@ var asEvmStakeWithdrawnEvent = zodAsFactory(EvmStakeWithdrawnEventZod, "asEvmSta
819
944
  var toEvmStakeWithdrawnEvent = zodToFactory(EvmStakeWithdrawnEventZod, "toEvmStakeWithdrawnEvent");
820
945
 
821
946
  // src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
822
- 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;
823
949
  var DEFAULT_EVENT_QUERY_MAX_ATTEMPTS = 8;
824
950
  var DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS = 1e3;
951
+ var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
825
952
  var EvmStakeEventsViewer = class extends AbstractEvmViewer {
826
953
  moniker = EvmStakeEventsViewer.defaultMoniker;
827
- /** 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). */
828
960
  defaultDeploymentBlock = 0;
829
961
  eventCache = /* @__PURE__ */ new Map();
830
962
  get deploymentBlock() {
831
- return this.params.deploymentBlock ?? this.defaultDeploymentBlock;
963
+ return this.params.deploymentBlock ?? this.config.chain?.deploymentBlock ?? this.defaultDeploymentBlock;
832
964
  }
833
965
  get eventQueryBlockChunkSize() {
834
- return this.params.eventQueryBlockChunkSize ?? DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE;
966
+ return this.fixedEventQueryBlockChunkSize ?? this.adaptiveChunkSize ?? DEFAULT_EVENT_QUERY_START_CHUNK_SIZE;
835
967
  }
836
968
  get eventQueryInitialDelayMs() {
837
969
  return this.params.eventQueryInitialDelayMs ?? DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS;
@@ -839,6 +971,15 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
839
971
  get eventQueryMaxAttempts() {
840
972
  return this.params.eventQueryMaxAttempts ?? DEFAULT_EVENT_QUERY_MAX_ATTEMPTS;
841
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
+ }
842
983
  async positionCount(range) {
843
984
  const events = await this.stakeEvents(range);
844
985
  const positionIds = events.map((e) => e.args.id);
@@ -870,7 +1011,7 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
870
1011
  return result;
871
1012
  }
872
1013
  connectContract(address) {
873
- return IAddressStakingEvents__factory.connect(address, this.params.provider);
1014
+ return IAddressStakingEvents__factory.connect(address, this.provider);
874
1015
  }
875
1016
  onEventHandler(staked, staker, id, amount, event, throwOnInvalid = false) {
876
1017
  const validatedEventResult = EvmStakeEventZod.safeParse(event);
@@ -900,14 +1041,14 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
900
1041
  }
901
1042
  async startHandler() {
902
1043
  try {
903
- const provider = assertEx8(this.contract.runner?.provider, () => new Error("Failed to get provider"));
904
- const historyEndBlock = assertEx8(await provider.getBlockNumber(), () => new Error("Failed to get currentEthBlock"));
1044
+ const provider = assertEx10(this.contract.runner?.provider, () => new Error("Failed to get provider"));
1045
+ const historyEndBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get currentEthBlock"));
905
1046
  if (!isDefined3(this.params.deploymentBlock)) {
906
- this.defaultDeploymentBlock = await estimateBlockNumberAt(provider);
1047
+ this.defaultDeploymentBlock = configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(provider, this.address, this.logger);
907
1048
  }
908
1049
  await this.loadHistoricalEvents(this.deploymentBlock, historyEndBlock);
909
1050
  await this.attachLiveListeners();
910
- const latestBlock = assertEx8(await provider.getBlockNumber(), () => new Error("Failed to get latestEthBlock"));
1051
+ const latestBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get latestEthBlock"));
911
1052
  if (latestBlock > historyEndBlock) {
912
1053
  await this.loadHistoricalEvents(historyEndBlock + 1, latestBlock);
913
1054
  }
@@ -927,74 +1068,76 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
927
1068
  this.onEventHandler(staked, staker, id, amount, event);
928
1069
  });
929
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
+ */
930
1080
  async loadHistoricalEvents(fromBlock, toBlock) {
931
1081
  if (fromBlock > toBlock) {
932
1082
  return;
933
1083
  }
934
- const stakeEventGroups = await Promise.all([
935
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeAdded" }),
936
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeRemoved" }),
937
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeWithdrawn" })
938
- ]);
939
- const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time);
940
- const chunks = blockRangeChunks(fromBlock, toBlock, this.eventQueryBlockChunkSize);
941
- this.logger?.log(
942
- `Cached ${allStakeEvents.length} stake events from blocks ${fromBlock}-${toBlock} (${chunks.length} chunk(s) of up to ${this.eventQueryBlockChunkSize} blocks)`
943
- );
944
- for (const event of allStakeEvents) {
945
- this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event);
946
- }
947
- }
948
- async stakeEventsNative(range = [0, "latest"], filter) {
949
- const name = filter?.name;
950
- if (!isDefined3(name)) {
951
- throw new Error("Only filtered stake events (by name) are supported");
952
- }
953
- const stakedFilter = filter?.args?.staked;
954
- const stakerFilter = filter?.args?.staker;
955
- const stakedFilterEth = isDefined3(stakedFilter) ? toEthAddress8(stakedFilter) : void 0;
956
- const stakerFilterEth = isDefined3(stakerFilter) ? toEthAddress8(stakerFilter) : void 0;
957
- const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth);
958
- const fromBlock = range[0];
959
- const toBlock = range[1] === "latest" ? assertEx8(await this.contract.runner?.provider?.getBlockNumber(), () => new Error("Failed to resolve latest block")) : range[1];
960
- if (fromBlock > toBlock) {
961
- return [];
962
- }
963
- const chunkSize = this.eventQueryBlockChunkSize;
964
- const chunks = blockRangeChunks(fromBlock, toBlock, chunkSize);
965
- const ethEventGroups = [];
966
- 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;
967
1091
  try {
968
- ethEventGroups.push(await withRpcRateLimitBackoff(
969
- () => 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),
970
1095
  {
971
1096
  initialDelayMs: this.eventQueryInitialDelayMs,
972
1097
  maxAttempts: this.eventQueryMaxAttempts,
973
1098
  onRetry: (_error, attempt, delayMs) => {
974
1099
  this.logger?.warn(
975
- `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`
976
1101
  );
977
1102
  }
978
1103
  }
979
- ));
1104
+ );
980
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
+ }
981
1117
  this.logger?.error(
982
- `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}):`,
983
1119
  error
984
1120
  );
985
1121
  throw error;
986
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;
987
1132
  }
988
- const ethEvents = ethEventGroups.flat();
989
- return ethEvents.map((e) => {
990
- assertEx8(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`);
991
- return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e, true);
992
- }).filter(exists);
1133
+ this.logger?.log(
1134
+ `Cached ${eventCount} stake events from blocks ${fromBlock}-${toBlock} (${chunkCount} chunk(s), final chunk size ${this.eventQueryBlockChunkSize})`
1135
+ );
993
1136
  }
994
1137
  };
995
1138
  __publicField(EvmStakeEventsViewer, "connectionTypes", ["evm-rpc"]);
996
1139
  __publicField(EvmStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker);
997
- __publicField(EvmStakeEventsViewer, "dependencies", []);
1140
+ __publicField(EvmStakeEventsViewer, "dependencies", [EvmChainViewerMoniker4]);
998
1141
  __publicField(EvmStakeEventsViewer, "monikers", [StakeEventsViewerMoniker]);
999
1142
  __publicField(EvmStakeEventsViewer, "surface", "node");
1000
1143
  EvmStakeEventsViewer = __decorateClass([
@@ -1003,14 +1146,14 @@ EvmStakeEventsViewer = __decorateClass([
1003
1146
 
1004
1147
  // src/modules/ethereum/drivers/EvmStakeViewer.ts
1005
1148
  import {
1006
- assertEx as assertEx9,
1007
- isDefined as isDefined4,
1149
+ assertEx as assertEx11,
1008
1150
  toAddress as toAddress4,
1009
- toEthAddress as toEthAddress9
1151
+ toEthAddress as toEthAddress8
1010
1152
  } from "@ariestools/sdk";
1011
1153
  import { IAddressStaking__factory } from "@xyo-network/typechain";
1012
1154
  import {
1013
1155
  creatableProvider as creatableProvider5,
1156
+ EvmChainViewerMoniker as EvmChainViewerMoniker5,
1014
1157
  StakeEventsViewerMoniker as StakeEventsViewerMoniker2,
1015
1158
  StakeViewerMoniker
1016
1159
  } from "@xyo-network/xl1-sdk";
@@ -1044,12 +1187,12 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1044
1187
  }
1045
1188
  async activeByAddressStaked(address) {
1046
1189
  return await this._callMutex.runExclusive(async () => {
1047
- return await this.contract.activeByAddressStaked(toEthAddress9(address));
1190
+ return await this.contract.activeByAddressStaked(toEthAddress8(address));
1048
1191
  });
1049
1192
  }
1050
1193
  async activeByStaker(address) {
1051
1194
  return await this._callMutex.runExclusive(async () => {
1052
- return await this.contract.activeByStaker(toEthAddress9(address));
1195
+ return await this.contract.activeByStaker(toEthAddress8(address));
1053
1196
  });
1054
1197
  }
1055
1198
  activeStakes() {
@@ -1058,7 +1201,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1058
1201
  async createHandler() {
1059
1202
  await super.createHandler();
1060
1203
  this._stakeEventsViewer = await this.locator.getInstance(StakeEventsViewerMoniker2);
1061
- this._deploymentBlock = isDefined4(this.params.deploymentBlock) ? this.params.deploymentBlock : await estimateBlockNumberAt(this.params.provider);
1204
+ this._deploymentBlock = this.params.deploymentBlock ?? configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(this.provider, this.address, this.logger);
1062
1205
  }
1063
1206
  minWithdrawalBlocks() {
1064
1207
  return 0;
@@ -1070,7 +1213,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1070
1213
  }
1071
1214
  async pendingByStaker(staker) {
1072
1215
  return await this._callMutex.runExclusive(async () => {
1073
- return await this.contract.pendingByStaker(toEthAddress9(staker));
1216
+ return await this.contract.pendingByStaker(toEthAddress8(staker));
1074
1217
  });
1075
1218
  }
1076
1219
  removedStakes() {
@@ -1095,7 +1238,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1095
1238
  }
1096
1239
  async stakeByStaker(staker, slot) {
1097
1240
  return await this._callMutex.runExclusive(async () => {
1098
- const ethResult = await this.contract.getStake(toEthAddress9(staker), slot);
1241
+ const ethResult = await this.contract.getStake(toEthAddress8(staker), slot);
1099
1242
  const stake = ethStakeToStake(ethResult);
1100
1243
  this._stakeCache.set(stake.id, stake);
1101
1244
  return stake;
@@ -1137,14 +1280,14 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1137
1280
  }
1138
1281
  async withdrawnByStaker(staker) {
1139
1282
  return await this._callMutex.runExclusive(async () => {
1140
- return await this.contract.withdrawnByStaker(toEthAddress9(staker));
1283
+ return await this.contract.withdrawnByStaker(toEthAddress8(staker));
1141
1284
  });
1142
1285
  }
1143
1286
  withdrawnStakes() {
1144
1287
  return this._stakeCache.values().filter((stake) => stake.removeBlock !== 0 && stake.withdrawBlock !== 0).toArray();
1145
1288
  }
1146
1289
  connectContract(address) {
1147
- return IAddressStaking__factory.connect(address, this.params.provider);
1290
+ return IAddressStaking__factory.connect(address, this.provider);
1148
1291
  }
1149
1292
  async startHandler() {
1150
1293
  await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
@@ -1159,14 +1302,14 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1159
1302
  });
1160
1303
  });
1161
1304
  await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
1162
- const stake = assertEx9(this._stakeCache.get(Number(id)));
1305
+ const stake = assertEx11(this._stakeCache.get(Number(id)));
1163
1306
  this._stakeCache.set(Number(id), {
1164
1307
  ...stake,
1165
1308
  removeBlock: event.blockNumber
1166
1309
  });
1167
1310
  });
1168
1311
  await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
1169
- const stake = assertEx9(this._stakeCache.get(Number(id)));
1312
+ const stake = assertEx11(this._stakeCache.get(Number(id)));
1170
1313
  this._stakeCache.set(Number(id), {
1171
1314
  ...stake,
1172
1315
  withdrawBlock: event.blockNumber
@@ -1199,7 +1342,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1199
1342
  return;
1200
1343
  }
1201
1344
  if (event.name === "StakeRemoved") {
1202
- const stake = assertEx9(this._stakeCache.get(event.args.id));
1345
+ const stake = assertEx11(this._stakeCache.get(event.args.id));
1203
1346
  this._stakeCache.set(event.args.id, {
1204
1347
  ...stake,
1205
1348
  removeBlock: event.time
@@ -1207,7 +1350,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1207
1350
  return;
1208
1351
  }
1209
1352
  if (event.name === "StakeWithdrawn") {
1210
- const stake = assertEx9(this._stakeCache.get(event.args.id));
1353
+ const stake = assertEx11(this._stakeCache.get(event.args.id));
1211
1354
  this._stakeCache.set(event.args.id, {
1212
1355
  ...stake,
1213
1356
  withdrawBlock: event.time
@@ -1217,7 +1360,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
1217
1360
  };
1218
1361
  __publicField(EvmStakeViewer, "connectionTypes", ["evm-rpc"]);
1219
1362
  __publicField(EvmStakeViewer, "defaultMoniker", StakeViewerMoniker);
1220
- __publicField(EvmStakeViewer, "dependencies", []);
1363
+ __publicField(EvmStakeViewer, "dependencies", [EvmChainViewerMoniker5, StakeEventsViewerMoniker2]);
1221
1364
  __publicField(EvmStakeViewer, "monikers", [StakeViewerMoniker]);
1222
1365
  __publicField(EvmStakeViewer, "surface", "node");
1223
1366
  EvmStakeViewer = __decorateClass([
@@ -1233,19 +1376,234 @@ var getDefaultGasConfig = () => {
1233
1376
  gasPrice: parseUnits2("100", "gwei")
1234
1377
  };
1235
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);
1236
1589
  export {
1237
1590
  AbstractEvmProvider,
1238
1591
  AbstractEvmRunner,
1239
1592
  AbstractEvmViewer,
1240
1593
  BaseEthProvider,
1241
1594
  DEFAULT_ESTIMATE_BLOCK_DATE,
1242
- DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE,
1243
1595
  DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS,
1244
1596
  DEFAULT_EVENT_QUERY_MAX_ATTEMPTS,
1597
+ DEFAULT_EVENT_QUERY_START_CHUNK_SIZE,
1245
1598
  DEFAULT_EVM_BLOCK_TIME_SEC,
1246
1599
  EthHashRegEx,
1247
1600
  EthHashZod,
1248
1601
  EvmChainContractViewer,
1602
+ EvmEventIndexFrameZod,
1603
+ EvmEventIndexHeadZod,
1604
+ EvmEventIndexLogZod,
1605
+ EvmEventIndexManifestZod,
1606
+ EvmEventIndexPublishRunnerMoniker,
1249
1607
  EvmStakeAddedEventNameZod,
1250
1608
  EvmStakeAddedEventZod,
1251
1609
  EvmStakeEventArgsZod,
@@ -1259,6 +1617,11 @@ export {
1259
1617
  EvmStakeViewer,
1260
1618
  EvmStakeWithdrawnEventNameZod,
1261
1619
  EvmStakeWithdrawnEventZod,
1620
+ MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,
1621
+ RestStakeEventsViewer,
1622
+ asEvmEventIndexFrame,
1623
+ asEvmEventIndexHead,
1624
+ asEvmEventIndexManifest,
1262
1625
  asEvmStakeAddedEvent,
1263
1626
  asEvmStakeEvent,
1264
1627
  asEvmStakeRemovedEvent,
@@ -1266,23 +1629,34 @@ export {
1266
1629
  blockRangeChunks,
1267
1630
  calculateEthBlockRate,
1268
1631
  calculateEthTimeRate,
1632
+ configuredDeploymentBlock,
1269
1633
  createChain,
1270
1634
  createChainContract,
1271
1635
  createChainRewardsContract,
1272
1636
  estimateBlockNumberAt,
1273
1637
  estimateBlockNumberFromHead,
1274
1638
  ethBlockRate,
1639
+ evmEventIndexFramePath,
1640
+ evmEventIndexHeadPath,
1641
+ evmEventIndexManifestPath,
1642
+ evmEventIndexTailPath,
1643
+ findContractDeploymentBlock,
1275
1644
  getDefaultGasConfig,
1276
1645
  getEthBlockRateBlocks,
1277
1646
  isEvmStakeAddedEvent,
1278
1647
  isEvmStakeEvent,
1279
1648
  isEvmStakeRemovedEvent,
1280
1649
  isEvmStakeWithdrawnEvent,
1650
+ isRpcRangeLimitError,
1651
+ isRpcRateLimitError,
1281
1652
  nextContractAddress,
1282
1653
  nextContractAddressForAddress,
1654
+ resolveContractDeploymentBlock,
1655
+ rpcRangeLimitFromError,
1283
1656
  toEvmStakeAddedEvent,
1284
1657
  toEvmStakeEvent,
1285
1658
  toEvmStakeRemovedEvent,
1286
- toEvmStakeWithdrawnEvent
1659
+ toEvmStakeWithdrawnEvent,
1660
+ withRpcRateLimitBackoff
1287
1661
  };
1288
1662
  //# sourceMappingURL=ethereum.mjs.map