envio 3.0.0-alpha.2 → 3.0.0-alpha.21
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 +164 -30
- package/bin.mjs +49 -0
- package/evm.schema.json +79 -169
- package/fuel.schema.json +50 -21
- package/index.d.ts +578 -1
- package/index.js +4 -0
- package/package.json +47 -31
- package/rescript.json +4 -1
- package/src/Batch.res +11 -8
- package/src/Batch.res.mjs +11 -9
- package/src/ChainFetcher.res +531 -0
- package/src/ChainFetcher.res.mjs +339 -0
- package/src/ChainManager.res +190 -0
- package/src/ChainManager.res.mjs +166 -0
- package/src/Change.res +3 -3
- package/src/Config.gen.ts +19 -0
- package/src/Config.res +725 -25
- package/src/Config.res.mjs +692 -26
- package/src/{Indexer.res → Ctx.res} +1 -1
- package/src/Ecosystem.res +9 -124
- package/src/Ecosystem.res.mjs +19 -160
- package/src/Env.res +33 -73
- package/src/Env.res.mjs +29 -85
- package/src/Envio.gen.ts +3 -1
- package/src/Envio.res +77 -9
- package/src/Envio.res.mjs +39 -1
- package/src/EventConfigBuilder.res +408 -0
- package/src/EventConfigBuilder.res.mjs +376 -0
- package/src/EventProcessing.res +469 -0
- package/src/EventProcessing.res.mjs +337 -0
- package/src/EvmTypes.gen.ts +6 -0
- package/src/EvmTypes.res +1 -0
- package/src/FetchState.res +1256 -639
- package/src/FetchState.res.mjs +1135 -612
- package/src/GlobalState.res +1224 -0
- package/src/GlobalState.res.mjs +1291 -0
- package/src/GlobalStateManager.res +68 -0
- package/src/GlobalStateManager.res.mjs +75 -0
- package/src/GlobalStateManager.resi +7 -0
- package/src/HandlerLoader.res +89 -0
- package/src/HandlerLoader.res.mjs +79 -0
- package/src/HandlerRegister.res +357 -0
- package/src/HandlerRegister.res.mjs +299 -0
- package/src/HandlerRegister.resi +30 -0
- package/src/Hasura.res +111 -175
- package/src/Hasura.res.mjs +88 -150
- package/src/InMemoryStore.res +1 -1
- package/src/InMemoryStore.res.mjs +3 -3
- package/src/InMemoryTable.res +1 -1
- package/src/InMemoryTable.res.mjs +1 -1
- package/src/Internal.gen.ts +6 -0
- package/src/Internal.res +265 -12
- package/src/Internal.res.mjs +115 -1
- package/src/LoadLayer.res +444 -0
- package/src/LoadLayer.res.mjs +296 -0
- package/src/LoadLayer.resi +32 -0
- package/src/LogSelection.res +33 -27
- package/src/LogSelection.res.mjs +6 -0
- package/src/Logging.res +21 -7
- package/src/Logging.res.mjs +16 -8
- package/src/Main.res +390 -0
- package/src/Main.res.mjs +341 -0
- package/src/Persistence.res +7 -21
- package/src/Persistence.res.mjs +3 -3
- package/src/PgStorage.gen.ts +10 -0
- package/src/PgStorage.res +116 -69
- package/src/PgStorage.res.d.mts +5 -0
- package/src/PgStorage.res.mjs +93 -50
- package/src/Prometheus.res +294 -224
- package/src/Prometheus.res.mjs +353 -340
- package/src/ReorgDetection.res +6 -10
- package/src/ReorgDetection.res.mjs +6 -6
- package/src/SafeCheckpointTracking.res +4 -4
- package/src/SafeCheckpointTracking.res.mjs +2 -2
- package/src/SimulateItems.res +353 -0
- package/src/SimulateItems.res.mjs +335 -0
- package/src/Sink.res +4 -2
- package/src/Sink.res.mjs +2 -1
- package/src/TableIndices.res +0 -1
- package/src/TestIndexer.res +913 -0
- package/src/TestIndexer.res.mjs +698 -0
- package/src/TestIndexerProxyStorage.res +205 -0
- package/src/TestIndexerProxyStorage.res.mjs +151 -0
- package/src/TopicFilter.res +1 -1
- package/src/Types.ts +1 -1
- package/src/UserContext.res +424 -0
- package/src/UserContext.res.mjs +279 -0
- package/src/Utils.res +97 -26
- package/src/Utils.res.mjs +91 -44
- package/src/bindings/BigInt.res +10 -0
- package/src/bindings/BigInt.res.mjs +15 -0
- package/src/bindings/ClickHouse.res +120 -23
- package/src/bindings/ClickHouse.res.mjs +118 -28
- package/src/bindings/DateFns.res +74 -0
- package/src/bindings/DateFns.res.mjs +22 -0
- package/src/bindings/EventSource.res +11 -2
- package/src/bindings/EventSource.res.mjs +8 -1
- package/src/bindings/Express.res +1 -0
- package/src/bindings/Hrtime.res +14 -1
- package/src/bindings/Hrtime.res.mjs +22 -2
- package/src/bindings/Hrtime.resi +4 -0
- package/src/bindings/Lodash.res +0 -1
- package/src/bindings/NodeJs.res +49 -3
- package/src/bindings/NodeJs.res.mjs +11 -3
- package/src/bindings/Pino.res +24 -10
- package/src/bindings/Pino.res.mjs +14 -8
- package/src/bindings/Postgres.gen.ts +8 -0
- package/src/bindings/Postgres.res +5 -1
- package/src/bindings/Postgres.res.d.mts +5 -0
- package/src/bindings/PromClient.res +0 -10
- package/src/bindings/PromClient.res.mjs +0 -3
- package/src/bindings/Vitest.res +144 -0
- package/src/bindings/Vitest.res.mjs +9 -0
- package/src/bindings/WebSocket.res +27 -0
- package/src/bindings/WebSocket.res.mjs +2 -0
- package/src/bindings/Yargs.res +8 -0
- package/src/bindings/Yargs.res.mjs +2 -0
- package/src/db/EntityHistory.res +7 -7
- package/src/db/EntityHistory.res.mjs +9 -9
- package/src/db/InternalTable.res +59 -111
- package/src/db/InternalTable.res.mjs +73 -104
- package/src/db/Table.res +27 -8
- package/src/db/Table.res.mjs +25 -14
- package/src/sources/Evm.res +84 -0
- package/src/sources/Evm.res.mjs +105 -0
- package/src/sources/EvmChain.res +94 -0
- package/src/sources/EvmChain.res.mjs +60 -0
- package/src/sources/Fuel.res +19 -34
- package/src/sources/Fuel.res.mjs +34 -16
- package/src/sources/FuelSDK.res +38 -0
- package/src/sources/FuelSDK.res.mjs +29 -0
- package/src/sources/HyperFuel.res +2 -2
- package/src/sources/HyperFuel.resi +1 -1
- package/src/sources/HyperFuelClient.res +2 -2
- package/src/sources/HyperFuelSource.res +35 -13
- package/src/sources/HyperFuelSource.res.mjs +26 -16
- package/src/sources/HyperSync.res +61 -60
- package/src/sources/HyperSync.res.mjs +53 -67
- package/src/sources/HyperSync.resi +6 -4
- package/src/sources/HyperSyncClient.res +29 -2
- package/src/sources/HyperSyncClient.res.mjs +9 -0
- package/src/sources/HyperSyncHeightStream.res +76 -118
- package/src/sources/HyperSyncHeightStream.res.mjs +68 -75
- package/src/sources/HyperSyncSource.res +122 -143
- package/src/sources/HyperSyncSource.res.mjs +106 -121
- package/src/sources/Rpc.res +86 -14
- package/src/sources/Rpc.res.mjs +101 -9
- package/src/sources/RpcSource.res +731 -364
- package/src/sources/RpcSource.res.mjs +845 -410
- package/src/sources/RpcWebSocketHeightStream.res +181 -0
- package/src/sources/RpcWebSocketHeightStream.res.mjs +196 -0
- package/src/sources/SimulateSource.res +59 -0
- package/src/sources/SimulateSource.res.mjs +50 -0
- package/src/sources/Source.res +7 -5
- package/src/sources/SourceManager.res +358 -221
- package/src/sources/SourceManager.res.mjs +346 -171
- package/src/sources/SourceManager.resi +17 -6
- package/src/sources/Svm.res +81 -0
- package/src/sources/Svm.res.mjs +90 -0
- package/src/tui/Tui.res +247 -0
- package/src/tui/Tui.res.mjs +337 -0
- package/src/tui/bindings/Ink.res +371 -0
- package/src/tui/bindings/Ink.res.mjs +72 -0
- package/src/tui/bindings/Style.res +123 -0
- package/src/tui/bindings/Style.res.mjs +2 -0
- package/src/tui/components/BufferedProgressBar.res +40 -0
- package/src/tui/components/BufferedProgressBar.res.mjs +57 -0
- package/src/tui/components/CustomHooks.res +122 -0
- package/src/tui/components/CustomHooks.res.mjs +179 -0
- package/src/tui/components/Messages.res +41 -0
- package/src/tui/components/Messages.res.mjs +75 -0
- package/src/tui/components/SyncETA.res +174 -0
- package/src/tui/components/SyncETA.res.mjs +263 -0
- package/src/tui/components/TuiData.res +47 -0
- package/src/tui/components/TuiData.res.mjs +34 -0
- package/svm.schema.json +112 -0
- package/bin.js +0 -48
- package/src/EventRegister.res +0 -241
- package/src/EventRegister.res.mjs +0 -240
- package/src/EventRegister.resi +0 -30
- package/src/bindings/Ethers.gen.ts +0 -14
- package/src/bindings/Ethers.res +0 -204
- package/src/bindings/Ethers.res.mjs +0 -130
- /package/src/{Indexer.res.mjs → Ctx.res.mjs} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
3
|
import * as Table from "./Table.res.mjs";
|
|
4
|
+
import * as $$BigInt from "../bindings/BigInt.res.mjs";
|
|
4
5
|
import * as Js_string from "rescript/lib/es6/js_string.js";
|
|
5
|
-
import * as Belt_Float from "rescript/lib/es6/belt_Float.js";
|
|
6
6
|
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
7
7
|
|
|
8
8
|
var variants = [
|
|
@@ -39,15 +39,15 @@ var changeFieldType = {
|
|
|
39
39
|
var unsafeCheckpointIdSchema = S$RescriptSchema.transform(S$RescriptSchema.setName(S$RescriptSchema.string, "CheckpointId"), (function (s) {
|
|
40
40
|
return {
|
|
41
41
|
p: (function (string) {
|
|
42
|
-
var
|
|
43
|
-
if (
|
|
44
|
-
return
|
|
42
|
+
var v = $$BigInt.fromString(string);
|
|
43
|
+
if (v !== undefined) {
|
|
44
|
+
return v;
|
|
45
45
|
} else {
|
|
46
46
|
return s.fail("The string is not valid CheckpointId", undefined);
|
|
47
47
|
}
|
|
48
48
|
}),
|
|
49
|
-
s: (function (
|
|
50
|
-
return
|
|
49
|
+
s: (function (bigint) {
|
|
50
|
+
return bigint.toString();
|
|
51
51
|
})
|
|
52
52
|
};
|
|
53
53
|
}));
|
|
@@ -81,7 +81,7 @@ function makePruneStaleEntityHistoryQuery(entityName, entityIndex, pgSchema) {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
function pruneStaleEntityHistory(sql, entityName, entityIndex, pgSchema, safeCheckpointId) {
|
|
84
|
-
return sql.unsafe(makePruneStaleEntityHistoryQuery(entityName, entityIndex, pgSchema), [safeCheckpointId], {prepare: true});
|
|
84
|
+
return sql.unsafe(makePruneStaleEntityHistoryQuery(entityName, entityIndex, pgSchema), [safeCheckpointId.toString()], {prepare: true});
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
function makeBackfillHistoryQuery(pgSchema, entityName, entityIndex) {
|
|
@@ -94,10 +94,10 @@ function backfillHistory(sql, pgSchema, entityName, entityIndex, ids) {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
function rollback(sql, pgSchema, entityName, entityIndex, rollbackTargetCheckpointId) {
|
|
97
|
-
return sql.unsafe("DELETE FROM \"" + pgSchema + "\".\"" + historyTableName(entityName, entityIndex) + "\" WHERE \"" + checkpointIdFieldName + "\" > $1;", [rollbackTargetCheckpointId], {prepare: true});
|
|
97
|
+
return sql.unsafe("DELETE FROM \"" + pgSchema + "\".\"" + historyTableName(entityName, entityIndex) + "\" WHERE \"" + checkpointIdFieldName + "\" > $1;", [rollbackTargetCheckpointId.toString()], {prepare: true});
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
var checkpointIdFieldType = "
|
|
100
|
+
var checkpointIdFieldType = "UInt64";
|
|
101
101
|
|
|
102
102
|
var maxPgTableNameLength = 63;
|
|
103
103
|
|
package/src/db/InternalTable.res
CHANGED
|
@@ -5,75 +5,13 @@ let isPrimaryKey = true
|
|
|
5
5
|
let isNullable = true
|
|
6
6
|
let isIndex = true
|
|
7
7
|
|
|
8
|
-
module DynamicContractRegistry =
|
|
9
|
-
let name = "dynamic_contract_registry"
|
|
10
|
-
let index = -1
|
|
11
|
-
|
|
12
|
-
let makeId = (~chainId, ~contractAddress) => {
|
|
13
|
-
chainId->Belt.Int.toString ++ "-" ++ contractAddress->Address.toString
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// @genType Used for Test DB
|
|
17
|
-
@genType
|
|
18
|
-
type t = {
|
|
19
|
-
id: string,
|
|
20
|
-
@as("chain_id") chainId: int,
|
|
21
|
-
@as("registering_event_block_number") registeringEventBlockNumber: int,
|
|
22
|
-
@as("registering_event_log_index") registeringEventLogIndex: int,
|
|
23
|
-
@as("registering_event_block_timestamp") registeringEventBlockTimestamp: int,
|
|
24
|
-
@as("registering_event_contract_name") registeringEventContractName: string,
|
|
25
|
-
@as("registering_event_name") registeringEventName: string,
|
|
26
|
-
@as("registering_event_src_address") registeringEventSrcAddress: Address.t,
|
|
27
|
-
@as("contract_address") contractAddress: Address.t,
|
|
28
|
-
@as("contract_name") contractName: string,
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
let schema = S.schema(s => {
|
|
32
|
-
id: s.matches(S.string),
|
|
33
|
-
chainId: s.matches(S.int),
|
|
34
|
-
registeringEventBlockNumber: s.matches(S.int),
|
|
35
|
-
registeringEventLogIndex: s.matches(S.int),
|
|
36
|
-
registeringEventContractName: s.matches(S.string),
|
|
37
|
-
registeringEventName: s.matches(S.string),
|
|
38
|
-
registeringEventSrcAddress: s.matches(Address.schema),
|
|
39
|
-
registeringEventBlockTimestamp: s.matches(S.int),
|
|
40
|
-
contractAddress: s.matches(Address.schema),
|
|
41
|
-
contractName: s.matches(S.string),
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
let rowsSchema = S.array(schema)
|
|
45
|
-
|
|
46
|
-
let table = mkTable(
|
|
47
|
-
name,
|
|
48
|
-
~fields=[
|
|
49
|
-
mkField("id", String, ~isPrimaryKey, ~fieldSchema=S.string),
|
|
50
|
-
mkField("chain_id", Int32, ~fieldSchema=S.int),
|
|
51
|
-
mkField("registering_event_block_number", Int32, ~fieldSchema=S.int),
|
|
52
|
-
mkField("registering_event_log_index", Int32, ~fieldSchema=S.int),
|
|
53
|
-
mkField("registering_event_block_timestamp", Int32, ~fieldSchema=S.int),
|
|
54
|
-
mkField("registering_event_contract_name", String, ~fieldSchema=S.string),
|
|
55
|
-
mkField("registering_event_name", String, ~fieldSchema=S.string),
|
|
56
|
-
mkField("registering_event_src_address", String, ~fieldSchema=Address.schema),
|
|
57
|
-
mkField("contract_address", String, ~fieldSchema=Address.schema),
|
|
58
|
-
mkField("contract_name", String, ~fieldSchema=S.string),
|
|
59
|
-
],
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
external castToInternal: t => Internal.entity = "%identity"
|
|
63
|
-
|
|
64
|
-
let config = {
|
|
65
|
-
name,
|
|
66
|
-
index,
|
|
67
|
-
schema,
|
|
68
|
-
rowsSchema,
|
|
69
|
-
table,
|
|
70
|
-
}->Internal.fromGenericEntityConfig
|
|
71
|
-
}
|
|
8
|
+
module DynamicContractRegistry = Config.DynamicContractRegistry
|
|
72
9
|
|
|
73
10
|
module Chains = {
|
|
74
11
|
type progressFields = [
|
|
75
12
|
| #progress_block
|
|
76
13
|
| #events_processed
|
|
14
|
+
| #source_block
|
|
77
15
|
]
|
|
78
16
|
|
|
79
17
|
type field = [
|
|
@@ -86,7 +24,6 @@ module Chains = {
|
|
|
86
24
|
| #first_event_block
|
|
87
25
|
| #buffer_block
|
|
88
26
|
| #ready_at
|
|
89
|
-
| #_num_batches_fetched
|
|
90
27
|
| #_is_hyper_sync
|
|
91
28
|
]
|
|
92
29
|
|
|
@@ -102,17 +39,14 @@ module Chains = {
|
|
|
102
39
|
#ready_at,
|
|
103
40
|
#events_processed,
|
|
104
41
|
#_is_hyper_sync,
|
|
105
|
-
#_num_batches_fetched,
|
|
106
42
|
]
|
|
107
43
|
|
|
108
44
|
type metaFields = {
|
|
109
45
|
@as("first_event_block") firstEventBlockNumber: Js.null<int>,
|
|
110
46
|
@as("buffer_block") latestFetchedBlockNumber: int,
|
|
111
|
-
@as("source_block") blockHeight: int,
|
|
112
47
|
@as("ready_at")
|
|
113
48
|
timestampCaughtUpToHeadOrEndblock: Js.null<Js.Date.t>,
|
|
114
49
|
@as("_is_hyper_sync") isHyperSync: bool,
|
|
115
|
-
@as("_num_batches_fetched") numBatchesFetched: int,
|
|
116
50
|
}
|
|
117
51
|
|
|
118
52
|
type t = {
|
|
@@ -120,8 +54,9 @@ module Chains = {
|
|
|
120
54
|
@as("start_block") startBlock: int,
|
|
121
55
|
@as("end_block") endBlock: Js.null<int>,
|
|
122
56
|
@as("max_reorg_depth") maxReorgDepth: int,
|
|
57
|
+
@as("source_block") blockHeight: int,
|
|
123
58
|
@as("progress_block") progressBlockNumber: int,
|
|
124
|
-
@as("events_processed") numEventsProcessed:
|
|
59
|
+
@as("events_processed") numEventsProcessed: float,
|
|
125
60
|
...metaFields,
|
|
126
61
|
}
|
|
127
62
|
|
|
@@ -152,13 +87,11 @@ module Chains = {
|
|
|
152
87
|
~fieldSchema=S.null(Utils.Schema.dbDate),
|
|
153
88
|
~isNullable,
|
|
154
89
|
),
|
|
155
|
-
mkField((#events_processed: field :> string),
|
|
90
|
+
mkField((#events_processed: field :> string), UInt52, ~fieldSchema=S.float),
|
|
156
91
|
// TODO: In the future it should reference a table with sources
|
|
157
92
|
mkField((#_is_hyper_sync: field :> string), Boolean, ~fieldSchema=S.bool),
|
|
158
93
|
// Fully processed block number
|
|
159
94
|
mkField((#progress_block: field :> string), Int32, ~fieldSchema=S.int),
|
|
160
|
-
// TODO: Should deprecate after changing the ETA calculation logic
|
|
161
|
-
mkField((#_num_batches_fetched: field :> string), Int32, ~fieldSchema=S.int),
|
|
162
95
|
],
|
|
163
96
|
)
|
|
164
97
|
|
|
@@ -174,8 +107,7 @@ module Chains = {
|
|
|
174
107
|
timestampCaughtUpToHeadOrEndblock: Js.Null.empty,
|
|
175
108
|
progressBlockNumber: -1,
|
|
176
109
|
isHyperSync: false,
|
|
177
|
-
numEventsProcessed: 0
|
|
178
|
-
numBatchesFetched: 0,
|
|
110
|
+
numEventsProcessed: 0.,
|
|
179
111
|
}
|
|
180
112
|
}
|
|
181
113
|
|
|
@@ -194,8 +126,9 @@ module Chains = {
|
|
|
194
126
|
initialValues->(Utils.magic: t => dict<unknown>)->Js.Dict.get((field :> string))
|
|
195
127
|
switch Js.typeof(value) {
|
|
196
128
|
| "object" => "NULL"
|
|
197
|
-
| "number" => value->Utils.magic->Belt.Int.toString
|
|
198
|
-
| "
|
|
129
|
+
| "number" => value->(Utils.magic: option<unknown> => int)->Belt.Int.toString
|
|
130
|
+
| "bigint" => value->(Utils.magic: option<unknown> => bigint)->BigInt.toString
|
|
131
|
+
| "boolean" => value->(Utils.magic: option<unknown> => bool) ? "true" : "false"
|
|
199
132
|
| _ => Js.Exn.raiseError("Invalid envio_chains value type")
|
|
200
133
|
}
|
|
201
134
|
})
|
|
@@ -211,14 +144,7 @@ VALUES ${valuesRows->Js.Array2.joinWith(",\n ")};`,
|
|
|
211
144
|
}
|
|
212
145
|
|
|
213
146
|
// Fields that can be updated outside of the batch transaction
|
|
214
|
-
let metaFields: array<field> = [
|
|
215
|
-
#source_block,
|
|
216
|
-
#buffer_block,
|
|
217
|
-
#first_event_block,
|
|
218
|
-
#ready_at,
|
|
219
|
-
#_is_hyper_sync,
|
|
220
|
-
#_num_batches_fetched,
|
|
221
|
-
]
|
|
147
|
+
let metaFields: array<field> = [#buffer_block, #first_event_block, #ready_at, #_is_hyper_sync]
|
|
222
148
|
|
|
223
149
|
let makeMetaFieldsUpdateQuery = (~pgSchema) => {
|
|
224
150
|
// Generate SET clauses with parameter placeholders
|
|
@@ -240,9 +166,10 @@ WHERE "${(#id: field :> string)}" = $1;`
|
|
|
240
166
|
maxReorgDepth: int,
|
|
241
167
|
firstEventBlockNumber: Js.Null.t<int>,
|
|
242
168
|
timestampCaughtUpToHeadOrEndblock: Js.Null.t<Js.Date.t>,
|
|
243
|
-
numEventsProcessed:
|
|
169
|
+
numEventsProcessed: float,
|
|
244
170
|
progressBlockNumber: int,
|
|
245
171
|
dynamicContracts: array<Internal.indexingContract>,
|
|
172
|
+
sourceBlockNumber: int,
|
|
246
173
|
}
|
|
247
174
|
|
|
248
175
|
// FIXME: Using registering_event_block_number for startBlock
|
|
@@ -256,8 +183,9 @@ WHERE "${(#id: field :> string)}" = $1;`
|
|
|
256
183
|
"${(#max_reorg_depth: field :> string)}" as "maxReorgDepth",
|
|
257
184
|
"${(#first_event_block: field :> string)}" as "firstEventBlockNumber",
|
|
258
185
|
"${(#ready_at: field :> string)}" as "timestampCaughtUpToHeadOrEndblock",
|
|
259
|
-
"${(#events_processed: field :> string)}" as "numEventsProcessed",
|
|
186
|
+
"${(#events_processed: field :> string)}"::float8 as "numEventsProcessed",
|
|
260
187
|
"${(#progress_block: field :> string)}" as "progressBlockNumber",
|
|
188
|
+
"${(#source_block: field :> string)}" as "sourceBlockNumber",
|
|
261
189
|
(
|
|
262
190
|
SELECT COALESCE(json_agg(json_build_object(
|
|
263
191
|
'address', "contract_address",
|
|
@@ -277,7 +205,7 @@ FROM "${pgSchema}"."${table.tableName}" as chains;`
|
|
|
277
205
|
->(Utils.magic: promise<array<unknown>> => promise<array<rawInitialState>>)
|
|
278
206
|
}
|
|
279
207
|
|
|
280
|
-
let progressFields: array<progressFields> = [#progress_block, #events_processed]
|
|
208
|
+
let progressFields: array<progressFields> = [#progress_block, #events_processed, #source_block]
|
|
281
209
|
|
|
282
210
|
let makeProgressFieldsUpdateQuery = (~pgSchema) => {
|
|
283
211
|
let setClauses = Belt.Array.mapWithIndex(progressFields, (index, field) => {
|
|
@@ -318,7 +246,8 @@ WHERE "id" = $1;`
|
|
|
318
246
|
type progressedChain = {
|
|
319
247
|
chainId: int,
|
|
320
248
|
progressBlockNumber: int,
|
|
321
|
-
|
|
249
|
+
sourceBlockNumber: int,
|
|
250
|
+
totalEventsProcessed: float,
|
|
322
251
|
}
|
|
323
252
|
|
|
324
253
|
let setProgressedChains = (sql, ~pgSchema, ~progressedChains: array<progressedChain>) => {
|
|
@@ -338,7 +267,8 @@ WHERE "id" = $1;`
|
|
|
338
267
|
->Js.Array2.push(
|
|
339
268
|
switch field {
|
|
340
269
|
| #progress_block => data.progressBlockNumber->(Utils.magic: int => unknown)
|
|
341
|
-
| #events_processed => data.totalEventsProcessed->(Utils.magic:
|
|
270
|
+
| #events_processed => data.totalEventsProcessed->(Utils.magic: float => unknown)
|
|
271
|
+
| #source_block => data.sourceBlockNumber->(Utils.magic: int => unknown)
|
|
342
272
|
},
|
|
343
273
|
)
|
|
344
274
|
->ignore
|
|
@@ -382,7 +312,7 @@ module Checkpoints = {
|
|
|
382
312
|
]
|
|
383
313
|
|
|
384
314
|
type t = {
|
|
385
|
-
id:
|
|
315
|
+
id: bigint,
|
|
386
316
|
@as("chain_id")
|
|
387
317
|
chainId: int,
|
|
388
318
|
@as("block_number")
|
|
@@ -393,12 +323,24 @@ module Checkpoints = {
|
|
|
393
323
|
eventsProcessed: int,
|
|
394
324
|
}
|
|
395
325
|
|
|
396
|
-
|
|
326
|
+
// Schema for parsing DB results where BIGINT columns come back as strings
|
|
327
|
+
let dbSchema = S.object(s => {
|
|
328
|
+
id: s.field("id", BigInt.schema),
|
|
329
|
+
chainId: s.field("chain_id", S.int),
|
|
330
|
+
blockNumber: s.field("block_number", S.int),
|
|
331
|
+
blockHash: s.field(
|
|
332
|
+
"block_hash",
|
|
333
|
+
S.union([S.string->(Utils.magic: S.t<string> => S.t<Js.null<string>>), S.literal(%raw(`null`))]),
|
|
334
|
+
),
|
|
335
|
+
eventsProcessed: s.field("events_processed", S.int),
|
|
336
|
+
})
|
|
337
|
+
|
|
338
|
+
let initialCheckpointId = 0n
|
|
397
339
|
|
|
398
340
|
let table = mkTable(
|
|
399
341
|
"envio_checkpoints",
|
|
400
342
|
~fields=[
|
|
401
|
-
mkField((#id: field :> string),
|
|
343
|
+
mkField((#id: field :> string), UInt64, ~fieldSchema=S.bigint, ~isPrimaryKey),
|
|
402
344
|
mkField((#chain_id: field :> string), Int32, ~fieldSchema=S.int),
|
|
403
345
|
mkField((#block_number: field :> string), Int32, ~fieldSchema=S.int),
|
|
404
346
|
mkField((#block_hash: field :> string), String, ~fieldSchema=S.null(S.string), ~isNullable),
|
|
@@ -433,12 +375,12 @@ WHERE cp."${(#block_hash: field :> string)}" IS NOT NULL
|
|
|
433
375
|
}
|
|
434
376
|
|
|
435
377
|
let makeCommitedCheckpointIdQuery = (~pgSchema) => {
|
|
436
|
-
`SELECT COALESCE(MAX(${(#id: field :> string)}), ${initialCheckpointId->
|
|
378
|
+
`SELECT COALESCE(MAX(${(#id: field :> string)}), ${initialCheckpointId->BigInt.toString}) AS id FROM "${pgSchema}"."${table.tableName}";`
|
|
437
379
|
}
|
|
438
380
|
|
|
439
381
|
let makeInsertCheckpointQuery = (~pgSchema) => {
|
|
440
382
|
`INSERT INTO "${pgSchema}"."${table.tableName}" ("${(#id: field :> string)}", "${(#chain_id: field :> string)}", "${(#block_number: field :> string)}", "${(#block_hash: field :> string)}", "${(#events_processed: field :> string)}")
|
|
441
|
-
SELECT * FROM unnest($1::${(
|
|
383
|
+
SELECT * FROM unnest($1::${(BigInt: Postgres.columnType :> string)}[],$2::${(Integer: Postgres.columnType :> string)}[],$3::${(Integer: Postgres.columnType :> string)}[],$4::${(Text: Postgres.columnType :> string)}[],$5::${(Integer: Postgres.columnType :> string)}[]);`
|
|
442
384
|
}
|
|
443
385
|
|
|
444
386
|
let insert = (
|
|
@@ -452,18 +394,20 @@ SELECT * FROM unnest($1::${(Integer: Postgres.columnType :> string)}[],$2::${(In
|
|
|
452
394
|
) => {
|
|
453
395
|
let query = makeInsertCheckpointQuery(~pgSchema)
|
|
454
396
|
|
|
397
|
+
// Convert bigint arrays to string arrays for postgres driver compatibility
|
|
398
|
+
let checkpointIdStrings = checkpointIds->BigInt.arrayToStringArray
|
|
455
399
|
sql
|
|
456
400
|
->Postgres.preparedUnsafe(
|
|
457
401
|
query,
|
|
458
402
|
(
|
|
459
|
-
|
|
403
|
+
checkpointIdStrings,
|
|
460
404
|
checkpointChainIds,
|
|
461
405
|
checkpointBlockNumbers,
|
|
462
406
|
checkpointBlockHashes,
|
|
463
407
|
checkpointEventsProcessed,
|
|
464
408
|
)->(
|
|
465
409
|
Utils.magic: (
|
|
466
|
-
(array<
|
|
410
|
+
(array<string>, array<int>, array<int>, array<Js.Null.t<string>>, array<int>)
|
|
467
411
|
) => unknown
|
|
468
412
|
),
|
|
469
413
|
)
|
|
@@ -474,7 +418,7 @@ SELECT * FROM unnest($1::${(Integer: Postgres.columnType :> string)}[],$2::${(In
|
|
|
474
418
|
sql
|
|
475
419
|
->Postgres.preparedUnsafe(
|
|
476
420
|
`DELETE FROM "${pgSchema}"."${table.tableName}" WHERE "${(#id: field :> string)}" > $1;`,
|
|
477
|
-
[rollbackTargetCheckpointId]->Utils.magic,
|
|
421
|
+
[rollbackTargetCheckpointId->BigInt.toString]->(Utils.magic: array<string> => unknown),
|
|
478
422
|
)
|
|
479
423
|
->Promise.ignoreValue
|
|
480
424
|
}
|
|
@@ -483,11 +427,11 @@ SELECT * FROM unnest($1::${(Integer: Postgres.columnType :> string)}[],$2::${(In
|
|
|
483
427
|
`DELETE FROM "${pgSchema}"."${table.tableName}" WHERE "${(#id: field :> string)}" < $1;`
|
|
484
428
|
}
|
|
485
429
|
|
|
486
|
-
let pruneStaleCheckpoints = (sql, ~pgSchema, ~safeCheckpointId:
|
|
430
|
+
let pruneStaleCheckpoints = (sql, ~pgSchema, ~safeCheckpointId: bigint) => {
|
|
487
431
|
sql
|
|
488
432
|
->Postgres.preparedUnsafe(
|
|
489
433
|
makePruneStaleCheckpointsQuery(~pgSchema),
|
|
490
|
-
[safeCheckpointId]->Obj.magic,
|
|
434
|
+
[safeCheckpointId->BigInt.toString]->Obj.magic,
|
|
491
435
|
)
|
|
492
436
|
->Promise.ignoreValue
|
|
493
437
|
}
|
|
@@ -507,12 +451,16 @@ LIMIT 1;`
|
|
|
507
451
|
~reorgChainId: int,
|
|
508
452
|
~lastKnownValidBlockNumber: int,
|
|
509
453
|
) => {
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
454
|
+
let rawResult: promise<array<{"id": string}>> =
|
|
455
|
+
sql
|
|
456
|
+
->Postgres.preparedUnsafe(
|
|
457
|
+
makeGetRollbackTargetCheckpointQuery(~pgSchema),
|
|
458
|
+
(reorgChainId, lastKnownValidBlockNumber)->Obj.magic,
|
|
459
|
+
)
|
|
460
|
+
->(Utils.magic: promise<unknown> => promise<array<{"id": string}>>)
|
|
461
|
+
rawResult->Promise.thenResolve(rows => {
|
|
462
|
+
rows->Belt.Array.get(0)->Belt.Option.map(row => row["id"]->BigInt.fromStringUnsafe)
|
|
463
|
+
})
|
|
516
464
|
}
|
|
517
465
|
|
|
518
466
|
let makeGetRollbackProgressDiffQuery = (~pgSchema) => {
|
|
@@ -533,7 +481,7 @@ GROUP BY "${(#chain_id: field :> string)}";`
|
|
|
533
481
|
sql
|
|
534
482
|
->Postgres.preparedUnsafe(
|
|
535
483
|
makeGetRollbackProgressDiffQuery(~pgSchema),
|
|
536
|
-
[rollbackTargetCheckpointId]->Obj.magic,
|
|
484
|
+
[rollbackTargetCheckpointId->BigInt.toString]->Obj.magic,
|
|
537
485
|
)
|
|
538
486
|
->(
|
|
539
487
|
Utils.magic: promise<unknown> => promise<
|
|
@@ -584,7 +532,7 @@ module RawEvents = {
|
|
|
584
532
|
"raw_events",
|
|
585
533
|
~fields=[
|
|
586
534
|
mkField("chain_id", Int32, ~fieldSchema=S.int),
|
|
587
|
-
mkField("event_id",
|
|
535
|
+
mkField("event_id", UInt64, ~fieldSchema=S.bigint),
|
|
588
536
|
mkField("event_name", String, ~fieldSchema=S.string),
|
|
589
537
|
mkField("contract_name", String, ~fieldSchema=S.string),
|
|
590
538
|
mkField("block_number", Int32, ~fieldSchema=S.int),
|
|
@@ -595,7 +543,7 @@ module RawEvents = {
|
|
|
595
543
|
mkField("block_fields", Json, ~fieldSchema=S.json(~validate=false)),
|
|
596
544
|
mkField("transaction_fields", Json, ~fieldSchema=S.json(~validate=false)),
|
|
597
545
|
mkField("params", Json, ~fieldSchema=S.json(~validate=false)),
|
|
598
|
-
mkField("serial",
|
|
546
|
+
mkField("serial", BigSerial, ~isNullable, ~isPrimaryKey, ~fieldSchema=S.null(S.bigint)),
|
|
599
547
|
],
|
|
600
548
|
)
|
|
601
549
|
}
|
|
@@ -614,7 +562,7 @@ SELECT
|
|
|
614
562
|
"${(#progress_block: Chains.field :> string)}" AS "progressBlock",
|
|
615
563
|
"${(#buffer_block: Chains.field :> string)}" AS "bufferBlock",
|
|
616
564
|
"${(#first_event_block: Chains.field :> string)}" AS "firstEventBlock",
|
|
617
|
-
"${(#events_processed: Chains.field :> string)}" AS "eventsProcessed",
|
|
565
|
+
"${(#events_processed: Chains.field :> string)}"::float4 AS "eventsProcessed",
|
|
618
566
|
"${(#source_block: Chains.field :> string)}" AS "sourceBlock",
|
|
619
567
|
"${(#ready_at: Chains.field :> string)}" AS "readyAt",
|
|
620
568
|
("${(#ready_at: Chains.field :> string)}" IS NOT NULL) AS "isReady"
|
|
@@ -632,8 +580,8 @@ SELECT
|
|
|
632
580
|
"${(#_is_hyper_sync: Chains.field :> string)}" AS "is_hyper_sync",
|
|
633
581
|
"${(#buffer_block: Chains.field :> string)}" AS "latest_fetched_block_number",
|
|
634
582
|
"${(#progress_block: Chains.field :> string)}" AS "latest_processed_block",
|
|
635
|
-
|
|
636
|
-
"${(#events_processed: Chains.field :> string)}" AS "num_events_processed",
|
|
583
|
+
0 AS "num_batches_fetched",
|
|
584
|
+
"${(#events_processed: Chains.field :> string)}"::float4 AS "num_events_processed",
|
|
637
585
|
"${(#start_block: Chains.field :> string)}" AS "start_block",
|
|
638
586
|
"${(#ready_at: Chains.field :> string)}" AS "timestamp_caught_up_to_head_or_endblock"
|
|
639
587
|
FROM "${pgSchema}"."${Chains.table.tableName}";`
|