@xyo-network/chain-sdk 4.2.1 → 4.3.0

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 (91) 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/providers/AbstractEvmProvider.d.ts +1 -17
  12. package/dist/browser/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  13. package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  14. package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  15. package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  16. package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  17. package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  18. package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  19. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +1 -14
  20. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
  21. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  22. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  23. package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  24. package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  25. package/dist/browser/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  26. package/dist/browser/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  27. package/dist/browser/modules/wrappers/index.d.ts +1 -1
  28. package/dist/browser/modules/wrappers/index.d.ts.map +1 -1
  29. package/dist/neutral/ethereum.mjs +188 -999
  30. package/dist/neutral/ethereum.mjs.map +4 -4
  31. package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
  32. package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
  33. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts +1 -24
  34. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -1
  35. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
  36. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
  37. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -87
  38. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  39. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
  40. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  41. package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
  42. package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  43. package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  44. package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  45. package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  46. package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  47. package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  48. package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  49. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +1 -14
  50. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
  51. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  52. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  53. package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  54. package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  55. package/dist/neutral/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  56. package/dist/neutral/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  57. package/dist/neutral/modules/wrappers/index.d.ts +1 -1
  58. package/dist/neutral/modules/wrappers/index.d.ts.map +1 -1
  59. package/dist/neutral/services.mjs +16 -59
  60. package/dist/neutral/services.mjs.map +3 -3
  61. package/dist/neutral/wrappers.mjs +1 -1
  62. package/dist/neutral/wrappers.mjs.map +1 -1
  63. package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
  64. package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
  65. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts +1 -24
  66. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -1
  67. package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
  68. package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
  69. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -87
  70. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  71. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
  72. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  73. package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
  74. package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  75. package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  76. package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  77. package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  78. package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  79. package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  80. package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  81. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +1 -14
  82. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
  83. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  84. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  85. package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  86. package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  87. package/dist/node/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  88. package/dist/node/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  89. package/dist/node/modules/wrappers/index.d.ts +1 -1
  90. package/dist/node/modules/wrappers/index.d.ts.map +1 -1
  91. package/package.json +12 -14
@@ -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";
@@ -1379,44 +497,44 @@ var getDefaultGasConfig = () => {
1379
497
 
1380
498
  // src/modules/ethereum/indexing/EvmEventIndexModel.ts
1381
499
  import {
1382
- EthAddressZod as EthAddressZod2,
1383
- HexRegExMinMaxMixedCaseWithPrefix as HexRegExMinMaxMixedCaseWithPrefix2,
1384
- zodAsFactory as zodAsFactory2
500
+ EthAddressZod,
501
+ HexRegExMinMaxMixedCaseWithPrefix,
502
+ zodAsFactory
1385
503
  } 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,
504
+ import { z } from "zod/mini";
505
+ var EvmHashZod = z.string().check(z.regex(HexRegExMinMaxMixedCaseWithPrefix(32, 32)));
506
+ var EvmDataZod = z.string().check(z.regex(/^0x[\dA-Fa-f]*$/));
507
+ var EvmEventIndexLogZod = z.object({
508
+ address: EthAddressZod,
1391
509
  blockHash: EvmHashZod,
1392
- blockNumber: z2.number(),
510
+ blockNumber: z.number(),
1393
511
  data: EvmDataZod,
1394
- index: z2.number(),
1395
- topics: z2.array(EvmHashZod),
512
+ index: z.number(),
513
+ topics: z.array(EvmHashZod),
1396
514
  transactionHash: EvmHashZod,
1397
- transactionIndex: z2.number()
515
+ transactionIndex: z.number()
1398
516
  });
1399
- var EvmEventIndexFrameZod = z2.object({
1400
- fromBlock: z2.number(),
1401
- logs: z2.array(EvmEventIndexLogZod),
1402
- toBlock: z2.number()
517
+ var EvmEventIndexFrameZod = z.object({
518
+ fromBlock: z.number(),
519
+ logs: z.array(EvmEventIndexLogZod),
520
+ toBlock: z.number()
1403
521
  });
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")
522
+ var EvmEventIndexManifestZod = z.object({
523
+ address: EthAddressZod,
524
+ chainId: z.string(),
525
+ deploymentBlock: z.number(),
526
+ frameSize: z.number(),
527
+ layout: z.literal("evm-contract-events-v1")
1410
528
  });
1411
- var EvmEventIndexHeadZod = z2.object({
1412
- address: EthAddressZod2,
1413
- block: z2.number(),
1414
- chainId: z2.string(),
529
+ var EvmEventIndexHeadZod = z.object({
530
+ address: EthAddressZod,
531
+ block: z.number(),
532
+ chainId: z.string(),
1415
533
  hash: EvmHashZod
1416
534
  });
1417
- var asEvmEventIndexFrame = zodAsFactory2(EvmEventIndexFrameZod, "asEvmEventIndexFrame");
1418
- var asEvmEventIndexHead = zodAsFactory2(EvmEventIndexHeadZod, "asEvmEventIndexHead");
1419
- var asEvmEventIndexManifest = zodAsFactory2(EvmEventIndexManifestZod, "asEvmEventIndexManifest");
535
+ var asEvmEventIndexFrame = zodAsFactory(EvmEventIndexFrameZod, "asEvmEventIndexFrame");
536
+ var asEvmEventIndexHead = zodAsFactory(EvmEventIndexHeadZod, "asEvmEventIndexHead");
537
+ var asEvmEventIndexManifest = zodAsFactory(EvmEventIndexManifestZod, "asEvmEventIndexManifest");
1420
538
 
1421
539
  // src/modules/ethereum/indexing/EvmEventIndexPaths.ts
1422
540
  function root(address) {
@@ -1440,25 +558,25 @@ var EvmEventIndexPublishRunnerMoniker = "EvmEventIndexPublishRunner";
1440
558
 
1441
559
  // src/modules/ethereum/indexing/RestStakeEventsViewer.ts
1442
560
  import {
1443
- assertEx as assertEx12,
1444
- isDefined as isDefined4,
1445
- toAddress as toAddress5,
1446
- toEthAddress as toEthAddress9
561
+ assertEx as assertEx5,
562
+ isDefined as isDefined3,
563
+ toAddress as toAddress2,
564
+ toEthAddress as toEthAddress4
1447
565
  } from "@ariestools/sdk";
1448
- import { IAddressStakingEvents__factory as IAddressStakingEvents__factory2 } from "@xyo-network/typechain";
566
+ import { IAddressStakingEvents__factory } from "@xyo-network/typechain";
1449
567
  import {
1450
- AbstractCreatableProvider as AbstractCreatableProvider2,
1451
- asAttoXL1 as asAttoXL13,
1452
- creatableProvider as creatableProvider6,
568
+ AbstractCreatableProvider,
569
+ asAttoXL1,
570
+ creatableProvider,
1453
571
  resolveRestConnectionEndpoint,
1454
- StakeEventsViewerMoniker as StakeEventsViewerMoniker3
572
+ StakeEventsViewerMoniker
1455
573
  } from "@xyo-network/xl1-sdk";
1456
574
  import { Interface } from "ethers";
1457
- var STAKE_EVENT_NAMES2 = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
1458
- var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
575
+ var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
576
+ var RestStakeEventsViewer = class extends AbstractCreatableProvider {
1459
577
  moniker = RestStakeEventsViewer.defaultMoniker;
1460
578
  completeFrames = /* @__PURE__ */ new Map();
1461
- contractInterface = new Interface(IAddressStakingEvents__factory2.abi);
579
+ contractInterface = new Interface(IAddressStakingEvents__factory.abi);
1462
580
  currentHead;
1463
581
  manifestPromise;
1464
582
  stakeEventCache = [];
@@ -1475,10 +593,10 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1475
593
  }
1476
594
  static async paramsHandler(params) {
1477
595
  const contextConfig = params.context?.config;
1478
- const address = params.address ?? toEthAddress9(assertEx12(contextConfig?.chain?.id, () => "RestStakeEventsViewer requires an address param or config.chain.id"));
596
+ const address = params.address ?? toEthAddress4(assertEx5(contextConfig?.chain?.id, () => "RestStakeEventsViewer requires an address param or config.chain.id"));
1479
597
  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"),
598
+ const eventIndexBaseUrl = isDefined3(params.eventIndexBaseUrl) && params.eventIndexBaseUrl !== "" ? params.eventIndexBaseUrl : resolveRestConnectionEndpoint(
599
+ assertEx5(contextConfig, () => "Context config is required to resolve the EVM event index endpoint"),
1482
600
  moniker
1483
601
  );
1484
602
  return {
@@ -1506,13 +624,13 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1506
624
  }
1507
625
  async fetchJson(path) {
1508
626
  const response = await this.fetchFn(`${this.eventIndexBaseUrl}/${path}`);
1509
- assertEx12(response.ok, () => `EVM event index request failed [${response.status}] for ${path}`);
627
+ assertEx5(response.ok, () => `EVM event index request failed [${response.status}] for ${path}`);
1510
628
  return await response.json();
1511
629
  }
1512
630
  async getManifest() {
1513
631
  this.manifestPromise ??= (async () => {
1514
632
  const manifest = asEvmEventIndexManifest(await this.fetchJson(evmEventIndexManifestPath(this.address)), true);
1515
- assertEx12(manifest.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index manifest address mismatch");
633
+ assertEx5(manifest.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index manifest address mismatch");
1516
634
  return manifest;
1517
635
  })();
1518
636
  return await this.manifestPromise;
@@ -1521,23 +639,23 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1521
639
  matchesFilter(event, range, filter) {
1522
640
  if (range[1] !== "latest" && event.time > range[1]) return false;
1523
641
  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;
642
+ if (isDefined3(filter?.name) && event.name !== filter.name) return false;
643
+ if (isDefined3(filter?.args?.id) && event.args.id !== filter.args.id) return false;
644
+ if (isDefined3(filter?.args?.staked) && event.args.staked !== filter.args.staked) return false;
645
+ if (isDefined3(filter?.args?.staker) && event.args.staker !== filter.args.staker) return false;
1528
646
  return true;
1529
647
  }
1530
648
  stakeEventFromLog(log) {
1531
649
  const parsed = this.contractInterface.parseLog({ data: log.data, topics: log.topics });
1532
- if (parsed === null || !STAKE_EVENT_NAMES2.has(parsed.name)) return;
650
+ if (parsed === null || !STAKE_EVENT_NAMES.has(parsed.name)) return;
1533
651
  const [staked, staker, id, amount] = parsed.args;
1534
652
  return {
1535
653
  name: parsed.name,
1536
654
  args: {
1537
- amount: asAttoXL13(amount),
655
+ amount: asAttoXL1(amount),
1538
656
  id: Number(id),
1539
- staked: toAddress5(staked),
1540
- staker: toAddress5(staker)
657
+ staked: toAddress2(staked),
658
+ staker: toAddress2(staker)
1541
659
  },
1542
660
  time: log.blockNumber
1543
661
  };
@@ -1551,8 +669,8 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1551
669
  async syncFromHead() {
1552
670
  const manifest = await this.getManifest();
1553
671
  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");
672
+ assertEx5(head.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index head address mismatch");
673
+ assertEx5(head.chainId === manifest.chainId, () => "EVM event index chain mismatch");
1556
674
  if (this.currentHead?.block === head.block && this.currentHead.hash === head.hash) return;
1557
675
  if (this.currentHead !== void 0 && (head.block < this.currentHead.block || head.block === this.currentHead.block && head.hash !== this.currentHead.hash)) {
1558
676
  this.completeFrames.clear();
@@ -1564,28 +682,99 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
1564
682
  await Promise.all(missingFrameIndexes.map(async (index) => {
1565
683
  const frame = asEvmEventIndexFrame(await this.fetchJson(evmEventIndexFramePath(this.address, index)), true);
1566
684
  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`);
685
+ assertEx5(frame.fromBlock === expectedFrom, () => `EVM event index frame ${index} starts at the wrong block`);
686
+ assertEx5(frame.toBlock === expectedFrom + manifest.frameSize - 1, () => `EVM event index frame ${index} is incomplete`);
1569
687
  this.completeFrames.set(index, frame);
1570
688
  }));
1571
689
  const tailStart = manifest.deploymentBlock + completeFrameCount * manifest.frameSize;
1572
690
  this.tailFrame = tailStart <= head.block ? asEvmEventIndexFrame(await this.fetchJson(`${evmEventIndexTailPath(this.address)}?head=${head.hash}`), true) : void 0;
1573
691
  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");
692
+ assertEx5(this.tailFrame.fromBlock === tailStart, () => "EVM event index tail starts at the wrong block");
693
+ assertEx5(this.tailFrame.toBlock === head.block, () => "EVM event index tail is stale relative to its head");
1576
694
  }
1577
695
  this.stakeEventCache = this.decodeIndexedStakeEvents();
1578
696
  this.currentHead = head;
1579
697
  }
1580
698
  };
1581
699
  __publicField(RestStakeEventsViewer, "connectionTypes", ["rest"]);
1582
- __publicField(RestStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker3);
700
+ __publicField(RestStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker);
1583
701
  __publicField(RestStakeEventsViewer, "dependencies", []);
1584
- __publicField(RestStakeEventsViewer, "monikers", [StakeEventsViewerMoniker3]);
702
+ __publicField(RestStakeEventsViewer, "monikers", [StakeEventsViewerMoniker]);
1585
703
  __publicField(RestStakeEventsViewer, "surface", "node");
1586
704
  RestStakeEventsViewer = __decorateClass([
1587
- creatableProvider6()
705
+ creatableProvider()
1588
706
  ], RestStakeEventsViewer);
707
+
708
+ // src/modules/ethereum/providers/AbstractEvmProvider.ts
709
+ import { AbstractEvmProvider } from "@xyo-network/xl1-sdk";
710
+
711
+ // src/modules/ethereum/providers/AbstractEvmRunner.ts
712
+ import { assertEx as assertEx6 } from "@ariestools/sdk";
713
+
714
+ // src/modules/ethereum/providers/AbstractEvmViewer.ts
715
+ import { AbstractEvmViewer } from "@xyo-network/xl1-sdk";
716
+
717
+ // src/modules/ethereum/providers/AbstractEvmRunner.ts
718
+ var AbstractEvmRunner = class extends AbstractEvmViewer {
719
+ static async paramsHandler(params) {
720
+ const runner = assertEx6(params?.runner, () => new Error("No runner defined"));
721
+ const provider = assertEx6(runner.provider, () => new Error("Runner must have a provider defined"));
722
+ return { ...await super.paramsHandler({ ...params, provider }), runner };
723
+ }
724
+ };
725
+
726
+ // src/modules/ethereum/providers/EvmChainContractViewer.ts
727
+ import { EvmChainContractViewer } from "@xyo-network/xl1-sdk";
728
+
729
+ // src/modules/ethereum/providers/EvmStakeRunner.ts
730
+ import { toEthAddress as toEthAddress5 } from "@ariestools/sdk";
731
+ import { IStakedXyoChain__factory } from "@xyo-network/typechain";
732
+ import {
733
+ creatableProvider as creatableProvider2,
734
+ StakeRunnerMoniker
735
+ } from "@xyo-network/xl1-sdk";
736
+ import { getAddress } from "ethers/address";
737
+ var EvmStakeRunner = class extends AbstractEvmRunner {
738
+ moniker = EvmStakeRunner.defaultMoniker;
739
+ async addStake(staked, amount) {
740
+ const result = await this.contract.addStake(getAddress(toEthAddress5(staked)), amount);
741
+ await result.wait();
742
+ return true;
743
+ }
744
+ async removeStake(slot) {
745
+ const result = await this.contract.removeStake(slot);
746
+ await result.wait();
747
+ return true;
748
+ }
749
+ async withdrawStake(slot) {
750
+ const result = await this.contract.withdrawStake(slot);
751
+ await result.wait();
752
+ return true;
753
+ }
754
+ connectContract(address) {
755
+ return IStakedXyoChain__factory.connect(address, this.params.runner);
756
+ }
757
+ };
758
+ __publicField(EvmStakeRunner, "connectionTypes", ["evm-rpc"]);
759
+ __publicField(EvmStakeRunner, "defaultMoniker", StakeRunnerMoniker);
760
+ __publicField(EvmStakeRunner, "dependencies", []);
761
+ __publicField(EvmStakeRunner, "monikers", [StakeRunnerMoniker]);
762
+ __publicField(EvmStakeRunner, "surface", "node");
763
+ EvmStakeRunner = __decorateClass([
764
+ creatableProvider2()
765
+ ], EvmStakeRunner);
766
+
767
+ // src/modules/ethereum/providers/EvmStakeTotalsViewer.ts
768
+ import { EvmStakeTotalsViewer } from "@xyo-network/xl1-sdk";
769
+
770
+ // src/modules/ethereum/rpc/isRpcRangeLimitError.ts
771
+ import { isRpcRangeLimitError, rpcRangeLimitFromError } from "@xyo-network/xl1-sdk";
772
+
773
+ // src/modules/ethereum/rpc/isRpcRateLimitError.ts
774
+ import { isRpcRateLimitError } from "@xyo-network/xl1-sdk";
775
+
776
+ // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
777
+ import { withRpcRateLimitBackoff } from "@xyo-network/xl1-sdk";
1589
778
  export {
1590
779
  AbstractEvmProvider,
1591
780
  AbstractEvmRunner,