@xyo-network/chain-sdk 4.2.1 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1 -24
- package/dist/browser/modules/ethereum/block/findContractDeploymentBlock.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 -87
- 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/indexing/RestStakeEventsViewer.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/indexing/index.d.ts +1 -3
- package/dist/browser/modules/ethereum/indexing/index.d.ts.map +1 -1
- 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/isRpcRangeLimitError.d.ts +1 -14
- package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
- 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/wrappers/index.d.ts +1 -1
- package/dist/browser/modules/wrappers/index.d.ts.map +1 -1
- package/dist/neutral/ethereum.mjs +189 -1038
- 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 +1 -24
- package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.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 -87
- 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/indexing/RestStakeEventsViewer.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/indexing/index.d.ts +1 -3
- package/dist/neutral/modules/ethereum/indexing/index.d.ts.map +1 -1
- 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/isRpcRangeLimitError.d.ts +1 -14
- package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
- 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/wrappers/index.d.ts +1 -1
- package/dist/neutral/modules/wrappers/index.d.ts.map +1 -1
- package/dist/neutral/services.mjs +16 -59
- package/dist/neutral/services.mjs.map +3 -3
- 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 +1 -24
- package/dist/node/modules/ethereum/block/findContractDeploymentBlock.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 -87
- 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/indexing/RestStakeEventsViewer.d.ts.map +1 -1
- package/dist/node/modules/ethereum/indexing/index.d.ts +1 -3
- package/dist/node/modules/ethereum/indexing/index.d.ts.map +1 -1
- 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/isRpcRangeLimitError.d.ts +1 -14
- package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -1
- 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/wrappers/index.d.ts +1 -1
- package/dist/node/modules/wrappers/index.d.ts.map +1 -1
- package/package.json +13 -16
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts +0 -107
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +0 -1
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +0 -6
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +0 -1
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +0 -9
- package/dist/browser/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +0 -1
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts +0 -107
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +0 -1
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +0 -6
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +0 -1
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +0 -9
- package/dist/neutral/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +0 -1
- package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts +0 -107
- package/dist/node/modules/ethereum/indexing/EvmEventIndexModel.d.ts.map +0 -1
- package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts +0 -6
- package/dist/node/modules/ethereum/indexing/EvmEventIndexPaths.d.ts.map +0 -1
- package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts +0 -9
- package/dist/node/modules/ethereum/indexing/EvmEventIndexPublishRunner.d.ts.map +0 -1
|
@@ -182,74 +182,19 @@ function blockRangeChunks(fromBlock, toBlock, chunkSize) {
|
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
// src/modules/ethereum/block/estimateBlockNumberAt.ts
|
|
185
|
-
import {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
return headNumber;
|
|
192
|
-
}
|
|
193
|
-
const blocksBack = Math.ceil((headTimestampSec - targetTimestampSec) / avgBlockTimeSec);
|
|
194
|
-
return Math.max(0, headNumber - blocksBack);
|
|
195
|
-
}
|
|
196
|
-
async function estimateBlockNumberAt(provider, targetDate = DEFAULT_ESTIMATE_BLOCK_DATE, avgBlockTimeSec = DEFAULT_EVM_BLOCK_TIME_SEC) {
|
|
197
|
-
const head = assertEx(await provider.getBlock("latest"), () => new Error("Failed to get latest eth block"));
|
|
198
|
-
return estimateBlockNumberFromHead(head.number, head.timestamp, targetDate, avgBlockTimeSec);
|
|
199
|
-
}
|
|
185
|
+
import {
|
|
186
|
+
DEFAULT_ESTIMATE_BLOCK_DATE,
|
|
187
|
+
DEFAULT_EVM_BLOCK_TIME_SEC,
|
|
188
|
+
estimateBlockNumberAt,
|
|
189
|
+
estimateBlockNumberFromHead
|
|
190
|
+
} from "@xyo-network/xl1-sdk";
|
|
200
191
|
|
|
201
192
|
// src/modules/ethereum/block/findContractDeploymentBlock.ts
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
deploymentBlockSearches.set(provider, byAddress);
|
|
208
|
-
}
|
|
209
|
-
const key = address.toLowerCase();
|
|
210
|
-
const existing = byAddress.get(key);
|
|
211
|
-
if (existing !== void 0) return await existing;
|
|
212
|
-
const search = searchDeploymentBlock(provider, address);
|
|
213
|
-
byAddress.set(key, search);
|
|
214
|
-
const result = await search;
|
|
215
|
-
if (result === void 0) byAddress.delete(key);
|
|
216
|
-
return result;
|
|
217
|
-
}
|
|
218
|
-
function configuredDeploymentBlock(config) {
|
|
219
|
-
const chain = config?.chain;
|
|
220
|
-
const value = chain?.deploymentBlock;
|
|
221
|
-
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : void 0;
|
|
222
|
-
}
|
|
223
|
-
async function resolveContractDeploymentBlock(provider, address, logger) {
|
|
224
|
-
const found = await findContractDeploymentBlock(provider, address);
|
|
225
|
-
if (found !== void 0) {
|
|
226
|
-
logger?.log(`Resolved deployment block ${found} for ${address} via getCode search`);
|
|
227
|
-
return found;
|
|
228
|
-
}
|
|
229
|
-
const estimated = await estimateBlockNumberAt(provider);
|
|
230
|
-
logger?.warn(`Could not resolve deployment block for ${address} via getCode search; using date estimate ${estimated}`);
|
|
231
|
-
return estimated;
|
|
232
|
-
}
|
|
233
|
-
async function searchDeploymentBlock(provider, address) {
|
|
234
|
-
try {
|
|
235
|
-
const head = await provider.getBlockNumber();
|
|
236
|
-
if (await provider.getCode(address, head) === "0x") return void 0;
|
|
237
|
-
let lo = 0;
|
|
238
|
-
let hi = head;
|
|
239
|
-
while (lo < hi) {
|
|
240
|
-
const mid = Math.floor((lo + hi) / 2);
|
|
241
|
-
const code = await provider.getCode(address, mid);
|
|
242
|
-
if (code === "0x") {
|
|
243
|
-
lo = mid + 1;
|
|
244
|
-
} else {
|
|
245
|
-
hi = mid;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
return lo;
|
|
249
|
-
} catch {
|
|
250
|
-
return void 0;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
193
|
+
import {
|
|
194
|
+
configuredDeploymentBlock,
|
|
195
|
+
findContractDeploymentBlock,
|
|
196
|
+
resolveContractDeploymentBlock
|
|
197
|
+
} from "@xyo-network/xl1-sdk";
|
|
253
198
|
|
|
254
199
|
// src/modules/ethereum/block/rate/blockRate.ts
|
|
255
200
|
import { isDefined, isFalsy } from "@ariestools/sdk";
|
|
@@ -299,7 +244,7 @@ var calculateEthBlockRate = async (provider, range, timeUnit) => {
|
|
|
299
244
|
|
|
300
245
|
// src/modules/ethereum/block/rate/timeRate.ts
|
|
301
246
|
import {
|
|
302
|
-
assertEx
|
|
247
|
+
assertEx,
|
|
303
248
|
isDefined as isDefined2,
|
|
304
249
|
isDefinedNotNull
|
|
305
250
|
} from "@ariestools/sdk";
|
|
@@ -311,12 +256,12 @@ import {
|
|
|
311
256
|
var DEFAULT_TOLERANCE_MS = 3e4;
|
|
312
257
|
var DEFAULT_MAX_ATTEMPTS = 20;
|
|
313
258
|
var calculateEthTimeRate = async (provider, timeConfig, startBlockNumber, timeUnit, toleranceMs = DEFAULT_TOLERANCE_MS, maxAttempts = DEFAULT_MAX_ATTEMPTS) => {
|
|
314
|
-
|
|
259
|
+
assertEx(Object.keys(timeConfig ?? {}).length === 1, () => "Only one time unit should be specified in timeConfig");
|
|
315
260
|
const startBlock = isDefinedNotNull(startBlockNumber) ? await provider.getBlock(BigInt(startBlockNumber)) : null;
|
|
316
|
-
|
|
317
|
-
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"));
|
|
318
263
|
const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig);
|
|
319
|
-
|
|
264
|
+
assertEx(timeInMilliseconds > 0, () => "Time duration must be greater than zero");
|
|
320
265
|
const blocksPerMillisecondRate = 1 / (12 * 1e3);
|
|
321
266
|
const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds);
|
|
322
267
|
const endBlockNumber = await findEndBlockRecursive(
|
|
@@ -335,14 +280,14 @@ var calculateEthTimeRate = async (provider, timeConfig, startBlockNumber, timeUn
|
|
|
335
280
|
};
|
|
336
281
|
var findEndBlockRecursive = async (provider, startBlock, targetTimeMs, estimatedBlocksBack, toleranceMs, attemptsRemaining) => {
|
|
337
282
|
console.log(`Attempts remaining: ${attemptsRemaining}, Estimated blocks back: ${estimatedBlocksBack}`);
|
|
338
|
-
|
|
283
|
+
assertEx(attemptsRemaining > 0, () => "Maximum attempts reached while searching for end block");
|
|
339
284
|
const startBlockEpoch = startBlock.timestamp;
|
|
340
285
|
const estimatedEndBlockNumber = startBlock.number - estimatedBlocksBack;
|
|
341
286
|
if (estimatedEndBlockNumber < 0) {
|
|
342
287
|
throw new Error("Estimated end block number is less than zero");
|
|
343
288
|
}
|
|
344
289
|
const endBlock = await provider.getBlock(estimatedEndBlockNumber);
|
|
345
|
-
const resolvedEndBlock =
|
|
290
|
+
const resolvedEndBlock = assertEx(
|
|
346
291
|
isDefined2(endBlock) ? endBlock : void 0,
|
|
347
292
|
() => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`
|
|
348
293
|
);
|
|
@@ -385,7 +330,7 @@ import { createGenesisBlock } from "#protocol";
|
|
|
385
330
|
// src/modules/ethereum/createChainContract.ts
|
|
386
331
|
import {
|
|
387
332
|
asAddress,
|
|
388
|
-
assertEx as
|
|
333
|
+
assertEx as assertEx2,
|
|
389
334
|
ETH_ZERO_ADDRESS,
|
|
390
335
|
hexToBigInt,
|
|
391
336
|
toEthAddress
|
|
@@ -413,7 +358,7 @@ var createChainContract = async (signer, stakingTokenAddress, genesisBlockHash,
|
|
|
413
358
|
);
|
|
414
359
|
await deployResponse.waitForDeployment();
|
|
415
360
|
const xyoChainContractAddress = await deployResponse.getAddress();
|
|
416
|
-
return
|
|
361
|
+
return assertEx2(asAddress(xyoChainContractAddress), () => "Invalid staking contract address");
|
|
417
362
|
} catch (ex) {
|
|
418
363
|
console.log(ex);
|
|
419
364
|
throw ex;
|
|
@@ -423,7 +368,7 @@ var createChainContract = async (signer, stakingTokenAddress, genesisBlockHash,
|
|
|
423
368
|
// src/modules/ethereum/createChainRewardsContract.ts
|
|
424
369
|
import {
|
|
425
370
|
asAddress as asAddress2,
|
|
426
|
-
assertEx as
|
|
371
|
+
assertEx as assertEx3,
|
|
427
372
|
toFixedPoint
|
|
428
373
|
} from "@ariestools/sdk";
|
|
429
374
|
import { XyoChainRewards__factory as XyoChainRewardsFactory } from "@xyo-network/typechain";
|
|
@@ -450,7 +395,7 @@ var createChainRewardsContract = async (signer, genesisReward = 0n, gas = gasCon
|
|
|
450
395
|
);
|
|
451
396
|
await deployResponse.waitForDeployment();
|
|
452
397
|
const xyoChainRewardsAddress = await deployResponse.getAddress();
|
|
453
|
-
return
|
|
398
|
+
return assertEx3(asAddress2(xyoChainRewardsAddress), () => "Invalid rewards contract address");
|
|
454
399
|
} catch (ex) {
|
|
455
400
|
console.log(ex);
|
|
456
401
|
throw ex;
|
|
@@ -460,7 +405,7 @@ var createChainRewardsContract = async (signer, genesisReward = 0n, gas = gasCon
|
|
|
460
405
|
// src/modules/ethereum/nextContractAddress.ts
|
|
461
406
|
import {
|
|
462
407
|
asAddress as asAddress3,
|
|
463
|
-
assertEx as
|
|
408
|
+
assertEx as assertEx4,
|
|
464
409
|
toEthAddress as toEthAddress2
|
|
465
410
|
} from "@ariestools/sdk";
|
|
466
411
|
import { getCreateAddress } from "ethers/address";
|
|
@@ -468,11 +413,11 @@ var nextContractAddressForAddress = async (address, provider) => {
|
|
|
468
413
|
const deployerAddress = toEthAddress2(address);
|
|
469
414
|
const nonce = await provider.getTransactionCount(deployerAddress);
|
|
470
415
|
const contractAddress = getCreateAddress({ from: deployerAddress, nonce });
|
|
471
|
-
return
|
|
416
|
+
return assertEx4(asAddress3(contractAddress), () => "Unable to convert contract address to address");
|
|
472
417
|
};
|
|
473
418
|
var nextContractAddress = async (signer) => {
|
|
474
|
-
const provider =
|
|
475
|
-
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");
|
|
476
421
|
return await nextContractAddressForAddress(address, provider);
|
|
477
422
|
};
|
|
478
423
|
|
|
@@ -503,869 +448,42 @@ async function createChain(signer, stakingTokenAddress, initialBlockProducer, re
|
|
|
503
448
|
|
|
504
449
|
// src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
|
|
505
450
|
import {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
import {
|
|
512
|
-
creatableProvider as creatableProvider4,
|
|
513
|
-
EvmChainViewerMoniker as EvmChainViewerMoniker4,
|
|
514
|
-
StakeEventsViewerMoniker
|
|
515
|
-
} from "@xyo-network/xl1-sdk";
|
|
516
|
-
import { asAttoXL1 } from "@xyo-network/xl1-sdk";
|
|
517
|
-
import { EventLog } from "ethers";
|
|
518
|
-
|
|
519
|
-
// src/modules/ethereum/providers/AbstractEvmProvider.ts
|
|
520
|
-
import {
|
|
521
|
-
assertEx as assertEx6,
|
|
522
|
-
toEthAddress as toEthAddress4
|
|
523
|
-
} from "@ariestools/sdk";
|
|
524
|
-
import { AbstractCreatableProvider } from "@xyo-network/xl1-sdk";
|
|
525
|
-
var AbstractEvmProvider = class extends AbstractCreatableProvider {
|
|
526
|
-
_contract;
|
|
527
|
-
_address;
|
|
528
|
-
get address() {
|
|
529
|
-
return assertEx6(this._address, () => "EVM contract address not initialized");
|
|
530
|
-
}
|
|
531
|
-
get contract() {
|
|
532
|
-
return this._contract;
|
|
533
|
-
}
|
|
534
|
-
async createHandler() {
|
|
535
|
-
await super.createHandler();
|
|
536
|
-
this._address = this.params.address ?? toEthAddress4(assertEx6(this.config?.chain?.id, () => "EVM provider requires an address param or config.chain.id"));
|
|
537
|
-
this._contract = this.connectContract(this._address);
|
|
538
|
-
}
|
|
539
|
-
};
|
|
540
|
-
|
|
541
|
-
// src/modules/ethereum/providers/AbstractEvmRunner.ts
|
|
542
|
-
import { assertEx as assertEx8 } from "@ariestools/sdk";
|
|
543
|
-
|
|
544
|
-
// src/modules/ethereum/providers/AbstractEvmViewer.ts
|
|
545
|
-
import { assertEx as assertEx7 } from "@ariestools/sdk";
|
|
546
|
-
import { EvmChainViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
547
|
-
var AbstractEvmViewer = class extends AbstractEvmProvider {
|
|
548
|
-
_provider;
|
|
549
|
-
get provider() {
|
|
550
|
-
return assertEx7(this.params.provider ?? this._provider, () => "EVM provider not initialized");
|
|
551
|
-
}
|
|
552
|
-
async createHandler() {
|
|
553
|
-
if (this.params.provider === void 0) {
|
|
554
|
-
const evmChainViewer = await this.locateAndCreate(EvmChainViewerMoniker);
|
|
555
|
-
this._provider = await evmChainViewer.provider();
|
|
556
|
-
}
|
|
557
|
-
await super.createHandler();
|
|
558
|
-
}
|
|
559
|
-
};
|
|
560
|
-
|
|
561
|
-
// src/modules/ethereum/providers/AbstractEvmRunner.ts
|
|
562
|
-
var AbstractEvmRunner = class extends AbstractEvmViewer {
|
|
563
|
-
static async paramsHandler(params) {
|
|
564
|
-
const runner = assertEx8(params?.runner, () => new Error("No runner defined"));
|
|
565
|
-
const provider = assertEx8(runner.provider, () => new Error("Runner must have a provider defined"));
|
|
566
|
-
return { ...await super.paramsHandler({ ...params, provider }), runner };
|
|
567
|
-
}
|
|
568
|
-
};
|
|
569
|
-
|
|
570
|
-
// src/modules/ethereum/providers/EvmChainContractViewer.ts
|
|
571
|
-
import {
|
|
572
|
-
asHash,
|
|
573
|
-
assertEx as assertEx9,
|
|
574
|
-
toAddress as toAddress2,
|
|
575
|
-
toEthAddress as toEthAddress5,
|
|
576
|
-
toHex
|
|
577
|
-
} from "@ariestools/sdk";
|
|
578
|
-
import { IStakedXyoChain__factory } from "@xyo-network/typechain";
|
|
579
|
-
import {
|
|
580
|
-
ChainContractViewerMoniker,
|
|
581
|
-
creatableProvider,
|
|
582
|
-
EvmChainViewerMoniker as EvmChainViewerMoniker2,
|
|
583
|
-
toXL1BlockNumber,
|
|
584
|
-
withContextCacheResponse
|
|
585
|
-
} from "@xyo-network/xl1-sdk";
|
|
586
|
-
var EvmChainContractViewer = class extends AbstractEvmViewer {
|
|
587
|
-
moniker = EvmChainContractViewer.defaultMoniker;
|
|
588
|
-
_forkedAtBlockNumber;
|
|
589
|
-
_forkedAtHash;
|
|
590
|
-
_forkedChainContractViewer;
|
|
591
|
-
_forkedChainId;
|
|
592
|
-
_minWithdrawalBlocks;
|
|
593
|
-
_rewardsContract;
|
|
594
|
-
_stakingTokenAddress;
|
|
595
|
-
chainId() {
|
|
596
|
-
return toHex(this.address, { prefix: false });
|
|
597
|
-
}
|
|
598
|
-
async chainIdAtBlockNumber(blockNumber) {
|
|
599
|
-
return await withContextCacheResponse(this.context, "chainIdAtBlockNumber", String(blockNumber), async () => {
|
|
600
|
-
let chainId = this.chainId();
|
|
601
|
-
let contractViewer = this;
|
|
602
|
-
let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
|
|
603
|
-
while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {
|
|
604
|
-
contractViewer = assertEx9(await contractViewer.forkedChainContractViewer(), () => "Forked chain contract viewer is undefined");
|
|
605
|
-
forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber();
|
|
606
|
-
chainId = await contractViewer.chainId();
|
|
607
|
-
}
|
|
608
|
-
return chainId;
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
|
-
async forkedAtBlockNumber() {
|
|
612
|
-
const contractAddress = this.contract.getAddress();
|
|
613
|
-
try {
|
|
614
|
-
this._forkedAtBlockNumber = this._forkedAtBlockNumber ?? (async () => toXL1BlockNumber(await this.contract.forkedAtBlockNumber(), true))();
|
|
615
|
-
return await this._forkedAtBlockNumber;
|
|
616
|
-
} catch {
|
|
617
|
-
this.logger?.warn("Failed to fetch forkedAtBlockNumber, returning null", contractAddress);
|
|
618
|
-
this._forkedAtBlockNumber = Promise.resolve(null);
|
|
619
|
-
return await this._forkedAtBlockNumber;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
async forkedAtHash() {
|
|
623
|
-
this._forkedAtHash = this._forkedAtHash ?? (async () => asHash(toHex(await this.contract.forkedAtHash()), true))();
|
|
624
|
-
return await this._forkedAtHash;
|
|
625
|
-
}
|
|
626
|
-
async forkedChainContractViewer() {
|
|
627
|
-
this._forkedChainContractViewer = this._forkedChainContractViewer ?? (async () => {
|
|
628
|
-
const address = await this.forkedChainId();
|
|
629
|
-
return EvmChainContractViewer.create({
|
|
630
|
-
...this.params,
|
|
631
|
-
address: toEthAddress5(address),
|
|
632
|
-
provider: this.provider
|
|
633
|
-
});
|
|
634
|
-
})();
|
|
635
|
-
return await this._forkedChainContractViewer;
|
|
636
|
-
}
|
|
637
|
-
async forkedChainId() {
|
|
638
|
-
this._forkedChainId = this._forkedChainId ?? (async () => {
|
|
639
|
-
return toAddress2(await this.contract.forkedChainId());
|
|
640
|
-
})();
|
|
641
|
-
return await this._forkedChainId;
|
|
642
|
-
}
|
|
643
|
-
async minWithdrawalBlocks() {
|
|
644
|
-
this._minWithdrawalBlocks = this._minWithdrawalBlocks ?? (async () => Number(await this.contract.minWithdrawalBlocks()))();
|
|
645
|
-
return await this._minWithdrawalBlocks;
|
|
646
|
-
}
|
|
647
|
-
async rewardsContract() {
|
|
648
|
-
this._rewardsContract = this._rewardsContract ?? (async () => {
|
|
649
|
-
return toAddress2(await this.contract.rewardsContract());
|
|
650
|
-
})();
|
|
651
|
-
return await this._rewardsContract;
|
|
652
|
-
}
|
|
653
|
-
async stakingTokenAddress() {
|
|
654
|
-
this._stakingTokenAddress = this._stakingTokenAddress ?? (async () => {
|
|
655
|
-
return toAddress2(await this.contract.stakingTokenAddress());
|
|
656
|
-
})();
|
|
657
|
-
return await this._stakingTokenAddress;
|
|
658
|
-
}
|
|
659
|
-
connectContract(address) {
|
|
660
|
-
return IStakedXyoChain__factory.connect(address, this.provider);
|
|
661
|
-
}
|
|
662
|
-
};
|
|
663
|
-
__publicField(EvmChainContractViewer, "connectionTypes", ["evm-rpc"]);
|
|
664
|
-
__publicField(EvmChainContractViewer, "defaultMoniker", ChainContractViewerMoniker);
|
|
665
|
-
__publicField(EvmChainContractViewer, "dependencies", [EvmChainViewerMoniker2]);
|
|
666
|
-
__publicField(EvmChainContractViewer, "monikers", [ChainContractViewerMoniker]);
|
|
667
|
-
__publicField(EvmChainContractViewer, "surface", "node");
|
|
668
|
-
EvmChainContractViewer = __decorateClass([
|
|
669
|
-
creatableProvider()
|
|
670
|
-
], EvmChainContractViewer);
|
|
671
|
-
|
|
672
|
-
// src/modules/ethereum/providers/EvmStakeRunner.ts
|
|
673
|
-
import { toEthAddress as toEthAddress6 } from "@ariestools/sdk";
|
|
674
|
-
import { IStakedXyoChain__factory as IStakedXyoChain__factory2 } from "@xyo-network/typechain";
|
|
675
|
-
import {
|
|
676
|
-
creatableProvider as creatableProvider2,
|
|
677
|
-
StakeRunnerMoniker
|
|
678
|
-
} from "@xyo-network/xl1-sdk";
|
|
679
|
-
import { getAddress } from "ethers/address";
|
|
680
|
-
var EvmStakeRunner = class extends AbstractEvmRunner {
|
|
681
|
-
moniker = EvmStakeRunner.defaultMoniker;
|
|
682
|
-
async addStake(staked, amount) {
|
|
683
|
-
const result = await this.contract.addStake(getAddress(toEthAddress6(staked)), amount);
|
|
684
|
-
await result.wait();
|
|
685
|
-
return true;
|
|
686
|
-
}
|
|
687
|
-
async removeStake(slot) {
|
|
688
|
-
const result = await this.contract.removeStake(slot);
|
|
689
|
-
await result.wait();
|
|
690
|
-
return true;
|
|
691
|
-
}
|
|
692
|
-
async withdrawStake(slot) {
|
|
693
|
-
const result = await this.contract.withdrawStake(slot);
|
|
694
|
-
await result.wait();
|
|
695
|
-
return true;
|
|
696
|
-
}
|
|
697
|
-
connectContract(address) {
|
|
698
|
-
return IStakedXyoChain__factory2.connect(address, this.params.runner);
|
|
699
|
-
}
|
|
700
|
-
};
|
|
701
|
-
__publicField(EvmStakeRunner, "connectionTypes", ["evm-rpc"]);
|
|
702
|
-
__publicField(EvmStakeRunner, "defaultMoniker", StakeRunnerMoniker);
|
|
703
|
-
__publicField(EvmStakeRunner, "dependencies", []);
|
|
704
|
-
__publicField(EvmStakeRunner, "monikers", [StakeRunnerMoniker]);
|
|
705
|
-
__publicField(EvmStakeRunner, "surface", "node");
|
|
706
|
-
EvmStakeRunner = __decorateClass([
|
|
707
|
-
creatableProvider2()
|
|
708
|
-
], EvmStakeRunner);
|
|
709
|
-
|
|
710
|
-
// src/modules/ethereum/providers/EvmStakeTotalsViewer.ts
|
|
711
|
-
import { toEthAddress as toEthAddress7 } from "@ariestools/sdk";
|
|
712
|
-
import { IStakedXyoChain__factory as IStakedXyoChain__factory3 } from "@xyo-network/typechain";
|
|
713
|
-
import {
|
|
714
|
-
creatableProvider as creatableProvider3,
|
|
715
|
-
EvmChainViewerMoniker as EvmChainViewerMoniker3,
|
|
716
|
-
StakeTotalsViewerMoniker
|
|
451
|
+
DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS,
|
|
452
|
+
DEFAULT_EVENT_QUERY_MAX_ATTEMPTS,
|
|
453
|
+
DEFAULT_EVENT_QUERY_START_CHUNK_SIZE,
|
|
454
|
+
EvmStakeEventsViewer,
|
|
455
|
+
MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE
|
|
717
456
|
} from "@xyo-network/xl1-sdk";
|
|
718
|
-
import { getAddress as getAddress2 } from "ethers/address";
|
|
719
|
-
var EvmStakeTotalsViewer = class extends AbstractEvmViewer {
|
|
720
|
-
moniker = EvmStakeTotalsViewer.defaultMoniker;
|
|
721
|
-
async active() {
|
|
722
|
-
return await this.contract.active();
|
|
723
|
-
}
|
|
724
|
-
async activeByStaked(staked) {
|
|
725
|
-
return await this.contract.activeByAddressStaked(getAddress2(toEthAddress7(staked)));
|
|
726
|
-
}
|
|
727
|
-
async activeByStaker(address) {
|
|
728
|
-
return await this.contract.activeByStaker(getAddress2(toEthAddress7(address)));
|
|
729
|
-
}
|
|
730
|
-
async pending() {
|
|
731
|
-
return await this.contract.pending();
|
|
732
|
-
}
|
|
733
|
-
async pendingByStaker(staker) {
|
|
734
|
-
return await this.contract.pendingByStaker(getAddress2(toEthAddress7(staker)));
|
|
735
|
-
}
|
|
736
|
-
async withdrawn() {
|
|
737
|
-
return await this.contract.withdrawn();
|
|
738
|
-
}
|
|
739
|
-
async withdrawnByStaker(staker) {
|
|
740
|
-
return await this.contract.withdrawnByStaker(getAddress2(staker));
|
|
741
|
-
}
|
|
742
|
-
connectContract(address) {
|
|
743
|
-
return IStakedXyoChain__factory3.connect(address, this.provider);
|
|
744
|
-
}
|
|
745
|
-
};
|
|
746
|
-
__publicField(EvmStakeTotalsViewer, "connectionTypes", ["evm-rpc"]);
|
|
747
|
-
__publicField(EvmStakeTotalsViewer, "defaultMoniker", StakeTotalsViewerMoniker);
|
|
748
|
-
__publicField(EvmStakeTotalsViewer, "dependencies", [EvmChainViewerMoniker3]);
|
|
749
|
-
__publicField(EvmStakeTotalsViewer, "monikers", [StakeTotalsViewerMoniker]);
|
|
750
|
-
__publicField(EvmStakeTotalsViewer, "surface", "node");
|
|
751
|
-
EvmStakeTotalsViewer = __decorateClass([
|
|
752
|
-
creatableProvider3()
|
|
753
|
-
], EvmStakeTotalsViewer);
|
|
754
|
-
|
|
755
|
-
// src/modules/ethereum/rpc/isRpcRangeLimitError.ts
|
|
756
|
-
function collectErrorTexts(error) {
|
|
757
|
-
const seen = /* @__PURE__ */ new Set();
|
|
758
|
-
const queue = [error];
|
|
759
|
-
const texts = [];
|
|
760
|
-
while (queue.length > 0) {
|
|
761
|
-
const current = queue.pop();
|
|
762
|
-
if (current === void 0 || current === null || seen.has(current)) {
|
|
763
|
-
continue;
|
|
764
|
-
}
|
|
765
|
-
seen.add(current);
|
|
766
|
-
if (typeof current === "string") {
|
|
767
|
-
texts.push(current);
|
|
768
|
-
continue;
|
|
769
|
-
}
|
|
770
|
-
if (typeof current !== "object") {
|
|
771
|
-
continue;
|
|
772
|
-
}
|
|
773
|
-
if (Array.isArray(current)) {
|
|
774
|
-
const items = current;
|
|
775
|
-
queue.push(...items);
|
|
776
|
-
continue;
|
|
777
|
-
}
|
|
778
|
-
const record = current;
|
|
779
|
-
for (const key of ["message", "shortMessage", "reason", "error", "info", "data", "value", "body", "payload"]) {
|
|
780
|
-
if (key in record) {
|
|
781
|
-
queue.push(record[key]);
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
return texts;
|
|
786
|
-
}
|
|
787
|
-
function matchesRangeLimitText(text) {
|
|
788
|
-
const normalized = text.toLowerCase();
|
|
789
|
-
return /range \d+ exceeds limit/.test(normalized) || /exceeds? (?:the )?max(?:imum)? (?:block )?range/.test(normalized) || normalized.includes("block range is too") || normalized.includes("log response size exceeded") || normalized.includes("query returned more than") || normalized.includes("response size exceeded") || /getlogs (?:is )?limited to/.test(normalized);
|
|
790
|
-
}
|
|
791
|
-
function isRpcRangeLimitError(error) {
|
|
792
|
-
return collectErrorTexts(error).some((text) => matchesRangeLimitText(text));
|
|
793
|
-
}
|
|
794
|
-
function rpcRangeLimitFromError(error) {
|
|
795
|
-
for (const text of collectErrorTexts(error)) {
|
|
796
|
-
const match = /(?:exceeds )?limit(?:ed)? (?:of|to) (\d+)/i.exec(text);
|
|
797
|
-
if (match !== null) {
|
|
798
|
-
const limit = Number(match[1]);
|
|
799
|
-
if (Number.isSafeInteger(limit) && limit > 0) return limit;
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
return void 0;
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
// src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
|
|
806
|
-
import { delay } from "@ariestools/sdk";
|
|
807
|
-
|
|
808
|
-
// src/modules/ethereum/rpc/isRpcRateLimitError.ts
|
|
809
|
-
function isRpcRateLimitError(error) {
|
|
810
|
-
const seen = /* @__PURE__ */ new Set();
|
|
811
|
-
const queue = [error];
|
|
812
|
-
while (queue.length > 0) {
|
|
813
|
-
const current = queue.pop();
|
|
814
|
-
if (current === void 0 || current === null || seen.has(current)) {
|
|
815
|
-
continue;
|
|
816
|
-
}
|
|
817
|
-
seen.add(current);
|
|
818
|
-
if (typeof current === "string") {
|
|
819
|
-
if (matchesRateLimitText(current)) {
|
|
820
|
-
return true;
|
|
821
|
-
}
|
|
822
|
-
continue;
|
|
823
|
-
}
|
|
824
|
-
if (typeof current === "number") {
|
|
825
|
-
if (isRateLimitCode(current)) {
|
|
826
|
-
return true;
|
|
827
|
-
}
|
|
828
|
-
continue;
|
|
829
|
-
}
|
|
830
|
-
if (typeof current !== "object") {
|
|
831
|
-
continue;
|
|
832
|
-
}
|
|
833
|
-
if (Array.isArray(current)) {
|
|
834
|
-
const items = current;
|
|
835
|
-
queue.push(...items);
|
|
836
|
-
continue;
|
|
837
|
-
}
|
|
838
|
-
const record = current;
|
|
839
|
-
for (const key of ["code", "message", "shortMessage", "reason", "status", "statusCode"]) {
|
|
840
|
-
if (key in record) {
|
|
841
|
-
queue.push(record[key]);
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
for (const key of ["error", "info", "data", "value", "body", "payload"]) {
|
|
845
|
-
if (key in record) {
|
|
846
|
-
queue.push(record[key]);
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
return false;
|
|
851
|
-
}
|
|
852
|
-
function isRateLimitCode(code) {
|
|
853
|
-
return code === 429 || code === -32005 || code === -32007 || code === -32016;
|
|
854
|
-
}
|
|
855
|
-
function matchesRateLimitText(text) {
|
|
856
|
-
const normalized = text.toLowerCase();
|
|
857
|
-
return normalized.includes("too many requests") || normalized.includes("rate limit") || normalized.includes("rate exceeded") || normalized.includes("call rate limit") || normalized.includes("request limit") || normalized.includes("exceeded the quota");
|
|
858
|
-
}
|
|
859
|
-
|
|
860
|
-
// src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
|
|
861
|
-
async function withRpcRateLimitBackoff(fn, options = {}) {
|
|
862
|
-
const {
|
|
863
|
-
backoff = 2,
|
|
864
|
-
initialDelayMs = 1e3,
|
|
865
|
-
maxAttempts = 8,
|
|
866
|
-
maxDelayMs = 3e4,
|
|
867
|
-
onRetry
|
|
868
|
-
} = options;
|
|
869
|
-
if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {
|
|
870
|
-
throw new TypeError(`maxAttempts must be an integer >= 1, got ${maxAttempts}`);
|
|
871
|
-
}
|
|
872
|
-
let delayMs = initialDelayMs;
|
|
873
|
-
let lastError;
|
|
874
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
875
|
-
try {
|
|
876
|
-
return await fn();
|
|
877
|
-
} catch (error) {
|
|
878
|
-
lastError = error;
|
|
879
|
-
const isLastAttempt = attempt >= maxAttempts;
|
|
880
|
-
if (!isRpcRateLimitError(error) || isLastAttempt) {
|
|
881
|
-
throw error;
|
|
882
|
-
}
|
|
883
|
-
const waitMs = Math.min(delayMs, maxDelayMs);
|
|
884
|
-
onRetry?.(error, attempt, waitMs);
|
|
885
|
-
await delay(waitMs);
|
|
886
|
-
delayMs = Math.min(delayMs * backoff, maxDelayMs);
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
throw lastError;
|
|
890
|
-
}
|
|
891
457
|
|
|
892
458
|
// src/modules/ethereum/drivers/EvmStakeEventZod.ts
|
|
893
459
|
import {
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
import { z } from "zod/mini";
|
|
901
|
-
var EthHashRegEx = HexRegExMinMaxMixedCaseWithPrefix(32, 32);
|
|
902
|
-
var EthHashZod = z.string().check(z.regex(EthHashRegEx, { error: "Invalid address format" }));
|
|
903
|
-
var EvmStakeAddedEventNameZod = z.literal("StakeAdded");
|
|
904
|
-
var EvmStakeRemovedEventNameZod = z.literal("StakeRemoved");
|
|
905
|
-
var EvmStakeWithdrawnEventNameZod = z.literal("StakeWithdrawn");
|
|
906
|
-
var EvmStakeEventNameZod = z.union([
|
|
460
|
+
asEvmStakeAddedEvent,
|
|
461
|
+
asEvmStakeEvent,
|
|
462
|
+
asEvmStakeRemovedEvent,
|
|
463
|
+
asEvmStakeWithdrawnEvent,
|
|
464
|
+
EthHashRegEx,
|
|
465
|
+
EthHashZod,
|
|
907
466
|
EvmStakeAddedEventNameZod,
|
|
467
|
+
EvmStakeAddedEventZod,
|
|
468
|
+
EvmStakeEventArgsZod,
|
|
469
|
+
EvmStakeEventNameZod,
|
|
470
|
+
EvmStakeEventZod,
|
|
908
471
|
EvmStakeRemovedEventNameZod,
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
var EvmStakeEventZod = z.object({
|
|
922
|
-
address: EthAddressZod,
|
|
923
|
-
args: EvmStakeEventArgsZod,
|
|
924
|
-
blockHash: EthHashZod,
|
|
925
|
-
blockNumber: z.number(),
|
|
926
|
-
eventName: EvmStakeEventNameZod,
|
|
927
|
-
transactionHash: EthHashZod,
|
|
928
|
-
transactionIndex: z.number()
|
|
929
|
-
});
|
|
930
|
-
var isEvmStakeEvent = zodIsFactory(EvmStakeEventZod);
|
|
931
|
-
var asEvmStakeEvent = zodAsFactory(EvmStakeEventZod, "asEvmStakeEvent");
|
|
932
|
-
var toEvmStakeEvent = zodToFactory(EvmStakeEventZod, "toEvmStakeEvent");
|
|
933
|
-
var EvmStakeAddedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeAddedEventNameZod });
|
|
934
|
-
var isEvmStakeAddedEvent = zodIsFactory(EvmStakeAddedEventZod);
|
|
935
|
-
var asEvmStakeAddedEvent = zodAsFactory(EvmStakeAddedEventZod, "asEvmStakeAddedEvent");
|
|
936
|
-
var toEvmStakeAddedEvent = zodToFactory(EvmStakeAddedEventZod, "toEvmStakeAddedEvent");
|
|
937
|
-
var EvmStakeRemovedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeRemovedEventNameZod });
|
|
938
|
-
var isEvmStakeRemovedEvent = zodIsFactory(EvmStakeRemovedEventZod);
|
|
939
|
-
var asEvmStakeRemovedEvent = zodAsFactory(EvmStakeRemovedEventZod, "asEvmStakeRemovedEvent");
|
|
940
|
-
var toEvmStakeRemovedEvent = zodToFactory(EvmStakeRemovedEventZod, "toEvmStakeRemovedEvent");
|
|
941
|
-
var EvmStakeWithdrawnEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeWithdrawnEventNameZod });
|
|
942
|
-
var isEvmStakeWithdrawnEvent = zodIsFactory(EvmStakeWithdrawnEventZod);
|
|
943
|
-
var asEvmStakeWithdrawnEvent = zodAsFactory(EvmStakeWithdrawnEventZod, "asEvmStakeWithdrawnEvent");
|
|
944
|
-
var toEvmStakeWithdrawnEvent = zodToFactory(EvmStakeWithdrawnEventZod, "toEvmStakeWithdrawnEvent");
|
|
945
|
-
|
|
946
|
-
// src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
|
|
947
|
-
var DEFAULT_EVENT_QUERY_START_CHUNK_SIZE = 1e5;
|
|
948
|
-
var MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE = 1e3;
|
|
949
|
-
var DEFAULT_EVENT_QUERY_MAX_ATTEMPTS = 8;
|
|
950
|
-
var DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS = 1e3;
|
|
951
|
-
var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
|
|
952
|
-
var EvmStakeEventsViewer = class extends AbstractEvmViewer {
|
|
953
|
-
moniker = EvmStakeEventsViewer.defaultMoniker;
|
|
954
|
-
/**
|
|
955
|
-
* Current adaptive chunk size — shrinks when the provider rejects a range
|
|
956
|
-
* and persists across loads so the tail catch-up reuses the learned limit.
|
|
957
|
-
*/
|
|
958
|
-
adaptiveChunkSize;
|
|
959
|
-
/** Set at start when `params.deploymentBlock` is omitted (getCode binary search, date-estimate fallback). */
|
|
960
|
-
defaultDeploymentBlock = 0;
|
|
961
|
-
eventCache = /* @__PURE__ */ new Map();
|
|
962
|
-
get deploymentBlock() {
|
|
963
|
-
return this.params.deploymentBlock ?? this.config.chain?.deploymentBlock ?? this.defaultDeploymentBlock;
|
|
964
|
-
}
|
|
965
|
-
get eventQueryBlockChunkSize() {
|
|
966
|
-
return this.fixedEventQueryBlockChunkSize ?? this.adaptiveChunkSize ?? DEFAULT_EVENT_QUERY_START_CHUNK_SIZE;
|
|
967
|
-
}
|
|
968
|
-
get eventQueryInitialDelayMs() {
|
|
969
|
-
return this.params.eventQueryInitialDelayMs ?? DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS;
|
|
970
|
-
}
|
|
971
|
-
get eventQueryMaxAttempts() {
|
|
972
|
-
return this.params.eventQueryMaxAttempts ?? DEFAULT_EVENT_QUERY_MAX_ATTEMPTS;
|
|
973
|
-
}
|
|
974
|
-
/**
|
|
975
|
-
* Fixed eth_getLogs range: explicit param (deprecated), else the bound evm-rpc
|
|
976
|
-
* connection profile's `eventQueryBlockChunkSize`. Undefined → adaptive sizing.
|
|
977
|
-
*/
|
|
978
|
-
get fixedEventQueryBlockChunkSize() {
|
|
979
|
-
if (isDefined3(this.params.eventQueryBlockChunkSize)) return this.params.eventQueryBlockChunkSize;
|
|
980
|
-
const bound = this.boundConnection;
|
|
981
|
-
return bound?.config.type === "evm-rpc" ? bound.config.eventQueryBlockChunkSize : void 0;
|
|
982
|
-
}
|
|
983
|
-
async positionCount(range) {
|
|
984
|
-
const events = await this.stakeEvents(range);
|
|
985
|
-
const positionIds = events.map((e) => e.args.id);
|
|
986
|
-
return Math.max(-1, ...positionIds) + 1;
|
|
987
|
-
}
|
|
988
|
-
stakeEvents(range = [0, "latest"], filter) {
|
|
989
|
-
const allEvents = this.eventCache.values().toArray();
|
|
990
|
-
const result = allEvents.filter((e) => {
|
|
991
|
-
if (range[1] !== "latest" && e.time > range[1]) {
|
|
992
|
-
return false;
|
|
993
|
-
}
|
|
994
|
-
if (e.time < range[0]) {
|
|
995
|
-
return false;
|
|
996
|
-
}
|
|
997
|
-
if (isDefined3(filter?.name) && e.name !== filter.name) {
|
|
998
|
-
return false;
|
|
999
|
-
}
|
|
1000
|
-
if (isDefined3(filter?.args?.id) && e.args.id !== filter.args.id) {
|
|
1001
|
-
return false;
|
|
1002
|
-
}
|
|
1003
|
-
if (isDefined3(filter?.args?.staked) && e.args.staked !== filter.args.staked) {
|
|
1004
|
-
return false;
|
|
1005
|
-
}
|
|
1006
|
-
if (isDefined3(filter?.args?.staker) && e.args.staker !== filter.args.staker) {
|
|
1007
|
-
return false;
|
|
1008
|
-
}
|
|
1009
|
-
return true;
|
|
1010
|
-
});
|
|
1011
|
-
return result;
|
|
1012
|
-
}
|
|
1013
|
-
connectContract(address) {
|
|
1014
|
-
return IAddressStakingEvents__factory.connect(address, this.provider);
|
|
1015
|
-
}
|
|
1016
|
-
onEventHandler(staked, staker, id, amount, event, throwOnInvalid = false) {
|
|
1017
|
-
const validatedEventResult = EvmStakeEventZod.safeParse(event);
|
|
1018
|
-
if (validatedEventResult.error) {
|
|
1019
|
-
this.logger?.warn(`Received invalid stake event [${event.eventName}/${event.blockNumber}], ignoring...`);
|
|
1020
|
-
this.logger?.warn(` - ${validatedEventResult.error.message}`);
|
|
1021
|
-
if (throwOnInvalid) {
|
|
1022
|
-
throw new Error(`Invalid stake event: ${validatedEventResult.error.message}`);
|
|
1023
|
-
}
|
|
1024
|
-
return;
|
|
1025
|
-
}
|
|
1026
|
-
const validatedEvent = validatedEventResult.data;
|
|
1027
|
-
const { eventName, blockNumber } = validatedEvent;
|
|
1028
|
-
const cacheKey = `${Number(id)}|${eventName}|${staker}`;
|
|
1029
|
-
const stakeEvent = {
|
|
1030
|
-
name: eventName,
|
|
1031
|
-
args: {
|
|
1032
|
-
id: Number(id),
|
|
1033
|
-
staked: toAddress3(staked),
|
|
1034
|
-
staker: toAddress3(staker),
|
|
1035
|
-
amount: asAttoXL1(amount)
|
|
1036
|
-
},
|
|
1037
|
-
time: blockNumber
|
|
1038
|
-
};
|
|
1039
|
-
this.eventCache.set(cacheKey, stakeEvent);
|
|
1040
|
-
return stakeEvent;
|
|
1041
|
-
}
|
|
1042
|
-
async startHandler() {
|
|
1043
|
-
try {
|
|
1044
|
-
const provider = assertEx10(this.contract.runner?.provider, () => new Error("Failed to get provider"));
|
|
1045
|
-
const historyEndBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get currentEthBlock"));
|
|
1046
|
-
if (!isDefined3(this.params.deploymentBlock)) {
|
|
1047
|
-
this.defaultDeploymentBlock = configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(provider, this.address, this.logger);
|
|
1048
|
-
}
|
|
1049
|
-
await this.loadHistoricalEvents(this.deploymentBlock, historyEndBlock);
|
|
1050
|
-
await this.attachLiveListeners();
|
|
1051
|
-
const latestBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get latestEthBlock"));
|
|
1052
|
-
if (latestBlock > historyEndBlock) {
|
|
1053
|
-
await this.loadHistoricalEvents(historyEndBlock + 1, latestBlock);
|
|
1054
|
-
}
|
|
1055
|
-
} catch (error) {
|
|
1056
|
-
this.logger?.error("EthereumChainStakeEvents failed to start:", error);
|
|
1057
|
-
throw error;
|
|
1058
|
-
}
|
|
1059
|
-
}
|
|
1060
|
-
async attachLiveListeners() {
|
|
1061
|
-
await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
|
|
1062
|
-
this.onEventHandler(staked, staker, id, amount, event);
|
|
1063
|
-
});
|
|
1064
|
-
await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
|
|
1065
|
-
this.onEventHandler(staked, staker, id, amount, event);
|
|
1066
|
-
});
|
|
1067
|
-
await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
|
|
1068
|
-
this.onEventHandler(staked, staker, id, amount, event);
|
|
1069
|
-
});
|
|
1070
|
-
}
|
|
1071
|
-
/**
|
|
1072
|
-
* Loads all stake events for the range with a single address-only sweep —
|
|
1073
|
-
* one eth_getLogs pass per chunk covers all three event types (demuxed by
|
|
1074
|
-
* event name client-side) instead of three filtered sweeps over the same
|
|
1075
|
-
* blocks. Chunk size adapts to the provider: on a range/result-limit error
|
|
1076
|
-
* the chunk shrinks (to the advertised limit when the error states one,
|
|
1077
|
-
* halving otherwise) and the window is retried; rate limits retry at the
|
|
1078
|
-
* same size with backoff.
|
|
1079
|
-
*/
|
|
1080
|
-
async loadHistoricalEvents(fromBlock, toBlock) {
|
|
1081
|
-
if (fromBlock > toBlock) {
|
|
1082
|
-
return;
|
|
1083
|
-
}
|
|
1084
|
-
let eventCount = 0;
|
|
1085
|
-
let chunkCount = 0;
|
|
1086
|
-
let cursor = fromBlock;
|
|
1087
|
-
while (cursor <= toBlock) {
|
|
1088
|
-
const chunkSize = this.eventQueryBlockChunkSize;
|
|
1089
|
-
const chunkTo = Math.min(cursor + chunkSize - 1, toBlock);
|
|
1090
|
-
let logs;
|
|
1091
|
-
try {
|
|
1092
|
-
logs = await withRpcRateLimitBackoff(
|
|
1093
|
-
// '*' = every event on the contract address; parsed against the ABI
|
|
1094
|
-
() => this.contract.queryFilter("*", cursor, chunkTo),
|
|
1095
|
-
{
|
|
1096
|
-
initialDelayMs: this.eventQueryInitialDelayMs,
|
|
1097
|
-
maxAttempts: this.eventQueryMaxAttempts,
|
|
1098
|
-
onRetry: (_error, attempt, delayMs) => {
|
|
1099
|
-
this.logger?.warn(
|
|
1100
|
-
`Rate limited fetching logs for blocks ${cursor}-${chunkTo} (attempt ${attempt}/${this.eventQueryMaxAttempts}); backing off ${delayMs}ms`
|
|
1101
|
-
);
|
|
1102
|
-
}
|
|
1103
|
-
}
|
|
1104
|
-
);
|
|
1105
|
-
} catch (error) {
|
|
1106
|
-
const isFixedSize = isDefined3(this.fixedEventQueryBlockChunkSize);
|
|
1107
|
-
if (!isFixedSize && isRpcRangeLimitError(error) && chunkSize > MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE) {
|
|
1108
|
-
const advertised = rpcRangeLimitFromError(error);
|
|
1109
|
-
const nextSize = Math.max(
|
|
1110
|
-
MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,
|
|
1111
|
-
Math.min(advertised ?? Number.MAX_SAFE_INTEGER, Math.floor(chunkSize / 2))
|
|
1112
|
-
);
|
|
1113
|
-
this.adaptiveChunkSize = nextSize;
|
|
1114
|
-
this.logger?.log(`eth_getLogs rejected a ${chunkSize}-block range; retrying at ${nextSize}`);
|
|
1115
|
-
continue;
|
|
1116
|
-
}
|
|
1117
|
-
this.logger?.error(
|
|
1118
|
-
`eth_getLogs failed for blocks ${cursor}-${chunkTo} (from=${fromBlock} to=${toBlock}):`,
|
|
1119
|
-
error
|
|
1120
|
-
);
|
|
1121
|
-
throw error;
|
|
1122
|
-
}
|
|
1123
|
-
chunkCount++;
|
|
1124
|
-
for (const log of logs) {
|
|
1125
|
-
if (log instanceof EventLog && STAKE_EVENT_NAMES.has(log.eventName)) {
|
|
1126
|
-
const [staked, by, id, amount] = log.args;
|
|
1127
|
-
const event = this.onEventHandler(staked, by, id, amount, log, true);
|
|
1128
|
-
if (event !== void 0) eventCount++;
|
|
1129
|
-
}
|
|
1130
|
-
}
|
|
1131
|
-
cursor = chunkTo + 1;
|
|
1132
|
-
}
|
|
1133
|
-
this.logger?.log(
|
|
1134
|
-
`Cached ${eventCount} stake events from blocks ${fromBlock}-${toBlock} (${chunkCount} chunk(s), final chunk size ${this.eventQueryBlockChunkSize})`
|
|
1135
|
-
);
|
|
1136
|
-
}
|
|
1137
|
-
};
|
|
1138
|
-
__publicField(EvmStakeEventsViewer, "connectionTypes", ["evm-rpc"]);
|
|
1139
|
-
__publicField(EvmStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker);
|
|
1140
|
-
__publicField(EvmStakeEventsViewer, "dependencies", [EvmChainViewerMoniker4]);
|
|
1141
|
-
__publicField(EvmStakeEventsViewer, "monikers", [StakeEventsViewerMoniker]);
|
|
1142
|
-
__publicField(EvmStakeEventsViewer, "surface", "node");
|
|
1143
|
-
EvmStakeEventsViewer = __decorateClass([
|
|
1144
|
-
creatableProvider4()
|
|
1145
|
-
], EvmStakeEventsViewer);
|
|
472
|
+
EvmStakeRemovedEventZod,
|
|
473
|
+
EvmStakeWithdrawnEventNameZod,
|
|
474
|
+
EvmStakeWithdrawnEventZod,
|
|
475
|
+
isEvmStakeAddedEvent,
|
|
476
|
+
isEvmStakeEvent,
|
|
477
|
+
isEvmStakeRemovedEvent,
|
|
478
|
+
isEvmStakeWithdrawnEvent,
|
|
479
|
+
toEvmStakeAddedEvent,
|
|
480
|
+
toEvmStakeEvent,
|
|
481
|
+
toEvmStakeRemovedEvent,
|
|
482
|
+
toEvmStakeWithdrawnEvent
|
|
483
|
+
} from "@xyo-network/xl1-sdk";
|
|
1146
484
|
|
|
1147
485
|
// src/modules/ethereum/drivers/EvmStakeViewer.ts
|
|
1148
|
-
import {
|
|
1149
|
-
assertEx as assertEx11,
|
|
1150
|
-
toAddress as toAddress4,
|
|
1151
|
-
toEthAddress as toEthAddress8
|
|
1152
|
-
} from "@ariestools/sdk";
|
|
1153
|
-
import { IAddressStaking__factory } from "@xyo-network/typechain";
|
|
1154
|
-
import {
|
|
1155
|
-
creatableProvider as creatableProvider5,
|
|
1156
|
-
EvmChainViewerMoniker as EvmChainViewerMoniker5,
|
|
1157
|
-
StakeEventsViewerMoniker as StakeEventsViewerMoniker2,
|
|
1158
|
-
StakeViewerMoniker
|
|
1159
|
-
} from "@xyo-network/xl1-sdk";
|
|
1160
|
-
import { asAttoXL1 as asAttoXL12 } from "@xyo-network/xl1-sdk";
|
|
1161
|
-
import { Mutex } from "async-mutex";
|
|
1162
|
-
var ethStakeToStake = (ethStake) => {
|
|
1163
|
-
const stake = {
|
|
1164
|
-
id: Number(ethStake.id),
|
|
1165
|
-
staked: toAddress4(ethStake.staked),
|
|
1166
|
-
staker: toAddress4(ethStake.staker),
|
|
1167
|
-
amount: asAttoXL12(ethStake.amount),
|
|
1168
|
-
addBlock: Number(ethStake.addBlock),
|
|
1169
|
-
removeBlock: Number(ethStake.removeBlock),
|
|
1170
|
-
withdrawBlock: Number(ethStake.withdrawBlock)
|
|
1171
|
-
};
|
|
1172
|
-
return stake;
|
|
1173
|
-
};
|
|
1174
|
-
var EvmStakeViewer = class extends AbstractEvmViewer {
|
|
1175
|
-
moniker = EvmStakeViewer.defaultMoniker;
|
|
1176
|
-
_callMutex = new Mutex();
|
|
1177
|
-
_deploymentBlock = 0;
|
|
1178
|
-
_stakeCache = /* @__PURE__ */ new Map();
|
|
1179
|
-
_stakeEventsViewer;
|
|
1180
|
-
get stakeEvents() {
|
|
1181
|
-
return this._stakeEventsViewer;
|
|
1182
|
-
}
|
|
1183
|
-
async active() {
|
|
1184
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1185
|
-
return await this.contract.active();
|
|
1186
|
-
});
|
|
1187
|
-
}
|
|
1188
|
-
async activeByAddressStaked(address) {
|
|
1189
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1190
|
-
return await this.contract.activeByAddressStaked(toEthAddress8(address));
|
|
1191
|
-
});
|
|
1192
|
-
}
|
|
1193
|
-
async activeByStaker(address) {
|
|
1194
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1195
|
-
return await this.contract.activeByStaker(toEthAddress8(address));
|
|
1196
|
-
});
|
|
1197
|
-
}
|
|
1198
|
-
activeStakes() {
|
|
1199
|
-
return this._stakeCache.values().filter((stake) => stake.removeBlock === 0 && stake.withdrawBlock === 0).toArray();
|
|
1200
|
-
}
|
|
1201
|
-
async createHandler() {
|
|
1202
|
-
await super.createHandler();
|
|
1203
|
-
this._stakeEventsViewer = await this.locator.getInstance(StakeEventsViewerMoniker2);
|
|
1204
|
-
this._deploymentBlock = this.params.deploymentBlock ?? configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(this.provider, this.address, this.logger);
|
|
1205
|
-
}
|
|
1206
|
-
minWithdrawalBlocks() {
|
|
1207
|
-
return 0;
|
|
1208
|
-
}
|
|
1209
|
-
async pending() {
|
|
1210
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1211
|
-
return await this.contract.pending();
|
|
1212
|
-
});
|
|
1213
|
-
}
|
|
1214
|
-
async pendingByStaker(staker) {
|
|
1215
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1216
|
-
return await this.contract.pendingByStaker(toEthAddress8(staker));
|
|
1217
|
-
});
|
|
1218
|
-
}
|
|
1219
|
-
removedStakes() {
|
|
1220
|
-
return this._stakeCache.values().filter((stake) => stake.removeBlock !== 0 && stake.withdrawBlock === 0).toArray();
|
|
1221
|
-
}
|
|
1222
|
-
rewardsContract() {
|
|
1223
|
-
return toAddress4("0x000000000000000000000000000000");
|
|
1224
|
-
}
|
|
1225
|
-
async stakeById(id) {
|
|
1226
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1227
|
-
const startTime = Date.now();
|
|
1228
|
-
const cachedStake = this._stakeCache.get(id);
|
|
1229
|
-
if (cachedStake) {
|
|
1230
|
-
return cachedStake;
|
|
1231
|
-
}
|
|
1232
|
-
const ethResult = await this.contract.getStakeById(id);
|
|
1233
|
-
const stake = ethStakeToStake(ethResult);
|
|
1234
|
-
this._stakeCache.set(stake.id, stake);
|
|
1235
|
-
this.logger?.log(`EthereumChainStake: stakeById(${id}) took ${Date.now() - startTime}ms`);
|
|
1236
|
-
return stake;
|
|
1237
|
-
});
|
|
1238
|
-
}
|
|
1239
|
-
async stakeByStaker(staker, slot) {
|
|
1240
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1241
|
-
const ethResult = await this.contract.getStake(toEthAddress8(staker), slot);
|
|
1242
|
-
const stake = ethStakeToStake(ethResult);
|
|
1243
|
-
this._stakeCache.set(stake.id, stake);
|
|
1244
|
-
return stake;
|
|
1245
|
-
});
|
|
1246
|
-
}
|
|
1247
|
-
async stakesByStaked(staked, range = [0, void 0]) {
|
|
1248
|
-
const events = await this.stakeEvents.stakeEvents([Math.max(
|
|
1249
|
-
range[0],
|
|
1250
|
-
this._deploymentBlock
|
|
1251
|
-
), range.at(1) ?? "latest"], { name: "StakeAdded", args: { staked } });
|
|
1252
|
-
const result = [];
|
|
1253
|
-
for (const event of events) {
|
|
1254
|
-
if (toAddress4(event.args.staked) === toAddress4(staked)) {
|
|
1255
|
-
result.push(await this.stakeById(event.args.id));
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
return result;
|
|
1259
|
-
}
|
|
1260
|
-
async stakesByStaker(staker, range = [0, void 0]) {
|
|
1261
|
-
const events = await this.stakeEvents.stakeEvents([Math.max(
|
|
1262
|
-
range[0],
|
|
1263
|
-
this._deploymentBlock
|
|
1264
|
-
), range.at(1) ?? "latest"], { name: "StakeAdded", args: { staker } });
|
|
1265
|
-
const result = [];
|
|
1266
|
-
for (const event of events) {
|
|
1267
|
-
if (toAddress4(event.args.staker) === toAddress4(staker)) {
|
|
1268
|
-
result.push(await this.stakeById(event.args.id));
|
|
1269
|
-
}
|
|
1270
|
-
}
|
|
1271
|
-
return result;
|
|
1272
|
-
}
|
|
1273
|
-
stakingTokenAddress() {
|
|
1274
|
-
return toAddress4("0x000000000000000000000000000011");
|
|
1275
|
-
}
|
|
1276
|
-
async withdrawn() {
|
|
1277
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1278
|
-
return await this.contract.withdrawn();
|
|
1279
|
-
});
|
|
1280
|
-
}
|
|
1281
|
-
async withdrawnByStaker(staker) {
|
|
1282
|
-
return await this._callMutex.runExclusive(async () => {
|
|
1283
|
-
return await this.contract.withdrawnByStaker(toEthAddress8(staker));
|
|
1284
|
-
});
|
|
1285
|
-
}
|
|
1286
|
-
withdrawnStakes() {
|
|
1287
|
-
return this._stakeCache.values().filter((stake) => stake.removeBlock !== 0 && stake.withdrawBlock !== 0).toArray();
|
|
1288
|
-
}
|
|
1289
|
-
connectContract(address) {
|
|
1290
|
-
return IAddressStaking__factory.connect(address, this.provider);
|
|
1291
|
-
}
|
|
1292
|
-
async startHandler() {
|
|
1293
|
-
await this.contract.on(this.contract.getEvent("StakeAdded"), (staked, staker, id, amount, event) => {
|
|
1294
|
-
this._stakeCache.set(Number(id), {
|
|
1295
|
-
id: Number(id),
|
|
1296
|
-
staked: toAddress4(staked),
|
|
1297
|
-
staker: toAddress4(staker),
|
|
1298
|
-
amount: asAttoXL12(amount),
|
|
1299
|
-
addBlock: event.blockNumber,
|
|
1300
|
-
removeBlock: 0,
|
|
1301
|
-
withdrawBlock: 0
|
|
1302
|
-
});
|
|
1303
|
-
});
|
|
1304
|
-
await this.contract.on(this.contract.getEvent("StakeRemoved"), (staked, staker, id, amount, event) => {
|
|
1305
|
-
const stake = assertEx11(this._stakeCache.get(Number(id)));
|
|
1306
|
-
this._stakeCache.set(Number(id), {
|
|
1307
|
-
...stake,
|
|
1308
|
-
removeBlock: event.blockNumber
|
|
1309
|
-
});
|
|
1310
|
-
});
|
|
1311
|
-
await this.contract.on(this.contract.getEvent("StakeWithdrawn"), (staked, staker, id, amount, event) => {
|
|
1312
|
-
const stake = assertEx11(this._stakeCache.get(Number(id)));
|
|
1313
|
-
this._stakeCache.set(Number(id), {
|
|
1314
|
-
...stake,
|
|
1315
|
-
withdrawBlock: event.blockNumber
|
|
1316
|
-
});
|
|
1317
|
-
});
|
|
1318
|
-
const stakeEventGroups = await Promise.all([
|
|
1319
|
-
this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeAdded" }),
|
|
1320
|
-
this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeRemoved" }),
|
|
1321
|
-
this.stakeEvents.stakeEvents([this._deploymentBlock, "latest"], { name: "StakeWithdrawn" })
|
|
1322
|
-
]);
|
|
1323
|
-
const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time);
|
|
1324
|
-
for (const event of allStakeEvents) {
|
|
1325
|
-
this.applyHistoricalStakeEvent(event);
|
|
1326
|
-
}
|
|
1327
|
-
for (const event of allStakeEvents) {
|
|
1328
|
-
await this.stakeById(event.args.id);
|
|
1329
|
-
}
|
|
1330
|
-
}
|
|
1331
|
-
applyHistoricalStakeEvent(event) {
|
|
1332
|
-
if (event.name === "StakeAdded") {
|
|
1333
|
-
this._stakeCache.set(event.args.id, {
|
|
1334
|
-
id: event.args.id,
|
|
1335
|
-
staked: event.args.staked,
|
|
1336
|
-
staker: event.args.staker,
|
|
1337
|
-
amount: event.args.amount,
|
|
1338
|
-
addBlock: event.time,
|
|
1339
|
-
removeBlock: 0,
|
|
1340
|
-
withdrawBlock: 0
|
|
1341
|
-
});
|
|
1342
|
-
return;
|
|
1343
|
-
}
|
|
1344
|
-
if (event.name === "StakeRemoved") {
|
|
1345
|
-
const stake = assertEx11(this._stakeCache.get(event.args.id));
|
|
1346
|
-
this._stakeCache.set(event.args.id, {
|
|
1347
|
-
...stake,
|
|
1348
|
-
removeBlock: event.time
|
|
1349
|
-
});
|
|
1350
|
-
return;
|
|
1351
|
-
}
|
|
1352
|
-
if (event.name === "StakeWithdrawn") {
|
|
1353
|
-
const stake = assertEx11(this._stakeCache.get(event.args.id));
|
|
1354
|
-
this._stakeCache.set(event.args.id, {
|
|
1355
|
-
...stake,
|
|
1356
|
-
withdrawBlock: event.time
|
|
1357
|
-
});
|
|
1358
|
-
}
|
|
1359
|
-
}
|
|
1360
|
-
};
|
|
1361
|
-
__publicField(EvmStakeViewer, "connectionTypes", ["evm-rpc"]);
|
|
1362
|
-
__publicField(EvmStakeViewer, "defaultMoniker", StakeViewerMoniker);
|
|
1363
|
-
__publicField(EvmStakeViewer, "dependencies", [EvmChainViewerMoniker5, StakeEventsViewerMoniker2]);
|
|
1364
|
-
__publicField(EvmStakeViewer, "monikers", [StakeViewerMoniker]);
|
|
1365
|
-
__publicField(EvmStakeViewer, "surface", "node");
|
|
1366
|
-
EvmStakeViewer = __decorateClass([
|
|
1367
|
-
creatableProvider5()
|
|
1368
|
-
], EvmStakeViewer);
|
|
486
|
+
import { EvmStakeViewer } from "@xyo-network/xl1-sdk";
|
|
1369
487
|
|
|
1370
488
|
// src/modules/ethereum/ethereum.ts
|
|
1371
489
|
import { parseUnits as parseUnits2 } from "ethers/utils";
|
|
@@ -1377,88 +495,34 @@ var getDefaultGasConfig = () => {
|
|
|
1377
495
|
};
|
|
1378
496
|
};
|
|
1379
497
|
|
|
1380
|
-
// src/modules/ethereum/indexing/EvmEventIndexModel.ts
|
|
1381
|
-
import {
|
|
1382
|
-
EthAddressZod as EthAddressZod2,
|
|
1383
|
-
HexRegExMinMaxMixedCaseWithPrefix as HexRegExMinMaxMixedCaseWithPrefix2,
|
|
1384
|
-
zodAsFactory as zodAsFactory2
|
|
1385
|
-
} from "@ariestools/sdk";
|
|
1386
|
-
import { z as z2 } from "zod/mini";
|
|
1387
|
-
var EvmHashZod = z2.string().check(z2.regex(HexRegExMinMaxMixedCaseWithPrefix2(32, 32)));
|
|
1388
|
-
var EvmDataZod = z2.string().check(z2.regex(/^0x[\dA-Fa-f]*$/));
|
|
1389
|
-
var EvmEventIndexLogZod = z2.object({
|
|
1390
|
-
address: EthAddressZod2,
|
|
1391
|
-
blockHash: EvmHashZod,
|
|
1392
|
-
blockNumber: z2.number(),
|
|
1393
|
-
data: EvmDataZod,
|
|
1394
|
-
index: z2.number(),
|
|
1395
|
-
topics: z2.array(EvmHashZod),
|
|
1396
|
-
transactionHash: EvmHashZod,
|
|
1397
|
-
transactionIndex: z2.number()
|
|
1398
|
-
});
|
|
1399
|
-
var EvmEventIndexFrameZod = z2.object({
|
|
1400
|
-
fromBlock: z2.number(),
|
|
1401
|
-
logs: z2.array(EvmEventIndexLogZod),
|
|
1402
|
-
toBlock: z2.number()
|
|
1403
|
-
});
|
|
1404
|
-
var EvmEventIndexManifestZod = z2.object({
|
|
1405
|
-
address: EthAddressZod2,
|
|
1406
|
-
chainId: z2.string(),
|
|
1407
|
-
deploymentBlock: z2.number(),
|
|
1408
|
-
frameSize: z2.number(),
|
|
1409
|
-
layout: z2.literal("evm-contract-events-v1")
|
|
1410
|
-
});
|
|
1411
|
-
var EvmEventIndexHeadZod = z2.object({
|
|
1412
|
-
address: EthAddressZod2,
|
|
1413
|
-
block: z2.number(),
|
|
1414
|
-
chainId: z2.string(),
|
|
1415
|
-
hash: EvmHashZod
|
|
1416
|
-
});
|
|
1417
|
-
var asEvmEventIndexFrame = zodAsFactory2(EvmEventIndexFrameZod, "asEvmEventIndexFrame");
|
|
1418
|
-
var asEvmEventIndexHead = zodAsFactory2(EvmEventIndexHeadZod, "asEvmEventIndexHead");
|
|
1419
|
-
var asEvmEventIndexManifest = zodAsFactory2(EvmEventIndexManifestZod, "asEvmEventIndexManifest");
|
|
1420
|
-
|
|
1421
|
-
// src/modules/ethereum/indexing/EvmEventIndexPaths.ts
|
|
1422
|
-
function root(address) {
|
|
1423
|
-
return `evm/events/${address.toLowerCase()}`;
|
|
1424
|
-
}
|
|
1425
|
-
function evmEventIndexFramePath(address, frameIndex) {
|
|
1426
|
-
return `${root(address)}/frames/${frameIndex}.json`;
|
|
1427
|
-
}
|
|
1428
|
-
function evmEventIndexHeadPath(address) {
|
|
1429
|
-
return `${root(address)}/head.json`;
|
|
1430
|
-
}
|
|
1431
|
-
function evmEventIndexManifestPath(address) {
|
|
1432
|
-
return `${root(address)}/manifest.json`;
|
|
1433
|
-
}
|
|
1434
|
-
function evmEventIndexTailPath(address) {
|
|
1435
|
-
return `${root(address)}/tail.json`;
|
|
1436
|
-
}
|
|
1437
|
-
|
|
1438
|
-
// src/modules/ethereum/indexing/EvmEventIndexPublishRunner.ts
|
|
1439
|
-
var EvmEventIndexPublishRunnerMoniker = "EvmEventIndexPublishRunner";
|
|
1440
|
-
|
|
1441
498
|
// src/modules/ethereum/indexing/RestStakeEventsViewer.ts
|
|
1442
499
|
import {
|
|
1443
|
-
assertEx as
|
|
1444
|
-
isDefined as
|
|
1445
|
-
toAddress as
|
|
1446
|
-
toEthAddress as
|
|
500
|
+
assertEx as assertEx5,
|
|
501
|
+
isDefined as isDefined3,
|
|
502
|
+
toAddress as toAddress2,
|
|
503
|
+
toEthAddress as toEthAddress4
|
|
1447
504
|
} from "@ariestools/sdk";
|
|
1448
|
-
import { IAddressStakingEvents__factory
|
|
505
|
+
import { IAddressStakingEvents__factory } from "@xyo-network/typechain";
|
|
1449
506
|
import {
|
|
1450
|
-
AbstractCreatableProvider
|
|
1451
|
-
asAttoXL1
|
|
1452
|
-
|
|
507
|
+
AbstractCreatableProvider,
|
|
508
|
+
asAttoXL1,
|
|
509
|
+
asEvmEventIndexFrame,
|
|
510
|
+
asEvmEventIndexHead,
|
|
511
|
+
asEvmEventIndexManifest,
|
|
512
|
+
creatableProvider,
|
|
513
|
+
evmEventIndexFramePath,
|
|
514
|
+
evmEventIndexHeadPath,
|
|
515
|
+
evmEventIndexManifestPath,
|
|
516
|
+
evmEventIndexTailPath,
|
|
1453
517
|
resolveRestConnectionEndpoint,
|
|
1454
|
-
StakeEventsViewerMoniker
|
|
518
|
+
StakeEventsViewerMoniker
|
|
1455
519
|
} from "@xyo-network/xl1-sdk";
|
|
1456
520
|
import { Interface } from "ethers";
|
|
1457
|
-
var
|
|
1458
|
-
var RestStakeEventsViewer = class extends
|
|
521
|
+
var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
|
|
522
|
+
var RestStakeEventsViewer = class extends AbstractCreatableProvider {
|
|
1459
523
|
moniker = RestStakeEventsViewer.defaultMoniker;
|
|
1460
524
|
completeFrames = /* @__PURE__ */ new Map();
|
|
1461
|
-
contractInterface = new Interface(
|
|
525
|
+
contractInterface = new Interface(IAddressStakingEvents__factory.abi);
|
|
1462
526
|
currentHead;
|
|
1463
527
|
manifestPromise;
|
|
1464
528
|
stakeEventCache = [];
|
|
@@ -1475,10 +539,10 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
|
|
|
1475
539
|
}
|
|
1476
540
|
static async paramsHandler(params) {
|
|
1477
541
|
const contextConfig = params.context?.config;
|
|
1478
|
-
const address = params.address ??
|
|
542
|
+
const address = params.address ?? toEthAddress4(assertEx5(contextConfig?.chain?.id, () => "RestStakeEventsViewer requires an address param or config.chain.id"));
|
|
1479
543
|
const moniker = this.defaultMoniker;
|
|
1480
|
-
const eventIndexBaseUrl =
|
|
1481
|
-
|
|
544
|
+
const eventIndexBaseUrl = isDefined3(params.eventIndexBaseUrl) && params.eventIndexBaseUrl !== "" ? params.eventIndexBaseUrl : resolveRestConnectionEndpoint(
|
|
545
|
+
assertEx5(contextConfig, () => "Context config is required to resolve the EVM event index endpoint"),
|
|
1482
546
|
moniker
|
|
1483
547
|
);
|
|
1484
548
|
return {
|
|
@@ -1506,13 +570,13 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
|
|
|
1506
570
|
}
|
|
1507
571
|
async fetchJson(path) {
|
|
1508
572
|
const response = await this.fetchFn(`${this.eventIndexBaseUrl}/${path}`);
|
|
1509
|
-
|
|
573
|
+
assertEx5(response.ok, () => `EVM event index request failed [${response.status}] for ${path}`);
|
|
1510
574
|
return await response.json();
|
|
1511
575
|
}
|
|
1512
576
|
async getManifest() {
|
|
1513
577
|
this.manifestPromise ??= (async () => {
|
|
1514
578
|
const manifest = asEvmEventIndexManifest(await this.fetchJson(evmEventIndexManifestPath(this.address)), true);
|
|
1515
|
-
|
|
579
|
+
assertEx5(manifest.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index manifest address mismatch");
|
|
1516
580
|
return manifest;
|
|
1517
581
|
})();
|
|
1518
582
|
return await this.manifestPromise;
|
|
@@ -1521,23 +585,23 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
|
|
|
1521
585
|
matchesFilter(event, range, filter) {
|
|
1522
586
|
if (range[1] !== "latest" && event.time > range[1]) return false;
|
|
1523
587
|
if (event.time < range[0]) return false;
|
|
1524
|
-
if (
|
|
1525
|
-
if (
|
|
1526
|
-
if (
|
|
1527
|
-
if (
|
|
588
|
+
if (isDefined3(filter?.name) && event.name !== filter.name) return false;
|
|
589
|
+
if (isDefined3(filter?.args?.id) && event.args.id !== filter.args.id) return false;
|
|
590
|
+
if (isDefined3(filter?.args?.staked) && event.args.staked !== filter.args.staked) return false;
|
|
591
|
+
if (isDefined3(filter?.args?.staker) && event.args.staker !== filter.args.staker) return false;
|
|
1528
592
|
return true;
|
|
1529
593
|
}
|
|
1530
594
|
stakeEventFromLog(log) {
|
|
1531
595
|
const parsed = this.contractInterface.parseLog({ data: log.data, topics: log.topics });
|
|
1532
|
-
if (parsed === null || !
|
|
596
|
+
if (parsed === null || !STAKE_EVENT_NAMES.has(parsed.name)) return;
|
|
1533
597
|
const [staked, staker, id, amount] = parsed.args;
|
|
1534
598
|
return {
|
|
1535
599
|
name: parsed.name,
|
|
1536
600
|
args: {
|
|
1537
|
-
amount:
|
|
601
|
+
amount: asAttoXL1(amount),
|
|
1538
602
|
id: Number(id),
|
|
1539
|
-
staked:
|
|
1540
|
-
staker:
|
|
603
|
+
staked: toAddress2(staked),
|
|
604
|
+
staker: toAddress2(staker)
|
|
1541
605
|
},
|
|
1542
606
|
time: log.blockNumber
|
|
1543
607
|
};
|
|
@@ -1551,8 +615,8 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
|
|
|
1551
615
|
async syncFromHead() {
|
|
1552
616
|
const manifest = await this.getManifest();
|
|
1553
617
|
const head = asEvmEventIndexHead(await this.fetchJson(evmEventIndexHeadPath(this.address)), true);
|
|
1554
|
-
|
|
1555
|
-
|
|
618
|
+
assertEx5(head.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index head address mismatch");
|
|
619
|
+
assertEx5(head.chainId === manifest.chainId, () => "EVM event index chain mismatch");
|
|
1556
620
|
if (this.currentHead?.block === head.block && this.currentHead.hash === head.hash) return;
|
|
1557
621
|
if (this.currentHead !== void 0 && (head.block < this.currentHead.block || head.block === this.currentHead.block && head.hash !== this.currentHead.hash)) {
|
|
1558
622
|
this.completeFrames.clear();
|
|
@@ -1564,28 +628,115 @@ var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
|
|
|
1564
628
|
await Promise.all(missingFrameIndexes.map(async (index) => {
|
|
1565
629
|
const frame = asEvmEventIndexFrame(await this.fetchJson(evmEventIndexFramePath(this.address, index)), true);
|
|
1566
630
|
const expectedFrom = manifest.deploymentBlock + index * manifest.frameSize;
|
|
1567
|
-
|
|
1568
|
-
|
|
631
|
+
assertEx5(frame.fromBlock === expectedFrom, () => `EVM event index frame ${index} starts at the wrong block`);
|
|
632
|
+
assertEx5(frame.toBlock === expectedFrom + manifest.frameSize - 1, () => `EVM event index frame ${index} is incomplete`);
|
|
1569
633
|
this.completeFrames.set(index, frame);
|
|
1570
634
|
}));
|
|
1571
635
|
const tailStart = manifest.deploymentBlock + completeFrameCount * manifest.frameSize;
|
|
1572
636
|
this.tailFrame = tailStart <= head.block ? asEvmEventIndexFrame(await this.fetchJson(`${evmEventIndexTailPath(this.address)}?head=${head.hash}`), true) : void 0;
|
|
1573
637
|
if (this.tailFrame !== void 0) {
|
|
1574
|
-
|
|
1575
|
-
|
|
638
|
+
assertEx5(this.tailFrame.fromBlock === tailStart, () => "EVM event index tail starts at the wrong block");
|
|
639
|
+
assertEx5(this.tailFrame.toBlock === head.block, () => "EVM event index tail is stale relative to its head");
|
|
1576
640
|
}
|
|
1577
641
|
this.stakeEventCache = this.decodeIndexedStakeEvents();
|
|
1578
642
|
this.currentHead = head;
|
|
1579
643
|
}
|
|
1580
644
|
};
|
|
1581
645
|
__publicField(RestStakeEventsViewer, "connectionTypes", ["rest"]);
|
|
1582
|
-
__publicField(RestStakeEventsViewer, "defaultMoniker",
|
|
646
|
+
__publicField(RestStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker);
|
|
1583
647
|
__publicField(RestStakeEventsViewer, "dependencies", []);
|
|
1584
|
-
__publicField(RestStakeEventsViewer, "monikers", [
|
|
648
|
+
__publicField(RestStakeEventsViewer, "monikers", [StakeEventsViewerMoniker]);
|
|
1585
649
|
__publicField(RestStakeEventsViewer, "surface", "node");
|
|
1586
650
|
RestStakeEventsViewer = __decorateClass([
|
|
1587
|
-
|
|
651
|
+
creatableProvider()
|
|
1588
652
|
], RestStakeEventsViewer);
|
|
653
|
+
|
|
654
|
+
// src/modules/ethereum/indexing/index.ts
|
|
655
|
+
import {
|
|
656
|
+
asEvmEventIndexFrame as asEvmEventIndexFrame2,
|
|
657
|
+
asEvmEventIndexHead as asEvmEventIndexHead2,
|
|
658
|
+
asEvmEventIndexManifest as asEvmEventIndexManifest2,
|
|
659
|
+
evmEventIndexFramePath as evmEventIndexFramePath2,
|
|
660
|
+
EvmEventIndexFrameZod,
|
|
661
|
+
evmEventIndexHeadPath as evmEventIndexHeadPath2,
|
|
662
|
+
EvmEventIndexHeadZod,
|
|
663
|
+
EvmEventIndexLogZod,
|
|
664
|
+
evmEventIndexManifestPath as evmEventIndexManifestPath2,
|
|
665
|
+
EvmEventIndexManifestZod,
|
|
666
|
+
EvmEventIndexPublishRunnerMoniker,
|
|
667
|
+
evmEventIndexTailPath as evmEventIndexTailPath2
|
|
668
|
+
} from "@xyo-network/xl1-sdk";
|
|
669
|
+
|
|
670
|
+
// src/modules/ethereum/providers/AbstractEvmProvider.ts
|
|
671
|
+
import { AbstractEvmProvider } from "@xyo-network/xl1-sdk";
|
|
672
|
+
|
|
673
|
+
// src/modules/ethereum/providers/AbstractEvmRunner.ts
|
|
674
|
+
import { assertEx as assertEx6 } from "@ariestools/sdk";
|
|
675
|
+
|
|
676
|
+
// src/modules/ethereum/providers/AbstractEvmViewer.ts
|
|
677
|
+
import { AbstractEvmViewer } from "@xyo-network/xl1-sdk";
|
|
678
|
+
|
|
679
|
+
// src/modules/ethereum/providers/AbstractEvmRunner.ts
|
|
680
|
+
var AbstractEvmRunner = class extends AbstractEvmViewer {
|
|
681
|
+
static async paramsHandler(params) {
|
|
682
|
+
const runner = assertEx6(params?.runner, () => new Error("No runner defined"));
|
|
683
|
+
const provider = assertEx6(runner.provider, () => new Error("Runner must have a provider defined"));
|
|
684
|
+
return { ...await super.paramsHandler({ ...params, provider }), runner };
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
// src/modules/ethereum/providers/EvmChainContractViewer.ts
|
|
689
|
+
import { EvmChainContractViewer } from "@xyo-network/xl1-sdk";
|
|
690
|
+
|
|
691
|
+
// src/modules/ethereum/providers/EvmStakeRunner.ts
|
|
692
|
+
import { toEthAddress as toEthAddress5 } from "@ariestools/sdk";
|
|
693
|
+
import { IStakedXyoChain__factory } from "@xyo-network/typechain";
|
|
694
|
+
import {
|
|
695
|
+
creatableProvider as creatableProvider2,
|
|
696
|
+
StakeRunnerMoniker
|
|
697
|
+
} from "@xyo-network/xl1-sdk";
|
|
698
|
+
import { getAddress } from "ethers/address";
|
|
699
|
+
var EvmStakeRunner = class extends AbstractEvmRunner {
|
|
700
|
+
moniker = EvmStakeRunner.defaultMoniker;
|
|
701
|
+
async addStake(staked, amount) {
|
|
702
|
+
const result = await this.contract.addStake(getAddress(toEthAddress5(staked)), amount);
|
|
703
|
+
await result.wait();
|
|
704
|
+
return true;
|
|
705
|
+
}
|
|
706
|
+
async removeStake(slot) {
|
|
707
|
+
const result = await this.contract.removeStake(slot);
|
|
708
|
+
await result.wait();
|
|
709
|
+
return true;
|
|
710
|
+
}
|
|
711
|
+
async withdrawStake(slot) {
|
|
712
|
+
const result = await this.contract.withdrawStake(slot);
|
|
713
|
+
await result.wait();
|
|
714
|
+
return true;
|
|
715
|
+
}
|
|
716
|
+
connectContract(address) {
|
|
717
|
+
return IStakedXyoChain__factory.connect(address, this.params.runner);
|
|
718
|
+
}
|
|
719
|
+
};
|
|
720
|
+
__publicField(EvmStakeRunner, "connectionTypes", ["evm-rpc"]);
|
|
721
|
+
__publicField(EvmStakeRunner, "defaultMoniker", StakeRunnerMoniker);
|
|
722
|
+
__publicField(EvmStakeRunner, "dependencies", []);
|
|
723
|
+
__publicField(EvmStakeRunner, "monikers", [StakeRunnerMoniker]);
|
|
724
|
+
__publicField(EvmStakeRunner, "surface", "node");
|
|
725
|
+
EvmStakeRunner = __decorateClass([
|
|
726
|
+
creatableProvider2()
|
|
727
|
+
], EvmStakeRunner);
|
|
728
|
+
|
|
729
|
+
// src/modules/ethereum/providers/EvmStakeTotalsViewer.ts
|
|
730
|
+
import { EvmStakeTotalsViewer } from "@xyo-network/xl1-sdk";
|
|
731
|
+
|
|
732
|
+
// src/modules/ethereum/rpc/isRpcRangeLimitError.ts
|
|
733
|
+
import { isRpcRangeLimitError, rpcRangeLimitFromError } from "@xyo-network/xl1-sdk";
|
|
734
|
+
|
|
735
|
+
// src/modules/ethereum/rpc/isRpcRateLimitError.ts
|
|
736
|
+
import { isRpcRateLimitError } from "@xyo-network/xl1-sdk";
|
|
737
|
+
|
|
738
|
+
// src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
|
|
739
|
+
import { withRpcRateLimitBackoff } from "@xyo-network/xl1-sdk";
|
|
1589
740
|
export {
|
|
1590
741
|
AbstractEvmProvider,
|
|
1591
742
|
AbstractEvmRunner,
|
|
@@ -1619,9 +770,9 @@ export {
|
|
|
1619
770
|
EvmStakeWithdrawnEventZod,
|
|
1620
771
|
MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,
|
|
1621
772
|
RestStakeEventsViewer,
|
|
1622
|
-
asEvmEventIndexFrame,
|
|
1623
|
-
asEvmEventIndexHead,
|
|
1624
|
-
asEvmEventIndexManifest,
|
|
773
|
+
asEvmEventIndexFrame2 as asEvmEventIndexFrame,
|
|
774
|
+
asEvmEventIndexHead2 as asEvmEventIndexHead,
|
|
775
|
+
asEvmEventIndexManifest2 as asEvmEventIndexManifest,
|
|
1625
776
|
asEvmStakeAddedEvent,
|
|
1626
777
|
asEvmStakeEvent,
|
|
1627
778
|
asEvmStakeRemovedEvent,
|
|
@@ -1636,10 +787,10 @@ export {
|
|
|
1636
787
|
estimateBlockNumberAt,
|
|
1637
788
|
estimateBlockNumberFromHead,
|
|
1638
789
|
ethBlockRate,
|
|
1639
|
-
evmEventIndexFramePath,
|
|
1640
|
-
evmEventIndexHeadPath,
|
|
1641
|
-
evmEventIndexManifestPath,
|
|
1642
|
-
evmEventIndexTailPath,
|
|
790
|
+
evmEventIndexFramePath2 as evmEventIndexFramePath,
|
|
791
|
+
evmEventIndexHeadPath2 as evmEventIndexHeadPath,
|
|
792
|
+
evmEventIndexManifestPath2 as evmEventIndexManifestPath,
|
|
793
|
+
evmEventIndexTailPath2 as evmEventIndexTailPath,
|
|
1643
794
|
findContractDeploymentBlock,
|
|
1644
795
|
getDefaultGasConfig,
|
|
1645
796
|
getEthBlockRateBlocks,
|