envio 2.30.2 → 2.31.0-alpha.1
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 +5 -5
- package/src/Batch.res +400 -28
- package/src/Batch.res.js +286 -24
- package/src/EventRegister.res +9 -3
- package/src/EventRegister.res.js +6 -3
- package/src/EventRegister.resi +4 -1
- package/src/FetchState.res +116 -155
- package/src/FetchState.res.js +116 -106
- package/src/Internal.res +49 -0
- package/src/InternalConfig.res +1 -1
- package/src/Persistence.res +16 -1
- package/src/Persistence.res.js +1 -1
- package/src/PgStorage.res +51 -63
- package/src/PgStorage.res.js +45 -38
- package/src/Prometheus.res +7 -1
- package/src/Prometheus.res.js +8 -1
- package/src/ReorgDetection.res +222 -235
- package/src/ReorgDetection.res.js +34 -28
- package/src/SafeCheckpointTracking.res +132 -0
- package/src/SafeCheckpointTracking.res.js +95 -0
- package/src/Utils.res +64 -21
- package/src/Utils.res.js +61 -30
- package/src/db/EntityHistory.res +172 -294
- package/src/db/EntityHistory.res.js +98 -218
- package/src/db/InternalTable.gen.ts +13 -13
- package/src/db/InternalTable.res +286 -77
- package/src/db/InternalTable.res.js +160 -79
- package/src/db/Table.res +1 -0
- package/src/db/Table.res.js +1 -1
- package/src/sources/EventRouter.res +1 -1
- package/src/sources/RpcSource.res +6 -13
- package/src/sources/RpcSource.res.js +5 -19
- package/src/sources/Source.res +1 -1
|
@@ -11,10 +11,67 @@ 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 name = "dynamic_contract_registry";
|
|
15
|
+
|
|
16
|
+
function makeId(chainId, contractAddress) {
|
|
17
|
+
return String(chainId) + "-" + contractAddress;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var schema = S$RescriptSchema.schema(function (s) {
|
|
21
|
+
return {
|
|
22
|
+
id: s.m(S$RescriptSchema.string),
|
|
23
|
+
chain_id: s.m(S$RescriptSchema.$$int),
|
|
24
|
+
registering_event_block_number: s.m(S$RescriptSchema.$$int),
|
|
25
|
+
registering_event_log_index: s.m(S$RescriptSchema.$$int),
|
|
26
|
+
registering_event_block_timestamp: s.m(S$RescriptSchema.$$int),
|
|
27
|
+
registering_event_contract_name: s.m(S$RescriptSchema.string),
|
|
28
|
+
registering_event_name: s.m(S$RescriptSchema.string),
|
|
29
|
+
registering_event_src_address: s.m(Address.schema),
|
|
30
|
+
contract_address: s.m(Address.schema),
|
|
31
|
+
contract_name: s.m(S$RescriptSchema.string)
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
var rowsSchema = S$RescriptSchema.array(schema);
|
|
36
|
+
|
|
37
|
+
var table = Table.mkTable(name, undefined, [
|
|
38
|
+
Table.mkField("id", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, true, undefined, undefined),
|
|
39
|
+
Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
40
|
+
Table.mkField("registering_event_block_number", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
41
|
+
Table.mkField("registering_event_log_index", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
42
|
+
Table.mkField("registering_event_block_timestamp", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
43
|
+
Table.mkField("registering_event_contract_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
44
|
+
Table.mkField("registering_event_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
45
|
+
Table.mkField("registering_event_src_address", "TEXT", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
46
|
+
Table.mkField("contract_address", "TEXT", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
47
|
+
Table.mkField("contract_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined)
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
var entityHistory = EntityHistory.fromTable(table, schema);
|
|
51
|
+
|
|
52
|
+
var config = {
|
|
53
|
+
name: name,
|
|
54
|
+
schema: schema,
|
|
55
|
+
rowsSchema: rowsSchema,
|
|
56
|
+
table: table,
|
|
57
|
+
entityHistory: entityHistory
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
var DynamicContractRegistry = {
|
|
61
|
+
name: name,
|
|
62
|
+
makeId: makeId,
|
|
63
|
+
schema: schema,
|
|
64
|
+
rowsSchema: rowsSchema,
|
|
65
|
+
table: table,
|
|
66
|
+
entityHistory: entityHistory,
|
|
67
|
+
config: config
|
|
68
|
+
};
|
|
69
|
+
|
|
14
70
|
var fields = [
|
|
15
71
|
"id",
|
|
16
72
|
"start_block",
|
|
17
73
|
"end_block",
|
|
74
|
+
"max_reorg_depth",
|
|
18
75
|
"source_block",
|
|
19
76
|
"first_event_block",
|
|
20
77
|
"buffer_block",
|
|
@@ -25,10 +82,11 @@ var fields = [
|
|
|
25
82
|
"_num_batches_fetched"
|
|
26
83
|
];
|
|
27
84
|
|
|
28
|
-
var table = Table.mkTable("envio_chains", undefined, [
|
|
85
|
+
var table$1 = Table.mkTable("envio_chains", undefined, [
|
|
29
86
|
Table.mkField("id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined),
|
|
30
87
|
Table.mkField("start_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
31
88
|
Table.mkField("end_block", "INTEGER", S$RescriptSchema.$$null(S$RescriptSchema.$$int), undefined, undefined, true, undefined, undefined, undefined),
|
|
89
|
+
Table.mkField("max_reorg_depth", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
32
90
|
Table.mkField("buffer_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
33
91
|
Table.mkField("source_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
34
92
|
Table.mkField("first_event_block", "INTEGER", S$RescriptSchema.$$null(S$RescriptSchema.$$int), undefined, undefined, true, undefined, undefined, undefined),
|
|
@@ -44,6 +102,7 @@ function initialFromConfig(chainConfig) {
|
|
|
44
102
|
id: chainConfig.id,
|
|
45
103
|
start_block: chainConfig.startBlock,
|
|
46
104
|
end_block: Js_null.fromOption(chainConfig.endBlock),
|
|
105
|
+
max_reorg_depth: chainConfig.maxReorgDepth,
|
|
47
106
|
progress_block: -1,
|
|
48
107
|
events_processed: 0,
|
|
49
108
|
first_event_block: null,
|
|
@@ -84,7 +143,7 @@ function makeInitialValuesQuery(pgSchema, chainConfigs) {
|
|
|
84
143
|
}));
|
|
85
144
|
return "(" + values.join(", ") + ")";
|
|
86
145
|
}));
|
|
87
|
-
return "INSERT INTO \"" + pgSchema + "\".\"" + table.tableName + "\" (" + columnNames.join(", ") + ")\nVALUES " + valuesRows.join(",\n ") + ";";
|
|
146
|
+
return "INSERT INTO \"" + pgSchema + "\".\"" + table$1.tableName + "\" (" + columnNames.join(", ") + ")\nVALUES " + valuesRows.join(",\n ") + ";";
|
|
88
147
|
}
|
|
89
148
|
|
|
90
149
|
var metaFields = [
|
|
@@ -101,7 +160,15 @@ function makeMetaFieldsUpdateQuery(pgSchema) {
|
|
|
101
160
|
var paramIndex = index + 2 | 0;
|
|
102
161
|
return "\"" + field + "\" = $" + String(paramIndex);
|
|
103
162
|
}));
|
|
104
|
-
return "UPDATE \"" + pgSchema + "\".\"" + table.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"id\" = $1;";
|
|
163
|
+
return "UPDATE \"" + pgSchema + "\".\"" + table$1.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"" + "id" + "\" = $1;";
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function makeGetInitialStateQuery(pgSchema) {
|
|
167
|
+
return "SELECT \"" + "id" + "\" as \"id\",\n\"" + "start_block" + "\" as \"startBlock\",\n\"" + "end_block" + "\" as \"endBlock\",\n\"" + "max_reorg_depth" + "\" as \"maxReorgDepth\",\n\"" + "first_event_block" + "\" as \"firstEventBlockNumber\",\n\"" + "ready_at" + "\" as \"timestampCaughtUpToHeadOrEndblock\",\n\"" + "events_processed" + "\" as \"numEventsProcessed\",\n\"" + "progress_block" + "\" as \"progressBlockNumber\",\n(\n SELECT COALESCE(json_agg(json_build_object(\n 'address', \"contract_address\",\n 'contractName', \"contract_name\",\n 'startBlock', \"registering_event_block_number\",\n 'registrationBlock', \"registering_event_block_number\"\n )), '[]'::json)\n FROM \"" + pgSchema + "\".\"" + table.tableName + "\"\n WHERE \"chain_id\" = chains.\"" + "id" + "\"\n) as \"dynamicContracts\"\nFROM \"" + pgSchema + "\".\"" + table$1.tableName + "\" as chains;";
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function getInitialState(sql, pgSchema) {
|
|
171
|
+
return sql.unsafe(makeGetInitialStateQuery(pgSchema));
|
|
105
172
|
}
|
|
106
173
|
|
|
107
174
|
var progressFields = [
|
|
@@ -114,13 +181,13 @@ function makeProgressFieldsUpdateQuery(pgSchema) {
|
|
|
114
181
|
var paramIndex = index + 2 | 0;
|
|
115
182
|
return "\"" + field + "\" = $" + String(paramIndex);
|
|
116
183
|
}));
|
|
117
|
-
return "UPDATE \"" + pgSchema + "\".\"" + table.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"id\" = $1;";
|
|
184
|
+
return "UPDATE \"" + pgSchema + "\".\"" + table$1.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"id\" = $1;";
|
|
118
185
|
}
|
|
119
186
|
|
|
120
187
|
function setMeta(sql, pgSchema, chainsData) {
|
|
121
188
|
var query = makeMetaFieldsUpdateQuery(pgSchema);
|
|
122
189
|
var promises = [];
|
|
123
|
-
Utils.Dict.forEachWithKey(chainsData, (function (
|
|
190
|
+
Utils.Dict.forEachWithKey(chainsData, (function (data, chainId) {
|
|
124
191
|
var params = [];
|
|
125
192
|
params.push(chainId);
|
|
126
193
|
metaFields.forEach(function (field) {
|
|
@@ -148,18 +215,20 @@ function setProgressedChains(sql, pgSchema, progressedChains) {
|
|
|
148
215
|
|
|
149
216
|
var Chains = {
|
|
150
217
|
fields: fields,
|
|
151
|
-
table: table,
|
|
218
|
+
table: table$1,
|
|
152
219
|
initialFromConfig: initialFromConfig,
|
|
153
220
|
makeInitialValuesQuery: makeInitialValuesQuery,
|
|
154
221
|
metaFields: metaFields,
|
|
155
222
|
makeMetaFieldsUpdateQuery: makeMetaFieldsUpdateQuery,
|
|
223
|
+
makeGetInitialStateQuery: makeGetInitialStateQuery,
|
|
224
|
+
getInitialState: getInitialState,
|
|
156
225
|
progressFields: progressFields,
|
|
157
226
|
makeProgressFieldsUpdateQuery: makeProgressFieldsUpdateQuery,
|
|
158
227
|
setMeta: setMeta,
|
|
159
228
|
setProgressedChains: setProgressedChains
|
|
160
229
|
};
|
|
161
230
|
|
|
162
|
-
var table$
|
|
231
|
+
var table$2 = Table.mkTable("persisted_state", undefined, [
|
|
163
232
|
Table.mkField("id", "SERIAL", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined),
|
|
164
233
|
Table.mkField("envio_version", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
165
234
|
Table.mkField("config_hash", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
@@ -169,20 +238,88 @@ var table$1 = Table.mkTable("persisted_state", undefined, [
|
|
|
169
238
|
]);
|
|
170
239
|
|
|
171
240
|
var PersistedState = {
|
|
172
|
-
table: table$
|
|
241
|
+
table: table$2
|
|
173
242
|
};
|
|
174
243
|
|
|
175
|
-
var table$
|
|
176
|
-
Table.mkField("
|
|
177
|
-
Table.mkField("
|
|
178
|
-
Table.mkField("
|
|
244
|
+
var table$3 = Table.mkTable("envio_checkpoints", undefined, [
|
|
245
|
+
Table.mkField("id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined),
|
|
246
|
+
Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
247
|
+
Table.mkField("block_number", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
248
|
+
Table.mkField("block_hash", "TEXT", S$RescriptSchema.$$null(S$RescriptSchema.string), undefined, undefined, true, undefined, undefined, undefined),
|
|
249
|
+
Table.mkField("events_processed", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined)
|
|
179
250
|
]);
|
|
180
251
|
|
|
181
|
-
|
|
182
|
-
table
|
|
252
|
+
function makeGetReorgCheckpointsQuery(pgSchema) {
|
|
253
|
+
return "WITH reorg_chains AS (\n SELECT \n \"" + "id" + "\" as id,\n \"" + "source_block" + "\" - \"" + "max_reorg_depth" + "\" AS safe_block\n FROM \"" + pgSchema + "\".\"" + table$1.tableName + "\"\n WHERE \"" + "max_reorg_depth" + "\" > 0\n AND \"" + "progress_block" + "\" > \"" + "source_block" + "\" - \"" + "max_reorg_depth" + "\"\n)\nSELECT \n cp.\"" + "id" + "\", \n cp.\"" + "chain_id" + "\", \n cp.\"" + "block_number" + "\", \n cp.\"" + "block_hash" + "\"\nFROM \"" + pgSchema + "\".\"" + table$3.tableName + "\" cp\nINNER JOIN reorg_chains rc \n ON cp.\"" + "chain_id" + "\" = rc.id\nWHERE cp.\"" + "block_hash" + "\" IS NOT NULL\n AND cp.\"" + "block_number" + "\" >= rc.safe_block;";
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function makeCommitedCheckpointIdQuery(pgSchema) {
|
|
257
|
+
return "SELECT COALESCE(MAX(" + "id" + "), " + String(0) + ") AS id FROM \"" + pgSchema + "\".\"" + table$3.tableName + "\";";
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function makeInsertCheckpointQuery(pgSchema) {
|
|
261
|
+
return "INSERT INTO \"" + pgSchema + "\".\"" + table$3.tableName + "\" (\"" + "id" + "\", \"" + "chain_id" + "\", \"" + "block_number" + "\", \"" + "block_hash" + "\", \"" + "events_processed" + "\")\nSELECT * FROM unnest($1::INTEGER[],$2::INTEGER[],$3::INTEGER[],$4::TEXT[],$5::INTEGER[]);";
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function insert(sql, pgSchema, checkpointIds, checkpointChainIds, checkpointBlockNumbers, checkpointBlockHashes, checkpointEventsProcessed) {
|
|
265
|
+
var query = makeInsertCheckpointQuery(pgSchema);
|
|
266
|
+
return sql.unsafe(query, [
|
|
267
|
+
checkpointIds,
|
|
268
|
+
checkpointChainIds,
|
|
269
|
+
checkpointBlockNumbers,
|
|
270
|
+
checkpointBlockHashes,
|
|
271
|
+
checkpointEventsProcessed
|
|
272
|
+
], {prepare: true});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function rollback(sql, pgSchema, rollbackTargetCheckpointId) {
|
|
276
|
+
return sql.unsafe("DELETE FROM \"" + pgSchema + "\".\"" + table$3.tableName + "\" WHERE \"" + "id" + "\" > $1;", [rollbackTargetCheckpointId], {prepare: true});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function makePruneStaleCheckpointsQuery(pgSchema) {
|
|
280
|
+
return "DELETE FROM \"" + pgSchema + "\".\"" + table$3.tableName + "\" WHERE \"" + "id" + "\" < $1;";
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function pruneStaleCheckpoints(sql, pgSchema, safeCheckpointId) {
|
|
284
|
+
return sql.unsafe(makePruneStaleCheckpointsQuery(pgSchema), [safeCheckpointId], {prepare: true});
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function makeGetRollbackTargetCheckpointQuery(pgSchema) {
|
|
288
|
+
return "SELECT \"" + "id" + "\" FROM \"" + pgSchema + "\".\"" + table$3.tableName + "\"\nWHERE \n \"" + "chain_id" + "\" = $1 AND\n \"" + "block_number" + "\" <= $2\nORDER BY \"" + "id" + "\" DESC\nLIMIT 1;";
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function getRollbackTargetCheckpoint(sql, pgSchema, reorgChainId, lastKnownValidBlockNumber) {
|
|
292
|
+
return sql.unsafe(makeGetRollbackTargetCheckpointQuery(pgSchema), [
|
|
293
|
+
reorgChainId,
|
|
294
|
+
lastKnownValidBlockNumber
|
|
295
|
+
], {prepare: true});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function makeGetRollbackProgressDiffQuery(pgSchema) {
|
|
299
|
+
return "SELECT \n \"" + "chain_id" + "\",\n SUM(\"" + "events_processed" + "\") as events_processed_diff,\n MIN(\"" + "block_number" + "\") - 1 as new_progress_block_number\nFROM \"" + pgSchema + "\".\"" + table$3.tableName + "\"\nWHERE \"" + "id" + "\" > $1\nGROUP BY \"" + "chain_id" + "\";";
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function getRollbackProgressDiff(sql, pgSchema, rollbackTargetCheckpointId) {
|
|
303
|
+
return sql.unsafe(makeGetRollbackProgressDiffQuery(pgSchema), [rollbackTargetCheckpointId], {prepare: true});
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
var Checkpoints = {
|
|
307
|
+
initialCheckpointId: 0,
|
|
308
|
+
table: table$3,
|
|
309
|
+
makeGetReorgCheckpointsQuery: makeGetReorgCheckpointsQuery,
|
|
310
|
+
makeCommitedCheckpointIdQuery: makeCommitedCheckpointIdQuery,
|
|
311
|
+
makeInsertCheckpointQuery: makeInsertCheckpointQuery,
|
|
312
|
+
insert: insert,
|
|
313
|
+
rollback: rollback,
|
|
314
|
+
makePruneStaleCheckpointsQuery: makePruneStaleCheckpointsQuery,
|
|
315
|
+
pruneStaleCheckpoints: pruneStaleCheckpoints,
|
|
316
|
+
makeGetRollbackTargetCheckpointQuery: makeGetRollbackTargetCheckpointQuery,
|
|
317
|
+
getRollbackTargetCheckpoint: getRollbackTargetCheckpoint,
|
|
318
|
+
makeGetRollbackProgressDiffQuery: makeGetRollbackProgressDiffQuery,
|
|
319
|
+
getRollbackProgressDiff: getRollbackProgressDiff
|
|
183
320
|
};
|
|
184
321
|
|
|
185
|
-
var schema = S$RescriptSchema.schema(function (s) {
|
|
322
|
+
var schema$1 = S$RescriptSchema.schema(function (s) {
|
|
186
323
|
return {
|
|
187
324
|
chain_id: s.m(S$RescriptSchema.$$int),
|
|
188
325
|
event_id: s.m(S$RescriptSchema.bigint),
|
|
@@ -199,7 +336,7 @@ var schema = S$RescriptSchema.schema(function (s) {
|
|
|
199
336
|
};
|
|
200
337
|
});
|
|
201
338
|
|
|
202
|
-
var table$
|
|
339
|
+
var table$4 = Table.mkTable("raw_events", undefined, [
|
|
203
340
|
Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
204
341
|
Table.mkField("event_id", "NUMERIC", S$RescriptSchema.bigint, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
205
342
|
Table.mkField("event_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
@@ -216,8 +353,8 @@ var table$3 = Table.mkTable("raw_events", undefined, [
|
|
|
216
353
|
]);
|
|
217
354
|
|
|
218
355
|
var RawEvents = {
|
|
219
|
-
schema: schema,
|
|
220
|
-
table: table$
|
|
356
|
+
schema: schema$1,
|
|
357
|
+
table: table$4
|
|
221
358
|
};
|
|
222
359
|
|
|
223
360
|
var metaViewName = "_meta";
|
|
@@ -225,11 +362,11 @@ var metaViewName = "_meta";
|
|
|
225
362
|
var chainMetadataViewName = "chain_metadata";
|
|
226
363
|
|
|
227
364
|
function makeMetaViewQuery(pgSchema) {
|
|
228
|
-
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" + "\";";
|
|
365
|
+
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$1.tableName + "\"\n ORDER BY \"" + "id" + "\";";
|
|
229
366
|
}
|
|
230
367
|
|
|
231
368
|
function makeChainMetadataViewQuery(pgSchema) {
|
|
232
|
-
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 + "\";";
|
|
369
|
+
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$1.tableName + "\";";
|
|
233
370
|
}
|
|
234
371
|
|
|
235
372
|
var Views = {
|
|
@@ -239,62 +376,6 @@ var Views = {
|
|
|
239
376
|
makeChainMetadataViewQuery: makeChainMetadataViewQuery
|
|
240
377
|
};
|
|
241
378
|
|
|
242
|
-
var name = "dynamic_contract_registry";
|
|
243
|
-
|
|
244
|
-
function makeId(chainId, contractAddress) {
|
|
245
|
-
return String(chainId) + "-" + contractAddress;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
var schema$1 = S$RescriptSchema.schema(function (s) {
|
|
249
|
-
return {
|
|
250
|
-
id: s.m(S$RescriptSchema.string),
|
|
251
|
-
chain_id: s.m(S$RescriptSchema.$$int),
|
|
252
|
-
registering_event_block_number: s.m(S$RescriptSchema.$$int),
|
|
253
|
-
registering_event_log_index: s.m(S$RescriptSchema.$$int),
|
|
254
|
-
registering_event_block_timestamp: s.m(S$RescriptSchema.$$int),
|
|
255
|
-
registering_event_contract_name: s.m(S$RescriptSchema.string),
|
|
256
|
-
registering_event_name: s.m(S$RescriptSchema.string),
|
|
257
|
-
registering_event_src_address: s.m(Address.schema),
|
|
258
|
-
contract_address: s.m(Address.schema),
|
|
259
|
-
contract_name: s.m(S$RescriptSchema.string)
|
|
260
|
-
};
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
var rowsSchema = S$RescriptSchema.array(schema$1);
|
|
264
|
-
|
|
265
|
-
var table$4 = Table.mkTable(name, undefined, [
|
|
266
|
-
Table.mkField("id", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, true, undefined, undefined),
|
|
267
|
-
Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
268
|
-
Table.mkField("registering_event_block_number", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
269
|
-
Table.mkField("registering_event_log_index", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
270
|
-
Table.mkField("registering_event_block_timestamp", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
271
|
-
Table.mkField("registering_event_contract_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
272
|
-
Table.mkField("registering_event_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
273
|
-
Table.mkField("registering_event_src_address", "TEXT", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
274
|
-
Table.mkField("contract_address", "TEXT", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined),
|
|
275
|
-
Table.mkField("contract_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined)
|
|
276
|
-
]);
|
|
277
|
-
|
|
278
|
-
var entityHistory = EntityHistory.fromTable(table$4, schema$1);
|
|
279
|
-
|
|
280
|
-
var config = {
|
|
281
|
-
name: name,
|
|
282
|
-
schema: schema$1,
|
|
283
|
-
rowsSchema: rowsSchema,
|
|
284
|
-
table: table$4,
|
|
285
|
-
entityHistory: entityHistory
|
|
286
|
-
};
|
|
287
|
-
|
|
288
|
-
var DynamicContractRegistry = {
|
|
289
|
-
name: name,
|
|
290
|
-
makeId: makeId,
|
|
291
|
-
schema: schema$1,
|
|
292
|
-
rowsSchema: rowsSchema,
|
|
293
|
-
table: table$4,
|
|
294
|
-
entityHistory: entityHistory,
|
|
295
|
-
config: config
|
|
296
|
-
};
|
|
297
|
-
|
|
298
379
|
var isPrimaryKey = true;
|
|
299
380
|
|
|
300
381
|
var isNullable = true;
|
|
@@ -304,10 +385,10 @@ var isIndex = true;
|
|
|
304
385
|
exports.isPrimaryKey = isPrimaryKey;
|
|
305
386
|
exports.isNullable = isNullable;
|
|
306
387
|
exports.isIndex = isIndex;
|
|
388
|
+
exports.DynamicContractRegistry = DynamicContractRegistry;
|
|
307
389
|
exports.Chains = Chains;
|
|
308
390
|
exports.PersistedState = PersistedState;
|
|
309
|
-
exports.
|
|
391
|
+
exports.Checkpoints = Checkpoints;
|
|
310
392
|
exports.RawEvents = RawEvents;
|
|
311
393
|
exports.Views = Views;
|
|
312
|
-
|
|
313
|
-
/* table Not a pure module */
|
|
394
|
+
/* schema Not a pure module */
|
package/src/db/Table.res
CHANGED
package/src/db/Table.res.js
CHANGED
|
@@ -259,7 +259,7 @@ function toSqlParams(table, schema, pgSchema) {
|
|
|
259
259
|
if (field$1.TAG === "Field") {
|
|
260
260
|
var f = field$1._0;
|
|
261
261
|
var fieldType = f.fieldType;
|
|
262
|
-
tmp = fieldType === "TIMESTAMP" || fieldType === "TIMESTAMP WITH TIME ZONE" || fieldType === "JSONB" || fieldType === "SERIAL" || fieldType === "TEXT" || fieldType === "DOUBLE PRECISION" || fieldType === "NUMERIC" || fieldType === "BOOLEAN" || fieldType === "INTEGER" || fieldType === "TIMESTAMP WITH TIME ZONE NULL" ? (
|
|
262
|
+
tmp = fieldType === "TIMESTAMP" || fieldType === "TIMESTAMP WITH TIME ZONE" || fieldType === "JSONB" || fieldType === "SERIAL" || fieldType === "TEXT" || fieldType === "DOUBLE PRECISION" || fieldType === "NUMERIC" || fieldType === "BOOLEAN" || fieldType === "BIGINT" || fieldType === "INTEGER" || fieldType === "TIMESTAMP WITH TIME ZONE NULL" ? (
|
|
263
263
|
fieldType === "BOOLEAN" ? "INTEGER[]::" + f.fieldType : fieldType
|
|
264
264
|
) : (
|
|
265
265
|
fieldType.startsWith("NUMERIC(") ? fieldType : "TEXT[]::\"" + pgSchema + "\"." + fieldType
|
|
@@ -27,7 +27,7 @@ let rec getKnownBlockWithBackoff = async (
|
|
|
27
27
|
switch await getKnownBlock(provider, blockNumber) {
|
|
28
28
|
| exception err =>
|
|
29
29
|
Logging.warn({
|
|
30
|
-
"err": err
|
|
30
|
+
"err": err,
|
|
31
31
|
"msg": `Issue while running fetching batch of events from the RPC. Will wait ${backoffMsOnFailure->Belt.Int.toString}ms and try again.`,
|
|
32
32
|
"source": sourceName,
|
|
33
33
|
"chainId": chain->ChainMap.Chain.toChainId,
|
|
@@ -47,17 +47,10 @@ let rec getKnownBlockWithBackoff = async (
|
|
|
47
47
|
// NOTE: this is wasteful if these fields are not selected in the users config.
|
|
48
48
|
// There might be a better way to do this based on the block schema.
|
|
49
49
|
// However this is not extremely expensive and good enough for now (only on rpc sync also).
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
...result,
|
|
53
|
-
// Mutation would be cheaper,
|
|
54
|
-
// BUT "result" is an Ethers.js Block object,
|
|
55
|
-
// which has the fields as readonly.
|
|
56
|
-
miner: result.miner->Address.Evm.fromAddressLowercaseOrThrow,
|
|
57
|
-
}
|
|
58
|
-
} else {
|
|
59
|
-
result
|
|
50
|
+
// The in place mutation is cheapest.
|
|
51
|
+
(result->Obj.magic)["miner"] = result.miner->Address.Evm.fromAddressLowercaseOrThrow
|
|
60
52
|
}
|
|
53
|
+
result
|
|
61
54
|
}
|
|
62
55
|
let getSuggestedBlockIntervalFromExn = {
|
|
63
56
|
// Unknown provider: "retry with the range 123-456"
|
|
@@ -507,7 +500,7 @@ let make = (
|
|
|
507
500
|
~loaderFn=transactionHash => provider->Ethers.JsonRpcProvider.getTransaction(~transactionHash),
|
|
508
501
|
~onError=(am, ~exn) => {
|
|
509
502
|
Logging.error({
|
|
510
|
-
"err": exn
|
|
503
|
+
"err": exn,
|
|
511
504
|
"msg": `EE1100: Top level promise timeout reached. Please review other errors or warnings in the code. This function will retry in ${(am._retryDelayMillis / 1000)
|
|
512
505
|
->Belt.Int.toString} seconds. It is highly likely that your indexer isn't syncing on one or more chains currently. Also take a look at the "suggestedFix" in the metadata of this command`,
|
|
513
506
|
"source": name,
|
|
@@ -534,7 +527,7 @@ let make = (
|
|
|
534
527
|
),
|
|
535
528
|
~onError=(am, ~exn) => {
|
|
536
529
|
Logging.error({
|
|
537
|
-
"err": exn
|
|
530
|
+
"err": exn,
|
|
538
531
|
"msg": `EE1100: Top level promise timeout reached. Please review other errors or warnings in the code. This function will retry in ${(am._retryDelayMillis / 1000)
|
|
539
532
|
->Belt.Int.toString} seconds. It is highly likely that your indexer isn't syncing on one or more chains currently. Also take a look at the "suggestedFix" in the metadata of this command`,
|
|
540
533
|
"source": name,
|
|
@@ -48,7 +48,7 @@ async function getKnownBlockWithBackoff(provider, sourceName, chain, blockNumber
|
|
|
48
48
|
catch (raw_err){
|
|
49
49
|
var err = Caml_js_exceptions.internalToOCamlException(raw_err);
|
|
50
50
|
Logging.warn({
|
|
51
|
-
err:
|
|
51
|
+
err: err,
|
|
52
52
|
msg: "Issue while running fetching batch of events from the RPC. Will wait " + String(backoffMsOnFailure) + "ms and try again.",
|
|
53
53
|
source: sourceName,
|
|
54
54
|
chainId: chain,
|
|
@@ -58,23 +58,9 @@ async function getKnownBlockWithBackoff(provider, sourceName, chain, blockNumber
|
|
|
58
58
|
return await getKnownBlockWithBackoff(provider, sourceName, chain, blockNumber, (backoffMsOnFailure << 1), lowercaseAddresses);
|
|
59
59
|
}
|
|
60
60
|
if (lowercaseAddresses) {
|
|
61
|
-
|
|
62
|
-
_difficulty: result._difficulty,
|
|
63
|
-
difficulty: result.difficulty,
|
|
64
|
-
extraData: result.extraData,
|
|
65
|
-
gasLimit: result.gasLimit,
|
|
66
|
-
gasUsed: result.gasUsed,
|
|
67
|
-
hash: result.hash,
|
|
68
|
-
miner: Address.Evm.fromAddressLowercaseOrThrow(result.miner),
|
|
69
|
-
nonce: result.nonce,
|
|
70
|
-
number: result.number,
|
|
71
|
-
parentHash: result.parentHash,
|
|
72
|
-
timestamp: result.timestamp,
|
|
73
|
-
transactions: result.transactions
|
|
74
|
-
};
|
|
75
|
-
} else {
|
|
76
|
-
return result;
|
|
61
|
+
result.miner = Address.Evm.fromAddressLowercaseOrThrow(result.miner);
|
|
77
62
|
}
|
|
63
|
+
return result;
|
|
78
64
|
}
|
|
79
65
|
|
|
80
66
|
var suggestedRangeRegExp = /retry with the range (\d+)-(\d+)/;
|
|
@@ -523,7 +509,7 @@ function make(param) {
|
|
|
523
509
|
return provider.getTransaction(transactionHash);
|
|
524
510
|
}), (function (am, exn) {
|
|
525
511
|
Logging.error({
|
|
526
|
-
err:
|
|
512
|
+
err: exn,
|
|
527
513
|
msg: "EE1100: Top level promise timeout reached. Please review other errors or warnings in the code. This function will retry in " + String(am._retryDelayMillis / 1000 | 0) + " seconds. It is highly likely that your indexer isn't syncing on one or more chains currently. Also take a look at the \"suggestedFix\" in the metadata of this command",
|
|
528
514
|
source: name,
|
|
529
515
|
chainId: chain,
|
|
@@ -537,7 +523,7 @@ function make(param) {
|
|
|
537
523
|
return getKnownBlockWithBackoff(provider, name, chain, blockNumber, 1000, lowercaseAddresses);
|
|
538
524
|
}), (function (am, exn) {
|
|
539
525
|
Logging.error({
|
|
540
|
-
err:
|
|
526
|
+
err: exn,
|
|
541
527
|
msg: "EE1100: Top level promise timeout reached. Please review other errors or warnings in the code. This function will retry in " + String(am._retryDelayMillis / 1000 | 0) + " seconds. It is highly likely that your indexer isn't syncing on one or more chains currently. Also take a look at the \"suggestedFix\" in the metadata of this command",
|
|
542
528
|
source: name,
|
|
543
529
|
chainId: chain,
|
package/src/sources/Source.res
CHANGED
|
@@ -49,7 +49,7 @@ type t = {
|
|
|
49
49
|
~fromBlock: int,
|
|
50
50
|
~toBlock: option<int>,
|
|
51
51
|
~addressesByContractName: dict<array<Address.t>>,
|
|
52
|
-
~indexingContracts: dict<
|
|
52
|
+
~indexingContracts: dict<Internal.indexingContract>,
|
|
53
53
|
~currentBlockHeight: int,
|
|
54
54
|
~partitionId: string,
|
|
55
55
|
~selection: FetchState.selection,
|