envio 3.3.0-alpha.1 → 3.3.0-alpha.11
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/evm.schema.json +10 -0
- package/index.d.ts +45 -25
- package/licenses/CLA.md +35 -0
- package/licenses/EULA.md +67 -0
- package/licenses/LICENSE.md +45 -0
- package/licenses/README.md +35 -0
- package/package.json +10 -9
- package/src/Address.res +5 -2
- package/src/Address.res.mjs +3 -1
- package/src/Api.res +1 -1
- package/src/Api.res.mjs +1 -1
- package/src/Batch.res +0 -6
- package/src/Batch.res.mjs +1 -12
- package/src/BatchProcessing.res +7 -12
- package/src/BatchProcessing.res.mjs +8 -7
- package/src/Bin.res +3 -0
- package/src/Bin.res.mjs +4 -0
- package/src/ChainFetching.res +53 -16
- package/src/ChainFetching.res.mjs +37 -19
- package/src/ChainMetadata.res +1 -11
- package/src/ChainMetadata.res.mjs +1 -10
- package/src/ChainState.res +630 -161
- package/src/ChainState.res.mjs +438 -101
- package/src/ChainState.resi +77 -4
- package/src/Config.res +70 -38
- package/src/Config.res.mjs +52 -12
- package/src/ContractRegisterContext.res +2 -12
- package/src/ContractRegisterContext.res.mjs +3 -5
- package/src/Core.res +34 -3
- package/src/Core.res.mjs +12 -0
- package/src/CrossChainState.res +130 -89
- package/src/CrossChainState.res.mjs +66 -61
- package/src/CrossChainState.resi +1 -1
- package/src/Ecosystem.res +5 -6
- package/src/Ecosystem.res.mjs +3 -3
- package/src/Envio.res +17 -11
- package/src/EnvioGlobal.res +53 -0
- package/src/EnvioGlobal.res.mjs +31 -0
- package/src/EventConfigBuilder.res +191 -127
- package/src/EventConfigBuilder.res.mjs +116 -66
- package/src/EventProcessing.res +77 -28
- package/src/EventProcessing.res.mjs +56 -29
- package/src/ExitOnCaughtUp.res +10 -2
- package/src/ExitOnCaughtUp.res.mjs +10 -1
- package/src/FetchState.res +684 -415
- package/src/FetchState.res.mjs +505 -486
- package/src/HandlerLoader.res +8 -104
- package/src/HandlerLoader.res.mjs +2 -81
- package/src/HandlerRegister.res +520 -144
- package/src/HandlerRegister.res.mjs +286 -133
- package/src/HandlerRegister.resi +24 -8
- package/src/IndexerState.res +10 -3
- package/src/IndexerState.res.mjs +11 -4
- package/src/IndexerState.resi +2 -1
- package/src/IndexingAddresses.res +108 -0
- package/src/IndexingAddresses.res.mjs +101 -0
- package/src/IndexingAddresses.resi +34 -0
- package/src/Internal.res +166 -48
- package/src/Internal.res.mjs +30 -2
- package/src/LoadLayer.res +5 -5
- package/src/LoadLayer.res.mjs +6 -6
- package/src/LogSelection.res +92 -217
- package/src/LogSelection.res.mjs +95 -184
- package/src/Main.res +71 -236
- package/src/Main.res.mjs +60 -145
- package/src/Metrics.res +74 -0
- package/src/Metrics.res.mjs +75 -0
- package/src/PgStorage.res +4 -4
- package/src/PgStorage.res.mjs +5 -5
- package/src/Prometheus.res +10 -63
- package/src/Prometheus.res.mjs +124 -171
- package/src/PruneStaleHistory.res +2 -2
- package/src/PruneStaleHistory.res.mjs +3 -3
- package/src/RawEvent.res +7 -2
- package/src/RawEvent.res.mjs +4 -4
- package/src/Rollback.res +3 -3
- package/src/Rollback.res.mjs +4 -4
- package/src/RollbackCommit.res +4 -1
- package/src/RollbackCommit.res.mjs +3 -2
- package/src/SimulateDeadInputTracker.res +85 -0
- package/src/SimulateDeadInputTracker.res.mjs +73 -0
- package/src/SimulateDeadInputTracker.resi +12 -0
- package/src/SimulateItems.res +128 -28
- package/src/SimulateItems.res.mjs +82 -40
- package/src/TestIndexer.res +55 -41
- package/src/TestIndexer.res.mjs +39 -32
- package/src/TopicFilter.res +1 -25
- package/src/TopicFilter.res.mjs +0 -74
- package/src/bindings/Performance.res +7 -0
- package/src/bindings/Performance.res.mjs +21 -0
- package/src/bindings/Performance.resi +7 -0
- package/src/bindings/Viem.res +0 -46
- package/src/bindings/Viem.res.mjs +1 -43
- package/src/sources/BlockStore.res +46 -0
- package/src/sources/BlockStore.res.mjs +24 -0
- package/src/sources/EventRouter.res +31 -49
- package/src/sources/EventRouter.res.mjs +12 -25
- package/src/sources/Evm.res +83 -72
- package/src/sources/Evm.res.mjs +53 -69
- package/src/sources/EvmChain.res +7 -34
- package/src/sources/EvmChain.res.mjs +6 -27
- package/src/sources/EvmRpcClient.res +71 -5
- package/src/sources/EvmRpcClient.res.mjs +13 -4
- package/src/sources/FieldMask.res +39 -0
- package/src/sources/FieldMask.res.mjs +42 -0
- package/src/sources/Fuel.res +9 -6
- package/src/sources/Fuel.res.mjs +5 -10
- package/src/sources/HyperFuelSource.res +46 -50
- package/src/sources/HyperFuelSource.res.mjs +64 -54
- package/src/sources/HyperSync.res +45 -42
- package/src/sources/HyperSync.res.mjs +68 -60
- package/src/sources/HyperSync.resi +14 -4
- package/src/sources/HyperSyncClient.res +107 -119
- package/src/sources/HyperSyncClient.res.mjs +36 -31
- package/src/sources/HyperSyncHeightStream.res +1 -8
- package/src/sources/HyperSyncHeightStream.res.mjs +0 -2
- package/src/sources/HyperSyncSource.res +60 -254
- package/src/sources/HyperSyncSource.res.mjs +57 -180
- package/src/sources/Rpc.res +15 -79
- package/src/sources/Rpc.res.mjs +25 -101
- package/src/sources/RpcSource.res +221 -514
- package/src/sources/RpcSource.res.mjs +216 -411
- package/src/sources/RpcWebSocketHeightStream.res +0 -5
- package/src/sources/RpcWebSocketHeightStream.res.mjs +0 -2
- package/src/sources/SimulateSource.res +44 -20
- package/src/sources/SimulateSource.res.mjs +41 -14
- package/src/sources/Source.res +34 -6
- package/src/sources/SourceManager.res +77 -19
- package/src/sources/SourceManager.res.mjs +63 -21
- package/src/sources/SourceManager.resi +10 -0
- package/src/sources/Svm.res +31 -16
- package/src/sources/Svm.res.mjs +36 -13
- package/src/sources/SvmHyperSyncClient.res +5 -32
- package/src/sources/SvmHyperSyncSource.res +159 -134
- package/src/sources/SvmHyperSyncSource.res.mjs +164 -129
- package/src/sources/TransactionStore.res +49 -0
- package/src/sources/TransactionStore.res.mjs +30 -0
- package/src/tui/Tui.res +13 -16
- package/src/tui/Tui.res.mjs +12 -14
- package/svm.schema.json +49 -37
- package/src/bindings/Hrtime.res +0 -58
- package/src/bindings/Hrtime.res.mjs +0 -90
- package/src/bindings/Hrtime.resi +0 -30
package/src/ChainFetching.res
CHANGED
|
@@ -11,7 +11,19 @@ type partitionQueryResponse = {
|
|
|
11
11
|
let runContractRegistersOrThrow = async (
|
|
12
12
|
~itemsWithContractRegister: array<Internal.item>,
|
|
13
13
|
~config: Config.t,
|
|
14
|
+
~transactionStore: option<TransactionStore.t>,
|
|
15
|
+
~blockStore: option<BlockStore.t>,
|
|
14
16
|
) => {
|
|
17
|
+
// contractRegister handlers can read event.transaction and event.block, so
|
|
18
|
+
// materialise the selected fields onto the payloads before running them. All
|
|
19
|
+
// items belong to the chain being fetched, hence its single page stores.
|
|
20
|
+
await ChainState.materializePageItems(
|
|
21
|
+
~items=itemsWithContractRegister,
|
|
22
|
+
~transactionStore,
|
|
23
|
+
~blockStore,
|
|
24
|
+
~ecosystem=config.ecosystem.name,
|
|
25
|
+
)
|
|
26
|
+
|
|
15
27
|
let itemsWithDcs = []
|
|
16
28
|
|
|
17
29
|
let onRegister = (~item: Internal.item, ~contractAddress, ~contractName) => {
|
|
@@ -37,9 +49,9 @@ let runContractRegistersOrThrow = async (
|
|
|
37
49
|
for idx in 0 to itemsWithContractRegister->Array.length - 1 {
|
|
38
50
|
let item = itemsWithContractRegister->Array.getUnsafe(idx)
|
|
39
51
|
let eventItem = item->Internal.castUnsafeEventItem
|
|
40
|
-
let contractRegister = switch eventItem {
|
|
41
|
-
| {
|
|
42
|
-
| {
|
|
52
|
+
let contractRegister = switch eventItem.onEventRegistration {
|
|
53
|
+
| {contractRegister: Some(contractRegister)} => contractRegister
|
|
54
|
+
| {contractRegister: None, eventConfig: {name: eventName}} =>
|
|
43
55
|
// Unexpected case, since we should pass only events with contract register to this function
|
|
44
56
|
JsError.throwWithMessage("Contract register is not set for event " ++ eventName)
|
|
45
57
|
}
|
|
@@ -106,6 +118,8 @@ let rec onQueryResponse = async (
|
|
|
106
118
|
let chainState = state->IndexerState.getChainState(~chain)
|
|
107
119
|
let {
|
|
108
120
|
parsedQueueItems,
|
|
121
|
+
transactionStore,
|
|
122
|
+
blockStore,
|
|
109
123
|
latestFetchedBlockNumber,
|
|
110
124
|
latestFetchedBlockTimestamp,
|
|
111
125
|
stats,
|
|
@@ -114,7 +128,7 @@ let rec onQueryResponse = async (
|
|
|
114
128
|
fromBlockQueried,
|
|
115
129
|
} = response
|
|
116
130
|
|
|
117
|
-
if knownHeight >
|
|
131
|
+
if knownHeight > chainState->ChainState.knownHeight {
|
|
118
132
|
Prometheus.SourceHeight.set(
|
|
119
133
|
~blockNumber=knownHeight,
|
|
120
134
|
~chainId=(chainState->ChainState.chainConfig).id,
|
|
@@ -133,6 +147,22 @@ let rec onQueryResponse = async (
|
|
|
133
147
|
~blockRangeSize=latestFetchedBlockNumber - fromBlockQueried + 1,
|
|
134
148
|
)
|
|
135
149
|
|
|
150
|
+
let numContractRegisterEvents = parsedQueueItems->Array.reduce(0, (count, item) => {
|
|
151
|
+
let eventItem = item->Internal.castUnsafeEventItem
|
|
152
|
+
eventItem.onEventRegistration.contractRegister !== None
|
|
153
|
+
? count + 1
|
|
154
|
+
: count
|
|
155
|
+
})
|
|
156
|
+
Logging.trace({
|
|
157
|
+
"msg": "Finished querying",
|
|
158
|
+
"chainId": chain->ChainMap.Chain.toChainId,
|
|
159
|
+
"partitionId": query.partitionId,
|
|
160
|
+
"fromBlock": fromBlockQueried,
|
|
161
|
+
"toBlock": latestFetchedBlockNumber,
|
|
162
|
+
"numEvents": parsedQueueItems->Array.length,
|
|
163
|
+
"numContractRegisterEvents": numContractRegisterEvents,
|
|
164
|
+
})
|
|
165
|
+
|
|
136
166
|
let reorgResult = chainState->ChainState.registerReorgGuard(~blockHashes, ~knownHeight)
|
|
137
167
|
|
|
138
168
|
let rollbackWithReorgDetectedBlockNumber = switch reorgResult {
|
|
@@ -184,17 +214,18 @@ let rec onQueryResponse = async (
|
|
|
184
214
|
// kick (eg from the processing loop quiescing) collapses into this one.
|
|
185
215
|
scheduleRollback()
|
|
186
216
|
| None =>
|
|
217
|
+
// Drop over-fetched events (a merged partition returning an address before
|
|
218
|
+
// its effectiveStartBlock, or a wildcard param referencing an address
|
|
219
|
+
// registered after the log's block) before contract registration, so they
|
|
220
|
+
// neither spawn dynamic contracts nor enter the buffer.
|
|
221
|
+
let newItems = chainState->ChainState.filterByClientAddress(parsedQueueItems)
|
|
187
222
|
let itemsWithContractRegister = []
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
let item = parsedQueueItems->Array.getUnsafe(idx)
|
|
223
|
+
for idx in 0 to newItems->Array.length - 1 {
|
|
224
|
+
let item = newItems->Array.getUnsafe(idx)
|
|
191
225
|
let eventItem = item->Internal.castUnsafeEventItem
|
|
192
|
-
if eventItem.
|
|
226
|
+
if eventItem.onEventRegistration.contractRegister !== None {
|
|
193
227
|
itemsWithContractRegister->Array.push(item)
|
|
194
228
|
}
|
|
195
|
-
// TODO: Don't really need to keep it in the queue
|
|
196
|
-
// when there's no handler (besides raw_events, processed counter, and dcsToStore consuming)
|
|
197
|
-
newItems->Array.push(item)
|
|
198
229
|
}
|
|
199
230
|
|
|
200
231
|
// Re-check staleness: contract registration is async, so the chain state
|
|
@@ -212,6 +243,8 @@ let rec onQueryResponse = async (
|
|
|
212
243
|
blockTimestamp: latestFetchedBlockTimestamp,
|
|
213
244
|
},
|
|
214
245
|
~query,
|
|
246
|
+
~transactionStore,
|
|
247
|
+
~blockStore,
|
|
215
248
|
)
|
|
216
249
|
ChainMetadata.stage(state)
|
|
217
250
|
scheduleFetch()
|
|
@@ -224,6 +257,8 @@ let rec onQueryResponse = async (
|
|
|
224
257
|
switch await runContractRegistersOrThrow(
|
|
225
258
|
~itemsWithContractRegister,
|
|
226
259
|
~config=state->IndexerState.config,
|
|
260
|
+
~transactionStore,
|
|
261
|
+
~blockStore,
|
|
227
262
|
) {
|
|
228
263
|
| exception exn => IndexerState.errorExit(state, exn->ErrorHandling.make)
|
|
229
264
|
| newItemsWithDcs => proceed(~newItemsWithDcs)
|
|
@@ -240,6 +275,8 @@ and applyQueryResponse = (
|
|
|
240
275
|
~knownHeight,
|
|
241
276
|
~latestFetchedBlock,
|
|
242
277
|
~query,
|
|
278
|
+
~transactionStore,
|
|
279
|
+
~blockStore,
|
|
243
280
|
) => {
|
|
244
281
|
let chainState = state->IndexerState.getChainState(~chain)
|
|
245
282
|
let wasFetchingAtHead = chainState->ChainState.isFetchingAtHead
|
|
@@ -250,6 +287,8 @@ and applyQueryResponse = (
|
|
|
250
287
|
~newItems,
|
|
251
288
|
~newItemsWithDcs,
|
|
252
289
|
~knownHeight,
|
|
290
|
+
~transactionStore,
|
|
291
|
+
~blockStore,
|
|
253
292
|
)
|
|
254
293
|
|
|
255
294
|
// In auto-exit mode, set endBlock to the first event's block when events arrive.
|
|
@@ -294,7 +333,7 @@ let finishWaitingForNewBlock = (
|
|
|
294
333
|
->IndexerState.chainStates
|
|
295
334
|
->Dict.valuesToArray
|
|
296
335
|
->Array.every(cs => {
|
|
297
|
-
cs->ChainState.
|
|
336
|
+
cs->ChainState.isReadyToEnterReorgThreshold
|
|
298
337
|
})
|
|
299
338
|
|
|
300
339
|
// Kick processing in case there are block handlers to run.
|
|
@@ -316,7 +355,6 @@ let fetchChain = async (
|
|
|
316
355
|
) => {
|
|
317
356
|
let chainState = state->IndexerState.getChainState(~chain)
|
|
318
357
|
if !(state->IndexerState.isResolvingReorg) && !(state->IndexerState.isStopped) {
|
|
319
|
-
let fetchState = chainState->ChainState.fetchState
|
|
320
358
|
let isRealtime = state->IndexerState.isRealtime
|
|
321
359
|
let sourceManager = chainState->ChainState.sourceManager
|
|
322
360
|
|
|
@@ -327,8 +365,7 @@ let fetchChain = async (
|
|
|
327
365
|
// Owns its error boundary: launch doesn't catch, so any failure here (the
|
|
328
366
|
// query, response handling, or dispatch itself) must stop the indexer.
|
|
329
367
|
try {
|
|
330
|
-
await
|
|
331
|
-
~fetchState,
|
|
368
|
+
await chainState->ChainState.dispatch(
|
|
332
369
|
~waitForNewBlock=(~knownHeight) =>
|
|
333
370
|
sourceManager->SourceManager.waitForNewBlock(~knownHeight, ~isRealtime, ~reducedPolling),
|
|
334
371
|
~onNewBlock=(~knownHeight) =>
|
|
@@ -347,7 +384,7 @@ let fetchChain = async (
|
|
|
347
384
|
try {
|
|
348
385
|
let response = await sourceManager->SourceManager.executeQuery(
|
|
349
386
|
~query,
|
|
350
|
-
~knownHeight=
|
|
387
|
+
~knownHeight=chainState->ChainState.knownHeight,
|
|
351
388
|
~isRealtime,
|
|
352
389
|
)
|
|
353
390
|
await onQueryResponse(
|
|
@@ -4,9 +4,9 @@ import * as Utils from "./Utils.res.mjs";
|
|
|
4
4
|
import * as Logging from "./Logging.res.mjs";
|
|
5
5
|
import * as Ecosystem from "./Ecosystem.res.mjs";
|
|
6
6
|
import * as ChainState from "./ChainState.res.mjs";
|
|
7
|
-
import * as FetchState from "./FetchState.res.mjs";
|
|
8
7
|
import * as Prometheus from "./Prometheus.res.mjs";
|
|
9
8
|
import * as IndexerState from "./IndexerState.res.mjs";
|
|
9
|
+
import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
|
|
10
10
|
import * as ChainMetadata from "./ChainMetadata.res.mjs";
|
|
11
11
|
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
12
12
|
import * as SourceManager from "./sources/SourceManager.res.mjs";
|
|
@@ -17,7 +17,8 @@ import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
|
|
|
17
17
|
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
18
18
|
import * as ContractRegisterContext from "./ContractRegisterContext.res.mjs";
|
|
19
19
|
|
|
20
|
-
async function runContractRegistersOrThrow(itemsWithContractRegister, config) {
|
|
20
|
+
async function runContractRegistersOrThrow(itemsWithContractRegister, config, transactionStore, blockStore) {
|
|
21
|
+
await ChainState.materializePageItems(itemsWithContractRegister, transactionStore, blockStore, config.ecosystem.name);
|
|
21
22
|
let itemsWithDcs = [];
|
|
22
23
|
let onRegister = (item, contractAddress, contractName) => {
|
|
23
24
|
let dc_registrationBlock = item.blockNumber;
|
|
@@ -37,9 +38,9 @@ async function runContractRegistersOrThrow(itemsWithContractRegister, config) {
|
|
|
37
38
|
let promises = [];
|
|
38
39
|
for (let idx = 0, idx_finish = itemsWithContractRegister.length; idx < idx_finish; ++idx) {
|
|
39
40
|
let item = itemsWithContractRegister[idx];
|
|
40
|
-
let match = item.
|
|
41
|
+
let match = item.onEventRegistration;
|
|
41
42
|
let contractRegister = match.contractRegister;
|
|
42
|
-
let contractRegister$1 = contractRegister !== undefined ? contractRegister : Stdlib_JsError.throwWithMessage("Contract register is not set for event " + match.name);
|
|
43
|
+
let contractRegister$1 = contractRegister !== undefined ? contractRegister : Stdlib_JsError.throwWithMessage("Contract register is not set for event " + match.eventConfig.name);
|
|
43
44
|
let errorMessage = "Event contractRegister failed, please fix the error to keep the indexer running smoothly";
|
|
44
45
|
try {
|
|
45
46
|
let params = {
|
|
@@ -71,10 +72,10 @@ async function runContractRegistersOrThrow(itemsWithContractRegister, config) {
|
|
|
71
72
|
return itemsWithDcs;
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
function applyQueryResponse(state, chain, newItems, newItemsWithDcs, knownHeight, latestFetchedBlock, query) {
|
|
75
|
+
function applyQueryResponse(state, chain, newItems, newItemsWithDcs, knownHeight, latestFetchedBlock, query, transactionStore, blockStore) {
|
|
75
76
|
let chainState = IndexerState.getChainState(state, chain);
|
|
76
77
|
let wasFetchingAtHead = ChainState.isFetchingAtHead(chainState);
|
|
77
|
-
ChainState.handleQueryResult(chainState, query, newItems, newItemsWithDcs, latestFetchedBlock, knownHeight);
|
|
78
|
+
ChainState.handleQueryResult(chainState, query, newItems, newItemsWithDcs, latestFetchedBlock, knownHeight, transactionStore, blockStore);
|
|
78
79
|
if (IndexerState.exitAfterFirstEventBlock(state) && newItems.length !== 0) {
|
|
79
80
|
ChainState.setEndBlockToFirstEvent(chainState, newItems[0].blockNumber);
|
|
80
81
|
}
|
|
@@ -94,12 +95,31 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
|
|
|
94
95
|
let stats = response.stats;
|
|
95
96
|
let latestFetchedBlockTimestamp = response.latestFetchedBlockTimestamp;
|
|
96
97
|
let latestFetchedBlockNumber = response.latestFetchedBlockNumber;
|
|
98
|
+
let fromBlockQueried = response.fromBlockQueried;
|
|
99
|
+
let blockStore = response.blockStore;
|
|
100
|
+
let transactionStore = response.transactionStore;
|
|
97
101
|
let parsedQueueItems = response.parsedQueueItems;
|
|
98
102
|
let knownHeight = response.knownHeight;
|
|
99
|
-
if (knownHeight > ChainState.
|
|
103
|
+
if (knownHeight > ChainState.knownHeight(chainState)) {
|
|
100
104
|
Prometheus.SourceHeight.set(SourceManager.getActiveSource(ChainState.sourceManager(chainState)).name, ChainState.chainConfig(chainState).id, knownHeight);
|
|
101
105
|
}
|
|
102
|
-
Prometheus.FetchingBlockRange.increment(chain, stats["total time elapsed (s)"], Stdlib_Option.getOr(stats["parsing time (s)"], 0), parsedQueueItems.length, (latestFetchedBlockNumber -
|
|
106
|
+
Prometheus.FetchingBlockRange.increment(chain, stats["total time elapsed (s)"], Stdlib_Option.getOr(stats["parsing time (s)"], 0), parsedQueueItems.length, (latestFetchedBlockNumber - fromBlockQueried | 0) + 1 | 0);
|
|
107
|
+
let numContractRegisterEvents = Stdlib_Array.reduce(parsedQueueItems, 0, (count, item) => {
|
|
108
|
+
if (item.onEventRegistration.contractRegister !== undefined) {
|
|
109
|
+
return count + 1 | 0;
|
|
110
|
+
} else {
|
|
111
|
+
return count;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
Logging.trace({
|
|
115
|
+
msg: "Finished querying",
|
|
116
|
+
chainId: chain,
|
|
117
|
+
partitionId: query.partitionId,
|
|
118
|
+
fromBlock: fromBlockQueried,
|
|
119
|
+
toBlock: latestFetchedBlockNumber,
|
|
120
|
+
numEvents: parsedQueueItems.length,
|
|
121
|
+
numContractRegisterEvents: numContractRegisterEvents
|
|
122
|
+
});
|
|
103
123
|
let reorgResult = ChainState.registerReorgGuard(chainState, response.blockHashes, knownHeight);
|
|
104
124
|
let rollbackWithReorgDetectedBlockNumber;
|
|
105
125
|
if (typeof reorgResult !== "object") {
|
|
@@ -119,21 +139,20 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
|
|
|
119
139
|
IndexerState.beginReorg(state, chain, rollbackWithReorgDetectedBlockNumber);
|
|
120
140
|
return scheduleRollback();
|
|
121
141
|
}
|
|
142
|
+
let newItems = ChainState.filterByClientAddress(chainState, parsedQueueItems);
|
|
122
143
|
let itemsWithContractRegister = [];
|
|
123
|
-
let
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (item.eventConfig.contractRegister !== undefined) {
|
|
144
|
+
for (let idx = 0, idx_finish = newItems.length; idx < idx_finish; ++idx) {
|
|
145
|
+
let item = newItems[idx];
|
|
146
|
+
if (item.onEventRegistration.contractRegister !== undefined) {
|
|
127
147
|
itemsWithContractRegister.push(item);
|
|
128
148
|
}
|
|
129
|
-
newItems.push(item);
|
|
130
149
|
}
|
|
131
150
|
let proceed = newItemsWithDcs => {
|
|
132
151
|
if (!IndexerState.isStale(state, stateId)) {
|
|
133
152
|
applyQueryResponse(state, chain, newItems, newItemsWithDcs, knownHeight, {
|
|
134
153
|
blockNumber: latestFetchedBlockNumber,
|
|
135
154
|
blockTimestamp: latestFetchedBlockTimestamp
|
|
136
|
-
}, query);
|
|
155
|
+
}, query, transactionStore, blockStore);
|
|
137
156
|
ChainMetadata.stage(state);
|
|
138
157
|
scheduleFetch();
|
|
139
158
|
return scheduleProcessing();
|
|
@@ -144,7 +163,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
|
|
|
144
163
|
}
|
|
145
164
|
let newItemsWithDcs;
|
|
146
165
|
try {
|
|
147
|
-
newItemsWithDcs = await runContractRegistersOrThrow(itemsWithContractRegister, IndexerState.config(state));
|
|
166
|
+
newItemsWithDcs = await runContractRegistersOrThrow(itemsWithContractRegister, IndexerState.config(state), transactionStore, blockStore);
|
|
148
167
|
} catch (raw_exn) {
|
|
149
168
|
let exn = Primitive_exceptions.internalToException(raw_exn);
|
|
150
169
|
return IndexerState.errorExit(state, ErrorHandling.make(exn, undefined, undefined));
|
|
@@ -159,7 +178,7 @@ function finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFe
|
|
|
159
178
|
let chainState = IndexerState.getChainState(state, chain);
|
|
160
179
|
ChainState.updateKnownHeight(chainState, knownHeight);
|
|
161
180
|
let isBelowReorgThreshold = !IndexerState.isInReorgThreshold(state) && IndexerState.config(state).shouldRollbackOnReorg;
|
|
162
|
-
let shouldEnterReorgThreshold = isBelowReorgThreshold && Object.values(IndexerState.chainStates(state)).every(
|
|
181
|
+
let shouldEnterReorgThreshold = isBelowReorgThreshold && Object.values(IndexerState.chainStates(state)).every(ChainState.isReadyToEnterReorgThreshold);
|
|
163
182
|
if (shouldEnterReorgThreshold) {
|
|
164
183
|
IndexerState.enterReorgThreshold(state);
|
|
165
184
|
}
|
|
@@ -172,14 +191,13 @@ async function fetchChain(state, chain, action, stateId, scheduleFetch, schedule
|
|
|
172
191
|
if (IndexerState.isResolvingReorg(state) || IndexerState.isStopped(state)) {
|
|
173
192
|
return;
|
|
174
193
|
}
|
|
175
|
-
let fetchState = ChainState.fetchState(chainState);
|
|
176
194
|
let isRealtime = IndexerState.isRealtime(state);
|
|
177
195
|
let sourceManager = ChainState.sourceManager(chainState);
|
|
178
196
|
let reducedPolling = !isRealtime;
|
|
179
197
|
try {
|
|
180
|
-
return await
|
|
198
|
+
return await ChainState.dispatch(chainState, async query => {
|
|
181
199
|
try {
|
|
182
|
-
let response = await SourceManager.executeQuery(sourceManager, query,
|
|
200
|
+
let response = await SourceManager.executeQuery(sourceManager, query, ChainState.knownHeight(chainState), isRealtime);
|
|
183
201
|
return await onQueryResponse(state, {
|
|
184
202
|
chain: chain,
|
|
185
203
|
response: response,
|
package/src/ChainMetadata.res
CHANGED
|
@@ -7,19 +7,9 @@ let stage = (state: IndexerState.t) => {
|
|
|
7
7
|
->IndexerState.chainStates
|
|
8
8
|
->Dict.valuesToArray
|
|
9
9
|
->Array.forEach(cs => {
|
|
10
|
-
let fetchState = cs->ChainState.fetchState
|
|
11
10
|
chainsData->Dict.set(
|
|
12
11
|
(cs->ChainState.chainConfig).id->Int.toString,
|
|
13
|
-
|
|
14
|
-
firstEventBlockNumber: fetchState.firstEventBlock->Null.fromOption,
|
|
15
|
-
isHyperSync: (
|
|
16
|
-
cs->ChainState.sourceManager->SourceManager.getActiveSource
|
|
17
|
-
).poweredByHyperSync,
|
|
18
|
-
latestFetchedBlockNumber: fetchState->FetchState.bufferBlockNumber,
|
|
19
|
-
timestampCaughtUpToHeadOrEndblock: cs
|
|
20
|
-
->ChainState.timestampCaughtUpToHeadOrEndblock
|
|
21
|
-
->Null.fromOption,
|
|
22
|
-
},
|
|
12
|
+
cs->ChainState.toChainMetadata,
|
|
23
13
|
)
|
|
24
14
|
})
|
|
25
15
|
|
|
@@ -2,21 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import * as Writing from "./Writing.res.mjs";
|
|
4
4
|
import * as ChainState from "./ChainState.res.mjs";
|
|
5
|
-
import * as FetchState from "./FetchState.res.mjs";
|
|
6
|
-
import * as Stdlib_Null from "@rescript/runtime/lib/es6/Stdlib_Null.js";
|
|
7
5
|
import * as IndexerState from "./IndexerState.res.mjs";
|
|
8
|
-
import * as SourceManager from "./sources/SourceManager.res.mjs";
|
|
9
6
|
|
|
10
7
|
function stage(state) {
|
|
11
8
|
let chainsData = {};
|
|
12
9
|
Object.values(IndexerState.chainStates(state)).forEach(cs => {
|
|
13
|
-
|
|
14
|
-
chainsData[ChainState.chainConfig(cs).id.toString()] = {
|
|
15
|
-
first_event_block: Stdlib_Null.fromOption(fetchState.firstEventBlock),
|
|
16
|
-
buffer_block: FetchState.bufferBlockNumber(fetchState),
|
|
17
|
-
ready_at: Stdlib_Null.fromOption(ChainState.timestampCaughtUpToHeadOrEndblock(cs)),
|
|
18
|
-
_is_hyper_sync: SourceManager.getActiveSource(ChainState.sourceManager(cs)).poweredByHyperSync
|
|
19
|
-
};
|
|
10
|
+
chainsData[ChainState.chainConfig(cs).id.toString()] = ChainState.toChainMetadata(cs);
|
|
20
11
|
});
|
|
21
12
|
Writing.setChainMeta(state, chainsData);
|
|
22
13
|
}
|