@xyo-network/chain-sdk 4.1.0 → 4.2.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/findContractDeploymentBlock.d.ts +25 -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 +12 -12
- package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +43 -13
- package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
- package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -1
- 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/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 +15 -0
- package/dist/browser/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
- 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/neutral/ethereum.mjs +413 -65
- package/dist/neutral/ethereum.mjs.map +4 -4
- package/dist/neutral/modules/ethereum/block/findContractDeploymentBlock.d.ts +25 -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 +12 -12
- package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +43 -13
- package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
- package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -1
- 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/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 +15 -0
- package/dist/neutral/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
- 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/services.mjs +46 -13
- package/dist/neutral/services.mjs.map +4 -4
- package/dist/node/modules/ethereum/block/findContractDeploymentBlock.d.ts +25 -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 +12 -12
- package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +43 -13
- package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
- package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts +1 -1
- 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/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 +15 -0
- package/dist/node/modules/ethereum/rpc/isRpcRangeLimitError.d.ts.map +1 -0
- 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/package.json +17 -19
|
@@ -198,6 +198,59 @@ async function estimateBlockNumberAt(provider, targetDate = DEFAULT_ESTIMATE_BLO
|
|
|
198
198
|
return estimateBlockNumberFromHead(head.number, head.timestamp, targetDate, avgBlockTimeSec);
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
+
// src/modules/ethereum/block/findContractDeploymentBlock.ts
|
|
202
|
+
var deploymentBlockSearches = /* @__PURE__ */ new WeakMap();
|
|
203
|
+
async function findContractDeploymentBlock(provider, address) {
|
|
204
|
+
let byAddress = deploymentBlockSearches.get(provider);
|
|
205
|
+
if (byAddress === void 0) {
|
|
206
|
+
byAddress = /* @__PURE__ */ new Map();
|
|
207
|
+
deploymentBlockSearches.set(provider, byAddress);
|
|
208
|
+
}
|
|
209
|
+
const key = address.toLowerCase();
|
|
210
|
+
const existing = byAddress.get(key);
|
|
211
|
+
if (existing !== void 0) return await existing;
|
|
212
|
+
const search = searchDeploymentBlock(provider, address);
|
|
213
|
+
byAddress.set(key, search);
|
|
214
|
+
const result = await search;
|
|
215
|
+
if (result === void 0) byAddress.delete(key);
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
function configuredDeploymentBlock(config) {
|
|
219
|
+
const chain = config?.chain;
|
|
220
|
+
const value = chain?.deploymentBlock;
|
|
221
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : void 0;
|
|
222
|
+
}
|
|
223
|
+
async function resolveContractDeploymentBlock(provider, address, logger) {
|
|
224
|
+
const found = await findContractDeploymentBlock(provider, address);
|
|
225
|
+
if (found !== void 0) {
|
|
226
|
+
logger?.log(`Resolved deployment block ${found} for ${address} via getCode search`);
|
|
227
|
+
return found;
|
|
228
|
+
}
|
|
229
|
+
const estimated = await estimateBlockNumberAt(provider);
|
|
230
|
+
logger?.warn(`Could not resolve deployment block for ${address} via getCode search; using date estimate ${estimated}`);
|
|
231
|
+
return estimated;
|
|
232
|
+
}
|
|
233
|
+
async function searchDeploymentBlock(provider, address) {
|
|
234
|
+
try {
|
|
235
|
+
const head = await provider.getBlockNumber();
|
|
236
|
+
if (await provider.getCode(address, head) === "0x") return void 0;
|
|
237
|
+
let lo = 0;
|
|
238
|
+
let hi = head;
|
|
239
|
+
while (lo < hi) {
|
|
240
|
+
const mid = Math.floor((lo + hi) / 2);
|
|
241
|
+
const code = await provider.getCode(address, mid);
|
|
242
|
+
if (code === "0x") {
|
|
243
|
+
lo = mid + 1;
|
|
244
|
+
} else {
|
|
245
|
+
hi = mid;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return lo;
|
|
249
|
+
} catch {
|
|
250
|
+
return void 0;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
201
254
|
// src/modules/ethereum/block/rate/blockRate.ts
|
|
202
255
|
import { isDefined, isFalsy } from "@ariestools/sdk";
|
|
203
256
|
import {
|
|
@@ -451,20 +504,17 @@ async function createChain(signer, stakingTokenAddress, initialBlockProducer, re
|
|
|
451
504
|
// src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
|
|
452
505
|
import {
|
|
453
506
|
assertEx as assertEx10,
|
|
454
|
-
exists,
|
|
455
507
|
isDefined as isDefined3,
|
|
456
|
-
toAddress as toAddress3
|
|
457
|
-
toEthAddress as toEthAddress8
|
|
508
|
+
toAddress as toAddress3
|
|
458
509
|
} from "@ariestools/sdk";
|
|
459
|
-
import {
|
|
460
|
-
IAddressStakingEvents__factory
|
|
461
|
-
} from "@xyo-network/typechain";
|
|
510
|
+
import { IAddressStakingEvents__factory } from "@xyo-network/typechain";
|
|
462
511
|
import {
|
|
463
512
|
creatableProvider as creatableProvider4,
|
|
464
513
|
EvmChainViewerMoniker as EvmChainViewerMoniker4,
|
|
465
514
|
StakeEventsViewerMoniker
|
|
466
515
|
} from "@xyo-network/xl1-sdk";
|
|
467
516
|
import { asAttoXL1 } from "@xyo-network/xl1-sdk";
|
|
517
|
+
import { EventLog } from "ethers";
|
|
468
518
|
|
|
469
519
|
// src/modules/ethereum/providers/AbstractEvmProvider.ts
|
|
470
520
|
import {
|
|
@@ -702,6 +752,56 @@ EvmStakeTotalsViewer = __decorateClass([
|
|
|
702
752
|
creatableProvider3()
|
|
703
753
|
], EvmStakeTotalsViewer);
|
|
704
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
|
+
|
|
705
805
|
// src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts
|
|
706
806
|
import { delay } from "@ariestools/sdk";
|
|
707
807
|
|
|
@@ -844,19 +944,26 @@ var asEvmStakeWithdrawnEvent = zodAsFactory(EvmStakeWithdrawnEventZod, "asEvmSta
|
|
|
844
944
|
var toEvmStakeWithdrawnEvent = zodToFactory(EvmStakeWithdrawnEventZod, "toEvmStakeWithdrawnEvent");
|
|
845
945
|
|
|
846
946
|
// src/modules/ethereum/drivers/EvmStakeEventsViewer.ts
|
|
847
|
-
var
|
|
947
|
+
var DEFAULT_EVENT_QUERY_START_CHUNK_SIZE = 1e5;
|
|
948
|
+
var MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE = 1e3;
|
|
848
949
|
var DEFAULT_EVENT_QUERY_MAX_ATTEMPTS = 8;
|
|
849
950
|
var DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS = 1e3;
|
|
951
|
+
var STAKE_EVENT_NAMES = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
|
|
850
952
|
var EvmStakeEventsViewer = class extends AbstractEvmViewer {
|
|
851
953
|
moniker = EvmStakeEventsViewer.defaultMoniker;
|
|
852
|
-
/**
|
|
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). */
|
|
853
960
|
defaultDeploymentBlock = 0;
|
|
854
961
|
eventCache = /* @__PURE__ */ new Map();
|
|
855
962
|
get deploymentBlock() {
|
|
856
|
-
return this.params.deploymentBlock ?? this.defaultDeploymentBlock;
|
|
963
|
+
return this.params.deploymentBlock ?? this.config.chain?.deploymentBlock ?? this.defaultDeploymentBlock;
|
|
857
964
|
}
|
|
858
965
|
get eventQueryBlockChunkSize() {
|
|
859
|
-
return this.
|
|
966
|
+
return this.fixedEventQueryBlockChunkSize ?? this.adaptiveChunkSize ?? DEFAULT_EVENT_QUERY_START_CHUNK_SIZE;
|
|
860
967
|
}
|
|
861
968
|
get eventQueryInitialDelayMs() {
|
|
862
969
|
return this.params.eventQueryInitialDelayMs ?? DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS;
|
|
@@ -864,6 +971,15 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
|
|
|
864
971
|
get eventQueryMaxAttempts() {
|
|
865
972
|
return this.params.eventQueryMaxAttempts ?? DEFAULT_EVENT_QUERY_MAX_ATTEMPTS;
|
|
866
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
|
+
}
|
|
867
983
|
async positionCount(range) {
|
|
868
984
|
const events = await this.stakeEvents(range);
|
|
869
985
|
const positionIds = events.map((e) => e.args.id);
|
|
@@ -928,7 +1044,7 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
|
|
|
928
1044
|
const provider = assertEx10(this.contract.runner?.provider, () => new Error("Failed to get provider"));
|
|
929
1045
|
const historyEndBlock = assertEx10(await provider.getBlockNumber(), () => new Error("Failed to get currentEthBlock"));
|
|
930
1046
|
if (!isDefined3(this.params.deploymentBlock)) {
|
|
931
|
-
this.defaultDeploymentBlock = await
|
|
1047
|
+
this.defaultDeploymentBlock = configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(provider, this.address, this.logger);
|
|
932
1048
|
}
|
|
933
1049
|
await this.loadHistoricalEvents(this.deploymentBlock, historyEndBlock);
|
|
934
1050
|
await this.attachLiveListeners();
|
|
@@ -952,69 +1068,71 @@ var EvmStakeEventsViewer = class extends AbstractEvmViewer {
|
|
|
952
1068
|
this.onEventHandler(staked, staker, id, amount, event);
|
|
953
1069
|
});
|
|
954
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
|
+
*/
|
|
955
1080
|
async loadHistoricalEvents(fromBlock, toBlock) {
|
|
956
1081
|
if (fromBlock > toBlock) {
|
|
957
1082
|
return;
|
|
958
1083
|
}
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
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) {
|
|
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;
|
|
992
1091
|
try {
|
|
993
|
-
|
|
994
|
-
|
|
1092
|
+
logs = await withRpcRateLimitBackoff(
|
|
1093
|
+
// '*' = every event on the contract address; parsed against the ABI
|
|
1094
|
+
() => this.contract.queryFilter("*", cursor, chunkTo),
|
|
995
1095
|
{
|
|
996
1096
|
initialDelayMs: this.eventQueryInitialDelayMs,
|
|
997
1097
|
maxAttempts: this.eventQueryMaxAttempts,
|
|
998
1098
|
onRetry: (_error, attempt, delayMs) => {
|
|
999
1099
|
this.logger?.warn(
|
|
1000
|
-
`Rate limited fetching
|
|
1100
|
+
`Rate limited fetching logs for blocks ${cursor}-${chunkTo} (attempt ${attempt}/${this.eventQueryMaxAttempts}); backing off ${delayMs}ms`
|
|
1001
1101
|
);
|
|
1002
1102
|
}
|
|
1003
1103
|
}
|
|
1004
|
-
)
|
|
1104
|
+
);
|
|
1005
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
|
+
}
|
|
1006
1117
|
this.logger?.error(
|
|
1007
|
-
`eth_getLogs failed for
|
|
1118
|
+
`eth_getLogs failed for blocks ${cursor}-${chunkTo} (from=${fromBlock} to=${toBlock}):`,
|
|
1008
1119
|
error
|
|
1009
1120
|
);
|
|
1010
1121
|
throw error;
|
|
1011
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;
|
|
1012
1132
|
}
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e, true);
|
|
1017
|
-
}).filter(exists);
|
|
1133
|
+
this.logger?.log(
|
|
1134
|
+
`Cached ${eventCount} stake events from blocks ${fromBlock}-${toBlock} (${chunkCount} chunk(s), final chunk size ${this.eventQueryBlockChunkSize})`
|
|
1135
|
+
);
|
|
1018
1136
|
}
|
|
1019
1137
|
};
|
|
1020
1138
|
__publicField(EvmStakeEventsViewer, "connectionTypes", ["evm-rpc"]);
|
|
@@ -1029,9 +1147,8 @@ EvmStakeEventsViewer = __decorateClass([
|
|
|
1029
1147
|
// src/modules/ethereum/drivers/EvmStakeViewer.ts
|
|
1030
1148
|
import {
|
|
1031
1149
|
assertEx as assertEx11,
|
|
1032
|
-
isDefined as isDefined4,
|
|
1033
1150
|
toAddress as toAddress4,
|
|
1034
|
-
toEthAddress as
|
|
1151
|
+
toEthAddress as toEthAddress8
|
|
1035
1152
|
} from "@ariestools/sdk";
|
|
1036
1153
|
import { IAddressStaking__factory } from "@xyo-network/typechain";
|
|
1037
1154
|
import {
|
|
@@ -1070,12 +1187,12 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
|
|
|
1070
1187
|
}
|
|
1071
1188
|
async activeByAddressStaked(address) {
|
|
1072
1189
|
return await this._callMutex.runExclusive(async () => {
|
|
1073
|
-
return await this.contract.activeByAddressStaked(
|
|
1190
|
+
return await this.contract.activeByAddressStaked(toEthAddress8(address));
|
|
1074
1191
|
});
|
|
1075
1192
|
}
|
|
1076
1193
|
async activeByStaker(address) {
|
|
1077
1194
|
return await this._callMutex.runExclusive(async () => {
|
|
1078
|
-
return await this.contract.activeByStaker(
|
|
1195
|
+
return await this.contract.activeByStaker(toEthAddress8(address));
|
|
1079
1196
|
});
|
|
1080
1197
|
}
|
|
1081
1198
|
activeStakes() {
|
|
@@ -1084,7 +1201,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
|
|
|
1084
1201
|
async createHandler() {
|
|
1085
1202
|
await super.createHandler();
|
|
1086
1203
|
this._stakeEventsViewer = await this.locator.getInstance(StakeEventsViewerMoniker2);
|
|
1087
|
-
this._deploymentBlock =
|
|
1204
|
+
this._deploymentBlock = this.params.deploymentBlock ?? configuredDeploymentBlock(this.config) ?? await resolveContractDeploymentBlock(this.provider, this.address, this.logger);
|
|
1088
1205
|
}
|
|
1089
1206
|
minWithdrawalBlocks() {
|
|
1090
1207
|
return 0;
|
|
@@ -1096,7 +1213,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
|
|
|
1096
1213
|
}
|
|
1097
1214
|
async pendingByStaker(staker) {
|
|
1098
1215
|
return await this._callMutex.runExclusive(async () => {
|
|
1099
|
-
return await this.contract.pendingByStaker(
|
|
1216
|
+
return await this.contract.pendingByStaker(toEthAddress8(staker));
|
|
1100
1217
|
});
|
|
1101
1218
|
}
|
|
1102
1219
|
removedStakes() {
|
|
@@ -1121,7 +1238,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
|
|
|
1121
1238
|
}
|
|
1122
1239
|
async stakeByStaker(staker, slot) {
|
|
1123
1240
|
return await this._callMutex.runExclusive(async () => {
|
|
1124
|
-
const ethResult = await this.contract.getStake(
|
|
1241
|
+
const ethResult = await this.contract.getStake(toEthAddress8(staker), slot);
|
|
1125
1242
|
const stake = ethStakeToStake(ethResult);
|
|
1126
1243
|
this._stakeCache.set(stake.id, stake);
|
|
1127
1244
|
return stake;
|
|
@@ -1163,7 +1280,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
|
|
|
1163
1280
|
}
|
|
1164
1281
|
async withdrawnByStaker(staker) {
|
|
1165
1282
|
return await this._callMutex.runExclusive(async () => {
|
|
1166
|
-
return await this.contract.withdrawnByStaker(
|
|
1283
|
+
return await this.contract.withdrawnByStaker(toEthAddress8(staker));
|
|
1167
1284
|
});
|
|
1168
1285
|
}
|
|
1169
1286
|
withdrawnStakes() {
|
|
@@ -1243,7 +1360,7 @@ var EvmStakeViewer = class extends AbstractEvmViewer {
|
|
|
1243
1360
|
};
|
|
1244
1361
|
__publicField(EvmStakeViewer, "connectionTypes", ["evm-rpc"]);
|
|
1245
1362
|
__publicField(EvmStakeViewer, "defaultMoniker", StakeViewerMoniker);
|
|
1246
|
-
__publicField(EvmStakeViewer, "dependencies", [EvmChainViewerMoniker5]);
|
|
1363
|
+
__publicField(EvmStakeViewer, "dependencies", [EvmChainViewerMoniker5, StakeEventsViewerMoniker2]);
|
|
1247
1364
|
__publicField(EvmStakeViewer, "monikers", [StakeViewerMoniker]);
|
|
1248
1365
|
__publicField(EvmStakeViewer, "surface", "node");
|
|
1249
1366
|
EvmStakeViewer = __decorateClass([
|
|
@@ -1259,19 +1376,234 @@ var getDefaultGasConfig = () => {
|
|
|
1259
1376
|
gasPrice: parseUnits2("100", "gwei")
|
|
1260
1377
|
};
|
|
1261
1378
|
};
|
|
1379
|
+
|
|
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
|
+
// src/modules/ethereum/indexing/RestStakeEventsViewer.ts
|
|
1442
|
+
import {
|
|
1443
|
+
assertEx as assertEx12,
|
|
1444
|
+
isDefined as isDefined4,
|
|
1445
|
+
toAddress as toAddress5,
|
|
1446
|
+
toEthAddress as toEthAddress9
|
|
1447
|
+
} from "@ariestools/sdk";
|
|
1448
|
+
import { IAddressStakingEvents__factory as IAddressStakingEvents__factory2 } from "@xyo-network/typechain";
|
|
1449
|
+
import {
|
|
1450
|
+
AbstractCreatableProvider as AbstractCreatableProvider2,
|
|
1451
|
+
asAttoXL1 as asAttoXL13,
|
|
1452
|
+
creatableProvider as creatableProvider6,
|
|
1453
|
+
resolveRestConnectionEndpoint,
|
|
1454
|
+
StakeEventsViewerMoniker as StakeEventsViewerMoniker3
|
|
1455
|
+
} from "@xyo-network/xl1-sdk";
|
|
1456
|
+
import { Interface } from "ethers";
|
|
1457
|
+
var STAKE_EVENT_NAMES2 = /* @__PURE__ */ new Set(["StakeAdded", "StakeRemoved", "StakeWithdrawn"]);
|
|
1458
|
+
var RestStakeEventsViewer = class extends AbstractCreatableProvider2 {
|
|
1459
|
+
moniker = RestStakeEventsViewer.defaultMoniker;
|
|
1460
|
+
completeFrames = /* @__PURE__ */ new Map();
|
|
1461
|
+
contractInterface = new Interface(IAddressStakingEvents__factory2.abi);
|
|
1462
|
+
currentHead;
|
|
1463
|
+
manifestPromise;
|
|
1464
|
+
stakeEventCache = [];
|
|
1465
|
+
syncPromise;
|
|
1466
|
+
tailFrame;
|
|
1467
|
+
get address() {
|
|
1468
|
+
return this.params.address;
|
|
1469
|
+
}
|
|
1470
|
+
get eventIndexBaseUrl() {
|
|
1471
|
+
return this.params.eventIndexBaseUrl;
|
|
1472
|
+
}
|
|
1473
|
+
get fetchFn() {
|
|
1474
|
+
return this.params.fetchFn ?? fetch.bind(globalThis);
|
|
1475
|
+
}
|
|
1476
|
+
static async paramsHandler(params) {
|
|
1477
|
+
const contextConfig = params.context?.config;
|
|
1478
|
+
const address = params.address ?? toEthAddress9(assertEx12(contextConfig?.chain?.id, () => "RestStakeEventsViewer requires an address param or config.chain.id"));
|
|
1479
|
+
const moniker = this.defaultMoniker;
|
|
1480
|
+
const eventIndexBaseUrl = isDefined4(params.eventIndexBaseUrl) && params.eventIndexBaseUrl !== "" ? params.eventIndexBaseUrl : resolveRestConnectionEndpoint(
|
|
1481
|
+
assertEx12(contextConfig, () => "Context config is required to resolve the EVM event index endpoint"),
|
|
1482
|
+
moniker
|
|
1483
|
+
);
|
|
1484
|
+
return {
|
|
1485
|
+
...await super.paramsHandler(params),
|
|
1486
|
+
address,
|
|
1487
|
+
eventIndexBaseUrl: eventIndexBaseUrl.replace(/\/+$/, ""),
|
|
1488
|
+
fetchFn: params.fetchFn
|
|
1489
|
+
};
|
|
1490
|
+
}
|
|
1491
|
+
async positionCount(range) {
|
|
1492
|
+
const events = await this.stakeEvents(range);
|
|
1493
|
+
return Math.max(-1, ...events.map((event) => event.args.id)) + 1;
|
|
1494
|
+
}
|
|
1495
|
+
async stakeEvents(range = [0, "latest"], filter) {
|
|
1496
|
+
await this.sync();
|
|
1497
|
+
return this.stakeEventCache.filter((event) => this.matchesFilter(event, range, filter));
|
|
1498
|
+
}
|
|
1499
|
+
decodeIndexedStakeEvents() {
|
|
1500
|
+
const frames = [...this.completeFrames.entries()].sort(([a], [b]) => a - b).map(([, frame]) => frame);
|
|
1501
|
+
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);
|
|
1502
|
+
return logs.flatMap((log) => {
|
|
1503
|
+
const event = this.stakeEventFromLog(log);
|
|
1504
|
+
return event === void 0 ? [] : [event];
|
|
1505
|
+
});
|
|
1506
|
+
}
|
|
1507
|
+
async fetchJson(path) {
|
|
1508
|
+
const response = await this.fetchFn(`${this.eventIndexBaseUrl}/${path}`);
|
|
1509
|
+
assertEx12(response.ok, () => `EVM event index request failed [${response.status}] for ${path}`);
|
|
1510
|
+
return await response.json();
|
|
1511
|
+
}
|
|
1512
|
+
async getManifest() {
|
|
1513
|
+
this.manifestPromise ??= (async () => {
|
|
1514
|
+
const manifest = asEvmEventIndexManifest(await this.fetchJson(evmEventIndexManifestPath(this.address)), true);
|
|
1515
|
+
assertEx12(manifest.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index manifest address mismatch");
|
|
1516
|
+
return manifest;
|
|
1517
|
+
})();
|
|
1518
|
+
return await this.manifestPromise;
|
|
1519
|
+
}
|
|
1520
|
+
// eslint-disable-next-line complexity
|
|
1521
|
+
matchesFilter(event, range, filter) {
|
|
1522
|
+
if (range[1] !== "latest" && event.time > range[1]) return false;
|
|
1523
|
+
if (event.time < range[0]) return false;
|
|
1524
|
+
if (isDefined4(filter?.name) && event.name !== filter.name) return false;
|
|
1525
|
+
if (isDefined4(filter?.args?.id) && event.args.id !== filter.args.id) return false;
|
|
1526
|
+
if (isDefined4(filter?.args?.staked) && event.args.staked !== filter.args.staked) return false;
|
|
1527
|
+
if (isDefined4(filter?.args?.staker) && event.args.staker !== filter.args.staker) return false;
|
|
1528
|
+
return true;
|
|
1529
|
+
}
|
|
1530
|
+
stakeEventFromLog(log) {
|
|
1531
|
+
const parsed = this.contractInterface.parseLog({ data: log.data, topics: log.topics });
|
|
1532
|
+
if (parsed === null || !STAKE_EVENT_NAMES2.has(parsed.name)) return;
|
|
1533
|
+
const [staked, staker, id, amount] = parsed.args;
|
|
1534
|
+
return {
|
|
1535
|
+
name: parsed.name,
|
|
1536
|
+
args: {
|
|
1537
|
+
amount: asAttoXL13(amount),
|
|
1538
|
+
id: Number(id),
|
|
1539
|
+
staked: toAddress5(staked),
|
|
1540
|
+
staker: toAddress5(staker)
|
|
1541
|
+
},
|
|
1542
|
+
time: log.blockNumber
|
|
1543
|
+
};
|
|
1544
|
+
}
|
|
1545
|
+
async sync() {
|
|
1546
|
+
this.syncPromise ??= this.syncFromHead().finally(() => {
|
|
1547
|
+
this.syncPromise = void 0;
|
|
1548
|
+
});
|
|
1549
|
+
await this.syncPromise;
|
|
1550
|
+
}
|
|
1551
|
+
async syncFromHead() {
|
|
1552
|
+
const manifest = await this.getManifest();
|
|
1553
|
+
const head = asEvmEventIndexHead(await this.fetchJson(evmEventIndexHeadPath(this.address)), true);
|
|
1554
|
+
assertEx12(head.address.toLowerCase() === this.address.toLowerCase(), () => "EVM event index head address mismatch");
|
|
1555
|
+
assertEx12(head.chainId === manifest.chainId, () => "EVM event index chain mismatch");
|
|
1556
|
+
if (this.currentHead?.block === head.block && this.currentHead.hash === head.hash) return;
|
|
1557
|
+
if (this.currentHead !== void 0 && (head.block < this.currentHead.block || head.block === this.currentHead.block && head.hash !== this.currentHead.hash)) {
|
|
1558
|
+
this.completeFrames.clear();
|
|
1559
|
+
this.tailFrame = void 0;
|
|
1560
|
+
}
|
|
1561
|
+
const indexedBlockCount = Math.max(0, head.block - manifest.deploymentBlock + 1);
|
|
1562
|
+
const completeFrameCount = Math.floor(indexedBlockCount / manifest.frameSize);
|
|
1563
|
+
const missingFrameIndexes = Array.from({ length: completeFrameCount }, (_, index) => index).filter((index) => !this.completeFrames.has(index));
|
|
1564
|
+
await Promise.all(missingFrameIndexes.map(async (index) => {
|
|
1565
|
+
const frame = asEvmEventIndexFrame(await this.fetchJson(evmEventIndexFramePath(this.address, index)), true);
|
|
1566
|
+
const expectedFrom = manifest.deploymentBlock + index * manifest.frameSize;
|
|
1567
|
+
assertEx12(frame.fromBlock === expectedFrom, () => `EVM event index frame ${index} starts at the wrong block`);
|
|
1568
|
+
assertEx12(frame.toBlock === expectedFrom + manifest.frameSize - 1, () => `EVM event index frame ${index} is incomplete`);
|
|
1569
|
+
this.completeFrames.set(index, frame);
|
|
1570
|
+
}));
|
|
1571
|
+
const tailStart = manifest.deploymentBlock + completeFrameCount * manifest.frameSize;
|
|
1572
|
+
this.tailFrame = tailStart <= head.block ? asEvmEventIndexFrame(await this.fetchJson(`${evmEventIndexTailPath(this.address)}?head=${head.hash}`), true) : void 0;
|
|
1573
|
+
if (this.tailFrame !== void 0) {
|
|
1574
|
+
assertEx12(this.tailFrame.fromBlock === tailStart, () => "EVM event index tail starts at the wrong block");
|
|
1575
|
+
assertEx12(this.tailFrame.toBlock === head.block, () => "EVM event index tail is stale relative to its head");
|
|
1576
|
+
}
|
|
1577
|
+
this.stakeEventCache = this.decodeIndexedStakeEvents();
|
|
1578
|
+
this.currentHead = head;
|
|
1579
|
+
}
|
|
1580
|
+
};
|
|
1581
|
+
__publicField(RestStakeEventsViewer, "connectionTypes", ["rest"]);
|
|
1582
|
+
__publicField(RestStakeEventsViewer, "defaultMoniker", StakeEventsViewerMoniker3);
|
|
1583
|
+
__publicField(RestStakeEventsViewer, "dependencies", []);
|
|
1584
|
+
__publicField(RestStakeEventsViewer, "monikers", [StakeEventsViewerMoniker3]);
|
|
1585
|
+
__publicField(RestStakeEventsViewer, "surface", "node");
|
|
1586
|
+
RestStakeEventsViewer = __decorateClass([
|
|
1587
|
+
creatableProvider6()
|
|
1588
|
+
], RestStakeEventsViewer);
|
|
1262
1589
|
export {
|
|
1263
1590
|
AbstractEvmProvider,
|
|
1264
1591
|
AbstractEvmRunner,
|
|
1265
1592
|
AbstractEvmViewer,
|
|
1266
1593
|
BaseEthProvider,
|
|
1267
1594
|
DEFAULT_ESTIMATE_BLOCK_DATE,
|
|
1268
|
-
DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE,
|
|
1269
1595
|
DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS,
|
|
1270
1596
|
DEFAULT_EVENT_QUERY_MAX_ATTEMPTS,
|
|
1597
|
+
DEFAULT_EVENT_QUERY_START_CHUNK_SIZE,
|
|
1271
1598
|
DEFAULT_EVM_BLOCK_TIME_SEC,
|
|
1272
1599
|
EthHashRegEx,
|
|
1273
1600
|
EthHashZod,
|
|
1274
1601
|
EvmChainContractViewer,
|
|
1602
|
+
EvmEventIndexFrameZod,
|
|
1603
|
+
EvmEventIndexHeadZod,
|
|
1604
|
+
EvmEventIndexLogZod,
|
|
1605
|
+
EvmEventIndexManifestZod,
|
|
1606
|
+
EvmEventIndexPublishRunnerMoniker,
|
|
1275
1607
|
EvmStakeAddedEventNameZod,
|
|
1276
1608
|
EvmStakeAddedEventZod,
|
|
1277
1609
|
EvmStakeEventArgsZod,
|
|
@@ -1285,6 +1617,11 @@ export {
|
|
|
1285
1617
|
EvmStakeViewer,
|
|
1286
1618
|
EvmStakeWithdrawnEventNameZod,
|
|
1287
1619
|
EvmStakeWithdrawnEventZod,
|
|
1620
|
+
MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,
|
|
1621
|
+
RestStakeEventsViewer,
|
|
1622
|
+
asEvmEventIndexFrame,
|
|
1623
|
+
asEvmEventIndexHead,
|
|
1624
|
+
asEvmEventIndexManifest,
|
|
1288
1625
|
asEvmStakeAddedEvent,
|
|
1289
1626
|
asEvmStakeEvent,
|
|
1290
1627
|
asEvmStakeRemovedEvent,
|
|
@@ -1292,23 +1629,34 @@ export {
|
|
|
1292
1629
|
blockRangeChunks,
|
|
1293
1630
|
calculateEthBlockRate,
|
|
1294
1631
|
calculateEthTimeRate,
|
|
1632
|
+
configuredDeploymentBlock,
|
|
1295
1633
|
createChain,
|
|
1296
1634
|
createChainContract,
|
|
1297
1635
|
createChainRewardsContract,
|
|
1298
1636
|
estimateBlockNumberAt,
|
|
1299
1637
|
estimateBlockNumberFromHead,
|
|
1300
1638
|
ethBlockRate,
|
|
1639
|
+
evmEventIndexFramePath,
|
|
1640
|
+
evmEventIndexHeadPath,
|
|
1641
|
+
evmEventIndexManifestPath,
|
|
1642
|
+
evmEventIndexTailPath,
|
|
1643
|
+
findContractDeploymentBlock,
|
|
1301
1644
|
getDefaultGasConfig,
|
|
1302
1645
|
getEthBlockRateBlocks,
|
|
1303
1646
|
isEvmStakeAddedEvent,
|
|
1304
1647
|
isEvmStakeEvent,
|
|
1305
1648
|
isEvmStakeRemovedEvent,
|
|
1306
1649
|
isEvmStakeWithdrawnEvent,
|
|
1650
|
+
isRpcRangeLimitError,
|
|
1651
|
+
isRpcRateLimitError,
|
|
1307
1652
|
nextContractAddress,
|
|
1308
1653
|
nextContractAddressForAddress,
|
|
1654
|
+
resolveContractDeploymentBlock,
|
|
1655
|
+
rpcRangeLimitFromError,
|
|
1309
1656
|
toEvmStakeAddedEvent,
|
|
1310
1657
|
toEvmStakeEvent,
|
|
1311
1658
|
toEvmStakeRemovedEvent,
|
|
1312
|
-
toEvmStakeWithdrawnEvent
|
|
1659
|
+
toEvmStakeWithdrawnEvent,
|
|
1660
|
+
withRpcRateLimitBackoff
|
|
1313
1661
|
};
|
|
1314
1662
|
//# sourceMappingURL=ethereum.mjs.map
|