envio 3.0.0-alpha.21 → 3.0.0-alpha.23
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/README.md +3 -3
- 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 +430 -51
- package/src/Main.res.mjs +530 -271
- package/src/Persistence.res +80 -84
- package/src/Persistence.res.mjs +131 -132
- package/src/PgStorage.res +294 -167
- package/src/PgStorage.res.mjs +799 -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 +16 -16
- package/src/TestIndexerProxyStorage.res.mjs +99 -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 +7 -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
package/src/ChainFetcher.res.mjs
CHANGED
|
@@ -2,207 +2,184 @@
|
|
|
2
2
|
|
|
3
3
|
import * as Env from "./Env.res.mjs";
|
|
4
4
|
import * as Svm from "./sources/Svm.res.mjs";
|
|
5
|
-
import * as Caml from "rescript/lib/es6/caml.js";
|
|
6
5
|
import * as Utils from "./Utils.res.mjs";
|
|
7
|
-
import * as Js_exn from "rescript/lib/es6/js_exn.js";
|
|
8
6
|
import * as Logging from "./Logging.res.mjs";
|
|
9
|
-
import * as $$Promise from "./bindings/Promise.res.mjs";
|
|
10
7
|
import * as ChainMap from "./ChainMap.res.mjs";
|
|
11
8
|
import * as EvmChain from "./sources/EvmChain.res.mjs";
|
|
12
|
-
import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
|
|
13
9
|
import * as FetchState from "./FetchState.res.mjs";
|
|
14
10
|
import * as Prometheus from "./Prometheus.res.mjs";
|
|
15
|
-
import * as Belt_Option from "rescript/lib/es6/belt_Option.js";
|
|
16
|
-
import * as Caml_option from "rescript/lib/es6/caml_option.js";
|
|
17
11
|
import * as EventRouter from "./sources/EventRouter.res.mjs";
|
|
18
12
|
import * as UserContext from "./UserContext.res.mjs";
|
|
13
|
+
import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
|
|
19
14
|
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
15
|
+
import * as Primitive_int from "@rescript/runtime/lib/es6/Primitive_int.js";
|
|
20
16
|
import * as SourceManager from "./sources/SourceManager.res.mjs";
|
|
17
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
21
18
|
import * as ReorgDetection from "./ReorgDetection.res.mjs";
|
|
19
|
+
import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
|
|
20
|
+
import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
|
|
22
21
|
import * as HyperFuelSource from "./sources/HyperFuelSource.res.mjs";
|
|
23
|
-
import * as
|
|
22
|
+
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
|
|
23
|
+
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
24
24
|
import * as SafeCheckpointTracking from "./SafeCheckpointTracking.res.mjs";
|
|
25
25
|
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}));
|
|
26
|
+
function configAddresses(chainConfig) {
|
|
27
|
+
let addresses = [];
|
|
28
|
+
chainConfig.contracts.forEach(contract => {
|
|
29
|
+
contract.addresses.forEach(address => {
|
|
30
|
+
addresses.push({
|
|
31
|
+
address: address,
|
|
32
|
+
contractName: contract.name,
|
|
33
|
+
registrationBlock: -1
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
return addresses;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function make(chainConfig, indexingAddresses, startBlock, endBlock, firstEventBlockOpt, progressBlockNumber, config, registrations, targetBufferSize, logger, timestampCaughtUpToHeadOrEndblock, numEventsProcessed, isInReorgThreshold, reorgCheckpoints, maxReorgDepth, knownHeightOpt) {
|
|
41
|
+
let firstEventBlock = firstEventBlockOpt !== undefined ? Primitive_option.valFromOption(firstEventBlockOpt) : undefined;
|
|
42
|
+
let knownHeight = knownHeightOpt !== undefined ? knownHeightOpt : 0;
|
|
43
|
+
let eventRouter = EventRouter.empty();
|
|
44
|
+
let eventConfigs = [];
|
|
45
|
+
let notRegisteredEvents = [];
|
|
46
|
+
chainConfig.contracts.forEach(contract => {
|
|
47
|
+
let contractName = contract.name;
|
|
48
|
+
contract.events.forEach(eventConfig => {
|
|
49
|
+
let hasContractRegister = Stdlib_Option.isSome(eventConfig.contractRegister);
|
|
50
|
+
EventRouter.addOrThrow(eventRouter, eventConfig.id, undefined, contractName, eventConfig.isWildcard, eventConfig.name, ChainMap.Chain.makeUnsafe(chainConfig.id));
|
|
51
|
+
let shouldBeIncluded;
|
|
52
|
+
if (config.enableRawEvents) {
|
|
53
|
+
shouldBeIncluded = true;
|
|
54
|
+
} else {
|
|
55
|
+
let isRegistered = hasContractRegister || Stdlib_Option.isSome(eventConfig.handler);
|
|
56
|
+
if (!isRegistered) {
|
|
57
|
+
notRegisteredEvents.push(eventConfig);
|
|
58
|
+
}
|
|
59
|
+
shouldBeIncluded = isRegistered;
|
|
60
|
+
}
|
|
61
|
+
let shouldSkip;
|
|
62
|
+
try {
|
|
63
|
+
let getEventFiltersOrThrow = eventConfig.getEventFiltersOrThrow;
|
|
64
|
+
if (getEventFiltersOrThrow) {
|
|
65
|
+
let match = getEventFiltersOrThrow(ChainMap.Chain.makeUnsafe(chainConfig.id));
|
|
66
|
+
shouldSkip = match.TAG === "Static" ? match._0.length === 0 : false;
|
|
67
|
+
} else {
|
|
68
|
+
shouldSkip = false;
|
|
69
|
+
}
|
|
70
|
+
} catch (exn) {
|
|
71
|
+
shouldSkip = false;
|
|
72
|
+
}
|
|
73
|
+
if (shouldBeIncluded && !shouldSkip) {
|
|
74
|
+
eventConfigs.push(eventConfig);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
let startBlock = contract.startBlock;
|
|
79
|
+
if (startBlock !== undefined && startBlock < chainConfig.startBlock) {
|
|
80
|
+
return Stdlib_JsError.throwWithMessage(`The start block for contract "` + contractName + `" is less than the chain start block. This is not supported yet.`);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
84
83
|
if (Utils.$$Array.notEmpty(notRegisteredEvents)) {
|
|
85
|
-
Logging.childInfo(logger,
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return eventConfig.contractName + "." + eventConfig.name;
|
|
89
|
-
})).join(", ") + " don't have an event handler and skipped for indexing.");
|
|
84
|
+
Logging.childInfo(logger, `The event` + (
|
|
85
|
+
notRegisteredEvents.length > 1 ? "s" : ""
|
|
86
|
+
) + ` ` + notRegisteredEvents.map(eventConfig => eventConfig.contractName + `.` + eventConfig.name).join(", ") + ` don't have an event handler and skipped for indexing.`);
|
|
90
87
|
}
|
|
91
|
-
|
|
88
|
+
let onBlockConfigs = registrations.onBlockByChainId[chainConfig.id.toString()];
|
|
92
89
|
if (onBlockConfigs !== undefined) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}));
|
|
90
|
+
onBlockConfigs.forEach(onBlockConfig => {
|
|
91
|
+
if (Stdlib_Option.getOr(onBlockConfig.startBlock, startBlock) < startBlock) {
|
|
92
|
+
Stdlib_JsError.throwWithMessage(`The start block for onBlock handler "` + onBlockConfig.name + `" is less than the chain start block (` + String(startBlock) + `). This is not supported yet.`);
|
|
93
|
+
}
|
|
94
|
+
if (endBlock !== undefined && Stdlib_Option.getOr(onBlockConfig.endBlock, endBlock) > endBlock) {
|
|
95
|
+
return Stdlib_JsError.throwWithMessage(`The end block for onBlock handler "` + onBlockConfig.name + `" is greater than the chain end block (` + String(endBlock) + `). This is not supported yet.`);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
102
98
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
var sources$1;
|
|
99
|
+
let fetchState = FetchState.make(startBlock, endBlock, eventConfigs, indexingAddresses, config.maxAddrInPartition, chainConfig.id, targetBufferSize, knownHeight, progressBlockNumber, onBlockConfigs, Primitive_int.max(!config.shouldRollbackOnReorg || isInReorgThreshold ? 0 : chainConfig.maxReorgDepth, chainConfig.blockLag), Primitive_option.some(firstEventBlock));
|
|
100
|
+
let chainReorgCheckpoints = Stdlib_Array.filterMap(reorgCheckpoints, reorgCheckpoint => {
|
|
101
|
+
if (reorgCheckpoint.chain_id === chainConfig.id) {
|
|
102
|
+
return reorgCheckpoint;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
let chain = ChainMap.Chain.makeUnsafe(chainConfig.id);
|
|
106
|
+
let lowercaseAddresses = config.lowercaseAddresses;
|
|
107
|
+
let sources = chainConfig.sourceConfig;
|
|
108
|
+
let sources$1;
|
|
114
109
|
switch (sources.TAG) {
|
|
115
110
|
case "EvmSourceConfig" :
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
};
|
|
135
|
-
}));
|
|
136
|
-
sources$1 = EvmChain.makeSources(chain, evmContracts, sources.hypersync, allEventSignatures, evmRpcs, lowercaseAddresses);
|
|
137
|
-
break;
|
|
111
|
+
let evmContracts = chainConfig.contracts.map(contract => ({
|
|
112
|
+
name: contract.name,
|
|
113
|
+
abi: contract.abi,
|
|
114
|
+
events: contract.events
|
|
115
|
+
}));
|
|
116
|
+
let allEventSignatures = chainConfig.contracts.flatMap(contract => contract.eventSignatures);
|
|
117
|
+
let evmRpcs = sources.rpcs.map(rpc => {
|
|
118
|
+
let syncConfig = rpc.syncConfig;
|
|
119
|
+
let ws = rpc.ws;
|
|
120
|
+
return {
|
|
121
|
+
url: rpc.url,
|
|
122
|
+
sourceFor: rpc.sourceFor,
|
|
123
|
+
syncConfig: syncConfig,
|
|
124
|
+
ws: ws
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
sources$1 = EvmChain.makeSources(chain, evmContracts, sources.hypersync, allEventSignatures, evmRpcs, lowercaseAddresses);
|
|
128
|
+
break;
|
|
138
129
|
case "FuelSourceConfig" :
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
130
|
+
sources$1 = [HyperFuelSource.make({
|
|
131
|
+
chain: chain,
|
|
132
|
+
endpointUrl: sources.hypersync
|
|
133
|
+
})];
|
|
134
|
+
break;
|
|
144
135
|
case "SvmSourceConfig" :
|
|
145
|
-
|
|
146
|
-
|
|
136
|
+
sources$1 = [Svm.makeRPCSource(chain, sources.rpc)];
|
|
137
|
+
break;
|
|
147
138
|
case "CustomSources" :
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
139
|
+
sources$1 = sources._0;
|
|
140
|
+
break;
|
|
151
141
|
}
|
|
152
142
|
return {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
143
|
+
logger: logger,
|
|
144
|
+
fetchState: fetchState,
|
|
145
|
+
sourceManager: SourceManager.make(sources$1, Env.maxPartitionConcurrency, Stdlib_Option.isSome(timestampCaughtUpToHeadOrEndblock), undefined, undefined, undefined, undefined, undefined, undefined),
|
|
146
|
+
chainConfig: chainConfig,
|
|
147
|
+
isProgressAtHead: false,
|
|
148
|
+
timestampCaughtUpToHeadOrEndblock: timestampCaughtUpToHeadOrEndblock,
|
|
149
|
+
committedProgressBlockNumber: progressBlockNumber,
|
|
150
|
+
numEventsProcessed: numEventsProcessed,
|
|
151
|
+
reorgDetection: ReorgDetection.make(chainReorgCheckpoints, maxReorgDepth, config.shouldRollbackOnReorg),
|
|
152
|
+
safeCheckpointTracking: SafeCheckpointTracking.make(maxReorgDepth, config.shouldRollbackOnReorg, chainReorgCheckpoints)
|
|
153
|
+
};
|
|
164
154
|
}
|
|
165
155
|
|
|
166
156
|
function makeFromConfig(chainConfig, config, registrations, targetBufferSize, knownHeight) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return make(chainConfig,
|
|
157
|
+
let logger = Logging.createChild({
|
|
158
|
+
chainId: chainConfig.id
|
|
159
|
+
});
|
|
160
|
+
return make(chainConfig, configAddresses(chainConfig), chainConfig.startBlock, chainConfig.endBlock, undefined, -1, config, registrations, targetBufferSize, logger, undefined, 0, false, [], chainConfig.maxReorgDepth, knownHeight);
|
|
171
161
|
}
|
|
172
162
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
163
|
+
function makeFromDbState(chainConfig, resumedChainState, reorgCheckpoints, isInReorgThreshold, config, registrations, targetBufferSize) {
|
|
164
|
+
let chainId = chainConfig.id;
|
|
165
|
+
let logger = Logging.createChild({
|
|
166
|
+
chainId: chainId
|
|
167
|
+
});
|
|
178
168
|
Prometheus.ProgressEventsCount.set(resumedChainState.numEventsProcessed, chainId);
|
|
179
|
-
|
|
180
|
-
return make(chainConfig, resumedChainState.
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function getContractStartBlock(config, chain, contractName) {
|
|
184
|
-
var chainConfig = ChainMap.get(config.chainMap, chain);
|
|
185
|
-
return Belt_Option.flatMap(Caml_option.undefined_to_opt(chainConfig.contracts.find(function (contract) {
|
|
186
|
-
return contract.name === contractName;
|
|
187
|
-
})), (function (contract) {
|
|
188
|
-
return contract.startBlock;
|
|
189
|
-
}));
|
|
169
|
+
let progressBlockNumber = resumedChainState.progressBlockNumber >= 0 ? resumedChainState.progressBlockNumber : resumedChainState.startBlock - 1 | 0;
|
|
170
|
+
return make(chainConfig, resumedChainState.indexingAddresses, resumedChainState.startBlock, resumedChainState.endBlock, Primitive_option.some(resumedChainState.firstEventBlockNumber), progressBlockNumber, config, registrations, targetBufferSize, logger, Env.updateSyncTimeOnRestart ? undefined : resumedChainState.timestampCaughtUpToHeadOrEndblock, resumedChainState.numEventsProcessed, isInReorgThreshold, reorgCheckpoints, resumedChainState.maxReorgDepth, resumedChainState.sourceBlockNumber);
|
|
190
171
|
}
|
|
191
172
|
|
|
192
|
-
async function runContractRegistersOrThrow(itemsWithContractRegister,
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
var contractStartBlock = configuredStartBlock !== undefined ? configuredStartBlock : blockNumber;
|
|
198
|
-
var dc_registrationBlock = blockNumber;
|
|
199
|
-
var dc = {
|
|
173
|
+
async function runContractRegistersOrThrow(itemsWithContractRegister, config) {
|
|
174
|
+
let itemsWithDcs = [];
|
|
175
|
+
let onRegister = (item, contractAddress, contractName) => {
|
|
176
|
+
let dc_registrationBlock = item.blockNumber;
|
|
177
|
+
let dc = {
|
|
200
178
|
address: contractAddress,
|
|
201
179
|
contractName: contractName,
|
|
202
|
-
startBlock: contractStartBlock,
|
|
203
180
|
registrationBlock: dc_registrationBlock
|
|
204
181
|
};
|
|
205
|
-
|
|
182
|
+
let dcs = item.dcs;
|
|
206
183
|
if (dcs !== undefined) {
|
|
207
184
|
dcs.push(dc);
|
|
208
185
|
} else {
|
|
@@ -210,39 +187,34 @@ async function runContractRegistersOrThrow(itemsWithContractRegister, chain, con
|
|
|
210
187
|
itemsWithDcs.push(item);
|
|
211
188
|
}
|
|
212
189
|
};
|
|
213
|
-
|
|
214
|
-
for(
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
190
|
+
let promises = [];
|
|
191
|
+
for (let idx = 0, idx_finish = itemsWithContractRegister.length; idx < idx_finish; ++idx) {
|
|
192
|
+
let item = itemsWithContractRegister[idx];
|
|
193
|
+
let match = item.eventConfig;
|
|
194
|
+
let contractRegister = match.contractRegister;
|
|
195
|
+
let contractRegister$1 = contractRegister !== undefined ? contractRegister : Stdlib_JsError.throwWithMessage("Contract register is not set for event " + match.name);
|
|
196
|
+
let errorMessage = "Event contractRegister failed, please fix the error to keep the indexer running smoothly";
|
|
220
197
|
try {
|
|
221
|
-
|
|
198
|
+
let params = {
|
|
222
199
|
item: item,
|
|
223
200
|
onRegister: onRegister,
|
|
224
201
|
config: config,
|
|
225
202
|
isResolved: false
|
|
226
203
|
};
|
|
227
|
-
|
|
228
|
-
if (
|
|
229
|
-
promises.push(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
params.isResolved = true;
|
|
237
|
-
return ErrorHandling.mkLogAndRaise(Logging.getItemLogger(item), errorMessage, exn);
|
|
238
|
-
}
|
|
239
|
-
}(item,params))));
|
|
204
|
+
let result = contractRegister$1(UserContext.getContractRegisterArgs(params));
|
|
205
|
+
if (Utils.$$Promise.isCatchable(result)) {
|
|
206
|
+
promises.push(Stdlib_Promise.$$catch(result.then(r => {
|
|
207
|
+
params.isResolved = true;
|
|
208
|
+
|
|
209
|
+
}), exn => {
|
|
210
|
+
params.isResolved = true;
|
|
211
|
+
return ErrorHandling.mkLogAndRaise(Logging.getItemLogger(item), errorMessage, exn);
|
|
212
|
+
}));
|
|
240
213
|
} else {
|
|
241
214
|
params.isResolved = true;
|
|
242
215
|
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
216
|
+
} catch (raw_exn) {
|
|
217
|
+
let exn = Primitive_exceptions.internalToException(raw_exn);
|
|
246
218
|
ErrorHandling.mkLogAndRaise(Logging.getItemLogger(item), errorMessage, exn);
|
|
247
219
|
}
|
|
248
220
|
}
|
|
@@ -253,23 +225,23 @@ async function runContractRegistersOrThrow(itemsWithContractRegister, chain, con
|
|
|
253
225
|
}
|
|
254
226
|
|
|
255
227
|
function handleQueryResult(chainFetcher, query, newItems, newItemsWithDcs, latestFetchedBlock, knownHeight) {
|
|
256
|
-
|
|
228
|
+
let fs = newItemsWithDcs.length !== 0 ? FetchState.registerDynamicContracts(chainFetcher.fetchState, newItemsWithDcs) : chainFetcher.fetchState;
|
|
257
229
|
return {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
230
|
+
logger: chainFetcher.logger,
|
|
231
|
+
fetchState: FetchState.updateKnownHeight(FetchState.handleQueryResult(fs, query, latestFetchedBlock, newItems), knownHeight),
|
|
232
|
+
sourceManager: chainFetcher.sourceManager,
|
|
233
|
+
chainConfig: chainFetcher.chainConfig,
|
|
234
|
+
isProgressAtHead: chainFetcher.isProgressAtHead,
|
|
235
|
+
timestampCaughtUpToHeadOrEndblock: chainFetcher.timestampCaughtUpToHeadOrEndblock,
|
|
236
|
+
committedProgressBlockNumber: chainFetcher.committedProgressBlockNumber,
|
|
237
|
+
numEventsProcessed: chainFetcher.numEventsProcessed,
|
|
238
|
+
reorgDetection: chainFetcher.reorgDetection,
|
|
239
|
+
safeCheckpointTracking: chainFetcher.safeCheckpointTracking
|
|
240
|
+
};
|
|
269
241
|
}
|
|
270
242
|
|
|
271
243
|
function hasProcessedToEndblock(self) {
|
|
272
|
-
|
|
244
|
+
let endBlock = self.fetchState.endBlock;
|
|
273
245
|
if (endBlock !== undefined) {
|
|
274
246
|
return self.committedProgressBlockNumber >= endBlock;
|
|
275
247
|
} else {
|
|
@@ -282,7 +254,7 @@ function hasNoMoreEventsToProcess(self) {
|
|
|
282
254
|
}
|
|
283
255
|
|
|
284
256
|
function getHighestBlockBelowThreshold(cf) {
|
|
285
|
-
|
|
257
|
+
let highestBlockBelowThreshold = cf.fetchState.knownHeight - cf.chainConfig.maxReorgDepth | 0;
|
|
286
258
|
if (highestBlockBelowThreshold < 0) {
|
|
287
259
|
return 0;
|
|
288
260
|
} else {
|
|
@@ -291,22 +263,20 @@ function getHighestBlockBelowThreshold(cf) {
|
|
|
291
263
|
}
|
|
292
264
|
|
|
293
265
|
async function getLastKnownValidBlock(chainFetcher, reorgBlockNumber, getBlockHashesOpt) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
});
|
|
304
|
-
};
|
|
266
|
+
let getBlockHashes = getBlockHashesOpt !== undefined ? getBlockHashesOpt : SourceManager.getActiveSource(chainFetcher.sourceManager).getBlockHashes;
|
|
267
|
+
let scannedBlockNumbers = ReorgDetection.getThresholdBlockNumbersBelowBlock(chainFetcher.reorgDetection, reorgBlockNumber, chainFetcher.fetchState.knownHeight);
|
|
268
|
+
let getBlockHashes$1 = blockNumbers => getBlockHashes(blockNumbers, chainFetcher.logger).then(res => {
|
|
269
|
+
if (res.TAG === "Ok") {
|
|
270
|
+
return res._0;
|
|
271
|
+
} else {
|
|
272
|
+
return ErrorHandling.mkLogAndRaise(undefined, "Failed to fetch blockHashes for given blockNumbers during rollback", res._0);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
305
275
|
if (scannedBlockNumbers.length === 0) {
|
|
306
276
|
return getHighestBlockBelowThreshold(chainFetcher);
|
|
307
277
|
}
|
|
308
|
-
|
|
309
|
-
|
|
278
|
+
let blockNumbersAndHashes = await getBlockHashes$1(scannedBlockNumbers);
|
|
279
|
+
let blockNumber = ReorgDetection.getLatestValidScannedBlock(chainFetcher.reorgDetection, blockNumbersAndHashes);
|
|
310
280
|
if (blockNumber !== undefined) {
|
|
311
281
|
return blockNumber;
|
|
312
282
|
} else {
|
|
@@ -323,17 +293,17 @@ function isReady(chainFetcher) {
|
|
|
323
293
|
}
|
|
324
294
|
|
|
325
295
|
export {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
runContractRegistersOrThrow
|
|
331
|
-
handleQueryResult
|
|
332
|
-
hasProcessedToEndblock
|
|
333
|
-
hasNoMoreEventsToProcess
|
|
334
|
-
getHighestBlockBelowThreshold
|
|
335
|
-
getLastKnownValidBlock
|
|
336
|
-
isActivelyIndexing
|
|
337
|
-
isReady
|
|
296
|
+
configAddresses,
|
|
297
|
+
make,
|
|
298
|
+
makeFromConfig,
|
|
299
|
+
makeFromDbState,
|
|
300
|
+
runContractRegistersOrThrow,
|
|
301
|
+
handleQueryResult,
|
|
302
|
+
hasProcessedToEndblock,
|
|
303
|
+
hasNoMoreEventsToProcess,
|
|
304
|
+
getHighestBlockBelowThreshold,
|
|
305
|
+
getLastKnownValidBlock,
|
|
306
|
+
isActivelyIndexing,
|
|
307
|
+
isReady,
|
|
338
308
|
}
|
|
339
309
|
/* Env Not a pure module */
|
package/src/ChainManager.res
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
open Belt
|
|
2
|
-
|
|
3
1
|
type t = {
|
|
4
2
|
committedCheckpointId: bigint,
|
|
5
3
|
chainFetchers: ChainMap.t<ChainFetcher.t>,
|
|
@@ -31,7 +29,7 @@ let calculateTargetBufferSize = (~activeChainsCount) => {
|
|
|
31
29
|
}
|
|
32
30
|
}
|
|
33
31
|
|
|
34
|
-
let makeFromDbState =
|
|
32
|
+
let makeFromDbState = (
|
|
35
33
|
~initialState: Persistence.initialState,
|
|
36
34
|
~config: Config.t,
|
|
37
35
|
~registrations,
|
|
@@ -60,14 +58,13 @@ let makeFromDbState = async (
|
|
|
60
58
|
})
|
|
61
59
|
|
|
62
60
|
let chainFetchersArr =
|
|
63
|
-
|
|
64
|
-
->Array.map(async (resumedChainState: Persistence.initialChainState) => {
|
|
61
|
+
initialState.chains->Array.map((resumedChainState: Persistence.initialChainState) => {
|
|
65
62
|
let chain = Config.getChain(config, ~chainId=resumedChainState.id)
|
|
66
63
|
let chainConfig = config.chainMap->ChainMap.get(chain)
|
|
67
64
|
|
|
68
65
|
(
|
|
69
66
|
chain,
|
|
70
|
-
|
|
67
|
+
chainConfig->ChainFetcher.makeFromDbState(
|
|
71
68
|
~resumedChainState,
|
|
72
69
|
~reorgCheckpoints=initialState.reorgCheckpoints,
|
|
73
70
|
~isInReorgThreshold,
|
|
@@ -77,7 +74,6 @@ let makeFromDbState = async (
|
|
|
77
74
|
),
|
|
78
75
|
)
|
|
79
76
|
})
|
|
80
|
-
->Promise.all
|
|
81
77
|
|
|
82
78
|
let chainFetchers = ChainMap.fromArrayUnsafe(chainFetchersArr)
|
|
83
79
|
|
|
@@ -135,7 +131,7 @@ let createBatch = (chainManager: t, ~batchSizeTarget: int, ~isRollback: bool): B
|
|
|
135
131
|
// Since for rollback we have a diff checkpoint id.
|
|
136
132
|
// This is needed to currectly overwrite old state
|
|
137
133
|
// in an append-only ClickHouse insert.
|
|
138
|
-
isRollback ? 1n : 0n
|
|
134
|
+
isRollback ? 1n : 0n,
|
|
139
135
|
),
|
|
140
136
|
~chainsBeforeBatch=chainManager.chainFetchers->ChainMap.map((cf): Batch.chainBeforeBatch => {
|
|
141
137
|
fetchState: cf.fetchState,
|
|
@@ -151,14 +147,10 @@ let createBatch = (chainManager: t, ~batchSizeTarget: int, ~isRollback: bool): B
|
|
|
151
147
|
}
|
|
152
148
|
|
|
153
149
|
let isProgressAtHead = chainManager =>
|
|
154
|
-
chainManager.chainFetchers
|
|
155
|
-
->ChainMap.values
|
|
156
|
-
->Js.Array2.every(cf => cf.isProgressAtHead)
|
|
150
|
+
chainManager.chainFetchers->ChainMap.values->Array.every(cf => cf.isProgressAtHead)
|
|
157
151
|
|
|
158
152
|
let isActivelyIndexing = chainManager =>
|
|
159
|
-
chainManager.chainFetchers
|
|
160
|
-
->ChainMap.values
|
|
161
|
-
->Js.Array2.every(ChainFetcher.isActivelyIndexing)
|
|
153
|
+
chainManager.chainFetchers->ChainMap.values->Array.every(ChainFetcher.isActivelyIndexing)
|
|
162
154
|
|
|
163
155
|
let getSafeCheckpointId = (chainManager: t) => {
|
|
164
156
|
let chainFetchers = chainManager.chainFetchers->ChainMap.values
|