@xyo-network/chain-sdk 4.2.1 → 4.3.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 (118) hide show
  1. package/dist/browser/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
  2. package/dist/browser/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
  3. package/dist/browser/modules/ethereum/block/findContractDeploymentBlock.d.ts +1 -24
  4. package/dist/browser/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -1
  5. package/dist/browser/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
  6. package/dist/browser/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
  7. package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -87
  8. package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  9. package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
  10. package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  11. package/dist/browser/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -1
  12. package/dist/browser/modules/ethereum/indexing/index.d.ts +1 -3
  13. package/dist/browser/modules/ethereum/indexing/index.d.ts.map +1 -1
  14. package/dist/browser/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
  15. package/dist/browser/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  16. package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  17. package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  18. package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  19. package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  20. package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  21. package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  22. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +1 -14
  23. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
  24. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  25. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  26. package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  27. package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  28. package/dist/browser/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  29. package/dist/browser/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  30. package/dist/browser/modules/wrappers/index.d.ts +1 -1
  31. package/dist/browser/modules/wrappers/index.d.ts.map +1 -1
  32. package/dist/neutral/ethereum.mjs +189 -1038
  33. package/dist/neutral/ethereum.mjs.map +4 -4
  34. package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
  35. package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
  36. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts +1 -24
  37. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -1
  38. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
  39. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
  40. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -87
  41. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  42. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
  43. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  44. package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -1
  45. package/dist/neutral/modules/ethereum/indexing/index.d.ts +1 -3
  46. package/dist/neutral/modules/ethereum/indexing/index.d.ts.map +1 -1
  47. package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
  48. package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  49. package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  50. package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  51. package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  52. package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  53. package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  54. package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  55. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +1 -14
  56. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
  57. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  58. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  59. package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  60. package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  61. package/dist/neutral/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  62. package/dist/neutral/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  63. package/dist/neutral/modules/wrappers/index.d.ts +1 -1
  64. package/dist/neutral/modules/wrappers/index.d.ts.map +1 -1
  65. package/dist/neutral/services.mjs +16 -59
  66. package/dist/neutral/services.mjs.map +3 -3
  67. package/dist/neutral/wrappers.mjs +1 -1
  68. package/dist/neutral/wrappers.mjs.map +1 -1
  69. package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
  70. package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
  71. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts +1 -24
  72. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -1
  73. package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
  74. package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
  75. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -87
  76. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  77. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
  78. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  79. package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -1
  80. package/dist/node/modules/ethereum/indexing/index.d.ts +1 -3
  81. package/dist/node/modules/ethereum/indexing/index.d.ts.map +1 -1
  82. package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
  83. package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  84. package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  85. package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  86. package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  87. package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  88. package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  89. package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  90. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +1 -14
  91. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
  92. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  93. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  94. package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  95. package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  96. package/dist/node/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  97. package/dist/node/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  98. package/dist/node/modules/wrappers/index.d.ts +1 -1
  99. package/dist/node/modules/wrappers/index.d.ts.map +1 -1
  100. package/package.json +13 -16
  101. package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts +0 -107
  102. package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +0 -1
  103. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +0 -6
  104. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +0 -1
  105. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +0 -9
  106. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +0 -1
  107. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts +0 -107
  108. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +0 -1
  109. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +0 -6
  110. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +0 -1
  111. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +0 -9
  112. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +0 -1
  113. package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts +0 -107
  114. package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +0 -1
  115. package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +0 -6
  116. package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +0 -1
  117. package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +0 -9
  118. package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +0 -1
@@ -182,74 +182,19 @@ function blockRangeChunks(fromBlock, toBlock, chunkSize) {
182
182
  }
183
183
 
184
184
  // src/modules/ethereum/block/estimateBlockNumberAt.ts
185
- import { assertEx } from "@ariestools/sdk";
186
- var DEFAULT_EVM_BLOCK_TIME_SEC = 12;
187
- var DEFAULT_ESTIMATE_BLOCK_DATE = new Date(Date.UTC(2025, 5, 1));
188
- function estimateBlockNumberFromHead(headNumber, headTimestampSec, targetDate = DEFAULT_ESTIMATE_BLOCK_DATE, avgBlockTimeSec = DEFAULT_EVM_BLOCK_TIME_SEC) {
189
- const targetTimestampSec = Math.floor(targetDate.getTime() / 1e3);
190
- if (targetTimestampSec >= headTimestampSec) {
191
- return headNumber;
192
- }
193
- const blocksBack = Math.ceil((headTimestampSec - targetTimestampSec) / avgBlockTimeSec);
194
- return Math.max(0, headNumber - blocksBack);
195
- }
196
- async function estimateBlockNumberAt(provider, targetDate = DEFAULT_ESTIMATE_BLOCK_DATE, avgBlockTimeSec = DEFAULT_EVM_BLOCK_TIME_SEC) {
197
- const head = assertEx(await provider.getBlock("latest"), () => new Error("Failed to get latest eth block"));
198
- return estimateBlockNumberFromHead(head.number, head.timestamp, targetDate, avgBlockTimeSec);
199
- }
185
+ import {
186
+ DEFAULT_ESTIMATE_BLOCK_DATE,
187
+ DEFAULT_EVM_BLOCK_TIME_SEC,
188
+ estimateBlockNumberAt,
189
+ estimateBlockNumberFromHead
190
+ } from "@xyo-network/xl1-sdk";
200
191
 
201
192
  // 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
- }
193
+ import {
194
+ configuredDeploymentBlock,
195
+ findContractDeploymentBlock,
196
+ resolveContractDeploymentBlock
197
+ } from "@xyo-network/xl1-sdk";
253
198
 
254
199
  // src/modules/ethereum/block/rate/blockRate.ts
255
200
  import { isDefined, isFalsy } from "@ariestools/sdk";
@@ -299,7 +244,7 @@ var calculateEthBlockRate = async (provider, range, timeUnit) => {
299
244
 
300
245
  // src/modules/ethereum/block/rate/timeRate.ts
301
246
  import {
302
- assertEx as assertEx2,
247
+ assertEx,
303
248
  isDefined as isDefined2,
304
249
  isDefinedNotNull
305
250
  } from "@ariestools/sdk";
@@ -311,12 +256,12 @@ import {
311
256
  var DEFAULT_TOLERANCE_MS = 3e4;
312
257
  var DEFAULT_MAX_ATTEMPTS = 20;
313
258
  var calculateEthTimeRate = async (provider, timeConfig, startBlockNumber, timeUnit, toleranceMs = DEFAULT_TOLERANCE_MS, maxAttempts = DEFAULT_MAX_ATTEMPTS) => {
314
- assertEx2(Object.keys(timeConfig ?? {}).length === 1, () => "Only one time unit should be specified in timeConfig");
259
+ assertEx(Object.keys(timeConfig ?? {}).length === 1, () => "Only one time unit should be specified in timeConfig");
315
260
  const startBlock = isDefinedNotNull(startBlockNumber) ? await provider.getBlock(BigInt(startBlockNumber)) : null;
316
- assertEx2(isDefinedNotNull(startBlockNumber) && isDefinedNotNull(startBlock), () => "Start block could not be resolved");
317
- const resolvedStartBlock = isDefinedNotNull(startBlock) ? startBlock : assertEx2(await provider.getBlock("latest"));
261
+ assertEx(isDefinedNotNull(startBlockNumber) && isDefinedNotNull(startBlock), () => "Start block could not be resolved");
262
+ const resolvedStartBlock = isDefinedNotNull(startBlock) ? startBlock : assertEx(await provider.getBlock("latest"));
318
263
  const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig);
319
- assertEx2(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
264
+ assertEx(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
320
265
  const blocksPerMillisecondRate = 1 / (12 * 1e3);
321
266
  const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds);
322
267
  const endBlockNumber = await findEndBlockRecursive(
@@ -335,14 +280,14 @@ var calculateEthTimeRate = async (provider, timeConfig, startBlockNumber, timeUn
335
280
  };
336
281
  var findEndBlockRecursive = async (provider, startBlock, targetTimeMs, estimatedBlocksBack, toleranceMs, attemptsRemaining) => {
337
282
  console.log(`Attempts remaining: ${attemptsRemaining}, Estimated blocks back: ${estimatedBlocksBack}`);
338
- assertEx2(attemptsRemaining > 0, () => "Maximum attempts reached while searching for end block");
283
+ assertEx(attemptsRemaining > 0, () => "Maximum attempts reached while searching for end block");
339
284
  const startBlockEpoch = startBlock.timestamp;
340
285
  const estimatedEndBlockNumber = startBlock.number - estimatedBlocksBack;
341
286
  if (estimatedEndBlockNumber < 0) {
342
287
  throw new Error("Estimated end block number is less than zero");
343
288
  }
344
289
  const endBlock = await provider.getBlock(estimatedEndBlockNumber);
345
- const resolvedEndBlock = assertEx2(
290
+ const resolvedEndBlock = assertEx(
346
291
  isDefined2(endBlock) ? endBlock : void 0,
347
292
  () => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`
348
293
  );
@@ -385,7 +330,7 @@ import { createGenesisBlock } from "#protocol";
385
330
  // src/modules/ethereum/createChainContract.ts
386
331
  import {
387
332
  asAddress,
388
- assertEx as assertEx3,
333
+ assertEx as assertEx2,
389
334
  ETH_ZERO_ADDRESS,
390
335
  hexToBigInt,
391
336
  toEthAddress
@@ -413,7 +358,7 @@ var createChainContract = async (signer, stakingTokenAddress, genesisBlockHash,
413
358
  );
414
359
  await deployResponse.waitForDeployment();
415
360
  const xyoChainContractAddress = await deployResponse.getAddress();
416
- return assertEx3(asAddress(xyoChainContractAddress), () => "Invalid staking contract address");
361
+ return assertEx2(asAddress(xyoChainContractAddress), () => "Invalid staking contract address");
417
362
  } catch (ex) {
418
363
  console.log(ex);
419
364
  throw ex;
@@ -423,7 +368,7 @@ var createChainContract = async (signer, stakingTokenAddress, genesisBlockHash,
423
368
  // src/modules/ethereum/createChainRewardsContract.ts
424
369
  import {
425
370
  asAddress as asAddress2,
426
- assertEx as assertEx4,
371
+ assertEx as assertEx3,
427
372
  toFixedPoint
428
373
  } from "@ariestools/sdk";
429
374
  import { XyoChainRewards__factory as XyoChainRewardsFactory } from "@xyo-network/typechain";
@@ -450,7 +395,7 @@ var createChainRewardsContract = async (signer, genesisReward = 0n, gas = gasCon
450
395
  );
451
396
  await deployResponse.waitForDeployment();
452
397
  const xyoChainRewardsAddress = await deployResponse.getAddress();
453
- return assertEx4(asAddress2(xyoChainRewardsAddress), () => "Invalid rewards contract address");
398
+ return assertEx3(asAddress2(xyoChainRewardsAddress), () => "Invalid rewards contract address");
454
399
  } catch (ex) {
455
400
  console.log(ex);
456
401
  throw ex;
@@ -460,7 +405,7 @@ var createChainRewardsContract = async (signer, genesisReward = 0n, gas = gasCon
460
405
  // src/modules/ethereum/nextContractAddress.ts
461
406
  import {
462
407
  asAddress as asAddress3,
463
- assertEx as assertEx5,
408
+ assertEx as assertEx4,
464
409
  toEthAddress as toEthAddress2
465
410
  } from "@ariestools/sdk";
466
411
  import { getCreateAddress } from "ethers/address";
@@ -468,11 +413,11 @@ var nextContractAddressForAddress = async (address, provider) => {
468
413
  const deployerAddress = toEthAddress2(address);
469
414
  const nonce = await provider.getTransactionCount(deployerAddress);
470
415
  const contractAddress = getCreateAddress({ from: deployerAddress, nonce });
471
- return assertEx5(asAddress3(contractAddress), () => "Unable to convert contract address to address");
416
+ return assertEx4(asAddress3(contractAddress), () => "Unable to convert contract address to address");
472
417
  };
473
418
  var nextContractAddress = async (signer) => {
474
- const provider = assertEx5(signer.provider, () => "Unable to obtain provider from signer");
475
- const address = assertEx5(asAddress3(await signer.getAddress()), () => "Unable to obtain address from signer");
419
+ const provider = assertEx4(signer.provider, () => "Unable to obtain provider from signer");
420
+ const address = assertEx4(asAddress3(await signer.getAddress()), () => "Unable to obtain address from signer");
476
421
  return await nextContractAddressForAddress(address, provider);
477
422
  };
478
423
 
@@ -503,869 +448,42 @@ async function createChain(signer, stakingTokenAddress, initialBlockProducer, re
503
448
 
504
449
  // src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
505
450
  import {
506
- assertEx as assertEx10,
507
- isDefined as isDefined3,
508
- toAddress as toAddress3
509
- } from "@ariestools/sdk";
510
- import { IAddressStakingEvents__factory } from "@xyo-network/typechain";
511
- import {
512
- creatableProvider as creatableProvider4,
513
- EvmChainViewerMoniker as EvmChainViewerMoniker4,
514
- StakeEventsViewerMoniker
515
- } from "@xyo-network/xl1-sdk";
516
- import { asAttoXL1 } from "@xyo-network/xl1-sdk";
517
- import { EventLog } from "ethers";
518
-
519
- // src/modules/ethereum/providers/AbstractEvmProvider.ts
520
- import {
521
- assertEx as assertEx6,
522
- toEthAddress as toEthAddress4
523
- } from "@ariestools/sdk";
524
- import { AbstractCreatableProvider } from "@xyo-network/xl1-sdk";
525
- var AbstractEvmProvider = class extends AbstractCreatableProvider {
526
- _contract;
527
- _address;
528
- get address() {
529
- return assertEx6(this._address, () => "EVM contract address not initialized");
530
- }
531
- get contract() {
532
- return this._contract;
533
- }
534
- async createHandler() {
535
- await super.createHandler();
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);
538
- }
539
- };
540
-
541
- // src/modules/ethereum/providers/AbstractEvmRunner.ts
542
- import { assertEx as assertEx8 } from "@ariestools/sdk";
543
-
544
- // src/modules/ethereum/providers/AbstractEvmViewer.ts
545
- import { assertEx as assertEx7 } from "@ariestools/sdk";
546
- import { EvmChainViewerMoniker } from "@xyo-network/xl1-sdk";
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
- }
559
- };
560
-
561
- // src/modules/ethereum/providers/AbstractEvmRunner.ts
562
- var AbstractEvmRunner = class extends AbstractEvmViewer {
563
- static async paramsHandler(params) {
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"));
566
- return { ...await super.paramsHandler({ ...params, provider }), runner };
567
- }
568
- };
569
-
570
- // src/modules/ethereum/providers/EvmChainContractViewer.ts
571
- import {
572
- asHash,
573
- assertEx as assertEx9,
574
- toAddress as toAddress2,
575
- toEthAddress as toEthAddress5,
576
- toHex
577
- } from "@ariestools/sdk";
578
- import { IStakedXyoChain__factory } from "@xyo-network/typechain";
579
- import {
580
- ChainContractViewerMoniker,
581
- creatableProvider,
582
- EvmChainViewerMoniker as EvmChainViewerMoniker2,
583
- toXL1BlockNumber,
584
- withContextCacheResponse
585
- } from "@xyo-network/xl1-sdk";
586
- var EvmChainContractViewer = class extends AbstractEvmViewer {
587
- moniker = EvmChainContractViewer.defaultMoniker;
588
- _forkedAtBlockNumber;
589
- _forkedAtHash;
590
- _forkedChainContractViewer;
591
- _forkedChainId;
592
- _minWithdrawalBlocks;
593
- _rewardsContract;
594
- _stakingTokenAddress;
595
- chainId() {
596
- return toHex(this.address, { prefix: false });
597
- }
598
- async chainIdAtBlockNumber(blockNumber) {
599
- return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
600
- let chainId = this.chainId();
601
- let contractViewer = this;
602
- let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
603
- while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {
604
- contractViewer = assertEx9(await contractViewer.forkedChainContractViewer(), () => "Forked chain contract viewer is undefined");
605
- forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
606
- chainId = await contractViewer.chainId();
607
- }
608
- return chainId;
609
- });
610
- }
611
- async forkedAtBlockNumber() {
612
- const contractAddress = this.contract.getAddress();
613
- try {
614
- this._forkedAtBlockNumber = this._forkedAtBlockNumber ?? (async () => toXL1BlockNumber(await this.contract.forkedAtBlockNumber(), true))();
615
- return await this._forkedAtBlockNumber;
616
- } catch {
617
- this.logger?.warn("Failed to fetch forkedAtBlockNumber, returning null", contractAddress);
618
- this._forkedAtBlockNumber = Promise.resolve(null);
619
- return await this._forkedAtBlockNumber;
620
- }
621
- }
622
- async forkedAtHash() {
623
- this._forkedAtHash = this._forkedAtHash ?? (async () => asHash(toHex(await this.contract.forkedAtHash()), true))();
624
- return await this._forkedAtHash;
625
- }
626
- async forkedChainContractViewer() {
627
- this._forkedChainContractViewer = this._forkedChainContractViewer ?? (async () => {
628
- const address = await this.forkedChainId();
629
- return EvmChainContractViewer.create({
630
- ...this.params,
631
- address: toEthAddress5(address),
632
- provider: this.provider
633
- });
634
- })();
635
- return await this._forkedChainContractViewer;
636
- }
637
- async forkedChainId() {
638
- this._forkedChainId = this._forkedChainId ?? (async () => {
639
- return toAddress2(await this.contract.forkedChainId());
640
- })();
641
- return await this._forkedChainId;
642
- }
643
- async minWithdrawalBlocks() {
644
- this._minWithdrawalBlocks = this._minWithdrawalBlocks ?? (async () => Number(await this.contract.minWithdrawalBlocks()))();
645
- return await this._minWithdrawalBlocks;
646
- }
647
- async rewardsContract() {
648
- this._rewardsContract = this._rewardsContract ?? (async () => {
649
- return toAddress2(await this.contract.rewardsContract());
650
- })();
651
- return await this._rewardsContract;
652
- }
653
- async stakingTokenAddress() {
654
- this._stakingTokenAddress = this._stakingTokenAddress ?? (async () => {
655
- return toAddress2(await this.contract.stakingTokenAddress());
656
- })();
657
- return await this._stakingTokenAddress;
658
- }
659
- connectContract(address) {
660
- return IStakedXyoChain__factory.connect(address, this.provider);
661
- }
662
- };
663
- __publicField(EvmChainContractViewer, "connectionTypes", ["evm-rpc"]);
664
- __publicField(EvmChainContractViewer, "defaultMoniker", ChainContractViewerMoniker);
665
- __publicField(EvmChainContractViewer, "dependencies", [EvmChainViewerMoniker2]);
666
- __publicField(EvmChainContractViewer, "monikers", [ChainContractViewerMoniker]);
667
- __publicField(EvmChainContractViewer, "surface", "node");
668
- EvmChainContractViewer = __decorateClass([
669
- creatableProvider()
670
- ], EvmChainContractViewer);
671
-
672
- // src/modules/ethereum/providers/EvmStakeRunner.ts
673
- import { toEthAddress as toEthAddress6 } from "@ariestools/sdk";
674
- import { IStakedXyoChain__factory as IStakedXyoChain__factory2 } from "@xyo-network/typechain";
675
- import {
676
- creatableProvider as creatableProvider2,
677
- StakeRunnerMoniker
678
- } from "@xyo-network/xl1-sdk";
679
- import { getAddress } from "ethers/address";
680
- var EvmStakeRunner = class extends AbstractEvmRunner {
681
- moniker = EvmStakeRunner.defaultMoniker;
682
- async addStake(staked, amount) {
683
- const result = await this.contract.addStake(getAddress(toEthAddress6(staked)), amount);
684
- await result.wait();
685
- return true;
686
- }
687
- async removeStake(slot) {
688
- const result = await this.contract.removeStake(slot);
689
- await result.wait();
690
- return true;
691
- }
692
- async withdrawStake(slot) {
693
- const result = await this.contract.withdrawStake(slot);
694
- await result.wait();
695
- return true;
696
- }
697
- connectContract(address) {
698
- return IStakedXyoChain__factory2.connect(address, this.params.runner);
699
- }
700
- };
701
- __publicField(EvmStakeRunner, "connectionTypes", ["evm-rpc"]);
702
- __publicField(EvmStakeRunner, "defaultMoniker", StakeRunnerMoniker);
703
- __publicField(EvmStakeRunner, "dependencies", []);
704
- __publicField(EvmStakeRunner, "monikers", [StakeRunnerMoniker]);
705
- __publicField(EvmStakeRunner, "surface", "node");
706
- EvmStakeRunner = __decorateClass([
707
- creatableProvider2()
708
- ], EvmStakeRunner);
709
-
710
- // src/modules/ethereum/providers/EvmStakeTotalsViewer.ts
711
- import { toEthAddress as toEthAddress7 } from "@ariestools/sdk";
712
- import { IStakedXyoChain__factory as IStakedXyoChain__factory3 } from "@xyo-network/typechain";
713
- import {
714
- creatableProvider as creatableProvider3,
715
- EvmChainViewerMoniker as EvmChainViewerMoniker3,
716
- StakeTotalsViewerMoniker
451
+ DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS,
452
+ DEFAULT_EVENT_QUERY_MAX_ATTEMPTS,
453
+ DEFAULT_EVENT_QUERY_START_CHUNK_SIZE,
454
+ EvmStakeEventsViewer,
455
+ MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE
717
456
  } from "@xyo-network/xl1-sdk";
718
- import { getAddress as getAddress2 } from "ethers/address";
719
- var EvmStakeTotalsViewer = class extends AbstractEvmViewer {
720
- moniker = EvmStakeTotalsViewer.defaultMoniker;
721
- async active() {
722
- return await this.contract.active();
723
- }
724
- async activeByStaked(staked) {
725
- return await this.contract.activeByAddressStaked(getAddress2(toEthAddress7(staked)));
726
- }
727
- async activeByStaker(address) {
728
- return await this.contract.activeByStaker(getAddress2(toEthAddress7(address)));
729
- }
730
- async pending() {
731
- return await this.contract.pending();
732
- }
733
- async pendingByStaker(staker) {
734
- return await this.contract.pendingByStaker(getAddress2(toEthAddress7(staker)));
735
- }
736
- async withdrawn() {
737
- return await this.contract.withdrawn();
738
- }
739
- async withdrawnByStaker(staker) {
740
- return await this.contract.withdrawnByStaker(getAddress2(staker));
741
- }
742
- connectContract(address) {
743
- return IStakedXyoChain__factory3.connect(address, this.provider);
744
- }
745
- };
746
- __publicField(EvmStakeTotalsViewer, "connectionTypes", ["evm-rpc"]);
747
- __publicField(EvmStakeTotalsViewer, "defaultMoniker", StakeTotalsViewerMoniker);
748
- __publicField(EvmStakeTotalsViewer, "dependencies", [EvmChainViewerMoniker3]);
749
- __publicField(EvmStakeTotalsViewer, "monikers", [StakeTotalsViewerMoniker]);
750
- __publicField(EvmStakeTotalsViewer, "surface", "node");
751
- EvmStakeTotalsViewer = __decorateClass([
752
- creatableProvider3()
753
- ], EvmStakeTotalsViewer);
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
-
805
- // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
806
- import { delay } from "@ariestools/sdk";
807
-
808
- // src/modules/ethereum/rpc/isRpcRateLimitError.ts
809
- function isRpcRateLimitError(error) {
810
- const seen = /* @__PURE__ */ new Set();
811
- const queue = [error];
812
- while (queue.length > 0) {
813
- const current = queue.pop();
814
- if (current === void 0 || current === null || seen.has(current)) {
815
- continue;
816
- }
817
- seen.add(current);
818
- if (typeof current === "string") {
819
- if (matchesRateLimitText(current)) {
820
- return true;
821
- }
822
- continue;
823
- }
824
- if (typeof current === "number") {
825
- if (isRateLimitCode(current)) {
826
- return true;
827
- }
828
- continue;
829
- }
830
- if (typeof current !== "object") {
831
- continue;
832
- }
833
- if (Array.isArray(current)) {
834
- const items = current;
835
- queue.push(...items);
836
- continue;
837
- }
838
- const record = current;
839
- for (const key of ["code", "message", "shortMessage", "reason", "status", "statusCode"]) {
840
- if (key in record) {
841
- queue.push(record[key]);
842
- }
843
- }
844
- for (const key of ["error", "info", "data", "value", "body", "payload"]) {
845
- if (key in record) {
846
- queue.push(record[key]);
847
- }
848
- }
849
- }
850
- return false;
851
- }
852
- function isRateLimitCode(code) {
853
- return code === 429 || code === -32005 || code === -32007 || code === -32016;
854
- }
855
- function matchesRateLimitText(text) {
856
- const normalized = text.toLowerCase();
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");
858
- }
859
-
860
- // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
861
- async function withRpcRateLimitBackoff(fn, options = {}) {
862
- const {
863
- backoff = 2,
864
- initialDelayMs = 1e3,
865
- maxAttempts = 8,
866
- maxDelayMs = 3e4,
867
- onRetry
868
- } = options;
869
- if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {
870
- throw new TypeError(`maxAttempts must be an integer >= 1, got ${maxAttempts}`);
871
- }
872
- let delayMs = initialDelayMs;
873
- let lastError;
874
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
875
- try {
876
- return await fn();
877
- } catch (error) {
878
- lastError = error;
879
- const isLastAttempt = attempt >= maxAttempts;
880
- if (!isRpcRateLimitError(error) || isLastAttempt) {
881
- throw error;
882
- }
883
- const waitMs = Math.min(delayMs, maxDelayMs);
884
- onRetry?.(error, attempt, waitMs);
885
- await delay(waitMs);
886
- delayMs = Math.min(delayMs * backoff, maxDelayMs);
887
- }
888
- }
889
- throw lastError;
890
- }
891
457
 
892
458
  // src/modules/ethereum/drivers/EvmStakeEventZod.ts
893
459
  import {
894
- EthAddressZod,
895
- HexRegExMinMaxMixedCaseWithPrefix,
896
- zodAsFactory,
897
- zodIsFactory,
898
- zodToFactory
899
- } from "@ariestools/sdk";
900
- import { z } from "zod/mini";
901
- var EthHashRegEx = HexRegExMinMaxMixedCaseWithPrefix(32, 32);
902
- var EthHashZod = z.string().check(z.regex(EthHashRegEx, { error: "Invalid address format" }));
903
- var EvmStakeAddedEventNameZod = z.literal("StakeAdded");
904
- var EvmStakeRemovedEventNameZod = z.literal("StakeRemoved");
905
- var EvmStakeWithdrawnEventNameZod = z.literal("StakeWithdrawn");
906
- var EvmStakeEventNameZod = z.union([
460
+ asEvmStakeAddedEvent,
461
+ asEvmStakeEvent,
462
+ asEvmStakeRemovedEvent,
463
+ asEvmStakeWithdrawnEvent,
464
+ EthHashRegEx,
465
+ EthHashZod,
907
466
  EvmStakeAddedEventNameZod,
467
+ EvmStakeAddedEventZod,
468
+ EvmStakeEventArgsZod,
469
+ EvmStakeEventNameZod,
470
+ EvmStakeEventZod,
908
471
  EvmStakeRemovedEventNameZod,
909
- EvmStakeWithdrawnEventNameZod
910
- ]);
911
- var EvmStakeEventArgsZod = z.tuple([
912
- EthAddressZod,
913
- // staker
914
- EthAddressZod,
915
- // staked
916
- z.bigint(),
917
- // id
918
- z.bigint()
919
- // amount
920
- ]);
921
- var EvmStakeEventZod = z.object({
922
- address: EthAddressZod,
923
- args: EvmStakeEventArgsZod,
924
- blockHash: EthHashZod,
925
- blockNumber: z.number(),
926
- eventName: EvmStakeEventNameZod,
927
- transactionHash: EthHashZod,
928
- transactionIndex: z.number()
929
- });
930
- var isEvmStakeEvent = zodIsFactory(EvmStakeEventZod);
931
- var asEvmStakeEvent = zodAsFactory(EvmStakeEventZod, "asEvmStakeEvent");
932
- var toEvmStakeEvent = zodToFactory(EvmStakeEventZod, "toEvmStakeEvent");
933
- var EvmStakeAddedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeAddedEventNameZod });
934
- var isEvmStakeAddedEvent = zodIsFactory(EvmStakeAddedEventZod);
935
- var asEvmStakeAddedEvent = zodAsFactory(EvmStakeAddedEventZod, "asEvmStakeAddedEvent");
936
- var toEvmStakeAddedEvent = zodToFactory(EvmStakeAddedEventZod, "toEvmStakeAddedEvent");
937
- var EvmStakeRemovedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeRemovedEventNameZod });
938
- var isEvmStakeRemovedEvent = zodIsFactory(EvmStakeRemovedEventZod);
939
- var asEvmStakeRemovedEvent = zodAsFactory(EvmStakeRemovedEventZod, "asEvmStakeRemovedEvent");
940
- var toEvmStakeRemovedEvent = zodToFactory(EvmStakeRemovedEventZod, "toEvmStakeRemovedEvent");
941
- var EvmStakeWithdrawnEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeWithdrawnEventNameZod });
942
- var isEvmStakeWithdrawnEvent = zodIsFactory(EvmStakeWithdrawnEventZod);
943
- var asEvmStakeWithdrawnEvent = zodAsFactory(EvmStakeWithdrawnEventZod, "asEvmStakeWithdrawnEvent");
944
- var toEvmStakeWithdrawnEvent = zodToFactory(EvmStakeWithdrawnEventZod, "toEvmStakeWithdrawnEvent");
945
-
946
- // src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
947
- var DEFAULT_EVENT_QUERY_START_CHUNK_SIZE = 1e5;
948
- var MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE = 1e3;
949
- var DEFAULT_EVENT_QUERY_MAX_ATTEMPTS = 8;
950
- var DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS = 1e3;
951
- var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
952
- var EvmStakeEventsViewer = class extends AbstractEvmViewer {
953
- moniker = EvmStakeEventsViewer.defaultMoniker;
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). */
960
- defaultDeploymentBlock = 0;
961
- eventCache = /* @__PURE__ */ new Map();
962
- get deploymentBlock() {
963
- return this.params.deploymentBlock ?? this.config.chain?.deploymentBlock ?? this.defaultDeploymentBlock;
964
- }
965
- get eventQueryBlockChunkSize() {
966
- return this.fixedEventQueryBlockChunkSize ?? this.adaptiveChunkSize ?? DEFAULT_EVENT_QUERY_START_CHUNK_SIZE;
967
- }
968
- get eventQueryInitialDelayMs() {
969
- return this.params.eventQueryInitialDelayMs ?? DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS;
970
- }
971
- get eventQueryMaxAttempts() {
972
- return this.params.eventQueryMaxAttempts ?? DEFAULT_EVENT_QUERY_MAX_ATTEMPTS;
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
- }
983
- async positionCount(range) {
984
- const events = await this.stakeEvents(range);
985
- const positionIds = events.map((e) => e.args.id);
986
- return Math.max(-1, ...positionIds) + 1;
987
- }
988
- stakeEvents(range = [0, "latest"], filter) {
989
- const allEvents = this.eventCache.values().toArray();
990
- const result = allEvents.filter((e) => {
991
- if (range[1] !== "latest" && e.time > range[1]) {
992
- return false;
993
- }
994
- if (e.time < range[0]) {
995
- return false;
996
- }
997
- if (isDefined3(filter?.name) && e.name !== filter.name) {
998
- return false;
999
- }
1000
- if (isDefined3(filter?.args?.id) && e.args.id !== filter.args.id) {
1001
- return false;
1002
- }
1003
- if (isDefined3(filter?.args?.staked) && e.args.staked !== filter.args.staked) {
1004
- return false;
1005
- }
1006
- if (isDefined3(filter?.args?.staker) && e.args.staker !== filter.args.staker) {
1007
- return false;
1008
- }
1009
- return true;
1010
- });
1011
- return result;
1012
- }
1013
- connectContract(address) {
1014
- return IAddressStakingEvents__factory.connect(address, this.provider);
1015
- }
1016
- onEventHandler(staked, staker, id, amount, event, throwOnInvalid = false) {
1017
- const validatedEventResult = EvmStakeEventZod.safeParse(event);
1018
- if (validatedEventResult.error) {
1019
- this.logger?.warn(`Received invalid stake event [${event.eventName}/${event.blockNumber}], ignoring...`);
1020
- this.logger?.warn(` - ${validatedEventResult.error.message}`);
1021
- if (throwOnInvalid) {
1022
- throw new Error(`Invalid stake event: ${validatedEventResult.error.message}`);
1023
- }
1024
- return;
1025
- }
1026
- const validatedEvent = validatedEventResult.data;
1027
- const { eventName, blockNumber } = validatedEvent;
1028
- const cacheKey = `${Number(id)}|${eventName}|${staker}`;
1029
- const stakeEvent = {
1030
- name: eventName,
1031
- args: {
1032
- id: Number(id),
1033
- staked: toAddress3(staked),
1034
- staker: toAddress3(staker),
1035
- amount: asAttoXL1(amount)
1036
- },
1037
- time: blockNumber
1038
- };
1039
- this.eventCache.set(cacheKey, stakeEvent);
1040
- return stakeEvent;
1041
- }
1042
- async startHandler() {
1043
- try {
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"));
1046
- if (!isDefined3(this.params.deploymentBlock)) {
1047
- this.defaultDeploymentBlock = configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(provider, this.address, this.logger);
1048
- }
1049
- await this.loadHistoricalEvents(this.deploymentBlock, historyEndBlock);
1050
- await this.attachLiveListeners();
1051
- const latestBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get latestEthBlock"));
1052
- if (latestBlock > historyEndBlock) {
1053
- await this.loadHistoricalEvents(historyEndBlock + 1, latestBlock);
1054
- }
1055
- } catch (error) {
1056
- this.logger?.error("EthereumChainStakeEvents failed to start:", error);
1057
- throw error;
1058
- }
1059
- }
1060
- async attachLiveListeners() {
1061
- await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
1062
- this.onEventHandler(staked, staker, id, amount, event);
1063
- });
1064
- await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
1065
- this.onEventHandler(staked, staker, id, amount, event);
1066
- });
1067
- await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
1068
- this.onEventHandler(staked, staker, id, amount, event);
1069
- });
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
- */
1080
- async loadHistoricalEvents(fromBlock, toBlock) {
1081
- if (fromBlock > toBlock) {
1082
- return;
1083
- }
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;
1091
- try {
1092
- logs = await withRpcRateLimitBackoff(
1093
- // '*' = every event on the contract address; parsed against the ABI
1094
- () => this.contract.queryFilter("*", cursor, chunkTo),
1095
- {
1096
- initialDelayMs: this.eventQueryInitialDelayMs,
1097
- maxAttempts: this.eventQueryMaxAttempts,
1098
- onRetry: (_error, attempt, delayMs) => {
1099
- this.logger?.warn(
1100
- `Rate limited fetching logs for blocks ${cursor}-${chunkTo} (attempt ${attempt}/${this.eventQueryMaxAttempts}); backing off ${delayMs}ms`
1101
- );
1102
- }
1103
- }
1104
- );
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
- }
1117
- this.logger?.error(
1118
- `eth_getLogs failed for blocks ${cursor}-${chunkTo} (from=${fromBlock} to=${toBlock}):`,
1119
- error
1120
- );
1121
- throw error;
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;
1132
- }
1133
- this.logger?.log(
1134
- `Cached ${eventCount} stake events from blocks ${fromBlock}-${toBlock} (${chunkCount} chunk(s), final chunk size ${this.eventQueryBlockChunkSize})`
1135
- );
1136
- }
1137
- };
1138
- __publicField(EvmStakeEventsViewer, "connectionTypes", ["evm-rpc"]);
1139
- __publicField(EvmStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker);
1140
- __publicField(EvmStakeEventsViewer, "dependencies", [EvmChainViewerMoniker4]);
1141
- __publicField(EvmStakeEventsViewer, "monikers", [StakeEventsViewerMoniker]);
1142
- __publicField(EvmStakeEventsViewer, "surface", "node");
1143
- EvmStakeEventsViewer = __decorateClass([
1144
- creatableProvider4()
1145
- ], EvmStakeEventsViewer);
472
+ EvmStakeRemovedEventZod,
473
+ EvmStakeWithdrawnEventNameZod,
474
+ EvmStakeWithdrawnEventZod,
475
+ isEvmStakeAddedEvent,
476
+ isEvmStakeEvent,
477
+ isEvmStakeRemovedEvent,
478
+ isEvmStakeWithdrawnEvent,
479
+ toEvmStakeAddedEvent,
480
+ toEvmStakeEvent,
481
+ toEvmStakeRemovedEvent,
482
+ toEvmStakeWithdrawnEvent
483
+ } from "@xyo-network/xl1-sdk";
1146
484
 
1147
485
  // src/modules/ethereum/drivers/EvmStakeViewer.ts
1148
- import {
1149
- assertEx as assertEx11,
1150
- toAddress as toAddress4,
1151
- toEthAddress as toEthAddress8
1152
- } from "@ariestools/sdk";
1153
- import { IAddressStaking__factory } from "@xyo-network/typechain";
1154
- import {
1155
- creatableProvider as creatableProvider5,
1156
- EvmChainViewerMoniker as EvmChainViewerMoniker5,
1157
- StakeEventsViewerMoniker as StakeEventsViewerMoniker2,
1158
- StakeViewerMoniker
1159
- } from "@xyo-network/xl1-sdk";
1160
- import { asAttoXL1 as asAttoXL12 } from "@xyo-network/xl1-sdk";
1161
- import { Mutex } from "async-mutex";
1162
- var ethStakeToStake = (ethStake) => {
1163
- const stake = {
1164
- id: Number(ethStake.id),
1165
- staked: toAddress4(ethStake.staked),
1166
- staker: toAddress4(ethStake.staker),
1167
- amount: asAttoXL12(ethStake.amount),
1168
- addBlock: Number(ethStake.addBlock),
1169
- removeBlock: Number(ethStake.removeBlock),
1170
- withdrawBlock: Number(ethStake.withdrawBlock)
1171
- };
1172
- return stake;
1173
- };
1174
- var EvmStakeViewer = class extends AbstractEvmViewer {
1175
- moniker = EvmStakeViewer.defaultMoniker;
1176
- _callMutex = new Mutex();
1177
- _deploymentBlock = 0;
1178
- _stakeCache = /* @__PURE__ */ new Map();
1179
- _stakeEventsViewer;
1180
- get stakeEvents() {
1181
- return this._stakeEventsViewer;
1182
- }
1183
- async active() {
1184
- return await this._callMutex.runExclusive(async () => {
1185
- return await this.contract.active();
1186
- });
1187
- }
1188
- async activeByAddressStaked(address) {
1189
- return await this._callMutex.runExclusive(async () => {
1190
- return await this.contract.activeByAddressStaked(toEthAddress8(address));
1191
- });
1192
- }
1193
- async activeByStaker(address) {
1194
- return await this._callMutex.runExclusive(async () => {
1195
- return await this.contract.activeByStaker(toEthAddress8(address));
1196
- });
1197
- }
1198
- activeStakes() {
1199
- return this._stakeCache.values().filter((stake) => stake.removeBlock === 0 && stake.withdrawBlock === 0).toArray();
1200
- }
1201
- async createHandler() {
1202
- await super.createHandler();
1203
- this._stakeEventsViewer = await this.locator.getInstance(StakeEventsViewerMoniker2);
1204
- this._deploymentBlock = this.params.deploymentBlock ?? configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(this.provider, this.address, this.logger);
1205
- }
1206
- minWithdrawalBlocks() {
1207
- return 0;
1208
- }
1209
- async pending() {
1210
- return await this._callMutex.runExclusive(async () => {
1211
- return await this.contract.pending();
1212
- });
1213
- }
1214
- async pendingByStaker(staker) {
1215
- return await this._callMutex.runExclusive(async () => {
1216
- return await this.contract.pendingByStaker(toEthAddress8(staker));
1217
- });
1218
- }
1219
- removedStakes() {
1220
- return this._stakeCache.values().filter((stake) => stake.removeBlock !== 0 && stake.withdrawBlock === 0).toArray();
1221
- }
1222
- rewardsContract() {
1223
- return toAddress4("0x000000000000000000000000000000");
1224
- }
1225
- async stakeById(id) {
1226
- return await this._callMutex.runExclusive(async () => {
1227
- const startTime = Date.now();
1228
- const cachedStake = this._stakeCache.get(id);
1229
- if (cachedStake) {
1230
- return cachedStake;
1231
- }
1232
- const ethResult = await this.contract.getStakeById(id);
1233
- const stake = ethStakeToStake(ethResult);
1234
- this._stakeCache.set(stake.id, stake);
1235
- this.logger?.log(`EthereumChainStake: stakeById(${id}) took ${Date.now() - startTime}ms`);
1236
- return stake;
1237
- });
1238
- }
1239
- async stakeByStaker(staker, slot) {
1240
- return await this._callMutex.runExclusive(async () => {
1241
- const ethResult = await this.contract.getStake(toEthAddress8(staker), slot);
1242
- const stake = ethStakeToStake(ethResult);
1243
- this._stakeCache.set(stake.id, stake);
1244
- return stake;
1245
- });
1246
- }
1247
- async stakesByStaked(staked, range = [0, void 0]) {
1248
- const events = await this.stakeEvents.stakeEvents([Math.max(
1249
- range[0],
1250
- this._deploymentBlock
1251
- ), range.at(1) ?? "latest"], { name: "StakeAdded", args: { staked } });
1252
- const result = [];
1253
- for (const event of events) {
1254
- if (toAddress4(event.args.staked) === toAddress4(staked)) {
1255
- result.push(await this.stakeById(event.args.id));
1256
- }
1257
- }
1258
- return result;
1259
- }
1260
- async stakesByStaker(staker, range = [0, void 0]) {
1261
- const events = await this.stakeEvents.stakeEvents([Math.max(
1262
- range[0],
1263
- this._deploymentBlock
1264
- ), range.at(1) ?? "latest"], { name: "StakeAdded", args: { staker } });
1265
- const result = [];
1266
- for (const event of events) {
1267
- if (toAddress4(event.args.staker) === toAddress4(staker)) {
1268
- result.push(await this.stakeById(event.args.id));
1269
- }
1270
- }
1271
- return result;
1272
- }
1273
- stakingTokenAddress() {
1274
- return toAddress4("0x000000000000000000000000000011");
1275
- }
1276
- async withdrawn() {
1277
- return await this._callMutex.runExclusive(async () => {
1278
- return await this.contract.withdrawn();
1279
- });
1280
- }
1281
- async withdrawnByStaker(staker) {
1282
- return await this._callMutex.runExclusive(async () => {
1283
- return await this.contract.withdrawnByStaker(toEthAddress8(staker));
1284
- });
1285
- }
1286
- withdrawnStakes() {
1287
- return this._stakeCache.values().filter((stake) => stake.removeBlock !== 0 && stake.withdrawBlock !== 0).toArray();
1288
- }
1289
- connectContract(address) {
1290
- return IAddressStaking__factory.connect(address, this.provider);
1291
- }
1292
- async startHandler() {
1293
- await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
1294
- this._stakeCache.set(Number(id), {
1295
- id: Number(id),
1296
- staked: toAddress4(staked),
1297
- staker: toAddress4(staker),
1298
- amount: asAttoXL12(amount),
1299
- addBlock: event.blockNumber,
1300
- removeBlock: 0,
1301
- withdrawBlock: 0
1302
- });
1303
- });
1304
- await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
1305
- const stake = assertEx11(this._stakeCache.get(Number(id)));
1306
- this._stakeCache.set(Number(id), {
1307
- ...stake,
1308
- removeBlock: event.blockNumber
1309
- });
1310
- });
1311
- await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
1312
- const stake = assertEx11(this._stakeCache.get(Number(id)));
1313
- this._stakeCache.set(Number(id), {
1314
- ...stake,
1315
- withdrawBlock: event.blockNumber
1316
- });
1317
- });
1318
- const stakeEventGroups = await Promise.all([
1319
- this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeAdded" }),
1320
- this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeRemoved" }),
1321
- this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeWithdrawn" })
1322
- ]);
1323
- const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time);
1324
- for (const event of allStakeEvents) {
1325
- this.applyHistoricalStakeEvent(event);
1326
- }
1327
- for (const event of allStakeEvents) {
1328
- await this.stakeById(event.args.id);
1329
- }
1330
- }
1331
- applyHistoricalStakeEvent(event) {
1332
- if (event.name === "StakeAdded") {
1333
- this._stakeCache.set(event.args.id, {
1334
- id: event.args.id,
1335
- staked: event.args.staked,
1336
- staker: event.args.staker,
1337
- amount: event.args.amount,
1338
- addBlock: event.time,
1339
- removeBlock: 0,
1340
- withdrawBlock: 0
1341
- });
1342
- return;
1343
- }
1344
- if (event.name === "StakeRemoved") {
1345
- const stake = assertEx11(this._stakeCache.get(event.args.id));
1346
- this._stakeCache.set(event.args.id, {
1347
- ...stake,
1348
- removeBlock: event.time
1349
- });
1350
- return;
1351
- }
1352
- if (event.name === "StakeWithdrawn") {
1353
- const stake = assertEx11(this._stakeCache.get(event.args.id));
1354
- this._stakeCache.set(event.args.id, {
1355
- ...stake,
1356
- withdrawBlock: event.time
1357
- });
1358
- }
1359
- }
1360
- };
1361
- __publicField(EvmStakeViewer, "connectionTypes", ["evm-rpc"]);
1362
- __publicField(EvmStakeViewer, "defaultMoniker", StakeViewerMoniker);
1363
- __publicField(EvmStakeViewer, "dependencies", [EvmChainViewerMoniker5, StakeEventsViewerMoniker2]);
1364
- __publicField(EvmStakeViewer, "monikers", [StakeViewerMoniker]);
1365
- __publicField(EvmStakeViewer, "surface", "node");
1366
- EvmStakeViewer = __decorateClass([
1367
- creatableProvider5()
1368
- ], EvmStakeViewer);
486
+ import { EvmStakeViewer } from "@xyo-network/xl1-sdk";
1369
487
 
1370
488
  // src/modules/ethereum/ethereum.ts
1371
489
  import { parseUnits as parseUnits2 } from "ethers/utils";
@@ -1377,88 +495,34 @@ var getDefaultGasConfig = () => {
1377
495
  };
1378
496
  };
1379
497
 
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
498
  // src/modules/ethereum/indexing/RestStakeEventsViewer.ts
1442
499
  import {
1443
- assertEx as assertEx12,
1444
- isDefined as isDefined4,
1445
- toAddress as toAddress5,
1446
- toEthAddress as toEthAddress9
500
+ assertEx as assertEx5,
501
+ isDefined as isDefined3,
502
+ toAddress as toAddress2,
503
+ toEthAddress as toEthAddress4
1447
504
  } from "@ariestools/sdk";
1448
- import { IAddressStakingEvents__factory as IAddressStakingEvents__factory2 } from "@xyo-network/typechain";
505
+ import { IAddressStakingEvents__factory } from "@xyo-network/typechain";
1449
506
  import {
1450
- AbstractCreatableProvider as AbstractCreatableProvider2,
1451
- asAttoXL1 as asAttoXL13,
1452
- creatableProvider as creatableProvider6,
507
+ AbstractCreatableProvider,
508
+ asAttoXL1,
509
+ asEvmEventIndexFrame,
510
+ asEvmEventIndexHead,
511
+ asEvmEventIndexManifest,
512
+ creatableProvider,
513
+ evmEventIndexFramePath,
514
+ evmEventIndexHeadPath,
515
+ evmEventIndexManifestPath,
516
+ evmEventIndexTailPath,
1453
517
  resolveRestConnectionEndpoint,
1454
- StakeEventsViewerMoniker as StakeEventsViewerMoniker3
518
+ StakeEventsViewerMoniker
1455
519
  } from "@xyo-network/xl1-sdk";
1456
520
  import { Interface } from "ethers";
1457
- var STAKE_EVENT_NAMES2 = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
1458
- var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
521
+ var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
522
+ var RestStakeEventsViewer = class extends AbstractCreatableProvider {
1459
523
  moniker = RestStakeEventsViewer.defaultMoniker;
1460
524
  completeFrames = /* @__PURE__ */ new Map();
1461
- contractInterface = new Interface(IAddressStakingEvents__factory2.abi);
525
+ contractInterface = new Interface(IAddressStakingEvents__factory.abi);
1462
526
  currentHead;
1463
527
  manifestPromise;
1464
528
  stakeEventCache = [];
@@ -1475,10 +539,10 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1475
539
  }
1476
540
  static async paramsHandler(params) {
1477
541
  const contextConfig = params.context?.config;
1478
- const address = params.address ?? toEthAddress9(assertEx12(contextConfig?.chain?.id, () => "RestStakeEventsViewer requires an address param or config.chain.id"));
542
+ const address = params.address ?? toEthAddress4(assertEx5(contextConfig?.chain?.id, () => "RestStakeEventsViewer requires an address param or config.chain.id"));
1479
543
  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"),
544
+ const eventIndexBaseUrl = isDefined3(params.eventIndexBaseUrl) && params.eventIndexBaseUrl !== "" ? params.eventIndexBaseUrl : resolveRestConnectionEndpoint(
545
+ assertEx5(contextConfig, () => "Context config is required to resolve the EVM event index endpoint"),
1482
546
  moniker
1483
547
  );
1484
548
  return {
@@ -1506,13 +570,13 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1506
570
  }
1507
571
  async fetchJson(path) {
1508
572
  const response = await this.fetchFn(`${this.eventIndexBaseUrl}/${path}`);
1509
- assertEx12(response.ok, () => `EVM event index request failed [${response.status}] for ${path}`);
573
+ assertEx5(response.ok, () => `EVM event index request failed [${response.status}] for ${path}`);
1510
574
  return await response.json();
1511
575
  }
1512
576
  async getManifest() {
1513
577
  this.manifestPromise ??= (async () => {
1514
578
  const manifest = asEvmEventIndexManifest(await this.fetchJson(evmEventIndexManifestPath(this.address)), true);
1515
- assertEx12(manifest.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index manifest address mismatch");
579
+ assertEx5(manifest.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index manifest address mismatch");
1516
580
  return manifest;
1517
581
  })();
1518
582
  return await this.manifestPromise;
@@ -1521,23 +585,23 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1521
585
  matchesFilter(event, range, filter) {
1522
586
  if (range[1] !== "latest" && event.time > range[1]) return false;
1523
587
  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;
588
+ if (isDefined3(filter?.name) && event.name !== filter.name) return false;
589
+ if (isDefined3(filter?.args?.id) && event.args.id !== filter.args.id) return false;
590
+ if (isDefined3(filter?.args?.staked) && event.args.staked !== filter.args.staked) return false;
591
+ if (isDefined3(filter?.args?.staker) && event.args.staker !== filter.args.staker) return false;
1528
592
  return true;
1529
593
  }
1530
594
  stakeEventFromLog(log) {
1531
595
  const parsed = this.contractInterface.parseLog({ data: log.data, topics: log.topics });
1532
- if (parsed === null || !STAKE_EVENT_NAMES2.has(parsed.name)) return;
596
+ if (parsed === null || !STAKE_EVENT_NAMES.has(parsed.name)) return;
1533
597
  const [staked, staker, id, amount] = parsed.args;
1534
598
  return {
1535
599
  name: parsed.name,
1536
600
  args: {
1537
- amount: asAttoXL13(amount),
601
+ amount: asAttoXL1(amount),
1538
602
  id: Number(id),
1539
- staked: toAddress5(staked),
1540
- staker: toAddress5(staker)
603
+ staked: toAddress2(staked),
604
+ staker: toAddress2(staker)
1541
605
  },
1542
606
  time: log.blockNumber
1543
607
  };
@@ -1551,8 +615,8 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1551
615
  async syncFromHead() {
1552
616
  const manifest = await this.getManifest();
1553
617
  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");
618
+ assertEx5(head.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index head address mismatch");
619
+ assertEx5(head.chainId === manifest.chainId, () => "EVM event index chain mismatch");
1556
620
  if (this.currentHead?.block === head.block && this.currentHead.hash === head.hash) return;
1557
621
  if (this.currentHead !== void 0 && (head.block < this.currentHead.block || head.block === this.currentHead.block && head.hash !== this.currentHead.hash)) {
1558
622
  this.completeFrames.clear();
@@ -1564,28 +628,115 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1564
628
  await Promise.all(missingFrameIndexes.map(async (index) => {
1565
629
  const frame = asEvmEventIndexFrame(await this.fetchJson(evmEventIndexFramePath(this.address, index)), true);
1566
630
  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`);
631
+ assertEx5(frame.fromBlock === expectedFrom, () => `EVM event index frame ${index} starts at the wrong block`);
632
+ assertEx5(frame.toBlock === expectedFrom + manifest.frameSize - 1, () => `EVM event index frame ${index} is incomplete`);
1569
633
  this.completeFrames.set(index, frame);
1570
634
  }));
1571
635
  const tailStart = manifest.deploymentBlock + completeFrameCount * manifest.frameSize;
1572
636
  this.tailFrame = tailStart <= head.block ? asEvmEventIndexFrame(await this.fetchJson(`${evmEventIndexTailPath(this.address)}?head=${head.hash}`), true) : void 0;
1573
637
  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");
638
+ assertEx5(this.tailFrame.fromBlock === tailStart, () => "EVM event index tail starts at the wrong block");
639
+ assertEx5(this.tailFrame.toBlock === head.block, () => "EVM event index tail is stale relative to its head");
1576
640
  }
1577
641
  this.stakeEventCache = this.decodeIndexedStakeEvents();
1578
642
  this.currentHead = head;
1579
643
  }
1580
644
  };
1581
645
  __publicField(RestStakeEventsViewer, "connectionTypes", ["rest"]);
1582
- __publicField(RestStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker3);
646
+ __publicField(RestStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker);
1583
647
  __publicField(RestStakeEventsViewer, "dependencies", []);
1584
- __publicField(RestStakeEventsViewer, "monikers", [StakeEventsViewerMoniker3]);
648
+ __publicField(RestStakeEventsViewer, "monikers", [StakeEventsViewerMoniker]);
1585
649
  __publicField(RestStakeEventsViewer, "surface", "node");
1586
650
  RestStakeEventsViewer = __decorateClass([
1587
- creatableProvider6()
651
+ creatableProvider()
1588
652
  ], RestStakeEventsViewer);
653
+
654
+ // src/modules/ethereum/indexing/index.ts
655
+ import {
656
+ asEvmEventIndexFrame as asEvmEventIndexFrame2,
657
+ asEvmEventIndexHead as asEvmEventIndexHead2,
658
+ asEvmEventIndexManifest as asEvmEventIndexManifest2,
659
+ evmEventIndexFramePath as evmEventIndexFramePath2,
660
+ EvmEventIndexFrameZod,
661
+ evmEventIndexHeadPath as evmEventIndexHeadPath2,
662
+ EvmEventIndexHeadZod,
663
+ EvmEventIndexLogZod,
664
+ evmEventIndexManifestPath as evmEventIndexManifestPath2,
665
+ EvmEventIndexManifestZod,
666
+ EvmEventIndexPublishRunnerMoniker,
667
+ evmEventIndexTailPath as evmEventIndexTailPath2
668
+ } from "@xyo-network/xl1-sdk";
669
+
670
+ // src/modules/ethereum/providers/AbstractEvmProvider.ts
671
+ import { AbstractEvmProvider } from "@xyo-network/xl1-sdk";
672
+
673
+ // src/modules/ethereum/providers/AbstractEvmRunner.ts
674
+ import { assertEx as assertEx6 } from "@ariestools/sdk";
675
+
676
+ // src/modules/ethereum/providers/AbstractEvmViewer.ts
677
+ import { AbstractEvmViewer } from "@xyo-network/xl1-sdk";
678
+
679
+ // src/modules/ethereum/providers/AbstractEvmRunner.ts
680
+ var AbstractEvmRunner = class extends AbstractEvmViewer {
681
+ static async paramsHandler(params) {
682
+ const runner = assertEx6(params?.runner, () => new Error("No runner defined"));
683
+ const provider = assertEx6(runner.provider, () => new Error("Runner must have a provider defined"));
684
+ return { ...await super.paramsHandler({ ...params, provider }), runner };
685
+ }
686
+ };
687
+
688
+ // src/modules/ethereum/providers/EvmChainContractViewer.ts
689
+ import { EvmChainContractViewer } from "@xyo-network/xl1-sdk";
690
+
691
+ // src/modules/ethereum/providers/EvmStakeRunner.ts
692
+ import { toEthAddress as toEthAddress5 } from "@ariestools/sdk";
693
+ import { IStakedXyoChain__factory } from "@xyo-network/typechain";
694
+ import {
695
+ creatableProvider as creatableProvider2,
696
+ StakeRunnerMoniker
697
+ } from "@xyo-network/xl1-sdk";
698
+ import { getAddress } from "ethers/address";
699
+ var EvmStakeRunner = class extends AbstractEvmRunner {
700
+ moniker = EvmStakeRunner.defaultMoniker;
701
+ async addStake(staked, amount) {
702
+ const result = await this.contract.addStake(getAddress(toEthAddress5(staked)), amount);
703
+ await result.wait();
704
+ return true;
705
+ }
706
+ async removeStake(slot) {
707
+ const result = await this.contract.removeStake(slot);
708
+ await result.wait();
709
+ return true;
710
+ }
711
+ async withdrawStake(slot) {
712
+ const result = await this.contract.withdrawStake(slot);
713
+ await result.wait();
714
+ return true;
715
+ }
716
+ connectContract(address) {
717
+ return IStakedXyoChain__factory.connect(address, this.params.runner);
718
+ }
719
+ };
720
+ __publicField(EvmStakeRunner, "connectionTypes", ["evm-rpc"]);
721
+ __publicField(EvmStakeRunner, "defaultMoniker", StakeRunnerMoniker);
722
+ __publicField(EvmStakeRunner, "dependencies", []);
723
+ __publicField(EvmStakeRunner, "monikers", [StakeRunnerMoniker]);
724
+ __publicField(EvmStakeRunner, "surface", "node");
725
+ EvmStakeRunner = __decorateClass([
726
+ creatableProvider2()
727
+ ], EvmStakeRunner);
728
+
729
+ // src/modules/ethereum/providers/EvmStakeTotalsViewer.ts
730
+ import { EvmStakeTotalsViewer } from "@xyo-network/xl1-sdk";
731
+
732
+ // src/modules/ethereum/rpc/isRpcRangeLimitError.ts
733
+ import { isRpcRangeLimitError, rpcRangeLimitFromError } from "@xyo-network/xl1-sdk";
734
+
735
+ // src/modules/ethereum/rpc/isRpcRateLimitError.ts
736
+ import { isRpcRateLimitError } from "@xyo-network/xl1-sdk";
737
+
738
+ // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
739
+ import { withRpcRateLimitBackoff } from "@xyo-network/xl1-sdk";
1589
740
  export {
1590
741
  AbstractEvmProvider,
1591
742
  AbstractEvmRunner,
@@ -1619,9 +770,9 @@ export {
1619
770
  EvmStakeWithdrawnEventZod,
1620
771
  MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,
1621
772
  RestStakeEventsViewer,
1622
- asEvmEventIndexFrame,
1623
- asEvmEventIndexHead,
1624
- asEvmEventIndexManifest,
773
+ asEvmEventIndexFrame2 as asEvmEventIndexFrame,
774
+ asEvmEventIndexHead2 as asEvmEventIndexHead,
775
+ asEvmEventIndexManifest2 as asEvmEventIndexManifest,
1625
776
  asEvmStakeAddedEvent,
1626
777
  asEvmStakeEvent,
1627
778
  asEvmStakeRemovedEvent,
@@ -1636,10 +787,10 @@ export {
1636
787
  estimateBlockNumberAt,
1637
788
  estimateBlockNumberFromHead,
1638
789
  ethBlockRate,
1639
- evmEventIndexFramePath,
1640
- evmEventIndexHeadPath,
1641
- evmEventIndexManifestPath,
1642
- evmEventIndexTailPath,
790
+ evmEventIndexFramePath2 as evmEventIndexFramePath,
791
+ evmEventIndexHeadPath2 as evmEventIndexHeadPath,
792
+ evmEventIndexManifestPath2 as evmEventIndexManifestPath,
793
+ evmEventIndexTailPath2 as evmEventIndexTailPath,
1643
794
  findContractDeploymentBlock,
1644
795
  getDefaultGasConfig,
1645
796
  getEthBlockRateBlocks,