envio 2.28.0-alpha.3 → 2.28.0
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/package.json +6 -6
- package/src/Batch.res +146 -0
- package/src/Batch.res.js +129 -0
- package/src/FetchState.res +15 -0
- package/src/FetchState.res.js +20 -0
- package/src/Hasura.res +3 -19
- package/src/Hasura.res.js +6 -16
- package/src/InternalConfig.res +10 -0
- package/src/Persistence.res +25 -6
- package/src/Persistence.res.js +18 -3
- package/src/PgStorage.res +16 -8
- package/src/PgStorage.res.js +9 -6
- package/src/Throttler.res +4 -1
- package/src/Throttler.res.js +2 -1
- package/src/Utils.res +7 -0
- package/src/Utils.res.js +6 -1
- package/src/bindings/Postgres.res +1 -1
- package/src/db/InternalTable.gen.ts +0 -7
- package/src/db/InternalTable.res +140 -75
- package/src/db/InternalTable.res.js +104 -73
- package/src/sources/EventRouter.res +113 -0
- package/src/sources/EventRouter.res.js +125 -0
- package/src/sources/HyperSync.res +15 -7
- package/src/sources/HyperSync.res.js +48 -15
- package/src/sources/HyperSyncClient.res +4 -3
- package/src/sources/HyperSyncClient.res.js +6 -1
- package/src/sources/RpcSource.res +748 -0
- package/src/sources/RpcSource.res.js +697 -0
|
@@ -11,35 +11,6 @@ var Belt_Array = require("rescript/lib/js/belt_Array.js");
|
|
|
11
11
|
var EntityHistory = require("./EntityHistory.res.js");
|
|
12
12
|
var S$RescriptSchema = require("rescript-schema/src/S.res.js");
|
|
13
13
|
|
|
14
|
-
var blockTimestampFieldName = "block_timestamp";
|
|
15
|
-
|
|
16
|
-
var blockNumberFieldName = "block_number";
|
|
17
|
-
|
|
18
|
-
var logIndexFieldName = "log_index";
|
|
19
|
-
|
|
20
|
-
var isPreRegisteringDynamicContractsFieldName = "is_pre_registering_dynamic_contracts";
|
|
21
|
-
|
|
22
|
-
var table = Table.mkTable("event_sync_state", undefined, [
|
|
23
|
-
Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined),
|
|
24
|
-
Table.mkField(blockNumberFieldName, "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
25
|
-
Table.mkField(logIndexFieldName, "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
26
|
-
Table.mkField(blockTimestampFieldName, "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
27
|
-
Table.mkField(isPreRegisteringDynamicContractsFieldName, "BOOLEAN", S$RescriptSchema.bool, "false", undefined, undefined, undefined, undefined, undefined)
|
|
28
|
-
]);
|
|
29
|
-
|
|
30
|
-
function resetCurrentCurrentSyncStateQuery(pgSchema) {
|
|
31
|
-
return "UPDATE \"" + pgSchema + "\".\"" + table.tableName + "\"\n SET " + blockNumberFieldName + " = 0, \n " + logIndexFieldName + " = 0, \n " + blockTimestampFieldName + " = 0, \n " + isPreRegisteringDynamicContractsFieldName + " = false;";
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
var EventSyncState = {
|
|
35
|
-
blockTimestampFieldName: blockTimestampFieldName,
|
|
36
|
-
blockNumberFieldName: blockNumberFieldName,
|
|
37
|
-
logIndexFieldName: logIndexFieldName,
|
|
38
|
-
isPreRegisteringDynamicContractsFieldName: isPreRegisteringDynamicContractsFieldName,
|
|
39
|
-
table: table,
|
|
40
|
-
resetCurrentCurrentSyncStateQuery: resetCurrentCurrentSyncStateQuery
|
|
41
|
-
};
|
|
42
|
-
|
|
43
14
|
var fields = [
|
|
44
15
|
"id",
|
|
45
16
|
"start_block",
|
|
@@ -47,14 +18,15 @@ var fields = [
|
|
|
47
18
|
"source_block",
|
|
48
19
|
"first_event_block",
|
|
49
20
|
"buffer_block",
|
|
21
|
+
"progress_block",
|
|
50
22
|
"ready_at",
|
|
51
23
|
"events_processed",
|
|
24
|
+
"_progress_log_index",
|
|
52
25
|
"_is_hyper_sync",
|
|
53
|
-
"_latest_processed_block",
|
|
54
26
|
"_num_batches_fetched"
|
|
55
27
|
];
|
|
56
28
|
|
|
57
|
-
var table
|
|
29
|
+
var table = Table.mkTable("envio_chains", undefined, [
|
|
58
30
|
Table.mkField("id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined),
|
|
59
31
|
Table.mkField("start_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
60
32
|
Table.mkField("end_block", "INTEGER", S$RescriptSchema.$$null(S$RescriptSchema.$$int), undefined, undefined, true, undefined, undefined, undefined),
|
|
@@ -64,7 +36,8 @@ var table$1 = Table.mkTable("envio_chains", undefined, [
|
|
|
64
36
|
Table.mkField("ready_at", "TIMESTAMP WITH TIME ZONE NULL", S$RescriptSchema.$$null(Utils.Schema.dbDate), undefined, undefined, true, undefined, undefined, undefined),
|
|
65
37
|
Table.mkField("events_processed", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
66
38
|
Table.mkField("_is_hyper_sync", "BOOLEAN", S$RescriptSchema.bool, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
67
|
-
Table.mkField("
|
|
39
|
+
Table.mkField("progress_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
40
|
+
Table.mkField("_progress_log_index", "INTEGER", S$RescriptSchema.$$null(S$RescriptSchema.$$int), undefined, undefined, true, undefined, undefined, undefined),
|
|
68
41
|
Table.mkField("_num_batches_fetched", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined)
|
|
69
42
|
]);
|
|
70
43
|
|
|
@@ -73,12 +46,13 @@ function initialFromConfig(chainConfig) {
|
|
|
73
46
|
id: chainConfig.id,
|
|
74
47
|
start_block: chainConfig.startBlock,
|
|
75
48
|
end_block: Js_null.fromOption(chainConfig.endBlock),
|
|
76
|
-
|
|
49
|
+
progress_block: -1,
|
|
50
|
+
_progress_log_index: null,
|
|
51
|
+
events_processed: 0,
|
|
77
52
|
first_event_block: null,
|
|
78
53
|
buffer_block: -1,
|
|
54
|
+
source_block: 0,
|
|
79
55
|
ready_at: null,
|
|
80
|
-
events_processed: 0,
|
|
81
|
-
_latest_processed_block: null,
|
|
82
56
|
_is_hyper_sync: false,
|
|
83
57
|
_num_batches_fetched: 0
|
|
84
58
|
};
|
|
@@ -113,53 +87,85 @@ function makeInitialValuesQuery(pgSchema, chainConfigs) {
|
|
|
113
87
|
}));
|
|
114
88
|
return "(" + values.join(", ") + ")";
|
|
115
89
|
}));
|
|
116
|
-
return "INSERT INTO \"" + pgSchema + "\".\"" + table
|
|
90
|
+
return "INSERT INTO \"" + pgSchema + "\".\"" + table.tableName + "\" (" + columnNames.join(", ") + ")\nVALUES " + valuesRows.join(",\n ") + ";";
|
|
117
91
|
}
|
|
118
92
|
|
|
119
|
-
var
|
|
93
|
+
var metaFields = [
|
|
120
94
|
"source_block",
|
|
121
|
-
"first_event_block",
|
|
122
95
|
"buffer_block",
|
|
96
|
+
"first_event_block",
|
|
123
97
|
"ready_at",
|
|
124
|
-
"events_processed",
|
|
125
98
|
"_is_hyper_sync",
|
|
126
|
-
"_latest_processed_block",
|
|
127
99
|
"_num_batches_fetched"
|
|
128
100
|
];
|
|
129
101
|
|
|
130
|
-
function
|
|
131
|
-
var setClauses = Belt_Array.mapWithIndex(
|
|
102
|
+
function makeMetaFieldsUpdateQuery(pgSchema) {
|
|
103
|
+
var setClauses = Belt_Array.mapWithIndex(metaFields, (function (index, field) {
|
|
132
104
|
var paramIndex = index + 2 | 0;
|
|
133
105
|
return "\"" + field + "\" = $" + String(paramIndex);
|
|
134
106
|
}));
|
|
135
|
-
return "UPDATE \"" + pgSchema + "\".\"" + table
|
|
107
|
+
return "UPDATE \"" + pgSchema + "\".\"" + table.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"id\" = $1;";
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
var progressFields = [
|
|
111
|
+
"progress_block",
|
|
112
|
+
"_progress_log_index",
|
|
113
|
+
"events_processed"
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
function makeProgressFieldsUpdateQuery(pgSchema) {
|
|
117
|
+
var setClauses = Belt_Array.mapWithIndex(progressFields, (function (index, field) {
|
|
118
|
+
var paramIndex = index + 2 | 0;
|
|
119
|
+
return "\"" + field + "\" = $" + String(paramIndex);
|
|
120
|
+
}));
|
|
121
|
+
return "UPDATE \"" + pgSchema + "\".\"" + table.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"id\" = $1;";
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function setMeta(sql, pgSchema, chainsData) {
|
|
125
|
+
var query = makeMetaFieldsUpdateQuery(pgSchema);
|
|
126
|
+
var promises = [];
|
|
127
|
+
Utils.Dict.forEachWithKey(chainsData, (function (chainId, data) {
|
|
128
|
+
var params = [];
|
|
129
|
+
params.push(chainId);
|
|
130
|
+
metaFields.forEach(function (field) {
|
|
131
|
+
var value = data[field];
|
|
132
|
+
params.push(value);
|
|
133
|
+
});
|
|
134
|
+
promises.push(sql.unsafe(query, params, {prepare: true}));
|
|
135
|
+
}));
|
|
136
|
+
return Promise.all(promises);
|
|
136
137
|
}
|
|
137
138
|
|
|
138
|
-
function
|
|
139
|
-
var query =
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
139
|
+
function setProgressedChains(sql, pgSchema, progressedChains) {
|
|
140
|
+
var query = makeProgressFieldsUpdateQuery(pgSchema);
|
|
141
|
+
var promises = [];
|
|
142
|
+
progressedChains.forEach(function (data) {
|
|
143
|
+
var params = [];
|
|
144
|
+
params.push(data.chainId);
|
|
145
|
+
progressFields.forEach(function (field) {
|
|
146
|
+
params.push(field === "events_processed" ? data.totalEventsProcessed : (
|
|
147
|
+
field === "progress_block" ? data.progressBlockNumber : Js_null.fromOption(data.progressNextBlockLogIndex)
|
|
148
|
+
));
|
|
149
|
+
});
|
|
150
|
+
promises.push(sql.unsafe(query, params, {prepare: true}));
|
|
151
|
+
});
|
|
152
|
+
return Promise.all(promises);
|
|
150
153
|
}
|
|
151
154
|
|
|
152
155
|
var Chains = {
|
|
153
156
|
fields: fields,
|
|
154
|
-
table: table
|
|
157
|
+
table: table,
|
|
155
158
|
initialFromConfig: initialFromConfig,
|
|
156
159
|
makeInitialValuesQuery: makeInitialValuesQuery,
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
+
metaFields: metaFields,
|
|
161
|
+
makeMetaFieldsUpdateQuery: makeMetaFieldsUpdateQuery,
|
|
162
|
+
progressFields: progressFields,
|
|
163
|
+
makeProgressFieldsUpdateQuery: makeProgressFieldsUpdateQuery,
|
|
164
|
+
setMeta: setMeta,
|
|
165
|
+
setProgressedChains: setProgressedChains
|
|
160
166
|
};
|
|
161
167
|
|
|
162
|
-
var table$
|
|
168
|
+
var table$1 = Table.mkTable("persisted_state", undefined, [
|
|
163
169
|
Table.mkField("id", "SERIAL", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined),
|
|
164
170
|
Table.mkField("envio_version", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
165
171
|
Table.mkField("config_hash", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
@@ -169,17 +175,17 @@ var table$2 = Table.mkTable("persisted_state", undefined, [
|
|
|
169
175
|
]);
|
|
170
176
|
|
|
171
177
|
var PersistedState = {
|
|
172
|
-
table: table$
|
|
178
|
+
table: table$1
|
|
173
179
|
};
|
|
174
180
|
|
|
175
|
-
var table$
|
|
181
|
+
var table$2 = Table.mkTable("end_of_block_range_scanned_data", undefined, [
|
|
176
182
|
Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined),
|
|
177
183
|
Table.mkField("block_number", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined),
|
|
178
184
|
Table.mkField("block_hash", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined)
|
|
179
185
|
]);
|
|
180
186
|
|
|
181
187
|
var EndOfBlockRangeScannedData = {
|
|
182
|
-
table: table$
|
|
188
|
+
table: table$2
|
|
183
189
|
};
|
|
184
190
|
|
|
185
191
|
var schema = S$RescriptSchema.schema(function (s) {
|
|
@@ -199,7 +205,7 @@ var schema = S$RescriptSchema.schema(function (s) {
|
|
|
199
205
|
};
|
|
200
206
|
});
|
|
201
207
|
|
|
202
|
-
var table$
|
|
208
|
+
var table$3 = Table.mkTable("raw_events", undefined, [
|
|
203
209
|
Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
204
210
|
Table.mkField("event_id", "NUMERIC", S$RescriptSchema.bigint, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
205
211
|
Table.mkField("event_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
@@ -218,7 +224,7 @@ var table$4 = Table.mkTable("raw_events", undefined, [
|
|
|
218
224
|
|
|
219
225
|
var RawEvents = {
|
|
220
226
|
schema: schema,
|
|
221
|
-
table: table$
|
|
227
|
+
table: table$3
|
|
222
228
|
};
|
|
223
229
|
|
|
224
230
|
var metaViewName = "_meta";
|
|
@@ -226,11 +232,11 @@ var metaViewName = "_meta";
|
|
|
226
232
|
var chainMetadataViewName = "chain_metadata";
|
|
227
233
|
|
|
228
234
|
function makeMetaViewQuery(pgSchema) {
|
|
229
|
-
return "CREATE VIEW \"" + pgSchema + "\".\"" + metaViewName + "\" AS \n SELECT \n \"" + "id" + "\" AS \"chainId\",\n \"" + "start_block" + "\" AS \"startBlock\", \n \"" + "end_block" + "\" AS \"endBlock\",\n \"" + "
|
|
235
|
+
return "CREATE VIEW \"" + pgSchema + "\".\"" + metaViewName + "\" AS \n SELECT \n \"" + "id" + "\" AS \"chainId\",\n \"" + "start_block" + "\" AS \"startBlock\", \n \"" + "end_block" + "\" AS \"endBlock\",\n \"" + "progress_block" + "\" AS \"progressBlock\",\n \"" + "buffer_block" + "\" AS \"bufferBlock\",\n \"" + "first_event_block" + "\" AS \"firstEventBlock\",\n \"" + "events_processed" + "\" AS \"eventsProcessed\",\n \"" + "source_block" + "\" AS \"sourceBlock\",\n \"" + "ready_at" + "\" AS \"readyAt\",\n (\"" + "ready_at" + "\" IS NOT NULL) AS \"isReady\"\n FROM \"" + pgSchema + "\".\"" + table.tableName + "\"\n ORDER BY \"" + "id" + "\";";
|
|
230
236
|
}
|
|
231
237
|
|
|
232
238
|
function makeChainMetadataViewQuery(pgSchema) {
|
|
233
|
-
return "CREATE VIEW \"" + pgSchema + "\".\"" + chainMetadataViewName + "\" AS \n SELECT \n \"" + "source_block" + "\" AS \"block_height\",\n \"" + "id" + "\" AS \"chain_id\",\n \"" + "end_block" + "\" AS \"end_block\", \n \"" + "first_event_block" + "\" AS \"first_event_block_number\",\n \"" + "_is_hyper_sync" + "\" AS \"is_hyper_sync\",\n \"" + "buffer_block" + "\" AS \"latest_fetched_block_number\",\n \"" + "
|
|
239
|
+
return "CREATE VIEW \"" + pgSchema + "\".\"" + chainMetadataViewName + "\" AS \n SELECT \n \"" + "source_block" + "\" AS \"block_height\",\n \"" + "id" + "\" AS \"chain_id\",\n \"" + "end_block" + "\" AS \"end_block\", \n \"" + "first_event_block" + "\" AS \"first_event_block_number\",\n \"" + "_is_hyper_sync" + "\" AS \"is_hyper_sync\",\n \"" + "buffer_block" + "\" AS \"latest_fetched_block_number\",\n \"" + "progress_block" + "\" AS \"latest_processed_block\",\n \"" + "_num_batches_fetched" + "\" AS \"num_batches_fetched\",\n \"" + "events_processed" + "\" AS \"num_events_processed\",\n \"" + "start_block" + "\" AS \"start_block\",\n \"" + "ready_at" + "\" AS \"timestamp_caught_up_to_head_or_endblock\"\n FROM \"" + pgSchema + "\".\"" + table.tableName + "\";";
|
|
234
240
|
}
|
|
235
241
|
|
|
236
242
|
var Views = {
|
|
@@ -263,7 +269,7 @@ var schema$1 = S$RescriptSchema.schema(function (s) {
|
|
|
263
269
|
|
|
264
270
|
var rowsSchema = S$RescriptSchema.array(schema$1);
|
|
265
271
|
|
|
266
|
-
var table$
|
|
272
|
+
var table$4 = Table.mkTable(name, undefined, [
|
|
267
273
|
Table.mkField("id", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, true, undefined, undefined),
|
|
268
274
|
Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
269
275
|
Table.mkField("registering_event_block_number", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
@@ -276,24 +282,50 @@ var table$5 = Table.mkTable(name, undefined, [
|
|
|
276
282
|
Table.mkField("contract_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined)
|
|
277
283
|
]);
|
|
278
284
|
|
|
279
|
-
var entityHistory = EntityHistory.fromTable(table$
|
|
285
|
+
var entityHistory = EntityHistory.fromTable(table$4, schema$1);
|
|
280
286
|
|
|
281
287
|
var config = {
|
|
282
288
|
name: name,
|
|
283
289
|
schema: schema$1,
|
|
284
290
|
rowsSchema: rowsSchema,
|
|
285
|
-
table: table$
|
|
291
|
+
table: table$4,
|
|
286
292
|
entityHistory: entityHistory
|
|
287
293
|
};
|
|
288
294
|
|
|
295
|
+
function makeCleanUpOnRestartQuery(pgSchema, chains) {
|
|
296
|
+
var query = {
|
|
297
|
+
contents: ""
|
|
298
|
+
};
|
|
299
|
+
chains.forEach(function (chain) {
|
|
300
|
+
if (query.contents !== "") {
|
|
301
|
+
query.contents = query.contents + "\n";
|
|
302
|
+
}
|
|
303
|
+
var progressBlockNumber = chain.progress_block;
|
|
304
|
+
var progressNextBlockLogIndex = chain._progress_log_index;
|
|
305
|
+
var tmp;
|
|
306
|
+
tmp = progressNextBlockLogIndex === null ? (
|
|
307
|
+
progressBlockNumber !== -1 ? " AND registering_event_block_number > " + String(progressBlockNumber) : ""
|
|
308
|
+
) : " AND (\n registering_event_block_number > " + String(progressBlockNumber + 1 | 0) + "\n OR registering_event_block_number = " + String(progressBlockNumber + 1 | 0) + "\n AND registering_event_log_index > " + String(progressNextBlockLogIndex) + "\n)";
|
|
309
|
+
var progressBlockNumber$1 = chain.progress_block;
|
|
310
|
+
var progressNextBlockLogIndex$1 = chain._progress_log_index;
|
|
311
|
+
var tmp$1;
|
|
312
|
+
tmp$1 = progressNextBlockLogIndex$1 === null ? (
|
|
313
|
+
progressBlockNumber$1 !== -1 ? " AND entity_history_block_number > " + String(progressBlockNumber$1) : ""
|
|
314
|
+
) : " AND (\n entity_history_block_number > " + String(progressBlockNumber$1 + 1 | 0) + "\n OR entity_history_block_number = " + String(progressBlockNumber$1 + 1 | 0) + "\n AND entity_history_log_index > " + String(progressNextBlockLogIndex$1) + "\n)";
|
|
315
|
+
query.contents = query.contents + ("DELETE FROM \"" + pgSchema + "\".\"" + table$4.tableName + "\"\nWHERE chain_id = " + String(chain.id) + tmp + ";\nDELETE FROM \"" + pgSchema + "\".\"" + table$4.tableName + "_history\"\nWHERE entity_history_chain_id = " + String(chain.id) + tmp$1 + ";");
|
|
316
|
+
});
|
|
317
|
+
return query.contents;
|
|
318
|
+
}
|
|
319
|
+
|
|
289
320
|
var DynamicContractRegistry = {
|
|
290
321
|
name: name,
|
|
291
322
|
makeId: makeId,
|
|
292
323
|
schema: schema$1,
|
|
293
324
|
rowsSchema: rowsSchema,
|
|
294
|
-
table: table$
|
|
325
|
+
table: table$4,
|
|
295
326
|
entityHistory: entityHistory,
|
|
296
|
-
config: config
|
|
327
|
+
config: config,
|
|
328
|
+
makeCleanUpOnRestartQuery: makeCleanUpOnRestartQuery
|
|
297
329
|
};
|
|
298
330
|
|
|
299
331
|
var isPrimaryKey = true;
|
|
@@ -305,7 +337,6 @@ var isIndex = true;
|
|
|
305
337
|
exports.isPrimaryKey = isPrimaryKey;
|
|
306
338
|
exports.isNullable = isNullable;
|
|
307
339
|
exports.isIndex = isIndex;
|
|
308
|
-
exports.EventSyncState = EventSyncState;
|
|
309
340
|
exports.Chains = Chains;
|
|
310
341
|
exports.PersistedState = PersistedState;
|
|
311
342
|
exports.EndOfBlockRangeScannedData = EndOfBlockRangeScannedData;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
open Belt
|
|
2
|
+
|
|
3
|
+
exception EventDuplicate
|
|
4
|
+
exception WildcardCollision
|
|
5
|
+
|
|
6
|
+
module Group = {
|
|
7
|
+
type t<'a> = {
|
|
8
|
+
mutable wildcard: option<'a>,
|
|
9
|
+
byContractName: dict<'a>,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let empty = () => {
|
|
13
|
+
wildcard: None,
|
|
14
|
+
byContractName: Js.Dict.empty(),
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let addOrThrow = (group: t<'a>, event, ~contractName, ~isWildcard) => {
|
|
18
|
+
let {byContractName, wildcard} = group
|
|
19
|
+
switch byContractName->Utils.Dict.dangerouslyGetNonOption(contractName) {
|
|
20
|
+
| Some(_) => raise(EventDuplicate)
|
|
21
|
+
| None =>
|
|
22
|
+
if isWildcard && wildcard->Option.isSome {
|
|
23
|
+
raise(WildcardCollision)
|
|
24
|
+
} else {
|
|
25
|
+
if isWildcard {
|
|
26
|
+
group.wildcard = Some(event)
|
|
27
|
+
}
|
|
28
|
+
byContractName->Js.Dict.set(contractName, event)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let get = (
|
|
34
|
+
group: t<'a>,
|
|
35
|
+
~contractAddress,
|
|
36
|
+
~blockNumber,
|
|
37
|
+
~indexingContracts: dict<FetchState.indexingContract>,
|
|
38
|
+
) =>
|
|
39
|
+
switch group {
|
|
40
|
+
| {wildcard, byContractName} =>
|
|
41
|
+
switch indexingContracts->Utils.Dict.dangerouslyGetNonOption(
|
|
42
|
+
contractAddress->Address.toString,
|
|
43
|
+
) {
|
|
44
|
+
| Some(indexingContract) =>
|
|
45
|
+
if indexingContract.startBlock <= blockNumber {
|
|
46
|
+
byContractName->Utils.Dict.dangerouslyGetNonOption(indexingContract.contractName)
|
|
47
|
+
} else {
|
|
48
|
+
None
|
|
49
|
+
}
|
|
50
|
+
| None => wildcard
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
type t<'a> = dict<Group.t<'a>>
|
|
56
|
+
|
|
57
|
+
let empty = () => Js.Dict.empty()
|
|
58
|
+
|
|
59
|
+
let addOrThrow = (
|
|
60
|
+
router: t<'a>,
|
|
61
|
+
eventId,
|
|
62
|
+
event,
|
|
63
|
+
~contractName,
|
|
64
|
+
~isWildcard,
|
|
65
|
+
~eventName,
|
|
66
|
+
~chain,
|
|
67
|
+
) => {
|
|
68
|
+
let group = switch router->Utils.Dict.dangerouslyGetNonOption(eventId) {
|
|
69
|
+
| None =>
|
|
70
|
+
let group = Group.empty()
|
|
71
|
+
router->Js.Dict.set(eventId, group)
|
|
72
|
+
group
|
|
73
|
+
| Some(group) => group
|
|
74
|
+
}
|
|
75
|
+
try group->Group.addOrThrow(event, ~contractName, ~isWildcard) catch {
|
|
76
|
+
| EventDuplicate =>
|
|
77
|
+
Js.Exn.raiseError(
|
|
78
|
+
`Duplicate event detected: ${eventName} for contract ${contractName} on chain ${chain->ChainMap.Chain.toString}`,
|
|
79
|
+
)
|
|
80
|
+
| WildcardCollision =>
|
|
81
|
+
Js.Exn.raiseError(
|
|
82
|
+
`Another event is already registered with the same signature that would interfer with wildcard filtering: ${eventName} for contract ${contractName} on chain ${chain->ChainMap.Chain.toString}`,
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let get = (router: t<'a>, ~tag, ~contractAddress, ~blockNumber, ~indexingContracts) => {
|
|
88
|
+
switch router->Utils.Dict.dangerouslyGetNonOption(tag) {
|
|
89
|
+
| None => None
|
|
90
|
+
| Some(group) => group->Group.get(~contractAddress, ~blockNumber, ~indexingContracts)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
let getEvmEventId = (~sighash, ~topicCount) => {
|
|
95
|
+
sighash ++ "_" ++ topicCount->Belt.Int.toString
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
let fromEvmEventModsOrThrow = (events: array<Internal.evmEventConfig>, ~chain): t<
|
|
99
|
+
Internal.evmEventConfig,
|
|
100
|
+
> => {
|
|
101
|
+
let router = empty()
|
|
102
|
+
events->Belt.Array.forEach(config => {
|
|
103
|
+
router->addOrThrow(
|
|
104
|
+
config.id,
|
|
105
|
+
config,
|
|
106
|
+
~contractName=config.contractName,
|
|
107
|
+
~eventName=config.name,
|
|
108
|
+
~chain,
|
|
109
|
+
~isWildcard=config.isWildcard,
|
|
110
|
+
)
|
|
111
|
+
})
|
|
112
|
+
router
|
|
113
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var Js_exn = require("rescript/lib/js/js_exn.js");
|
|
5
|
+
var ChainMap = require("../ChainMap.res.js");
|
|
6
|
+
var Belt_Array = require("rescript/lib/js/belt_Array.js");
|
|
7
|
+
var Belt_Option = require("rescript/lib/js/belt_Option.js");
|
|
8
|
+
var Caml_option = require("rescript/lib/js/caml_option.js");
|
|
9
|
+
var Caml_exceptions = require("rescript/lib/js/caml_exceptions.js");
|
|
10
|
+
var Caml_js_exceptions = require("rescript/lib/js/caml_js_exceptions.js");
|
|
11
|
+
|
|
12
|
+
var EventDuplicate = /* @__PURE__ */Caml_exceptions.create("EventRouter.EventDuplicate");
|
|
13
|
+
|
|
14
|
+
var WildcardCollision = /* @__PURE__ */Caml_exceptions.create("EventRouter.WildcardCollision");
|
|
15
|
+
|
|
16
|
+
function empty() {
|
|
17
|
+
return {
|
|
18
|
+
wildcard: undefined,
|
|
19
|
+
byContractName: {}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function addOrThrow(group, $$event, contractName, isWildcard) {
|
|
24
|
+
var wildcard = group.wildcard;
|
|
25
|
+
var byContractName = group.byContractName;
|
|
26
|
+
var match = byContractName[contractName];
|
|
27
|
+
if (match !== undefined) {
|
|
28
|
+
throw {
|
|
29
|
+
RE_EXN_ID: EventDuplicate,
|
|
30
|
+
Error: new Error()
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (isWildcard && Belt_Option.isSome(wildcard)) {
|
|
34
|
+
throw {
|
|
35
|
+
RE_EXN_ID: WildcardCollision,
|
|
36
|
+
Error: new Error()
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (isWildcard) {
|
|
40
|
+
group.wildcard = Caml_option.some($$event);
|
|
41
|
+
}
|
|
42
|
+
byContractName[contractName] = $$event;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function get(group, contractAddress, blockNumber, indexingContracts) {
|
|
46
|
+
var wildcard = group.wildcard;
|
|
47
|
+
var indexingContract = indexingContracts[contractAddress];
|
|
48
|
+
if (indexingContract !== undefined) {
|
|
49
|
+
if (indexingContract.startBlock <= blockNumber) {
|
|
50
|
+
return group.byContractName[indexingContract.contractName];
|
|
51
|
+
} else {
|
|
52
|
+
return ;
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
return wildcard;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
var Group = {
|
|
60
|
+
empty: empty,
|
|
61
|
+
addOrThrow: addOrThrow,
|
|
62
|
+
get: get
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
function empty$1() {
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function addOrThrow$1(router, eventId, $$event, contractName, isWildcard, eventName, chain) {
|
|
70
|
+
var group = router[eventId];
|
|
71
|
+
var group$1;
|
|
72
|
+
if (group !== undefined) {
|
|
73
|
+
group$1 = group;
|
|
74
|
+
} else {
|
|
75
|
+
var group$2 = {
|
|
76
|
+
wildcard: undefined,
|
|
77
|
+
byContractName: {}
|
|
78
|
+
};
|
|
79
|
+
router[eventId] = group$2;
|
|
80
|
+
group$1 = group$2;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
return addOrThrow(group$1, $$event, contractName, isWildcard);
|
|
84
|
+
}
|
|
85
|
+
catch (raw_exn){
|
|
86
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
87
|
+
if (exn.RE_EXN_ID === EventDuplicate) {
|
|
88
|
+
return Js_exn.raiseError("Duplicate event detected: " + eventName + " for contract " + contractName + " on chain " + ChainMap.Chain.toString(chain));
|
|
89
|
+
}
|
|
90
|
+
if (exn.RE_EXN_ID === WildcardCollision) {
|
|
91
|
+
return Js_exn.raiseError("Another event is already registered with the same signature that would interfer with wildcard filtering: " + eventName + " for contract " + contractName + " on chain " + ChainMap.Chain.toString(chain));
|
|
92
|
+
}
|
|
93
|
+
throw exn;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function get$1(router, tag, contractAddress, blockNumber, indexingContracts) {
|
|
98
|
+
var group = router[tag];
|
|
99
|
+
if (group !== undefined) {
|
|
100
|
+
return get(group, contractAddress, blockNumber, indexingContracts);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function getEvmEventId(sighash, topicCount) {
|
|
106
|
+
return sighash + "_" + String(topicCount);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function fromEvmEventModsOrThrow(events, chain) {
|
|
110
|
+
var router = {};
|
|
111
|
+
Belt_Array.forEach(events, (function (config) {
|
|
112
|
+
addOrThrow$1(router, config.id, config, config.contractName, config.isWildcard, config.name, chain);
|
|
113
|
+
}));
|
|
114
|
+
return router;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
exports.EventDuplicate = EventDuplicate;
|
|
118
|
+
exports.WildcardCollision = WildcardCollision;
|
|
119
|
+
exports.Group = Group;
|
|
120
|
+
exports.empty = empty$1;
|
|
121
|
+
exports.addOrThrow = addOrThrow$1;
|
|
122
|
+
exports.get = get$1;
|
|
123
|
+
exports.getEvmEventId = getEvmEventId;
|
|
124
|
+
exports.fromEvmEventModsOrThrow = fromEvmEventModsOrThrow;
|
|
125
|
+
/* ChainMap Not a pure module */
|
|
@@ -76,15 +76,23 @@ module GetLogs = {
|
|
|
76
76
|
fieldSelection,
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
@inline
|
|
79
80
|
let addMissingParams = (acc, fieldNames, returnedObj, ~prefix) => {
|
|
80
|
-
fieldNames->Array.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
if fieldNames->Utils.Array.notEmpty {
|
|
82
|
+
if !(returnedObj->Obj.magic) {
|
|
83
|
+
acc->Array.push(prefix)->ignore
|
|
84
|
+
} else {
|
|
85
|
+
for idx in 0 to fieldNames->Array.length - 1 {
|
|
86
|
+
let fieldName = fieldNames->Array.getUnsafe(idx)
|
|
87
|
+
switch returnedObj
|
|
88
|
+
->(Utils.magic: 'a => Js.Dict.t<unknown>)
|
|
89
|
+
->Utils.Dict.dangerouslyGetNonOption(fieldName) {
|
|
90
|
+
| Some(_) => ()
|
|
91
|
+
| None => acc->Array.push(prefix ++ "." ++ fieldName)->ignore
|
|
92
|
+
}
|
|
93
|
+
}
|
|
86
94
|
}
|
|
87
|
-
}
|
|
95
|
+
}
|
|
88
96
|
}
|
|
89
97
|
|
|
90
98
|
//Note this function can throw an error
|
|
@@ -57,18 +57,6 @@ function makeRequestBody(fromBlock, toBlockInclusive, addressesWithTopics, field
|
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
function addMissingParams(acc, fieldNames, returnedObj, prefix) {
|
|
61
|
-
Belt_Array.forEach(fieldNames, (function (fieldName) {
|
|
62
|
-
var match = returnedObj[fieldName];
|
|
63
|
-
if (match !== undefined) {
|
|
64
|
-
return ;
|
|
65
|
-
} else {
|
|
66
|
-
acc.push(prefix + "." + fieldName);
|
|
67
|
-
return ;
|
|
68
|
-
}
|
|
69
|
-
}));
|
|
70
|
-
}
|
|
71
|
-
|
|
72
60
|
async function query(client, fromBlock, toBlock, logSelections, fieldSelection, nonOptionalBlockFieldNames, nonOptionalTransactionFieldNames) {
|
|
73
61
|
var addressesWithTopics = Belt_Array.flatMap(logSelections, (function (param) {
|
|
74
62
|
var addresses = param.addresses;
|
|
@@ -88,9 +76,54 @@ async function query(client, fromBlock, toBlock, logSelections, fieldSelection,
|
|
|
88
76
|
}
|
|
89
77
|
var items = Belt_Array.map(res.data, (function (item) {
|
|
90
78
|
var missingParams = [];
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
79
|
+
var returnedObj = item.log;
|
|
80
|
+
if (Utils.$$Array.notEmpty(fieldNames)) {
|
|
81
|
+
if (returnedObj) {
|
|
82
|
+
for(var idx = 0 ,idx_finish = fieldNames.length; idx < idx_finish; ++idx){
|
|
83
|
+
var fieldName = fieldNames[idx];
|
|
84
|
+
var match = returnedObj[fieldName];
|
|
85
|
+
if (match !== undefined) {
|
|
86
|
+
|
|
87
|
+
} else {
|
|
88
|
+
missingParams.push("log." + fieldName);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
missingParams.push("log");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
var returnedObj$1 = item.block;
|
|
96
|
+
if (Utils.$$Array.notEmpty(nonOptionalBlockFieldNames)) {
|
|
97
|
+
if (returnedObj$1) {
|
|
98
|
+
for(var idx$1 = 0 ,idx_finish$1 = nonOptionalBlockFieldNames.length; idx$1 < idx_finish$1; ++idx$1){
|
|
99
|
+
var fieldName$1 = nonOptionalBlockFieldNames[idx$1];
|
|
100
|
+
var match$1 = returnedObj$1[fieldName$1];
|
|
101
|
+
if (match$1 !== undefined) {
|
|
102
|
+
|
|
103
|
+
} else {
|
|
104
|
+
missingParams.push("block." + fieldName$1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
missingParams.push("block");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
var returnedObj$2 = item.transaction;
|
|
112
|
+
if (Utils.$$Array.notEmpty(nonOptionalTransactionFieldNames)) {
|
|
113
|
+
if (returnedObj$2) {
|
|
114
|
+
for(var idx$2 = 0 ,idx_finish$2 = nonOptionalTransactionFieldNames.length; idx$2 < idx_finish$2; ++idx$2){
|
|
115
|
+
var fieldName$2 = nonOptionalTransactionFieldNames[idx$2];
|
|
116
|
+
var match$2 = returnedObj$2[fieldName$2];
|
|
117
|
+
if (match$2 !== undefined) {
|
|
118
|
+
|
|
119
|
+
} else {
|
|
120
|
+
missingParams.push("transaction." + fieldName$2);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
missingParams.push("transaction");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
94
127
|
if (missingParams.length !== 0) {
|
|
95
128
|
throw {
|
|
96
129
|
RE_EXN_ID: $$Error,
|