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.
Files changed (143) hide show
  1. package/evm.schema.json +10 -0
  2. package/index.d.ts +45 -25
  3. package/licenses/CLA.md +35 -0
  4. package/licenses/EULA.md +67 -0
  5. package/licenses/LICENSE.md +45 -0
  6. package/licenses/README.md +35 -0
  7. package/package.json +10 -9
  8. package/src/Address.res +5 -2
  9. package/src/Address.res.mjs +3 -1
  10. package/src/Api.res +1 -1
  11. package/src/Api.res.mjs +1 -1
  12. package/src/Batch.res +0 -6
  13. package/src/Batch.res.mjs +1 -12
  14. package/src/BatchProcessing.res +7 -12
  15. package/src/BatchProcessing.res.mjs +8 -7
  16. package/src/Bin.res +3 -0
  17. package/src/Bin.res.mjs +4 -0
  18. package/src/ChainFetching.res +53 -16
  19. package/src/ChainFetching.res.mjs +37 -19
  20. package/src/ChainMetadata.res +1 -11
  21. package/src/ChainMetadata.res.mjs +1 -10
  22. package/src/ChainState.res +630 -161
  23. package/src/ChainState.res.mjs +438 -101
  24. package/src/ChainState.resi +77 -4
  25. package/src/Config.res +70 -38
  26. package/src/Config.res.mjs +52 -12
  27. package/src/ContractRegisterContext.res +2 -12
  28. package/src/ContractRegisterContext.res.mjs +3 -5
  29. package/src/Core.res +34 -3
  30. package/src/Core.res.mjs +12 -0
  31. package/src/CrossChainState.res +130 -89
  32. package/src/CrossChainState.res.mjs +66 -61
  33. package/src/CrossChainState.resi +1 -1
  34. package/src/Ecosystem.res +5 -6
  35. package/src/Ecosystem.res.mjs +3 -3
  36. package/src/Envio.res +17 -11
  37. package/src/EnvioGlobal.res +53 -0
  38. package/src/EnvioGlobal.res.mjs +31 -0
  39. package/src/EventConfigBuilder.res +191 -127
  40. package/src/EventConfigBuilder.res.mjs +116 -66
  41. package/src/EventProcessing.res +77 -28
  42. package/src/EventProcessing.res.mjs +56 -29
  43. package/src/ExitOnCaughtUp.res +10 -2
  44. package/src/ExitOnCaughtUp.res.mjs +10 -1
  45. package/src/FetchState.res +684 -415
  46. package/src/FetchState.res.mjs +505 -486
  47. package/src/HandlerLoader.res +8 -104
  48. package/src/HandlerLoader.res.mjs +2 -81
  49. package/src/HandlerRegister.res +520 -144
  50. package/src/HandlerRegister.res.mjs +286 -133
  51. package/src/HandlerRegister.resi +24 -8
  52. package/src/IndexerState.res +10 -3
  53. package/src/IndexerState.res.mjs +11 -4
  54. package/src/IndexerState.resi +2 -1
  55. package/src/IndexingAddresses.res +108 -0
  56. package/src/IndexingAddresses.res.mjs +101 -0
  57. package/src/IndexingAddresses.resi +34 -0
  58. package/src/Internal.res +166 -48
  59. package/src/Internal.res.mjs +30 -2
  60. package/src/LoadLayer.res +5 -5
  61. package/src/LoadLayer.res.mjs +6 -6
  62. package/src/LogSelection.res +92 -217
  63. package/src/LogSelection.res.mjs +95 -184
  64. package/src/Main.res +71 -236
  65. package/src/Main.res.mjs +60 -145
  66. package/src/Metrics.res +74 -0
  67. package/src/Metrics.res.mjs +75 -0
  68. package/src/PgStorage.res +4 -4
  69. package/src/PgStorage.res.mjs +5 -5
  70. package/src/Prometheus.res +10 -63
  71. package/src/Prometheus.res.mjs +124 -171
  72. package/src/PruneStaleHistory.res +2 -2
  73. package/src/PruneStaleHistory.res.mjs +3 -3
  74. package/src/RawEvent.res +7 -2
  75. package/src/RawEvent.res.mjs +4 -4
  76. package/src/Rollback.res +3 -3
  77. package/src/Rollback.res.mjs +4 -4
  78. package/src/RollbackCommit.res +4 -1
  79. package/src/RollbackCommit.res.mjs +3 -2
  80. package/src/SimulateDeadInputTracker.res +85 -0
  81. package/src/SimulateDeadInputTracker.res.mjs +73 -0
  82. package/src/SimulateDeadInputTracker.resi +12 -0
  83. package/src/SimulateItems.res +128 -28
  84. package/src/SimulateItems.res.mjs +82 -40
  85. package/src/TestIndexer.res +55 -41
  86. package/src/TestIndexer.res.mjs +39 -32
  87. package/src/TopicFilter.res +1 -25
  88. package/src/TopicFilter.res.mjs +0 -74
  89. package/src/bindings/Performance.res +7 -0
  90. package/src/bindings/Performance.res.mjs +21 -0
  91. package/src/bindings/Performance.resi +7 -0
  92. package/src/bindings/Viem.res +0 -46
  93. package/src/bindings/Viem.res.mjs +1 -43
  94. package/src/sources/BlockStore.res +46 -0
  95. package/src/sources/BlockStore.res.mjs +24 -0
  96. package/src/sources/EventRouter.res +31 -49
  97. package/src/sources/EventRouter.res.mjs +12 -25
  98. package/src/sources/Evm.res +83 -72
  99. package/src/sources/Evm.res.mjs +53 -69
  100. package/src/sources/EvmChain.res +7 -34
  101. package/src/sources/EvmChain.res.mjs +6 -27
  102. package/src/sources/EvmRpcClient.res +71 -5
  103. package/src/sources/EvmRpcClient.res.mjs +13 -4
  104. package/src/sources/FieldMask.res +39 -0
  105. package/src/sources/FieldMask.res.mjs +42 -0
  106. package/src/sources/Fuel.res +9 -6
  107. package/src/sources/Fuel.res.mjs +5 -10
  108. package/src/sources/HyperFuelSource.res +46 -50
  109. package/src/sources/HyperFuelSource.res.mjs +64 -54
  110. package/src/sources/HyperSync.res +45 -42
  111. package/src/sources/HyperSync.res.mjs +68 -60
  112. package/src/sources/HyperSync.resi +14 -4
  113. package/src/sources/HyperSyncClient.res +107 -119
  114. package/src/sources/HyperSyncClient.res.mjs +36 -31
  115. package/src/sources/HyperSyncHeightStream.res +1 -8
  116. package/src/sources/HyperSyncHeightStream.res.mjs +0 -2
  117. package/src/sources/HyperSyncSource.res +60 -254
  118. package/src/sources/HyperSyncSource.res.mjs +57 -180
  119. package/src/sources/Rpc.res +15 -79
  120. package/src/sources/Rpc.res.mjs +25 -101
  121. package/src/sources/RpcSource.res +221 -514
  122. package/src/sources/RpcSource.res.mjs +216 -411
  123. package/src/sources/RpcWebSocketHeightStream.res +0 -5
  124. package/src/sources/RpcWebSocketHeightStream.res.mjs +0 -2
  125. package/src/sources/SimulateSource.res +44 -20
  126. package/src/sources/SimulateSource.res.mjs +41 -14
  127. package/src/sources/Source.res +34 -6
  128. package/src/sources/SourceManager.res +77 -19
  129. package/src/sources/SourceManager.res.mjs +63 -21
  130. package/src/sources/SourceManager.resi +10 -0
  131. package/src/sources/Svm.res +31 -16
  132. package/src/sources/Svm.res.mjs +36 -13
  133. package/src/sources/SvmHyperSyncClient.res +5 -32
  134. package/src/sources/SvmHyperSyncSource.res +159 -134
  135. package/src/sources/SvmHyperSyncSource.res.mjs +164 -129
  136. package/src/sources/TransactionStore.res +49 -0
  137. package/src/sources/TransactionStore.res.mjs +30 -0
  138. package/src/tui/Tui.res +13 -16
  139. package/src/tui/Tui.res.mjs +12 -14
  140. package/svm.schema.json +49 -37
  141. package/src/bindings/Hrtime.res +0 -58
  142. package/src/bindings/Hrtime.res.mjs +0 -90
  143. package/src/bindings/Hrtime.resi +0 -30
@@ -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
- | {eventConfig: {contractRegister: Some(contractRegister)}} => contractRegister
42
- | {eventConfig: {contractRegister: None, name: eventName}} =>
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 > (chainState->ChainState.fetchState).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
- let newItems = []
189
- for idx in 0 to parsedQueueItems->Array.length - 1 {
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.eventConfig.contractRegister !== None {
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.fetchState->FetchState.isReadyToEnterReorgThreshold
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 sourceManager->SourceManager.dispatch(
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=fetchState.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.eventConfig;
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.fetchState(chainState).knownHeight) {
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 - response.fromBlockQueried | 0) + 1 | 0);
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 newItems = [];
124
- for (let idx = 0, idx_finish = parsedQueueItems.length; idx < idx_finish; ++idx) {
125
- let item = parsedQueueItems[idx];
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(cs => FetchState.isReadyToEnterReorgThreshold(ChainState.fetchState(cs)));
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 SourceManager.dispatch(sourceManager, fetchState, async query => {
198
+ return await ChainState.dispatch(chainState, async query => {
181
199
  try {
182
- let response = await SourceManager.executeQuery(sourceManager, query, fetchState.knownHeight, isRealtime);
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,
@@ -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
- let fetchState = ChainState.fetchState(cs);
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
  }