envio 3.0.0-alpha.2 → 3.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +2 -2
  2. package/evm.schema.json +44 -34
  3. package/fuel.schema.json +32 -21
  4. package/index.d.ts +4 -1
  5. package/index.js +1 -0
  6. package/package.json +7 -6
  7. package/src/Batch.res.mjs +1 -1
  8. package/src/Benchmark.res +394 -0
  9. package/src/Benchmark.res.mjs +398 -0
  10. package/src/ChainFetcher.res +459 -0
  11. package/src/ChainFetcher.res.mjs +281 -0
  12. package/src/ChainManager.res +179 -0
  13. package/src/ChainManager.res.mjs +139 -0
  14. package/src/Config.res +15 -1
  15. package/src/Config.res.mjs +28 -5
  16. package/src/Ecosystem.res +9 -124
  17. package/src/Ecosystem.res.mjs +19 -160
  18. package/src/Env.res +0 -1
  19. package/src/Env.res.mjs +0 -3
  20. package/src/Envio.gen.ts +9 -1
  21. package/src/Envio.res +12 -9
  22. package/src/EventProcessing.res +476 -0
  23. package/src/EventProcessing.res.mjs +341 -0
  24. package/src/FetchState.res +54 -29
  25. package/src/FetchState.res.mjs +62 -35
  26. package/src/GlobalState.res +1169 -0
  27. package/src/GlobalState.res.mjs +1196 -0
  28. package/src/Internal.res +43 -1
  29. package/src/LoadLayer.res +444 -0
  30. package/src/LoadLayer.res.mjs +296 -0
  31. package/src/LoadLayer.resi +32 -0
  32. package/src/Prometheus.res +8 -8
  33. package/src/Prometheus.res.mjs +10 -10
  34. package/src/ReorgDetection.res +6 -10
  35. package/src/ReorgDetection.res.mjs +6 -6
  36. package/src/Types.ts +1 -1
  37. package/src/UserContext.res +356 -0
  38. package/src/UserContext.res.mjs +238 -0
  39. package/src/Utils.res +15 -0
  40. package/src/Utils.res.mjs +18 -0
  41. package/src/bindings/ClickHouse.res +31 -1
  42. package/src/bindings/ClickHouse.res.mjs +27 -1
  43. package/src/bindings/DateFns.res +71 -0
  44. package/src/bindings/DateFns.res.mjs +22 -0
  45. package/src/bindings/Ethers.res +27 -63
  46. package/src/bindings/Ethers.res.mjs +18 -65
  47. package/src/sources/Evm.res +87 -0
  48. package/src/sources/Evm.res.mjs +105 -0
  49. package/src/sources/EvmChain.res +95 -0
  50. package/src/sources/EvmChain.res.mjs +61 -0
  51. package/src/sources/Fuel.res +19 -34
  52. package/src/sources/Fuel.res.mjs +34 -16
  53. package/src/sources/FuelSDK.res +37 -0
  54. package/src/sources/FuelSDK.res.mjs +29 -0
  55. package/src/sources/HyperFuel.res +2 -2
  56. package/src/sources/HyperFuel.resi +1 -1
  57. package/src/sources/HyperFuelClient.res +2 -2
  58. package/src/sources/HyperFuelSource.res +8 -8
  59. package/src/sources/HyperFuelSource.res.mjs +5 -5
  60. package/src/sources/HyperSyncHeightStream.res +28 -110
  61. package/src/sources/HyperSyncHeightStream.res.mjs +30 -63
  62. package/src/sources/HyperSyncSource.res +16 -18
  63. package/src/sources/HyperSyncSource.res.mjs +25 -25
  64. package/src/sources/Rpc.res +43 -0
  65. package/src/sources/Rpc.res.mjs +31 -0
  66. package/src/sources/RpcSource.res +13 -8
  67. package/src/sources/RpcSource.res.mjs +12 -7
  68. package/src/sources/Source.res +3 -2
  69. package/src/sources/SourceManager.res +183 -108
  70. package/src/sources/SourceManager.res.mjs +162 -99
  71. package/src/sources/SourceManager.resi +4 -5
  72. package/src/sources/Svm.res +59 -0
  73. package/src/sources/Svm.res.mjs +79 -0
  74. package/src/bindings/Ethers.gen.ts +0 -14
@@ -0,0 +1,1196 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Env from "./Env.res.mjs";
4
+ import * as Batch from "./Batch.res.mjs";
5
+ import * as Utils from "./Utils.res.mjs";
6
+ import * as Config from "./Config.res.mjs";
7
+ import * as Hrtime from "./bindings/Hrtime.res.mjs";
8
+ import * as Js_exn from "rescript/lib/es6/js_exn.js";
9
+ import * as Js_null from "rescript/lib/es6/js_null.js";
10
+ import * as Logging from "./Logging.res.mjs";
11
+ import * as Process from "process";
12
+ import * as Belt_Int from "rescript/lib/es6/belt_Int.js";
13
+ import * as Caml_obj from "rescript/lib/es6/caml_obj.js";
14
+ import * as ChainMap from "./ChainMap.res.mjs";
15
+ import * as Benchmark from "./Benchmark.res.mjs";
16
+ import * as Throttler from "./Throttler.res.mjs";
17
+ import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
18
+ import * as FetchState from "./FetchState.res.mjs";
19
+ import * as Prometheus from "./Prometheus.res.mjs";
20
+ import * as Belt_Option from "rescript/lib/es6/belt_Option.js";
21
+ import * as Caml_option from "rescript/lib/es6/caml_option.js";
22
+ import * as LoadManager from "./LoadManager.res.mjs";
23
+ import * as Persistence from "./Persistence.res.mjs";
24
+ import * as ChainFetcher from "./ChainFetcher.res.mjs";
25
+ import * as ChainManager from "./ChainManager.res.mjs";
26
+ import * as ErrorHandling from "./ErrorHandling.res.mjs";
27
+ import * as InMemoryStore from "./InMemoryStore.res.mjs";
28
+ import * as SourceManager from "./sources/SourceManager.res.mjs";
29
+ import * as ReorgDetection from "./ReorgDetection.res.mjs";
30
+ import * as EventProcessing from "./EventProcessing.res.mjs";
31
+ import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
32
+ import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
33
+ import * as SafeCheckpointTracking from "./SafeCheckpointTracking.res.mjs";
34
+
35
+ function make() {
36
+ var intervalMillis = Env.ThrottleWrites.chainMetadataIntervalMillis;
37
+ var logger = Logging.createChild({
38
+ context: "Throttler for chain metadata writes",
39
+ intervalMillis: intervalMillis
40
+ });
41
+ var chainMetaData = Throttler.make(intervalMillis, logger);
42
+ var intervalMillis$1 = Env.ThrottleWrites.pruneStaleDataIntervalMillis;
43
+ var logger$1 = Logging.createChild({
44
+ context: "Throttler for pruning stale entity history data",
45
+ intervalMillis: intervalMillis$1
46
+ });
47
+ var pruneStaleEntityHistory = Throttler.make(intervalMillis$1, logger$1);
48
+ return {
49
+ chainMetaData: chainMetaData,
50
+ pruneStaleEntityHistory: pruneStaleEntityHistory
51
+ };
52
+ }
53
+
54
+ var WriteThrottlers = {
55
+ make: make
56
+ };
57
+
58
+ function make$1(indexer, chainManager, isDevelopmentModeOpt, shouldUseTuiOpt) {
59
+ var isDevelopmentMode = isDevelopmentModeOpt !== undefined ? isDevelopmentModeOpt : false;
60
+ var shouldUseTui = shouldUseTuiOpt !== undefined ? shouldUseTuiOpt : false;
61
+ return {
62
+ indexer: indexer,
63
+ chainManager: chainManager,
64
+ processedBatches: 0,
65
+ currentlyProcessingBatch: false,
66
+ rollbackState: "NoRollback",
67
+ indexerStartTime: new Date(),
68
+ writeThrottlers: make(),
69
+ loadManager: LoadManager.make(),
70
+ keepProcessAlive: isDevelopmentMode || shouldUseTui,
71
+ id: 0
72
+ };
73
+ }
74
+
75
+ function getId(self) {
76
+ return self.id;
77
+ }
78
+
79
+ function incrementId(self) {
80
+ return {
81
+ indexer: self.indexer,
82
+ chainManager: self.chainManager,
83
+ processedBatches: self.processedBatches,
84
+ currentlyProcessingBatch: self.currentlyProcessingBatch,
85
+ rollbackState: self.rollbackState,
86
+ indexerStartTime: self.indexerStartTime,
87
+ writeThrottlers: self.writeThrottlers,
88
+ loadManager: self.loadManager,
89
+ keepProcessAlive: self.keepProcessAlive,
90
+ id: self.id + 1 | 0
91
+ };
92
+ }
93
+
94
+ function setChainManager(self, chainManager) {
95
+ return {
96
+ indexer: self.indexer,
97
+ chainManager: chainManager,
98
+ processedBatches: self.processedBatches,
99
+ currentlyProcessingBatch: self.currentlyProcessingBatch,
100
+ rollbackState: self.rollbackState,
101
+ indexerStartTime: self.indexerStartTime,
102
+ writeThrottlers: self.writeThrottlers,
103
+ loadManager: self.loadManager,
104
+ keepProcessAlive: self.keepProcessAlive,
105
+ id: self.id
106
+ };
107
+ }
108
+
109
+ function isPreparingRollback(state) {
110
+ var match = state.rollbackState;
111
+ if (typeof match !== "object") {
112
+ if (match === "NoRollback") {
113
+ return false;
114
+ } else {
115
+ return true;
116
+ }
117
+ } else if (match.TAG === "RollbackReady") {
118
+ return false;
119
+ } else {
120
+ return true;
121
+ }
122
+ }
123
+
124
+ function updateChainMetadataTable(cm, persistence, throttler) {
125
+ var chainsData = {};
126
+ Belt_Array.forEach(ChainMap.values(cm.chainFetchers), (function (cf) {
127
+ chainsData[String(cf.chainConfig.id)] = {
128
+ first_event_block: Js_null.fromOption(cf.firstEventBlockNumber),
129
+ buffer_block: FetchState.bufferBlockNumber(cf.fetchState),
130
+ source_block: cf.fetchState.knownHeight,
131
+ ready_at: Js_null.fromOption(cf.timestampCaughtUpToHeadOrEndblock),
132
+ _is_hyper_sync: SourceManager.getActiveSource(cf.sourceManager).poweredByHyperSync,
133
+ _num_batches_fetched: cf.numBatchesFetched
134
+ };
135
+ }));
136
+ Throttler.schedule(throttler, (function () {
137
+ return persistence.storage.setChainMeta(chainsData);
138
+ }));
139
+ }
140
+
141
+ function updateProgressedChains(chainManager, batch, indexer) {
142
+ Prometheus.ProgressBatchCount.increment();
143
+ var nextQueueItemIsNone = ChainManager.nextItemIsNone(chainManager);
144
+ var allChainsAtHead = ChainManager.isProgressAtHead(chainManager);
145
+ var chainFetchers = ChainMap.map(chainManager.chainFetchers, (function (cf) {
146
+ var chain = ChainMap.Chain.makeUnsafe(cf.chainConfig.id);
147
+ var maybeChainAfterBatch = batch.progressedChainsById[chain];
148
+ var cf$1;
149
+ if (maybeChainAfterBatch !== undefined) {
150
+ if (cf.committedProgressBlockNumber !== maybeChainAfterBatch.progressBlockNumber) {
151
+ Prometheus.ProgressBlockNumber.set(maybeChainAfterBatch.progressBlockNumber, chain);
152
+ }
153
+ if (cf.numEventsProcessed !== maybeChainAfterBatch.totalEventsProcessed) {
154
+ Prometheus.ProgressEventsCount.set(maybeChainAfterBatch.totalEventsProcessed, chain);
155
+ }
156
+ var eventItem = Batch.findLastEventItem(batch, chain);
157
+ if (eventItem !== undefined) {
158
+ var blockTimestamp = indexer.config.ecosystem.getTimestamp(eventItem.event.block);
159
+ var currentTimeMs = Date.now() | 0;
160
+ var blockTimestampMs = Math.imul(blockTimestamp, 1000);
161
+ var latencyMs = currentTimeMs - blockTimestampMs | 0;
162
+ Prometheus.ProgressLatency.set(latencyMs, chain);
163
+ }
164
+ var match = cf.firstEventBlockNumber;
165
+ var safeCheckpointTracking = cf.safeCheckpointTracking;
166
+ cf$1 = {
167
+ logger: cf.logger,
168
+ fetchState: cf.fetchState,
169
+ sourceManager: cf.sourceManager,
170
+ chainConfig: cf.chainConfig,
171
+ isProgressAtHead: cf.isProgressAtHead || maybeChainAfterBatch.isProgressAtHeadWhenBatchCreated,
172
+ timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
173
+ committedProgressBlockNumber: maybeChainAfterBatch.progressBlockNumber,
174
+ firstEventBlockNumber: match !== undefined ? cf.firstEventBlockNumber : Batch.findFirstEventBlockNumber(batch, chain),
175
+ numEventsProcessed: maybeChainAfterBatch.totalEventsProcessed,
176
+ numBatchesFetched: cf.numBatchesFetched,
177
+ reorgDetection: cf.reorgDetection,
178
+ safeCheckpointTracking: safeCheckpointTracking !== undefined ? SafeCheckpointTracking.updateOnNewBatch(safeCheckpointTracking, cf.fetchState.knownHeight, chain, batch.checkpointIds, batch.checkpointBlockNumbers, batch.checkpointChainIds) : undefined
179
+ };
180
+ } else {
181
+ cf$1 = cf;
182
+ }
183
+ if (ChainFetcher.hasProcessedToEndblock(cf$1)) {
184
+ var timestampCaughtUpToHeadOrEndblock = Belt_Option.isSome(cf$1.timestampCaughtUpToHeadOrEndblock) ? cf$1.timestampCaughtUpToHeadOrEndblock : Caml_option.some(new Date());
185
+ return {
186
+ logger: cf$1.logger,
187
+ fetchState: cf$1.fetchState,
188
+ sourceManager: cf$1.sourceManager,
189
+ chainConfig: cf$1.chainConfig,
190
+ isProgressAtHead: cf$1.isProgressAtHead,
191
+ timestampCaughtUpToHeadOrEndblock: timestampCaughtUpToHeadOrEndblock,
192
+ committedProgressBlockNumber: cf$1.committedProgressBlockNumber,
193
+ firstEventBlockNumber: cf$1.firstEventBlockNumber,
194
+ numEventsProcessed: cf$1.numEventsProcessed,
195
+ numBatchesFetched: cf$1.numBatchesFetched,
196
+ reorgDetection: cf$1.reorgDetection,
197
+ safeCheckpointTracking: cf$1.safeCheckpointTracking
198
+ };
199
+ }
200
+ if (!(Belt_Option.isNone(cf$1.timestampCaughtUpToHeadOrEndblock) && cf$1.isProgressAtHead)) {
201
+ return cf$1;
202
+ }
203
+ if (nextQueueItemIsNone && allChainsAtHead) {
204
+ return {
205
+ logger: cf$1.logger,
206
+ fetchState: cf$1.fetchState,
207
+ sourceManager: cf$1.sourceManager,
208
+ chainConfig: cf$1.chainConfig,
209
+ isProgressAtHead: cf$1.isProgressAtHead,
210
+ timestampCaughtUpToHeadOrEndblock: Caml_option.some(new Date()),
211
+ committedProgressBlockNumber: cf$1.committedProgressBlockNumber,
212
+ firstEventBlockNumber: cf$1.firstEventBlockNumber,
213
+ numEventsProcessed: cf$1.numEventsProcessed,
214
+ numBatchesFetched: cf$1.numBatchesFetched,
215
+ reorgDetection: cf$1.reorgDetection,
216
+ safeCheckpointTracking: cf$1.safeCheckpointTracking
217
+ };
218
+ }
219
+ var hasNoMoreEventsToProcess = ChainFetcher.hasNoMoreEventsToProcess(cf$1);
220
+ if (hasNoMoreEventsToProcess) {
221
+ return {
222
+ logger: cf$1.logger,
223
+ fetchState: cf$1.fetchState,
224
+ sourceManager: cf$1.sourceManager,
225
+ chainConfig: cf$1.chainConfig,
226
+ isProgressAtHead: cf$1.isProgressAtHead,
227
+ timestampCaughtUpToHeadOrEndblock: Caml_option.some(new Date()),
228
+ committedProgressBlockNumber: cf$1.committedProgressBlockNumber,
229
+ firstEventBlockNumber: cf$1.firstEventBlockNumber,
230
+ numEventsProcessed: cf$1.numEventsProcessed,
231
+ numBatchesFetched: cf$1.numBatchesFetched,
232
+ reorgDetection: cf$1.reorgDetection,
233
+ safeCheckpointTracking: cf$1.safeCheckpointTracking
234
+ };
235
+ } else {
236
+ return cf$1;
237
+ }
238
+ }));
239
+ var allChainsSyncedAtHead = Belt_Array.every(ChainMap.values(chainFetchers), (function (cf) {
240
+ return Belt_Option.isSome(cf.timestampCaughtUpToHeadOrEndblock);
241
+ }));
242
+ if (allChainsSyncedAtHead) {
243
+ Prometheus.setAllChainsSyncedToHead();
244
+ }
245
+ var checkpointId = Utils.$$Array.last(batch.checkpointIds);
246
+ return {
247
+ committedCheckpointId: checkpointId !== undefined ? checkpointId : chainManager.committedCheckpointId,
248
+ chainFetchers: chainFetchers,
249
+ multichain: chainManager.multichain,
250
+ isInReorgThreshold: chainManager.isInReorgThreshold
251
+ };
252
+ }
253
+
254
+ function validatePartitionQueryResponse(state, partitionQueryResponse) {
255
+ var query = partitionQueryResponse.query;
256
+ var response = partitionQueryResponse.response;
257
+ var chain = partitionQueryResponse.chain;
258
+ var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
259
+ var stats = response.stats;
260
+ var knownHeight = response.knownHeight;
261
+ if (knownHeight > chainFetcher.fetchState.knownHeight) {
262
+ Prometheus.SourceHeight.set(SourceManager.getActiveSource(chainFetcher.sourceManager).name, chainFetcher.chainConfig.id, knownHeight);
263
+ }
264
+ if (Env.Benchmark.shouldSaveData) {
265
+ var tmp;
266
+ var tmp$1 = query.target;
267
+ tmp = typeof tmp$1 !== "object" ? (
268
+ query.selection.dependsOnAddresses ? "Normal Query" : "Wildcard Query"
269
+ ) : (
270
+ tmp$1.TAG === "EndBlock" ? (
271
+ query.selection.dependsOnAddresses ? "Normal Query" : "Wildcard Query"
272
+ ) : "Merge Query"
273
+ );
274
+ Benchmark.addBlockRangeFetched(stats["total time elapsed (ms)"], Belt_Option.getWithDefault(stats["parsing time (ms)"], 0), Belt_Option.getWithDefault(stats["page fetch time (ms)"], 0), chain, response.fromBlockQueried, response.latestFetchedBlockNumber, response.parsedQueueItems.length, FetchState.addressesByContractNameCount(query.addressesByContractName), tmp);
275
+ }
276
+ var match = ReorgDetection.registerReorgGuard(chainFetcher.reorgDetection, response.reorgGuard, knownHeight);
277
+ var reorgResult = match[1];
278
+ var updatedChainFetcher_logger = chainFetcher.logger;
279
+ var updatedChainFetcher_fetchState = chainFetcher.fetchState;
280
+ var updatedChainFetcher_sourceManager = chainFetcher.sourceManager;
281
+ var updatedChainFetcher_chainConfig = chainFetcher.chainConfig;
282
+ var updatedChainFetcher_isProgressAtHead = chainFetcher.isProgressAtHead;
283
+ var updatedChainFetcher_timestampCaughtUpToHeadOrEndblock = chainFetcher.timestampCaughtUpToHeadOrEndblock;
284
+ var updatedChainFetcher_committedProgressBlockNumber = chainFetcher.committedProgressBlockNumber;
285
+ var updatedChainFetcher_firstEventBlockNumber = chainFetcher.firstEventBlockNumber;
286
+ var updatedChainFetcher_numEventsProcessed = chainFetcher.numEventsProcessed;
287
+ var updatedChainFetcher_numBatchesFetched = chainFetcher.numBatchesFetched;
288
+ var updatedChainFetcher_reorgDetection = match[0];
289
+ var updatedChainFetcher_safeCheckpointTracking = chainFetcher.safeCheckpointTracking;
290
+ var updatedChainFetcher = {
291
+ logger: updatedChainFetcher_logger,
292
+ fetchState: updatedChainFetcher_fetchState,
293
+ sourceManager: updatedChainFetcher_sourceManager,
294
+ chainConfig: updatedChainFetcher_chainConfig,
295
+ isProgressAtHead: updatedChainFetcher_isProgressAtHead,
296
+ timestampCaughtUpToHeadOrEndblock: updatedChainFetcher_timestampCaughtUpToHeadOrEndblock,
297
+ committedProgressBlockNumber: updatedChainFetcher_committedProgressBlockNumber,
298
+ firstEventBlockNumber: updatedChainFetcher_firstEventBlockNumber,
299
+ numEventsProcessed: updatedChainFetcher_numEventsProcessed,
300
+ numBatchesFetched: updatedChainFetcher_numBatchesFetched,
301
+ reorgDetection: updatedChainFetcher_reorgDetection,
302
+ safeCheckpointTracking: updatedChainFetcher_safeCheckpointTracking
303
+ };
304
+ var init = state.chainManager;
305
+ var nextState_indexer = state.indexer;
306
+ var nextState_chainManager = {
307
+ committedCheckpointId: init.committedCheckpointId,
308
+ chainFetchers: ChainMap.set(state.chainManager.chainFetchers, chain, updatedChainFetcher),
309
+ multichain: init.multichain,
310
+ isInReorgThreshold: init.isInReorgThreshold
311
+ };
312
+ var nextState_processedBatches = state.processedBatches;
313
+ var nextState_currentlyProcessingBatch = state.currentlyProcessingBatch;
314
+ var nextState_rollbackState = state.rollbackState;
315
+ var nextState_indexerStartTime = state.indexerStartTime;
316
+ var nextState_writeThrottlers = state.writeThrottlers;
317
+ var nextState_loadManager = state.loadManager;
318
+ var nextState_keepProcessAlive = state.keepProcessAlive;
319
+ var nextState_id = state.id;
320
+ var nextState = {
321
+ indexer: nextState_indexer,
322
+ chainManager: nextState_chainManager,
323
+ processedBatches: nextState_processedBatches,
324
+ currentlyProcessingBatch: nextState_currentlyProcessingBatch,
325
+ rollbackState: nextState_rollbackState,
326
+ indexerStartTime: nextState_indexerStartTime,
327
+ writeThrottlers: nextState_writeThrottlers,
328
+ loadManager: nextState_loadManager,
329
+ keepProcessAlive: nextState_keepProcessAlive,
330
+ id: nextState_id
331
+ };
332
+ var rollbackWithReorgDetectedBlockNumber;
333
+ if (typeof reorgResult !== "object") {
334
+ rollbackWithReorgDetectedBlockNumber = undefined;
335
+ } else {
336
+ var reorgDetected = reorgResult._0;
337
+ Logging.childInfo(chainFetcher.logger, ReorgDetection.reorgDetectedToLogParams(reorgDetected, state.indexer.config.shouldRollbackOnReorg));
338
+ Prometheus.ReorgCount.increment(chain);
339
+ Prometheus.ReorgDetectionBlockNumber.set(reorgDetected.scannedBlock.blockNumber, chain);
340
+ rollbackWithReorgDetectedBlockNumber = state.indexer.config.shouldRollbackOnReorg ? reorgDetected.scannedBlock.blockNumber : undefined;
341
+ }
342
+ if (rollbackWithReorgDetectedBlockNumber === undefined) {
343
+ return [
344
+ nextState,
345
+ [{
346
+ TAG: "ProcessPartitionQueryResponse",
347
+ _0: partitionQueryResponse
348
+ }]
349
+ ];
350
+ }
351
+ var match$1 = state.rollbackState;
352
+ var chainManager;
353
+ if (typeof match$1 !== "object" || match$1.TAG !== "RollbackReady") {
354
+ chainManager = state.chainManager;
355
+ } else {
356
+ var eventsProcessedDiffByChain = match$1.eventsProcessedDiffByChain;
357
+ var init$1 = state.chainManager;
358
+ chainManager = {
359
+ committedCheckpointId: init$1.committedCheckpointId,
360
+ chainFetchers: ChainMap.update(state.chainManager.chainFetchers, chain, (function (chainFetcher) {
361
+ var eventsProcessedDiff = eventsProcessedDiffByChain[chain];
362
+ if (eventsProcessedDiff !== undefined) {
363
+ return {
364
+ logger: chainFetcher.logger,
365
+ fetchState: chainFetcher.fetchState,
366
+ sourceManager: chainFetcher.sourceManager,
367
+ chainConfig: chainFetcher.chainConfig,
368
+ isProgressAtHead: chainFetcher.isProgressAtHead,
369
+ timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
370
+ committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
371
+ firstEventBlockNumber: chainFetcher.firstEventBlockNumber,
372
+ numEventsProcessed: chainFetcher.numEventsProcessed + eventsProcessedDiff | 0,
373
+ numBatchesFetched: chainFetcher.numBatchesFetched,
374
+ reorgDetection: chainFetcher.reorgDetection,
375
+ safeCheckpointTracking: chainFetcher.safeCheckpointTracking
376
+ };
377
+ } else {
378
+ return chainFetcher;
379
+ }
380
+ })),
381
+ multichain: init$1.multichain,
382
+ isInReorgThreshold: init$1.isInReorgThreshold
383
+ };
384
+ }
385
+ var init$2 = incrementId(nextState);
386
+ return [
387
+ {
388
+ indexer: init$2.indexer,
389
+ chainManager: chainManager,
390
+ processedBatches: init$2.processedBatches,
391
+ currentlyProcessingBatch: init$2.currentlyProcessingBatch,
392
+ rollbackState: {
393
+ TAG: "ReorgDetected",
394
+ chain: chain,
395
+ blockNumber: rollbackWithReorgDetectedBlockNumber
396
+ },
397
+ indexerStartTime: init$2.indexerStartTime,
398
+ writeThrottlers: init$2.writeThrottlers,
399
+ loadManager: init$2.loadManager,
400
+ keepProcessAlive: init$2.keepProcessAlive,
401
+ id: init$2.id
402
+ },
403
+ ["Rollback"]
404
+ ];
405
+ }
406
+
407
+ function submitPartitionQueryResponse(state, newItems, newItemsWithDcs, knownHeight, latestFetchedBlock, query, chain) {
408
+ var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
409
+ var updatedChainFetcher = Utils.unwrapResultExn(ChainFetcher.handleQueryResult(chainFetcher, query, newItems, newItemsWithDcs, latestFetchedBlock, knownHeight));
410
+ var updatedChainFetcher_logger = updatedChainFetcher.logger;
411
+ var updatedChainFetcher_fetchState = updatedChainFetcher.fetchState;
412
+ var updatedChainFetcher_sourceManager = updatedChainFetcher.sourceManager;
413
+ var updatedChainFetcher_chainConfig = updatedChainFetcher.chainConfig;
414
+ var updatedChainFetcher_isProgressAtHead = updatedChainFetcher.isProgressAtHead;
415
+ var updatedChainFetcher_timestampCaughtUpToHeadOrEndblock = updatedChainFetcher.timestampCaughtUpToHeadOrEndblock;
416
+ var updatedChainFetcher_committedProgressBlockNumber = updatedChainFetcher.committedProgressBlockNumber;
417
+ var updatedChainFetcher_firstEventBlockNumber = updatedChainFetcher.firstEventBlockNumber;
418
+ var updatedChainFetcher_numEventsProcessed = updatedChainFetcher.numEventsProcessed;
419
+ var updatedChainFetcher_numBatchesFetched = updatedChainFetcher.numBatchesFetched + 1 | 0;
420
+ var updatedChainFetcher_reorgDetection = updatedChainFetcher.reorgDetection;
421
+ var updatedChainFetcher_safeCheckpointTracking = updatedChainFetcher.safeCheckpointTracking;
422
+ var updatedChainFetcher$1 = {
423
+ logger: updatedChainFetcher_logger,
424
+ fetchState: updatedChainFetcher_fetchState,
425
+ sourceManager: updatedChainFetcher_sourceManager,
426
+ chainConfig: updatedChainFetcher_chainConfig,
427
+ isProgressAtHead: updatedChainFetcher_isProgressAtHead,
428
+ timestampCaughtUpToHeadOrEndblock: updatedChainFetcher_timestampCaughtUpToHeadOrEndblock,
429
+ committedProgressBlockNumber: updatedChainFetcher_committedProgressBlockNumber,
430
+ firstEventBlockNumber: updatedChainFetcher_firstEventBlockNumber,
431
+ numEventsProcessed: updatedChainFetcher_numEventsProcessed,
432
+ numBatchesFetched: updatedChainFetcher_numBatchesFetched,
433
+ reorgDetection: updatedChainFetcher_reorgDetection,
434
+ safeCheckpointTracking: updatedChainFetcher_safeCheckpointTracking
435
+ };
436
+ if (!chainFetcher.isProgressAtHead && updatedChainFetcher_isProgressAtHead) {
437
+ Logging.childInfo(updatedChainFetcher_logger, "All events have been fetched");
438
+ }
439
+ var init = state.chainManager;
440
+ var nextState_indexer = state.indexer;
441
+ var nextState_chainManager = {
442
+ committedCheckpointId: init.committedCheckpointId,
443
+ chainFetchers: ChainMap.set(state.chainManager.chainFetchers, chain, updatedChainFetcher$1),
444
+ multichain: init.multichain,
445
+ isInReorgThreshold: init.isInReorgThreshold
446
+ };
447
+ var nextState_processedBatches = state.processedBatches;
448
+ var nextState_currentlyProcessingBatch = state.currentlyProcessingBatch;
449
+ var nextState_rollbackState = state.rollbackState;
450
+ var nextState_indexerStartTime = state.indexerStartTime;
451
+ var nextState_writeThrottlers = state.writeThrottlers;
452
+ var nextState_loadManager = state.loadManager;
453
+ var nextState_keepProcessAlive = state.keepProcessAlive;
454
+ var nextState_id = state.id;
455
+ var nextState = {
456
+ indexer: nextState_indexer,
457
+ chainManager: nextState_chainManager,
458
+ processedBatches: nextState_processedBatches,
459
+ currentlyProcessingBatch: nextState_currentlyProcessingBatch,
460
+ rollbackState: nextState_rollbackState,
461
+ indexerStartTime: nextState_indexerStartTime,
462
+ writeThrottlers: nextState_writeThrottlers,
463
+ loadManager: nextState_loadManager,
464
+ keepProcessAlive: nextState_keepProcessAlive,
465
+ id: nextState_id
466
+ };
467
+ return [
468
+ nextState,
469
+ [
470
+ {
471
+ TAG: "UpdateChainMetaDataAndCheckForExit",
472
+ _0: "NoExit"
473
+ },
474
+ "ProcessEventBatch",
475
+ {
476
+ TAG: "NextQuery",
477
+ _0: {
478
+ TAG: "Chain",
479
+ _0: chain
480
+ }
481
+ }
482
+ ]
483
+ ];
484
+ }
485
+
486
+ async function processPartitionQueryResponse(state, param, dispatchAction) {
487
+ var response = param.response;
488
+ var chain = param.chain;
489
+ var parsedQueueItems = response.parsedQueueItems;
490
+ var itemsWithContractRegister = [];
491
+ var newItems = [];
492
+ for(var idx = 0 ,idx_finish = parsedQueueItems.length; idx < idx_finish; ++idx){
493
+ var item = parsedQueueItems[idx];
494
+ if (item.eventConfig.contractRegister !== undefined) {
495
+ itemsWithContractRegister.push(item);
496
+ }
497
+ newItems.push(item);
498
+ }
499
+ var newItemsWithDcs = itemsWithContractRegister.length !== 0 ? await ChainFetcher.runContractRegistersOrThrow(itemsWithContractRegister, chain, state.indexer.config) : itemsWithContractRegister;
500
+ return dispatchAction({
501
+ TAG: "SubmitPartitionQueryResponse",
502
+ newItems: newItems,
503
+ newItemsWithDcs: newItemsWithDcs,
504
+ knownHeight: response.knownHeight,
505
+ latestFetchedBlock: {
506
+ blockNumber: response.latestFetchedBlockNumber,
507
+ blockTimestamp: response.latestFetchedBlockTimestamp
508
+ },
509
+ query: param.query,
510
+ chain: chain
511
+ });
512
+ }
513
+
514
+ function updateChainFetcher(chainFetcherUpdate, state, chain) {
515
+ var init = state.chainManager;
516
+ return [
517
+ {
518
+ indexer: state.indexer,
519
+ chainManager: {
520
+ committedCheckpointId: init.committedCheckpointId,
521
+ chainFetchers: ChainMap.update(state.chainManager.chainFetchers, chain, chainFetcherUpdate),
522
+ multichain: init.multichain,
523
+ isInReorgThreshold: init.isInReorgThreshold
524
+ },
525
+ processedBatches: state.processedBatches,
526
+ currentlyProcessingBatch: state.currentlyProcessingBatch,
527
+ rollbackState: state.rollbackState,
528
+ indexerStartTime: state.indexerStartTime,
529
+ writeThrottlers: state.writeThrottlers,
530
+ loadManager: state.loadManager,
531
+ keepProcessAlive: state.keepProcessAlive,
532
+ id: state.id
533
+ },
534
+ []
535
+ ];
536
+ }
537
+
538
+ function onEnterReorgThreshold(state) {
539
+ Logging.info("Reorg threshold reached");
540
+ Prometheus.ReorgThreshold.set(true);
541
+ var chainFetchers = ChainMap.map(state.chainManager.chainFetchers, (function (chainFetcher) {
542
+ return {
543
+ logger: chainFetcher.logger,
544
+ fetchState: FetchState.updateInternal(chainFetcher.fetchState, undefined, undefined, undefined, undefined, Belt_Option.getWithDefault(Env.indexingBlockLag, 0), undefined),
545
+ sourceManager: chainFetcher.sourceManager,
546
+ chainConfig: chainFetcher.chainConfig,
547
+ isProgressAtHead: chainFetcher.isProgressAtHead,
548
+ timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
549
+ committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
550
+ firstEventBlockNumber: chainFetcher.firstEventBlockNumber,
551
+ numEventsProcessed: chainFetcher.numEventsProcessed,
552
+ numBatchesFetched: chainFetcher.numBatchesFetched,
553
+ reorgDetection: chainFetcher.reorgDetection,
554
+ safeCheckpointTracking: chainFetcher.safeCheckpointTracking
555
+ };
556
+ }));
557
+ var init = state.chainManager;
558
+ return {
559
+ indexer: state.indexer,
560
+ chainManager: {
561
+ committedCheckpointId: init.committedCheckpointId,
562
+ chainFetchers: chainFetchers,
563
+ multichain: init.multichain,
564
+ isInReorgThreshold: true
565
+ },
566
+ processedBatches: state.processedBatches,
567
+ currentlyProcessingBatch: state.currentlyProcessingBatch,
568
+ rollbackState: state.rollbackState,
569
+ indexerStartTime: state.indexerStartTime,
570
+ writeThrottlers: state.writeThrottlers,
571
+ loadManager: state.loadManager,
572
+ keepProcessAlive: state.keepProcessAlive,
573
+ id: state.id
574
+ };
575
+ }
576
+
577
+ function actionReducer(state, action) {
578
+ if (typeof action !== "object") {
579
+ switch (action) {
580
+ case "StartProcessingBatch" :
581
+ return [
582
+ {
583
+ indexer: state.indexer,
584
+ chainManager: state.chainManager,
585
+ processedBatches: state.processedBatches,
586
+ currentlyProcessingBatch: true,
587
+ rollbackState: state.rollbackState,
588
+ indexerStartTime: state.indexerStartTime,
589
+ writeThrottlers: state.writeThrottlers,
590
+ loadManager: state.loadManager,
591
+ keepProcessAlive: state.keepProcessAlive,
592
+ id: state.id
593
+ },
594
+ []
595
+ ];
596
+ case "StartFindingReorgDepth" :
597
+ return [
598
+ {
599
+ indexer: state.indexer,
600
+ chainManager: state.chainManager,
601
+ processedBatches: state.processedBatches,
602
+ currentlyProcessingBatch: state.currentlyProcessingBatch,
603
+ rollbackState: "FindingReorgDepth",
604
+ indexerStartTime: state.indexerStartTime,
605
+ writeThrottlers: state.writeThrottlers,
606
+ loadManager: state.loadManager,
607
+ keepProcessAlive: state.keepProcessAlive,
608
+ id: state.id
609
+ },
610
+ []
611
+ ];
612
+ case "EnterReorgThreshold" :
613
+ return [
614
+ onEnterReorgThreshold(state),
615
+ [{
616
+ TAG: "NextQuery",
617
+ _0: "CheckAllChains"
618
+ }]
619
+ ];
620
+ case "SuccessExit" :
621
+ Logging.info("Exiting with success");
622
+ Process.exit(0);
623
+ return [
624
+ state,
625
+ []
626
+ ];
627
+
628
+ }
629
+ } else {
630
+ switch (action.TAG) {
631
+ case "ValidatePartitionQueryResponse" :
632
+ return validatePartitionQueryResponse(state, action._0);
633
+ case "SubmitPartitionQueryResponse" :
634
+ return submitPartitionQueryResponse(state, action.newItems, action.newItemsWithDcs, action.knownHeight, action.latestFetchedBlock, action.query, action.chain);
635
+ case "FinishWaitingForNewBlock" :
636
+ var knownHeight = action.knownHeight;
637
+ var chain = action.chain;
638
+ var updatedChainFetchers = ChainMap.update(state.chainManager.chainFetchers, chain, (function (chainFetcher) {
639
+ var updatedFetchState = FetchState.updateKnownHeight(chainFetcher.fetchState, knownHeight);
640
+ if (updatedFetchState !== chainFetcher.fetchState) {
641
+ return {
642
+ logger: chainFetcher.logger,
643
+ fetchState: updatedFetchState,
644
+ sourceManager: chainFetcher.sourceManager,
645
+ chainConfig: chainFetcher.chainConfig,
646
+ isProgressAtHead: chainFetcher.isProgressAtHead,
647
+ timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
648
+ committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
649
+ firstEventBlockNumber: chainFetcher.firstEventBlockNumber,
650
+ numEventsProcessed: chainFetcher.numEventsProcessed,
651
+ numBatchesFetched: chainFetcher.numBatchesFetched,
652
+ reorgDetection: chainFetcher.reorgDetection,
653
+ safeCheckpointTracking: chainFetcher.safeCheckpointTracking
654
+ };
655
+ } else {
656
+ return chainFetcher;
657
+ }
658
+ }));
659
+ var isBelowReorgThreshold = !state.chainManager.isInReorgThreshold && state.indexer.config.shouldRollbackOnReorg;
660
+ var shouldEnterReorgThreshold = isBelowReorgThreshold && Belt_Array.every(ChainMap.values(updatedChainFetchers), (function (chainFetcher) {
661
+ return FetchState.isReadyToEnterReorgThreshold(chainFetcher.fetchState);
662
+ }));
663
+ var init = state.chainManager;
664
+ var state_indexer = state.indexer;
665
+ var state_chainManager = {
666
+ committedCheckpointId: init.committedCheckpointId,
667
+ chainFetchers: updatedChainFetchers,
668
+ multichain: init.multichain,
669
+ isInReorgThreshold: init.isInReorgThreshold
670
+ };
671
+ var state_processedBatches = state.processedBatches;
672
+ var state_currentlyProcessingBatch = state.currentlyProcessingBatch;
673
+ var state_rollbackState = state.rollbackState;
674
+ var state_indexerStartTime = state.indexerStartTime;
675
+ var state_writeThrottlers = state.writeThrottlers;
676
+ var state_loadManager = state.loadManager;
677
+ var state_keepProcessAlive = state.keepProcessAlive;
678
+ var state_id = state.id;
679
+ var state$1 = {
680
+ indexer: state_indexer,
681
+ chainManager: state_chainManager,
682
+ processedBatches: state_processedBatches,
683
+ currentlyProcessingBatch: state_currentlyProcessingBatch,
684
+ rollbackState: state_rollbackState,
685
+ indexerStartTime: state_indexerStartTime,
686
+ writeThrottlers: state_writeThrottlers,
687
+ loadManager: state_loadManager,
688
+ keepProcessAlive: state_keepProcessAlive,
689
+ id: state_id
690
+ };
691
+ if (shouldEnterReorgThreshold) {
692
+ return [
693
+ onEnterReorgThreshold(state$1),
694
+ [
695
+ {
696
+ TAG: "NextQuery",
697
+ _0: "CheckAllChains"
698
+ },
699
+ "ProcessEventBatch"
700
+ ]
701
+ ];
702
+ } else {
703
+ return [
704
+ state$1,
705
+ [
706
+ {
707
+ TAG: "NextQuery",
708
+ _0: {
709
+ TAG: "Chain",
710
+ _0: chain
711
+ }
712
+ },
713
+ "ProcessEventBatch"
714
+ ]
715
+ ];
716
+ }
717
+ case "EventBatchProcessed" :
718
+ var maybePruneEntityHistory = Config.shouldPruneHistory(state.indexer.config, state.chainManager.isInReorgThreshold) ? ["PruneStaleEntityHistory"] : [];
719
+ var state_indexer$1 = state.indexer;
720
+ var state_chainManager$1 = updateProgressedChains(state.chainManager, action.batch, state.indexer);
721
+ var state_processedBatches$1 = state.processedBatches + 1 | 0;
722
+ var state_indexerStartTime$1 = state.indexerStartTime;
723
+ var state_writeThrottlers$1 = state.writeThrottlers;
724
+ var state_loadManager$1 = state.loadManager;
725
+ var state_keepProcessAlive$1 = state.keepProcessAlive;
726
+ var state_id$1 = state.id;
727
+ var state$2 = {
728
+ indexer: state_indexer$1,
729
+ chainManager: state_chainManager$1,
730
+ processedBatches: state_processedBatches$1,
731
+ currentlyProcessingBatch: false,
732
+ rollbackState: "NoRollback",
733
+ indexerStartTime: state_indexerStartTime$1,
734
+ writeThrottlers: state_writeThrottlers$1,
735
+ loadManager: state_loadManager$1,
736
+ keepProcessAlive: state_keepProcessAlive$1,
737
+ id: state_id$1
738
+ };
739
+ var shouldExit = EventProcessing.allChainsEventsProcessedToEndblock(state_chainManager$1.chainFetchers) ? (Logging.info("All chains are caught up to end blocks."), state_keepProcessAlive$1 ? "NoExit" : "ExitWithSuccess") : "NoExit";
740
+ return [
741
+ state$2,
742
+ Belt_Array.concat([
743
+ {
744
+ TAG: "UpdateChainMetaDataAndCheckForExit",
745
+ _0: shouldExit
746
+ },
747
+ "ProcessEventBatch"
748
+ ], maybePruneEntityHistory)
749
+ ];
750
+ case "FindReorgDepth" :
751
+ return [
752
+ {
753
+ indexer: state.indexer,
754
+ chainManager: state.chainManager,
755
+ processedBatches: state.processedBatches,
756
+ currentlyProcessingBatch: state.currentlyProcessingBatch,
757
+ rollbackState: {
758
+ TAG: "FoundReorgDepth",
759
+ chain: action.chain,
760
+ rollbackTargetBlockNumber: action.rollbackTargetBlockNumber
761
+ },
762
+ indexerStartTime: state.indexerStartTime,
763
+ writeThrottlers: state.writeThrottlers,
764
+ loadManager: state.loadManager,
765
+ keepProcessAlive: state.keepProcessAlive,
766
+ id: state.id
767
+ },
768
+ ["Rollback"]
769
+ ];
770
+ case "UpdateQueues" :
771
+ var shouldEnterReorgThreshold$1 = action.shouldEnterReorgThreshold;
772
+ var progressedChainsById = action.progressedChainsById;
773
+ var chainFetchers = ChainMap.mapWithKey(state.chainManager.chainFetchers, (function (chain, cf) {
774
+ var chainAfterBatch = progressedChainsById[chain];
775
+ var fs = chainAfterBatch !== undefined ? chainAfterBatch.fetchState : cf.fetchState;
776
+ return {
777
+ logger: cf.logger,
778
+ fetchState: shouldEnterReorgThreshold$1 ? FetchState.updateInternal(fs, undefined, undefined, undefined, undefined, Belt_Option.getWithDefault(Env.indexingBlockLag, 0), undefined) : fs,
779
+ sourceManager: cf.sourceManager,
780
+ chainConfig: cf.chainConfig,
781
+ isProgressAtHead: cf.isProgressAtHead,
782
+ timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
783
+ committedProgressBlockNumber: cf.committedProgressBlockNumber,
784
+ firstEventBlockNumber: cf.firstEventBlockNumber,
785
+ numEventsProcessed: cf.numEventsProcessed,
786
+ numBatchesFetched: cf.numBatchesFetched,
787
+ reorgDetection: cf.reorgDetection,
788
+ safeCheckpointTracking: cf.safeCheckpointTracking
789
+ };
790
+ }));
791
+ var init$1 = state.chainManager;
792
+ var chainManager_committedCheckpointId = init$1.committedCheckpointId;
793
+ var chainManager_multichain = init$1.multichain;
794
+ var chainManager_isInReorgThreshold = init$1.isInReorgThreshold;
795
+ var chainManager = {
796
+ committedCheckpointId: chainManager_committedCheckpointId,
797
+ chainFetchers: chainFetchers,
798
+ multichain: chainManager_multichain,
799
+ isInReorgThreshold: chainManager_isInReorgThreshold
800
+ };
801
+ return [
802
+ {
803
+ indexer: state.indexer,
804
+ chainManager: chainManager,
805
+ processedBatches: state.processedBatches,
806
+ currentlyProcessingBatch: state.currentlyProcessingBatch,
807
+ rollbackState: state.rollbackState,
808
+ indexerStartTime: state.indexerStartTime,
809
+ writeThrottlers: state.writeThrottlers,
810
+ loadManager: state.loadManager,
811
+ keepProcessAlive: state.keepProcessAlive,
812
+ id: state.id
813
+ },
814
+ [{
815
+ TAG: "NextQuery",
816
+ _0: "CheckAllChains"
817
+ }]
818
+ ];
819
+ case "ErrorExit" :
820
+ ErrorHandling.log(action._0);
821
+ Process.exit(1);
822
+ return [
823
+ state,
824
+ []
825
+ ];
826
+ case "SetRollbackState" :
827
+ return [
828
+ {
829
+ indexer: state.indexer,
830
+ chainManager: action.rollbackedChainManager,
831
+ processedBatches: state.processedBatches,
832
+ currentlyProcessingBatch: state.currentlyProcessingBatch,
833
+ rollbackState: {
834
+ TAG: "RollbackReady",
835
+ diffInMemoryStore: action.diffInMemoryStore,
836
+ eventsProcessedDiffByChain: action.eventsProcessedDiffByChain
837
+ },
838
+ indexerStartTime: state.indexerStartTime,
839
+ writeThrottlers: state.writeThrottlers,
840
+ loadManager: state.loadManager,
841
+ keepProcessAlive: state.keepProcessAlive,
842
+ id: state.id
843
+ },
844
+ [
845
+ {
846
+ TAG: "NextQuery",
847
+ _0: "CheckAllChains"
848
+ },
849
+ "ProcessEventBatch"
850
+ ]
851
+ ];
852
+
853
+ }
854
+ }
855
+ }
856
+
857
+ function invalidatedActionReducer(state, action) {
858
+ if (typeof action === "object") {
859
+ switch (action.TAG) {
860
+ case "EventBatchProcessed" :
861
+ if (isPreparingRollback(state)) {
862
+ Logging.info("Finished processing batch before rollback, actioning rollback");
863
+ return [
864
+ {
865
+ indexer: state.indexer,
866
+ chainManager: updateProgressedChains(state.chainManager, action.batch, state.indexer),
867
+ processedBatches: state.processedBatches + 1 | 0,
868
+ currentlyProcessingBatch: false,
869
+ rollbackState: state.rollbackState,
870
+ indexerStartTime: state.indexerStartTime,
871
+ writeThrottlers: state.writeThrottlers,
872
+ loadManager: state.loadManager,
873
+ keepProcessAlive: state.keepProcessAlive,
874
+ id: state.id
875
+ },
876
+ ["Rollback"]
877
+ ];
878
+ }
879
+ break;
880
+ case "ErrorExit" :
881
+ return actionReducer(state, action);
882
+ default:
883
+
884
+ }
885
+ }
886
+ Logging.trace({
887
+ msg: "Invalidated action discarded",
888
+ action: S$RescriptSchema.convertOrThrow(action, Utils.Schema.variantTag)
889
+ });
890
+ return [
891
+ state,
892
+ []
893
+ ];
894
+ }
895
+
896
+ function checkAndFetchForChain(waitForNewBlock, executeQuery, state, dispatchAction) {
897
+ return async function (chain) {
898
+ var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
899
+ if (isPreparingRollback(state)) {
900
+ return ;
901
+ }
902
+ var fetchState = chainFetcher.fetchState;
903
+ return await SourceManager.fetchNext(chainFetcher.sourceManager, fetchState, (async function (query) {
904
+ try {
905
+ var response = await executeQuery(chainFetcher.sourceManager, query, fetchState.knownHeight);
906
+ return dispatchAction({
907
+ TAG: "ValidatePartitionQueryResponse",
908
+ _0: {
909
+ chain: chain,
910
+ response: response,
911
+ query: query
912
+ }
913
+ });
914
+ }
915
+ catch (raw_exn){
916
+ var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
917
+ return dispatchAction({
918
+ TAG: "ErrorExit",
919
+ _0: ErrorHandling.make(exn, undefined, undefined)
920
+ });
921
+ }
922
+ }), (function (knownHeight) {
923
+ return waitForNewBlock(chainFetcher.sourceManager, knownHeight);
924
+ }), (function (knownHeight) {
925
+ dispatchAction({
926
+ TAG: "FinishWaitingForNewBlock",
927
+ chain: chain,
928
+ knownHeight: knownHeight
929
+ });
930
+ }), state.id);
931
+ };
932
+ }
933
+
934
+ function injectedTaskReducer(waitForNewBlock, executeQuery, getLastKnownValidBlock) {
935
+ return async function (state, task, dispatchAction) {
936
+ if (typeof task !== "object") {
937
+ switch (task) {
938
+ case "ProcessEventBatch" :
939
+ if (!(!state.currentlyProcessingBatch && !isPreparingRollback(state))) {
940
+ return ;
941
+ }
942
+ var match = state.rollbackState;
943
+ var rollbackInMemStore;
944
+ rollbackInMemStore = typeof match !== "object" || match.TAG !== "RollbackReady" ? undefined : match.diffInMemoryStore;
945
+ var batch = ChainManager.createBatch(state.chainManager, state.indexer.config.batchSize, rollbackInMemStore !== undefined);
946
+ var progressedChainsById = batch.progressedChainsById;
947
+ var totalBatchSize = batch.totalBatchSize;
948
+ var isInReorgThreshold = state.chainManager.isInReorgThreshold;
949
+ var shouldSaveHistory = Config.shouldSaveHistory(state.indexer.config, isInReorgThreshold);
950
+ var isBelowReorgThreshold = !state.chainManager.isInReorgThreshold && state.indexer.config.shouldRollbackOnReorg;
951
+ var shouldEnterReorgThreshold = isBelowReorgThreshold && Belt_Array.every(ChainMap.values(state.chainManager.chainFetchers), (function (chainFetcher) {
952
+ var chainAfterBatch = progressedChainsById[chainFetcher.fetchState.chainId];
953
+ var fetchState = chainAfterBatch !== undefined ? chainAfterBatch.fetchState : chainFetcher.fetchState;
954
+ return FetchState.isReadyToEnterReorgThreshold(fetchState);
955
+ }));
956
+ if (shouldEnterReorgThreshold) {
957
+ dispatchAction("EnterReorgThreshold");
958
+ }
959
+ if (Utils.Dict.isEmpty(progressedChainsById)) {
960
+ return ;
961
+ }
962
+ if (Env.Benchmark.shouldSaveData) {
963
+ Benchmark.addSummaryData("Other", "Batch Size", totalBatchSize, undefined);
964
+ }
965
+ dispatchAction("StartProcessingBatch");
966
+ dispatchAction({
967
+ TAG: "UpdateQueues",
968
+ progressedChainsById: progressedChainsById,
969
+ shouldEnterReorgThreshold: shouldEnterReorgThreshold
970
+ });
971
+ var inMemoryStore = Belt_Option.getWithDefault(rollbackInMemStore, InMemoryStore.make(state.indexer.persistence.allEntities, undefined));
972
+ InMemoryStore.setBatchDcs(inMemoryStore, batch, shouldSaveHistory);
973
+ var res;
974
+ try {
975
+ res = await EventProcessing.processEventBatch(batch, inMemoryStore, isInReorgThreshold, state.loadManager, state.indexer, state.chainManager.chainFetchers);
976
+ }
977
+ catch (raw_exn){
978
+ var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
979
+ var errHandler = ErrorHandling.make(exn, undefined, "A top level unexpected error occurred during processing");
980
+ return dispatchAction({
981
+ TAG: "ErrorExit",
982
+ _0: errHandler
983
+ });
984
+ }
985
+ if (res.TAG === "Ok") {
986
+ return dispatchAction({
987
+ TAG: "EventBatchProcessed",
988
+ batch: batch
989
+ });
990
+ } else {
991
+ return dispatchAction({
992
+ TAG: "ErrorExit",
993
+ _0: res._0
994
+ });
995
+ }
996
+ break;
997
+ case "Rollback" :
998
+ var match$1 = state.rollbackState;
999
+ if (typeof match$1 !== "object") {
1000
+ if (match$1 === "NoRollback") {
1001
+ return Js_exn.raiseError("Internal error: Rollback initiated with invalid state");
1002
+ } else {
1003
+ return ;
1004
+ }
1005
+ }
1006
+ switch (match$1.TAG) {
1007
+ case "ReorgDetected" :
1008
+ var chain = match$1.chain;
1009
+ var chainFetcher = ChainMap.get(state.chainManager.chainFetchers, chain);
1010
+ dispatchAction("StartFindingReorgDepth");
1011
+ var rollbackTargetBlockNumber = await getLastKnownValidBlock(chainFetcher, match$1.blockNumber);
1012
+ return dispatchAction({
1013
+ TAG: "FindReorgDepth",
1014
+ chain: chain,
1015
+ rollbackTargetBlockNumber: rollbackTargetBlockNumber
1016
+ });
1017
+ case "FoundReorgDepth" :
1018
+ if (state.currentlyProcessingBatch) {
1019
+ return Logging.info("Waiting for batch to finish processing before executing rollback");
1020
+ }
1021
+ var match$2 = state.rollbackState;
1022
+ var rollbackTargetBlockNumber$1 = match$2.rollbackTargetBlockNumber;
1023
+ var reorgChain = match$2.chain;
1024
+ var startTime = Hrtime.makeTimer();
1025
+ var chainFetcher$1 = ChainMap.get(state.chainManager.chainFetchers, reorgChain);
1026
+ var logger = Logging.createChildFrom(chainFetcher$1.logger, {
1027
+ action: "Rollback",
1028
+ reorgChain: reorgChain,
1029
+ targetBlockNumber: rollbackTargetBlockNumber$1
1030
+ });
1031
+ Logging.childInfo(logger, "Started rollback on reorg");
1032
+ Prometheus.RollbackTargetBlockNumber.set(rollbackTargetBlockNumber$1, reorgChain);
1033
+ var match$3 = await state.indexer.persistence.storage.getRollbackTargetCheckpoint(reorgChain, rollbackTargetBlockNumber$1);
1034
+ var rollbackTargetCheckpointId = match$3.length !== 1 ? 0 : match$3[0].id;
1035
+ var eventsProcessedDiffByChain = {};
1036
+ var newProgressBlockNumberPerChain = {};
1037
+ var rollbackedProcessedEvents = 0;
1038
+ var rollbackProgressDiff = await state.indexer.persistence.storage.getRollbackProgressDiff(rollbackTargetCheckpointId);
1039
+ for(var idx = 0 ,idx_finish = rollbackProgressDiff.length; idx < idx_finish; ++idx){
1040
+ var diff = rollbackProgressDiff[idx];
1041
+ var eventsProcessedDiff = Belt_Int.fromString(diff.events_processed_diff);
1042
+ var tmp;
1043
+ if (eventsProcessedDiff !== undefined) {
1044
+ rollbackedProcessedEvents = rollbackedProcessedEvents + eventsProcessedDiff | 0;
1045
+ tmp = eventsProcessedDiff;
1046
+ } else {
1047
+ tmp = Js_exn.raiseError("Unexpedted case: Invalid events processed diff " + diff.events_processed_diff);
1048
+ }
1049
+ eventsProcessedDiffByChain[diff.chain_id] = tmp;
1050
+ newProgressBlockNumberPerChain[diff.chain_id] = rollbackTargetCheckpointId === 0 && diff.chain_id === reorgChain && diff.new_progress_block_number >= rollbackTargetBlockNumber$1 ? rollbackTargetBlockNumber$1 : diff.new_progress_block_number;
1051
+ }
1052
+ var chainFetchers = ChainMap.mapWithKey(state.chainManager.chainFetchers, (function (chain, cf) {
1053
+ var newProgressBlockNumber = newProgressBlockNumberPerChain[chain];
1054
+ if (newProgressBlockNumber === undefined) {
1055
+ return cf;
1056
+ }
1057
+ var fetchState = FetchState.rollback(cf.fetchState, newProgressBlockNumber);
1058
+ var newTotalEventsProcessed = cf.numEventsProcessed - eventsProcessedDiffByChain[chain] | 0;
1059
+ if (cf.committedProgressBlockNumber !== newProgressBlockNumber) {
1060
+ Prometheus.ProgressBlockNumber.set(newProgressBlockNumber, chain);
1061
+ }
1062
+ if (cf.numEventsProcessed !== newTotalEventsProcessed) {
1063
+ Prometheus.ProgressEventsCount.set(newTotalEventsProcessed, chain);
1064
+ }
1065
+ var safeCheckpointTracking = cf.safeCheckpointTracking;
1066
+ return {
1067
+ logger: cf.logger,
1068
+ fetchState: fetchState,
1069
+ sourceManager: cf.sourceManager,
1070
+ chainConfig: cf.chainConfig,
1071
+ isProgressAtHead: cf.isProgressAtHead,
1072
+ timestampCaughtUpToHeadOrEndblock: cf.timestampCaughtUpToHeadOrEndblock,
1073
+ committedProgressBlockNumber: newProgressBlockNumber,
1074
+ firstEventBlockNumber: cf.firstEventBlockNumber,
1075
+ numEventsProcessed: newTotalEventsProcessed,
1076
+ numBatchesFetched: cf.numBatchesFetched,
1077
+ reorgDetection: Caml_obj.equal(chain, reorgChain) ? ReorgDetection.rollbackToValidBlockNumber(cf.reorgDetection, rollbackTargetBlockNumber$1) : cf.reorgDetection,
1078
+ safeCheckpointTracking: safeCheckpointTracking !== undefined ? SafeCheckpointTracking.rollback(safeCheckpointTracking, newProgressBlockNumber) : undefined
1079
+ };
1080
+ }));
1081
+ var diff$1 = await Persistence.prepareRollbackDiff(state.indexer.persistence, rollbackTargetCheckpointId, state.chainManager.committedCheckpointId + 1);
1082
+ var init = state.chainManager;
1083
+ var chainManager_committedCheckpointId = init.committedCheckpointId;
1084
+ var chainManager_multichain = init.multichain;
1085
+ var chainManager_isInReorgThreshold = init.isInReorgThreshold;
1086
+ var chainManager = {
1087
+ committedCheckpointId: chainManager_committedCheckpointId,
1088
+ chainFetchers: chainFetchers,
1089
+ multichain: chainManager_multichain,
1090
+ isInReorgThreshold: chainManager_isInReorgThreshold
1091
+ };
1092
+ Logging.childTrace(logger, {
1093
+ msg: "Finished rollback on reorg",
1094
+ entityChanges: {
1095
+ deleted: diff$1.deletedEntities,
1096
+ upserted: diff$1.setEntities
1097
+ },
1098
+ rollbackedEvents: rollbackedProcessedEvents,
1099
+ beforeCheckpointId: state.chainManager.committedCheckpointId,
1100
+ targetCheckpointId: rollbackTargetCheckpointId
1101
+ });
1102
+ Prometheus.RollbackSuccess.increment(Hrtime.toMillis(Hrtime.timeSince(startTime)), rollbackedProcessedEvents);
1103
+ return dispatchAction({
1104
+ TAG: "SetRollbackState",
1105
+ diffInMemoryStore: diff$1.inMemStore,
1106
+ rollbackedChainManager: chainManager,
1107
+ eventsProcessedDiffByChain: eventsProcessedDiffByChain
1108
+ });
1109
+ case "RollbackReady" :
1110
+ return Js_exn.raiseError("Internal error: Rollback initiated with invalid state");
1111
+
1112
+ }
1113
+ case "PruneStaleEntityHistory" :
1114
+ var runPrune = async function () {
1115
+ var safeCheckpointId = ChainManager.getSafeCheckpointId(state.chainManager);
1116
+ if (safeCheckpointId === undefined) {
1117
+ return ;
1118
+ }
1119
+ await state.indexer.persistence.storage.pruneStaleCheckpoints(safeCheckpointId);
1120
+ for(var idx = 0 ,idx_finish = state.indexer.persistence.allEntities.length; idx < idx_finish; ++idx){
1121
+ if (idx !== 0) {
1122
+ await Utils.delay(1000);
1123
+ }
1124
+ var entityConfig = state.indexer.persistence.allEntities[idx];
1125
+ var timeRef = Hrtime.makeTimer();
1126
+ try {
1127
+ await state.indexer.persistence.storage.pruneStaleEntityHistory(entityConfig.name, entityConfig.index, safeCheckpointId);
1128
+ }
1129
+ catch (raw_exn){
1130
+ var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
1131
+ ErrorHandling.mkLogAndRaise(Logging.createChild({
1132
+ entityName: entityConfig.name,
1133
+ safeCheckpointId: safeCheckpointId
1134
+ }), "Failed to prune stale entity history", exn);
1135
+ }
1136
+ Prometheus.RollbackHistoryPrune.increment(Hrtime.toMillis(Hrtime.timeSince(timeRef)), entityConfig.name);
1137
+ }
1138
+ };
1139
+ return Throttler.schedule(state.writeThrottlers.pruneStaleEntityHistory, runPrune);
1140
+
1141
+ }
1142
+ } else {
1143
+ switch (task.TAG) {
1144
+ case "NextQuery" :
1145
+ var chainCheck = task._0;
1146
+ var fetchForChain = checkAndFetchForChain(waitForNewBlock, executeQuery, state, dispatchAction);
1147
+ if (typeof chainCheck === "object") {
1148
+ return await fetchForChain(chainCheck._0);
1149
+ }
1150
+ await Promise.all(Belt_Array.map(ChainMap.keys(state.chainManager.chainFetchers), (function (__x) {
1151
+ return fetchForChain(__x);
1152
+ })));
1153
+ return ;
1154
+ case "ProcessPartitionQueryResponse" :
1155
+ processPartitionQueryResponse(state, task._0, dispatchAction);
1156
+ return ;
1157
+ case "UpdateChainMetaDataAndCheckForExit" :
1158
+ var writeThrottlers = state.writeThrottlers;
1159
+ var chainManager$1 = state.chainManager;
1160
+ if (task._0 === "ExitWithSuccess") {
1161
+ updateChainMetadataTable(chainManager$1, state.indexer.persistence, writeThrottlers.chainMetaData);
1162
+ return dispatchAction("SuccessExit");
1163
+ }
1164
+ updateChainMetadataTable(chainManager$1, state.indexer.persistence, writeThrottlers.chainMetaData);
1165
+ return ;
1166
+
1167
+ }
1168
+ }
1169
+ };
1170
+ }
1171
+
1172
+ var taskReducer = injectedTaskReducer(SourceManager.waitForNewBlock, SourceManager.executeQuery, (function (chainFetcher, reorgBlockNumber) {
1173
+ return ChainFetcher.getLastKnownValidBlock(chainFetcher, reorgBlockNumber, undefined);
1174
+ }));
1175
+
1176
+ export {
1177
+ WriteThrottlers ,
1178
+ make$1 as make,
1179
+ getId ,
1180
+ incrementId ,
1181
+ setChainManager ,
1182
+ isPreparingRollback ,
1183
+ updateChainMetadataTable ,
1184
+ updateProgressedChains ,
1185
+ validatePartitionQueryResponse ,
1186
+ submitPartitionQueryResponse ,
1187
+ processPartitionQueryResponse ,
1188
+ updateChainFetcher ,
1189
+ onEnterReorgThreshold ,
1190
+ actionReducer ,
1191
+ invalidatedActionReducer ,
1192
+ checkAndFetchForChain ,
1193
+ injectedTaskReducer ,
1194
+ taskReducer ,
1195
+ }
1196
+ /* taskReducer Not a pure module */