envio 3.3.0-alpha.0 → 3.3.0-alpha.10

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 (140) hide show
  1. package/evm.schema.json +10 -0
  2. package/index.d.ts +45 -25
  3. package/package.json +7 -7
  4. package/src/Address.res +5 -2
  5. package/src/Address.res.mjs +3 -1
  6. package/src/Api.res +1 -1
  7. package/src/Api.res.mjs +1 -1
  8. package/src/Batch.res +0 -6
  9. package/src/Batch.res.mjs +1 -12
  10. package/src/BatchProcessing.res +7 -12
  11. package/src/BatchProcessing.res.mjs +8 -7
  12. package/src/Bin.res +3 -0
  13. package/src/Bin.res.mjs +4 -0
  14. package/src/ChainFetching.res +48 -16
  15. package/src/ChainFetching.res.mjs +36 -17
  16. package/src/ChainMetadata.res +1 -11
  17. package/src/ChainMetadata.res.mjs +1 -10
  18. package/src/ChainState.res +628 -149
  19. package/src/ChainState.res.mjs +440 -102
  20. package/src/ChainState.resi +74 -4
  21. package/src/Config.res +61 -33
  22. package/src/Config.res.mjs +50 -10
  23. package/src/ContractRegisterContext.res +2 -12
  24. package/src/ContractRegisterContext.res.mjs +3 -5
  25. package/src/Core.res +14 -3
  26. package/src/CrossChainState.res +142 -93
  27. package/src/CrossChainState.res.mjs +88 -60
  28. package/src/CrossChainState.resi +2 -10
  29. package/src/Ecosystem.res +5 -6
  30. package/src/Ecosystem.res.mjs +3 -3
  31. package/src/Env.res +0 -7
  32. package/src/Env.res.mjs +0 -6
  33. package/src/Envio.res +17 -11
  34. package/src/EnvioGlobal.res +53 -0
  35. package/src/EnvioGlobal.res.mjs +31 -0
  36. package/src/EventConfigBuilder.res +177 -88
  37. package/src/EventConfigBuilder.res.mjs +99 -42
  38. package/src/EventProcessing.res +74 -28
  39. package/src/EventProcessing.res.mjs +55 -29
  40. package/src/ExitOnCaughtUp.res +10 -2
  41. package/src/ExitOnCaughtUp.res.mjs +10 -1
  42. package/src/FetchState.res +558 -300
  43. package/src/FetchState.res.mjs +437 -423
  44. package/src/HandlerLoader.res +8 -104
  45. package/src/HandlerLoader.res.mjs +2 -81
  46. package/src/HandlerRegister.res +518 -144
  47. package/src/HandlerRegister.res.mjs +285 -133
  48. package/src/HandlerRegister.resi +24 -8
  49. package/src/IndexerLoop.res +2 -3
  50. package/src/IndexerLoop.res.mjs +1 -1
  51. package/src/IndexerState.res +10 -11
  52. package/src/IndexerState.res.mjs +14 -11
  53. package/src/IndexerState.resi +2 -5
  54. package/src/IndexingAddresses.res +108 -0
  55. package/src/IndexingAddresses.res.mjs +101 -0
  56. package/src/IndexingAddresses.resi +34 -0
  57. package/src/Internal.res +155 -46
  58. package/src/Internal.res.mjs +30 -2
  59. package/src/LoadLayer.res +5 -5
  60. package/src/LoadLayer.res.mjs +6 -6
  61. package/src/LogSelection.res +102 -165
  62. package/src/LogSelection.res.mjs +101 -116
  63. package/src/Main.res +71 -236
  64. package/src/Main.res.mjs +60 -145
  65. package/src/Metrics.res +74 -0
  66. package/src/Metrics.res.mjs +75 -0
  67. package/src/PgStorage.res +4 -4
  68. package/src/PgStorage.res.mjs +5 -5
  69. package/src/Prometheus.res +10 -74
  70. package/src/Prometheus.res.mjs +124 -186
  71. package/src/PruneStaleHistory.res +2 -2
  72. package/src/PruneStaleHistory.res.mjs +3 -3
  73. package/src/RawEvent.res +7 -2
  74. package/src/RawEvent.res.mjs +4 -4
  75. package/src/Rollback.res +3 -3
  76. package/src/Rollback.res.mjs +4 -4
  77. package/src/RollbackCommit.res +4 -1
  78. package/src/RollbackCommit.res.mjs +3 -2
  79. package/src/SimulateDeadInputTracker.res +85 -0
  80. package/src/SimulateDeadInputTracker.res.mjs +73 -0
  81. package/src/SimulateDeadInputTracker.resi +12 -0
  82. package/src/SimulateItems.res +91 -23
  83. package/src/SimulateItems.res.mjs +55 -32
  84. package/src/TestIndexer.res +54 -40
  85. package/src/TestIndexer.res.mjs +37 -30
  86. package/src/bindings/Performance.res +7 -0
  87. package/src/bindings/Performance.res.mjs +21 -0
  88. package/src/bindings/Performance.resi +7 -0
  89. package/src/bindings/Viem.res +0 -41
  90. package/src/bindings/Viem.res.mjs +1 -43
  91. package/src/sources/BlockStore.res +46 -0
  92. package/src/sources/BlockStore.res.mjs +24 -0
  93. package/src/sources/EventRouter.res +36 -33
  94. package/src/sources/EventRouter.res.mjs +13 -14
  95. package/src/sources/Evm.res +83 -72
  96. package/src/sources/Evm.res.mjs +53 -69
  97. package/src/sources/EvmChain.res +18 -20
  98. package/src/sources/EvmChain.res.mjs +15 -15
  99. package/src/sources/EvmRpcClient.res +74 -5
  100. package/src/sources/EvmRpcClient.res.mjs +13 -4
  101. package/src/sources/FieldMask.res +39 -0
  102. package/src/sources/FieldMask.res.mjs +42 -0
  103. package/src/sources/Fuel.res +9 -6
  104. package/src/sources/Fuel.res.mjs +5 -10
  105. package/src/sources/HyperFuelSource.res +46 -50
  106. package/src/sources/HyperFuelSource.res.mjs +64 -54
  107. package/src/sources/HyperSync.res +39 -7
  108. package/src/sources/HyperSync.res.mjs +57 -37
  109. package/src/sources/HyperSync.resi +12 -2
  110. package/src/sources/HyperSyncClient.res +22 -111
  111. package/src/sources/HyperSyncClient.res.mjs +2 -30
  112. package/src/sources/HyperSyncHeightStream.res +1 -8
  113. package/src/sources/HyperSyncHeightStream.res.mjs +0 -2
  114. package/src/sources/HyperSyncSource.res +94 -107
  115. package/src/sources/HyperSyncSource.res.mjs +82 -86
  116. package/src/sources/Rpc.res +15 -47
  117. package/src/sources/Rpc.res.mjs +25 -56
  118. package/src/sources/RpcSource.res +320 -467
  119. package/src/sources/RpcSource.res.mjs +268 -385
  120. package/src/sources/RpcWebSocketHeightStream.res +0 -5
  121. package/src/sources/RpcWebSocketHeightStream.res.mjs +0 -2
  122. package/src/sources/SimulateSource.res +10 -4
  123. package/src/sources/SimulateSource.res.mjs +16 -6
  124. package/src/sources/Source.res +34 -6
  125. package/src/sources/SourceManager.res +86 -27
  126. package/src/sources/SourceManager.res.mjs +84 -47
  127. package/src/sources/SourceManager.resi +12 -3
  128. package/src/sources/Svm.res +31 -16
  129. package/src/sources/Svm.res.mjs +36 -13
  130. package/src/sources/SvmHyperSyncClient.res +5 -32
  131. package/src/sources/SvmHyperSyncSource.res +159 -134
  132. package/src/sources/SvmHyperSyncSource.res.mjs +164 -129
  133. package/src/sources/TransactionStore.res +49 -0
  134. package/src/sources/TransactionStore.res.mjs +30 -0
  135. package/src/tui/Tui.res +13 -16
  136. package/src/tui/Tui.res.mjs +12 -14
  137. package/svm.schema.json +49 -37
  138. package/src/bindings/Hrtime.res +0 -58
  139. package/src/bindings/Hrtime.res.mjs +0 -90
  140. package/src/bindings/Hrtime.resi +0 -30
@@ -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") {
@@ -123,7 +143,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
123
143
  let newItems = [];
124
144
  for (let idx = 0, idx_finish = parsedQueueItems.length; idx < idx_finish; ++idx) {
125
145
  let item = parsedQueueItems[idx];
126
- if (item.eventConfig.contractRegister !== undefined) {
146
+ if (item.onEventRegistration.contractRegister !== undefined) {
127
147
  itemsWithContractRegister.push(item);
128
148
  }
129
149
  newItems.push(item);
@@ -133,7 +153,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
133
153
  applyQueryResponse(state, chain, newItems, newItemsWithDcs, knownHeight, {
134
154
  blockNumber: latestFetchedBlockNumber,
135
155
  blockTimestamp: latestFetchedBlockTimestamp
136
- }, query);
156
+ }, query, transactionStore, blockStore);
137
157
  ChainMetadata.stage(state);
138
158
  scheduleFetch();
139
159
  return scheduleProcessing();
@@ -144,7 +164,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
144
164
  }
145
165
  let newItemsWithDcs;
146
166
  try {
147
- newItemsWithDcs = await runContractRegistersOrThrow(itemsWithContractRegister, IndexerState.config(state));
167
+ newItemsWithDcs = await runContractRegistersOrThrow(itemsWithContractRegister, IndexerState.config(state), transactionStore, blockStore);
148
168
  } catch (raw_exn) {
149
169
  let exn = Primitive_exceptions.internalToException(raw_exn);
150
170
  return IndexerState.errorExit(state, ErrorHandling.make(exn, undefined, undefined));
@@ -159,7 +179,7 @@ function finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFe
159
179
  let chainState = IndexerState.getChainState(state, chain);
160
180
  ChainState.updateKnownHeight(chainState, knownHeight);
161
181
  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)));
182
+ let shouldEnterReorgThreshold = isBelowReorgThreshold && Object.values(IndexerState.chainStates(state)).every(ChainState.isReadyToEnterReorgThreshold);
163
183
  if (shouldEnterReorgThreshold) {
164
184
  IndexerState.enterReorgThreshold(state);
165
185
  }
@@ -167,19 +187,18 @@ function finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFe
167
187
  scheduleProcessing();
168
188
  }
169
189
 
170
- async function fetchChain(state, chain, concurrencyLimit, bufferLimit, stateId, scheduleFetch, scheduleProcessing, scheduleRollback) {
190
+ async function fetchChain(state, chain, action, stateId, scheduleFetch, scheduleProcessing, scheduleRollback) {
171
191
  let chainState = IndexerState.getChainState(state, chain);
172
192
  if (IndexerState.isResolvingReorg(state) || IndexerState.isStopped(state)) {
173
193
  return;
174
194
  }
175
- let fetchState = ChainState.fetchState(chainState);
176
195
  let isRealtime = IndexerState.isRealtime(state);
177
196
  let sourceManager = ChainState.sourceManager(chainState);
178
197
  let reducedPolling = !isRealtime;
179
198
  try {
180
- return await SourceManager.fetchNext(sourceManager, fetchState, async query => {
199
+ return await ChainState.dispatch(chainState, async query => {
181
200
  try {
182
- let response = await SourceManager.executeQuery(sourceManager, query, fetchState.knownHeight, isRealtime);
201
+ let response = await SourceManager.executeQuery(sourceManager, query, ChainState.knownHeight(chainState), isRealtime);
183
202
  return await onQueryResponse(state, {
184
203
  chain: chain,
185
204
  response: response,
@@ -189,7 +208,7 @@ async function fetchChain(state, chain, concurrencyLimit, bufferLimit, stateId,
189
208
  let exn = Primitive_exceptions.internalToException(raw_exn);
190
209
  return IndexerState.errorExit(state, ErrorHandling.make(exn, undefined, undefined));
191
210
  }
192
- }, knownHeight => SourceManager.waitForNewBlock(sourceManager, knownHeight, isRealtime, reducedPolling), knownHeight => finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFetch, scheduleProcessing), concurrencyLimit, bufferLimit, stateId);
211
+ }, knownHeight => SourceManager.waitForNewBlock(sourceManager, knownHeight, isRealtime, reducedPolling), knownHeight => finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFetch, scheduleProcessing), action, stateId);
193
212
  } catch (raw_exn) {
194
213
  let exn = Primitive_exceptions.internalToException(raw_exn);
195
214
  return IndexerState.errorExit(state, ErrorHandling.make(exn, undefined, IndexerState.unexpectedErrorMsg));
@@ -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
  }