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/runtime/realtime.ts
CHANGED
|
@@ -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
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
96
|
-
|
|
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
|
-
|
|
126
|
+
eventCallbacks,
|
|
123
127
|
syncProgress,
|
|
124
128
|
childAddresses,
|
|
125
|
-
|
|
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
|
|
154
|
-
|
|
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
|
-
|
|
165
|
+
eventCallbacks,
|
|
161
166
|
syncProgress,
|
|
162
167
|
unfinalizedBlocks,
|
|
163
|
-
|
|
168
|
+
database: params.database,
|
|
164
169
|
});
|
|
165
170
|
|
|
166
171
|
switch (event.type) {
|
|
167
172
|
case "block": {
|
|
168
173
|
const events = buildEvents({
|
|
169
|
-
|
|
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(
|
|
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.
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
355
|
-
|
|
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
|
-
|
|
392
|
+
eventCallbacks,
|
|
382
393
|
syncProgress,
|
|
383
394
|
childAddresses,
|
|
384
|
-
|
|
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
|
|
409
|
-
|
|
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
|
-
|
|
427
|
+
eventCallbacks,
|
|
416
428
|
syncProgress,
|
|
417
429
|
unfinalizedBlocks,
|
|
418
|
-
|
|
430
|
+
database: params.database,
|
|
419
431
|
});
|
|
420
432
|
|
|
421
433
|
switch (event.type) {
|
|
422
434
|
case "block": {
|
|
423
435
|
const events = buildEvents({
|
|
424
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
763
|
+
eventCallbacks: EventCallback[];
|
|
582
764
|
syncProgress: SyncProgress;
|
|
583
765
|
childAddresses: ChildAddresses;
|
|
584
|
-
|
|
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
|
-
|
|
874
|
+
eventCallbacks: EventCallback[];
|
|
693
875
|
syncProgress: SyncProgress;
|
|
694
876
|
unfinalizedBlocks: Omit<
|
|
695
877
|
Extract<RealtimeSyncEvent, { type: "block" }>,
|
|
696
878
|
"type"
|
|
697
879
|
>[];
|
|
698
|
-
|
|
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
|
|
767
|
-
|
|
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
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
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
|
-
|
|
844
|
-
|
|
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
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
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
|
|
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,
|