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,8 +1,8 @@
1
1
  import type {
2
2
  BlockFilter,
3
3
  Factory,
4
+ Filter,
4
5
  FilterAddress,
5
- FilterWithoutBlocks,
6
6
  Fragment,
7
7
  FragmentAddress,
8
8
  FragmentAddressId,
@@ -24,9 +24,12 @@ export const isFragmentAddressFactory = (
24
24
  return true;
25
25
  };
26
26
 
27
- export const getFragments = (
28
- filter: FilterWithoutBlocks,
29
- ): FragmentReturnType => {
27
+ type FragmentReturnType = {
28
+ fragment: Fragment;
29
+ adjacentIds: FragmentId[];
30
+ }[];
31
+
32
+ export const getFragments = (filter: Filter): FragmentReturnType => {
30
33
  switch (filter.type) {
31
34
  case "block":
32
35
  return getBlockFilterFragment(filter as BlockFilter);
@@ -41,10 +44,25 @@ export const getFragments = (
41
44
  }
42
45
  };
43
46
 
44
- type FragmentReturnType = {
45
- fragment: Fragment;
46
- adjacentIds: FragmentId[];
47
- }[];
47
+ export const getFactoryFragments = (factory: Factory): Fragment[] => {
48
+ const fragments: Fragment[] = [];
49
+
50
+ for (const fragmentAddress of Array.isArray(factory.address)
51
+ ? factory.address
52
+ : [factory.address]) {
53
+ const fragment = {
54
+ type: "factory_log",
55
+ chainId: factory.chainId,
56
+ address: fragmentAddress,
57
+ eventSelector: factory.eventSelector,
58
+ childAddressLocation: factory.childAddressLocation,
59
+ } satisfies Fragment;
60
+
61
+ fragments.push(fragment);
62
+ }
63
+
64
+ return fragments;
65
+ };
48
66
 
49
67
  export const getAddressFragments = (
50
68
  address: Address | Address[] | Factory | undefined,
@@ -158,38 +176,30 @@ export const getTraceFilterFragments = ({
158
176
 
159
177
  for (const fromAddressFragment of fromAddressFragments) {
160
178
  for (const toAddressFragment of toAddressFragments) {
161
- for (const fragmentFunctionSelector of Array.isArray(functionSelector)
162
- ? functionSelector
163
- : [functionSelector]) {
164
- const fragment = {
165
- type: "trace",
166
- chainId,
167
- fromAddress: fromAddressFragment.fragment,
168
- toAddress: toAddressFragment.fragment,
169
- functionSelector: fragmentFunctionSelector ?? null,
170
- includeTransactionReceipts: filter.hasTransactionReceipt,
171
- } satisfies Fragment;
172
-
173
- const adjacentIds: FragmentId[] = [];
174
-
175
- for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {
176
- for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {
177
- for (const adjacentFunctionSelector of fragmentFunctionSelector
178
- ? [fragmentFunctionSelector, null]
179
- : [null]) {
180
- for (const adjacentTxr of filter.hasTransactionReceipt
181
- ? [1]
182
- : [0, 1]) {
183
- adjacentIds.push(
184
- `trace_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentFunctionSelector}_${adjacentTxr as 0 | 1}`,
185
- );
186
- }
187
- }
179
+ const fragment = {
180
+ type: "trace",
181
+ chainId,
182
+ fromAddress: fromAddressFragment.fragment,
183
+ toAddress: toAddressFragment.fragment,
184
+ functionSelector,
185
+ includeTransactionReceipts: filter.hasTransactionReceipt,
186
+ } satisfies Fragment;
187
+
188
+ const adjacentIds: FragmentId[] = [];
189
+
190
+ for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {
191
+ for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {
192
+ for (const adjacentTxr of filter.hasTransactionReceipt
193
+ ? [1]
194
+ : [0, 1]) {
195
+ adjacentIds.push(
196
+ `trace_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${functionSelector}_${adjacentTxr as 0 | 1}`,
197
+ );
188
198
  }
189
199
  }
190
-
191
- fragments.push({ fragment, adjacentIds });
192
200
  }
201
+
202
+ fragments.push({ fragment, adjacentIds });
193
203
  }
194
204
  }
195
205
 
@@ -207,57 +217,50 @@ export const getLogFilterFragments = ({
207
217
  }: Omit<LogFilter, "fromBlock" | "toBlock">): FragmentReturnType => {
208
218
  const fragments: FragmentReturnType = [];
209
219
  const addressFragments = getAddressFragments(address);
220
+ const eventSelector = topic0;
210
221
 
211
222
  for (const addressFragment of addressFragments) {
212
- for (const fragmentTopic0 of Array.isArray(topic0) ? topic0 : [topic0]) {
213
- for (const fragmentTopic1 of Array.isArray(topic1) ? topic1 : [topic1]) {
214
- for (const fragmentTopic2 of Array.isArray(topic2)
215
- ? topic2
216
- : [topic2]) {
217
- for (const fragmentTopic3 of Array.isArray(topic3)
218
- ? topic3
219
- : [topic3]) {
220
- const fragment = {
221
- type: "log",
222
- chainId,
223
- address: addressFragment.fragment,
224
- topic0: fragmentTopic0 ?? null,
225
- topic1: fragmentTopic1 ?? null,
226
- topic2: fragmentTopic2 ?? null,
227
- topic3: fragmentTopic3 ?? null,
228
- includeTransactionReceipts: filter.hasTransactionReceipt,
229
- } satisfies Fragment;
230
-
231
- const adjacentIds: FragmentId[] = [];
232
-
233
- for (const addressAdjacentId of addressFragment.adjacentIds) {
234
- for (const adjacentTopic0 of fragmentTopic0
235
- ? [fragmentTopic0, null]
223
+ for (const fragmentTopic1 of Array.isArray(topic1) ? topic1 : [topic1]) {
224
+ for (const fragmentTopic2 of Array.isArray(topic2) ? topic2 : [topic2]) {
225
+ for (const fragmentTopic3 of Array.isArray(topic3)
226
+ ? topic3
227
+ : [topic3]) {
228
+ const fragment = {
229
+ type: "log",
230
+ chainId,
231
+ address: addressFragment.fragment,
232
+ topic0: eventSelector,
233
+ topic1: fragmentTopic1 ?? null,
234
+ topic2: fragmentTopic2 ?? null,
235
+ topic3: fragmentTopic3 ?? null,
236
+ includeTransactionReceipts: filter.hasTransactionReceipt,
237
+ } satisfies Fragment;
238
+
239
+ const adjacentIds: FragmentId[] = [];
240
+
241
+ for (const addressAdjacentId of addressFragment.adjacentIds) {
242
+ for (const adjacentTopic1 of fragmentTopic1
243
+ ? [fragmentTopic1, null]
244
+ : [null]) {
245
+ for (const adjacentTopic2 of fragmentTopic2
246
+ ? [fragmentTopic2, null]
236
247
  : [null]) {
237
- for (const adjacentTopic1 of fragmentTopic1
238
- ? [fragmentTopic1, null]
248
+ for (const adjacentTopic3 of fragmentTopic3
249
+ ? [fragmentTopic3, null]
239
250
  : [null]) {
240
- for (const adjacentTopic2 of fragmentTopic2
241
- ? [fragmentTopic2, null]
242
- : [null]) {
243
- for (const adjacentTopic3 of fragmentTopic3
244
- ? [fragmentTopic3, null]
245
- : [null]) {
246
- for (const adjacentTxr of filter.hasTransactionReceipt
247
- ? [1]
248
- : [0, 1]) {
249
- adjacentIds.push(
250
- `log_${chainId}_${addressAdjacentId}_${adjacentTopic0}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr as 0 | 1}`,
251
- );
252
- }
253
- }
251
+ for (const adjacentTxr of filter.hasTransactionReceipt
252
+ ? [1]
253
+ : [0, 1]) {
254
+ adjacentIds.push(
255
+ `log_${chainId}_${addressAdjacentId}_${eventSelector}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr as 0 | 1}`,
256
+ );
254
257
  }
255
258
  }
256
259
  }
257
260
  }
258
-
259
- fragments.push({ fragment, adjacentIds });
260
261
  }
262
+
263
+ fragments.push({ fragment, adjacentIds });
261
264
  }
262
265
  }
263
266
  }
@@ -329,6 +332,8 @@ export const encodeFragment = (fragment: Fragment): FragmentId => {
329
332
  return `log_${fragment.chainId}_${fragmentAddressToId(fragment.address)}_${fragment.topic0}_${fragment.topic1}_${fragment.topic2}_${fragment.topic3}_${fragment.includeTransactionReceipts ? 1 : 0}`;
330
333
  case "transfer":
331
334
  return `transfer_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.includeTransactionReceipts ? 1 : 0}`;
335
+ case "factory_log":
336
+ return `factory_log_${fragment.chainId}_${fragment.address}_${fragment.eventSelector}_${fragment.childAddressLocation}`;
332
337
  }
333
338
  };
334
339
 
@@ -453,7 +458,7 @@ export const decodeFragment = (fragmentId: FragmentId): Fragment => {
453
458
  type: "log",
454
459
  chainId: Number(chainId),
455
460
  address: fragmentAddress,
456
- topic0: topic0! === "null" ? null : (topic0 as Hex),
461
+ topic0: topic0 as Hex,
457
462
  topic1: topic1! === "null" ? null : (topic1 as Hex),
458
463
  topic2: topic2! === "null" ? null : (topic2 as Hex),
459
464
  topic3: topic3! === "null" ? null : (topic3 as Hex),
@@ -468,7 +473,7 @@ export const decodeFragment = (fragmentId: FragmentId): Fragment => {
468
473
  type: "log",
469
474
  chainId: Number(chainId),
470
475
  address: fragmentAddress,
471
- topic0: topic0! === "null" ? null : (topic0 as Hex),
476
+ topic0: topic0 as Hex,
472
477
  topic1: topic1! === "null" ? null : (topic1 as Hex),
473
478
  topic2: topic2! === "null" ? null : (topic2 as Hex),
474
479
  topic3: topic3! === "null" ? null : (topic3 as Hex),
@@ -520,16 +525,29 @@ export const decodeFragment = (fragmentId: FragmentId): Fragment => {
520
525
  includeTransactionReceipts: includeTxr === "1",
521
526
  };
522
527
  }
528
+ case "factory_log": {
529
+ const [, chainId, address, eventSelector, childAddressLocation] =
530
+ fragmentId.split("_");
531
+ return {
532
+ type: "factory_log",
533
+ chainId: Number(chainId),
534
+ address: address as Address,
535
+ eventSelector: eventSelector as Factory["eventSelector"],
536
+ childAddressLocation:
537
+ childAddressLocation as Factory["childAddressLocation"],
538
+ };
539
+ }
523
540
  }
524
541
  };
525
542
 
526
- const recoverAddress = (
527
- baseAddress: FilterAddress,
543
+ const recoverAddress = <filterAddress extends FilterAddress>(
544
+ baseAddress: filterAddress,
528
545
  fragmentAddresses: FragmentAddress[],
529
- ): FilterAddress => {
530
- if (baseAddress === undefined) return undefined;
531
- if (typeof baseAddress === "string") return baseAddress;
532
- if (Array.isArray(baseAddress)) return dedupe(fragmentAddresses) as Address[];
546
+ ): filterAddress => {
547
+ if (baseAddress === undefined) return undefined as filterAddress;
548
+ if (typeof baseAddress === "string") return baseAddress as filterAddress;
549
+ if (Array.isArray(baseAddress))
550
+ return dedupe(fragmentAddresses) as filterAddress;
533
551
 
534
552
  // Note: At this point, `baseAddress` is a factory. We explicitly don't try to recover the factory
535
553
  // address from the fragments because we want a `insertChildAddresses` and `getChildAddresses` to
@@ -538,15 +556,6 @@ const recoverAddress = (
538
556
  return baseAddress;
539
557
  };
540
558
 
541
- const recoverSelector = (
542
- base: Hex | Hex[] | undefined,
543
- fragments: (Hex | null)[],
544
- ): Hex | Hex[] | undefined => {
545
- if (base === undefined) return undefined;
546
- if (typeof base === "string") return base;
547
- return dedupe(fragments) as Hex[];
548
- };
549
-
550
559
  const recoverTopic = (
551
560
  base: Hex | Hex[] | null,
552
561
  fragments: (Hex | null)[],
@@ -557,9 +566,9 @@ const recoverTopic = (
557
566
  };
558
567
 
559
568
  export const recoverFilter = (
560
- baseFilter: FilterWithoutBlocks,
569
+ baseFilter: Filter,
561
570
  fragments: Fragment[],
562
- ): FilterWithoutBlocks => {
571
+ ): Filter => {
563
572
  switch (baseFilter.type) {
564
573
  case "block": {
565
574
  return baseFilter;
@@ -596,14 +605,7 @@ export const recoverFilter = (
596
605
  (fragment) => fragment.toAddress,
597
606
  ),
598
607
  ),
599
- functionSelector: recoverSelector(
600
- baseFilter.functionSelector,
601
- fragments.map(
602
- (fragment) =>
603
- (fragment as Extract<Fragment, { type: "trace" }>)
604
- .functionSelector,
605
- ),
606
- ),
608
+ functionSelector: baseFilter.functionSelector,
607
609
  };
608
610
  }
609
611
  case "log": {
@@ -615,13 +617,7 @@ export const recoverFilter = (
615
617
  (fragment) => fragment.address,
616
618
  ),
617
619
  ),
618
- topic0: recoverTopic(
619
- baseFilter.topic0,
620
- fragments.map(
621
- (fragment) =>
622
- (fragment as Extract<Fragment, { type: "log" }>).topic0,
623
- ),
624
- ),
620
+ topic0: baseFilter.topic0,
625
621
  topic1: recoverTopic(
626
622
  baseFilter.topic1,
627
623
  fragments.map(