@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.
- package/dist/browser/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
- package/dist/browser/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/block/findContractDeploymentBlock.d.ts +2 -0
- package/dist/browser/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
- package/dist/browser/modules/ethereum/block/index.d.ts +1 -0
- package/dist/browser/modules/ethereum/block/index.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
- package/dist/browser/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -57
- package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
- package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/index.d.ts +2 -0
- package/dist/browser/modules/ethereum/index.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
- package/dist/browser/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
- package/dist/browser/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
- package/dist/browser/modules/ethereum/indexing/index.d.ts +5 -0
- package/dist/browser/modules/ethereum/indexing/index.d.ts.map +1 -0
- package/dist/browser/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
- package/dist/browser/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
- package/dist/browser/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
- package/dist/browser/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
- package/dist/browser/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/rpc/index.d.ts +4 -0
- package/dist/browser/modules/ethereum/rpc/index.d.ts.map +1 -0
- package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +2 -0
- package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
- package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
- package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
- package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
- package/dist/browser/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
- package/dist/browser/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
- package/dist/browser/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
- package/dist/browser/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
- package/dist/browser/modules/services/Election/BaseElectionService.d.ts +1 -0
- package/dist/browser/modules/services/Election/BaseElectionService.d.ts.map +1 -1
- package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
- package/dist/browser/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
- package/dist/browser/modules/services/implementation/processPendingBlocks.d.ts +4 -4
- package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
- package/dist/browser/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/dist/browser/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
- package/dist/browser/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
- package/dist/browser/modules/wrappers/index.d.ts +1 -1
- package/dist/browser/modules/wrappers/index.d.ts.map +1 -1
- package/dist/neutral/ethereum.mjs +312 -775
- package/dist/neutral/ethereum.mjs.map +4 -4
- package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
- package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts +2 -0
- package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
- package/dist/neutral/modules/ethereum/block/index.d.ts +1 -0
- package/dist/neutral/modules/ethereum/block/index.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
- package/dist/neutral/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -57
- package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
- package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/index.d.ts +2 -0
- package/dist/neutral/modules/ethereum/index.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
- package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
- package/dist/neutral/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
- package/dist/neutral/modules/ethereum/indexing/index.d.ts +5 -0
- package/dist/neutral/modules/ethereum/indexing/index.d.ts.map +1 -0
- package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
- package/dist/neutral/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
- package/dist/neutral/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
- package/dist/neutral/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
- package/dist/neutral/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/rpc/index.d.ts +4 -0
- package/dist/neutral/modules/ethereum/rpc/index.d.ts.map +1 -0
- package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +2 -0
- package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
- package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
- package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
- package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
- package/dist/neutral/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
- package/dist/neutral/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
- package/dist/neutral/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
- package/dist/neutral/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
- package/dist/neutral/modules/services/Election/BaseElectionService.d.ts +1 -0
- package/dist/neutral/modules/services/Election/BaseElectionService.d.ts.map +1 -1
- package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
- package/dist/neutral/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
- package/dist/neutral/modules/services/implementation/processPendingBlocks.d.ts +4 -4
- package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
- package/dist/neutral/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/dist/neutral/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
- package/dist/neutral/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
- package/dist/neutral/modules/wrappers/index.d.ts +1 -1
- package/dist/neutral/modules/wrappers/index.d.ts.map +1 -1
- package/dist/neutral/services.mjs +61 -71
- package/dist/neutral/services.mjs.map +4 -4
- package/dist/neutral/wrappers.mjs +1 -1
- package/dist/neutral/wrappers.mjs.map +1 -1
- package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts +1 -16
- package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -1
- package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts +2 -0
- package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts.map +1 -0
- package/dist/node/modules/ethereum/block/index.d.ts +1 -0
- package/dist/node/modules/ethereum/block/index.d.ts.map +1 -1
- package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts +1 -244
- package/dist/node/modules/ethereum/drivers/EvmStakeEventZod.d.ts.map +1 -1
- package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +1 -57
- package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
- package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -41
- package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
- package/dist/node/modules/ethereum/index.d.ts +2 -0
- package/dist/node/modules/ethereum/index.d.ts.map +1 -1
- package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts +107 -0
- package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +1 -0
- package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +6 -0
- package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +1 -0
- package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +9 -0
- package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +1 -0
- package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts +54 -0
- package/dist/node/modules/ethereum/indexing/RestStakeEventsViewer.d.ts.map +1 -0
- package/dist/node/modules/ethereum/indexing/index.d.ts +5 -0
- package/dist/node/modules/ethereum/indexing/index.d.ts.map +1 -0
- package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts +1 -17
- package/dist/node/modules/ethereum/providers/AbstractEvmProvider.d.ts.map +1 -1
- package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts +1 -11
- package/dist/node/modules/ethereum/providers/AbstractEvmViewer.d.ts.map +1 -1
- package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts +1 -35
- package/dist/node/modules/ethereum/providers/EvmChainContractViewer.d.ts.map +1 -1
- package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts +1 -26
- package/dist/node/modules/ethereum/providers/EvmStakeTotalsViewer.d.ts.map +1 -1
- package/dist/node/modules/ethereum/rpc/index.d.ts +4 -0
- package/dist/node/modules/ethereum/rpc/index.d.ts.map +1 -0
- package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts +2 -0
- package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
- package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts +1 -5
- package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -1
- package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +1 -18
- package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -1
- package/dist/node/modules/services/BlockReward/EvmBlockRewardViewer.d.ts +1 -21
- package/dist/node/modules/services/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
- package/dist/node/modules/services/ChainValidator/XyoValidator.d.ts +7 -1
- package/dist/node/modules/services/ChainValidator/XyoValidator.d.ts.map +1 -1
- package/dist/node/modules/services/Election/BaseElectionService.d.ts +1 -0
- package/dist/node/modules/services/Election/BaseElectionService.d.ts.map +1 -1
- package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +1 -0
- package/dist/node/modules/services/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
- package/dist/node/modules/services/implementation/processPendingBlocks.d.ts +4 -4
- package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts +5 -2
- package/dist/node/modules/services/simple/block/runner/SimpleBlockRunner.d.ts.map +1 -1
- package/dist/node/modules/services/simple/block/runner/producerTuning.d.ts +13 -0
- package/dist/node/modules/services/simple/block/runner/producerTuning.d.ts.map +1 -0
- package/dist/node/modules/wrappers/index.d.ts +1 -1
- package/dist/node/modules/wrappers/index.d.ts.map +1 -1
- 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 {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
264
|
-
const resolvedStartBlock = isDefinedNotNull(startBlock) ? startBlock :
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
416
|
+
return assertEx4(asAddress3(contractAddress), () => "Unable to convert contract address to address");
|
|
419
417
|
};
|
|
420
418
|
var nextContractAddress = async (signer) => {
|
|
421
|
-
const provider =
|
|
422
|
-
const address =
|
|
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
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
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/
|
|
458
|
+
// src/modules/ethereum/drivers/EvmStakeEventZod.ts
|
|
470
459
|
import {
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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/
|
|
492
|
-
import {
|
|
485
|
+
// src/modules/ethereum/drivers/EvmStakeViewer.ts
|
|
486
|
+
import { EvmStakeViewer } from "@xyo-network/xl1-sdk";
|
|
493
487
|
|
|
494
|
-
// src/modules/ethereum/
|
|
495
|
-
import {
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
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/
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
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/
|
|
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
|
-
|
|
523
|
-
|
|
561
|
+
assertEx as assertEx5,
|
|
562
|
+
isDefined as isDefined3,
|
|
524
563
|
toAddress as toAddress2,
|
|
525
|
-
toEthAddress as
|
|
526
|
-
toHex
|
|
564
|
+
toEthAddress as toEthAddress4
|
|
527
565
|
} from "@ariestools/sdk";
|
|
528
|
-
import {
|
|
566
|
+
import { IAddressStakingEvents__factory } from "@xyo-network/typechain";
|
|
529
567
|
import {
|
|
530
|
-
|
|
568
|
+
AbstractCreatableProvider,
|
|
569
|
+
asAttoXL1,
|
|
531
570
|
creatableProvider,
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
withContextCacheResponse
|
|
571
|
+
resolveRestConnectionEndpoint,
|
|
572
|
+
StakeEventsViewerMoniker
|
|
535
573
|
} from "@xyo-network/xl1-sdk";
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
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
|
-
|
|
562
|
-
|
|
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
|
-
|
|
573
|
-
|
|
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
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
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
|
|
594
|
-
|
|
595
|
-
return
|
|
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
|
|
598
|
-
|
|
599
|
-
|
|
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
|
|
604
|
-
this.
|
|
605
|
-
|
|
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.
|
|
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
|
-
|
|
610
|
-
|
|
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(
|
|
614
|
-
__publicField(
|
|
615
|
-
__publicField(
|
|
616
|
-
__publicField(
|
|
617
|
-
__publicField(
|
|
618
|
-
|
|
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
|
-
],
|
|
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
|
|
624
|
-
import { IStakedXyoChain__factory
|
|
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(
|
|
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
|
|
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 {
|
|
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/
|
|
706
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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
|