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,12 +1,13 @@
1
- import { runCodegen } from "@/bin/utils/codegen.js";
2
1
  import {
3
2
  commitBlock,
4
3
  createIndexes,
4
+ createLiveQueryTriggers,
5
5
  createTriggers,
6
6
  createViews,
7
+ dropLiveQueryTriggers,
7
8
  dropTriggers,
8
- finalize,
9
- revert,
9
+ finalizeMultichain,
10
+ revertMultichain,
10
11
  } from "@/database/actions.js";
11
12
  import {
12
13
  type Database,
@@ -86,17 +87,15 @@ export async function runMultichain({
86
87
  crashRecoveryCheckpoint: CrashRecoveryCheckpoint;
87
88
  database: Database;
88
89
  }) {
89
- runCodegen({ common });
90
-
91
90
  const columnAccessPattern = createColumnAccessPattern({
92
91
  indexingBuild,
93
92
  });
94
- const syncStore = createSyncStore({ common, database });
93
+ const syncStore = createSyncStore({ common, qb: database.syncQB });
95
94
 
96
95
  const PONDER_CHECKPOINT = getPonderCheckpointTable(namespaceBuild.schema);
97
96
  const PONDER_META = getPonderMetaTable(namespaceBuild.schema);
98
97
 
99
- let eventCount = getEventCount(indexingBuild.indexingFunctions);
98
+ const eventCount = getEventCount(indexingBuild.indexingFunctions);
100
99
 
101
100
  const cachedViemClient = createCachedViemClient({
102
101
  common,
@@ -122,7 +121,6 @@ export async function runMultichain({
122
121
  common,
123
122
  indexingBuild,
124
123
  client: cachedViemClient,
125
- eventCount,
126
124
  indexingErrorHandler,
127
125
  columnAccessPattern,
128
126
  });
@@ -157,18 +155,17 @@ export async function runMultichain({
157
155
 
158
156
  await Promise.all(
159
157
  indexingBuild.chains.map(async (chain) => {
160
- const sources = indexingBuild.sources.filter(
161
- ({ filter }) => filter.chainId === chain.id,
162
- );
158
+ const eventCallbacks =
159
+ indexingBuild.eventCallbacks[indexingBuild.chains.indexOf(chain)]!;
163
160
 
164
161
  const cachedIntervals = await getCachedIntervals({
165
162
  chain,
166
- sources,
163
+ filters: eventCallbacks.map(({ filter }) => filter),
167
164
  syncStore,
168
165
  });
169
166
  const syncProgress = await initSyncProgress({
170
167
  common,
171
- sources,
168
+ filters: eventCallbacks.map(({ filter }) => filter),
172
169
  chain,
173
170
  rpc: indexingBuild.rpcs[indexingBuild.chains.indexOf(chain)]!,
174
171
  finalizedBlock:
@@ -176,7 +173,7 @@ export async function runMultichain({
176
173
  cachedIntervals,
177
174
  });
178
175
  const childAddresses = await getChildAddresses({
179
- sources,
176
+ filters: eventCallbacks.map(({ filter }) => filter),
180
177
  syncStore,
181
178
  });
182
179
  const unfinalizedBlocks: Omit<
@@ -302,14 +299,14 @@ export async function runMultichain({
302
299
  // underlying metrics collection is actually synchronous
303
300
  // https://github.com/siimon/prom-client/blob/master/lib/histogram.js#L102-L125
304
301
  const { eta, progress } = await getAppProgress(common.metrics);
305
- if (eta === undefined || progress === undefined) {
302
+ if (eta === undefined && progress === undefined) {
306
303
  return;
307
304
  }
308
305
 
309
306
  common.logger.info({
310
307
  msg: "Updated backfill indexing progress",
311
- progress: formatPercentage(progress),
312
- estimate: formatEta(eta * 1_000),
308
+ progress: progress === undefined ? undefined : formatPercentage(progress),
309
+ estimate: eta === undefined ? undefined : formatEta(eta * 1_000),
313
310
  });
314
311
  }, 5_000);
315
312
 
@@ -331,7 +328,7 @@ export async function runMultichain({
331
328
  indexingBuild,
332
329
  crashRecoveryCheckpoint,
333
330
  perChainSync,
334
- syncStore,
331
+ database,
335
332
  }),
336
333
  (params) => {
337
334
  common.metrics.ponder_historical_concurrency_group_duration.inc(
@@ -364,7 +361,9 @@ export async function runMultichain({
364
361
  let endClock = startClock();
365
362
  await database.userQB.transaction(
366
363
  async (tx) => {
367
- const initialEventCount = structuredClone(eventCount);
364
+ const initialCompletedEvents = structuredClone(
365
+ await common.metrics.ponder_indexing_completed_events.get(),
366
+ );
368
367
 
369
368
  try {
370
369
  historicalIndexingStore.qb = tx;
@@ -453,7 +452,12 @@ export async function runMultichain({
453
452
  );
454
453
  endClock = startClock();
455
454
  } catch (error) {
456
- eventCount = initialEventCount;
455
+ for (const value of initialCompletedEvents.values) {
456
+ common.metrics.ponder_indexing_completed_events.set(
457
+ value.labels,
458
+ value.value,
459
+ );
460
+ }
457
461
  indexingCache.invalidate();
458
462
  indexingCache.clear();
459
463
 
@@ -526,7 +530,7 @@ export async function runMultichain({
526
530
  ),
527
531
  );
528
532
  common.metrics.ponder_indexing_timestamp.set(
529
- { chain: chain.name },
533
+ label,
530
534
  seconds[chain.name]!.end,
531
535
  );
532
536
  }
@@ -563,6 +567,7 @@ export async function runMultichain({
563
567
  endClock = startClock();
564
568
 
565
569
  await createTriggers(database.adminQB, { tables });
570
+ await createLiveQueryTriggers(database.adminQB, { namespaceBuild, tables });
566
571
 
567
572
  common.logger.debug({
568
573
  msg: "Created database triggers",
@@ -583,6 +588,8 @@ export async function runMultichain({
583
588
  });
584
589
  }
585
590
 
591
+ endClock = startClock();
592
+
586
593
  await database.adminQB.wrap({ label: "update_ready" }, (db) =>
587
594
  db
588
595
  .update(PONDER_META)
@@ -616,7 +623,7 @@ export async function runMultichain({
616
623
  common,
617
624
  indexingBuild,
618
625
  perChainSync,
619
- syncStore,
626
+ database,
620
627
  }),
621
628
  100,
622
629
  bufferCallback,
@@ -628,93 +635,113 @@ export async function runMultichain({
628
635
  };
629
636
  const endClock = startClock();
630
637
 
631
- if (event.events.length > 0) {
632
- // Events must be run block-by-block, so that `database.commitBlock` can accurately
633
- // update the temporary `checkpoint` value set in the trigger.
634
-
635
- const perBlockEvents = splitEvents(event.events);
636
-
637
- for (const { checkpoint, events } of perBlockEvents) {
638
- await database.userQB.transaction(
639
- async (tx) => {
640
- const chain = indexingBuild.chains.find(
641
- (chain) =>
642
- chain.id === Number(decodeCheckpoint(checkpoint).chainId),
643
- )!;
644
-
645
- try {
646
- realtimeIndexingStore.qb = tx;
647
- realtimeIndexingStore.isProcessingEvents = true;
648
-
649
- common.logger.trace({
650
- msg: "Processing block events",
651
- chain: chain.name,
652
- chain_id: chain.id,
653
- number: Number(decodeCheckpoint(checkpoint).blockNumber),
654
- event_count: events.length,
655
- });
656
-
657
- await indexing.processRealtimeEvents({
658
- events,
659
- db: realtimeIndexingStore,
660
- });
638
+ await database.userQB.transaction(
639
+ async (tx) => {
640
+ if (database.userQB.$dialect === "postgres") {
641
+ await tx.wrap(
642
+ (tx) =>
643
+ tx.execute(
644
+ "CREATE TEMP TABLE live_query_tables (table_name TEXT PRIMARY KEY) ON COMMIT DROP",
645
+ ),
646
+ context,
647
+ );
648
+ } else {
649
+ await tx.wrap(
650
+ (tx) =>
651
+ tx.execute(
652
+ "CREATE TEMP TABLE IF NOT EXISTS live_query_tables (table_name TEXT PRIMARY KEY)",
653
+ ),
654
+ context,
655
+ );
656
+ }
661
657
 
662
- common.logger.trace({
663
- msg: "Processed block events",
658
+ // Events must be run block-by-block, so that `database.commitBlock` can accurately
659
+ // update the temporary `checkpoint` value set in the trigger.
660
+ for (const { checkpoint, events } of splitEvents(event.events)) {
661
+ const chain = indexingBuild.chains.find(
662
+ (chain) =>
663
+ chain.id === Number(decodeCheckpoint(checkpoint).chainId),
664
+ )!;
665
+
666
+ try {
667
+ realtimeIndexingStore.qb = tx;
668
+ realtimeIndexingStore.isProcessingEvents = true;
669
+
670
+ common.logger.trace({
671
+ msg: "Processing block events",
672
+ chain: chain.name,
673
+ chain_id: chain.id,
674
+ number: Number(decodeCheckpoint(checkpoint).blockNumber),
675
+ event_count: events.length,
676
+ });
677
+
678
+ await indexing.processRealtimeEvents({
679
+ events,
680
+ db: realtimeIndexingStore,
681
+ });
682
+
683
+ common.logger.trace({
684
+ msg: "Processed block events",
685
+ chain: chain.name,
686
+ chain_id: chain.id,
687
+ number: Number(decodeCheckpoint(checkpoint).blockNumber),
688
+ event_count: events.length,
689
+ });
690
+
691
+ realtimeIndexingStore.isProcessingEvents = false;
692
+
693
+ await Promise.all(
694
+ tables.map((table) =>
695
+ commitBlock(tx, { table, checkpoint, preBuild }, context),
696
+ ),
697
+ );
698
+
699
+ common.logger.trace({
700
+ msg: "Committed reorg data for block",
701
+ chain: chain.name,
702
+ chain_id: chain.id,
703
+ number: Number(decodeCheckpoint(checkpoint).blockNumber),
704
+ event_count: events.length,
705
+ checkpoint,
706
+ });
707
+ } catch (error) {
708
+ if (error instanceof NonRetryableUserError === false) {
709
+ common.logger.warn({
710
+ msg: "Failed to index block",
664
711
  chain: chain.name,
665
712
  chain_id: chain.id,
666
713
  number: Number(decodeCheckpoint(checkpoint).blockNumber),
667
- event_count: events.length,
714
+ error: error,
668
715
  });
716
+ }
669
717
 
670
- realtimeIndexingStore.isProcessingEvents = false;
671
-
672
- await Promise.all(
673
- tables.map((table) =>
674
- commitBlock(tx, { table, checkpoint }, context),
675
- ),
676
- );
718
+ throw error;
719
+ }
677
720
 
678
- common.logger.trace({
679
- msg: "Committed reorg data for block",
680
- chain: chain.name,
681
- chain_id: chain.id,
682
- number: Number(decodeCheckpoint(checkpoint).blockNumber),
683
- event_count: events.length,
684
- checkpoint,
685
- });
721
+ common.metrics.ponder_indexing_timestamp.set(
722
+ { chain: chain.name },
723
+ Number(decodeCheckpoint(checkpoint).blockTimestamp),
724
+ );
725
+ }
686
726
 
687
- common.metrics.ponder_indexing_timestamp.set(
688
- { chain: chain.name },
689
- Number(decodeCheckpoint(checkpoint).blockTimestamp),
690
- );
691
- } catch (error) {
692
- if (error instanceof NonRetryableUserError === false) {
693
- common.logger.warn({
694
- msg: "Failed to index block",
695
- chain: chain.name,
696
- chain_id: chain.id,
697
- number: Number(decodeCheckpoint(checkpoint).blockNumber),
698
- error: error,
699
- });
700
- }
701
-
702
- throw error;
703
- }
704
- },
705
- undefined,
727
+ await tx.wrap(
728
+ { label: "update_checkpoints" },
729
+ (db) =>
730
+ db
731
+ .update(PONDER_CHECKPOINT)
732
+ .set({ latestCheckpoint: event.checkpoint })
733
+ .where(eq(PONDER_CHECKPOINT.chainName, event.chain.name)),
706
734
  context,
707
735
  );
708
- }
709
- }
710
736
 
711
- await database.userQB.wrap(
712
- { label: "update_checkpoints" },
713
- (db) =>
714
- db
715
- .update(PONDER_CHECKPOINT)
716
- .set({ latestCheckpoint: event.checkpoint })
717
- .where(eq(PONDER_CHECKPOINT.chainName, event.chain.name)),
737
+ if (database.userQB.$dialect === "pglite") {
738
+ await tx.wrap(
739
+ (tx) => tx.execute("TRUNCATE TABLE live_query_tables"),
740
+ context,
741
+ );
742
+ }
743
+ },
744
+ undefined,
718
745
  context,
719
746
  );
720
747
 
@@ -743,13 +770,17 @@ export async function runMultichain({
743
770
  await database.userQB.transaction(
744
771
  async (tx) => {
745
772
  await dropTriggers(tx, { tables }, context);
773
+ await dropLiveQueryTriggers(
774
+ tx,
775
+ { namespaceBuild, tables },
776
+ context,
777
+ );
746
778
 
747
- const counts = await revert(
779
+ const counts = await revertMultichain(
748
780
  tx,
749
781
  {
750
782
  checkpoint: event.checkpoint,
751
783
  tables,
752
- preBuild,
753
784
  },
754
785
  context,
755
786
  );
@@ -763,6 +794,11 @@ export async function runMultichain({
763
794
  }
764
795
 
765
796
  await createTriggers(tx, { tables }, context);
797
+ await createLiveQueryTriggers(
798
+ tx,
799
+ { namespaceBuild, tables },
800
+ context,
801
+ );
766
802
  },
767
803
  undefined,
768
804
  context,
@@ -784,12 +820,11 @@ export async function runMultichain({
784
820
  };
785
821
  const endClock = startClock();
786
822
 
787
- await finalize(
823
+ await finalizeMultichain(
788
824
  database.userQB,
789
825
  {
790
826
  checkpoint: event.checkpoint,
791
827
  tables,
792
- preBuild,
793
828
  namespaceBuild,
794
829
  },
795
830
  context,