ponder 0.14.13 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/esm/bin/commands/createViews.js +28 -11
  3. package/dist/esm/bin/commands/createViews.js.map +1 -1
  4. package/dist/esm/bin/commands/dev.js +42 -22
  5. package/dist/esm/bin/commands/dev.js.map +1 -1
  6. package/dist/esm/bin/commands/prune.js +3 -0
  7. package/dist/esm/bin/commands/prune.js.map +1 -1
  8. package/dist/esm/bin/commands/serve.js +4 -1
  9. package/dist/esm/bin/commands/serve.js.map +1 -1
  10. package/dist/esm/bin/commands/start.js +18 -6
  11. package/dist/esm/bin/commands/start.js.map +1 -1
  12. package/dist/esm/bin/isolatedController.js +200 -0
  13. package/dist/esm/bin/isolatedController.js.map +1 -0
  14. package/dist/esm/bin/isolatedWorker.js +146 -0
  15. package/dist/esm/bin/isolatedWorker.js.map +1 -0
  16. package/dist/esm/build/config.js +322 -402
  17. package/dist/esm/build/config.js.map +1 -1
  18. package/dist/esm/build/index.js +8 -11
  19. package/dist/esm/build/index.js.map +1 -1
  20. package/dist/esm/build/pre.js +1 -4
  21. package/dist/esm/build/pre.js.map +1 -1
  22. package/dist/esm/build/schema.js +25 -3
  23. package/dist/esm/build/schema.js.map +1 -1
  24. package/dist/esm/client/index.js +306 -42
  25. package/dist/esm/client/index.js.map +1 -1
  26. package/dist/esm/database/actions.js +264 -104
  27. package/dist/esm/database/actions.js.map +1 -1
  28. package/dist/esm/database/index.js +39 -33
  29. package/dist/esm/database/index.js.map +1 -1
  30. package/dist/esm/database/queryBuilder.js +1 -0
  31. package/dist/esm/database/queryBuilder.js.map +1 -1
  32. package/dist/esm/drizzle/index.js +11 -7
  33. package/dist/esm/drizzle/index.js.map +1 -1
  34. package/dist/esm/drizzle/onchain.js +18 -0
  35. package/dist/esm/drizzle/onchain.js.map +1 -1
  36. package/dist/esm/indexing/client.js +32 -25
  37. package/dist/esm/indexing/client.js.map +1 -1
  38. package/dist/esm/indexing/index.js +110 -178
  39. package/dist/esm/indexing/index.js.map +1 -1
  40. package/dist/esm/indexing/profile.js +1 -1
  41. package/dist/esm/indexing/profile.js.map +1 -1
  42. package/dist/esm/indexing-store/cache.js +196 -274
  43. package/dist/esm/indexing-store/cache.js.map +1 -1
  44. package/dist/esm/indexing-store/historical.js +17 -13
  45. package/dist/esm/indexing-store/historical.js.map +1 -1
  46. package/dist/esm/indexing-store/index.js +10 -1
  47. package/dist/esm/indexing-store/index.js.map +1 -1
  48. package/dist/esm/indexing-store/profile.js +3 -3
  49. package/dist/esm/indexing-store/profile.js.map +1 -1
  50. package/dist/esm/indexing-store/realtime.js +27 -2
  51. package/dist/esm/indexing-store/realtime.js.map +1 -1
  52. package/dist/esm/internal/errors.js +28 -0
  53. package/dist/esm/internal/errors.js.map +1 -1
  54. package/dist/esm/internal/metrics.js +279 -82
  55. package/dist/esm/internal/metrics.js.map +1 -1
  56. package/dist/esm/internal/options.js +1 -0
  57. package/dist/esm/internal/options.js.map +1 -1
  58. package/dist/esm/internal/telemetry.js +1 -1
  59. package/dist/esm/internal/telemetry.js.map +1 -1
  60. package/dist/esm/rpc/http.js +130 -0
  61. package/dist/esm/rpc/http.js.map +1 -0
  62. package/dist/esm/rpc/index.js +38 -7
  63. package/dist/esm/rpc/index.js.map +1 -1
  64. package/dist/esm/runtime/events.js +179 -212
  65. package/dist/esm/runtime/events.js.map +1 -1
  66. package/dist/esm/runtime/filter.js +71 -0
  67. package/dist/esm/runtime/filter.js.map +1 -1
  68. package/dist/esm/runtime/fragments.js +78 -73
  69. package/dist/esm/runtime/fragments.js.map +1 -1
  70. package/dist/esm/runtime/historical.js +306 -130
  71. package/dist/esm/runtime/historical.js.map +1 -1
  72. package/dist/esm/runtime/index.js +183 -58
  73. package/dist/esm/runtime/index.js.map +1 -1
  74. package/dist/esm/runtime/isolated.js +462 -0
  75. package/dist/esm/runtime/isolated.js.map +1 -0
  76. package/dist/esm/runtime/multichain.js +80 -73
  77. package/dist/esm/runtime/multichain.js.map +1 -1
  78. package/dist/esm/runtime/omnichain.js +82 -75
  79. package/dist/esm/runtime/omnichain.js.map +1 -1
  80. package/dist/esm/runtime/realtime.js +198 -66
  81. package/dist/esm/runtime/realtime.js.map +1 -1
  82. package/dist/esm/sync-historical/index.js +416 -457
  83. package/dist/esm/sync-historical/index.js.map +1 -1
  84. package/dist/esm/sync-realtime/bloom.js +3 -3
  85. package/dist/esm/sync-realtime/bloom.js.map +1 -1
  86. package/dist/esm/sync-realtime/index.js +27 -46
  87. package/dist/esm/sync-realtime/index.js.map +1 -1
  88. package/dist/esm/sync-store/index.js +112 -63
  89. package/dist/esm/sync-store/index.js.map +1 -1
  90. package/dist/esm/utils/abi.js +20 -32
  91. package/dist/esm/utils/abi.js.map +1 -1
  92. package/dist/esm/utils/chunk.js +8 -0
  93. package/dist/esm/utils/chunk.js.map +1 -0
  94. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  95. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  96. package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
  97. package/dist/esm/utils/sql-parse.js.map +1 -0
  98. package/dist/types/bin/commands/createViews.d.ts.map +1 -1
  99. package/dist/types/bin/commands/dev.d.ts.map +1 -1
  100. package/dist/types/bin/commands/prune.d.ts.map +1 -1
  101. package/dist/types/bin/commands/serve.d.ts.map +1 -1
  102. package/dist/types/bin/commands/start.d.ts.map +1 -1
  103. package/dist/types/bin/isolatedController.d.ts +13 -0
  104. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  105. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  106. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  107. package/dist/types/build/config.d.ts +29 -11
  108. package/dist/types/build/config.d.ts.map +1 -1
  109. package/dist/types/build/index.d.ts +3 -2
  110. package/dist/types/build/index.d.ts.map +1 -1
  111. package/dist/types/build/pre.d.ts +1 -1
  112. package/dist/types/build/pre.d.ts.map +1 -1
  113. package/dist/types/build/schema.d.ts +5 -3
  114. package/dist/types/build/schema.d.ts.map +1 -1
  115. package/dist/types/client/index.d.ts +1 -1
  116. package/dist/types/client/index.d.ts.map +1 -1
  117. package/dist/types/config/index.d.ts +3 -3
  118. package/dist/types/config/index.d.ts.map +1 -1
  119. package/dist/types/database/actions.d.ts +53 -7
  120. package/dist/types/database/actions.d.ts.map +1 -1
  121. package/dist/types/database/index.d.ts +21 -21
  122. package/dist/types/database/index.d.ts.map +1 -1
  123. package/dist/types/database/queryBuilder.d.ts.map +1 -1
  124. package/dist/types/drizzle/index.d.ts +4 -5
  125. package/dist/types/drizzle/index.d.ts.map +1 -1
  126. package/dist/types/drizzle/onchain.d.ts +6 -0
  127. package/dist/types/drizzle/onchain.d.ts.map +1 -1
  128. package/dist/types/indexing/client.d.ts.map +1 -1
  129. package/dist/types/indexing/index.d.ts +2 -5
  130. package/dist/types/indexing/index.d.ts.map +1 -1
  131. package/dist/types/indexing-store/cache.d.ts +3 -2
  132. package/dist/types/indexing-store/cache.d.ts.map +1 -1
  133. package/dist/types/indexing-store/historical.d.ts +2 -1
  134. package/dist/types/indexing-store/historical.d.ts.map +1 -1
  135. package/dist/types/indexing-store/index.d.ts +1 -0
  136. package/dist/types/indexing-store/index.d.ts.map +1 -1
  137. package/dist/types/indexing-store/realtime.d.ts +2 -1
  138. package/dist/types/indexing-store/realtime.d.ts.map +1 -1
  139. package/dist/types/internal/errors.d.ts +5 -0
  140. package/dist/types/internal/errors.d.ts.map +1 -1
  141. package/dist/types/internal/metrics.d.ts +21 -0
  142. package/dist/types/internal/metrics.d.ts.map +1 -1
  143. package/dist/types/internal/options.d.ts +2 -0
  144. package/dist/types/internal/options.d.ts.map +1 -1
  145. package/dist/types/internal/types.d.ts +66 -58
  146. package/dist/types/internal/types.d.ts.map +1 -1
  147. package/dist/types/rpc/http.d.ts +17 -0
  148. package/dist/types/rpc/http.d.ts.map +1 -0
  149. package/dist/types/rpc/index.d.ts.map +1 -1
  150. package/dist/types/runtime/events.d.ts +4 -4
  151. package/dist/types/runtime/events.d.ts.map +1 -1
  152. package/dist/types/runtime/filter.d.ts +5 -1
  153. package/dist/types/runtime/filter.d.ts.map +1 -1
  154. package/dist/types/runtime/fragments.d.ts +4 -3
  155. package/dist/types/runtime/fragments.d.ts.map +1 -1
  156. package/dist/types/runtime/historical.d.ts +29 -13
  157. package/dist/types/runtime/historical.d.ts.map +1 -1
  158. package/dist/types/runtime/index.d.ts +49 -6
  159. package/dist/types/runtime/index.d.ts.map +1 -1
  160. package/dist/types/runtime/init.d.ts +5 -5
  161. package/dist/types/runtime/init.d.ts.map +1 -1
  162. package/dist/types/runtime/isolated.d.ts +14 -0
  163. package/dist/types/runtime/isolated.d.ts.map +1 -0
  164. package/dist/types/runtime/multichain.d.ts.map +1 -1
  165. package/dist/types/runtime/omnichain.d.ts.map +1 -1
  166. package/dist/types/runtime/realtime.d.ts +21 -10
  167. package/dist/types/runtime/realtime.d.ts.map +1 -1
  168. package/dist/types/sync-historical/index.d.ts +18 -8
  169. package/dist/types/sync-historical/index.d.ts.map +1 -1
  170. package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
  171. package/dist/types/sync-realtime/index.d.ts +2 -2
  172. package/dist/types/sync-realtime/index.d.ts.map +1 -1
  173. package/dist/types/sync-store/index.d.ts +9 -9
  174. package/dist/types/sync-store/index.d.ts.map +1 -1
  175. package/dist/types/utils/abi.d.ts +3 -34
  176. package/dist/types/utils/abi.d.ts.map +1 -1
  177. package/dist/types/utils/chunk.d.ts +2 -0
  178. package/dist/types/utils/chunk.d.ts.map +1 -0
  179. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  180. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  181. package/dist/types/utils/sql-parse.d.ts +21 -0
  182. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  183. package/package.json +2 -2
  184. package/src/bin/commands/createViews.ts +35 -15
  185. package/src/bin/commands/dev.ts +43 -21
  186. package/src/bin/commands/prune.ts +6 -0
  187. package/src/bin/commands/serve.ts +4 -1
  188. package/src/bin/commands/start.ts +20 -5
  189. package/src/bin/isolatedController.ts +300 -0
  190. package/src/bin/isolatedWorker.ts +192 -0
  191. package/src/build/config.ts +570 -632
  192. package/src/build/index.ts +14 -14
  193. package/src/build/pre.ts +1 -4
  194. package/src/build/schema.ts +49 -4
  195. package/src/client/index.ts +386 -48
  196. package/src/config/index.ts +3 -3
  197. package/src/database/actions.ts +469 -120
  198. package/src/database/index.ts +85 -58
  199. package/src/database/queryBuilder.ts +1 -0
  200. package/src/drizzle/index.ts +15 -7
  201. package/src/drizzle/onchain.ts +19 -0
  202. package/src/indexing/client.ts +38 -25
  203. package/src/indexing/index.ts +137 -230
  204. package/src/indexing/profile.ts +1 -1
  205. package/src/indexing-store/cache.ts +285 -414
  206. package/src/indexing-store/historical.ts +20 -10
  207. package/src/indexing-store/index.ts +16 -0
  208. package/src/indexing-store/profile.ts +3 -3
  209. package/src/indexing-store/realtime.ts +28 -0
  210. package/src/internal/errors.ts +26 -0
  211. package/src/internal/metrics.ts +341 -111
  212. package/src/internal/options.ts +4 -0
  213. package/src/internal/telemetry.ts +1 -1
  214. package/src/internal/types.ts +70 -87
  215. package/src/rpc/http.ts +164 -0
  216. package/src/rpc/index.ts +39 -7
  217. package/src/runtime/events.ts +195 -240
  218. package/src/runtime/filter.ts +85 -1
  219. package/src/runtime/fragments.ts +109 -113
  220. package/src/runtime/historical.ts +467 -189
  221. package/src/runtime/index.ts +337 -69
  222. package/src/runtime/init.ts +5 -5
  223. package/src/runtime/isolated.ts +768 -0
  224. package/src/runtime/multichain.ts +137 -102
  225. package/src/runtime/omnichain.ts +138 -106
  226. package/src/runtime/realtime.ts +322 -123
  227. package/src/sync-historical/index.ts +556 -692
  228. package/src/sync-realtime/bloom.ts +7 -3
  229. package/src/sync-realtime/index.ts +31 -46
  230. package/src/sync-store/index.ts +189 -95
  231. package/src/utils/abi.ts +33 -90
  232. package/src/utils/chunk.ts +7 -0
  233. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  234. package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
  235. package/dist/esm/client/parse.js.map +0 -1
  236. package/dist/types/client/parse.d.ts +0 -14
  237. package/dist/types/client/parse.d.ts.map +0 -1
@@ -1,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
- sources,
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
- sources: Source[];
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 blockSourceIndexes: number[] = [];
83
- const transactionSourceIndexes: number[] = [];
84
- const logSourceIndexes: number[] = [];
85
- const traceSourceIndexes: number[] = [];
86
- const transferSourceIndexes: number[] = [];
87
-
88
- for (let i = 0; i < sources.length; i++) {
89
- const source = sources[i]!;
90
- if (chainId !== source.filter.chainId) continue;
91
- if (source.filter.type === "block") {
92
- blockSourceIndexes.push(i);
93
- } else if (source.filter.type === "transaction") {
94
- transactionSourceIndexes.push(i);
95
- } else if (source.filter.type === "log") {
96
- logSourceIndexes.push(i);
97
- } else if (source.filter.type === "trace") {
98
- traceSourceIndexes.push(i);
99
- } else if (source.filter.type === "transfer") {
100
- transferSourceIndexes.push(i);
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 blockSourceIndex of blockSourceIndexes) {
110
- const filter = sources[blockSourceIndex]!.filter as BlockFilter;
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
- sourceIndex: blockSourceIndex,
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 transactionSourceIndex of transactionSourceIndexes) {
167
- const filter = sources[transactionSourceIndex]!
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
- sourceIndex: transactionSourceIndex,
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 traceSourceIndex of traceSourceIndexes) {
287
- const filter = sources[traceSourceIndex]!.filter as TraceFilter;
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
- sourceIndex: traceSourceIndex,
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 transferSourceIndex of transferSourceIndexes) {
339
- const filter = sources[transferSourceIndex]!.filter as TransferFilter;
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
- sourceIndex: transferSourceIndex,
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 logSourceIndex of logSourceIndexes) {
456
- const filter = sources[logSourceIndex]!.filter as LogFilter;
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
- sourceIndex: logSourceIndex,
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.chainId,
516
+ chainId: event.chain.id,
510
517
  checkpoint: encodeCheckpoint({
511
518
  ...MAX_CHECKPOINT,
512
519
  blockTimestamp: event.event.block.timestamp,
513
- chainId: BigInt(event.chainId),
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
- sources: Source[],
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 source = sources[event.sourceIndex]!;
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
- const { item, safeName } = abiItem;
616
-
617
- let decodedData: { args: readonly unknown[]; functionName: string };
618
- let decodedResult: readonly unknown[];
619
- try {
620
- decodedData = decodeFunctionData({
621
- abi: [item],
622
- data: event.trace!.input,
623
- });
624
-
625
- decodedResult = decodeFunctionResult({
626
- abi: [item],
627
- data: event.trace!.output ?? "0x",
628
- functionName: decodedData.functionName,
629
- });
630
- traceDecodeSuccessCount++;
631
- } catch (err) {
632
- traceDecodeFailureCount++;
633
- if (!traceDecodeFailureSelectors.has(selector)) {
634
- traceDecodeFailureSelectors.add(selector);
635
- common.logger.debug({
636
- msg: "Failed to decode matched call trace using provided ABI item",
637
- chain: source.chain.name,
638
- chain_id: source.chain.id,
639
- function: safeName,
640
- block_number: event?.block?.number ?? "unknown",
641
- transaction_index: event.transaction?.transactionIndex,
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
- break;
580
+ continue;
677
581
  }
678
582
 
679
- case "account": {
680
- switch (source.filter.type) {
681
- case "transaction": {
682
- const isFrom = source.filter.toAddress === undefined;
683
-
684
- events.push({
685
- type: "transaction",
686
- chainId: event.chainId,
687
- checkpoint: event.checkpoint,
688
-
689
- name: `${source.name}:transaction:${isFrom ? "from" : "to"}`,
690
-
691
- event: {
692
- id: event.checkpoint,
693
- block: event.block as Block,
694
- transaction: event.transaction! as Transaction,
695
- transactionReceipt:
696
- event.transactionReceipt as TransactionReceipt,
697
- },
698
- });
699
-
700
- break;
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
- case "transfer": {
704
- const isFrom = source.filter.toAddress === undefined;
705
-
706
- events.push({
707
- type: "transfer",
708
- chainId: event.chainId,
709
- checkpoint: event.checkpoint,
710
-
711
- name: `${source.name}:transfer:${isFrom ? "from" : "to"}`,
712
-
713
- event: {
714
- id: event.checkpoint,
715
- transfer: {
716
- from: event.trace!.from,
717
- to: event.trace!.to!,
718
- value: event.trace!.value!,
719
- },
720
- block: event.block as Block,
721
- transaction: event.transaction! as Transaction,
722
- transactionReceipt:
723
- event.transactionReceipt as TransactionReceipt,
724
- trace: event.trace! as Trace,
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
- break;
635
+ continue;
732
636
  }
733
637
 
734
- case "block": {
735
- events.push({
736
- type: "block",
737
- chainId: event.chainId,
738
- checkpoint: event.checkpoint,
739
- name: `${source.name}:block`,
740
- event: {
741
- id: event.checkpoint,
742
- block: event.block as Block,
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
- break;
746
- }
747
-
748
- default:
749
- never(source);
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
 
@@ -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",