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,11 +1,12 @@
1
+ import type { Database } from "@/database/index.js";
1
2
  import type { Common } from "@/internal/common.js";
2
3
  import type {
3
4
  Chain,
4
5
  Event,
6
+ EventCallback,
5
7
  Factory,
6
8
  Filter,
7
9
  IndexingBuild,
8
- Source,
9
10
  SyncBlock,
10
11
  SyncBlockHeader,
11
12
  } from "@/internal/types.js";
@@ -23,7 +24,7 @@ import {
23
24
  type RealtimeSyncEvent,
24
25
  createRealtimeSync,
25
26
  } from "@/sync-realtime/index.js";
26
- import type { SyncStore } from "@/sync-store/index.js";
27
+ import { createSyncStore } from "@/sync-store/index.js";
27
28
  import {
28
29
  ZERO_CHECKPOINT_STRING,
29
30
  blockToCheckpoint,
@@ -36,9 +37,11 @@ import {
36
37
  mergeAsyncGenerators,
37
38
  } from "@/utils/generators.js";
38
39
  import { type Interval, intervalIntersection } from "@/utils/interval.js";
40
+ import { promiseAllSettledWithThrow } from "@/utils/promiseAllSettledWithThrow.js";
39
41
  import { promiseWithResolvers } from "@/utils/promiseWithResolvers.js";
40
42
  import { startClock } from "@/utils/timer.js";
41
43
  import { type Address, hexToNumber } from "viem";
44
+ import { getFilterFactories } from "./filter.js";
42
45
  import type { ChildAddresses, SyncProgress } from "./index.js";
43
46
  import { getOmnichainCheckpoint } from "./omnichain.js";
44
47
 
@@ -57,7 +60,7 @@ export async function* getRealtimeEventsOmnichain(params: {
57
60
  common: Common;
58
61
  indexingBuild: Pick<
59
62
  IndexingBuild,
60
- "sources" | "chains" | "rpcs" | "finalizedBlocks"
63
+ "eventCallbacks" | "chains" | "rpcs" | "finalizedBlocks"
61
64
  >;
62
65
  perChainSync: Map<
63
66
  Chain,
@@ -70,7 +73,7 @@ export async function* getRealtimeEventsOmnichain(params: {
70
73
  >[];
71
74
  }
72
75
  >;
73
- syncStore: SyncStore;
76
+ database: Database;
74
77
  pendingEvents: Event[];
75
78
  }): AsyncGenerator<RealtimeEvent> {
76
79
  const eventGenerators = Array.from(params.perChainSync.entries())
@@ -92,9 +95,10 @@ export async function* getRealtimeEventsOmnichain(params: {
92
95
 
93
96
  const rpc =
94
97
  params.indexingBuild.rpcs[params.indexingBuild.chains.indexOf(chain)]!;
95
- const sources = params.indexingBuild.sources.filter(
96
- ({ filter }) => filter.chainId === chain.id,
97
- );
98
+ const eventCallbacks =
99
+ params.indexingBuild.eventCallbacks[
100
+ params.indexingBuild.chains.findIndex((c) => c.id === chain.id)
101
+ ]!;
98
102
 
99
103
  params.common.metrics.ponder_sync_is_realtime.set(
100
104
  { chain: chain.name },
@@ -119,10 +123,10 @@ export async function* getRealtimeEventsOmnichain(params: {
119
123
  common: params.common,
120
124
  chain,
121
125
  rpc,
122
- sources,
126
+ eventCallbacks,
123
127
  syncProgress,
124
128
  childAddresses,
125
- syncStore: params.syncStore,
129
+ database: params.database,
126
130
  }),
127
131
  100,
128
132
  bufferCallback,
@@ -150,23 +154,24 @@ export async function* getRealtimeEventsOmnichain(params: {
150
154
  const { syncProgress, childAddresses, unfinalizedBlocks } =
151
155
  params.perChainSync.get(chain)!;
152
156
 
153
- const sources = params.indexingBuild.sources.filter(
154
- ({ filter }) => filter.chainId === chain.id,
155
- );
157
+ const eventCallbacks =
158
+ params.indexingBuild.eventCallbacks[
159
+ params.indexingBuild.chains.findIndex((c) => c.id === chain.id)
160
+ ]!;
156
161
 
157
162
  await handleRealtimeSyncEvent(event, {
158
163
  common: params.common,
159
164
  chain,
160
- sources,
165
+ eventCallbacks,
161
166
  syncProgress,
162
167
  unfinalizedBlocks,
163
- syncStore: params.syncStore,
168
+ database: params.database,
164
169
  });
165
170
 
166
171
  switch (event.type) {
167
172
  case "block": {
168
173
  const events = buildEvents({
169
- sources,
174
+ eventCallbacks,
170
175
  chainId: chain.id,
171
176
  blocks: [syncBlockToInternal({ block: event.block })],
172
177
  logs: event.logs.map((log) => syncLogToInternal({ log })),
@@ -198,7 +203,12 @@ export async function* getRealtimeEventsOmnichain(params: {
198
203
  event_count: events.length,
199
204
  });
200
205
 
201
- const decodedEvents = decodeEvents(params.common, sources, events);
206
+ const decodedEvents = decodeEvents(
207
+ params.common,
208
+ chain,
209
+ eventCallbacks,
210
+ events,
211
+ );
202
212
 
203
213
  params.common.logger.trace({
204
214
  msg: "Decoded block events",
@@ -274,7 +284,7 @@ export async function* getRealtimeEventsOmnichain(params: {
274
284
  case "reorg": {
275
285
  const isReorgedEvent = (_event: Event) => {
276
286
  if (
277
- _event.chainId === chain.id &&
287
+ _event.chain.id === chain.id &&
278
288
  Number(_event.event.block.number) > hexToNumber(event.block.number)
279
289
  ) {
280
290
  return true;
@@ -317,7 +327,7 @@ export async function* getRealtimeEventsMultichain(params: {
317
327
  common: Common;
318
328
  indexingBuild: Pick<
319
329
  IndexingBuild,
320
- "sources" | "chains" | "rpcs" | "finalizedBlocks"
330
+ "eventCallbacks" | "chains" | "rpcs" | "finalizedBlocks"
321
331
  >;
322
332
  perChainSync: Map<
323
333
  Chain,
@@ -330,7 +340,7 @@ export async function* getRealtimeEventsMultichain(params: {
330
340
  >[];
331
341
  }
332
342
  >;
333
- syncStore: SyncStore;
343
+ database: Database;
334
344
  }): AsyncGenerator<RealtimeEvent> {
335
345
  const eventGenerators = Array.from(params.perChainSync.entries())
336
346
  .map(([chain, { syncProgress, childAddresses }]) => {
@@ -351,9 +361,10 @@ export async function* getRealtimeEventsMultichain(params: {
351
361
 
352
362
  const rpc =
353
363
  params.indexingBuild.rpcs[params.indexingBuild.chains.indexOf(chain)]!;
354
- const sources = params.indexingBuild.sources.filter(
355
- ({ filter }) => filter.chainId === chain.id,
356
- );
364
+ const eventCallbacks =
365
+ params.indexingBuild.eventCallbacks[
366
+ params.indexingBuild.chains.findIndex((c) => c.id === chain.id)
367
+ ]!;
357
368
 
358
369
  params.common.metrics.ponder_sync_is_realtime.set(
359
370
  { chain: chain.name },
@@ -378,10 +389,10 @@ export async function* getRealtimeEventsMultichain(params: {
378
389
  common: params.common,
379
390
  chain,
380
391
  rpc,
381
- sources,
392
+ eventCallbacks,
382
393
  syncProgress,
383
394
  childAddresses,
384
- syncStore: params.syncStore,
395
+ database: params.database,
385
396
  }),
386
397
  100,
387
398
  bufferCallback,
@@ -405,23 +416,24 @@ export async function* getRealtimeEventsMultichain(params: {
405
416
  const { syncProgress, childAddresses, unfinalizedBlocks } =
406
417
  params.perChainSync.get(chain)!;
407
418
 
408
- const sources = params.indexingBuild.sources.filter(
409
- ({ filter }) => filter.chainId === chain.id,
410
- );
419
+ const eventCallbacks =
420
+ params.indexingBuild.eventCallbacks[
421
+ params.indexingBuild.chains.findIndex((c) => c.id === chain.id)
422
+ ]!;
411
423
 
412
424
  await handleRealtimeSyncEvent(event, {
413
425
  common: params.common,
414
426
  chain,
415
- sources,
427
+ eventCallbacks,
416
428
  syncProgress,
417
429
  unfinalizedBlocks,
418
- syncStore: params.syncStore,
430
+ database: params.database,
419
431
  });
420
432
 
421
433
  switch (event.type) {
422
434
  case "block": {
423
435
  const events = buildEvents({
424
- sources,
436
+ eventCallbacks,
425
437
  chainId: chain.id,
426
438
  blocks: [syncBlockToInternal({ block: event.block })],
427
439
  logs: event.logs.map((log) => syncLogToInternal({ log })),
@@ -453,7 +465,12 @@ export async function* getRealtimeEventsMultichain(params: {
453
465
  event_count: events.length,
454
466
  });
455
467
 
456
- const decodedEvents = decodeEvents(params.common, sources, events);
468
+ const decodedEvents = decodeEvents(
469
+ params.common,
470
+ chain,
471
+ eventCallbacks,
472
+ events,
473
+ );
457
474
 
458
475
  params.common.logger.trace({
459
476
  msg: "Decoded block events",
@@ -498,7 +515,7 @@ export async function* getRealtimeEventsMultichain(params: {
498
515
 
499
516
  for (const [index, event] of executedEvents.entries()) {
500
517
  const _chain = params.indexingBuild.chains.find(
501
- (c) => c.id === event.chainId,
518
+ (c) => c.id === event.chain.id,
502
519
  )!;
503
520
  const _checkpoint = params.perChainSync
504
521
  .get(_chain)!
@@ -531,7 +548,7 @@ export async function* getRealtimeEventsMultichain(params: {
531
548
  case "reorg": {
532
549
  const isReorgedEvent = (_event: Event) => {
533
550
  if (
534
- _event.chainId === chain.id &&
551
+ _event.chain.id === chain.id &&
535
552
  Number(_event.event.block.number) > hexToNumber(event.block.number)
536
553
  ) {
537
554
  return true;
@@ -544,7 +561,7 @@ export async function* getRealtimeEventsMultichain(params: {
544
561
  // index of the first reorged event
545
562
  let reorgIndex: number | undefined = undefined;
546
563
  for (const [index, event] of executedEvents.entries()) {
547
- if (event.chainId === chain.id && event.checkpoint > checkpoint) {
564
+ if (event.chain.id === chain.id && event.checkpoint > checkpoint) {
548
565
  reorgIndex = index;
549
566
  break;
550
567
  }
@@ -574,14 +591,179 @@ export async function* getRealtimeEventsMultichain(params: {
574
591
  }
575
592
  }
576
593
 
594
+ export async function* getRealtimeEventsIsolated(params: {
595
+ common: Common;
596
+ indexingBuild: Pick<
597
+ IndexingBuild,
598
+ "eventCallbacks" | "chains" | "rpcs" | "finalizedBlocks"
599
+ >;
600
+ chain: Chain;
601
+ syncProgress: SyncProgress;
602
+ childAddresses: ChildAddresses;
603
+ unfinalizedBlocks: Omit<
604
+ Extract<RealtimeSyncEvent, { type: "block" }>,
605
+ "type"
606
+ >[];
607
+ database: Database;
608
+ }): AsyncGenerator<RealtimeEvent> {
609
+ if (params.syncProgress.isEnd()) {
610
+ params.common.logger.info({
611
+ msg: "Skipped live indexing (chain only requires backfill indexing)",
612
+ chain: params.chain.name,
613
+ chain_id: params.chain.id,
614
+ end_block: hexToNumber(params.syncProgress.end!.number),
615
+ });
616
+
617
+ params.common.metrics.ponder_sync_is_complete.set(
618
+ { chain: params.chain.name },
619
+ 1,
620
+ );
621
+ return;
622
+ }
623
+
624
+ const rpc =
625
+ params.indexingBuild.rpcs[
626
+ params.indexingBuild.chains.indexOf(params.chain)
627
+ ]!;
628
+ const eventCallbacks =
629
+ params.indexingBuild.eventCallbacks[
630
+ params.indexingBuild.chains.indexOf(params.chain)
631
+ ]!;
632
+
633
+ params.common.metrics.ponder_sync_is_realtime.set(
634
+ { chain: params.chain.name },
635
+ 1,
636
+ );
637
+
638
+ const bufferCallback = (bufferSize: number) => {
639
+ // Note: Only log when the buffer size is greater than 1 because
640
+ // a buffer size of 1 is not backpressure.
641
+ if (bufferSize === 1) return;
642
+ params.common.logger.trace({
643
+ msg: "Detected live indexing backpressure",
644
+ chain: params.chain.name,
645
+ chain_id: params.chain.id,
646
+ buffer_size: bufferSize,
647
+ indexing_step: "order block events",
648
+ });
649
+ };
650
+
651
+ const eventGenerator = bufferAsyncGenerator(
652
+ getRealtimeEventGenerator({
653
+ common: params.common,
654
+ chain: params.chain,
655
+ rpc,
656
+ eventCallbacks,
657
+ syncProgress: params.syncProgress,
658
+ childAddresses: params.childAddresses,
659
+ database: params.database,
660
+ }),
661
+ 100,
662
+ bufferCallback,
663
+ );
664
+
665
+ for await (const { chain, event } of eventGenerator) {
666
+ await handleRealtimeSyncEvent(event, {
667
+ common: params.common,
668
+ chain,
669
+ eventCallbacks,
670
+ syncProgress: params.syncProgress,
671
+ unfinalizedBlocks: params.unfinalizedBlocks,
672
+ database: params.database,
673
+ });
674
+
675
+ switch (event.type) {
676
+ case "block": {
677
+ const rawEvents = buildEvents({
678
+ eventCallbacks,
679
+ chainId: chain.id,
680
+ blocks: [syncBlockToInternal({ block: event.block })],
681
+ logs: event.logs.map((log) => syncLogToInternal({ log })),
682
+ transactions: event.transactions.map((transaction) =>
683
+ syncTransactionToInternal({ transaction }),
684
+ ),
685
+ transactionReceipts: event.transactionReceipts.map(
686
+ (transactionReceipt) =>
687
+ syncTransactionReceiptToInternal({ transactionReceipt }),
688
+ ),
689
+ traces: event.traces.map((trace) =>
690
+ syncTraceToInternal({
691
+ trace,
692
+ block: event.block,
693
+ transaction: event.transactions.find(
694
+ (t) => t.hash === trace.transactionHash,
695
+ )!,
696
+ }),
697
+ ),
698
+ childAddresses: params.childAddresses,
699
+ });
700
+
701
+ params.common.logger.trace({
702
+ msg: "Constructed events from block",
703
+ chain: chain.name,
704
+ chain_id: chain.id,
705
+ number: hexToNumber(event.block.number),
706
+ hash: event.block.hash,
707
+ event_count: rawEvents.length,
708
+ });
709
+
710
+ const events = decodeEvents(
711
+ params.common,
712
+ chain,
713
+ eventCallbacks,
714
+ rawEvents,
715
+ );
716
+
717
+ params.common.logger.trace({
718
+ msg: "Decoded block events",
719
+ chain: chain.name,
720
+ chain_id: chain.id,
721
+ number: hexToNumber(event.block.number),
722
+ hash: event.block.hash,
723
+ event_count: events.length,
724
+ });
725
+
726
+ const checkpoint = params.syncProgress.getCheckpoint({
727
+ tag: "current",
728
+ });
729
+
730
+ yield {
731
+ type: "block",
732
+ events,
733
+ chain,
734
+ checkpoint,
735
+ blockCallback: event.blockCallback,
736
+ };
737
+ break;
738
+ }
739
+ case "finalize": {
740
+ const checkpoint = params.syncProgress.getCheckpoint({
741
+ tag: "finalized",
742
+ });
743
+
744
+ yield { type: "finalize", chain, checkpoint };
745
+ break;
746
+ }
747
+ case "reorg": {
748
+ const checkpoint = params.syncProgress.getCheckpoint({
749
+ tag: "current",
750
+ });
751
+
752
+ yield { type: "reorg", chain, checkpoint };
753
+ break;
754
+ }
755
+ }
756
+ }
757
+ }
758
+
577
759
  export async function* getRealtimeEventGenerator(params: {
578
760
  common: Common;
579
761
  chain: Chain;
580
762
  rpc: Rpc;
581
- sources: Source[];
763
+ eventCallbacks: EventCallback[];
582
764
  syncProgress: SyncProgress;
583
765
  childAddresses: ChildAddresses;
584
- syncStore: SyncStore;
766
+ database: Database;
585
767
  }) {
586
768
  const realtimeSync = createRealtimeSync(params);
587
769
 
@@ -689,13 +871,13 @@ export async function handleRealtimeSyncEvent(
689
871
  params: {
690
872
  common: Common;
691
873
  chain: Chain;
692
- sources: Source[];
874
+ eventCallbacks: EventCallback[];
693
875
  syncProgress: SyncProgress;
694
876
  unfinalizedBlocks: Omit<
695
877
  Extract<RealtimeSyncEvent, { type: "block" }>,
696
878
  "type"
697
879
  >[];
698
- syncStore: SyncStore;
880
+ database: Database;
699
881
  },
700
882
  ) {
701
883
  switch (event.type) {
@@ -763,96 +945,110 @@ export async function handleRealtimeSyncEvent(
763
945
  logger: params.common.logger.child({ action: "finalize_block_range" }),
764
946
  };
765
947
 
766
- await Promise.all([
767
- params.syncStore.insertBlocks(
768
- {
769
- blocks: finalizedBlocks
770
- .filter(({ hasMatchedFilter }) => hasMatchedFilter)
771
- .map(({ block }) => block),
772
- chainId: params.chain.id,
773
- },
774
- context,
775
- ),
776
- params.syncStore.insertTransactions(
777
- {
778
- transactions: finalizedBlocks.flatMap(
779
- ({ transactions }) => transactions,
780
- ),
781
- chainId: params.chain.id,
782
- },
783
- context,
784
- ),
785
- params.syncStore.insertTransactionReceipts(
786
- {
787
- transactionReceipts: finalizedBlocks.flatMap(
788
- ({ transactionReceipts }) => transactionReceipts,
789
- ),
790
- chainId: params.chain.id,
791
- },
792
- context,
793
- ),
794
- params.syncStore.insertLogs(
795
- {
796
- logs: finalizedBlocks.flatMap(({ logs }) => logs),
797
- chainId: params.chain.id,
798
- },
799
- context,
800
- ),
801
- params.syncStore.insertTraces(
802
- {
803
- traces: finalizedBlocks.flatMap(({ traces, block, transactions }) =>
804
- traces.map((trace) => ({
805
- trace,
806
- block: block as SyncBlock, // SyncBlock is expected for traces.length !== 0
807
- transaction: transactions.find(
808
- (t) => t.hash === trace.transactionHash,
809
- )!,
810
- })),
811
- ),
812
- chainId: params.chain.id,
813
- },
814
- context,
815
- ),
816
- ...Array.from(childAddresses.entries()).map(
817
- ([factory, childAddresses]) =>
818
- params.syncStore.insertChildAddresses(
819
- {
820
- factory,
821
- childAddresses,
822
- chainId: params.chain.id,
823
- },
824
- context,
825
- ),
826
- ),
827
- ]);
828
-
829
- // Add corresponding intervals to the sync-store
830
- // Note: this should happen after insertion so the database doesn't become corrupted
948
+ await params.database.syncQB.transaction(
949
+ async (tx) => {
950
+ const syncStore = createSyncStore({ common: params.common, qb: tx });
831
951
 
832
- const syncedIntervals: {
833
- interval: Interval;
834
- filter: Filter;
835
- }[] = [];
836
-
837
- for (const { filter } of params.sources) {
838
- const intervals = intervalIntersection(
839
- [finalizedInterval],
840
- [[filter.fromBlock ?? 0, filter.toBlock ?? Number.POSITIVE_INFINITY]],
841
- );
952
+ await promiseAllSettledWithThrow([
953
+ syncStore.insertBlocks({
954
+ blocks: finalizedBlocks
955
+ .filter(({ hasMatchedFilter }) => hasMatchedFilter)
956
+ .map(({ block }) => block),
957
+ chainId: params.chain.id,
958
+ }),
959
+ syncStore.insertTransactions({
960
+ transactions: finalizedBlocks.flatMap(
961
+ ({ transactions }) => transactions,
962
+ ),
963
+ chainId: params.chain.id,
964
+ }),
965
+ syncStore.insertTransactionReceipts({
966
+ transactionReceipts: finalizedBlocks.flatMap(
967
+ ({ transactionReceipts }) => transactionReceipts,
968
+ ),
969
+ chainId: params.chain.id,
970
+ }),
971
+ syncStore.insertLogs({
972
+ logs: finalizedBlocks.flatMap(({ logs }) => logs),
973
+ chainId: params.chain.id,
974
+ }),
975
+ syncStore.insertTraces({
976
+ traces: finalizedBlocks.flatMap(
977
+ ({ traces, block, transactions }) =>
978
+ traces.map((trace) => ({
979
+ trace,
980
+ block: block as SyncBlock, // SyncBlock is expected for traces.length !== 0
981
+ transaction: transactions.find(
982
+ (t) => t.hash === trace.transactionHash,
983
+ )!,
984
+ })),
985
+ ),
986
+ chainId: params.chain.id,
987
+ }),
988
+ ...Array.from(childAddresses.entries()).map(
989
+ ([factory, childAddresses]) =>
990
+ syncStore.insertChildAddresses({
991
+ factory,
992
+ childAddresses,
993
+ chainId: params.chain.id,
994
+ }),
995
+ ),
996
+ ]);
997
+
998
+ const intervals: {
999
+ interval: Interval;
1000
+ filter: Filter;
1001
+ }[] = [];
1002
+
1003
+ const factoryIntervals: {
1004
+ interval: Interval;
1005
+ factory: Factory;
1006
+ }[] = [];
1007
+
1008
+ for (const { filter } of params.eventCallbacks) {
1009
+ const completedIntervals = intervalIntersection(
1010
+ [finalizedInterval],
1011
+ [
1012
+ [
1013
+ filter.fromBlock ?? 0,
1014
+ filter.toBlock ?? Number.POSITIVE_INFINITY,
1015
+ ],
1016
+ ],
1017
+ );
1018
+
1019
+ for (const interval of completedIntervals) {
1020
+ intervals.push({ interval, filter });
1021
+ }
842
1022
 
843
- for (const interval of intervals) {
844
- syncedIntervals.push({ interval, filter });
845
- }
846
- }
1023
+ for (const factory of getFilterFactories(filter)) {
1024
+ const completedIntervals = intervalIntersection(
1025
+ [finalizedInterval],
1026
+ [
1027
+ [
1028
+ factory.fromBlock ?? 0,
1029
+ factory.toBlock ?? Number.POSITIVE_INFINITY,
1030
+ ],
1031
+ ],
1032
+ );
1033
+
1034
+ for (const interval of completedIntervals) {
1035
+ factoryIntervals.push({ interval, factory });
1036
+ }
1037
+ }
1038
+ }
847
1039
 
848
- await params.syncStore.insertIntervals(
849
- {
850
- intervals: syncedIntervals,
851
- chainId: params.chain.id,
1040
+ await syncStore.insertIntervals(
1041
+ {
1042
+ intervals,
1043
+ factoryIntervals,
1044
+ chainId: params.chain.id,
1045
+ },
1046
+ context,
1047
+ );
852
1048
  },
1049
+ undefined,
853
1050
  context,
854
1051
  );
855
-
856
1052
  break;
857
1053
  }
858
1054
  case "reorg": {
@@ -878,7 +1074,10 @@ export async function handleRealtimeSyncEvent(
878
1074
  } else break;
879
1075
  }
880
1076
 
881
- await params.syncStore.pruneRpcRequestResults(
1077
+ await createSyncStore({
1078
+ common: params.common,
1079
+ qb: params.database.syncQB,
1080
+ }).pruneRpcRequestResults(
882
1081
  {
883
1082
  chainId: params.chain.id,
884
1083
  blocks: event.reorgedBlocks,