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.
- package/CHANGELOG.md +16 -0
- package/dist/esm/bin/commands/createViews.js +28 -11
- package/dist/esm/bin/commands/createViews.js.map +1 -1
- package/dist/esm/bin/commands/dev.js +42 -22
- package/dist/esm/bin/commands/dev.js.map +1 -1
- package/dist/esm/bin/commands/prune.js +3 -0
- package/dist/esm/bin/commands/prune.js.map +1 -1
- package/dist/esm/bin/commands/serve.js +4 -1
- package/dist/esm/bin/commands/serve.js.map +1 -1
- package/dist/esm/bin/commands/start.js +18 -6
- package/dist/esm/bin/commands/start.js.map +1 -1
- package/dist/esm/bin/isolatedController.js +200 -0
- package/dist/esm/bin/isolatedController.js.map +1 -0
- package/dist/esm/bin/isolatedWorker.js +146 -0
- package/dist/esm/bin/isolatedWorker.js.map +1 -0
- package/dist/esm/build/config.js +322 -402
- package/dist/esm/build/config.js.map +1 -1
- package/dist/esm/build/index.js +8 -11
- package/dist/esm/build/index.js.map +1 -1
- package/dist/esm/build/pre.js +1 -4
- package/dist/esm/build/pre.js.map +1 -1
- package/dist/esm/build/schema.js +25 -3
- package/dist/esm/build/schema.js.map +1 -1
- package/dist/esm/client/index.js +306 -42
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/database/actions.js +264 -104
- package/dist/esm/database/actions.js.map +1 -1
- package/dist/esm/database/index.js +39 -33
- package/dist/esm/database/index.js.map +1 -1
- package/dist/esm/database/queryBuilder.js +1 -0
- package/dist/esm/database/queryBuilder.js.map +1 -1
- package/dist/esm/drizzle/index.js +11 -7
- package/dist/esm/drizzle/index.js.map +1 -1
- package/dist/esm/drizzle/onchain.js +18 -0
- package/dist/esm/drizzle/onchain.js.map +1 -1
- package/dist/esm/indexing/client.js +32 -25
- package/dist/esm/indexing/client.js.map +1 -1
- package/dist/esm/indexing/index.js +110 -178
- package/dist/esm/indexing/index.js.map +1 -1
- package/dist/esm/indexing/profile.js +1 -1
- package/dist/esm/indexing/profile.js.map +1 -1
- package/dist/esm/indexing-store/cache.js +196 -274
- package/dist/esm/indexing-store/cache.js.map +1 -1
- package/dist/esm/indexing-store/historical.js +17 -13
- package/dist/esm/indexing-store/historical.js.map +1 -1
- package/dist/esm/indexing-store/index.js +10 -1
- package/dist/esm/indexing-store/index.js.map +1 -1
- package/dist/esm/indexing-store/profile.js +3 -3
- package/dist/esm/indexing-store/profile.js.map +1 -1
- package/dist/esm/indexing-store/realtime.js +27 -2
- package/dist/esm/indexing-store/realtime.js.map +1 -1
- package/dist/esm/internal/errors.js +28 -0
- package/dist/esm/internal/errors.js.map +1 -1
- package/dist/esm/internal/metrics.js +279 -82
- package/dist/esm/internal/metrics.js.map +1 -1
- package/dist/esm/internal/options.js +1 -0
- package/dist/esm/internal/options.js.map +1 -1
- package/dist/esm/internal/telemetry.js +1 -1
- package/dist/esm/internal/telemetry.js.map +1 -1
- package/dist/esm/rpc/http.js +130 -0
- package/dist/esm/rpc/http.js.map +1 -0
- package/dist/esm/rpc/index.js +38 -7
- package/dist/esm/rpc/index.js.map +1 -1
- package/dist/esm/runtime/events.js +179 -212
- package/dist/esm/runtime/events.js.map +1 -1
- package/dist/esm/runtime/filter.js +71 -0
- package/dist/esm/runtime/filter.js.map +1 -1
- package/dist/esm/runtime/fragments.js +78 -73
- package/dist/esm/runtime/fragments.js.map +1 -1
- package/dist/esm/runtime/historical.js +306 -130
- package/dist/esm/runtime/historical.js.map +1 -1
- package/dist/esm/runtime/index.js +183 -58
- package/dist/esm/runtime/index.js.map +1 -1
- package/dist/esm/runtime/isolated.js +462 -0
- package/dist/esm/runtime/isolated.js.map +1 -0
- package/dist/esm/runtime/multichain.js +80 -73
- package/dist/esm/runtime/multichain.js.map +1 -1
- package/dist/esm/runtime/omnichain.js +82 -75
- package/dist/esm/runtime/omnichain.js.map +1 -1
- package/dist/esm/runtime/realtime.js +198 -66
- package/dist/esm/runtime/realtime.js.map +1 -1
- package/dist/esm/sync-historical/index.js +416 -457
- package/dist/esm/sync-historical/index.js.map +1 -1
- package/dist/esm/sync-realtime/bloom.js +3 -3
- package/dist/esm/sync-realtime/bloom.js.map +1 -1
- package/dist/esm/sync-realtime/index.js +27 -46
- package/dist/esm/sync-realtime/index.js.map +1 -1
- package/dist/esm/sync-store/index.js +112 -63
- package/dist/esm/sync-store/index.js.map +1 -1
- package/dist/esm/utils/abi.js +20 -32
- package/dist/esm/utils/abi.js.map +1 -1
- package/dist/esm/utils/chunk.js +8 -0
- package/dist/esm/utils/chunk.js.map +1 -0
- package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
- package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
- package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
- package/dist/esm/utils/sql-parse.js.map +1 -0
- package/dist/types/bin/commands/createViews.d.ts.map +1 -1
- package/dist/types/bin/commands/dev.d.ts.map +1 -1
- package/dist/types/bin/commands/prune.d.ts.map +1 -1
- package/dist/types/bin/commands/serve.d.ts.map +1 -1
- package/dist/types/bin/commands/start.d.ts.map +1 -1
- package/dist/types/bin/isolatedController.d.ts +13 -0
- package/dist/types/bin/isolatedController.d.ts.map +1 -0
- package/dist/types/bin/isolatedWorker.d.ts +9 -0
- package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
- package/dist/types/build/config.d.ts +29 -11
- package/dist/types/build/config.d.ts.map +1 -1
- package/dist/types/build/index.d.ts +3 -2
- package/dist/types/build/index.d.ts.map +1 -1
- package/dist/types/build/pre.d.ts +1 -1
- package/dist/types/build/pre.d.ts.map +1 -1
- package/dist/types/build/schema.d.ts +5 -3
- package/dist/types/build/schema.d.ts.map +1 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/index.d.ts.map +1 -1
- package/dist/types/config/index.d.ts +3 -3
- package/dist/types/config/index.d.ts.map +1 -1
- package/dist/types/database/actions.d.ts +53 -7
- package/dist/types/database/actions.d.ts.map +1 -1
- package/dist/types/database/index.d.ts +21 -21
- package/dist/types/database/index.d.ts.map +1 -1
- package/dist/types/database/queryBuilder.d.ts.map +1 -1
- package/dist/types/drizzle/index.d.ts +4 -5
- package/dist/types/drizzle/index.d.ts.map +1 -1
- package/dist/types/drizzle/onchain.d.ts +6 -0
- package/dist/types/drizzle/onchain.d.ts.map +1 -1
- package/dist/types/indexing/client.d.ts.map +1 -1
- package/dist/types/indexing/index.d.ts +2 -5
- package/dist/types/indexing/index.d.ts.map +1 -1
- package/dist/types/indexing-store/cache.d.ts +3 -2
- package/dist/types/indexing-store/cache.d.ts.map +1 -1
- package/dist/types/indexing-store/historical.d.ts +2 -1
- package/dist/types/indexing-store/historical.d.ts.map +1 -1
- package/dist/types/indexing-store/index.d.ts +1 -0
- package/dist/types/indexing-store/index.d.ts.map +1 -1
- package/dist/types/indexing-store/realtime.d.ts +2 -1
- package/dist/types/indexing-store/realtime.d.ts.map +1 -1
- package/dist/types/internal/errors.d.ts +5 -0
- package/dist/types/internal/errors.d.ts.map +1 -1
- package/dist/types/internal/metrics.d.ts +21 -0
- package/dist/types/internal/metrics.d.ts.map +1 -1
- package/dist/types/internal/options.d.ts +2 -0
- package/dist/types/internal/options.d.ts.map +1 -1
- package/dist/types/internal/types.d.ts +66 -58
- package/dist/types/internal/types.d.ts.map +1 -1
- package/dist/types/rpc/http.d.ts +17 -0
- package/dist/types/rpc/http.d.ts.map +1 -0
- package/dist/types/rpc/index.d.ts.map +1 -1
- package/dist/types/runtime/events.d.ts +4 -4
- package/dist/types/runtime/events.d.ts.map +1 -1
- package/dist/types/runtime/filter.d.ts +5 -1
- package/dist/types/runtime/filter.d.ts.map +1 -1
- package/dist/types/runtime/fragments.d.ts +4 -3
- package/dist/types/runtime/fragments.d.ts.map +1 -1
- package/dist/types/runtime/historical.d.ts +29 -13
- package/dist/types/runtime/historical.d.ts.map +1 -1
- package/dist/types/runtime/index.d.ts +49 -6
- package/dist/types/runtime/index.d.ts.map +1 -1
- package/dist/types/runtime/init.d.ts +5 -5
- package/dist/types/runtime/init.d.ts.map +1 -1
- package/dist/types/runtime/isolated.d.ts +14 -0
- package/dist/types/runtime/isolated.d.ts.map +1 -0
- package/dist/types/runtime/multichain.d.ts.map +1 -1
- package/dist/types/runtime/omnichain.d.ts.map +1 -1
- package/dist/types/runtime/realtime.d.ts +21 -10
- package/dist/types/runtime/realtime.d.ts.map +1 -1
- package/dist/types/sync-historical/index.d.ts +18 -8
- package/dist/types/sync-historical/index.d.ts.map +1 -1
- package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
- package/dist/types/sync-realtime/index.d.ts +2 -2
- package/dist/types/sync-realtime/index.d.ts.map +1 -1
- package/dist/types/sync-store/index.d.ts +9 -9
- package/dist/types/sync-store/index.d.ts.map +1 -1
- package/dist/types/utils/abi.d.ts +3 -34
- package/dist/types/utils/abi.d.ts.map +1 -1
- package/dist/types/utils/chunk.d.ts +2 -0
- package/dist/types/utils/chunk.d.ts.map +1 -0
- package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
- package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
- package/dist/types/utils/sql-parse.d.ts +21 -0
- package/dist/types/utils/sql-parse.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/bin/commands/createViews.ts +35 -15
- package/src/bin/commands/dev.ts +43 -21
- package/src/bin/commands/prune.ts +6 -0
- package/src/bin/commands/serve.ts +4 -1
- package/src/bin/commands/start.ts +20 -5
- package/src/bin/isolatedController.ts +300 -0
- package/src/bin/isolatedWorker.ts +192 -0
- package/src/build/config.ts +570 -632
- package/src/build/index.ts +14 -14
- package/src/build/pre.ts +1 -4
- package/src/build/schema.ts +49 -4
- package/src/client/index.ts +386 -48
- package/src/config/index.ts +3 -3
- package/src/database/actions.ts +469 -120
- package/src/database/index.ts +85 -58
- package/src/database/queryBuilder.ts +1 -0
- package/src/drizzle/index.ts +15 -7
- package/src/drizzle/onchain.ts +19 -0
- package/src/indexing/client.ts +38 -25
- package/src/indexing/index.ts +137 -230
- package/src/indexing/profile.ts +1 -1
- package/src/indexing-store/cache.ts +285 -414
- package/src/indexing-store/historical.ts +20 -10
- package/src/indexing-store/index.ts +16 -0
- package/src/indexing-store/profile.ts +3 -3
- package/src/indexing-store/realtime.ts +28 -0
- package/src/internal/errors.ts +26 -0
- package/src/internal/metrics.ts +341 -111
- package/src/internal/options.ts +4 -0
- package/src/internal/telemetry.ts +1 -1
- package/src/internal/types.ts +70 -87
- package/src/rpc/http.ts +164 -0
- package/src/rpc/index.ts +39 -7
- package/src/runtime/events.ts +195 -240
- package/src/runtime/filter.ts +85 -1
- package/src/runtime/fragments.ts +109 -113
- package/src/runtime/historical.ts +467 -189
- package/src/runtime/index.ts +337 -69
- package/src/runtime/init.ts +5 -5
- package/src/runtime/isolated.ts +768 -0
- package/src/runtime/multichain.ts +137 -102
- package/src/runtime/omnichain.ts +138 -106
- package/src/runtime/realtime.ts +322 -123
- package/src/sync-historical/index.ts +556 -692
- package/src/sync-realtime/bloom.ts +7 -3
- package/src/sync-realtime/index.ts +31 -46
- package/src/sync-store/index.ts +189 -95
- package/src/utils/abi.ts +33 -90
- package/src/utils/chunk.ts +7 -0
- package/src/utils/promiseAllSettledWithThrow.ts +27 -0
- package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
- package/dist/esm/client/parse.js.map +0 -1
- package/dist/types/client/parse.d.ts +0 -14
- package/dist/types/client/parse.d.ts.map +0 -1
package/src/sync-store/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import crypto from "node:crypto";
|
|
2
|
-
import type {
|
|
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 {
|
|
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 {
|
|
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:
|
|
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<
|
|
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
|
-
|
|
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 (
|
|
196
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
.
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
319
|
-
|
|
382
|
+
index = 0;
|
|
383
|
+
|
|
384
|
+
for (const filter of filters) {
|
|
320
385
|
const fragments = getFragments(filter);
|
|
321
386
|
result.set(filter, []);
|
|
322
|
-
|
|
323
|
-
|
|
387
|
+
|
|
388
|
+
for (const fragment of fragments) {
|
|
324
389
|
const intervals = rows
|
|
325
|
-
.filter((row) => row.
|
|
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 =
|
|
357
|
-
|
|
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
|
|
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 =
|
|
394
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
?
|
|
993
|
+
? qb.wrap({ label: "select_blocks" }, () => blocksQuery)
|
|
883
994
|
: [],
|
|
884
995
|
shouldQueryTransactions
|
|
885
|
-
?
|
|
996
|
+
? qb.wrap(
|
|
886
997
|
{ label: "select_transactions" },
|
|
887
998
|
() => transactionsQuery,
|
|
888
999
|
context,
|
|
889
1000
|
)
|
|
890
1001
|
: [],
|
|
891
1002
|
shouldQueryTransactionReceipts
|
|
892
|
-
?
|
|
1003
|
+
? qb.wrap(
|
|
893
1004
|
{ label: "select_transaction_receipts" },
|
|
894
1005
|
() => transactionReceiptsQuery,
|
|
895
1006
|
context,
|
|
896
1007
|
)
|
|
897
1008
|
: [],
|
|
898
1009
|
shouldQueryLogs
|
|
899
|
-
?
|
|
900
|
-
{ label: "select_logs" },
|
|
901
|
-
() => logsQuery,
|
|
902
|
-
context,
|
|
903
|
-
)
|
|
1010
|
+
? qb.wrap({ label: "select_logs" }, () => logsQuery, context)
|
|
904
1011
|
: [],
|
|
905
1012
|
shouldQueryTraces
|
|
906
|
-
?
|
|
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
|
|
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
|
-
|
|
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
|
-
:
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
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) {
|