envio 3.6.1 → 3.7.0

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 (80) hide show
  1. package/index.d.ts +197 -9
  2. package/package.json +6 -6
  3. package/src/Batch.res +64 -25
  4. package/src/Batch.res.mjs +69 -46
  5. package/src/ChainFetching.res +13 -17
  6. package/src/ChainFetching.res.mjs +9 -14
  7. package/src/ChainState.res +160 -119
  8. package/src/ChainState.res.mjs +75 -46
  9. package/src/ChainState.resi +15 -12
  10. package/src/Config.res +9 -2
  11. package/src/Config.res.mjs +4 -4
  12. package/src/Core.res +5 -0
  13. package/src/Ecosystem.res +0 -1
  14. package/src/Envio.res +16 -3
  15. package/src/EventConfigBuilder.res +155 -40
  16. package/src/EventConfigBuilder.res.mjs +76 -24
  17. package/src/EventProcessing.res +4 -8
  18. package/src/EventProcessing.res.mjs +4 -4
  19. package/src/EventUtils.res +3 -47
  20. package/src/FetchState.res +124 -104
  21. package/src/FetchState.res.mjs +116 -100
  22. package/src/HandlerRegister.res +108 -2
  23. package/src/HandlerRegister.res.mjs +59 -10
  24. package/src/HandlerRegister.resi +4 -0
  25. package/src/Internal.res +84 -24
  26. package/src/Internal.res.mjs +33 -2
  27. package/src/LazyLoader.res +12 -11
  28. package/src/LazyLoader.res.mjs +13 -7
  29. package/src/Main.res +22 -9
  30. package/src/Main.res.mjs +18 -5
  31. package/src/MemoryStorage.res +724 -0
  32. package/src/MemoryStorage.res.mjs +601 -0
  33. package/src/PgStorage.res +18 -7
  34. package/src/PgStorage.res.mjs +14 -11
  35. package/src/ReorgDetection.res +0 -222
  36. package/src/ReorgDetection.res.mjs +0 -163
  37. package/src/Rollback.res +14 -15
  38. package/src/Rollback.res.mjs +4 -5
  39. package/src/SimulateItems.res +2 -2
  40. package/src/Utils.res +3 -0
  41. package/src/bindings/ClickHouse.res +16 -11
  42. package/src/bindings/ClickHouse.res.mjs +10 -10
  43. package/src/bindings/Vitest.res +1 -1
  44. package/src/sources/BlockStore.res +115 -5
  45. package/src/sources/BlockStore.res.mjs +25 -0
  46. package/src/sources/Evm.res +0 -1
  47. package/src/sources/Evm.res.mjs +0 -1
  48. package/src/sources/EvmHyperSyncSource.res +19 -84
  49. package/src/sources/EvmHyperSyncSource.res.mjs +24 -60
  50. package/src/sources/Fuel.res +24 -4
  51. package/src/sources/Fuel.res.mjs +23 -3
  52. package/src/sources/FuelHyperSync.res +8 -3
  53. package/src/sources/FuelHyperSync.res.mjs +5 -4
  54. package/src/sources/FuelHyperSync.resi +3 -1
  55. package/src/sources/FuelHyperSyncClient.res +7 -10
  56. package/src/sources/FuelHyperSyncSource.res +18 -45
  57. package/src/sources/FuelHyperSyncSource.res.mjs +18 -35
  58. package/src/sources/HyperSync.res +49 -229
  59. package/src/sources/HyperSync.res.mjs +74 -191
  60. package/src/sources/HyperSync.resi +11 -35
  61. package/src/sources/HyperSyncClient.res +9 -79
  62. package/src/sources/HyperSyncClient.res.mjs +2 -6
  63. package/src/sources/RequestStat.res +5 -0
  64. package/src/sources/RequestStat.res.mjs +2 -0
  65. package/src/sources/RpcSource.res +149 -43
  66. package/src/sources/RpcSource.res.mjs +104 -41
  67. package/src/sources/SimulateSource.res +8 -5
  68. package/src/sources/SimulateSource.res.mjs +6 -6
  69. package/src/sources/Source.res +89 -16
  70. package/src/sources/Source.res.mjs +50 -1
  71. package/src/sources/SourceManager.res +255 -50
  72. package/src/sources/SourceManager.res.mjs +149 -55
  73. package/src/sources/SourceManager.resi +2 -6
  74. package/src/sources/Svm.res +0 -7
  75. package/src/sources/Svm.res.mjs +0 -8
  76. package/src/sources/SvmHyperSyncClient.res +21 -16
  77. package/src/sources/SvmHyperSyncClient.res.mjs +3 -4
  78. package/src/sources/SvmHyperSyncSource.res +25 -117
  79. package/src/sources/SvmHyperSyncSource.res.mjs +8 -121
  80. package/svm.schema.json +3 -2
@@ -11,17 +11,17 @@ type partitionQueryResponse = {
11
11
  let runContractRegistersOrThrow = async (
12
12
  ~itemsWithContractRegister: array<Internal.item>,
13
13
  ~config: Config.t,
14
+ ~chainState: ChainState.t,
14
15
  ~transactionStore: option<TransactionStore.t>,
15
- ~blockStore: option<BlockStore.t>,
16
16
  ) => {
17
17
  // contractRegister handlers can read event.transaction and event.block, so
18
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.
19
+ // items belong to the chain being fetched: transactions come from its
20
+ // response page, blocks from the chain store the page was merged into.
20
21
  await ChainState.materializePageItems(
21
22
  ~items=itemsWithContractRegister,
22
23
  ~transactionStore,
23
- ~blockStore,
24
- ~ecosystem=config.ecosystem.name,
24
+ ~blockStore=chainState->ChainState.blockStore,
25
25
  )
26
26
 
27
27
  let registrations: array<AddressStore.registration> = []
@@ -111,10 +111,8 @@ let rec onQueryResponse = async (
111
111
  transactionStore,
112
112
  blockStore,
113
113
  latestFetchedBlockNumber,
114
- latestFetchedBlockTimestamp,
115
114
  stats,
116
115
  knownHeight,
117
- blockHashes,
118
116
  fromBlockQueried,
119
117
  } = response
120
118
 
@@ -150,7 +148,7 @@ let rec onQueryResponse = async (
150
148
  })
151
149
  }
152
150
 
153
- let reorgResult = chainState->ChainState.registerReorgGuard(~blockHashes, ~knownHeight)
151
+ let reorgResult = chainState->ChainState.registerReorgGuard(~blockStore, ~knownHeight)
154
152
 
155
153
  let rollbackWithReorgDetectedBlockNumber = switch reorgResult {
156
154
  | ReorgDetected(reorgDetected) => {
@@ -158,13 +156,17 @@ let rec onQueryResponse = async (
158
156
  ->ChainState.logger
159
157
  ->Logging.childInfo(
160
158
  reorgDetected->ReorgDetection.reorgDetectedToLogParams(
161
- ~shouldRollbackOnReorg=(state->IndexerState.config).shouldRollbackOnReorg,
159
+ ~shouldRollbackOnReorg=chainState->ChainState.shouldRollbackOnReorg,
162
160
  ),
163
161
  )
164
162
  chainState->ChainState.recordReorgDetected(
165
163
  ~blockNumber=reorgDetected.scannedBlock.blockNumber,
166
164
  )
167
- if (state->IndexerState.config).shouldRollbackOnReorg {
165
+
166
+ // Must agree with the `reportOnly` flag registerReorgGuard passed to
167
+ // the merge: a discarded page (rollback mode) needs the rollback to
168
+ // actually happen, or the stale stored hash re-reports forever.
169
+ if chainState->ChainState.shouldRollbackOnReorg {
168
170
  Some(reorgDetected.scannedBlock.blockNumber)
169
171
  } else {
170
172
  None
@@ -224,13 +226,9 @@ let rec onQueryResponse = async (
224
226
  ~newItems,
225
227
  ~newRegistrations,
226
228
  ~knownHeight,
227
- ~latestFetchedBlock={
228
- FetchState.blockNumber: latestFetchedBlockNumber,
229
- blockTimestamp: latestFetchedBlockTimestamp,
230
- },
229
+ ~latestFetchedBlock=latestFetchedBlockNumber,
231
230
  ~query,
232
231
  ~transactionStore,
233
- ~blockStore,
234
232
  )
235
233
  ChainMetadata.stage(state)
236
234
  scheduleFetch()
@@ -243,8 +241,8 @@ let rec onQueryResponse = async (
243
241
  switch await runContractRegistersOrThrow(
244
242
  ~itemsWithContractRegister,
245
243
  ~config=state->IndexerState.config,
244
+ ~chainState,
246
245
  ~transactionStore,
247
- ~blockStore,
248
246
  ) {
249
247
  | exception exn => IndexerState.errorExit(state, exn->ErrorHandling.make)
250
248
  | newRegistrations => proceed(~newRegistrations)
@@ -262,7 +260,6 @@ and applyQueryResponse = (
262
260
  ~latestFetchedBlock,
263
261
  ~query,
264
262
  ~transactionStore,
265
- ~blockStore,
266
263
  ) => {
267
264
  let chainState = state->IndexerState.getChainState(~chainId)
268
265
  let wasFetchingAtHead = chainState->ChainState.isFetchingAtHead
@@ -274,7 +271,6 @@ and applyQueryResponse = (
274
271
  ~newRegistrations,
275
272
  ~knownHeight,
276
273
  ~transactionStore,
277
- ~blockStore,
278
274
  )
279
275
 
280
276
  // In auto-exit mode, set endBlock to the first event's block when events arrive.
@@ -16,8 +16,8 @@ import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
16
16
  import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
17
17
  import * as ContractRegisterContext from "./ContractRegisterContext.res.mjs";
18
18
 
19
- async function runContractRegistersOrThrow(itemsWithContractRegister, config, transactionStore, blockStore) {
20
- await ChainState.materializePageItems(itemsWithContractRegister, transactionStore, blockStore, config.ecosystem.name);
19
+ async function runContractRegistersOrThrow(itemsWithContractRegister, config, chainState, transactionStore) {
20
+ await ChainState.materializePageItems(itemsWithContractRegister, transactionStore, ChainState.blockStore(chainState));
21
21
  let registrations = [];
22
22
  let onRegister = (item, contractAddress, contractName) => {
23
23
  registrations.push({
@@ -63,10 +63,10 @@ async function runContractRegistersOrThrow(itemsWithContractRegister, config, tr
63
63
  return registrations;
64
64
  }
65
65
 
66
- function applyQueryResponse(state, chainId, newItems, newRegistrations, knownHeight, latestFetchedBlock, query, transactionStore, blockStore) {
66
+ function applyQueryResponse(state, chainId, newItems, newRegistrations, knownHeight, latestFetchedBlock, query, transactionStore) {
67
67
  let chainState = IndexerState.getChainState(state, chainId);
68
68
  let wasFetchingAtHead = ChainState.isFetchingAtHead(chainState);
69
- ChainState.handleQueryResult(chainState, query, newItems, newRegistrations, latestFetchedBlock, knownHeight, transactionStore, blockStore);
69
+ ChainState.handleQueryResult(chainState, query, newItems, newRegistrations, latestFetchedBlock, knownHeight, transactionStore);
70
70
  if (IndexerState.exitAfterFirstEventBlock(state) && newItems.length !== 0) {
71
71
  ChainState.setEndBlockToFirstEvent(chainState, newItems[0].blockNumber);
72
72
  }
@@ -84,10 +84,8 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
84
84
  }
85
85
  let chainState = IndexerState.getChainState(state, chainId);
86
86
  let stats = response.stats;
87
- let latestFetchedBlockTimestamp = response.latestFetchedBlockTimestamp;
88
87
  let latestFetchedBlockNumber = response.latestFetchedBlockNumber;
89
88
  let fromBlockQueried = response.fromBlockQueried;
90
- let blockStore = response.blockStore;
91
89
  let transactionStore = response.transactionStore;
92
90
  let parsedQueueItems = response.parsedQueueItems;
93
91
  let knownHeight = response.knownHeight;
@@ -119,15 +117,15 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
119
117
  numContractRegisterEvents: numContractRegisterEvents
120
118
  });
121
119
  }
122
- let reorgResult = ChainState.registerReorgGuard(chainState, response.blockHashes, knownHeight);
120
+ let reorgResult = ChainState.registerReorgGuard(chainState, response.blockStore, knownHeight);
123
121
  let rollbackWithReorgDetectedBlockNumber;
124
122
  if (typeof reorgResult !== "object") {
125
123
  rollbackWithReorgDetectedBlockNumber = undefined;
126
124
  } else {
127
125
  let reorgDetected = reorgResult._0;
128
- Logging.childInfo(ChainState.logger(chainState), ReorgDetection.reorgDetectedToLogParams(reorgDetected, IndexerState.config(state).shouldRollbackOnReorg));
126
+ Logging.childInfo(ChainState.logger(chainState), ReorgDetection.reorgDetectedToLogParams(reorgDetected, ChainState.shouldRollbackOnReorg(chainState)));
129
127
  ChainState.recordReorgDetected(chainState, reorgDetected.scannedBlock.blockNumber);
130
- rollbackWithReorgDetectedBlockNumber = IndexerState.config(state).shouldRollbackOnReorg ? reorgDetected.scannedBlock.blockNumber : undefined;
128
+ rollbackWithReorgDetectedBlockNumber = ChainState.shouldRollbackOnReorg(chainState) ? reorgDetected.scannedBlock.blockNumber : undefined;
131
129
  }
132
130
  if (rollbackWithReorgDetectedBlockNumber !== undefined) {
133
131
  let match = IndexerState.rollbackState(state);
@@ -146,10 +144,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
146
144
  }
147
145
  let proceed = newRegistrations => {
148
146
  if (!IndexerState.isStale(state, stateId)) {
149
- applyQueryResponse(state, chainId, parsedQueueItems, newRegistrations, knownHeight, {
150
- blockNumber: latestFetchedBlockNumber,
151
- blockTimestamp: latestFetchedBlockTimestamp
152
- }, query, transactionStore, blockStore);
147
+ applyQueryResponse(state, chainId, parsedQueueItems, newRegistrations, knownHeight, latestFetchedBlockNumber, query, transactionStore);
153
148
  ChainMetadata.stage(state);
154
149
  scheduleFetch();
155
150
  return scheduleProcessing();
@@ -160,7 +155,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
160
155
  }
161
156
  let newRegistrations;
162
157
  try {
163
- newRegistrations = await runContractRegistersOrThrow(itemsWithContractRegister, IndexerState.config(state), transactionStore, blockStore);
158
+ newRegistrations = await runContractRegistersOrThrow(itemsWithContractRegister, IndexerState.config(state), chainState, transactionStore);
164
159
  } catch (raw_exn) {
165
160
  let exn = Primitive_exceptions.internalToException(raw_exn);
166
161
  return IndexerState.errorExit(state, ErrorHandling.make(exn, undefined, undefined));