envio 3.0.0-alpha.21 → 3.0.0-alpha.22

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 (219) hide show
  1. package/bin.mjs +2 -48
  2. package/evm.schema.json +67 -0
  3. package/fuel.schema.json +67 -0
  4. package/index.d.ts +822 -38
  5. package/index.js +5 -3
  6. package/package.json +10 -8
  7. package/rescript.json +5 -9
  8. package/src/Address.res +4 -5
  9. package/src/Address.res.mjs +9 -12
  10. package/src/Api.res +15 -0
  11. package/src/Api.res.mjs +20 -0
  12. package/src/Batch.res +32 -34
  13. package/src/Batch.res.mjs +172 -187
  14. package/src/Bin.res +89 -0
  15. package/src/Bin.res.mjs +97 -0
  16. package/src/ChainFetcher.res +33 -57
  17. package/src/ChainFetcher.res.mjs +197 -227
  18. package/src/ChainManager.res +6 -14
  19. package/src/ChainManager.res.mjs +74 -85
  20. package/src/ChainMap.res +14 -16
  21. package/src/ChainMap.res.mjs +38 -38
  22. package/src/Config.res +193 -135
  23. package/src/Config.res.mjs +566 -592
  24. package/src/Core.res +182 -0
  25. package/src/Core.res.mjs +207 -0
  26. package/src/Ecosystem.res +25 -4
  27. package/src/Ecosystem.res.mjs +12 -13
  28. package/src/Env.res +20 -13
  29. package/src/Env.res.mjs +124 -113
  30. package/src/EnvSafe.res +269 -0
  31. package/src/EnvSafe.res.mjs +296 -0
  32. package/src/EnvSafe.resi +18 -0
  33. package/src/Envio.res +37 -26
  34. package/src/Envio.res.mjs +59 -60
  35. package/src/ErrorHandling.res +2 -2
  36. package/src/ErrorHandling.res.mjs +15 -15
  37. package/src/EventConfigBuilder.res +219 -81
  38. package/src/EventConfigBuilder.res.mjs +259 -202
  39. package/src/EventProcessing.res +27 -38
  40. package/src/EventProcessing.res.mjs +165 -183
  41. package/src/EventUtils.res +11 -11
  42. package/src/EventUtils.res.mjs +21 -22
  43. package/src/EvmTypes.res +0 -1
  44. package/src/EvmTypes.res.mjs +5 -5
  45. package/src/FetchState.res +360 -256
  46. package/src/FetchState.res.mjs +958 -914
  47. package/src/GlobalState.res +365 -351
  48. package/src/GlobalState.res.mjs +958 -992
  49. package/src/GlobalStateManager.res +1 -2
  50. package/src/GlobalStateManager.res.mjs +36 -44
  51. package/src/HandlerLoader.res +107 -23
  52. package/src/HandlerLoader.res.mjs +128 -38
  53. package/src/HandlerRegister.res +127 -103
  54. package/src/HandlerRegister.res.mjs +164 -164
  55. package/src/HandlerRegister.resi +12 -4
  56. package/src/Hasura.res +35 -22
  57. package/src/Hasura.res.mjs +158 -167
  58. package/src/InMemoryStore.res +20 -27
  59. package/src/InMemoryStore.res.mjs +64 -80
  60. package/src/InMemoryTable.res +34 -39
  61. package/src/InMemoryTable.res.mjs +165 -170
  62. package/src/Internal.res +52 -33
  63. package/src/Internal.res.mjs +84 -81
  64. package/src/LazyLoader.res.mjs +55 -61
  65. package/src/LoadLayer.res +77 -78
  66. package/src/LoadLayer.res.mjs +160 -189
  67. package/src/LoadManager.res +16 -21
  68. package/src/LoadManager.res.mjs +79 -84
  69. package/src/LogSelection.res +236 -68
  70. package/src/LogSelection.res.mjs +211 -141
  71. package/src/Logging.res +13 -9
  72. package/src/Logging.res.mjs +130 -143
  73. package/src/Main.res +428 -51
  74. package/src/Main.res.mjs +528 -271
  75. package/src/Persistence.res +77 -84
  76. package/src/Persistence.res.mjs +131 -132
  77. package/src/PgStorage.res +291 -167
  78. package/src/PgStorage.res.mjs +797 -817
  79. package/src/Prometheus.res +50 -58
  80. package/src/Prometheus.res.mjs +345 -373
  81. package/src/ReorgDetection.res +22 -24
  82. package/src/ReorgDetection.res.mjs +100 -106
  83. package/src/SafeCheckpointTracking.res +7 -7
  84. package/src/SafeCheckpointTracking.res.mjs +40 -43
  85. package/src/SimulateItems.res +41 -49
  86. package/src/SimulateItems.res.mjs +257 -272
  87. package/src/Sink.res +2 -2
  88. package/src/Sink.res.mjs +22 -26
  89. package/src/TableIndices.res +1 -2
  90. package/src/TableIndices.res.mjs +42 -48
  91. package/src/TestIndexer.res +196 -189
  92. package/src/TestIndexer.res.mjs +536 -536
  93. package/src/TestIndexerProxyStorage.res +15 -16
  94. package/src/TestIndexerProxyStorage.res.mjs +98 -122
  95. package/src/TestIndexerWorker.res +4 -0
  96. package/src/TestIndexerWorker.res.mjs +7 -0
  97. package/src/Throttler.res +3 -3
  98. package/src/Throttler.res.mjs +23 -24
  99. package/src/Time.res +1 -1
  100. package/src/Time.res.mjs +18 -21
  101. package/src/TopicFilter.res +3 -3
  102. package/src/TopicFilter.res.mjs +29 -30
  103. package/src/UserContext.res +93 -54
  104. package/src/UserContext.res.mjs +197 -182
  105. package/src/Utils.res +141 -86
  106. package/src/Utils.res.mjs +334 -295
  107. package/src/bindings/BigDecimal.res +0 -2
  108. package/src/bindings/BigDecimal.res.mjs +19 -23
  109. package/src/bindings/ClickHouse.res +28 -27
  110. package/src/bindings/ClickHouse.res.mjs +243 -240
  111. package/src/bindings/DateFns.res +11 -11
  112. package/src/bindings/DateFns.res.mjs +7 -7
  113. package/src/bindings/EventSource.res.mjs +2 -2
  114. package/src/bindings/Express.res +2 -5
  115. package/src/bindings/Hrtime.res +2 -2
  116. package/src/bindings/Hrtime.res.mjs +30 -32
  117. package/src/bindings/Lodash.res.mjs +1 -1
  118. package/src/bindings/NodeJs.res +14 -9
  119. package/src/bindings/NodeJs.res.mjs +20 -20
  120. package/src/bindings/Pino.res +8 -10
  121. package/src/bindings/Pino.res.mjs +40 -43
  122. package/src/bindings/Postgres.res +2 -5
  123. package/src/bindings/Postgres.res.mjs +9 -9
  124. package/src/bindings/PromClient.res +17 -2
  125. package/src/bindings/PromClient.res.mjs +30 -7
  126. package/src/bindings/SDSL.res.mjs +2 -2
  127. package/src/bindings/Viem.res +4 -4
  128. package/src/bindings/Viem.res.mjs +20 -22
  129. package/src/bindings/Vitest.res +1 -1
  130. package/src/bindings/Vitest.res.mjs +2 -2
  131. package/src/bindings/WebSocket.res +1 -1
  132. package/src/db/EntityHistory.res +9 -3
  133. package/src/db/EntityHistory.res.mjs +84 -59
  134. package/src/db/InternalTable.res +62 -60
  135. package/src/db/InternalTable.res.mjs +271 -203
  136. package/src/db/Schema.res +1 -2
  137. package/src/db/Schema.res.mjs +28 -32
  138. package/src/db/Table.res +28 -27
  139. package/src/db/Table.res.mjs +276 -292
  140. package/src/sources/EventRouter.res +21 -16
  141. package/src/sources/EventRouter.res.mjs +55 -57
  142. package/src/sources/Evm.res +17 -1
  143. package/src/sources/Evm.res.mjs +16 -8
  144. package/src/sources/EvmChain.res +15 -17
  145. package/src/sources/EvmChain.res.mjs +40 -42
  146. package/src/sources/Fuel.res +14 -1
  147. package/src/sources/Fuel.res.mjs +16 -8
  148. package/src/sources/FuelSDK.res +1 -1
  149. package/src/sources/FuelSDK.res.mjs +6 -8
  150. package/src/sources/HyperFuel.res +8 -10
  151. package/src/sources/HyperFuel.res.mjs +113 -123
  152. package/src/sources/HyperFuelClient.res.mjs +6 -7
  153. package/src/sources/HyperFuelSource.res +19 -20
  154. package/src/sources/HyperFuelSource.res.mjs +339 -356
  155. package/src/sources/HyperSync.res +11 -13
  156. package/src/sources/HyperSync.res.mjs +206 -220
  157. package/src/sources/HyperSyncClient.res +5 -7
  158. package/src/sources/HyperSyncClient.res.mjs +70 -75
  159. package/src/sources/HyperSyncHeightStream.res +8 -9
  160. package/src/sources/HyperSyncHeightStream.res.mjs +78 -86
  161. package/src/sources/HyperSyncJsonApi.res +18 -15
  162. package/src/sources/HyperSyncJsonApi.res.mjs +201 -231
  163. package/src/sources/HyperSyncSource.res +17 -21
  164. package/src/sources/HyperSyncSource.res.mjs +268 -290
  165. package/src/sources/Rpc.res +5 -5
  166. package/src/sources/Rpc.res.mjs +168 -192
  167. package/src/sources/RpcSource.res +166 -167
  168. package/src/sources/RpcSource.res.mjs +972 -1046
  169. package/src/sources/RpcWebSocketHeightStream.res +10 -11
  170. package/src/sources/RpcWebSocketHeightStream.res.mjs +131 -145
  171. package/src/sources/SimulateSource.res +1 -1
  172. package/src/sources/SimulateSource.res.mjs +35 -38
  173. package/src/sources/Source.res +1 -1
  174. package/src/sources/Source.res.mjs +3 -3
  175. package/src/sources/SourceManager.res +39 -20
  176. package/src/sources/SourceManager.res.mjs +340 -371
  177. package/src/sources/SourceManager.resi +2 -1
  178. package/src/sources/Svm.res +12 -5
  179. package/src/sources/Svm.res.mjs +44 -41
  180. package/src/tui/Tui.res +23 -12
  181. package/src/tui/Tui.res.mjs +292 -290
  182. package/src/tui/bindings/Ink.res +2 -4
  183. package/src/tui/bindings/Ink.res.mjs +35 -41
  184. package/src/tui/components/BufferedProgressBar.res +7 -7
  185. package/src/tui/components/BufferedProgressBar.res.mjs +46 -46
  186. package/src/tui/components/CustomHooks.res +1 -2
  187. package/src/tui/components/CustomHooks.res.mjs +102 -122
  188. package/src/tui/components/Messages.res +1 -2
  189. package/src/tui/components/Messages.res.mjs +38 -42
  190. package/src/tui/components/SyncETA.res +10 -11
  191. package/src/tui/components/SyncETA.res.mjs +178 -196
  192. package/src/tui/components/TuiData.res +1 -1
  193. package/src/tui/components/TuiData.res.mjs +7 -6
  194. package/src/vendored/Rest.res +52 -66
  195. package/src/vendored/Rest.res.mjs +324 -364
  196. package/svm.schema.json +67 -0
  197. package/src/Address.gen.ts +0 -8
  198. package/src/Config.gen.ts +0 -19
  199. package/src/Envio.gen.ts +0 -55
  200. package/src/EvmTypes.gen.ts +0 -6
  201. package/src/InMemoryStore.gen.ts +0 -6
  202. package/src/Internal.gen.ts +0 -64
  203. package/src/PgStorage.gen.ts +0 -10
  204. package/src/PgStorage.res.d.mts +0 -5
  205. package/src/Types.ts +0 -56
  206. package/src/bindings/BigDecimal.gen.ts +0 -14
  207. package/src/bindings/BigDecimal.res.d.mts +0 -5
  208. package/src/bindings/BigInt.gen.ts +0 -10
  209. package/src/bindings/BigInt.res +0 -70
  210. package/src/bindings/BigInt.res.d.mts +0 -5
  211. package/src/bindings/BigInt.res.mjs +0 -154
  212. package/src/bindings/Ethers.res.d.mts +0 -5
  213. package/src/bindings/Pino.gen.ts +0 -17
  214. package/src/bindings/Postgres.gen.ts +0 -8
  215. package/src/bindings/Postgres.res.d.mts +0 -5
  216. package/src/bindings/Promise.res +0 -67
  217. package/src/bindings/Promise.res.mjs +0 -26
  218. package/src/db/InternalTable.gen.ts +0 -36
  219. package/src/sources/HyperSyncClient.gen.ts +0 -19
@@ -1,4 +1,3 @@
1
- open Belt
2
1
  module type State = {
3
2
  type t
4
3
  type action
@@ -40,7 +39,7 @@ module MakeManager = (S: State) => {
40
39
  }
41
40
  and dispatchTask = (self, task: S.task) => {
42
41
  let stateId = self.state->S.getId
43
- Js.Global.setTimeout(() => {
42
+ setTimeout(() => {
44
43
  if stateId !== self.state->S.getId {
45
44
  Logging.info("Invalidated task discarded")
46
45
  } else {
@@ -1,60 +1,52 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
3
  import * as Logging from "./Logging.res.mjs";
4
- import * as $$Promise from "./bindings/Promise.res.mjs";
5
4
  import * as Process from "process";
6
- import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
7
5
  import * as GlobalState from "./GlobalState.res.mjs";
8
6
  import * as ErrorHandling from "./ErrorHandling.res.mjs";
9
- import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
7
+ import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
8
+ import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
10
9
 
11
10
  function make(state, onErrorOpt) {
12
- var onError = onErrorOpt !== undefined ? onErrorOpt : (function (e) {
13
- ErrorHandling.log(ErrorHandling.make(e, undefined, "Indexer has failed with an unexpected error"));
14
- Process.exit(1);
15
- });
11
+ let onError = onErrorOpt !== undefined ? onErrorOpt : e => {
12
+ ErrorHandling.log(ErrorHandling.make(e, undefined, "Indexer has failed with an unexpected error"));
13
+ Process.exit(1);
14
+ };
16
15
  return {
17
- state: state,
18
- onError: onError
19
- };
16
+ state: state,
17
+ onError: onError
18
+ };
20
19
  }
21
20
 
22
21
  function dispatchAction(stateIdOpt, self, action) {
23
- var stateId = stateIdOpt !== undefined ? stateIdOpt : 0;
22
+ let stateId = stateIdOpt !== undefined ? stateIdOpt : 0;
24
23
  try {
25
- var reducer = stateId === GlobalState.getId(self.state) ? GlobalState.actionReducer : GlobalState.invalidatedActionReducer;
26
- var match = reducer(self.state, action);
24
+ let reducer = stateId === GlobalState.getId(self.state) ? GlobalState.actionReducer : GlobalState.invalidatedActionReducer;
25
+ let match = reducer(self.state, action);
27
26
  self.state = match[0];
28
- return Belt_Array.forEach(match[1], (function (task) {
29
- dispatchTask(self, task);
30
- }));
31
- }
32
- catch (raw_e){
33
- var e = Caml_js_exceptions.internalToOCamlException(raw_e);
34
- return self.onError(e);
27
+ match[1].forEach(task => dispatchTask(self, task));
28
+ return;
29
+ } catch (raw_e) {
30
+ return self.onError(Primitive_exceptions.internalToException(raw_e));
35
31
  }
36
32
  }
37
33
 
38
34
  function dispatchTask(self, task) {
39
- var stateId = GlobalState.getId(self.state);
40
- setTimeout((function () {
41
- if (stateId !== GlobalState.getId(self.state)) {
42
- return Logging.info("Invalidated task discarded");
43
- }
44
- try {
45
- $$Promise.$$catch(GlobalState.taskReducer(self.state, task, (function (action) {
46
- dispatchAction(stateId, self, action);
47
- })), (function (e) {
48
- self.onError(e);
49
- return Promise.resolve();
50
- }));
51
- return ;
52
- }
53
- catch (raw_e){
54
- var e = Caml_js_exceptions.internalToOCamlException(raw_e);
55
- return self.onError(e);
56
- }
57
- }), 0);
35
+ let stateId = GlobalState.getId(self.state);
36
+ setTimeout(() => {
37
+ if (stateId !== GlobalState.getId(self.state)) {
38
+ return Logging.info("Invalidated task discarded");
39
+ }
40
+ try {
41
+ Stdlib_Promise.$$catch(GlobalState.taskReducer(self.state, task, action => dispatchAction(stateId, self, action)), e => {
42
+ self.onError(e);
43
+ return Promise.resolve();
44
+ });
45
+ return;
46
+ } catch (raw_e) {
47
+ return self.onError(Primitive_exceptions.internalToException(raw_e));
48
+ }
49
+ }, 0);
58
50
  }
59
51
 
60
52
  function getState(self) {
@@ -66,10 +58,10 @@ function setState(self, state) {
66
58
  }
67
59
 
68
60
  export {
69
- make ,
70
- dispatchAction ,
71
- dispatchTask ,
72
- getState ,
73
- setState ,
61
+ make,
62
+ dispatchAction,
63
+ dispatchTask,
64
+ getState,
65
+ setState,
74
66
  }
75
67
  /* Logging Not a pure module */
@@ -25,11 +25,14 @@ let registerContractHandlers = async (~contractName, ~handler: option<string>) =
25
25
  let _ = await Utils.importPath(toImportUrl(handlerPath))
26
26
  } catch {
27
27
  | exn =>
28
+ let cause = exn->Utils.prettifyExn->Obj.magic
28
29
  Logging.errorWithExn(
29
30
  exn,
30
31
  `Failed to load handler file for contract ${contractName}: ${handlerPath}`,
31
32
  )
32
- Js.Exn.raiseError(`Failed to load handler file for contract ${contractName}: ${handlerPath}`)
33
+ JsError.throwWithMessage(
34
+ `Failed to load handler file for contract ${contractName}: ${handlerPath}. Cause: ${cause}`,
35
+ )
33
36
  }
34
37
  }
35
38
  }
@@ -41,16 +44,16 @@ let autoLoadFromSrcHandlers = async (~handlers: string) => {
41
44
  let iterator = globIterator(srcPattern)
42
45
  let files = await iterator->Utils.Array.fromAsyncIterator
43
46
  // Filter out test and spec files
44
- files->Js.Array2.filter(file => {
47
+ files->Array.filter(file => {
45
48
  !(
46
- file->Js.String2.includes(".test.") ||
47
- file->Js.String2.includes(".spec.") ||
48
- file->Js.String2.includes("_test.")
49
+ file->String.includes(".test.") ||
50
+ file->String.includes(".spec.") ||
51
+ file->String.includes("_test.")
49
52
  )
50
53
  })
51
54
  } catch {
52
55
  | exn =>
53
- Js.Exn.raiseError(
56
+ JsError.throwWithMessage(
54
57
  `Failed to glob src/handlers directory for auto-loading handlers. Pattern: ${srcPattern}. Before continuing, check that you're using Node.js >=22 version. Error: ${exn
55
58
  ->Utils.prettifyExn
56
59
  ->Obj.magic}`,
@@ -58,19 +61,100 @@ let autoLoadFromSrcHandlers = async (~handlers: string) => {
58
61
  }
59
62
 
60
63
  // Import handler files using absolute file:// URLs resolved from cwd
61
- let _ =
62
- await handlerFiles
63
- ->Js.Array2.map(file => {
64
- Utils.importPath(toImportUrl(file))->Promise.catch(exn => {
65
- Logging.errorWithExn(exn, `Failed to auto-load handler file: ${file}`)
66
- Js.Exn.raiseError(`Failed to auto-load handler file: ${file}`)
67
- })
64
+ let _ = await handlerFiles
65
+ ->Array.map(file => {
66
+ Utils.importPath(toImportUrl(file))->Promise.catch(exn => {
67
+ let cause = exn->Utils.prettifyExn->Obj.magic
68
+ Logging.errorWithExn(exn, `Failed to auto-load handler file: ${file}`)
69
+ JsError.throwWithMessage(`Failed to auto-load handler file: ${file}. Cause: ${cause}`)
70
+ })
71
+ })
72
+ ->Promise.all
73
+ }
74
+
75
+ // EVM re-runs `parseEventFiltersOrThrow` with the registered `where:` JSON so
76
+ // per-event filters propagate into `getEventFiltersOrThrow` / `filterByAddresses`
77
+ // — which is why `evmEventConfig` has to retain `sighash` and `indexedParams`.
78
+ // `dependsOnAddresses` is routed through `Internal.dependsOnAddresses` so the
79
+ // formula stays in sync with `EventConfigBuilder.build{Evm,Fuel}EventConfig`.
80
+ let applyRegistrations = (~config: Config.t): Config.t => {
81
+ let newChainMap = config.chainMap->ChainMap.map(chain => {
82
+ let newContracts = chain.contracts->Array.map(contract => {
83
+ let newEvents = contract.events->Array.map(
84
+ ev => {
85
+ let isWildcard = HandlerRegister.isWildcard(
86
+ ~contractName=ev.contractName,
87
+ ~eventName=ev.name,
88
+ )
89
+ let handler = HandlerRegister.getHandler(
90
+ ~contractName=ev.contractName,
91
+ ~eventName=ev.name,
92
+ )
93
+ let contractRegister = HandlerRegister.getContractRegister(
94
+ ~contractName=ev.contractName,
95
+ ~eventName=ev.name,
96
+ )
97
+ switch config.ecosystem.name {
98
+ | Fuel =>
99
+ let fuelEv = ev->(Utils.magic: Internal.eventConfig => Internal.fuelEventConfig)
100
+
101
+ ({
102
+ ...fuelEv,
103
+ isWildcard,
104
+ handler,
105
+ contractRegister,
106
+ dependsOnAddresses: Internal.dependsOnAddresses(
107
+ ~isWildcard,
108
+ ~filterByAddresses=false,
109
+ ),
110
+ } :> Internal.eventConfig)
111
+ | Evm =>
112
+ let evmEv = ev->(Utils.magic: Internal.eventConfig => Internal.evmEventConfig)
113
+ let eventFilters = HandlerRegister.getOnEventWhere(
114
+ ~contractName=ev.contractName,
115
+ ~eventName=ev.name,
116
+ )
117
+ let {getEventFiltersOrThrow, filterByAddresses} = LogSelection.parseEventFiltersOrThrow(
118
+ ~eventFilters,
119
+ ~sighash=evmEv.sighash,
120
+ ~params=evmEv.indexedParams->Array.map(p => p.name),
121
+ ~contractName=ev.contractName,
122
+ ~probeChainId=chain.id,
123
+ ~onEventBlockFilterSchema=config.ecosystem.onEventBlockFilterSchema,
124
+ ~topic1=?evmEv.indexedParams
125
+ ->Array.get(0)
126
+ ->Option.map(EventConfigBuilder.buildTopicGetter),
127
+ ~topic2=?evmEv.indexedParams
128
+ ->Array.get(1)
129
+ ->Option.map(EventConfigBuilder.buildTopicGetter),
130
+ ~topic3=?evmEv.indexedParams
131
+ ->Array.get(2)
132
+ ->Option.map(EventConfigBuilder.buildTopicGetter),
133
+ )
134
+
135
+ ({
136
+ ...evmEv,
137
+ isWildcard,
138
+ handler,
139
+ contractRegister,
140
+ getEventFiltersOrThrow,
141
+ filterByAddresses,
142
+ dependsOnAddresses: Internal.dependsOnAddresses(~isWildcard, ~filterByAddresses),
143
+ } :> Internal.eventConfig)
144
+ | Svm =>
145
+ JsError.throwWithMessage(`SVM does not support indexer.onEvent or indexer.contractRegister. Use indexer.onSlot for per-slot handlers.`)
146
+ }
147
+ },
148
+ )
149
+ {...contract, events: newEvents}
68
150
  })
69
- ->Promise.all
151
+ {...chain, contracts: newContracts}
152
+ })
153
+ {...config, chainMap: newChainMap}
70
154
  }
71
155
 
72
- // Register all handlers - must be called BEFORE creating the final config
73
- // so that event registrations are captured in the config
156
+ // `Config` never reads `HandlerRegister`. The only way to get a config that
157
+ // reflects registration state is through the returned value here.
74
158
  let registerAllHandlers = async (~config: Config.t) => {
75
159
  HandlerRegister.startRegistration(~ecosystem=config.ecosystem, ~multichain=config.multichain)
76
160
 
@@ -78,12 +162,12 @@ let registerAllHandlers = async (~config: Config.t) => {
78
162
  await autoLoadFromSrcHandlers(~handlers=config.handlers)
79
163
 
80
164
  // Load contract-specific handlers
81
- let _ =
82
- await config.contractHandlers
83
- ->Js.Array2.map(({name, handler}) => {
84
- registerContractHandlers(~contractName=name, ~handler)
85
- })
86
- ->Promise.all
165
+ let _ = await config.contractHandlers
166
+ ->Array.map(({name, handler}) => {
167
+ registerContractHandlers(~contractName=name, ~handler)
168
+ })
169
+ ->Promise.all
87
170
 
88
- HandlerRegister.finishRegistration()
171
+ let registrations = HandlerRegister.finishRegistration()
172
+ (applyRegistrations(~config), registrations)
89
173
  }
@@ -3,77 +3,167 @@
3
3
  import * as Url from "url";
4
4
  import * as Path from "path";
5
5
  import * as Utils from "./Utils.res.mjs";
6
- import * as Js_exn from "rescript/lib/es6/js_exn.js";
7
6
  import * as Logging from "./Logging.res.mjs";
8
- import * as $$Promise from "./bindings/Promise.res.mjs";
9
7
  import * as Process from "process";
8
+ import * as ChainMap from "./ChainMap.res.mjs";
9
+ import * as Internal from "./Internal.res.mjs";
10
10
  import * as Nodemodule from "node:module";
11
+ import * as LogSelection from "./LogSelection.res.mjs";
12
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
13
+ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
14
+ import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
11
15
  import * as HandlerRegister from "./HandlerRegister.res.mjs";
12
16
  import * as Promises from "node:fs/promises";
13
- import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
17
+ import * as EventConfigBuilder from "./EventConfigBuilder.res.mjs";
18
+ import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
14
19
 
15
20
  try {
16
21
  Nodemodule.register("tsx/esm", import.meta.url);
17
- }
18
- catch (exn){
22
+ } catch (exn) {
19
23
 
20
24
  }
21
25
 
22
26
  function toImportUrl(relativePath) {
23
- var absolutePath = Path.resolve(Process.cwd(), relativePath);
27
+ let absolutePath = Path.resolve(Process.cwd(), relativePath);
24
28
  return Url.pathToFileURL(absolutePath).toString();
25
29
  }
26
30
 
27
31
  async function registerContractHandlers(contractName, handler) {
28
32
  if (handler === undefined) {
29
- return ;
33
+ return;
30
34
  }
31
35
  try {
32
36
  await import(toImportUrl(handler));
33
- return ;
34
- }
35
- catch (raw_exn){
36
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
37
- Logging.errorWithExn(exn, "Failed to load handler file for contract " + contractName + ": " + handler);
38
- return Js_exn.raiseError("Failed to load handler file for contract " + contractName + ": " + handler);
37
+ return;
38
+ } catch (raw_exn) {
39
+ let exn = Primitive_exceptions.internalToException(raw_exn);
40
+ let cause = Utils.prettifyExn(exn);
41
+ Logging.errorWithExn(exn, `Failed to load handler file for contract ` + contractName + `: ` + handler);
42
+ return Stdlib_JsError.throwWithMessage(`Failed to load handler file for contract ` + contractName + `: ` + handler + `. Cause: ` + cause);
39
43
  }
40
44
  }
41
45
 
42
46
  async function autoLoadFromSrcHandlers(handlers) {
43
- var srcPattern = "./" + handlers + "/**/*.{js,mjs,ts}";
44
- var handlerFiles;
47
+ let srcPattern = `./` + handlers + `/**/*.{js,mjs,ts}`;
48
+ let handlerFiles;
45
49
  try {
46
- var iterator = Promises.glob(srcPattern);
47
- var files = await Utils.$$Array.fromAsyncIterator(iterator);
48
- handlerFiles = files.filter(function (file) {
49
- return !(file.includes(".test.") || file.includes(".spec.") || file.includes("_test."));
50
- });
51
- }
52
- catch (raw_exn){
53
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
54
- handlerFiles = Js_exn.raiseError("Failed to glob src/handlers directory for auto-loading handlers. Pattern: " + srcPattern + ". Before continuing, check that you're using Node.js >=22 version. Error: " + Utils.prettifyExn(exn));
50
+ let iterator = Promises.glob(srcPattern);
51
+ let files = await Utils.$$Array.fromAsyncIterator(iterator);
52
+ handlerFiles = files.filter(file => !(file.includes(".test.") || file.includes(".spec.") || file.includes("_test.")));
53
+ } catch (raw_exn) {
54
+ let exn = Primitive_exceptions.internalToException(raw_exn);
55
+ handlerFiles = Stdlib_JsError.throwWithMessage(`Failed to glob src/handlers directory for auto-loading handlers. Pattern: ` + srcPattern + `. Before continuing, check that you're using Node.js >=22 version. Error: ` + Utils.prettifyExn(exn));
55
56
  }
56
- await Promise.all(handlerFiles.map(function (file) {
57
- return $$Promise.$$catch(import(toImportUrl(file)), (function (exn) {
58
- Logging.errorWithExn(exn, "Failed to auto-load handler file: " + file);
59
- return Js_exn.raiseError("Failed to auto-load handler file: " + file);
60
- }));
61
- }));
57
+ await Promise.all(handlerFiles.map(file => Stdlib_Promise.$$catch(import(toImportUrl(file)), exn => {
58
+ let cause = Utils.prettifyExn(exn);
59
+ Logging.errorWithExn(exn, `Failed to auto-load handler file: ` + file);
60
+ return Stdlib_JsError.throwWithMessage(`Failed to auto-load handler file: ` + file + `. Cause: ` + cause);
61
+ })));
62
+ }
63
+
64
+ function applyRegistrations(config) {
65
+ let newChainMap = ChainMap.map(config.chainMap, chain => {
66
+ let newContracts = chain.contracts.map(contract => {
67
+ let newEvents = contract.events.map(ev => {
68
+ let isWildcard = HandlerRegister.isWildcard(ev.contractName, ev.name);
69
+ let handler = HandlerRegister.getHandler(ev.contractName, ev.name);
70
+ let contractRegister = HandlerRegister.getContractRegister(ev.contractName, ev.name);
71
+ let match = config.ecosystem.name;
72
+ switch (match) {
73
+ case "evm" :
74
+ let eventFilters = HandlerRegister.getOnEventWhere(ev.contractName, ev.name);
75
+ let match$1 = LogSelection.parseEventFiltersOrThrow(eventFilters, ev.sighash, ev.indexedParams.map(p => p.name), ev.contractName, chain.id, config.ecosystem.onEventBlockFilterSchema, Stdlib_Option.map(ev.indexedParams[0], EventConfigBuilder.buildTopicGetter), Stdlib_Option.map(ev.indexedParams[1], EventConfigBuilder.buildTopicGetter), Stdlib_Option.map(ev.indexedParams[2], EventConfigBuilder.buildTopicGetter));
76
+ let filterByAddresses = match$1.filterByAddresses;
77
+ return {
78
+ id: ev.id,
79
+ name: ev.name,
80
+ contractName: ev.contractName,
81
+ isWildcard: isWildcard,
82
+ filterByAddresses: filterByAddresses,
83
+ dependsOnAddresses: Internal.dependsOnAddresses(isWildcard, filterByAddresses),
84
+ handler: handler,
85
+ contractRegister: contractRegister,
86
+ paramsRawEventSchema: ev.paramsRawEventSchema,
87
+ simulateParamsSchema: ev.simulateParamsSchema,
88
+ startBlock: ev.startBlock,
89
+ getEventFiltersOrThrow: match$1.getEventFiltersOrThrow,
90
+ convertHyperSyncEventArgs: ev.convertHyperSyncEventArgs,
91
+ selectedBlockFields: ev.selectedBlockFields,
92
+ selectedTransactionFields: ev.selectedTransactionFields,
93
+ sighash: ev.sighash,
94
+ indexedParams: ev.indexedParams
95
+ };
96
+ case "fuel" :
97
+ return {
98
+ id: ev.id,
99
+ name: ev.name,
100
+ contractName: ev.contractName,
101
+ isWildcard: isWildcard,
102
+ filterByAddresses: ev.filterByAddresses,
103
+ dependsOnAddresses: Internal.dependsOnAddresses(isWildcard, false),
104
+ handler: handler,
105
+ contractRegister: contractRegister,
106
+ paramsRawEventSchema: ev.paramsRawEventSchema,
107
+ simulateParamsSchema: ev.simulateParamsSchema,
108
+ startBlock: ev.startBlock,
109
+ kind: ev.kind
110
+ };
111
+ case "svm" :
112
+ return Stdlib_JsError.throwWithMessage(`SVM does not support indexer.onEvent or indexer.contractRegister. Use indexer.onSlot for per-slot handlers.`);
113
+ }
114
+ });
115
+ return {
116
+ name: contract.name,
117
+ abi: contract.abi,
118
+ addresses: contract.addresses,
119
+ events: newEvents,
120
+ startBlock: contract.startBlock,
121
+ eventSignatures: contract.eventSignatures
122
+ };
123
+ });
124
+ let newrecord = {...chain};
125
+ newrecord.contracts = newContracts;
126
+ return newrecord;
127
+ });
128
+ return {
129
+ name: config.name,
130
+ description: config.description,
131
+ handlers: config.handlers,
132
+ contractHandlers: config.contractHandlers,
133
+ shouldRollbackOnReorg: config.shouldRollbackOnReorg,
134
+ shouldSaveFullHistory: config.shouldSaveFullHistory,
135
+ storage: config.storage,
136
+ multichain: config.multichain,
137
+ chainMap: newChainMap,
138
+ defaultChain: config.defaultChain,
139
+ ecosystem: config.ecosystem,
140
+ enableRawEvents: config.enableRawEvents,
141
+ maxAddrInPartition: config.maxAddrInPartition,
142
+ batchSize: config.batchSize,
143
+ lowercaseAddresses: config.lowercaseAddresses,
144
+ userEntitiesByName: config.userEntitiesByName,
145
+ userEntities: config.userEntities,
146
+ allEntities: config.allEntities,
147
+ allEnums: config.allEnums
148
+ };
62
149
  }
63
150
 
64
151
  async function registerAllHandlers(config) {
65
152
  HandlerRegister.startRegistration(config.ecosystem, config.multichain);
66
153
  await autoLoadFromSrcHandlers(config.handlers);
67
- await Promise.all(config.contractHandlers.map(function (param) {
68
- return registerContractHandlers(param.name, param.handler);
69
- }));
70
- return HandlerRegister.finishRegistration();
154
+ await Promise.all(config.contractHandlers.map(param => registerContractHandlers(param.name, param.handler)));
155
+ let registrations = HandlerRegister.finishRegistration();
156
+ return [
157
+ applyRegistrations(config),
158
+ registrations
159
+ ];
71
160
  }
72
161
 
73
162
  export {
74
- toImportUrl ,
75
- registerContractHandlers ,
76
- autoLoadFromSrcHandlers ,
77
- registerAllHandlers ,
163
+ toImportUrl,
164
+ registerContractHandlers,
165
+ autoLoadFromSrcHandlers,
166
+ applyRegistrations,
167
+ registerAllHandlers,
78
168
  }
79
169
  /* Not a pure module */