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.
@@ -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$1 = Table.mkTable("envio_chains", undefined, [
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("_latest_processed_block", "INTEGER", S$RescriptSchema.$$null(S$RescriptSchema.$$int), undefined, undefined, true, undefined, undefined, undefined),
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
- source_block: 0,
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$1.tableName + "\" (" + columnNames.join(", ") + ")\nVALUES " + valuesRows.join(",\n ") + ";";
90
+ return "INSERT INTO \"" + pgSchema + "\".\"" + table.tableName + "\" (" + columnNames.join(", ") + ")\nVALUES " + valuesRows.join(",\n ") + ";";
117
91
  }
118
92
 
119
- var updateFields = [
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 makeSingleUpdateQuery(pgSchema) {
131
- var setClauses = Belt_Array.mapWithIndex(updateFields, (function (index, field) {
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$1.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"id\" = $1;";
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 setValues(sql, pgSchema, chainsData) {
139
- var query = makeSingleUpdateQuery(pgSchema);
140
- return Promise.all(Belt_Array.map(chainsData, (function (chain) {
141
- var params = [];
142
- var idValue = Js_dict.get(chain, "id");
143
- params.push(idValue);
144
- updateFields.forEach(function (field) {
145
- var value = Js_dict.get(chain, field);
146
- params.push(value);
147
- });
148
- return sql.unsafe(query, params, {prepare: true});
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$1,
157
+ table: table,
155
158
  initialFromConfig: initialFromConfig,
156
159
  makeInitialValuesQuery: makeInitialValuesQuery,
157
- updateFields: updateFields,
158
- makeSingleUpdateQuery: makeSingleUpdateQuery,
159
- setValues: setValues
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$2 = Table.mkTable("persisted_state", undefined, [
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$2
178
+ table: table$1
173
179
  };
174
180
 
175
- var table$3 = Table.mkTable("end_of_block_range_scanned_data", undefined, [
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$3
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$4 = Table.mkTable("raw_events", undefined, [
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$4
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 \"" + "buffer_block" + "\" AS \"bufferBlock\",\n \"" + "ready_at" + "\" AS \"readyAt\",\n \"" + "first_event_block" + "\" AS \"firstEventBlock\",\n \"" + "events_processed" + "\" AS \"eventsProcessed\",\n (\"" + "ready_at" + "\" IS NOT NULL) AS \"isReady\"\n FROM \"" + pgSchema + "\".\"" + table$1.tableName + "\"\n ORDER BY \"" + "id" + "\";";
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 \"" + "_latest_processed_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 + "\";";
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$5 = Table.mkTable(name, undefined, [
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$5, schema$1);
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$5,
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$5,
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.forEach(fieldName => {
81
- switch returnedObj
82
- ->(Utils.magic: 'a => Js.Dict.t<unknown>)
83
- ->Utils.Dict.dangerouslyGetNonOption(fieldName) {
84
- | Some(_) => ()
85
- | None => acc->Array.push(prefix ++ "." ++ fieldName)->ignore
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
- addMissingParams(missingParams, fieldNames, item.log, "log");
92
- addMissingParams(missingParams, nonOptionalBlockFieldNames, item.block, "block");
93
- addMissingParams(missingParams, nonOptionalTransactionFieldNames, item.transaction, "transaction");
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,