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/events.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Common } from "@/internal/common.js";
|
|
2
2
|
import type {
|
|
3
3
|
BlockFilter,
|
|
4
|
+
Chain,
|
|
4
5
|
Event,
|
|
6
|
+
EventCallback,
|
|
5
7
|
FactoryId,
|
|
6
8
|
InternalBlock,
|
|
7
9
|
InternalLog,
|
|
@@ -10,7 +12,6 @@ import type {
|
|
|
10
12
|
InternalTransactionReceipt,
|
|
11
13
|
LogFilter,
|
|
12
14
|
RawEvent,
|
|
13
|
-
Source,
|
|
14
15
|
SyncBlock,
|
|
15
16
|
SyncBlockHeader,
|
|
16
17
|
SyncLog,
|
|
@@ -35,8 +36,9 @@ import {
|
|
|
35
36
|
} from "@/utils/checkpoint.js";
|
|
36
37
|
import { decodeEventLog } from "@/utils/decodeEventLog.js";
|
|
37
38
|
import { toLowerCase } from "@/utils/lowercase.js";
|
|
38
|
-
import { never } from "@/utils/never.js";
|
|
39
39
|
import {
|
|
40
|
+
type AbiEvent,
|
|
41
|
+
type AbiFunction,
|
|
40
42
|
type Address,
|
|
41
43
|
type Hash,
|
|
42
44
|
type Hex,
|
|
@@ -44,6 +46,8 @@ import {
|
|
|
44
46
|
decodeFunctionResult,
|
|
45
47
|
hexToBigInt,
|
|
46
48
|
hexToNumber,
|
|
49
|
+
toEventSelector,
|
|
50
|
+
toFunctionSelector,
|
|
47
51
|
} from "viem";
|
|
48
52
|
import {
|
|
49
53
|
isAddressMatched,
|
|
@@ -59,7 +63,7 @@ import { isAddressFactory } from "./filter.js";
|
|
|
59
63
|
* Create `RawEvent`s from raw data types
|
|
60
64
|
*/
|
|
61
65
|
export const buildEvents = ({
|
|
62
|
-
|
|
66
|
+
eventCallbacks,
|
|
63
67
|
blocks,
|
|
64
68
|
logs,
|
|
65
69
|
transactions,
|
|
@@ -68,7 +72,7 @@ export const buildEvents = ({
|
|
|
68
72
|
childAddresses,
|
|
69
73
|
chainId,
|
|
70
74
|
}: {
|
|
71
|
-
|
|
75
|
+
eventCallbacks: EventCallback[];
|
|
72
76
|
blocks: InternalBlock[];
|
|
73
77
|
logs: InternalLog[];
|
|
74
78
|
transactions: InternalTransaction[];
|
|
@@ -79,25 +83,25 @@ export const buildEvents = ({
|
|
|
79
83
|
}) => {
|
|
80
84
|
const events: RawEvent[] = [];
|
|
81
85
|
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
for (let i = 0; i <
|
|
89
|
-
const
|
|
90
|
-
if (chainId !==
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
} else if (
|
|
94
|
-
|
|
95
|
-
} else if (
|
|
96
|
-
|
|
97
|
-
} else if (
|
|
98
|
-
|
|
99
|
-
} else if (
|
|
100
|
-
|
|
86
|
+
const blockEventCallbackIndexes: number[] = [];
|
|
87
|
+
const transactionEventCallbackIndexes: number[] = [];
|
|
88
|
+
const logEventCallbackIndexes: number[] = [];
|
|
89
|
+
const traceEventCallbackIndexes: number[] = [];
|
|
90
|
+
const transferEventCallbackIndexes: number[] = [];
|
|
91
|
+
|
|
92
|
+
for (let i = 0; i < eventCallbacks.length; i++) {
|
|
93
|
+
const eventCallback = eventCallbacks[i]!;
|
|
94
|
+
if (chainId !== eventCallback.filter.chainId) continue;
|
|
95
|
+
if (eventCallback.filter.type === "block") {
|
|
96
|
+
blockEventCallbackIndexes.push(i);
|
|
97
|
+
} else if (eventCallback.filter.type === "transaction") {
|
|
98
|
+
transactionEventCallbackIndexes.push(i);
|
|
99
|
+
} else if (eventCallback.filter.type === "log") {
|
|
100
|
+
logEventCallbackIndexes.push(i);
|
|
101
|
+
} else if (eventCallback.filter.type === "trace") {
|
|
102
|
+
traceEventCallbackIndexes.push(i);
|
|
103
|
+
} else if (eventCallback.filter.type === "transfer") {
|
|
104
|
+
transferEventCallbackIndexes.push(i);
|
|
101
105
|
}
|
|
102
106
|
}
|
|
103
107
|
|
|
@@ -106,12 +110,13 @@ export const buildEvents = ({
|
|
|
106
110
|
let transactionReceiptsIndex = 0;
|
|
107
111
|
|
|
108
112
|
for (const block of blocks) {
|
|
109
|
-
for (const
|
|
110
|
-
const filter =
|
|
113
|
+
for (const blockEventCallbackIndex of blockEventCallbackIndexes) {
|
|
114
|
+
const filter = eventCallbacks[blockEventCallbackIndex]!
|
|
115
|
+
.filter as BlockFilter;
|
|
111
116
|
if (isBlockFilterMatched({ filter, block })) {
|
|
112
117
|
events.push({
|
|
113
118
|
chainId: filter.chainId,
|
|
114
|
-
|
|
119
|
+
eventCallbackIndex: blockEventCallbackIndex,
|
|
115
120
|
checkpoint: encodeCheckpoint({
|
|
116
121
|
blockTimestamp: block.timestamp,
|
|
117
122
|
chainId: filter.chainId,
|
|
@@ -163,8 +168,8 @@ export const buildEvents = ({
|
|
|
163
168
|
|
|
164
169
|
const transactionReceipt = transactionReceipts[transactionReceiptsIndex]!;
|
|
165
170
|
|
|
166
|
-
for (const
|
|
167
|
-
const filter =
|
|
171
|
+
for (const transactionEventCallbackIndex of transactionEventCallbackIndexes) {
|
|
172
|
+
const filter = eventCallbacks[transactionEventCallbackIndex]!
|
|
168
173
|
.filter as TransactionFilter;
|
|
169
174
|
if (
|
|
170
175
|
isTransactionFilterMatched({ filter, transaction }) &&
|
|
@@ -194,7 +199,7 @@ export const buildEvents = ({
|
|
|
194
199
|
|
|
195
200
|
events.push({
|
|
196
201
|
chainId: filter.chainId,
|
|
197
|
-
|
|
202
|
+
eventCallbackIndex: transactionEventCallbackIndex,
|
|
198
203
|
checkpoint: encodeCheckpoint({
|
|
199
204
|
blockTimestamp: block.timestamp,
|
|
200
205
|
chainId: filter.chainId,
|
|
@@ -283,8 +288,9 @@ export const buildEvents = ({
|
|
|
283
288
|
transactionReceipt = transactionReceipts[transactionReceiptsIndex]!;
|
|
284
289
|
}
|
|
285
290
|
|
|
286
|
-
for (const
|
|
287
|
-
const filter =
|
|
291
|
+
for (const traceEventCallbackIndex of traceEventCallbackIndexes) {
|
|
292
|
+
const filter = eventCallbacks[traceEventCallbackIndex]!
|
|
293
|
+
.filter as TraceFilter;
|
|
288
294
|
|
|
289
295
|
if (
|
|
290
296
|
isTraceFilterMatched({ filter, trace, block }) &&
|
|
@@ -315,7 +321,7 @@ export const buildEvents = ({
|
|
|
315
321
|
|
|
316
322
|
events.push({
|
|
317
323
|
chainId: filter.chainId,
|
|
318
|
-
|
|
324
|
+
eventCallbackIndex: traceEventCallbackIndex,
|
|
319
325
|
checkpoint: encodeCheckpoint({
|
|
320
326
|
blockTimestamp: block.timestamp,
|
|
321
327
|
chainId: filter.chainId,
|
|
@@ -335,8 +341,9 @@ export const buildEvents = ({
|
|
|
335
341
|
}
|
|
336
342
|
}
|
|
337
343
|
|
|
338
|
-
for (const
|
|
339
|
-
const filter =
|
|
344
|
+
for (const transferEventCallbackIndex of transferEventCallbackIndexes) {
|
|
345
|
+
const filter = eventCallbacks[transferEventCallbackIndex]!
|
|
346
|
+
.filter as TransferFilter;
|
|
340
347
|
|
|
341
348
|
if (
|
|
342
349
|
isTransferFilterMatched({ filter, trace, block }) &&
|
|
@@ -364,7 +371,7 @@ export const buildEvents = ({
|
|
|
364
371
|
|
|
365
372
|
events.push({
|
|
366
373
|
chainId: filter.chainId,
|
|
367
|
-
|
|
374
|
+
eventCallbackIndex: transferEventCallbackIndex,
|
|
368
375
|
checkpoint: encodeCheckpoint({
|
|
369
376
|
blockTimestamp: block.timestamp,
|
|
370
377
|
chainId: filter.chainId,
|
|
@@ -452,8 +459,8 @@ export const buildEvents = ({
|
|
|
452
459
|
transactionReceipt = transactionReceipts[transactionReceiptsIndex]!;
|
|
453
460
|
}
|
|
454
461
|
|
|
455
|
-
for (const
|
|
456
|
-
const filter =
|
|
462
|
+
for (const logEventCallbackIndex of logEventCallbackIndexes) {
|
|
463
|
+
const filter = eventCallbacks[logEventCallbackIndex]!.filter as LogFilter;
|
|
457
464
|
if (
|
|
458
465
|
isLogFilterMatched({ filter, log }) &&
|
|
459
466
|
(isAddressFactory(filter.address)
|
|
@@ -472,7 +479,7 @@ export const buildEvents = ({
|
|
|
472
479
|
|
|
473
480
|
events.push({
|
|
474
481
|
chainId: filter.chainId,
|
|
475
|
-
|
|
482
|
+
eventCallbackIndex: logEventCallbackIndex,
|
|
476
483
|
checkpoint: encodeCheckpoint({
|
|
477
484
|
blockTimestamp: block.timestamp,
|
|
478
485
|
chainId: filter.chainId,
|
|
@@ -506,11 +513,11 @@ export const splitEvents = (
|
|
|
506
513
|
if (hash === undefined || hash !== event.event.block.hash) {
|
|
507
514
|
result.push({
|
|
508
515
|
events: [],
|
|
509
|
-
chainId: event.
|
|
516
|
+
chainId: event.chain.id,
|
|
510
517
|
checkpoint: encodeCheckpoint({
|
|
511
518
|
...MAX_CHECKPOINT,
|
|
512
519
|
blockTimestamp: event.event.block.timestamp,
|
|
513
|
-
chainId: BigInt(event.
|
|
520
|
+
chainId: BigInt(event.chain.id),
|
|
514
521
|
blockNumber: event.event.block.number,
|
|
515
522
|
}),
|
|
516
523
|
});
|
|
@@ -525,7 +532,8 @@ export const splitEvents = (
|
|
|
525
532
|
|
|
526
533
|
export const decodeEvents = (
|
|
527
534
|
common: Common,
|
|
528
|
-
|
|
535
|
+
chain: Chain,
|
|
536
|
+
eventCallbacks: EventCallback[],
|
|
529
537
|
rawEvents: RawEvent[],
|
|
530
538
|
): Event[] => {
|
|
531
539
|
const events: Event[] = [];
|
|
@@ -539,214 +547,161 @@ export const decodeEvents = (
|
|
|
539
547
|
let traceDecodeSuccessCount = 0;
|
|
540
548
|
|
|
541
549
|
for (const event of rawEvents) {
|
|
542
|
-
const
|
|
543
|
-
|
|
544
|
-
switch (source.type) {
|
|
545
|
-
case "contract": {
|
|
546
|
-
switch (source.filter.type) {
|
|
547
|
-
case "log": {
|
|
548
|
-
const selector = event.log!.topics[0];
|
|
549
|
-
if (selector === undefined) {
|
|
550
|
-
break;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
const abiItem = source.abiEvents.bySelector[selector];
|
|
554
|
-
if (abiItem === undefined) {
|
|
555
|
-
break;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
const { safeName, item } = abiItem;
|
|
559
|
-
|
|
560
|
-
let args: any;
|
|
561
|
-
try {
|
|
562
|
-
args = decodeEventLog({
|
|
563
|
-
abiItem: item,
|
|
564
|
-
data: event.log!.data,
|
|
565
|
-
topics: event.log!.topics,
|
|
566
|
-
});
|
|
567
|
-
logDecodeSuccessCount++;
|
|
568
|
-
} catch (err) {
|
|
569
|
-
logDecodeFailureCount++;
|
|
570
|
-
if (!logDecodeFailureSelectors.has(selector)) {
|
|
571
|
-
logDecodeFailureSelectors.add(selector);
|
|
572
|
-
common.logger.debug({
|
|
573
|
-
msg: "Failed to decode matched event log using provided ABI item",
|
|
574
|
-
chain: source.chain.name,
|
|
575
|
-
chain_id: source.chain.id,
|
|
576
|
-
event: safeName,
|
|
577
|
-
block_number: event?.block?.number ?? "unknown",
|
|
578
|
-
log_index: event.log?.logIndex,
|
|
579
|
-
data: event.log?.data,
|
|
580
|
-
topics: JSON.stringify(event.log?.topics),
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
break;
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
events.push({
|
|
587
|
-
type: "log",
|
|
588
|
-
chainId: event.chainId,
|
|
589
|
-
checkpoint: event.checkpoint,
|
|
590
|
-
|
|
591
|
-
name: `${source.name}:${safeName}`,
|
|
592
|
-
|
|
593
|
-
event: {
|
|
594
|
-
id: event.checkpoint,
|
|
595
|
-
args,
|
|
596
|
-
log: event.log!,
|
|
597
|
-
block: event.block as Block,
|
|
598
|
-
transaction: event.transaction! as Transaction,
|
|
599
|
-
transactionReceipt:
|
|
600
|
-
event.transactionReceipt as TransactionReceipt,
|
|
601
|
-
},
|
|
602
|
-
});
|
|
603
|
-
break;
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
case "trace": {
|
|
607
|
-
const selector = event
|
|
608
|
-
.trace!.input.slice(0, 10)
|
|
609
|
-
.toLowerCase() as Hex;
|
|
610
|
-
const abiItem = source.abiFunctions.bySelector[selector];
|
|
611
|
-
if (abiItem === undefined) {
|
|
612
|
-
break;
|
|
613
|
-
}
|
|
550
|
+
const eventCallback = eventCallbacks[event.eventCallbackIndex]!;
|
|
614
551
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
trace_index: event.trace?.traceIndex,
|
|
643
|
-
input: event.trace?.input,
|
|
644
|
-
output: event.trace?.output,
|
|
645
|
-
});
|
|
646
|
-
}
|
|
647
|
-
break;
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
events.push({
|
|
651
|
-
type: "trace",
|
|
652
|
-
chainId: event.chainId,
|
|
653
|
-
checkpoint: event.checkpoint,
|
|
654
|
-
|
|
655
|
-
// NOTE: `safename` includes ()
|
|
656
|
-
name: `${source.name}.${safeName}`,
|
|
657
|
-
|
|
658
|
-
event: {
|
|
659
|
-
id: event.checkpoint,
|
|
660
|
-
args: decodedData.args,
|
|
661
|
-
result: decodedResult,
|
|
662
|
-
trace: event.trace! as Trace,
|
|
663
|
-
block: event.block as Block,
|
|
664
|
-
transaction: event.transaction! as Transaction,
|
|
665
|
-
transactionReceipt:
|
|
666
|
-
event.transactionReceipt as TransactionReceipt,
|
|
667
|
-
},
|
|
668
|
-
});
|
|
669
|
-
|
|
670
|
-
break;
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
default:
|
|
674
|
-
never(source.filter);
|
|
552
|
+
if (
|
|
553
|
+
eventCallback.type === "contract" &&
|
|
554
|
+
eventCallback.filter.type === "log"
|
|
555
|
+
) {
|
|
556
|
+
let args: any;
|
|
557
|
+
try {
|
|
558
|
+
args = decodeEventLog({
|
|
559
|
+
abiItem: eventCallback.abiItem as AbiEvent,
|
|
560
|
+
data: event.log!.data,
|
|
561
|
+
topics: event.log!.topics,
|
|
562
|
+
});
|
|
563
|
+
logDecodeSuccessCount++;
|
|
564
|
+
} catch (err) {
|
|
565
|
+
logDecodeFailureCount++;
|
|
566
|
+
const selector = toEventSelector(eventCallback.abiItem as AbiEvent);
|
|
567
|
+
if (!logDecodeFailureSelectors.has(selector)) {
|
|
568
|
+
logDecodeFailureSelectors.add(selector);
|
|
569
|
+
common.logger.debug({
|
|
570
|
+
msg: "Failed to decode matched event log using provided ABI item",
|
|
571
|
+
chain: eventCallback.chain.name,
|
|
572
|
+
chain_id: eventCallback.chain.id,
|
|
573
|
+
event: eventCallback.name,
|
|
574
|
+
block_number: event?.block?.number ?? "unknown",
|
|
575
|
+
log_index: event.log?.logIndex,
|
|
576
|
+
data: event.log?.data,
|
|
577
|
+
topics: JSON.stringify(event.log?.topics),
|
|
578
|
+
});
|
|
675
579
|
}
|
|
676
|
-
|
|
580
|
+
continue;
|
|
677
581
|
}
|
|
678
582
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
583
|
+
events.push({
|
|
584
|
+
type: "log",
|
|
585
|
+
checkpoint: event.checkpoint,
|
|
586
|
+
chain,
|
|
587
|
+
eventCallback,
|
|
588
|
+
|
|
589
|
+
event: {
|
|
590
|
+
id: event.checkpoint,
|
|
591
|
+
args,
|
|
592
|
+
log: event.log!,
|
|
593
|
+
block: event.block as Block,
|
|
594
|
+
transaction: event.transaction! as Transaction,
|
|
595
|
+
transactionReceipt: event.transactionReceipt as TransactionReceipt,
|
|
596
|
+
},
|
|
597
|
+
});
|
|
598
|
+
} else if (
|
|
599
|
+
eventCallback.type === "contract" &&
|
|
600
|
+
eventCallback.filter.type === "trace"
|
|
601
|
+
) {
|
|
602
|
+
let decodedData: { args: readonly unknown[]; functionName: string };
|
|
603
|
+
let decodedResult: readonly unknown[];
|
|
604
|
+
try {
|
|
605
|
+
decodedData = decodeFunctionData({
|
|
606
|
+
abi: [eventCallback.abiItem as AbiFunction],
|
|
607
|
+
data: event.trace!.input,
|
|
608
|
+
});
|
|
702
609
|
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
break;
|
|
729
|
-
}
|
|
610
|
+
decodedResult = decodeFunctionResult({
|
|
611
|
+
abi: [eventCallback.abiItem as AbiFunction],
|
|
612
|
+
data: event.trace!.output ?? "0x",
|
|
613
|
+
functionName: decodedData.functionName,
|
|
614
|
+
});
|
|
615
|
+
traceDecodeSuccessCount++;
|
|
616
|
+
} catch (err) {
|
|
617
|
+
traceDecodeFailureCount++;
|
|
618
|
+
const selector = toFunctionSelector(
|
|
619
|
+
eventCallback.abiItem as AbiFunction,
|
|
620
|
+
);
|
|
621
|
+
if (!traceDecodeFailureSelectors.has(selector)) {
|
|
622
|
+
traceDecodeFailureSelectors.add(selector);
|
|
623
|
+
common.logger.debug({
|
|
624
|
+
msg: "Failed to decode matched call trace using provided ABI item",
|
|
625
|
+
chain: eventCallback.chain.name,
|
|
626
|
+
chain_id: eventCallback.chain.id,
|
|
627
|
+
function: eventCallback.name,
|
|
628
|
+
block_number: event?.block?.number ?? "unknown",
|
|
629
|
+
transaction_index: event.transaction?.transactionIndex,
|
|
630
|
+
trace_index: event.trace?.traceIndex,
|
|
631
|
+
input: event.trace?.input,
|
|
632
|
+
output: event.trace?.output,
|
|
633
|
+
});
|
|
730
634
|
}
|
|
731
|
-
|
|
635
|
+
continue;
|
|
732
636
|
}
|
|
733
637
|
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
638
|
+
events.push({
|
|
639
|
+
type: "trace",
|
|
640
|
+
checkpoint: event.checkpoint,
|
|
641
|
+
chain,
|
|
642
|
+
eventCallback,
|
|
643
|
+
|
|
644
|
+
event: {
|
|
645
|
+
id: event.checkpoint,
|
|
646
|
+
args: decodedData.args,
|
|
647
|
+
result: decodedResult,
|
|
648
|
+
trace: event.trace! as Trace,
|
|
649
|
+
block: event.block as Block,
|
|
650
|
+
transaction: event.transaction! as Transaction,
|
|
651
|
+
transactionReceipt: event.transactionReceipt as TransactionReceipt,
|
|
652
|
+
},
|
|
653
|
+
});
|
|
654
|
+
} else if (
|
|
655
|
+
eventCallback.type === "account" &&
|
|
656
|
+
eventCallback.filter.type === "transaction"
|
|
657
|
+
) {
|
|
658
|
+
events.push({
|
|
659
|
+
type: "transaction",
|
|
660
|
+
checkpoint: event.checkpoint,
|
|
661
|
+
chain,
|
|
662
|
+
eventCallback,
|
|
663
|
+
|
|
664
|
+
event: {
|
|
665
|
+
id: event.checkpoint,
|
|
666
|
+
block: event.block as Block,
|
|
667
|
+
transaction: event.transaction! as Transaction,
|
|
668
|
+
transactionReceipt: event.transactionReceipt as TransactionReceipt,
|
|
669
|
+
},
|
|
670
|
+
});
|
|
671
|
+
} else if (
|
|
672
|
+
eventCallback.type === "account" &&
|
|
673
|
+
eventCallback.filter.type === "transfer"
|
|
674
|
+
) {
|
|
675
|
+
events.push({
|
|
676
|
+
type: "transfer",
|
|
677
|
+
checkpoint: event.checkpoint,
|
|
678
|
+
chain,
|
|
679
|
+
eventCallback,
|
|
680
|
+
|
|
681
|
+
event: {
|
|
682
|
+
id: event.checkpoint,
|
|
683
|
+
transfer: {
|
|
684
|
+
from: event.trace!.from,
|
|
685
|
+
to: event.trace!.to!,
|
|
686
|
+
value: event.trace!.value!,
|
|
743
687
|
},
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
688
|
+
block: event.block as Block,
|
|
689
|
+
transaction: event.transaction! as Transaction,
|
|
690
|
+
transactionReceipt: event.transactionReceipt as TransactionReceipt,
|
|
691
|
+
trace: event.trace! as Trace,
|
|
692
|
+
},
|
|
693
|
+
});
|
|
694
|
+
} else if (eventCallback.type === "block") {
|
|
695
|
+
events.push({
|
|
696
|
+
type: "block",
|
|
697
|
+
checkpoint: event.checkpoint,
|
|
698
|
+
chain,
|
|
699
|
+
eventCallback,
|
|
700
|
+
event: {
|
|
701
|
+
id: event.checkpoint,
|
|
702
|
+
block: event.block as Block,
|
|
703
|
+
},
|
|
704
|
+
});
|
|
750
705
|
}
|
|
751
706
|
}
|
|
752
707
|
|
package/src/runtime/filter.ts
CHANGED
|
@@ -336,7 +336,7 @@ export const isBlockFilterMatched = ({
|
|
|
336
336
|
block,
|
|
337
337
|
}: {
|
|
338
338
|
filter: BlockFilter;
|
|
339
|
-
block: InternalBlock | SyncBlock | SyncBlockHeader
|
|
339
|
+
block: Pick<InternalBlock | SyncBlock | SyncBlockHeader, "number">;
|
|
340
340
|
}): boolean => {
|
|
341
341
|
// Return `false` for out of range blocks
|
|
342
342
|
if (
|
|
@@ -349,6 +349,90 @@ export const isBlockFilterMatched = ({
|
|
|
349
349
|
return (Number(block.number) - filter.offset) % filter.interval === 0;
|
|
350
350
|
};
|
|
351
351
|
|
|
352
|
+
export const getFilterFactories = (filter: Filter): Factory[] => {
|
|
353
|
+
const factories: Factory[] = [];
|
|
354
|
+
switch (filter.type) {
|
|
355
|
+
case "log":
|
|
356
|
+
if (isAddressFactory(filter.address)) {
|
|
357
|
+
factories.push(filter.address);
|
|
358
|
+
}
|
|
359
|
+
break;
|
|
360
|
+
case "trace":
|
|
361
|
+
case "transfer":
|
|
362
|
+
case "transaction": {
|
|
363
|
+
if (isAddressFactory(filter.fromAddress)) {
|
|
364
|
+
factories.push(filter.fromAddress);
|
|
365
|
+
}
|
|
366
|
+
if (isAddressFactory(filter.toAddress)) {
|
|
367
|
+
factories.push(filter.toAddress);
|
|
368
|
+
}
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return factories;
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
export const getFilterFromBlock = (filter: Filter): number => {
|
|
376
|
+
const blocks: number[] = [filter.fromBlock ?? 0];
|
|
377
|
+
switch (filter.type) {
|
|
378
|
+
case "log":
|
|
379
|
+
if (isAddressFactory(filter.address)) {
|
|
380
|
+
blocks.push(filter.address.fromBlock ?? 0);
|
|
381
|
+
}
|
|
382
|
+
break;
|
|
383
|
+
case "transaction":
|
|
384
|
+
case "trace":
|
|
385
|
+
case "transfer":
|
|
386
|
+
if (isAddressFactory(filter.fromAddress)) {
|
|
387
|
+
blocks.push(filter.fromAddress.fromBlock ?? 0);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (isAddressFactory(filter.toAddress)) {
|
|
391
|
+
blocks.push(filter.toAddress.fromBlock ?? 0);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
return Math.min(...blocks);
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
export const getFilterToBlock = (filter: Filter): number => {
|
|
399
|
+
const blocks: number[] = [filter.toBlock ?? Number.POSITIVE_INFINITY];
|
|
400
|
+
|
|
401
|
+
// Note: factories cannot have toBlock > `filter.toBlock`
|
|
402
|
+
|
|
403
|
+
switch (filter.type) {
|
|
404
|
+
case "log":
|
|
405
|
+
if (isAddressFactory(filter.address)) {
|
|
406
|
+
blocks.push(filter.address.toBlock ?? Number.POSITIVE_INFINITY);
|
|
407
|
+
}
|
|
408
|
+
break;
|
|
409
|
+
case "transaction":
|
|
410
|
+
case "trace":
|
|
411
|
+
case "transfer":
|
|
412
|
+
if (isAddressFactory(filter.fromAddress)) {
|
|
413
|
+
blocks.push(filter.fromAddress.toBlock ?? Number.POSITIVE_INFINITY);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (isAddressFactory(filter.toAddress)) {
|
|
417
|
+
blocks.push(filter.toAddress.toBlock ?? Number.POSITIVE_INFINITY);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return Math.max(...blocks);
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
export const isBlockInFilter = (filter: Filter, blockNumber: number) => {
|
|
425
|
+
// Return `false` for out of range blocks
|
|
426
|
+
if (
|
|
427
|
+
blockNumber < (filter.fromBlock ?? 0) ||
|
|
428
|
+
blockNumber > (filter.toBlock ?? Number.POSITIVE_INFINITY)
|
|
429
|
+
) {
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return true;
|
|
434
|
+
};
|
|
435
|
+
|
|
352
436
|
export const defaultBlockInclude: (keyof Block)[] = [
|
|
353
437
|
"baseFeePerGas",
|
|
354
438
|
"difficulty",
|