envio 3.0.0-alpha.2 → 3.0.0-alpha.21

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