@xyo-network/chain-sdk 4.1.0 → 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 (172) 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 +2 -0
  4. package/dist/browser/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
  5. package/dist/browser/modules/ethereum/block/index.d.ts +1 -0
  6. package/dist/browser/modules/ethereum/block/index.d.ts.map +1 -1
  7. package/dist/browser/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
  8. package/dist/browser/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
  9. package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -57
  10. package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  11. package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
  12. package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  13. package/dist/browser/modules/ethereum/index.d.ts +2 -0
  14. package/dist/browser/modules/ethereum/index.d.ts.map +1 -1
  15. package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
  16. package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
  17. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
  18. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
  19. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
  20. package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
  21. package/dist/browser/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
  22. package/dist/browser/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
  23. package/dist/browser/modules/ethereum/indexing/index.d.ts +5 -0
  24. package/dist/browser/modules/ethereum/indexing/index.d.ts.map +1 -0
  25. package/dist/browser/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
  26. package/dist/browser/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  27. package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  28. package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  29. package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  30. package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  31. package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  32. package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  33. package/dist/browser/modules/ethereum/rpc/index.d.ts +4 -0
  34. package/dist/browser/modules/ethereum/rpc/index.d.ts.map +1 -0
  35. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +2 -0
  36. package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  37. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  38. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  39. package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  40. package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  41. package/dist/browser/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  42. package/dist/browser/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  43. package/dist/browser/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  44. package/dist/browser/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  45. package/dist/browser/modules/services/Election/BaseElectionService.d.ts +1 -0
  46. package/dist/browser/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  47. package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
  48. package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  49. package/dist/browser/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  50. package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  51. package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  52. package/dist/browser/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  53. package/dist/browser/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  54. package/dist/browser/modules/wrappers/index.d.ts +1 -1
  55. package/dist/browser/modules/wrappers/index.d.ts.map +1 -1
  56. package/dist/neutral/ethereum.mjs +312 -775
  57. package/dist/neutral/ethereum.mjs.map +4 -4
  58. package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
  59. package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
  60. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts +2 -0
  61. package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
  62. package/dist/neutral/modules/ethereum/block/index.d.ts +1 -0
  63. package/dist/neutral/modules/ethereum/block/index.d.ts.map +1 -1
  64. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
  65. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
  66. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -57
  67. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  68. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
  69. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  70. package/dist/neutral/modules/ethereum/index.d.ts +2 -0
  71. package/dist/neutral/modules/ethereum/index.d.ts.map +1 -1
  72. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
  73. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
  74. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
  75. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
  76. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
  77. package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
  78. package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
  79. package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
  80. package/dist/neutral/modules/ethereum/indexing/index.d.ts +5 -0
  81. package/dist/neutral/modules/ethereum/indexing/index.d.ts.map +1 -0
  82. package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
  83. package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  84. package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  85. package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  86. package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  87. package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  88. package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  89. package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  90. package/dist/neutral/modules/ethereum/rpc/index.d.ts +4 -0
  91. package/dist/neutral/modules/ethereum/rpc/index.d.ts.map +1 -0
  92. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +2 -0
  93. package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  94. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  95. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  96. package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  97. package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  98. package/dist/neutral/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  99. package/dist/neutral/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  100. package/dist/neutral/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  101. package/dist/neutral/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  102. package/dist/neutral/modules/services/Election/BaseElectionService.d.ts +1 -0
  103. package/dist/neutral/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  104. package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
  105. package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  106. package/dist/neutral/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  107. package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  108. package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  109. package/dist/neutral/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  110. package/dist/neutral/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  111. package/dist/neutral/modules/wrappers/index.d.ts +1 -1
  112. package/dist/neutral/modules/wrappers/index.d.ts.map +1 -1
  113. package/dist/neutral/services.mjs +61 -71
  114. package/dist/neutral/services.mjs.map +4 -4
  115. package/dist/neutral/wrappers.mjs +1 -1
  116. package/dist/neutral/wrappers.mjs.map +1 -1
  117. package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
  118. package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
  119. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts +2 -0
  120. package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
  121. package/dist/node/modules/ethereum/block/index.d.ts +1 -0
  122. package/dist/node/modules/ethereum/block/index.d.ts.map +1 -1
  123. package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
  124. package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
  125. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -57
  126. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  127. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
  128. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  129. package/dist/node/modules/ethereum/index.d.ts +2 -0
  130. package/dist/node/modules/ethereum/index.d.ts.map +1 -1
  131. package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
  132. package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
  133. package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
  134. package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
  135. package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
  136. package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
  137. package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
  138. package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
  139. package/dist/node/modules/ethereum/indexing/index.d.ts +5 -0
  140. package/dist/node/modules/ethereum/indexing/index.d.ts.map +1 -0
  141. package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
  142. package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
  143. package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
  144. package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
  145. package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
  146. package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
  147. package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
  148. package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
  149. package/dist/node/modules/ethereum/rpc/index.d.ts +4 -0
  150. package/dist/node/modules/ethereum/rpc/index.d.ts.map +1 -0
  151. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +2 -0
  152. package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
  153. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
  154. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
  155. package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
  156. package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
  157. package/dist/node/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
  158. package/dist/node/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  159. package/dist/node/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
  160. package/dist/node/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
  161. package/dist/node/modules/services/Election/BaseElectionService.d.ts +1 -0
  162. package/dist/node/modules/services/Election/BaseElectionService.d.ts.map +1 -1
  163. package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
  164. package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  165. package/dist/node/modules/services/implementation/processPendingBlocks.d.ts +4 -4
  166. package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
  167. package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
  168. package/dist/node/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
  169. package/dist/node/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
  170. package/dist/node/modules/wrappers/index.d.ts +1 -1
  171. package/dist/node/modules/wrappers/index.d.ts.map +1 -1
  172. package/package.json +20 -24
@@ -182,21 +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";
191
+
192
+ // src/modules/ethereum/block/findContractDeploymentBlock.ts
193
+ import {
194
+ configuredDeploymentBlock,
195
+ findContractDeploymentBlock,
196
+ resolveContractDeploymentBlock
197
+ } from "@xyo-network/xl1-sdk";
200
198
 
201
199
  // src/modules/ethereum/block/rate/blockRate.ts
202
200
  import { isDefined, isFalsy } from "@ariestools/sdk";
@@ -246,7 +244,7 @@ var calculateEthBlockRate = async (provider, range, timeUnit) => {
246
244
 
247
245
  // src/modules/ethereum/block/rate/timeRate.ts
248
246
  import {
249
- assertEx as assertEx2,
247
+ assertEx,
250
248
  isDefined as isDefined2,
251
249
  isDefinedNotNull
252
250
  } from "@ariestools/sdk";
@@ -258,12 +256,12 @@ import {
258
256
  var DEFAULT_TOLERANCE_MS = 3e4;
259
257
  var DEFAULT_MAX_ATTEMPTS = 20;
260
258
  var calculateEthTimeRate = async (provider, timeConfig, startBlockNumber, timeUnit, toleranceMs = DEFAULT_TOLERANCE_MS, maxAttempts = DEFAULT_MAX_ATTEMPTS) => {
261
- 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");
262
260
  const startBlock = isDefinedNotNull(startBlockNumber) ? await provider.getBlock(BigInt(startBlockNumber)) : null;
263
- assertEx2(isDefinedNotNull(startBlockNumber) && isDefinedNotNull(startBlock), () => "Start block could not be resolved");
264
- 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"));
265
263
  const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig);
266
- assertEx2(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
264
+ assertEx(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
267
265
  const blocksPerMillisecondRate = 1 / (12 * 1e3);
268
266
  const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds);
269
267
  const endBlockNumber = await findEndBlockRecursive(
@@ -282,14 +280,14 @@ var calculateEthTimeRate = async (provider, timeConfig, startBlockNumber, timeUn
282
280
  };
283
281
  var findEndBlockRecursive = async (provider, startBlock, targetTimeMs, estimatedBlocksBack, toleranceMs, attemptsRemaining) => {
284
282
  console.log(`Attempts remaining: ${attemptsRemaining}, Estimated blocks back: ${estimatedBlocksBack}`);
285
- assertEx2(attemptsRemaining > 0, () => "Maximum attempts reached while searching for end block");
283
+ assertEx(attemptsRemaining > 0, () => "Maximum attempts reached while searching for end block");
286
284
  const startBlockEpoch = startBlock.timestamp;
287
285
  const estimatedEndBlockNumber = startBlock.number - estimatedBlocksBack;
288
286
  if (estimatedEndBlockNumber < 0) {
289
287
  throw new Error("Estimated end block number is less than zero");
290
288
  }
291
289
  const endBlock = await provider.getBlock(estimatedEndBlockNumber);
292
- const resolvedEndBlock = assertEx2(
290
+ const resolvedEndBlock = assertEx(
293
291
  isDefined2(endBlock) ? endBlock : void 0,
294
292
  () => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`
295
293
  );
@@ -332,7 +330,7 @@ import { createGenesisBlock } from "#protocol";
332
330
  // src/modules/ethereum/createChainContract.ts
333
331
  import {
334
332
  asAddress,
335
- assertEx as assertEx3,
333
+ assertEx as assertEx2,
336
334
  ETH_ZERO_ADDRESS,
337
335
  hexToBigInt,
338
336
  toEthAddress
@@ -360,7 +358,7 @@ var createChainContract = async (signer, stakingTokenAddress, genesisBlockHash,
360
358
  );
361
359
  await deployResponse.waitForDeployment();
362
360
  const xyoChainContractAddress = await deployResponse.getAddress();
363
- return assertEx3(asAddress(xyoChainContractAddress), () => "Invalid staking contract address");
361
+ return assertEx2(asAddress(xyoChainContractAddress), () => "Invalid staking contract address");
364
362
  } catch (ex) {
365
363
  console.log(ex);
366
364
  throw ex;
@@ -370,7 +368,7 @@ var createChainContract = async (signer, stakingTokenAddress, genesisBlockHash,
370
368
  // src/modules/ethereum/createChainRewardsContract.ts
371
369
  import {
372
370
  asAddress as asAddress2,
373
- assertEx as assertEx4,
371
+ assertEx as assertEx3,
374
372
  toFixedPoint
375
373
  } from "@ariestools/sdk";
376
374
  import { XyoChainRewards__factory as XyoChainRewardsFactory } from "@xyo-network/typechain";
@@ -397,7 +395,7 @@ var createChainRewardsContract = async (signer, genesisReward = 0n, gas = gasCon
397
395
  );
398
396
  await deployResponse.waitForDeployment();
399
397
  const xyoChainRewardsAddress = await deployResponse.getAddress();
400
- return assertEx4(asAddress2(xyoChainRewardsAddress), () => "Invalid rewards contract address");
398
+ return assertEx3(asAddress2(xyoChainRewardsAddress), () => "Invalid rewards contract address");
401
399
  } catch (ex) {
402
400
  console.log(ex);
403
401
  throw ex;
@@ -407,7 +405,7 @@ var createChainRewardsContract = async (signer, genesisReward = 0n, gas = gasCon
407
405
  // src/modules/ethereum/nextContractAddress.ts
408
406
  import {
409
407
  asAddress as asAddress3,
410
- assertEx as assertEx5,
408
+ assertEx as assertEx4,
411
409
  toEthAddress as toEthAddress2
412
410
  } from "@ariestools/sdk";
413
411
  import { getCreateAddress } from "ethers/address";
@@ -415,11 +413,11 @@ var nextContractAddressForAddress = async (address, provider) => {
415
413
  const deployerAddress = toEthAddress2(address);
416
414
  const nonce = await provider.getTransactionCount(deployerAddress);
417
415
  const contractAddress = getCreateAddress({ from: deployerAddress, nonce });
418
- return assertEx5(asAddress3(contractAddress), () => "Unable to convert contract address to address");
416
+ return assertEx4(asAddress3(contractAddress), () => "Unable to convert contract address to address");
419
417
  };
420
418
  var nextContractAddress = async (signer) => {
421
- const provider = assertEx5(signer.provider, () => "Unable to obtain provider from signer");
422
- 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");
423
421
  return await nextContractAddressForAddress(address, provider);
424
422
  };
425
423
 
@@ -450,178 +448,287 @@ async function createChain(signer, stakingTokenAddress, initialBlockProducer, re
450
448
 
451
449
  // src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
452
450
  import {
453
- assertEx as assertEx10,
454
- exists,
455
- isDefined as isDefined3,
456
- toAddress as toAddress3,
457
- toEthAddress as toEthAddress8
458
- } from "@ariestools/sdk";
459
- import {
460
- IAddressStakingEvents__factory
461
- } from "@xyo-network/typechain";
462
- import {
463
- creatableProvider as creatableProvider4,
464
- EvmChainViewerMoniker as EvmChainViewerMoniker4,
465
- StakeEventsViewerMoniker
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
466
456
  } from "@xyo-network/xl1-sdk";
467
- import { asAttoXL1 } from "@xyo-network/xl1-sdk";
468
457
 
469
- // src/modules/ethereum/providers/AbstractEvmProvider.ts
458
+ // src/modules/ethereum/drivers/EvmStakeEventZod.ts
470
459
  import {
471
- assertEx as assertEx6,
472
- toEthAddress as toEthAddress4
473
- } from "@ariestools/sdk";
474
- import { AbstractCreatableProvider } from "@xyo-network/xl1-sdk";
475
- var AbstractEvmProvider = class extends AbstractCreatableProvider {
476
- _contract;
477
- _address;
478
- get address() {
479
- return assertEx6(this._address, () => "EVM contract address not initialized");
480
- }
481
- get contract() {
482
- return this._contract;
483
- }
484
- async createHandler() {
485
- await super.createHandler();
486
- this._address = this.params.address ?? toEthAddress4(assertEx6(this.config?.chain?.id, () => "EVM provider requires an address param or config.chain.id"));
487
- this._contract = this.connectContract(this._address);
488
- }
489
- };
460
+ asEvmStakeAddedEvent,
461
+ asEvmStakeEvent,
462
+ asEvmStakeRemovedEvent,
463
+ asEvmStakeWithdrawnEvent,
464
+ EthHashRegEx,
465
+ EthHashZod,
466
+ EvmStakeAddedEventNameZod,
467
+ EvmStakeAddedEventZod,
468
+ EvmStakeEventArgsZod,
469
+ EvmStakeEventNameZod,
470
+ EvmStakeEventZod,
471
+ EvmStakeRemovedEventNameZod,
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";
490
484
 
491
- // src/modules/ethereum/providers/AbstractEvmRunner.ts
492
- import { assertEx as assertEx8 } from "@ariestools/sdk";
485
+ // src/modules/ethereum/drivers/EvmStakeViewer.ts
486
+ import { EvmStakeViewer } from "@xyo-network/xl1-sdk";
493
487
 
494
- // src/modules/ethereum/providers/AbstractEvmViewer.ts
495
- import { assertEx as assertEx7 } from "@ariestools/sdk";
496
- import { EvmChainViewerMoniker } from "@xyo-network/xl1-sdk";
497
- var AbstractEvmViewer = class extends AbstractEvmProvider {
498
- _provider;
499
- get provider() {
500
- return assertEx7(this.params.provider ?? this._provider, () => "EVM provider not initialized");
501
- }
502
- async createHandler() {
503
- if (this.params.provider === void 0) {
504
- const evmChainViewer = await this.locateAndCreate(EvmChainViewerMoniker);
505
- this._provider = await evmChainViewer.provider();
506
- }
507
- await super.createHandler();
508
- }
488
+ // src/modules/ethereum/ethereum.ts
489
+ import { parseUnits as parseUnits2 } from "ethers/utils";
490
+ var getDefaultGasConfig = () => {
491
+ return {
492
+ gasLimit: 2e6,
493
+ // Set the gas limit
494
+ gasPrice: parseUnits2("100", "gwei")
495
+ };
509
496
  };
510
497
 
511
- // src/modules/ethereum/providers/AbstractEvmRunner.ts
512
- var AbstractEvmRunner = class extends AbstractEvmViewer {
513
- static async paramsHandler(params) {
514
- const runner = assertEx8(params?.runner, () => new Error("No runner defined"));
515
- const provider = assertEx8(runner.provider, () => new Error("Runner must have a provider defined"));
516
- return { ...await super.paramsHandler({ ...params, provider }), runner };
517
- }
518
- };
498
+ // src/modules/ethereum/indexing/EvmEventIndexModel.ts
499
+ import {
500
+ EthAddressZod,
501
+ HexRegExMinMaxMixedCaseWithPrefix,
502
+ zodAsFactory
503
+ } from "@ariestools/sdk";
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,
509
+ blockHash: EvmHashZod,
510
+ blockNumber: z.number(),
511
+ data: EvmDataZod,
512
+ index: z.number(),
513
+ topics: z.array(EvmHashZod),
514
+ transactionHash: EvmHashZod,
515
+ transactionIndex: z.number()
516
+ });
517
+ var EvmEventIndexFrameZod = z.object({
518
+ fromBlock: z.number(),
519
+ logs: z.array(EvmEventIndexLogZod),
520
+ toBlock: z.number()
521
+ });
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")
528
+ });
529
+ var EvmEventIndexHeadZod = z.object({
530
+ address: EthAddressZod,
531
+ block: z.number(),
532
+ chainId: z.string(),
533
+ hash: EvmHashZod
534
+ });
535
+ var asEvmEventIndexFrame = zodAsFactory(EvmEventIndexFrameZod, "asEvmEventIndexFrame");
536
+ var asEvmEventIndexHead = zodAsFactory(EvmEventIndexHeadZod, "asEvmEventIndexHead");
537
+ var asEvmEventIndexManifest = zodAsFactory(EvmEventIndexManifestZod, "asEvmEventIndexManifest");
519
538
 
520
- // src/modules/ethereum/providers/EvmChainContractViewer.ts
539
+ // src/modules/ethereum/indexing/EvmEventIndexPaths.ts
540
+ function root(address) {
541
+ return `evm/events/${address.toLowerCase()}`;
542
+ }
543
+ function evmEventIndexFramePath(address, frameIndex) {
544
+ return `${root(address)}/frames/${frameIndex}.json`;
545
+ }
546
+ function evmEventIndexHeadPath(address) {
547
+ return `${root(address)}/head.json`;
548
+ }
549
+ function evmEventIndexManifestPath(address) {
550
+ return `${root(address)}/manifest.json`;
551
+ }
552
+ function evmEventIndexTailPath(address) {
553
+ return `${root(address)}/tail.json`;
554
+ }
555
+
556
+ // src/modules/ethereum/indexing/EvmEventIndexPublishRunner.ts
557
+ var EvmEventIndexPublishRunnerMoniker = "EvmEventIndexPublishRunner";
558
+
559
+ // src/modules/ethereum/indexing/RestStakeEventsViewer.ts
521
560
  import {
522
- asHash,
523
- assertEx as assertEx9,
561
+ assertEx as assertEx5,
562
+ isDefined as isDefined3,
524
563
  toAddress as toAddress2,
525
- toEthAddress as toEthAddress5,
526
- toHex
564
+ toEthAddress as toEthAddress4
527
565
  } from "@ariestools/sdk";
528
- import { IStakedXyoChain__factory } from "@xyo-network/typechain";
566
+ import { IAddressStakingEvents__factory } from "@xyo-network/typechain";
529
567
  import {
530
- ChainContractViewerMoniker,
568
+ AbstractCreatableProvider,
569
+ asAttoXL1,
531
570
  creatableProvider,
532
- EvmChainViewerMoniker as EvmChainViewerMoniker2,
533
- toXL1BlockNumber,
534
- withContextCacheResponse
571
+ resolveRestConnectionEndpoint,
572
+ StakeEventsViewerMoniker
535
573
  } from "@xyo-network/xl1-sdk";
536
- var EvmChainContractViewer = class extends AbstractEvmViewer {
537
- moniker = EvmChainContractViewer.defaultMoniker;
538
- _forkedAtBlockNumber;
539
- _forkedAtHash;
540
- _forkedChainContractViewer;
541
- _forkedChainId;
542
- _minWithdrawalBlocks;
543
- _rewardsContract;
544
- _stakingTokenAddress;
545
- chainId() {
546
- return toHex(this.address, { prefix: false });
547
- }
548
- async chainIdAtBlockNumber(blockNumber) {
549
- return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
550
- let chainId = this.chainId();
551
- let contractViewer = this;
552
- let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
553
- while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {
554
- contractViewer = assertEx9(await contractViewer.forkedChainContractViewer(), () => "Forked chain contract viewer is undefined");
555
- forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
556
- chainId = await contractViewer.chainId();
557
- }
558
- return chainId;
559
- });
574
+ import { Interface } from "ethers";
575
+ var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
576
+ var RestStakeEventsViewer = class extends AbstractCreatableProvider {
577
+ moniker = RestStakeEventsViewer.defaultMoniker;
578
+ completeFrames = /* @__PURE__ */ new Map();
579
+ contractInterface = new Interface(IAddressStakingEvents__factory.abi);
580
+ currentHead;
581
+ manifestPromise;
582
+ stakeEventCache = [];
583
+ syncPromise;
584
+ tailFrame;
585
+ get address() {
586
+ return this.params.address;
560
587
  }
561
- async forkedAtBlockNumber() {
562
- const contractAddress = this.contract.getAddress();
563
- try {
564
- this._forkedAtBlockNumber = this._forkedAtBlockNumber ?? (async () => toXL1BlockNumber(await this.contract.forkedAtBlockNumber(), true))();
565
- return await this._forkedAtBlockNumber;
566
- } catch {
567
- this.logger?.warn("Failed to fetch forkedAtBlockNumber, returning null", contractAddress);
568
- this._forkedAtBlockNumber = Promise.resolve(null);
569
- return await this._forkedAtBlockNumber;
570
- }
588
+ get eventIndexBaseUrl() {
589
+ return this.params.eventIndexBaseUrl;
571
590
  }
572
- async forkedAtHash() {
573
- this._forkedAtHash = this._forkedAtHash ?? (async () => asHash(toHex(await this.contract.forkedAtHash()), true))();
574
- return await this._forkedAtHash;
575
- }
576
- async forkedChainContractViewer() {
577
- this._forkedChainContractViewer = this._forkedChainContractViewer ?? (async () => {
578
- const address = await this.forkedChainId();
579
- return EvmChainContractViewer.create({
580
- ...this.params,
581
- address: toEthAddress5(address),
582
- provider: this.provider
583
- });
584
- })();
585
- return await this._forkedChainContractViewer;
591
+ get fetchFn() {
592
+ return this.params.fetchFn ?? fetch.bind(globalThis);
586
593
  }
587
- async forkedChainId() {
588
- this._forkedChainId = this._forkedChainId ?? (async () => {
589
- return toAddress2(await this.contract.forkedChainId());
590
- })();
591
- return await this._forkedChainId;
594
+ static async paramsHandler(params) {
595
+ const contextConfig = params.context?.config;
596
+ const address = params.address ?? toEthAddress4(assertEx5(contextConfig?.chain?.id, () => "RestStakeEventsViewer requires an address param or config.chain.id"));
597
+ const moniker = this.defaultMoniker;
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"),
600
+ moniker
601
+ );
602
+ return {
603
+ ...await super.paramsHandler(params),
604
+ address,
605
+ eventIndexBaseUrl: eventIndexBaseUrl.replace(/\/+$/, ""),
606
+ fetchFn: params.fetchFn
607
+ };
592
608
  }
593
- async minWithdrawalBlocks() {
594
- this._minWithdrawalBlocks = this._minWithdrawalBlocks ?? (async () => Number(await this.contract.minWithdrawalBlocks()))();
595
- return await this._minWithdrawalBlocks;
609
+ async positionCount(range) {
610
+ const events = await this.stakeEvents(range);
611
+ return Math.max(-1, ...events.map((event) => event.args.id)) + 1;
612
+ }
613
+ async stakeEvents(range = [0, "latest"], filter) {
614
+ await this.sync();
615
+ return this.stakeEventCache.filter((event) => this.matchesFilter(event, range, filter));
616
+ }
617
+ decodeIndexedStakeEvents() {
618
+ const frames = [...this.completeFrames.entries()].sort(([a], [b]) => a - b).map(([, frame]) => frame);
619
+ const logs = [...frames, ...this.tailFrame === void 0 ? [] : [this.tailFrame]].flatMap((frame) => frame.logs).sort((a, b) => a.blockNumber - b.blockNumber || a.transactionIndex - b.transactionIndex || a.index - b.index);
620
+ return logs.flatMap((log) => {
621
+ const event = this.stakeEventFromLog(log);
622
+ return event === void 0 ? [] : [event];
623
+ });
596
624
  }
597
- async rewardsContract() {
598
- this._rewardsContract = this._rewardsContract ?? (async () => {
599
- return toAddress2(await this.contract.rewardsContract());
600
- })();
601
- return await this._rewardsContract;
625
+ async fetchJson(path) {
626
+ const response = await this.fetchFn(`${this.eventIndexBaseUrl}/${path}`);
627
+ assertEx5(response.ok, () => `EVM event index request failed [${response.status}] for ${path}`);
628
+ return await response.json();
602
629
  }
603
- async stakingTokenAddress() {
604
- this._stakingTokenAddress = this._stakingTokenAddress ?? (async () => {
605
- return toAddress2(await this.contract.stakingTokenAddress());
630
+ async getManifest() {
631
+ this.manifestPromise ??= (async () => {
632
+ const manifest = asEvmEventIndexManifest(await this.fetchJson(evmEventIndexManifestPath(this.address)), true);
633
+ assertEx5(manifest.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index manifest address mismatch");
634
+ return manifest;
606
635
  })();
607
- return await this._stakingTokenAddress;
636
+ return await this.manifestPromise;
637
+ }
638
+ // eslint-disable-next-line complexity
639
+ matchesFilter(event, range, filter) {
640
+ if (range[1] !== "latest" && event.time > range[1]) return false;
641
+ if (event.time < range[0]) 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;
646
+ return true;
608
647
  }
609
- connectContract(address) {
610
- return IStakedXyoChain__factory.connect(address, this.provider);
648
+ stakeEventFromLog(log) {
649
+ const parsed = this.contractInterface.parseLog({ data: log.data, topics: log.topics });
650
+ if (parsed === null || !STAKE_EVENT_NAMES.has(parsed.name)) return;
651
+ const [staked, staker, id, amount] = parsed.args;
652
+ return {
653
+ name: parsed.name,
654
+ args: {
655
+ amount: asAttoXL1(amount),
656
+ id: Number(id),
657
+ staked: toAddress2(staked),
658
+ staker: toAddress2(staker)
659
+ },
660
+ time: log.blockNumber
661
+ };
662
+ }
663
+ async sync() {
664
+ this.syncPromise ??= this.syncFromHead().finally(() => {
665
+ this.syncPromise = void 0;
666
+ });
667
+ await this.syncPromise;
668
+ }
669
+ async syncFromHead() {
670
+ const manifest = await this.getManifest();
671
+ const head = asEvmEventIndexHead(await this.fetchJson(evmEventIndexHeadPath(this.address)), true);
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");
674
+ if (this.currentHead?.block === head.block && this.currentHead.hash === head.hash) return;
675
+ if (this.currentHead !== void 0 && (head.block < this.currentHead.block || head.block === this.currentHead.block && head.hash !== this.currentHead.hash)) {
676
+ this.completeFrames.clear();
677
+ this.tailFrame = void 0;
678
+ }
679
+ const indexedBlockCount = Math.max(0, head.block - manifest.deploymentBlock + 1);
680
+ const completeFrameCount = Math.floor(indexedBlockCount / manifest.frameSize);
681
+ const missingFrameIndexes = Array.from({ length: completeFrameCount }, (_, index) => index).filter((index) => !this.completeFrames.has(index));
682
+ await Promise.all(missingFrameIndexes.map(async (index) => {
683
+ const frame = asEvmEventIndexFrame(await this.fetchJson(evmEventIndexFramePath(this.address, index)), true);
684
+ const expectedFrom = manifest.deploymentBlock + index * manifest.frameSize;
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`);
687
+ this.completeFrames.set(index, frame);
688
+ }));
689
+ const tailStart = manifest.deploymentBlock + completeFrameCount * manifest.frameSize;
690
+ this.tailFrame = tailStart <= head.block ? asEvmEventIndexFrame(await this.fetchJson(`${evmEventIndexTailPath(this.address)}?head=${head.hash}`), true) : void 0;
691
+ if (this.tailFrame !== void 0) {
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");
694
+ }
695
+ this.stakeEventCache = this.decodeIndexedStakeEvents();
696
+ this.currentHead = head;
611
697
  }
612
698
  };
613
- __publicField(EvmChainContractViewer, "connectionTypes", ["evm-rpc"]);
614
- __publicField(EvmChainContractViewer, "defaultMoniker", ChainContractViewerMoniker);
615
- __publicField(EvmChainContractViewer, "dependencies", [EvmChainViewerMoniker2]);
616
- __publicField(EvmChainContractViewer, "monikers", [ChainContractViewerMoniker]);
617
- __publicField(EvmChainContractViewer, "surface", "node");
618
- EvmChainContractViewer = __decorateClass([
699
+ __publicField(RestStakeEventsViewer, "connectionTypes", ["rest"]);
700
+ __publicField(RestStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker);
701
+ __publicField(RestStakeEventsViewer, "dependencies", []);
702
+ __publicField(RestStakeEventsViewer, "monikers", [StakeEventsViewerMoniker]);
703
+ __publicField(RestStakeEventsViewer, "surface", "node");
704
+ RestStakeEventsViewer = __decorateClass([
619
705
  creatableProvider()
620
- ], EvmChainContractViewer);
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";
621
728
 
622
729
  // src/modules/ethereum/providers/EvmStakeRunner.ts
623
- import { toEthAddress as toEthAddress6 } from "@ariestools/sdk";
624
- import { IStakedXyoChain__factory as IStakedXyoChain__factory2 } from "@xyo-network/typechain";
730
+ import { toEthAddress as toEthAddress5 } from "@ariestools/sdk";
731
+ import { IStakedXyoChain__factory } from "@xyo-network/typechain";
625
732
  import {
626
733
  creatableProvider as creatableProvider2,
627
734
  StakeRunnerMoniker
@@ -630,7 +737,7 @@ import { getAddress } from "ethers/address";
630
737
  var EvmStakeRunner = class extends AbstractEvmRunner {
631
738
  moniker = EvmStakeRunner.defaultMoniker;
632
739
  async addStake(staked, amount) {
633
- const result = await this.contract.addStake(getAddress(toEthAddress6(staked)), amount);
740
+ const result = await this.contract.addStake(getAddress(toEthAddress5(staked)), amount);
634
741
  await result.wait();
635
742
  return true;
636
743
  }
@@ -645,7 +752,7 @@ var EvmStakeRunner = class extends AbstractEvmRunner {
645
752
  return true;
646
753
  }
647
754
  connectContract(address) {
648
- return IStakedXyoChain__factory2.connect(address, this.params.runner);
755
+ return IStakedXyoChain__factory.connect(address, this.params.runner);
649
756
  }
650
757
  };
651
758
  __publicField(EvmStakeRunner, "connectionTypes", ["evm-rpc"]);
@@ -658,620 +765,34 @@ EvmStakeRunner = __decorateClass([
658
765
  ], EvmStakeRunner);
659
766
 
660
767
  // src/modules/ethereum/providers/EvmStakeTotalsViewer.ts
661
- import { toEthAddress as toEthAddress7 } from "@ariestools/sdk";
662
- import { IStakedXyoChain__factory as IStakedXyoChain__factory3 } from "@xyo-network/typechain";
663
- import {
664
- creatableProvider as creatableProvider3,
665
- EvmChainViewerMoniker as EvmChainViewerMoniker3,
666
- StakeTotalsViewerMoniker
667
- } from "@xyo-network/xl1-sdk";
668
- import { getAddress as getAddress2 } from "ethers/address";
669
- var EvmStakeTotalsViewer = class extends AbstractEvmViewer {
670
- moniker = EvmStakeTotalsViewer.defaultMoniker;
671
- async active() {
672
- return await this.contract.active();
673
- }
674
- async activeByStaked(staked) {
675
- return await this.contract.activeByAddressStaked(getAddress2(toEthAddress7(staked)));
676
- }
677
- async activeByStaker(address) {
678
- return await this.contract.activeByStaker(getAddress2(toEthAddress7(address)));
679
- }
680
- async pending() {
681
- return await this.contract.pending();
682
- }
683
- async pendingByStaker(staker) {
684
- return await this.contract.pendingByStaker(getAddress2(toEthAddress7(staker)));
685
- }
686
- async withdrawn() {
687
- return await this.contract.withdrawn();
688
- }
689
- async withdrawnByStaker(staker) {
690
- return await this.contract.withdrawnByStaker(getAddress2(staker));
691
- }
692
- connectContract(address) {
693
- return IStakedXyoChain__factory3.connect(address, this.provider);
694
- }
695
- };
696
- __publicField(EvmStakeTotalsViewer, "connectionTypes", ["evm-rpc"]);
697
- __publicField(EvmStakeTotalsViewer, "defaultMoniker", StakeTotalsViewerMoniker);
698
- __publicField(EvmStakeTotalsViewer, "dependencies", [EvmChainViewerMoniker3]);
699
- __publicField(EvmStakeTotalsViewer, "monikers", [StakeTotalsViewerMoniker]);
700
- __publicField(EvmStakeTotalsViewer, "surface", "node");
701
- EvmStakeTotalsViewer = __decorateClass([
702
- creatableProvider3()
703
- ], EvmStakeTotalsViewer);
768
+ import { EvmStakeTotalsViewer } from "@xyo-network/xl1-sdk";
704
769
 
705
- // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
706
- import { delay } from "@ariestools/sdk";
770
+ // src/modules/ethereum/rpc/isRpcRangeLimitError.ts
771
+ import { isRpcRangeLimitError, rpcRangeLimitFromError } from "@xyo-network/xl1-sdk";
707
772
 
708
773
  // src/modules/ethereum/rpc/isRpcRateLimitError.ts
709
- function isRpcRateLimitError(error) {
710
- const seen = /* @__PURE__ */ new Set();
711
- const queue = [error];
712
- while (queue.length > 0) {
713
- const current = queue.pop();
714
- if (current === void 0 || current === null || seen.has(current)) {
715
- continue;
716
- }
717
- seen.add(current);
718
- if (typeof current === "string") {
719
- if (matchesRateLimitText(current)) {
720
- return true;
721
- }
722
- continue;
723
- }
724
- if (typeof current === "number") {
725
- if (isRateLimitCode(current)) {
726
- return true;
727
- }
728
- continue;
729
- }
730
- if (typeof current !== "object") {
731
- continue;
732
- }
733
- if (Array.isArray(current)) {
734
- const items = current;
735
- queue.push(...items);
736
- continue;
737
- }
738
- const record = current;
739
- for (const key of ["code", "message", "shortMessage", "reason", "status", "statusCode"]) {
740
- if (key in record) {
741
- queue.push(record[key]);
742
- }
743
- }
744
- for (const key of ["error", "info", "data", "value", "body", "payload"]) {
745
- if (key in record) {
746
- queue.push(record[key]);
747
- }
748
- }
749
- }
750
- return false;
751
- }
752
- function isRateLimitCode(code) {
753
- return code === 429 || code === -32005 || code === -32007 || code === -32016;
754
- }
755
- function matchesRateLimitText(text) {
756
- const normalized = text.toLowerCase();
757
- 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");
758
- }
774
+ import { isRpcRateLimitError } from "@xyo-network/xl1-sdk";
759
775
 
760
776
  // src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
761
- async function withRpcRateLimitBackoff(fn, options = {}) {
762
- const {
763
- backoff = 2,
764
- initialDelayMs = 1e3,
765
- maxAttempts = 8,
766
- maxDelayMs = 3e4,
767
- onRetry
768
- } = options;
769
- if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {
770
- throw new TypeError(`maxAttempts must be an integer >= 1, got ${maxAttempts}`);
771
- }
772
- let delayMs = initialDelayMs;
773
- let lastError;
774
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
775
- try {
776
- return await fn();
777
- } catch (error) {
778
- lastError = error;
779
- const isLastAttempt = attempt >= maxAttempts;
780
- if (!isRpcRateLimitError(error) || isLastAttempt) {
781
- throw error;
782
- }
783
- const waitMs = Math.min(delayMs, maxDelayMs);
784
- onRetry?.(error, attempt, waitMs);
785
- await delay(waitMs);
786
- delayMs = Math.min(delayMs * backoff, maxDelayMs);
787
- }
788
- }
789
- throw lastError;
790
- }
791
-
792
- // src/modules/ethereum/drivers/EvmStakeEventZod.ts
793
- import {
794
- EthAddressZod,
795
- HexRegExMinMaxMixedCaseWithPrefix,
796
- zodAsFactory,
797
- zodIsFactory,
798
- zodToFactory
799
- } from "@ariestools/sdk";
800
- import { z } from "zod/mini";
801
- var EthHashRegEx = HexRegExMinMaxMixedCaseWithPrefix(32, 32);
802
- var EthHashZod = z.string().check(z.regex(EthHashRegEx, { error: "Invalid address format" }));
803
- var EvmStakeAddedEventNameZod = z.literal("StakeAdded");
804
- var EvmStakeRemovedEventNameZod = z.literal("StakeRemoved");
805
- var EvmStakeWithdrawnEventNameZod = z.literal("StakeWithdrawn");
806
- var EvmStakeEventNameZod = z.union([
807
- EvmStakeAddedEventNameZod,
808
- EvmStakeRemovedEventNameZod,
809
- EvmStakeWithdrawnEventNameZod
810
- ]);
811
- var EvmStakeEventArgsZod = z.tuple([
812
- EthAddressZod,
813
- // staker
814
- EthAddressZod,
815
- // staked
816
- z.bigint(),
817
- // id
818
- z.bigint()
819
- // amount
820
- ]);
821
- var EvmStakeEventZod = z.object({
822
- address: EthAddressZod,
823
- args: EvmStakeEventArgsZod,
824
- blockHash: EthHashZod,
825
- blockNumber: z.number(),
826
- eventName: EvmStakeEventNameZod,
827
- transactionHash: EthHashZod,
828
- transactionIndex: z.number()
829
- });
830
- var isEvmStakeEvent = zodIsFactory(EvmStakeEventZod);
831
- var asEvmStakeEvent = zodAsFactory(EvmStakeEventZod, "asEvmStakeEvent");
832
- var toEvmStakeEvent = zodToFactory(EvmStakeEventZod, "toEvmStakeEvent");
833
- var EvmStakeAddedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeAddedEventNameZod });
834
- var isEvmStakeAddedEvent = zodIsFactory(EvmStakeAddedEventZod);
835
- var asEvmStakeAddedEvent = zodAsFactory(EvmStakeAddedEventZod, "asEvmStakeAddedEvent");
836
- var toEvmStakeAddedEvent = zodToFactory(EvmStakeAddedEventZod, "toEvmStakeAddedEvent");
837
- var EvmStakeRemovedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeRemovedEventNameZod });
838
- var isEvmStakeRemovedEvent = zodIsFactory(EvmStakeRemovedEventZod);
839
- var asEvmStakeRemovedEvent = zodAsFactory(EvmStakeRemovedEventZod, "asEvmStakeRemovedEvent");
840
- var toEvmStakeRemovedEvent = zodToFactory(EvmStakeRemovedEventZod, "toEvmStakeRemovedEvent");
841
- var EvmStakeWithdrawnEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeWithdrawnEventNameZod });
842
- var isEvmStakeWithdrawnEvent = zodIsFactory(EvmStakeWithdrawnEventZod);
843
- var asEvmStakeWithdrawnEvent = zodAsFactory(EvmStakeWithdrawnEventZod, "asEvmStakeWithdrawnEvent");
844
- var toEvmStakeWithdrawnEvent = zodToFactory(EvmStakeWithdrawnEventZod, "toEvmStakeWithdrawnEvent");
845
-
846
- // src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
847
- var DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE = 2e3;
848
- var DEFAULT_EVENT_QUERY_MAX_ATTEMPTS = 8;
849
- var DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS = 1e3;
850
- var EvmStakeEventsViewer = class extends AbstractEvmViewer {
851
- moniker = EvmStakeEventsViewer.defaultMoniker;
852
- /** Set at start when `params.deploymentBlock` is omitted (estimated 2025-06-01). */
853
- defaultDeploymentBlock = 0;
854
- eventCache = /* @__PURE__ */ new Map();
855
- get deploymentBlock() {
856
- return this.params.deploymentBlock ?? this.defaultDeploymentBlock;
857
- }
858
- get eventQueryBlockChunkSize() {
859
- return this.params.eventQueryBlockChunkSize ?? DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE;
860
- }
861
- get eventQueryInitialDelayMs() {
862
- return this.params.eventQueryInitialDelayMs ?? DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS;
863
- }
864
- get eventQueryMaxAttempts() {
865
- return this.params.eventQueryMaxAttempts ?? DEFAULT_EVENT_QUERY_MAX_ATTEMPTS;
866
- }
867
- async positionCount(range) {
868
- const events = await this.stakeEvents(range);
869
- const positionIds = events.map((e) => e.args.id);
870
- return Math.max(-1, ...positionIds) + 1;
871
- }
872
- stakeEvents(range = [0, "latest"], filter) {
873
- const allEvents = this.eventCache.values().toArray();
874
- const result = allEvents.filter((e) => {
875
- if (range[1] !== "latest" && e.time > range[1]) {
876
- return false;
877
- }
878
- if (e.time < range[0]) {
879
- return false;
880
- }
881
- if (isDefined3(filter?.name) && e.name !== filter.name) {
882
- return false;
883
- }
884
- if (isDefined3(filter?.args?.id) && e.args.id !== filter.args.id) {
885
- return false;
886
- }
887
- if (isDefined3(filter?.args?.staked) && e.args.staked !== filter.args.staked) {
888
- return false;
889
- }
890
- if (isDefined3(filter?.args?.staker) && e.args.staker !== filter.args.staker) {
891
- return false;
892
- }
893
- return true;
894
- });
895
- return result;
896
- }
897
- connectContract(address) {
898
- return IAddressStakingEvents__factory.connect(address, this.provider);
899
- }
900
- onEventHandler(staked, staker, id, amount, event, throwOnInvalid = false) {
901
- const validatedEventResult = EvmStakeEventZod.safeParse(event);
902
- if (validatedEventResult.error) {
903
- this.logger?.warn(`Received invalid stake event [${event.eventName}/${event.blockNumber}], ignoring...`);
904
- this.logger?.warn(` - ${validatedEventResult.error.message}`);
905
- if (throwOnInvalid) {
906
- throw new Error(`Invalid stake event: ${validatedEventResult.error.message}`);
907
- }
908
- return;
909
- }
910
- const validatedEvent = validatedEventResult.data;
911
- const { eventName, blockNumber } = validatedEvent;
912
- const cacheKey = `${Number(id)}|${eventName}|${staker}`;
913
- const stakeEvent = {
914
- name: eventName,
915
- args: {
916
- id: Number(id),
917
- staked: toAddress3(staked),
918
- staker: toAddress3(staker),
919
- amount: asAttoXL1(amount)
920
- },
921
- time: blockNumber
922
- };
923
- this.eventCache.set(cacheKey, stakeEvent);
924
- return stakeEvent;
925
- }
926
- async startHandler() {
927
- try {
928
- const provider = assertEx10(this.contract.runner?.provider, () => new Error("Failed to get provider"));
929
- const historyEndBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get currentEthBlock"));
930
- if (!isDefined3(this.params.deploymentBlock)) {
931
- this.defaultDeploymentBlock = await estimateBlockNumberAt(provider);
932
- }
933
- await this.loadHistoricalEvents(this.deploymentBlock, historyEndBlock);
934
- await this.attachLiveListeners();
935
- const latestBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get latestEthBlock"));
936
- if (latestBlock > historyEndBlock) {
937
- await this.loadHistoricalEvents(historyEndBlock + 1, latestBlock);
938
- }
939
- } catch (error) {
940
- this.logger?.error("EthereumChainStakeEvents failed to start:", error);
941
- throw error;
942
- }
943
- }
944
- async attachLiveListeners() {
945
- await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
946
- this.onEventHandler(staked, staker, id, amount, event);
947
- });
948
- await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
949
- this.onEventHandler(staked, staker, id, amount, event);
950
- });
951
- await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
952
- this.onEventHandler(staked, staker, id, amount, event);
953
- });
954
- }
955
- async loadHistoricalEvents(fromBlock, toBlock) {
956
- if (fromBlock > toBlock) {
957
- return;
958
- }
959
- const stakeEventGroups = await Promise.all([
960
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeAdded" }),
961
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeRemoved" }),
962
- this.stakeEventsNative([fromBlock, toBlock], { name: "StakeWithdrawn" })
963
- ]);
964
- const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time);
965
- const chunks = blockRangeChunks(fromBlock, toBlock, this.eventQueryBlockChunkSize);
966
- this.logger?.log(
967
- `Cached ${allStakeEvents.length} stake events from blocks ${fromBlock}-${toBlock} (${chunks.length} chunk(s) of up to ${this.eventQueryBlockChunkSize} blocks)`
968
- );
969
- for (const event of allStakeEvents) {
970
- this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event);
971
- }
972
- }
973
- async stakeEventsNative(range = [0, "latest"], filter) {
974
- const name = filter?.name;
975
- if (!isDefined3(name)) {
976
- throw new Error("Only filtered stake events (by name) are supported");
977
- }
978
- const stakedFilter = filter?.args?.staked;
979
- const stakerFilter = filter?.args?.staker;
980
- const stakedFilterEth = isDefined3(stakedFilter) ? toEthAddress8(stakedFilter) : void 0;
981
- const stakerFilterEth = isDefined3(stakerFilter) ? toEthAddress8(stakerFilter) : void 0;
982
- const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth);
983
- const fromBlock = range[0];
984
- const toBlock = range[1] === "latest" ? assertEx10(await this.contract.runner?.provider?.getBlockNumber(), () => new Error("Failed to resolve latest block")) : range[1];
985
- if (fromBlock > toBlock) {
986
- return [];
987
- }
988
- const chunkSize = this.eventQueryBlockChunkSize;
989
- const chunks = blockRangeChunks(fromBlock, toBlock, chunkSize);
990
- const ethEventGroups = [];
991
- for (const [chunkFrom, chunkTo] of chunks) {
992
- try {
993
- ethEventGroups.push(await withRpcRateLimitBackoff(
994
- () => this.contract.queryFilter(ethFilter, chunkFrom, chunkTo),
995
- {
996
- initialDelayMs: this.eventQueryInitialDelayMs,
997
- maxAttempts: this.eventQueryMaxAttempts,
998
- onRetry: (_error, attempt, delayMs) => {
999
- this.logger?.warn(
1000
- `Rate limited fetching ${name} logs for blocks ${chunkFrom}-${chunkTo} (attempt ${attempt}/${this.eventQueryMaxAttempts}); backing off ${delayMs}ms`
1001
- );
1002
- }
1003
- }
1004
- ));
1005
- } catch (error) {
1006
- this.logger?.error(
1007
- `eth_getLogs failed for ${name} blocks ${chunkFrom}-${chunkTo} after rate-limit retries (from=${fromBlock} to=${toBlock}):`,
1008
- error
1009
- );
1010
- throw error;
1011
- }
1012
- }
1013
- const ethEvents = ethEventGroups.flat();
1014
- return ethEvents.map((e) => {
1015
- assertEx10(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`);
1016
- return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e, true);
1017
- }).filter(exists);
1018
- }
1019
- };
1020
- __publicField(EvmStakeEventsViewer, "connectionTypes", ["evm-rpc"]);
1021
- __publicField(EvmStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker);
1022
- __publicField(EvmStakeEventsViewer, "dependencies", [EvmChainViewerMoniker4]);
1023
- __publicField(EvmStakeEventsViewer, "monikers", [StakeEventsViewerMoniker]);
1024
- __publicField(EvmStakeEventsViewer, "surface", "node");
1025
- EvmStakeEventsViewer = __decorateClass([
1026
- creatableProvider4()
1027
- ], EvmStakeEventsViewer);
1028
-
1029
- // src/modules/ethereum/drivers/EvmStakeViewer.ts
1030
- import {
1031
- assertEx as assertEx11,
1032
- isDefined as isDefined4,
1033
- toAddress as toAddress4,
1034
- toEthAddress as toEthAddress9
1035
- } from "@ariestools/sdk";
1036
- import { IAddressStaking__factory } from "@xyo-network/typechain";
1037
- import {
1038
- creatableProvider as creatableProvider5,
1039
- EvmChainViewerMoniker as EvmChainViewerMoniker5,
1040
- StakeEventsViewerMoniker as StakeEventsViewerMoniker2,
1041
- StakeViewerMoniker
1042
- } from "@xyo-network/xl1-sdk";
1043
- import { asAttoXL1 as asAttoXL12 } from "@xyo-network/xl1-sdk";
1044
- import { Mutex } from "async-mutex";
1045
- var ethStakeToStake = (ethStake) => {
1046
- const stake = {
1047
- id: Number(ethStake.id),
1048
- staked: toAddress4(ethStake.staked),
1049
- staker: toAddress4(ethStake.staker),
1050
- amount: asAttoXL12(ethStake.amount),
1051
- addBlock: Number(ethStake.addBlock),
1052
- removeBlock: Number(ethStake.removeBlock),
1053
- withdrawBlock: Number(ethStake.withdrawBlock)
1054
- };
1055
- return stake;
1056
- };
1057
- var EvmStakeViewer = class extends AbstractEvmViewer {
1058
- moniker = EvmStakeViewer.defaultMoniker;
1059
- _callMutex = new Mutex();
1060
- _deploymentBlock = 0;
1061
- _stakeCache = /* @__PURE__ */ new Map();
1062
- _stakeEventsViewer;
1063
- get stakeEvents() {
1064
- return this._stakeEventsViewer;
1065
- }
1066
- async active() {
1067
- return await this._callMutex.runExclusive(async () => {
1068
- return await this.contract.active();
1069
- });
1070
- }
1071
- async activeByAddressStaked(address) {
1072
- return await this._callMutex.runExclusive(async () => {
1073
- return await this.contract.activeByAddressStaked(toEthAddress9(address));
1074
- });
1075
- }
1076
- async activeByStaker(address) {
1077
- return await this._callMutex.runExclusive(async () => {
1078
- return await this.contract.activeByStaker(toEthAddress9(address));
1079
- });
1080
- }
1081
- activeStakes() {
1082
- return this._stakeCache.values().filter((stake) => stake.removeBlock === 0 && stake.withdrawBlock === 0).toArray();
1083
- }
1084
- async createHandler() {
1085
- await super.createHandler();
1086
- this._stakeEventsViewer = await this.locator.getInstance(StakeEventsViewerMoniker2);
1087
- this._deploymentBlock = isDefined4(this.params.deploymentBlock) ? this.params.deploymentBlock : await estimateBlockNumberAt(this.provider);
1088
- }
1089
- minWithdrawalBlocks() {
1090
- return 0;
1091
- }
1092
- async pending() {
1093
- return await this._callMutex.runExclusive(async () => {
1094
- return await this.contract.pending();
1095
- });
1096
- }
1097
- async pendingByStaker(staker) {
1098
- return await this._callMutex.runExclusive(async () => {
1099
- return await this.contract.pendingByStaker(toEthAddress9(staker));
1100
- });
1101
- }
1102
- removedStakes() {
1103
- return this._stakeCache.values().filter((stake) => stake.removeBlock !== 0 && stake.withdrawBlock === 0).toArray();
1104
- }
1105
- rewardsContract() {
1106
- return toAddress4("0x000000000000000000000000000000");
1107
- }
1108
- async stakeById(id) {
1109
- return await this._callMutex.runExclusive(async () => {
1110
- const startTime = Date.now();
1111
- const cachedStake = this._stakeCache.get(id);
1112
- if (cachedStake) {
1113
- return cachedStake;
1114
- }
1115
- const ethResult = await this.contract.getStakeById(id);
1116
- const stake = ethStakeToStake(ethResult);
1117
- this._stakeCache.set(stake.id, stake);
1118
- this.logger?.log(`EthereumChainStake: stakeById(${id}) took ${Date.now() - startTime}ms`);
1119
- return stake;
1120
- });
1121
- }
1122
- async stakeByStaker(staker, slot) {
1123
- return await this._callMutex.runExclusive(async () => {
1124
- const ethResult = await this.contract.getStake(toEthAddress9(staker), slot);
1125
- const stake = ethStakeToStake(ethResult);
1126
- this._stakeCache.set(stake.id, stake);
1127
- return stake;
1128
- });
1129
- }
1130
- async stakesByStaked(staked, range = [0, void 0]) {
1131
- const events = await this.stakeEvents.stakeEvents([Math.max(
1132
- range[0],
1133
- this._deploymentBlock
1134
- ), range.at(1) ?? "latest"], { name: "StakeAdded", args: { staked } });
1135
- const result = [];
1136
- for (const event of events) {
1137
- if (toAddress4(event.args.staked) === toAddress4(staked)) {
1138
- result.push(await this.stakeById(event.args.id));
1139
- }
1140
- }
1141
- return result;
1142
- }
1143
- async stakesByStaker(staker, range = [0, void 0]) {
1144
- const events = await this.stakeEvents.stakeEvents([Math.max(
1145
- range[0],
1146
- this._deploymentBlock
1147
- ), range.at(1) ?? "latest"], { name: "StakeAdded", args: { staker } });
1148
- const result = [];
1149
- for (const event of events) {
1150
- if (toAddress4(event.args.staker) === toAddress4(staker)) {
1151
- result.push(await this.stakeById(event.args.id));
1152
- }
1153
- }
1154
- return result;
1155
- }
1156
- stakingTokenAddress() {
1157
- return toAddress4("0x000000000000000000000000000011");
1158
- }
1159
- async withdrawn() {
1160
- return await this._callMutex.runExclusive(async () => {
1161
- return await this.contract.withdrawn();
1162
- });
1163
- }
1164
- async withdrawnByStaker(staker) {
1165
- return await this._callMutex.runExclusive(async () => {
1166
- return await this.contract.withdrawnByStaker(toEthAddress9(staker));
1167
- });
1168
- }
1169
- withdrawnStakes() {
1170
- return this._stakeCache.values().filter((stake) => stake.removeBlock !== 0 && stake.withdrawBlock !== 0).toArray();
1171
- }
1172
- connectContract(address) {
1173
- return IAddressStaking__factory.connect(address, this.provider);
1174
- }
1175
- async startHandler() {
1176
- await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
1177
- this._stakeCache.set(Number(id), {
1178
- id: Number(id),
1179
- staked: toAddress4(staked),
1180
- staker: toAddress4(staker),
1181
- amount: asAttoXL12(amount),
1182
- addBlock: event.blockNumber,
1183
- removeBlock: 0,
1184
- withdrawBlock: 0
1185
- });
1186
- });
1187
- await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
1188
- const stake = assertEx11(this._stakeCache.get(Number(id)));
1189
- this._stakeCache.set(Number(id), {
1190
- ...stake,
1191
- removeBlock: event.blockNumber
1192
- });
1193
- });
1194
- await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
1195
- const stake = assertEx11(this._stakeCache.get(Number(id)));
1196
- this._stakeCache.set(Number(id), {
1197
- ...stake,
1198
- withdrawBlock: event.blockNumber
1199
- });
1200
- });
1201
- const stakeEventGroups = await Promise.all([
1202
- this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeAdded" }),
1203
- this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeRemoved" }),
1204
- this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeWithdrawn" })
1205
- ]);
1206
- const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time);
1207
- for (const event of allStakeEvents) {
1208
- this.applyHistoricalStakeEvent(event);
1209
- }
1210
- for (const event of allStakeEvents) {
1211
- await this.stakeById(event.args.id);
1212
- }
1213
- }
1214
- applyHistoricalStakeEvent(event) {
1215
- if (event.name === "StakeAdded") {
1216
- this._stakeCache.set(event.args.id, {
1217
- id: event.args.id,
1218
- staked: event.args.staked,
1219
- staker: event.args.staker,
1220
- amount: event.args.amount,
1221
- addBlock: event.time,
1222
- removeBlock: 0,
1223
- withdrawBlock: 0
1224
- });
1225
- return;
1226
- }
1227
- if (event.name === "StakeRemoved") {
1228
- const stake = assertEx11(this._stakeCache.get(event.args.id));
1229
- this._stakeCache.set(event.args.id, {
1230
- ...stake,
1231
- removeBlock: event.time
1232
- });
1233
- return;
1234
- }
1235
- if (event.name === "StakeWithdrawn") {
1236
- const stake = assertEx11(this._stakeCache.get(event.args.id));
1237
- this._stakeCache.set(event.args.id, {
1238
- ...stake,
1239
- withdrawBlock: event.time
1240
- });
1241
- }
1242
- }
1243
- };
1244
- __publicField(EvmStakeViewer, "connectionTypes", ["evm-rpc"]);
1245
- __publicField(EvmStakeViewer, "defaultMoniker", StakeViewerMoniker);
1246
- __publicField(EvmStakeViewer, "dependencies", [EvmChainViewerMoniker5]);
1247
- __publicField(EvmStakeViewer, "monikers", [StakeViewerMoniker]);
1248
- __publicField(EvmStakeViewer, "surface", "node");
1249
- EvmStakeViewer = __decorateClass([
1250
- creatableProvider5()
1251
- ], EvmStakeViewer);
1252
-
1253
- // src/modules/ethereum/ethereum.ts
1254
- import { parseUnits as parseUnits2 } from "ethers/utils";
1255
- var getDefaultGasConfig = () => {
1256
- return {
1257
- gasLimit: 2e6,
1258
- // Set the gas limit
1259
- gasPrice: parseUnits2("100", "gwei")
1260
- };
1261
- };
777
+ import { withRpcRateLimitBackoff } from "@xyo-network/xl1-sdk";
1262
778
  export {
1263
779
  AbstractEvmProvider,
1264
780
  AbstractEvmRunner,
1265
781
  AbstractEvmViewer,
1266
782
  BaseEthProvider,
1267
783
  DEFAULT_ESTIMATE_BLOCK_DATE,
1268
- DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE,
1269
784
  DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS,
1270
785
  DEFAULT_EVENT_QUERY_MAX_ATTEMPTS,
786
+ DEFAULT_EVENT_QUERY_START_CHUNK_SIZE,
1271
787
  DEFAULT_EVM_BLOCK_TIME_SEC,
1272
788
  EthHashRegEx,
1273
789
  EthHashZod,
1274
790
  EvmChainContractViewer,
791
+ EvmEventIndexFrameZod,
792
+ EvmEventIndexHeadZod,
793
+ EvmEventIndexLogZod,
794
+ EvmEventIndexManifestZod,
795
+ EvmEventIndexPublishRunnerMoniker,
1275
796
  EvmStakeAddedEventNameZod,
1276
797
  EvmStakeAddedEventZod,
1277
798
  EvmStakeEventArgsZod,
@@ -1285,6 +806,11 @@ export {
1285
806
  EvmStakeViewer,
1286
807
  EvmStakeWithdrawnEventNameZod,
1287
808
  EvmStakeWithdrawnEventZod,
809
+ MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,
810
+ RestStakeEventsViewer,
811
+ asEvmEventIndexFrame,
812
+ asEvmEventIndexHead,
813
+ asEvmEventIndexManifest,
1288
814
  asEvmStakeAddedEvent,
1289
815
  asEvmStakeEvent,
1290
816
  asEvmStakeRemovedEvent,
@@ -1292,23 +818,34 @@ export {
1292
818
  blockRangeChunks,
1293
819
  calculateEthBlockRate,
1294
820
  calculateEthTimeRate,
821
+ configuredDeploymentBlock,
1295
822
  createChain,
1296
823
  createChainContract,
1297
824
  createChainRewardsContract,
1298
825
  estimateBlockNumberAt,
1299
826
  estimateBlockNumberFromHead,
1300
827
  ethBlockRate,
828
+ evmEventIndexFramePath,
829
+ evmEventIndexHeadPath,
830
+ evmEventIndexManifestPath,
831
+ evmEventIndexTailPath,
832
+ findContractDeploymentBlock,
1301
833
  getDefaultGasConfig,
1302
834
  getEthBlockRateBlocks,
1303
835
  isEvmStakeAddedEvent,
1304
836
  isEvmStakeEvent,
1305
837
  isEvmStakeRemovedEvent,
1306
838
  isEvmStakeWithdrawnEvent,
839
+ isRpcRangeLimitError,
840
+ isRpcRateLimitError,
1307
841
  nextContractAddress,
1308
842
  nextContractAddressForAddress,
843
+ resolveContractDeploymentBlock,
844
+ rpcRangeLimitFromError,
1309
845
  toEvmStakeAddedEvent,
1310
846
  toEvmStakeEvent,
1311
847
  toEvmStakeRemovedEvent,
1312
- toEvmStakeWithdrawnEvent
848
+ toEvmStakeWithdrawnEvent,
849
+ withRpcRateLimitBackoff
1313
850
  };
1314
851
  //# sourceMappingURL=ethereum.mjs.map