envio 3.0.2 → 3.1.0-rc.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.
Files changed (101) hide show
  1. package/README.md +0 -1
  2. package/evm.schema.json +15 -8
  3. package/fuel.schema.json +19 -12
  4. package/index.d.ts +0 -2
  5. package/package.json +6 -7
  6. package/rescript.json +1 -1
  7. package/src/Batch.res +4 -214
  8. package/src/Batch.res.mjs +6 -165
  9. package/src/ChainFetcher.res +12 -28
  10. package/src/ChainFetcher.res.mjs +8 -17
  11. package/src/ChainManager.res +10 -9
  12. package/src/ChainManager.res.mjs +6 -10
  13. package/src/Config.res +9 -25
  14. package/src/Config.res.mjs +17 -27
  15. package/src/Core.res +7 -0
  16. package/src/Ctx.res +1 -0
  17. package/src/Env.res +0 -8
  18. package/src/Env.res.mjs +0 -6
  19. package/src/EventConfigBuilder.res +13 -123
  20. package/src/EventConfigBuilder.res.mjs +6 -73
  21. package/src/EventProcessing.res +5 -29
  22. package/src/EventProcessing.res.mjs +11 -20
  23. package/src/EventUtils.res +0 -27
  24. package/src/EventUtils.res.mjs +0 -24
  25. package/src/FetchState.res +2 -15
  26. package/src/FetchState.res.mjs +3 -18
  27. package/src/GlobalState.res +26 -39
  28. package/src/GlobalState.res.mjs +12 -40
  29. package/src/HandlerLoader.res +6 -5
  30. package/src/HandlerLoader.res.mjs +27 -9
  31. package/src/HandlerRegister.res +1 -12
  32. package/src/HandlerRegister.res.mjs +1 -6
  33. package/src/HandlerRegister.resi +1 -1
  34. package/src/Hasura.res +96 -32
  35. package/src/Hasura.res.mjs +93 -38
  36. package/src/InMemoryStore.res +205 -45
  37. package/src/InMemoryStore.res.mjs +157 -40
  38. package/src/InMemoryTable.res +165 -249
  39. package/src/InMemoryTable.res.mjs +156 -227
  40. package/src/Internal.res +10 -34
  41. package/src/Internal.res.mjs +9 -3
  42. package/src/LoadLayer.res +5 -5
  43. package/src/LoadLayer.res.mjs +5 -5
  44. package/src/LogSelection.res +15 -19
  45. package/src/LogSelection.res.mjs +5 -6
  46. package/src/Main.res +4 -6
  47. package/src/Main.res.mjs +26 -15
  48. package/src/Persistence.res +7 -132
  49. package/src/Persistence.res.mjs +1 -102
  50. package/src/PgStorage.res +57 -40
  51. package/src/PgStorage.res.mjs +60 -34
  52. package/src/ReorgDetection.res +35 -58
  53. package/src/ReorgDetection.res.mjs +21 -29
  54. package/src/SimulateItems.res.mjs +21 -3
  55. package/src/Sink.res +2 -2
  56. package/src/Sink.res.mjs +1 -1
  57. package/src/TableIndices.res +9 -2
  58. package/src/TableIndices.res.mjs +7 -1
  59. package/src/TestIndexer.res +53 -60
  60. package/src/TestIndexer.res.mjs +77 -63
  61. package/src/TestIndexerProxyStorage.res +4 -14
  62. package/src/TestIndexerProxyStorage.res.mjs +1 -5
  63. package/src/UserContext.res +2 -4
  64. package/src/UserContext.res.mjs +4 -5
  65. package/src/Utils.res +0 -2
  66. package/src/Utils.res.mjs +0 -3
  67. package/src/bindings/ClickHouse.res +45 -38
  68. package/src/bindings/ClickHouse.res.mjs +16 -17
  69. package/src/bindings/Vitest.res +3 -0
  70. package/src/db/InternalTable.res +59 -18
  71. package/src/db/InternalTable.res.mjs +82 -51
  72. package/src/db/Table.res +9 -2
  73. package/src/db/Table.res.mjs +10 -7
  74. package/src/sources/EnvioApiClient.res +15 -0
  75. package/src/sources/EnvioApiClient.res.mjs +24 -0
  76. package/src/sources/EvmChain.res +32 -10
  77. package/src/sources/EvmChain.res.mjs +31 -5
  78. package/src/sources/HyperFuelSource.res +15 -58
  79. package/src/sources/HyperFuelSource.res.mjs +20 -39
  80. package/src/sources/HyperSync.res +54 -100
  81. package/src/sources/HyperSync.res.mjs +67 -96
  82. package/src/sources/HyperSync.resi +4 -22
  83. package/src/sources/HyperSyncClient.res +70 -247
  84. package/src/sources/HyperSyncClient.res.mjs +47 -46
  85. package/src/sources/HyperSyncSource.res +94 -166
  86. package/src/sources/HyperSyncSource.res.mjs +100 -127
  87. package/src/sources/RpcSource.res +43 -22
  88. package/src/sources/RpcSource.res.mjs +50 -35
  89. package/src/sources/SimulateSource.res +1 -7
  90. package/src/sources/SimulateSource.res.mjs +1 -7
  91. package/src/sources/Source.res +10 -1
  92. package/src/sources/Source.res.mjs +3 -0
  93. package/src/sources/SourceManager.res +177 -8
  94. package/src/sources/SourceManager.res.mjs +141 -3
  95. package/src/sources/SourceManager.resi +19 -0
  96. package/src/tui/Tui.res +44 -6
  97. package/src/tui/Tui.res.mjs +56 -8
  98. package/src/tui/components/TuiData.res +3 -0
  99. package/svm.schema.json +11 -4
  100. package/src/sources/HyperSyncJsonApi.res +0 -390
  101. package/src/sources/HyperSyncJsonApi.res.mjs +0 -237
@@ -186,26 +186,67 @@ WHERE "${(#id: field :> string)}" = $1;`
186
186
  "${(#ready_at: field :> string)}" as "timestampCaughtUpToHeadOrEndblock",
187
187
  "${(#events_processed: field :> string)}"::float8 as "numEventsProcessed",
188
188
  "${(#progress_block: field :> string)}" as "progressBlockNumber",
189
- "${(#source_block: field :> string)}" as "sourceBlockNumber",
190
- (
191
- -- envio_addresses.id is a composite "{chainId}-{address}" string produced by
192
- -- Config.EnvioAddresses.makeId; extract the address by taking everything
193
- -- after the first '-'. Keep in sync with makeId / getAddress.
194
- SELECT COALESCE(json_agg(json_build_object(
195
- 'address', SUBSTRING("id" FROM POSITION('-' IN "id") + 1),
196
- 'contractName', "contract_name",
197
- 'registrationBlock', "registration_block"
198
- )), '[]'::json)
199
- FROM "${pgSchema}"."${EnvioAddresses.table.tableName}"
200
- WHERE "chain_id" = chains."${(#id: field :> string)}"
201
- ) as "indexingAddresses"
202
- FROM "${pgSchema}"."${table.tableName}" as chains;`
189
+ "${(#source_block: field :> string)}" as "sourceBlockNumber"
190
+ FROM "${pgSchema}"."${table.tableName}";`
203
191
  }
204
192
 
205
- let getInitialState = (sql, ~pgSchema) => {
206
- sql
207
- ->Postgres.unsafe(makeGetInitialStateQuery(~pgSchema))
208
- ->(Utils.magic: promise<array<unknown>> => promise<array<rawInitialState>>)
193
+ type rawIndexingAddress = {
194
+ chainId: int,
195
+ address: Address.t,
196
+ contractName: string,
197
+ registrationBlock: int,
198
+ }
199
+
200
+ // Addresses are read as plain rows rather than aggregated per chain with
201
+ // json_agg: a single chain's aggregate can exceed V8's max string length
202
+ // (postgres.js decodes the column with Buffer.toString and throws
203
+ // ERR_STRING_TOO_LONG). Grouping happens in JS instead — see getInitialState.
204
+ let makeGetIndexingAddressesQuery = (~pgSchema) => {
205
+ // envio_addresses.id is a composite "{chainId}-{address}" string produced by
206
+ // Config.EnvioAddresses.makeId; extract the address by taking everything
207
+ // after the first '-'. Keep in sync with makeId / getAddress.
208
+ `SELECT "chain_id" as "chainId",
209
+ SUBSTRING("id" FROM POSITION('-' IN "id") + 1) as "address",
210
+ "contract_name" as "contractName",
211
+ "registration_block" as "registrationBlock"
212
+ FROM "${pgSchema}"."${EnvioAddresses.table.tableName}";`
213
+ }
214
+
215
+ let getInitialState = async (sql, ~pgSchema) => {
216
+ let (rawInitialStates, rawIndexingAddresses) = await Promise.all2((
217
+ sql
218
+ ->Postgres.unsafe(makeGetInitialStateQuery(~pgSchema))
219
+ ->(Utils.magic: promise<array<unknown>> => promise<array<rawInitialState>>),
220
+ sql
221
+ ->Postgres.unsafe(makeGetIndexingAddressesQuery(~pgSchema))
222
+ ->(Utils.magic: promise<array<unknown>> => promise<array<rawIndexingAddress>>),
223
+ ))
224
+
225
+ let indexingAddressesByChainId = Dict.make()
226
+ rawIndexingAddresses->Array.forEach(row => {
227
+ let key = row.chainId->Int.toString
228
+ let addresses = switch indexingAddressesByChainId->Dict.get(key) {
229
+ | Some(addresses) => addresses
230
+ | None =>
231
+ let addresses: array<Internal.indexingAddress> = []
232
+ indexingAddressesByChainId->Dict.set(key, addresses)
233
+ addresses
234
+ }
235
+ addresses
236
+ ->Array.push({
237
+ address: row.address,
238
+ contractName: row.contractName,
239
+ registrationBlock: row.registrationBlock,
240
+ })
241
+ ->ignore
242
+ })
243
+
244
+ rawInitialStates->Array.map(rawInitialState => {
245
+ ...rawInitialState,
246
+ indexingAddresses: indexingAddressesByChainId
247
+ ->Dict.get(rawInitialState.id->Int.toString)
248
+ ->Option.getOr([]),
249
+ })
209
250
  }
210
251
 
211
252
  let progressFields: array<progressFields> = [#progress_block, #events_processed, #source_block]
@@ -7,6 +7,7 @@ import * as Address from "../Address.res.mjs";
7
7
  import * as Belt_Array from "@rescript/runtime/lib/es6/Belt_Array.js";
8
8
  import * as Belt_Option from "@rescript/runtime/lib/es6/Belt_Option.js";
9
9
  import * as Stdlib_Null from "@rescript/runtime/lib/es6/Stdlib_Null.js";
10
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
10
11
  import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
11
12
  import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
12
13
  import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
@@ -26,18 +27,18 @@ let fields = [
26
27
  ];
27
28
 
28
29
  let table = Table.mkTable("envio_chains", undefined, [
29
- Table.mkField("id", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, true, undefined, undefined),
30
- Table.mkField("start_block", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
31
- Table.mkField("end_block", "Int32", S$RescriptSchema.$$null(S$RescriptSchema.int), undefined, undefined, true, undefined, undefined, undefined),
32
- Table.mkField("max_reorg_depth", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
33
- Table.mkField("buffer_block", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
34
- Table.mkField("source_block", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
35
- Table.mkField("first_event_block", "Int32", S$RescriptSchema.$$null(S$RescriptSchema.int), undefined, undefined, true, undefined, undefined, undefined),
36
- Table.mkField("ready_at", "Date", S$RescriptSchema.$$null(Utils.Schema.dbDate), undefined, undefined, true, undefined, undefined, undefined),
37
- Table.mkField("events_processed", "UInt52", S$RescriptSchema.float, undefined, undefined, undefined, undefined, undefined, undefined),
38
- Table.mkField("_is_hyper_sync", "Boolean", S$RescriptSchema.bool, undefined, undefined, undefined, undefined, undefined, undefined),
39
- Table.mkField("progress_block", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined)
40
- ]);
30
+ Table.mkField("id", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, true, undefined, undefined, undefined),
31
+ Table.mkField("start_block", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
32
+ Table.mkField("end_block", "Int32", S$RescriptSchema.$$null(S$RescriptSchema.int), undefined, undefined, true, undefined, undefined, undefined, undefined),
33
+ Table.mkField("max_reorg_depth", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
34
+ Table.mkField("buffer_block", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
35
+ Table.mkField("source_block", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
36
+ Table.mkField("first_event_block", "Int32", S$RescriptSchema.$$null(S$RescriptSchema.int), undefined, undefined, true, undefined, undefined, undefined, undefined),
37
+ Table.mkField("ready_at", "Date", S$RescriptSchema.$$null(Utils.Schema.dbDate), undefined, undefined, true, undefined, undefined, undefined, undefined),
38
+ Table.mkField("events_processed", "UInt52", S$RescriptSchema.float, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
39
+ Table.mkField("_is_hyper_sync", "Boolean", S$RescriptSchema.bool, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
40
+ Table.mkField("progress_block", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined)
41
+ ], undefined);
41
42
 
42
43
  function initialFromConfig(chainConfig) {
43
44
  return {
@@ -113,24 +114,53 @@ function makeGetInitialStateQuery(pgSchema) {
113
114
  "` + "ready_at" + `" as "timestampCaughtUpToHeadOrEndblock",
114
115
  "` + "events_processed" + `"::float8 as "numEventsProcessed",
115
116
  "` + "progress_block" + `" as "progressBlockNumber",
116
- "` + "source_block" + `" as "sourceBlockNumber",
117
- (
118
- -- envio_addresses.id is a composite "{chainId}-{address}" string produced by
119
- -- Config.EnvioAddresses.makeId; extract the address by taking everything
120
- -- after the first '-'. Keep in sync with makeId / getAddress.
121
- SELECT COALESCE(json_agg(json_build_object(
122
- 'address', SUBSTRING("id" FROM POSITION('-' IN "id") + 1),
123
- 'contractName', "contract_name",
124
- 'registrationBlock', "registration_block"
125
- )), '[]'::json)
126
- FROM "` + pgSchema + `"."` + Config.EnvioAddresses.table.tableName + `"
127
- WHERE "chain_id" = chains."` + "id" + `"
128
- ) as "indexingAddresses"
129
- FROM "` + pgSchema + `"."` + table.tableName + `" as chains;`;
117
+ "` + "source_block" + `" as "sourceBlockNumber"
118
+ FROM "` + pgSchema + `"."` + table.tableName + `";`;
119
+ }
120
+
121
+ function makeGetIndexingAddressesQuery(pgSchema) {
122
+ return `SELECT "chain_id" as "chainId",
123
+ SUBSTRING("id" FROM POSITION('-' IN "id") + 1) as "address",
124
+ "contract_name" as "contractName",
125
+ "registration_block" as "registrationBlock"
126
+ FROM "` + pgSchema + `"."` + Config.EnvioAddresses.table.tableName + `";`;
130
127
  }
131
128
 
132
- function getInitialState(sql, pgSchema) {
133
- return sql.unsafe(makeGetInitialStateQuery(pgSchema));
129
+ async function getInitialState(sql, pgSchema) {
130
+ let match = await Promise.all([
131
+ sql.unsafe(makeGetInitialStateQuery(pgSchema)),
132
+ sql.unsafe(makeGetIndexingAddressesQuery(pgSchema))
133
+ ]);
134
+ let indexingAddressesByChainId = {};
135
+ match[1].forEach(row => {
136
+ let key = row.chainId.toString();
137
+ let addresses = indexingAddressesByChainId[key];
138
+ let addresses$1;
139
+ if (addresses !== undefined) {
140
+ addresses$1 = addresses;
141
+ } else {
142
+ let addresses$2 = [];
143
+ indexingAddressesByChainId[key] = addresses$2;
144
+ addresses$1 = addresses$2;
145
+ }
146
+ addresses$1.push({
147
+ address: row.address,
148
+ contractName: row.contractName,
149
+ registrationBlock: row.registrationBlock
150
+ });
151
+ });
152
+ return match[0].map(rawInitialState => ({
153
+ id: rawInitialState.id,
154
+ startBlock: rawInitialState.startBlock,
155
+ endBlock: rawInitialState.endBlock,
156
+ maxReorgDepth: rawInitialState.maxReorgDepth,
157
+ firstEventBlockNumber: rawInitialState.firstEventBlockNumber,
158
+ timestampCaughtUpToHeadOrEndblock: rawInitialState.timestampCaughtUpToHeadOrEndblock,
159
+ numEventsProcessed: rawInitialState.numEventsProcessed,
160
+ progressBlockNumber: rawInitialState.progressBlockNumber,
161
+ indexingAddresses: Stdlib_Option.getOr(indexingAddressesByChainId[rawInitialState.id.toString()], []),
162
+ sourceBlockNumber: rawInitialState.sourceBlockNumber
163
+ }));
134
164
  }
135
165
 
136
166
  let progressFields = [
@@ -188,6 +218,7 @@ let Chains = {
188
218
  metaFields: metaFields,
189
219
  makeMetaFieldsUpdateQuery: makeMetaFieldsUpdateQuery,
190
220
  makeGetInitialStateQuery: makeGetInitialStateQuery,
221
+ makeGetIndexingAddressesQuery: makeGetIndexingAddressesQuery,
191
222
  getInitialState: getInitialState,
192
223
  progressFields: progressFields,
193
224
  makeProgressFieldsUpdateQuery: makeProgressFieldsUpdateQuery,
@@ -196,9 +227,9 @@ let Chains = {
196
227
  };
197
228
 
198
229
  let table$1 = Table.mkTable("envio_info", undefined, [
199
- Table.mkField("id", "Int32", S$RescriptSchema.int, "1", undefined, undefined, true, undefined, undefined),
200
- Table.mkField("config", "String", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined)
201
- ]);
230
+ Table.mkField("id", "Int32", S$RescriptSchema.int, "1", undefined, undefined, true, undefined, undefined, undefined),
231
+ Table.mkField("config", "String", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined, undefined)
232
+ ], undefined);
202
233
 
203
234
  let undefinedTableSqlState = "42P01";
204
235
 
@@ -245,12 +276,12 @@ let dbSchema = S$RescriptSchema.object(s => ({
245
276
  }));
246
277
 
247
278
  let table$2 = Table.mkTable("envio_checkpoints", undefined, [
248
- Table.mkField("id", "UInt64", S$RescriptSchema.bigint, undefined, undefined, undefined, true, undefined, undefined),
249
- Table.mkField("chain_id", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
250
- Table.mkField("block_number", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
251
- Table.mkField("block_hash", "String", S$RescriptSchema.$$null(S$RescriptSchema.string), undefined, undefined, true, undefined, undefined, undefined),
252
- Table.mkField("events_processed", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined)
253
- ]);
279
+ Table.mkField("id", "UInt64", S$RescriptSchema.bigint, undefined, undefined, undefined, true, undefined, undefined, undefined),
280
+ Table.mkField("chain_id", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
281
+ Table.mkField("block_number", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
282
+ Table.mkField("block_hash", "String", S$RescriptSchema.$$null(S$RescriptSchema.string), undefined, undefined, true, undefined, undefined, undefined, undefined),
283
+ Table.mkField("events_processed", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined)
284
+ ], undefined);
254
285
 
255
286
  function makeGetReorgCheckpointsQuery(pgSchema) {
256
287
  return `WITH reorg_chains AS (
@@ -370,20 +401,20 @@ let schema = S$RescriptSchema.schema(s => ({
370
401
  }));
371
402
 
372
403
  let table$3 = Table.mkTable("raw_events", undefined, [
373
- Table.mkField("chain_id", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
374
- Table.mkField("event_id", "UInt64", S$RescriptSchema.bigint, undefined, undefined, undefined, undefined, undefined, undefined),
375
- Table.mkField("event_name", "String", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
376
- Table.mkField("contract_name", "String", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
377
- Table.mkField("block_number", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
378
- Table.mkField("log_index", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
379
- Table.mkField("src_address", "String", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined),
380
- Table.mkField("block_hash", "String", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined),
381
- Table.mkField("block_timestamp", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined),
382
- Table.mkField("block_fields", "Json", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined),
383
- Table.mkField("transaction_fields", "Json", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined),
384
- Table.mkField("params", "Json", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined),
385
- Table.mkField("serial", "BigSerial", S$RescriptSchema.$$null(S$RescriptSchema.bigint), undefined, undefined, true, true, undefined, undefined)
386
- ]);
404
+ Table.mkField("chain_id", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
405
+ Table.mkField("event_id", "UInt64", S$RescriptSchema.bigint, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
406
+ Table.mkField("event_name", "String", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
407
+ Table.mkField("contract_name", "String", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
408
+ Table.mkField("block_number", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
409
+ Table.mkField("log_index", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
410
+ Table.mkField("src_address", "String", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
411
+ Table.mkField("block_hash", "String", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
412
+ Table.mkField("block_timestamp", "Int32", S$RescriptSchema.int, undefined, undefined, undefined, undefined, undefined, undefined, undefined),
413
+ Table.mkField("block_fields", "Json", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined, undefined),
414
+ Table.mkField("transaction_fields", "Json", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined, undefined),
415
+ Table.mkField("params", "Json", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined, undefined),
416
+ Table.mkField("serial", "BigSerial", S$RescriptSchema.$$null(S$RescriptSchema.bigint), undefined, undefined, true, true, undefined, undefined, undefined)
417
+ ], undefined);
387
418
 
388
419
  let RawEvents = {
389
420
  schema: schema,
package/src/db/Table.res CHANGED
@@ -43,12 +43,14 @@ type field = {
43
43
  isIndex: bool,
44
44
  linkedEntity: option<string>,
45
45
  defaultValue: option<string>,
46
+ description: option<string>,
46
47
  }
47
48
 
48
49
  type derivedFromField = {
49
50
  fieldName: string,
50
51
  derivedFromEntity: string,
51
52
  derivedFromField: string,
53
+ description: option<string>,
52
54
  }
53
55
 
54
56
  type fieldOrDerived = Field(field) | DerivedFrom(derivedFromField)
@@ -63,6 +65,7 @@ let mkField = (
63
65
  ~isPrimaryKey=false,
64
66
  ~isIndex=false,
65
67
  ~linkedEntity=?,
68
+ ~description=?,
66
69
  ) =>
67
70
  {
68
71
  fieldName,
@@ -74,13 +77,15 @@ let mkField = (
74
77
  isIndex,
75
78
  linkedEntity,
76
79
  defaultValue: default,
80
+ description,
77
81
  }->Field
78
82
 
79
- let mkDerivedFromField = (fieldName, ~derivedFromEntity, ~derivedFromField) =>
83
+ let mkDerivedFromField = (fieldName, ~derivedFromEntity, ~derivedFromField, ~description=?) =>
80
84
  {
81
85
  fieldName,
82
86
  derivedFromField,
83
87
  derivedFromEntity,
88
+ description,
84
89
  }->DerivedFrom
85
90
 
86
91
  let getUserDefinedFieldName = fieldOrDerived =>
@@ -162,12 +167,14 @@ type table = {
162
167
  tableName: string,
163
168
  fields: array<fieldOrDerived>,
164
169
  compositeIndices: array<array<compositeIndexField>>,
170
+ description: option<string>,
165
171
  }
166
172
 
167
- let mkTable = (tableName, ~compositeIndices=[], ~fields) => {
173
+ let mkTable = (tableName, ~compositeIndices=[], ~fields, ~description=?) => {
168
174
  tableName,
169
175
  fields,
170
176
  compositeIndices,
177
+ description,
171
178
  }
172
179
 
173
180
  let getPrimaryKeyFieldNames = table =>
@@ -17,7 +17,7 @@ function makeEnumConfig(name, variants) {
17
17
  };
18
18
  }
19
19
 
20
- function mkField(fieldName, fieldType, fieldSchema, $$default, isArrayOpt, isNullableOpt, isPrimaryKeyOpt, isIndexOpt, linkedEntity) {
20
+ function mkField(fieldName, fieldType, fieldSchema, $$default, isArrayOpt, isNullableOpt, isPrimaryKeyOpt, isIndexOpt, linkedEntity, description) {
21
21
  let isArray = isArrayOpt !== undefined ? isArrayOpt : false;
22
22
  let isNullable = isNullableOpt !== undefined ? isNullableOpt : false;
23
23
  let isPrimaryKey = isPrimaryKeyOpt !== undefined ? isPrimaryKeyOpt : false;
@@ -33,18 +33,20 @@ function mkField(fieldName, fieldType, fieldSchema, $$default, isArrayOpt, isNul
33
33
  isPrimaryKey: isPrimaryKey,
34
34
  isIndex: isIndex,
35
35
  linkedEntity: linkedEntity,
36
- defaultValue: $$default
36
+ defaultValue: $$default,
37
+ description: description
37
38
  }
38
39
  };
39
40
  }
40
41
 
41
- function mkDerivedFromField(fieldName, derivedFromEntity, derivedFromField) {
42
+ function mkDerivedFromField(fieldName, derivedFromEntity, derivedFromField, description) {
42
43
  return {
43
44
  TAG: "DerivedFrom",
44
45
  _0: {
45
46
  fieldName: fieldName,
46
47
  derivedFromEntity: derivedFromEntity,
47
- derivedFromField: derivedFromField
48
+ derivedFromField: derivedFromField,
49
+ description: description
48
50
  }
49
51
  };
50
52
  }
@@ -133,12 +135,13 @@ function getPgFieldType(fieldType, pgSchema, isArray, isNumericArrayAsText, isNu
133
135
  );
134
136
  }
135
137
 
136
- function mkTable(tableName, compositeIndicesOpt, fields) {
138
+ function mkTable(tableName, compositeIndicesOpt, fields, description) {
137
139
  let compositeIndices = compositeIndicesOpt !== undefined ? compositeIndicesOpt : [];
138
140
  return {
139
141
  tableName: tableName,
140
142
  fields: fields,
141
- compositeIndices: compositeIndices
143
+ compositeIndices: compositeIndices,
144
+ description: description
142
145
  };
143
146
  }
144
147
 
@@ -209,7 +212,7 @@ function getNonDefaultFieldNames(table) {
209
212
  }
210
213
 
211
214
  function getFieldByName(table, fieldName) {
212
- return table.fields.find(field => field._0.fieldName === fieldName);
215
+ return table.fields.find(field => getUserDefinedFieldName(field) === fieldName);
213
216
  }
214
217
 
215
218
  function getFieldByDbName(table, dbFieldName) {
@@ -0,0 +1,15 @@
1
+ // Rest client for envio's own REST endpoints (e.g. the HyperSync/HyperFuel
2
+ // /height poll). Tags requests with the hyperindex User-Agent so they're
3
+ // attributable on the server, mirroring the SSE height stream and the Rust
4
+ // data-query client which already set it.
5
+ let make = (baseUrl: string): Rest.client => {
6
+ let userAgent = `hyperindex/${Utils.EnvioPackage.value.version}`
7
+ Rest.client(baseUrl, ~fetcher=(args: Rest.ApiFetcher.args) => {
8
+ let headers = switch args.headers {
9
+ | Some(headers) => headers
10
+ | None => Dict.make()
11
+ }
12
+ headers->Dict.set("User-Agent", userAgent->(Utils.magic: string => unknown))
13
+ Rest.ApiFetcher.default({...args, headers: Some(headers)})
14
+ })
15
+ }
@@ -0,0 +1,24 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Rest from "../vendored/Rest.res.mjs";
4
+ import * as Utils from "../Utils.res.mjs";
5
+
6
+ function make(baseUrl) {
7
+ let userAgent = `hyperindex/` + Utils.EnvioPackage.value.version;
8
+ return Rest.client(baseUrl, args => {
9
+ let headers = args.headers;
10
+ let headers$1 = headers !== undefined ? headers : ({});
11
+ headers$1["User-Agent"] = userAgent;
12
+ return Rest.ApiFetcher.$$default({
13
+ body: args.body,
14
+ headers: headers$1,
15
+ method: args.method,
16
+ path: args.path
17
+ });
18
+ });
19
+ }
20
+
21
+ export {
22
+ make,
23
+ }
24
+ /* Rest Not a pure module */
@@ -22,33 +22,53 @@ let getSyncConfig = (
22
22
  initialBlockInterval: Env.Configurable.SyncConfig.initialBlockInterval->Option.getOr(
23
23
  initialBlockInterval->Option.getOr(10_000),
24
24
  ),
25
- // After an RPC error, how much to scale back the number of blocks requested at once
26
25
  backoffMultiplicative: Env.Configurable.SyncConfig.backoffMultiplicative->Option.getOr(
27
26
  backoffMultiplicative->Option.getOr(0.8),
28
27
  ),
29
- // Without RPC errors or timeouts, how much to increase the number of blocks requested by for the next batch
30
28
  accelerationAdditive: Env.Configurable.SyncConfig.accelerationAdditive->Option.getOr(
31
29
  accelerationAdditive->Option.getOr(500),
32
30
  ),
33
- // Do not further increase the block interval past this limit
34
31
  intervalCeiling: Env.Configurable.SyncConfig.intervalCeiling->Option.getOr(
35
32
  intervalCeiling->Option.getOr(10_000),
36
33
  ),
37
- // After an error, how long to wait before retrying
38
34
  backoffMillis: backoffMillis->Option.getOr(5000),
39
- // How long to wait before cancelling an RPC request
40
35
  queryTimeoutMillis,
41
36
  fallbackStallTimeout: fallbackStallTimeout->Option.getOr(queryTimeoutMillis / 2),
42
- // How frequently to check for new blocks in realtime (default: 1000ms)
43
37
  pollingInterval: pollingInterval->Option.getOr(1000),
44
38
  }
45
39
  }
46
40
 
41
+ let collectEventParams = (contracts: array<Internal.evmContractConfig>): array<
42
+ HyperSyncClient.Decoder.eventParamsInput,
43
+ > => {
44
+ let seen = Dict.make()
45
+ let result = []
46
+ contracts->Array.forEach(contract => {
47
+ contract.events->Array.forEach(event => {
48
+ let key = event.sighash ++ "_" ++ event.topicCount->Int.toString
49
+ switch seen->Dict.get(key) {
50
+ | Some(_) => ()
51
+ | None => {
52
+ seen->Dict.set(key, true)
53
+ result
54
+ ->Array.push({
55
+ HyperSyncClient.Decoder.sighash: event.sighash,
56
+ topicCount: event.topicCount,
57
+ eventName: event.name,
58
+ params: event.paramsMetadata,
59
+ })
60
+ ->ignore
61
+ }
62
+ }
63
+ })
64
+ })
65
+ result
66
+ }
67
+
47
68
  let makeSources = (
48
69
  ~chain,
49
70
  ~contracts: array<Internal.evmContractConfig>,
50
71
  ~hyperSync,
51
- ~allEventSignatures,
52
72
  ~rpcs: array<rpc>,
53
73
  ~lowercaseAddresses,
54
74
  ) => {
@@ -57,19 +77,21 @@ let makeSources = (
57
77
  ->Belt.Array.flatMap(contract => contract.events)
58
78
  ->EventRouter.fromEvmEventModsOrThrow(~chain)
59
79
 
80
+ let allEventParams = collectEventParams(contracts)
81
+
60
82
  let sources = switch hyperSync {
61
83
  | Some(endpointUrl) => [
62
84
  HyperSyncSource.make({
63
85
  chain,
64
86
  endpointUrl,
65
- allEventSignatures,
87
+ allEventParams,
66
88
  eventRouter,
67
89
  apiToken: Env.envioApiToken,
68
- clientMaxRetries: Env.hyperSyncClientMaxRetries,
69
90
  clientTimeoutMillis: Env.hyperSyncClientTimeoutMillis,
70
91
  lowercaseAddresses,
71
92
  serializationFormat: Env.hypersyncClientSerializationFormat,
72
93
  enableQueryCaching: Env.hypersyncClientEnableQueryCaching,
94
+ logLevel: Env.hypersyncLogLevel,
73
95
  }),
74
96
  ]
75
97
  | _ => []
@@ -81,7 +103,7 @@ let makeSources = (
81
103
  syncConfig: getSyncConfig(syncConfig->Option.getOr({})),
82
104
  url,
83
105
  eventRouter,
84
- allEventSignatures,
106
+ allEventParams,
85
107
  lowercaseAddresses,
86
108
  ?ws,
87
109
  })
@@ -21,19 +21,44 @@ function getSyncConfig(param) {
21
21
  };
22
22
  }
23
23
 
24
- function makeSources(chain, contracts, hyperSync, allEventSignatures, rpcs, lowercaseAddresses) {
24
+ function collectEventParams(contracts) {
25
+ let seen = {};
26
+ let result = [];
27
+ contracts.forEach(contract => {
28
+ contract.events.forEach(event => {
29
+ let key = event.sighash + "_" + event.topicCount.toString();
30
+ let match = seen[key];
31
+ if (match !== undefined) {
32
+ return;
33
+ } else {
34
+ seen[key] = true;
35
+ result.push({
36
+ sighash: event.sighash,
37
+ topicCount: event.topicCount,
38
+ eventName: event.name,
39
+ params: event.paramsMetadata
40
+ });
41
+ return;
42
+ }
43
+ });
44
+ });
45
+ return result;
46
+ }
47
+
48
+ function makeSources(chain, contracts, hyperSync, rpcs, lowercaseAddresses) {
25
49
  let eventRouter = EventRouter.fromEvmEventModsOrThrow(Belt_Array.flatMap(contracts, contract => contract.events), chain);
50
+ let allEventParams = collectEventParams(contracts);
26
51
  let sources = hyperSync !== undefined ? [HyperSyncSource.make({
27
52
  chain: chain,
28
53
  endpointUrl: hyperSync,
29
- allEventSignatures: allEventSignatures,
54
+ allEventParams: allEventParams,
30
55
  eventRouter: eventRouter,
31
56
  apiToken: Env.envioApiToken,
32
- clientMaxRetries: Env.hyperSyncClientMaxRetries,
33
57
  clientTimeoutMillis: Env.hyperSyncClientTimeoutMillis,
34
58
  lowercaseAddresses: lowercaseAddresses,
35
59
  serializationFormat: Env.hypersyncClientSerializationFormat,
36
- enableQueryCaching: Env.hypersyncClientEnableQueryCaching
60
+ enableQueryCaching: Env.hypersyncClientEnableQueryCaching,
61
+ logLevel: Env.hypersyncLogLevel
37
62
  })] : [];
38
63
  rpcs.forEach(param => {
39
64
  let source = RpcSource.make({
@@ -42,7 +67,7 @@ function makeSources(chain, contracts, hyperSync, allEventSignatures, rpcs, lowe
42
67
  url: param.url,
43
68
  chain: chain,
44
69
  eventRouter: eventRouter,
45
- allEventSignatures: allEventSignatures,
70
+ allEventParams: allEventParams,
46
71
  lowercaseAddresses: lowercaseAddresses,
47
72
  ws: param.ws
48
73
  });
@@ -53,6 +78,7 @@ function makeSources(chain, contracts, hyperSync, allEventSignatures, rpcs, lowe
53
78
 
54
79
  export {
55
80
  getSyncConfig,
81
+ collectEventParams,
56
82
  makeSources,
57
83
  }
58
84
  /* Env Not a pure module */