ponder 0.14.13 → 0.15.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.
Files changed (237) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/esm/bin/commands/createViews.js +28 -11
  3. package/dist/esm/bin/commands/createViews.js.map +1 -1
  4. package/dist/esm/bin/commands/dev.js +42 -22
  5. package/dist/esm/bin/commands/dev.js.map +1 -1
  6. package/dist/esm/bin/commands/prune.js +3 -0
  7. package/dist/esm/bin/commands/prune.js.map +1 -1
  8. package/dist/esm/bin/commands/serve.js +4 -1
  9. package/dist/esm/bin/commands/serve.js.map +1 -1
  10. package/dist/esm/bin/commands/start.js +18 -6
  11. package/dist/esm/bin/commands/start.js.map +1 -1
  12. package/dist/esm/bin/isolatedController.js +200 -0
  13. package/dist/esm/bin/isolatedController.js.map +1 -0
  14. package/dist/esm/bin/isolatedWorker.js +146 -0
  15. package/dist/esm/bin/isolatedWorker.js.map +1 -0
  16. package/dist/esm/build/config.js +322 -402
  17. package/dist/esm/build/config.js.map +1 -1
  18. package/dist/esm/build/index.js +8 -11
  19. package/dist/esm/build/index.js.map +1 -1
  20. package/dist/esm/build/pre.js +1 -4
  21. package/dist/esm/build/pre.js.map +1 -1
  22. package/dist/esm/build/schema.js +25 -3
  23. package/dist/esm/build/schema.js.map +1 -1
  24. package/dist/esm/client/index.js +306 -42
  25. package/dist/esm/client/index.js.map +1 -1
  26. package/dist/esm/database/actions.js +264 -104
  27. package/dist/esm/database/actions.js.map +1 -1
  28. package/dist/esm/database/index.js +39 -33
  29. package/dist/esm/database/index.js.map +1 -1
  30. package/dist/esm/database/queryBuilder.js +1 -0
  31. package/dist/esm/database/queryBuilder.js.map +1 -1
  32. package/dist/esm/drizzle/index.js +11 -7
  33. package/dist/esm/drizzle/index.js.map +1 -1
  34. package/dist/esm/drizzle/onchain.js +18 -0
  35. package/dist/esm/drizzle/onchain.js.map +1 -1
  36. package/dist/esm/indexing/client.js +32 -25
  37. package/dist/esm/indexing/client.js.map +1 -1
  38. package/dist/esm/indexing/index.js +110 -178
  39. package/dist/esm/indexing/index.js.map +1 -1
  40. package/dist/esm/indexing/profile.js +1 -1
  41. package/dist/esm/indexing/profile.js.map +1 -1
  42. package/dist/esm/indexing-store/cache.js +196 -274
  43. package/dist/esm/indexing-store/cache.js.map +1 -1
  44. package/dist/esm/indexing-store/historical.js +17 -13
  45. package/dist/esm/indexing-store/historical.js.map +1 -1
  46. package/dist/esm/indexing-store/index.js +10 -1
  47. package/dist/esm/indexing-store/index.js.map +1 -1
  48. package/dist/esm/indexing-store/profile.js +3 -3
  49. package/dist/esm/indexing-store/profile.js.map +1 -1
  50. package/dist/esm/indexing-store/realtime.js +27 -2
  51. package/dist/esm/indexing-store/realtime.js.map +1 -1
  52. package/dist/esm/internal/errors.js +28 -0
  53. package/dist/esm/internal/errors.js.map +1 -1
  54. package/dist/esm/internal/metrics.js +279 -82
  55. package/dist/esm/internal/metrics.js.map +1 -1
  56. package/dist/esm/internal/options.js +1 -0
  57. package/dist/esm/internal/options.js.map +1 -1
  58. package/dist/esm/internal/telemetry.js +1 -1
  59. package/dist/esm/internal/telemetry.js.map +1 -1
  60. package/dist/esm/rpc/http.js +130 -0
  61. package/dist/esm/rpc/http.js.map +1 -0
  62. package/dist/esm/rpc/index.js +38 -7
  63. package/dist/esm/rpc/index.js.map +1 -1
  64. package/dist/esm/runtime/events.js +179 -212
  65. package/dist/esm/runtime/events.js.map +1 -1
  66. package/dist/esm/runtime/filter.js +71 -0
  67. package/dist/esm/runtime/filter.js.map +1 -1
  68. package/dist/esm/runtime/fragments.js +78 -73
  69. package/dist/esm/runtime/fragments.js.map +1 -1
  70. package/dist/esm/runtime/historical.js +306 -130
  71. package/dist/esm/runtime/historical.js.map +1 -1
  72. package/dist/esm/runtime/index.js +183 -58
  73. package/dist/esm/runtime/index.js.map +1 -1
  74. package/dist/esm/runtime/isolated.js +462 -0
  75. package/dist/esm/runtime/isolated.js.map +1 -0
  76. package/dist/esm/runtime/multichain.js +80 -73
  77. package/dist/esm/runtime/multichain.js.map +1 -1
  78. package/dist/esm/runtime/omnichain.js +82 -75
  79. package/dist/esm/runtime/omnichain.js.map +1 -1
  80. package/dist/esm/runtime/realtime.js +198 -66
  81. package/dist/esm/runtime/realtime.js.map +1 -1
  82. package/dist/esm/sync-historical/index.js +416 -457
  83. package/dist/esm/sync-historical/index.js.map +1 -1
  84. package/dist/esm/sync-realtime/bloom.js +3 -3
  85. package/dist/esm/sync-realtime/bloom.js.map +1 -1
  86. package/dist/esm/sync-realtime/index.js +27 -46
  87. package/dist/esm/sync-realtime/index.js.map +1 -1
  88. package/dist/esm/sync-store/index.js +112 -63
  89. package/dist/esm/sync-store/index.js.map +1 -1
  90. package/dist/esm/utils/abi.js +20 -32
  91. package/dist/esm/utils/abi.js.map +1 -1
  92. package/dist/esm/utils/chunk.js +8 -0
  93. package/dist/esm/utils/chunk.js.map +1 -0
  94. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  95. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  96. package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
  97. package/dist/esm/utils/sql-parse.js.map +1 -0
  98. package/dist/types/bin/commands/createViews.d.ts.map +1 -1
  99. package/dist/types/bin/commands/dev.d.ts.map +1 -1
  100. package/dist/types/bin/commands/prune.d.ts.map +1 -1
  101. package/dist/types/bin/commands/serve.d.ts.map +1 -1
  102. package/dist/types/bin/commands/start.d.ts.map +1 -1
  103. package/dist/types/bin/isolatedController.d.ts +13 -0
  104. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  105. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  106. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  107. package/dist/types/build/config.d.ts +29 -11
  108. package/dist/types/build/config.d.ts.map +1 -1
  109. package/dist/types/build/index.d.ts +3 -2
  110. package/dist/types/build/index.d.ts.map +1 -1
  111. package/dist/types/build/pre.d.ts +1 -1
  112. package/dist/types/build/pre.d.ts.map +1 -1
  113. package/dist/types/build/schema.d.ts +5 -3
  114. package/dist/types/build/schema.d.ts.map +1 -1
  115. package/dist/types/client/index.d.ts +1 -1
  116. package/dist/types/client/index.d.ts.map +1 -1
  117. package/dist/types/config/index.d.ts +3 -3
  118. package/dist/types/config/index.d.ts.map +1 -1
  119. package/dist/types/database/actions.d.ts +53 -7
  120. package/dist/types/database/actions.d.ts.map +1 -1
  121. package/dist/types/database/index.d.ts +21 -21
  122. package/dist/types/database/index.d.ts.map +1 -1
  123. package/dist/types/database/queryBuilder.d.ts.map +1 -1
  124. package/dist/types/drizzle/index.d.ts +4 -5
  125. package/dist/types/drizzle/index.d.ts.map +1 -1
  126. package/dist/types/drizzle/onchain.d.ts +6 -0
  127. package/dist/types/drizzle/onchain.d.ts.map +1 -1
  128. package/dist/types/indexing/client.d.ts.map +1 -1
  129. package/dist/types/indexing/index.d.ts +2 -5
  130. package/dist/types/indexing/index.d.ts.map +1 -1
  131. package/dist/types/indexing-store/cache.d.ts +3 -2
  132. package/dist/types/indexing-store/cache.d.ts.map +1 -1
  133. package/dist/types/indexing-store/historical.d.ts +2 -1
  134. package/dist/types/indexing-store/historical.d.ts.map +1 -1
  135. package/dist/types/indexing-store/index.d.ts +1 -0
  136. package/dist/types/indexing-store/index.d.ts.map +1 -1
  137. package/dist/types/indexing-store/realtime.d.ts +2 -1
  138. package/dist/types/indexing-store/realtime.d.ts.map +1 -1
  139. package/dist/types/internal/errors.d.ts +5 -0
  140. package/dist/types/internal/errors.d.ts.map +1 -1
  141. package/dist/types/internal/metrics.d.ts +21 -0
  142. package/dist/types/internal/metrics.d.ts.map +1 -1
  143. package/dist/types/internal/options.d.ts +2 -0
  144. package/dist/types/internal/options.d.ts.map +1 -1
  145. package/dist/types/internal/types.d.ts +66 -58
  146. package/dist/types/internal/types.d.ts.map +1 -1
  147. package/dist/types/rpc/http.d.ts +17 -0
  148. package/dist/types/rpc/http.d.ts.map +1 -0
  149. package/dist/types/rpc/index.d.ts.map +1 -1
  150. package/dist/types/runtime/events.d.ts +4 -4
  151. package/dist/types/runtime/events.d.ts.map +1 -1
  152. package/dist/types/runtime/filter.d.ts +5 -1
  153. package/dist/types/runtime/filter.d.ts.map +1 -1
  154. package/dist/types/runtime/fragments.d.ts +4 -3
  155. package/dist/types/runtime/fragments.d.ts.map +1 -1
  156. package/dist/types/runtime/historical.d.ts +29 -13
  157. package/dist/types/runtime/historical.d.ts.map +1 -1
  158. package/dist/types/runtime/index.d.ts +49 -6
  159. package/dist/types/runtime/index.d.ts.map +1 -1
  160. package/dist/types/runtime/init.d.ts +5 -5
  161. package/dist/types/runtime/init.d.ts.map +1 -1
  162. package/dist/types/runtime/isolated.d.ts +14 -0
  163. package/dist/types/runtime/isolated.d.ts.map +1 -0
  164. package/dist/types/runtime/multichain.d.ts.map +1 -1
  165. package/dist/types/runtime/omnichain.d.ts.map +1 -1
  166. package/dist/types/runtime/realtime.d.ts +21 -10
  167. package/dist/types/runtime/realtime.d.ts.map +1 -1
  168. package/dist/types/sync-historical/index.d.ts +18 -8
  169. package/dist/types/sync-historical/index.d.ts.map +1 -1
  170. package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
  171. package/dist/types/sync-realtime/index.d.ts +2 -2
  172. package/dist/types/sync-realtime/index.d.ts.map +1 -1
  173. package/dist/types/sync-store/index.d.ts +9 -9
  174. package/dist/types/sync-store/index.d.ts.map +1 -1
  175. package/dist/types/utils/abi.d.ts +3 -34
  176. package/dist/types/utils/abi.d.ts.map +1 -1
  177. package/dist/types/utils/chunk.d.ts +2 -0
  178. package/dist/types/utils/chunk.d.ts.map +1 -0
  179. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  180. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  181. package/dist/types/utils/sql-parse.d.ts +21 -0
  182. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  183. package/package.json +2 -2
  184. package/src/bin/commands/createViews.ts +35 -15
  185. package/src/bin/commands/dev.ts +43 -21
  186. package/src/bin/commands/prune.ts +6 -0
  187. package/src/bin/commands/serve.ts +4 -1
  188. package/src/bin/commands/start.ts +20 -5
  189. package/src/bin/isolatedController.ts +300 -0
  190. package/src/bin/isolatedWorker.ts +192 -0
  191. package/src/build/config.ts +570 -632
  192. package/src/build/index.ts +14 -14
  193. package/src/build/pre.ts +1 -4
  194. package/src/build/schema.ts +49 -4
  195. package/src/client/index.ts +386 -48
  196. package/src/config/index.ts +3 -3
  197. package/src/database/actions.ts +469 -120
  198. package/src/database/index.ts +85 -58
  199. package/src/database/queryBuilder.ts +1 -0
  200. package/src/drizzle/index.ts +15 -7
  201. package/src/drizzle/onchain.ts +19 -0
  202. package/src/indexing/client.ts +38 -25
  203. package/src/indexing/index.ts +137 -230
  204. package/src/indexing/profile.ts +1 -1
  205. package/src/indexing-store/cache.ts +285 -414
  206. package/src/indexing-store/historical.ts +20 -10
  207. package/src/indexing-store/index.ts +16 -0
  208. package/src/indexing-store/profile.ts +3 -3
  209. package/src/indexing-store/realtime.ts +28 -0
  210. package/src/internal/errors.ts +26 -0
  211. package/src/internal/metrics.ts +341 -111
  212. package/src/internal/options.ts +4 -0
  213. package/src/internal/telemetry.ts +1 -1
  214. package/src/internal/types.ts +70 -87
  215. package/src/rpc/http.ts +164 -0
  216. package/src/rpc/index.ts +39 -7
  217. package/src/runtime/events.ts +195 -240
  218. package/src/runtime/filter.ts +85 -1
  219. package/src/runtime/fragments.ts +109 -113
  220. package/src/runtime/historical.ts +467 -189
  221. package/src/runtime/index.ts +337 -69
  222. package/src/runtime/init.ts +5 -5
  223. package/src/runtime/isolated.ts +768 -0
  224. package/src/runtime/multichain.ts +137 -102
  225. package/src/runtime/omnichain.ts +138 -106
  226. package/src/runtime/realtime.ts +322 -123
  227. package/src/sync-historical/index.ts +556 -692
  228. package/src/sync-realtime/bloom.ts +7 -3
  229. package/src/sync-realtime/index.ts +31 -46
  230. package/src/sync-store/index.ts +189 -95
  231. package/src/utils/abi.ts +33 -90
  232. package/src/utils/chunk.ts +7 -0
  233. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  234. package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
  235. package/dist/esm/client/parse.js.map +0 -1
  236. package/dist/types/client/parse.d.ts +0 -14
  237. package/dist/types/client/parse.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import crypto from "node:crypto";
2
- import type { Database } from "@/database/index.js";
2
+ import type { QB } from "@/database/queryBuilder.js";
3
3
  import { extractBlockNumberParam } from "@/indexing/client.js";
4
4
  import type { Common } from "@/internal/common.js";
5
5
  import type { Logger } from "@/internal/logger.js";
@@ -7,7 +7,6 @@ import type {
7
7
  BlockFilter,
8
8
  Factory,
9
9
  Filter,
10
- FilterWithoutBlocks,
11
10
  Fragment,
12
11
  FragmentId,
13
12
  InternalBlock,
@@ -33,14 +32,24 @@ import type {
33
32
  } from "@/internal/types.js";
34
33
  import type { RequestParameters } from "@/rpc/index.js";
35
34
  import {
35
+ getFilterFactories,
36
36
  isAddressFactory,
37
37
  unionFilterIncludeBlock,
38
38
  unionFilterIncludeTrace,
39
39
  unionFilterIncludeTransaction,
40
40
  unionFilterIncludeTransactionReceipt,
41
41
  } from "@/runtime/filter.js";
42
- import { encodeFragment, getFragments } from "@/runtime/fragments.js";
42
+ import {
43
+ encodeFragment,
44
+ getFactoryFragments,
45
+ getFragments,
46
+ } from "@/runtime/fragments.js";
47
+ import type {
48
+ IntervalWithFactory,
49
+ IntervalWithFilter,
50
+ } from "@/runtime/index.js";
43
51
  import type { Interval } from "@/utils/interval.js";
52
+ import { intervalUnion } from "@/utils/interval.js";
44
53
  import { toLowerCase } from "@/utils/lowercase.js";
45
54
  import { orderObject } from "@/utils/order.js";
46
55
  import { startClock } from "@/utils/timer.js";
@@ -58,7 +67,11 @@ import {
58
67
  or,
59
68
  sql,
60
69
  } from "drizzle-orm";
61
- import { type PgColumn, unionAll } from "drizzle-orm/pg-core";
70
+ import {
71
+ type PgColumn,
72
+ type PgSelectBase,
73
+ unionAll,
74
+ } from "drizzle-orm/pg-core";
62
75
  import { type Address, hexToNumber, isHex } from "viem";
63
76
  import {
64
77
  encodeBlock,
@@ -72,7 +85,8 @@ import * as PONDER_SYNC from "./schema.js";
72
85
  export type SyncStore = {
73
86
  insertIntervals(
74
87
  args: {
75
- intervals: { filter: FilterWithoutBlocks; interval: Interval }[];
88
+ intervals: IntervalWithFilter[];
89
+ factoryIntervals: IntervalWithFactory[];
76
90
  chainId: number;
77
91
  },
78
92
  context?: { logger?: Logger },
@@ -80,7 +94,9 @@ export type SyncStore = {
80
94
  getIntervals(
81
95
  args: { filters: Filter[] },
82
96
  context?: { logger?: Logger },
83
- ): Promise<Map<Filter, { fragment: Fragment; intervals: Interval[] }[]>>;
97
+ ): Promise<
98
+ Map<Filter | Factory, { fragment: Fragment; intervals: Interval[] }[]>
99
+ >;
84
100
  insertChildAddresses(
85
101
  args: {
86
102
  factory: Factory;
@@ -186,14 +202,14 @@ export type SyncStore = {
186
202
 
187
203
  export const createSyncStore = ({
188
204
  common,
189
- database,
190
- }: {
191
- common: Common;
192
- database: Database;
193
- }): SyncStore => {
205
+ qb,
206
+ }: { common: Common; qb: QB<typeof PONDER_SYNC> }): SyncStore => {
194
207
  const syncStore = {
195
- insertIntervals: async ({ intervals, chainId }, context) => {
196
- if (intervals.length === 0) return;
208
+ insertIntervals: async (
209
+ { intervals, factoryIntervals, chainId },
210
+ context,
211
+ ) => {
212
+ if (intervals.length === 0 && factoryIntervals.length === 0) return;
197
213
 
198
214
  const perFragmentIntervals = new Map<FragmentId, Interval[]>();
199
215
  const values: (typeof PONDER_SYNC.intervals.$inferInsert)[] = [];
@@ -211,6 +227,17 @@ export const createSyncStore = ({
211
227
  }
212
228
  }
213
229
 
230
+ for (const { factory, interval } of factoryIntervals) {
231
+ for (const fragment of getFactoryFragments(factory)) {
232
+ const fragmentId = encodeFragment(fragment);
233
+ if (perFragmentIntervals.has(fragmentId) === false) {
234
+ perFragmentIntervals.set(fragmentId, []);
235
+ }
236
+
237
+ perFragmentIntervals.get(fragmentId)!.push(interval);
238
+ }
239
+ }
240
+
214
241
  // NOTE: In order to force proper range union behavior, `interval[1]` must
215
242
  // be rounded up.
216
243
 
@@ -236,7 +263,7 @@ export const createSyncStore = ({
236
263
  );
237
264
 
238
265
  for (let i = 0; i < values.length; i += batchSize) {
239
- await database.syncQB.wrap(
266
+ await qb.wrap(
240
267
  { label: "insert_intervals" },
241
268
  (db) =>
242
269
  db
@@ -251,30 +278,67 @@ export const createSyncStore = ({
251
278
  }
252
279
  },
253
280
  getIntervals: async ({ filters }, context) => {
254
- const queries = filters.flatMap((filter, i) => {
281
+ const queries: PgSelectBase<
282
+ "unnested",
283
+ {
284
+ mergedBlocks: SQL.Aliased<string>;
285
+ fragment: SQL.Aliased<unknown>;
286
+ },
287
+ "partial"
288
+ >[] = [];
289
+ let index = 0;
290
+
291
+ for (const filter of filters) {
255
292
  const fragments = getFragments(filter);
256
- return fragments.map((fragment, j) =>
257
- database.syncQB.raw
258
- .select({
259
- mergedBlocks: sql<string>`range_agg(unnested.blocks)`.as(
260
- "merged_blocks",
293
+
294
+ for (const fragment of fragments) {
295
+ queries.push(
296
+ qb.raw
297
+ .select({
298
+ mergedBlocks: sql<string>`range_agg(unnested.blocks)`.as(
299
+ "merged_blocks",
300
+ ),
301
+ fragment: sql.raw(`'${index++}'`).as("fragment"),
302
+ })
303
+ .from(
304
+ qb.raw
305
+ .select({ blocks: sql.raw("unnest(blocks)").as("blocks") })
306
+ .from(PONDER_SYNC.intervals)
307
+ .where(
308
+ sql.raw(
309
+ `fragment_id IN (${fragment.adjacentIds.map((id) => `'${id}'`).join(", ")})`,
310
+ ),
311
+ )
312
+ .as("unnested"),
261
313
  ),
262
- filter: sql.raw(`'${i}'`).as("filter"),
263
- fragment: sql.raw(`'${j}'`).as("fragment"),
264
- })
265
- .from(
266
- database.syncQB.raw
267
- .select({ blocks: sql.raw("unnest(blocks)").as("blocks") })
268
- .from(PONDER_SYNC.intervals)
269
- .where(
270
- sql.raw(
271
- `fragment_id IN (${fragment.adjacentIds.map((id) => `'${id}'`).join(", ")})`,
314
+ );
315
+
316
+ for (const factory of getFilterFactories(filter)) {
317
+ for (const fragment of getFactoryFragments(factory)) {
318
+ queries.push(
319
+ qb.raw
320
+ .select({
321
+ mergedBlocks: sql<string>`range_agg(unnested.blocks)`.as(
322
+ "merged_blocks",
323
+ ),
324
+ fragment: sql.raw(`'${index++}'`).as("fragment"),
325
+ })
326
+ .from(
327
+ qb.raw
328
+ .select({
329
+ blocks: sql.raw("unnest(blocks)").as("blocks"),
330
+ })
331
+ .from(PONDER_SYNC.intervals)
332
+ .where(
333
+ sql.raw(`fragment_id = '${encodeFragment(fragment)}'`),
334
+ )
335
+ .as("unnested"),
272
336
  ),
273
- )
274
- .as("unnested"),
275
- ),
276
- );
277
- });
337
+ );
338
+ }
339
+ }
340
+ }
341
+ }
278
342
 
279
343
  let rows: Awaited<(typeof queries)[number]> = [];
280
344
 
@@ -285,7 +349,7 @@ export const createSyncStore = ({
285
349
  const batchSize = 200;
286
350
 
287
351
  for (let i = 0; i < queries.length; i += batchSize) {
288
- const _rows = await database.syncQB.wrap(
352
+ const _rows = await qb.wrap(
289
353
  { label: "select_intervals" },
290
354
  () =>
291
355
  // @ts-expect-error
@@ -300,7 +364,7 @@ export const createSyncStore = ({
300
364
  }
301
365
  }
302
366
  } else {
303
- rows = await database.syncQB.wrap(
367
+ rows = await qb.wrap(
304
368
  { label: "select_intervals" },
305
369
  () => queries[0]!.execute(),
306
370
  context,
@@ -308,22 +372,22 @@ export const createSyncStore = ({
308
372
  }
309
373
 
310
374
  const result = new Map<
311
- Filter,
375
+ Filter | Factory,
312
376
  { fragment: Fragment; intervals: Interval[] }[]
313
377
  >();
314
378
 
315
379
  // NOTE: `interval[1]` must be rounded down in order to offset the previous
316
380
  // rounding.
317
381
 
318
- for (let i = 0; i < filters.length; i++) {
319
- const filter = filters[i]!;
382
+ index = 0;
383
+
384
+ for (const filter of filters) {
320
385
  const fragments = getFragments(filter);
321
386
  result.set(filter, []);
322
- for (let j = 0; j < fragments.length; j++) {
323
- const fragment = fragments[j]!;
387
+
388
+ for (const fragment of fragments) {
324
389
  const intervals = rows
325
- .filter((row) => row.filter === `${i}`)
326
- .filter((row) => row.fragment === `${j}`)
390
+ .filter((row) => row.fragment === `${index}`)
327
391
  .map((row) =>
328
392
  (row.mergedBlocks
329
393
  ? (JSON.parse(
@@ -333,7 +397,56 @@ export const createSyncStore = ({
333
397
  ).map((interval) => [interval[0], interval[1] - 1] as Interval),
334
398
  )[0]!;
335
399
 
400
+ index += 1;
401
+
336
402
  result.get(filter)!.push({ fragment: fragment.fragment, intervals });
403
+
404
+ for (const factory of getFilterFactories(filter)) {
405
+ result.set(factory, []);
406
+ for (const fragment of getFactoryFragments(factory)) {
407
+ const intervals = rows
408
+ .filter((row) => row.fragment === `${index}`)
409
+ .map((row) =>
410
+ (row.mergedBlocks
411
+ ? (JSON.parse(
412
+ `[${row.mergedBlocks.slice(1, -1)}]`,
413
+ ) as Interval[])
414
+ : []
415
+ ).map(
416
+ (interval) => [interval[0], interval[1] - 1] as Interval,
417
+ ),
418
+ )[0]!;
419
+
420
+ index += 1;
421
+
422
+ result.get(factory)!.push({ fragment, intervals });
423
+ }
424
+
425
+ // Note: This is a stand-in for a migration to the `intervals` table
426
+ // required in `v0.15`. It is an invariant that filter with factories
427
+ // have a row in the intervals table for both the filter and the factory.
428
+ // If this invariant is broken, it must be because of the migration from
429
+ // `v0.14` to `v0.15`. In this case, we can assume that the factory interval
430
+ // is the same as the filter interval.
431
+
432
+ const filterIntervals = intervalUnion(
433
+ result.get(filter)!.flatMap(({ intervals }) => intervals),
434
+ );
435
+ const factoryIntervals = intervalUnion(
436
+ result.get(factory)!.flatMap(({ intervals }) => intervals),
437
+ );
438
+
439
+ if (
440
+ filterIntervals.length > 0 &&
441
+ factoryIntervals.length === 0 &&
442
+ filter.fromBlock === factory.fromBlock &&
443
+ filter.toBlock === factory.toBlock
444
+ ) {
445
+ for (const factoryInterval of result.get(factory)!) {
446
+ factoryInterval.intervals = filterIntervals;
447
+ }
448
+ }
449
+ }
337
450
  }
338
451
  }
339
452
 
@@ -353,8 +466,8 @@ export const createSyncStore = ({
353
466
 
354
467
  const values: (typeof PONDER_SYNC.factoryAddresses.$inferInsert)[] = [];
355
468
 
356
- const factoryInsert = database.syncQB.raw.$with("factory_insert").as(
357
- database.syncQB.raw
469
+ const factoryInsert = qb.raw.$with("factory_insert").as(
470
+ qb.raw
358
471
  .insert(PONDER_SYNC.factories)
359
472
  .values({ factory: _factory })
360
473
  // @ts-expect-error bug with drizzle-orm
@@ -376,7 +489,7 @@ export const createSyncStore = ({
376
489
  }
377
490
 
378
491
  for (let i = 0; i < values.length; i += batchSize) {
379
- await database.syncQB.wrap(
492
+ await qb.wrap(
380
493
  { label: "insert_child_addresses" },
381
494
  (db) =>
382
495
  db
@@ -390,8 +503,8 @@ export const createSyncStore = ({
390
503
  getChildAddresses: ({ factory }, context) => {
391
504
  const { id, ..._factory } = factory;
392
505
 
393
- const factoryInsert = database.syncQB.raw.$with("factory_insert").as(
394
- database.syncQB.raw
506
+ const factoryInsert = qb.raw.$with("factory_insert").as(
507
+ qb.raw
395
508
  .insert(PONDER_SYNC.factories)
396
509
  .values({ factory: _factory })
397
510
  // @ts-expect-error bug with drizzle-orm
@@ -402,7 +515,7 @@ export const createSyncStore = ({
402
515
  }),
403
516
  );
404
517
 
405
- return database.syncQB
518
+ return qb
406
519
  .wrap(
407
520
  { label: "select_child_addresses" },
408
521
  (db) =>
@@ -416,9 +529,7 @@ export const createSyncStore = ({
416
529
  .where(
417
530
  eq(
418
531
  PONDER_SYNC.factoryAddresses.factoryId,
419
- database.syncQB.raw
420
- .select({ id: factoryInsert.id })
421
- .from(factoryInsert),
532
+ qb.raw.select({ id: factoryInsert.id }).from(factoryInsert),
422
533
  ),
423
534
  ),
424
535
  context,
@@ -437,7 +548,7 @@ export const createSyncStore = ({
437
548
  });
438
549
  },
439
550
  getSafeCrashRecoveryBlock: async ({ chainId, timestamp }, context) => {
440
- const rows = await database.syncQB.wrap(
551
+ const rows = await qb.wrap(
441
552
  { label: "select_crash_recovery_block" },
442
553
  (db) =>
443
554
  db
@@ -476,7 +587,7 @@ export const createSyncStore = ({
476
587
  // in the db.
477
588
 
478
589
  for (let i = 0; i < logs.length; i += batchSize) {
479
- await database.syncQB.wrap(
590
+ await qb.wrap(
480
591
  { label: "insert_logs" },
481
592
  (db) =>
482
593
  db
@@ -508,7 +619,7 @@ export const createSyncStore = ({
508
619
  );
509
620
 
510
621
  for (let i = 0; i < blocks.length; i += batchSize) {
511
- await database.syncQB.wrap(
622
+ await qb.wrap(
512
623
  { label: "insert_blocks" },
513
624
  (db) =>
514
625
  db
@@ -541,7 +652,7 @@ export const createSyncStore = ({
541
652
  );
542
653
 
543
654
  for (let i = 0; i < transactions.length; i += batchSize) {
544
- await database.syncQB.wrap(
655
+ await qb.wrap(
545
656
  { label: "insert_transactions" },
546
657
  (db) =>
547
658
  db
@@ -583,7 +694,7 @@ export const createSyncStore = ({
583
694
  );
584
695
 
585
696
  for (let i = 0; i < transactionReceipts.length; i += batchSize) {
586
- await database.syncQB.wrap(
697
+ await qb.wrap(
587
698
  { label: "insert_transaction_receipts" },
588
699
  (db) =>
589
700
  db
@@ -627,7 +738,7 @@ export const createSyncStore = ({
627
738
  );
628
739
 
629
740
  for (let i = 0; i < traces.length; i += batchSize) {
630
- await database.syncQB.wrap(
741
+ await qb.wrap(
631
742
  { label: "insert_traces" },
632
743
  (db) =>
633
744
  db
@@ -730,7 +841,7 @@ export const createSyncStore = ({
730
841
  blockSelect[column] = PONDER_SYNC.blocks[column];
731
842
  }
732
843
 
733
- const blocksQuery = database.syncQB.raw
844
+ const blocksQuery = qb.raw
734
845
  .select(blockSelect)
735
846
  .from(PONDER_SYNC.blocks)
736
847
  .where(
@@ -757,7 +868,7 @@ export const createSyncStore = ({
757
868
  transactionSelect[column] = PONDER_SYNC.transactions[column];
758
869
  }
759
870
 
760
- const transactionsQuery = database.syncQB.raw
871
+ const transactionsQuery = qb.raw
761
872
  .select(transactionSelect)
762
873
  .from(PONDER_SYNC.transactions)
763
874
  .where(
@@ -787,7 +898,7 @@ export const createSyncStore = ({
787
898
  PONDER_SYNC.transactionReceipts[column];
788
899
  }
789
900
 
790
- const transactionReceiptsQuery = database.syncQB.raw
901
+ const transactionReceiptsQuery = qb.raw
791
902
  .select(transactionReceiptSelect)
792
903
  .from(PONDER_SYNC.transactionReceipts)
793
904
  .where(
@@ -821,7 +932,7 @@ export const createSyncStore = ({
821
932
  traceSelect[column] = PONDER_SYNC.traces[column];
822
933
  }
823
934
 
824
- const tracesQuery = database.syncQB.raw
935
+ const tracesQuery = qb.raw
825
936
  .select(traceSelect)
826
937
  .from(PONDER_SYNC.traces)
827
938
  .where(
@@ -842,7 +953,7 @@ export const createSyncStore = ({
842
953
  )
843
954
  .limit(limit);
844
955
 
845
- const logsQuery = database.syncQB.raw
956
+ const logsQuery = qb.raw
846
957
  .select({
847
958
  blockNumber: PONDER_SYNC.logs.blockNumber,
848
959
  logIndex: PONDER_SYNC.logs.logIndex,
@@ -879,35 +990,27 @@ export const createSyncStore = ({
879
990
  tracesRows,
880
991
  ] = await Promise.all([
881
992
  shouldQueryBlocks
882
- ? database.syncQB.wrap({ label: "select_blocks" }, () => blocksQuery)
993
+ ? qb.wrap({ label: "select_blocks" }, () => blocksQuery)
883
994
  : [],
884
995
  shouldQueryTransactions
885
- ? database.syncQB.wrap(
996
+ ? qb.wrap(
886
997
  { label: "select_transactions" },
887
998
  () => transactionsQuery,
888
999
  context,
889
1000
  )
890
1001
  : [],
891
1002
  shouldQueryTransactionReceipts
892
- ? database.syncQB.wrap(
1003
+ ? qb.wrap(
893
1004
  { label: "select_transaction_receipts" },
894
1005
  () => transactionReceiptsQuery,
895
1006
  context,
896
1007
  )
897
1008
  : [],
898
1009
  shouldQueryLogs
899
- ? database.syncQB.wrap(
900
- { label: "select_logs" },
901
- () => logsQuery,
902
- context,
903
- )
1010
+ ? qb.wrap({ label: "select_logs" }, () => logsQuery, context)
904
1011
  : [],
905
1012
  shouldQueryTraces
906
- ? database.syncQB.wrap(
907
- { label: "select_traces" },
908
- () => tracesQuery,
909
- context,
910
- )
1013
+ ? qb.wrap({ label: "select_traces" }, () => tracesQuery, context)
911
1014
  : [],
912
1015
  ]);
913
1016
 
@@ -1158,7 +1261,7 @@ export const createSyncStore = ({
1158
1261
  result,
1159
1262
  }));
1160
1263
 
1161
- await database.syncQB.wrap(
1264
+ await qb.wrap(
1162
1265
  { label: "insert_rpc_requests" },
1163
1266
  (db) =>
1164
1267
  db
@@ -1216,7 +1319,7 @@ export const createSyncStore = ({
1216
1319
  );
1217
1320
 
1218
1321
  const result = await Promise.all([
1219
- database.syncQB.wrap(
1322
+ qb.wrap(
1220
1323
  { label: "select_rpc_requests" },
1221
1324
  (db) =>
1222
1325
  db
@@ -1242,7 +1345,7 @@ export const createSyncStore = ({
1242
1345
  ),
1243
1346
  nonBlockRequestHashes.length === 0
1244
1347
  ? []
1245
- : database.syncQB.wrap(
1348
+ : qb.wrap(
1246
1349
  { label: "select_rpc_requests" },
1247
1350
  (db) =>
1248
1351
  db
@@ -1278,7 +1381,7 @@ export const createSyncStore = ({
1278
1381
  return requestHashes.map((requestHash) => results.get(requestHash));
1279
1382
  }
1280
1383
 
1281
- const result = await database.syncQB.wrap(
1384
+ const result = await qb.wrap(
1282
1385
  { label: "select_rpc_requests" },
1283
1386
  (db) =>
1284
1387
  db
@@ -1311,7 +1414,7 @@ export const createSyncStore = ({
1311
1414
 
1312
1415
  const numbers = blocks.map(({ number }) => BigInt(hexToNumber(number)));
1313
1416
 
1314
- await database.syncQB.wrap(
1417
+ await qb.wrap(
1315
1418
  { label: "delete_rpc_requests" },
1316
1419
  (db) =>
1317
1420
  db
@@ -1326,7 +1429,7 @@ export const createSyncStore = ({
1326
1429
  );
1327
1430
  },
1328
1431
  pruneByChain: async ({ chainId }, context) =>
1329
- database.syncQB.transaction(async (tx) => {
1432
+ qb.transaction(async (tx) => {
1330
1433
  await tx.wrap(
1331
1434
  { label: "delete_logs" },
1332
1435
  (db) =>
@@ -1512,18 +1615,9 @@ export const traceFilter = (filter: TraceFilter): SQL => {
1512
1615
  }
1513
1616
 
1514
1617
  if (filter.functionSelector !== undefined) {
1515
- if (Array.isArray(filter.functionSelector)) {
1516
- conditions.push(
1517
- inArray(
1518
- sql`substring(traces.input from 1 for 10)`,
1519
- filter.functionSelector,
1520
- ),
1521
- );
1522
- } else {
1523
- conditions.push(
1524
- eq(sql`substring(traces.input from 1 for 10)`, filter.functionSelector),
1525
- );
1526
- }
1618
+ conditions.push(
1619
+ eq(sql`substring(traces.input from 1 for 10)`, filter.functionSelector),
1620
+ );
1527
1621
  }
1528
1622
 
1529
1623
  if (filter.fromBlock !== undefined) {