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.
- package/bin.mjs +2 -48
- package/evm.schema.json +67 -0
- package/fuel.schema.json +67 -0
- package/index.d.ts +822 -38
- package/index.js +5 -3
- package/package.json +10 -8
- package/rescript.json +5 -9
- package/src/Address.res +4 -5
- package/src/Address.res.mjs +9 -12
- package/src/Api.res +15 -0
- package/src/Api.res.mjs +20 -0
- package/src/Batch.res +32 -34
- package/src/Batch.res.mjs +172 -187
- package/src/Bin.res +89 -0
- package/src/Bin.res.mjs +97 -0
- package/src/ChainFetcher.res +33 -57
- package/src/ChainFetcher.res.mjs +197 -227
- package/src/ChainManager.res +6 -14
- package/src/ChainManager.res.mjs +74 -85
- package/src/ChainMap.res +14 -16
- package/src/ChainMap.res.mjs +38 -38
- package/src/Config.res +193 -135
- package/src/Config.res.mjs +566 -592
- package/src/Core.res +182 -0
- package/src/Core.res.mjs +207 -0
- package/src/Ecosystem.res +25 -4
- package/src/Ecosystem.res.mjs +12 -13
- package/src/Env.res +20 -13
- package/src/Env.res.mjs +124 -113
- package/src/EnvSafe.res +269 -0
- package/src/EnvSafe.res.mjs +296 -0
- package/src/EnvSafe.resi +18 -0
- package/src/Envio.res +37 -26
- package/src/Envio.res.mjs +59 -60
- package/src/ErrorHandling.res +2 -2
- package/src/ErrorHandling.res.mjs +15 -15
- package/src/EventConfigBuilder.res +219 -81
- package/src/EventConfigBuilder.res.mjs +259 -202
- package/src/EventProcessing.res +27 -38
- package/src/EventProcessing.res.mjs +165 -183
- package/src/EventUtils.res +11 -11
- package/src/EventUtils.res.mjs +21 -22
- package/src/EvmTypes.res +0 -1
- package/src/EvmTypes.res.mjs +5 -5
- package/src/FetchState.res +360 -256
- package/src/FetchState.res.mjs +958 -914
- package/src/GlobalState.res +365 -351
- package/src/GlobalState.res.mjs +958 -992
- package/src/GlobalStateManager.res +1 -2
- package/src/GlobalStateManager.res.mjs +36 -44
- package/src/HandlerLoader.res +107 -23
- package/src/HandlerLoader.res.mjs +128 -38
- package/src/HandlerRegister.res +127 -103
- package/src/HandlerRegister.res.mjs +164 -164
- package/src/HandlerRegister.resi +12 -4
- package/src/Hasura.res +35 -22
- package/src/Hasura.res.mjs +158 -167
- package/src/InMemoryStore.res +20 -27
- package/src/InMemoryStore.res.mjs +64 -80
- package/src/InMemoryTable.res +34 -39
- package/src/InMemoryTable.res.mjs +165 -170
- package/src/Internal.res +52 -33
- package/src/Internal.res.mjs +84 -81
- package/src/LazyLoader.res.mjs +55 -61
- package/src/LoadLayer.res +77 -78
- package/src/LoadLayer.res.mjs +160 -189
- package/src/LoadManager.res +16 -21
- package/src/LoadManager.res.mjs +79 -84
- package/src/LogSelection.res +236 -68
- package/src/LogSelection.res.mjs +211 -141
- package/src/Logging.res +13 -9
- package/src/Logging.res.mjs +130 -143
- package/src/Main.res +428 -51
- package/src/Main.res.mjs +528 -271
- package/src/Persistence.res +77 -84
- package/src/Persistence.res.mjs +131 -132
- package/src/PgStorage.res +291 -167
- package/src/PgStorage.res.mjs +797 -817
- package/src/Prometheus.res +50 -58
- package/src/Prometheus.res.mjs +345 -373
- package/src/ReorgDetection.res +22 -24
- package/src/ReorgDetection.res.mjs +100 -106
- package/src/SafeCheckpointTracking.res +7 -7
- package/src/SafeCheckpointTracking.res.mjs +40 -43
- package/src/SimulateItems.res +41 -49
- package/src/SimulateItems.res.mjs +257 -272
- package/src/Sink.res +2 -2
- package/src/Sink.res.mjs +22 -26
- package/src/TableIndices.res +1 -2
- package/src/TableIndices.res.mjs +42 -48
- package/src/TestIndexer.res +196 -189
- package/src/TestIndexer.res.mjs +536 -536
- package/src/TestIndexerProxyStorage.res +15 -16
- package/src/TestIndexerProxyStorage.res.mjs +98 -122
- package/src/TestIndexerWorker.res +4 -0
- package/src/TestIndexerWorker.res.mjs +7 -0
- package/src/Throttler.res +3 -3
- package/src/Throttler.res.mjs +23 -24
- package/src/Time.res +1 -1
- package/src/Time.res.mjs +18 -21
- package/src/TopicFilter.res +3 -3
- package/src/TopicFilter.res.mjs +29 -30
- package/src/UserContext.res +93 -54
- package/src/UserContext.res.mjs +197 -182
- package/src/Utils.res +141 -86
- package/src/Utils.res.mjs +334 -295
- package/src/bindings/BigDecimal.res +0 -2
- package/src/bindings/BigDecimal.res.mjs +19 -23
- package/src/bindings/ClickHouse.res +28 -27
- package/src/bindings/ClickHouse.res.mjs +243 -240
- package/src/bindings/DateFns.res +11 -11
- package/src/bindings/DateFns.res.mjs +7 -7
- package/src/bindings/EventSource.res.mjs +2 -2
- package/src/bindings/Express.res +2 -5
- package/src/bindings/Hrtime.res +2 -2
- package/src/bindings/Hrtime.res.mjs +30 -32
- package/src/bindings/Lodash.res.mjs +1 -1
- package/src/bindings/NodeJs.res +14 -9
- package/src/bindings/NodeJs.res.mjs +20 -20
- package/src/bindings/Pino.res +8 -10
- package/src/bindings/Pino.res.mjs +40 -43
- package/src/bindings/Postgres.res +2 -5
- package/src/bindings/Postgres.res.mjs +9 -9
- package/src/bindings/PromClient.res +17 -2
- package/src/bindings/PromClient.res.mjs +30 -7
- package/src/bindings/SDSL.res.mjs +2 -2
- package/src/bindings/Viem.res +4 -4
- package/src/bindings/Viem.res.mjs +20 -22
- package/src/bindings/Vitest.res +1 -1
- package/src/bindings/Vitest.res.mjs +2 -2
- package/src/bindings/WebSocket.res +1 -1
- package/src/db/EntityHistory.res +9 -3
- package/src/db/EntityHistory.res.mjs +84 -59
- package/src/db/InternalTable.res +62 -60
- package/src/db/InternalTable.res.mjs +271 -203
- package/src/db/Schema.res +1 -2
- package/src/db/Schema.res.mjs +28 -32
- package/src/db/Table.res +28 -27
- package/src/db/Table.res.mjs +276 -292
- package/src/sources/EventRouter.res +21 -16
- package/src/sources/EventRouter.res.mjs +55 -57
- package/src/sources/Evm.res +17 -1
- package/src/sources/Evm.res.mjs +16 -8
- package/src/sources/EvmChain.res +15 -17
- package/src/sources/EvmChain.res.mjs +40 -42
- package/src/sources/Fuel.res +14 -1
- package/src/sources/Fuel.res.mjs +16 -8
- package/src/sources/FuelSDK.res +1 -1
- package/src/sources/FuelSDK.res.mjs +6 -8
- package/src/sources/HyperFuel.res +8 -10
- package/src/sources/HyperFuel.res.mjs +113 -123
- package/src/sources/HyperFuelClient.res.mjs +6 -7
- package/src/sources/HyperFuelSource.res +19 -20
- package/src/sources/HyperFuelSource.res.mjs +339 -356
- package/src/sources/HyperSync.res +11 -13
- package/src/sources/HyperSync.res.mjs +206 -220
- package/src/sources/HyperSyncClient.res +5 -7
- package/src/sources/HyperSyncClient.res.mjs +70 -75
- package/src/sources/HyperSyncHeightStream.res +8 -9
- package/src/sources/HyperSyncHeightStream.res.mjs +78 -86
- package/src/sources/HyperSyncJsonApi.res +18 -15
- package/src/sources/HyperSyncJsonApi.res.mjs +201 -231
- package/src/sources/HyperSyncSource.res +17 -21
- package/src/sources/HyperSyncSource.res.mjs +268 -290
- package/src/sources/Rpc.res +5 -5
- package/src/sources/Rpc.res.mjs +168 -192
- package/src/sources/RpcSource.res +166 -167
- package/src/sources/RpcSource.res.mjs +972 -1046
- package/src/sources/RpcWebSocketHeightStream.res +10 -11
- package/src/sources/RpcWebSocketHeightStream.res.mjs +131 -145
- package/src/sources/SimulateSource.res +1 -1
- package/src/sources/SimulateSource.res.mjs +35 -38
- package/src/sources/Source.res +1 -1
- package/src/sources/Source.res.mjs +3 -3
- package/src/sources/SourceManager.res +39 -20
- package/src/sources/SourceManager.res.mjs +340 -371
- package/src/sources/SourceManager.resi +2 -1
- package/src/sources/Svm.res +12 -5
- package/src/sources/Svm.res.mjs +44 -41
- package/src/tui/Tui.res +23 -12
- package/src/tui/Tui.res.mjs +292 -290
- package/src/tui/bindings/Ink.res +2 -4
- package/src/tui/bindings/Ink.res.mjs +35 -41
- package/src/tui/components/BufferedProgressBar.res +7 -7
- package/src/tui/components/BufferedProgressBar.res.mjs +46 -46
- package/src/tui/components/CustomHooks.res +1 -2
- package/src/tui/components/CustomHooks.res.mjs +102 -122
- package/src/tui/components/Messages.res +1 -2
- package/src/tui/components/Messages.res.mjs +38 -42
- package/src/tui/components/SyncETA.res +10 -11
- package/src/tui/components/SyncETA.res.mjs +178 -196
- package/src/tui/components/TuiData.res +1 -1
- package/src/tui/components/TuiData.res.mjs +7 -6
- package/src/vendored/Rest.res +52 -66
- package/src/vendored/Rest.res.mjs +324 -364
- package/svm.schema.json +67 -0
- package/src/Address.gen.ts +0 -8
- package/src/Config.gen.ts +0 -19
- package/src/Envio.gen.ts +0 -55
- package/src/EvmTypes.gen.ts +0 -6
- package/src/InMemoryStore.gen.ts +0 -6
- package/src/Internal.gen.ts +0 -64
- package/src/PgStorage.gen.ts +0 -10
- package/src/PgStorage.res.d.mts +0 -5
- package/src/Types.ts +0 -56
- package/src/bindings/BigDecimal.gen.ts +0 -14
- package/src/bindings/BigDecimal.res.d.mts +0 -5
- package/src/bindings/BigInt.gen.ts +0 -10
- package/src/bindings/BigInt.res +0 -70
- package/src/bindings/BigInt.res.d.mts +0 -5
- package/src/bindings/BigInt.res.mjs +0 -154
- package/src/bindings/Ethers.res.d.mts +0 -5
- package/src/bindings/Pino.gen.ts +0 -17
- package/src/bindings/Postgres.gen.ts +0 -8
- package/src/bindings/Postgres.res.d.mts +0 -5
- package/src/bindings/Promise.res +0 -67
- package/src/bindings/Promise.res.mjs +0 -26
- package/src/db/InternalTable.gen.ts +0 -36
- 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
|
-
|
|
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
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
state: state,
|
|
17
|
+
onError: onError
|
|
18
|
+
};
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
function dispatchAction(stateIdOpt, self, action) {
|
|
23
|
-
|
|
22
|
+
let stateId = stateIdOpt !== undefined ? stateIdOpt : 0;
|
|
24
23
|
try {
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
40
|
-
setTimeout((
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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 */
|
package/src/HandlerLoader.res
CHANGED
|
@@ -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
|
-
|
|
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->
|
|
47
|
+
files->Array.filter(file => {
|
|
45
48
|
!(
|
|
46
|
-
file->
|
|
47
|
-
file->
|
|
48
|
-
file->
|
|
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
|
-
|
|
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
|
-
|
|
63
|
-
->
|
|
64
|
-
Utils.
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
151
|
+
{...chain, contracts: newContracts}
|
|
152
|
+
})
|
|
153
|
+
{...config, chainMap: newChainMap}
|
|
70
154
|
}
|
|
71
155
|
|
|
72
|
-
//
|
|
73
|
-
//
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
Logging.errorWithExn(exn,
|
|
38
|
-
return
|
|
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
|
-
|
|
44
|
-
|
|
47
|
+
let srcPattern = `./` + handlers + `/**/*.{js,mjs,ts}`;
|
|
48
|
+
let handlerFiles;
|
|
45
49
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
handlerFiles = files.filter(
|
|
49
|
-
|
|
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(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
163
|
+
toImportUrl,
|
|
164
|
+
registerContractHandlers,
|
|
165
|
+
autoLoadFromSrcHandlers,
|
|
166
|
+
applyRegistrations,
|
|
167
|
+
registerAllHandlers,
|
|
78
168
|
}
|
|
79
169
|
/* Not a pure module */
|