@mikeatlast/ponder 0.16.1-fork.1

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 (619) hide show
  1. package/CHANGELOG.md +3415 -0
  2. package/README.md +186 -0
  3. package/dist/esm/bin/commands/codegen.js +46 -0
  4. package/dist/esm/bin/commands/codegen.js.map +1 -0
  5. package/dist/esm/bin/commands/createViews.js +196 -0
  6. package/dist/esm/bin/commands/createViews.js.map +1 -0
  7. package/dist/esm/bin/commands/dev.js +430 -0
  8. package/dist/esm/bin/commands/dev.js.map +1 -0
  9. package/dist/esm/bin/commands/list.js +148 -0
  10. package/dist/esm/bin/commands/list.js.map +1 -0
  11. package/dist/esm/bin/commands/prune.js +223 -0
  12. package/dist/esm/bin/commands/prune.js.map +1 -0
  13. package/dist/esm/bin/commands/serve.js +198 -0
  14. package/dist/esm/bin/commands/serve.js.map +1 -0
  15. package/dist/esm/bin/commands/start.js +253 -0
  16. package/dist/esm/bin/commands/start.js.map +1 -0
  17. package/dist/esm/bin/isolatedController.js +200 -0
  18. package/dist/esm/bin/isolatedController.js.map +1 -0
  19. package/dist/esm/bin/isolatedWorker.js +146 -0
  20. package/dist/esm/bin/isolatedWorker.js.map +1 -0
  21. package/dist/esm/bin/ponder.js +137 -0
  22. package/dist/esm/bin/ponder.js.map +1 -0
  23. package/dist/esm/bin/utils/codegen.js +25 -0
  24. package/dist/esm/bin/utils/codegen.js.map +1 -0
  25. package/dist/esm/bin/utils/exit.js +100 -0
  26. package/dist/esm/bin/utils/exit.js.map +1 -0
  27. package/dist/esm/build/config.js +745 -0
  28. package/dist/esm/build/config.js.map +1 -0
  29. package/dist/esm/build/factory.js +82 -0
  30. package/dist/esm/build/factory.js.map +1 -0
  31. package/dist/esm/build/index.js +567 -0
  32. package/dist/esm/build/index.js.map +1 -0
  33. package/dist/esm/build/plugin.js +53 -0
  34. package/dist/esm/build/plugin.js.map +1 -0
  35. package/dist/esm/build/pre.js +83 -0
  36. package/dist/esm/build/pre.js.map +1 -0
  37. package/dist/esm/build/schema.js +202 -0
  38. package/dist/esm/build/schema.js.map +1 -0
  39. package/dist/esm/build/stacktrace.js +137 -0
  40. package/dist/esm/build/stacktrace.js.map +1 -0
  41. package/dist/esm/client/index.js +441 -0
  42. package/dist/esm/client/index.js.map +1 -0
  43. package/dist/esm/config/address.js +2 -0
  44. package/dist/esm/config/address.js.map +1 -0
  45. package/dist/esm/config/eventFilter.js +2 -0
  46. package/dist/esm/config/eventFilter.js.map +1 -0
  47. package/dist/esm/config/index.js +2 -0
  48. package/dist/esm/config/index.js.map +1 -0
  49. package/dist/esm/config/utilityTypes.js +2 -0
  50. package/dist/esm/config/utilityTypes.js.map +1 -0
  51. package/dist/esm/database/actions.js +445 -0
  52. package/dist/esm/database/actions.js.map +1 -0
  53. package/dist/esm/database/index.js +604 -0
  54. package/dist/esm/database/index.js.map +1 -0
  55. package/dist/esm/database/queryBuilder.js +314 -0
  56. package/dist/esm/database/queryBuilder.js.map +1 -0
  57. package/dist/esm/drizzle/bigint.js +38 -0
  58. package/dist/esm/drizzle/bigint.js.map +1 -0
  59. package/dist/esm/drizzle/bytes.js +47 -0
  60. package/dist/esm/drizzle/bytes.js.map +1 -0
  61. package/dist/esm/drizzle/hex.js +40 -0
  62. package/dist/esm/drizzle/hex.js.map +1 -0
  63. package/dist/esm/drizzle/index.js +28 -0
  64. package/dist/esm/drizzle/index.js.map +1 -0
  65. package/dist/esm/drizzle/json.js +123 -0
  66. package/dist/esm/drizzle/json.js.map +1 -0
  67. package/dist/esm/drizzle/kit/index.js +927 -0
  68. package/dist/esm/drizzle/kit/index.js.map +1 -0
  69. package/dist/esm/drizzle/onchain.js +184 -0
  70. package/dist/esm/drizzle/onchain.js.map +1 -0
  71. package/dist/esm/drizzle/text.js +61 -0
  72. package/dist/esm/drizzle/text.js.map +1 -0
  73. package/dist/esm/graphql/graphiql.html.js +59 -0
  74. package/dist/esm/graphql/graphiql.html.js.map +1 -0
  75. package/dist/esm/graphql/index.js +934 -0
  76. package/dist/esm/graphql/index.js.map +1 -0
  77. package/dist/esm/graphql/json.js +42 -0
  78. package/dist/esm/graphql/json.js.map +1 -0
  79. package/dist/esm/graphql/middleware.js +83 -0
  80. package/dist/esm/graphql/middleware.js.map +1 -0
  81. package/dist/esm/index.js +9 -0
  82. package/dist/esm/index.js.map +1 -0
  83. package/dist/esm/indexing/addStackTrace.js +54 -0
  84. package/dist/esm/indexing/addStackTrace.js.map +1 -0
  85. package/dist/esm/indexing/client.js +675 -0
  86. package/dist/esm/indexing/client.js.map +1 -0
  87. package/dist/esm/indexing/index.js +663 -0
  88. package/dist/esm/indexing/index.js.map +1 -0
  89. package/dist/esm/indexing/profile.js +584 -0
  90. package/dist/esm/indexing/profile.js.map +1 -0
  91. package/dist/esm/indexing-store/cache.js +666 -0
  92. package/dist/esm/indexing-store/cache.js.map +1 -0
  93. package/dist/esm/indexing-store/index.js +461 -0
  94. package/dist/esm/indexing-store/index.js.map +1 -0
  95. package/dist/esm/indexing-store/profile.js +428 -0
  96. package/dist/esm/indexing-store/profile.js.map +1 -0
  97. package/dist/esm/indexing-store/utils.js +111 -0
  98. package/dist/esm/indexing-store/utils.js.map +1 -0
  99. package/dist/esm/internal/common.js +2 -0
  100. package/dist/esm/internal/common.js.map +1 -0
  101. package/dist/esm/internal/errors.js +300 -0
  102. package/dist/esm/internal/errors.js.map +1 -0
  103. package/dist/esm/internal/logger.js +178 -0
  104. package/dist/esm/internal/logger.js.map +1 -0
  105. package/dist/esm/internal/metrics.js +1049 -0
  106. package/dist/esm/internal/metrics.js.map +1 -0
  107. package/dist/esm/internal/options.js +73 -0
  108. package/dist/esm/internal/options.js.map +1 -0
  109. package/dist/esm/internal/shutdown.js +24 -0
  110. package/dist/esm/internal/shutdown.js.map +1 -0
  111. package/dist/esm/internal/telemetry.js +200 -0
  112. package/dist/esm/internal/telemetry.js.map +1 -0
  113. package/dist/esm/internal/types.js +2 -0
  114. package/dist/esm/internal/types.js.map +1 -0
  115. package/dist/esm/rpc/actions.js +988 -0
  116. package/dist/esm/rpc/actions.js.map +1 -0
  117. package/dist/esm/rpc/http.js +130 -0
  118. package/dist/esm/rpc/http.js.map +1 -0
  119. package/dist/esm/rpc/index.js +749 -0
  120. package/dist/esm/rpc/index.js.map +1 -0
  121. package/dist/esm/runtime/events.js +664 -0
  122. package/dist/esm/runtime/events.js.map +1 -0
  123. package/dist/esm/runtime/filter.js +476 -0
  124. package/dist/esm/runtime/filter.js.map +1 -0
  125. package/dist/esm/runtime/fragments.js +478 -0
  126. package/dist/esm/runtime/fragments.js.map +1 -0
  127. package/dist/esm/runtime/historical.js +954 -0
  128. package/dist/esm/runtime/historical.js.map +1 -0
  129. package/dist/esm/runtime/index.js +316 -0
  130. package/dist/esm/runtime/index.js.map +1 -0
  131. package/dist/esm/runtime/init.js +12 -0
  132. package/dist/esm/runtime/init.js.map +1 -0
  133. package/dist/esm/runtime/isolated.js +464 -0
  134. package/dist/esm/runtime/isolated.js.map +1 -0
  135. package/dist/esm/runtime/multichain.js +511 -0
  136. package/dist/esm/runtime/multichain.js.map +1 -0
  137. package/dist/esm/runtime/omnichain.js +546 -0
  138. package/dist/esm/runtime/omnichain.js.map +1 -0
  139. package/dist/esm/runtime/realtime.js +722 -0
  140. package/dist/esm/runtime/realtime.js.map +1 -0
  141. package/dist/esm/server/error.js +56 -0
  142. package/dist/esm/server/error.js.map +1 -0
  143. package/dist/esm/server/index.js +121 -0
  144. package/dist/esm/server/index.js.map +1 -0
  145. package/dist/esm/sync-historical/index.js +703 -0
  146. package/dist/esm/sync-historical/index.js.map +1 -0
  147. package/dist/esm/sync-realtime/bloom.js +76 -0
  148. package/dist/esm/sync-realtime/bloom.js.map +1 -0
  149. package/dist/esm/sync-realtime/index.js +918 -0
  150. package/dist/esm/sync-realtime/index.js.map +1 -0
  151. package/dist/esm/sync-store/encode.js +105 -0
  152. package/dist/esm/sync-store/encode.js.map +1 -0
  153. package/dist/esm/sync-store/index.js +885 -0
  154. package/dist/esm/sync-store/index.js.map +1 -0
  155. package/dist/esm/sync-store/migrations.js +1595 -0
  156. package/dist/esm/sync-store/migrations.js.map +1 -0
  157. package/dist/esm/sync-store/schema.js +181 -0
  158. package/dist/esm/sync-store/schema.js.map +1 -0
  159. package/dist/esm/types/db.js +2 -0
  160. package/dist/esm/types/db.js.map +1 -0
  161. package/dist/esm/types/eth.js +2 -0
  162. package/dist/esm/types/eth.js.map +1 -0
  163. package/dist/esm/types/utils.js +2 -0
  164. package/dist/esm/types/utils.js.map +1 -0
  165. package/dist/esm/types/virtual.js +2 -0
  166. package/dist/esm/types/virtual.js.map +1 -0
  167. package/dist/esm/ui/app.js +157 -0
  168. package/dist/esm/ui/app.js.map +1 -0
  169. package/dist/esm/ui/index.js +29 -0
  170. package/dist/esm/ui/index.js.map +1 -0
  171. package/dist/esm/ui/patch.js +140 -0
  172. package/dist/esm/ui/patch.js.map +1 -0
  173. package/dist/esm/utils/abi.js +55 -0
  174. package/dist/esm/utils/abi.js.map +1 -0
  175. package/dist/esm/utils/bigint.js +37 -0
  176. package/dist/esm/utils/bigint.js.map +1 -0
  177. package/dist/esm/utils/chains.js +21 -0
  178. package/dist/esm/utils/chains.js.map +1 -0
  179. package/dist/esm/utils/checkpoint.js +139 -0
  180. package/dist/esm/utils/checkpoint.js.map +1 -0
  181. package/dist/esm/utils/chunk.js +8 -0
  182. package/dist/esm/utils/chunk.js.map +1 -0
  183. package/dist/esm/utils/copy.js +129 -0
  184. package/dist/esm/utils/copy.js.map +1 -0
  185. package/dist/esm/utils/date.js +27 -0
  186. package/dist/esm/utils/date.js.map +1 -0
  187. package/dist/esm/utils/debug.js +2 -0
  188. package/dist/esm/utils/debug.js.map +1 -0
  189. package/dist/esm/utils/decodeAbiParameters.js +290 -0
  190. package/dist/esm/utils/decodeAbiParameters.js.map +1 -0
  191. package/dist/esm/utils/decodeEventLog.js +75 -0
  192. package/dist/esm/utils/decodeEventLog.js.map +1 -0
  193. package/dist/esm/utils/dedupe.js +29 -0
  194. package/dist/esm/utils/dedupe.js.map +1 -0
  195. package/dist/esm/utils/duplicates.js +19 -0
  196. package/dist/esm/utils/duplicates.js.map +1 -0
  197. package/dist/esm/utils/estimate.js +6 -0
  198. package/dist/esm/utils/estimate.js.map +1 -0
  199. package/dist/esm/utils/finality.js +38 -0
  200. package/dist/esm/utils/finality.js.map +1 -0
  201. package/dist/esm/utils/format.js +20 -0
  202. package/dist/esm/utils/format.js.map +1 -0
  203. package/dist/esm/utils/generators.js +121 -0
  204. package/dist/esm/utils/generators.js.map +1 -0
  205. package/dist/esm/utils/hash.js +11 -0
  206. package/dist/esm/utils/hash.js.map +1 -0
  207. package/dist/esm/utils/interval.js +171 -0
  208. package/dist/esm/utils/interval.js.map +1 -0
  209. package/dist/esm/utils/lowercase.js +7 -0
  210. package/dist/esm/utils/lowercase.js.map +1 -0
  211. package/dist/esm/utils/mutex.js +26 -0
  212. package/dist/esm/utils/mutex.js.map +1 -0
  213. package/dist/esm/utils/never.js +4 -0
  214. package/dist/esm/utils/never.js.map +1 -0
  215. package/dist/esm/utils/offset.js +101 -0
  216. package/dist/esm/utils/offset.js.map +1 -0
  217. package/dist/esm/utils/order.js +18 -0
  218. package/dist/esm/utils/order.js.map +1 -0
  219. package/dist/esm/utils/partition.js +46 -0
  220. package/dist/esm/utils/partition.js.map +1 -0
  221. package/dist/esm/utils/pg.js +175 -0
  222. package/dist/esm/utils/pg.js.map +1 -0
  223. package/dist/esm/utils/pglite.js +80 -0
  224. package/dist/esm/utils/pglite.js.map +1 -0
  225. package/dist/esm/utils/port.js +30 -0
  226. package/dist/esm/utils/port.js.map +1 -0
  227. package/dist/esm/utils/print.js +23 -0
  228. package/dist/esm/utils/print.js.map +1 -0
  229. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  230. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  231. package/dist/esm/utils/promiseWithResolvers.js +13 -0
  232. package/dist/esm/utils/promiseWithResolvers.js.map +1 -0
  233. package/dist/esm/utils/queue.js +150 -0
  234. package/dist/esm/utils/queue.js.map +1 -0
  235. package/dist/esm/utils/range.js +8 -0
  236. package/dist/esm/utils/range.js.map +1 -0
  237. package/dist/esm/utils/result.js +10 -0
  238. package/dist/esm/utils/result.js.map +1 -0
  239. package/dist/esm/utils/sql-parse.js +1326 -0
  240. package/dist/esm/utils/sql-parse.js.map +1 -0
  241. package/dist/esm/utils/timer.js +9 -0
  242. package/dist/esm/utils/timer.js.map +1 -0
  243. package/dist/esm/utils/truncate.js +15 -0
  244. package/dist/esm/utils/truncate.js.map +1 -0
  245. package/dist/esm/utils/wait.js +10 -0
  246. package/dist/esm/utils/wait.js.map +1 -0
  247. package/dist/esm/utils/zipper.js +67 -0
  248. package/dist/esm/utils/zipper.js.map +1 -0
  249. package/dist/types/bin/commands/codegen.d.ts +5 -0
  250. package/dist/types/bin/commands/codegen.d.ts.map +1 -0
  251. package/dist/types/bin/commands/createViews.d.ts +8 -0
  252. package/dist/types/bin/commands/createViews.d.ts.map +1 -0
  253. package/dist/types/bin/commands/dev.d.ts +5 -0
  254. package/dist/types/bin/commands/dev.d.ts.map +1 -0
  255. package/dist/types/bin/commands/list.d.ts +5 -0
  256. package/dist/types/bin/commands/list.d.ts.map +1 -0
  257. package/dist/types/bin/commands/prune.d.ts +5 -0
  258. package/dist/types/bin/commands/prune.d.ts.map +1 -0
  259. package/dist/types/bin/commands/serve.d.ts +5 -0
  260. package/dist/types/bin/commands/serve.d.ts.map +1 -0
  261. package/dist/types/bin/commands/start.d.ts +19 -0
  262. package/dist/types/bin/commands/start.d.ts.map +1 -0
  263. package/dist/types/bin/isolatedController.d.ts +13 -0
  264. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  265. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  266. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  267. package/dist/types/bin/ponder.d.ts +37 -0
  268. package/dist/types/bin/ponder.d.ts.map +1 -0
  269. package/dist/types/bin/utils/codegen.d.ts +6 -0
  270. package/dist/types/bin/utils/codegen.d.ts.map +1 -0
  271. package/dist/types/bin/utils/exit.d.ts +10 -0
  272. package/dist/types/bin/utils/exit.d.ts.map +1 -0
  273. package/dist/types/build/config.d.ts +97 -0
  274. package/dist/types/build/config.d.ts.map +1 -0
  275. package/dist/types/build/factory.d.ts +15 -0
  276. package/dist/types/build/factory.d.ts.map +1 -0
  277. package/dist/types/build/index.d.ts +84 -0
  278. package/dist/types/build/index.d.ts.map +1 -0
  279. package/dist/types/build/plugin.d.ts +4 -0
  280. package/dist/types/build/plugin.d.ts.map +1 -0
  281. package/dist/types/build/pre.d.ts +29 -0
  282. package/dist/types/build/pre.d.ts.map +1 -0
  283. package/dist/types/build/schema.d.ts +20 -0
  284. package/dist/types/build/schema.d.ts.map +1 -0
  285. package/dist/types/build/stacktrace.d.ts +13 -0
  286. package/dist/types/build/stacktrace.d.ts.map +1 -0
  287. package/dist/types/client/index.d.ts +27 -0
  288. package/dist/types/client/index.d.ts.map +1 -0
  289. package/dist/types/config/address.d.ts +34 -0
  290. package/dist/types/config/address.d.ts.map +1 -0
  291. package/dist/types/config/eventFilter.d.ts +18 -0
  292. package/dist/types/config/eventFilter.d.ts.map +1 -0
  293. package/dist/types/config/index.d.ts +144 -0
  294. package/dist/types/config/index.d.ts.map +1 -0
  295. package/dist/types/config/utilityTypes.d.ts +43 -0
  296. package/dist/types/config/utilityTypes.d.ts.map +1 -0
  297. package/dist/types/database/actions.d.ts +99 -0
  298. package/dist/types/database/actions.d.ts.map +1 -0
  299. package/dist/types/database/index.d.ts +493 -0
  300. package/dist/types/database/index.d.ts.map +1 -0
  301. package/dist/types/database/queryBuilder.d.ts +65 -0
  302. package/dist/types/database/queryBuilder.d.ts.map +1 -0
  303. package/dist/types/drizzle/bigint.d.ts +25 -0
  304. package/dist/types/drizzle/bigint.d.ts.map +1 -0
  305. package/dist/types/drizzle/bytes.d.ts +31 -0
  306. package/dist/types/drizzle/bytes.d.ts.map +1 -0
  307. package/dist/types/drizzle/hex.d.ts +25 -0
  308. package/dist/types/drizzle/hex.d.ts.map +1 -0
  309. package/dist/types/drizzle/index.d.ts +6 -0
  310. package/dist/types/drizzle/index.d.ts.map +1 -0
  311. package/dist/types/drizzle/json.d.ts +51 -0
  312. package/dist/types/drizzle/json.d.ts.map +1 -0
  313. package/dist/types/drizzle/kit/index.d.ts +187 -0
  314. package/dist/types/drizzle/kit/index.d.ts.map +1 -0
  315. package/dist/types/drizzle/onchain.d.ts +298 -0
  316. package/dist/types/drizzle/onchain.d.ts.map +1 -0
  317. package/dist/types/drizzle/text.d.ts +29 -0
  318. package/dist/types/drizzle/text.d.ts.map +1 -0
  319. package/dist/types/graphql/graphiql.html.d.ts +2 -0
  320. package/dist/types/graphql/graphiql.html.d.ts.map +1 -0
  321. package/dist/types/graphql/index.d.ts +12 -0
  322. package/dist/types/graphql/index.d.ts.map +1 -0
  323. package/dist/types/graphql/json.d.ts +3 -0
  324. package/dist/types/graphql/json.d.ts.map +1 -0
  325. package/dist/types/graphql/middleware.d.ts +29 -0
  326. package/dist/types/graphql/middleware.d.ts.map +1 -0
  327. package/dist/types/index.d.ts +23 -0
  328. package/dist/types/index.d.ts.map +1 -0
  329. package/dist/types/indexing/addStackTrace.d.ts +3 -0
  330. package/dist/types/indexing/addStackTrace.d.ts.map +1 -0
  331. package/dist/types/indexing/client.d.ts +154 -0
  332. package/dist/types/indexing/client.d.ts.map +1 -0
  333. package/dist/types/indexing/index.d.ts +72 -0
  334. package/dist/types/indexing/index.d.ts.map +1 -0
  335. package/dist/types/indexing/profile.d.ts +16 -0
  336. package/dist/types/indexing/profile.d.ts.map +1 -0
  337. package/dist/types/indexing-store/cache.d.ts +115 -0
  338. package/dist/types/indexing-store/cache.d.ts.map +1 -0
  339. package/dist/types/indexing-store/index.d.ts +24 -0
  340. package/dist/types/indexing-store/index.d.ts.map +1 -0
  341. package/dist/types/indexing-store/profile.d.ts +7 -0
  342. package/dist/types/indexing-store/profile.d.ts.map +1 -0
  343. package/dist/types/indexing-store/utils.d.ts +19 -0
  344. package/dist/types/indexing-store/utils.d.ts.map +1 -0
  345. package/dist/types/internal/common.d.ts +15 -0
  346. package/dist/types/internal/common.d.ts.map +1 -0
  347. package/dist/types/internal/errors.d.ts +101 -0
  348. package/dist/types/internal/errors.d.ts.map +1 -0
  349. package/dist/types/internal/logger.d.ts +37 -0
  350. package/dist/types/internal/logger.d.ts.map +1 -0
  351. package/dist/types/internal/metrics.d.ts +120 -0
  352. package/dist/types/internal/metrics.d.ts.map +1 -0
  353. package/dist/types/internal/options.d.ts +62 -0
  354. package/dist/types/internal/options.d.ts.map +1 -0
  355. package/dist/types/internal/shutdown.d.ts +8 -0
  356. package/dist/types/internal/shutdown.d.ts.map +1 -0
  357. package/dist/types/internal/telemetry.d.ts +43 -0
  358. package/dist/types/internal/telemetry.d.ts.map +1 -0
  359. package/dist/types/internal/types.d.ts +443 -0
  360. package/dist/types/internal/types.d.ts.map +1 -0
  361. package/dist/types/rpc/actions.d.ts +360 -0
  362. package/dist/types/rpc/actions.d.ts.map +1 -0
  363. package/dist/types/rpc/http.d.ts +17 -0
  364. package/dist/types/rpc/http.d.ts.map +1 -0
  365. package/dist/types/rpc/index.d.ts +43 -0
  366. package/dist/types/rpc/index.d.ts.map +1 -0
  367. package/dist/types/runtime/events.d.ts +40 -0
  368. package/dist/types/runtime/events.d.ts.map +1 -0
  369. package/dist/types/runtime/filter.d.ts +96 -0
  370. package/dist/types/runtime/filter.d.ts.map +1 -0
  371. package/dist/types/runtime/fragments.d.ts +30 -0
  372. package/dist/types/runtime/fragments.d.ts.map +1 -0
  373. package/dist/types/runtime/historical.d.ts +123 -0
  374. package/dist/types/runtime/historical.d.ts.map +1 -0
  375. package/dist/types/runtime/index.d.ts +89 -0
  376. package/dist/types/runtime/index.d.ts.map +1 -0
  377. package/dist/types/runtime/init.d.ts +28 -0
  378. package/dist/types/runtime/init.d.ts.map +1 -0
  379. package/dist/types/runtime/isolated.d.ts +14 -0
  380. package/dist/types/runtime/isolated.d.ts.map +1 -0
  381. package/dist/types/runtime/multichain.d.ts +13 -0
  382. package/dist/types/runtime/multichain.d.ts.map +1 -0
  383. package/dist/types/runtime/omnichain.d.ts +23 -0
  384. package/dist/types/runtime/omnichain.d.ts.map +1 -0
  385. package/dist/types/runtime/realtime.d.ts +93 -0
  386. package/dist/types/runtime/realtime.d.ts.map +1 -0
  387. package/dist/types/server/error.d.ts +5 -0
  388. package/dist/types/server/error.d.ts.map +1 -0
  389. package/dist/types/server/index.d.ts +13 -0
  390. package/dist/types/server/index.d.ts.map +1 -0
  391. package/dist/types/sync-historical/index.d.ts +36 -0
  392. package/dist/types/sync-historical/index.d.ts.map +1 -0
  393. package/dist/types/sync-realtime/bloom.d.ts +18 -0
  394. package/dist/types/sync-realtime/bloom.d.ts.map +1 -0
  395. package/dist/types/sync-realtime/index.d.ts +48 -0
  396. package/dist/types/sync-realtime/index.d.ts.map +1 -0
  397. package/dist/types/sync-store/encode.d.ts +25 -0
  398. package/dist/types/sync-store/encode.d.ts.map +1 -0
  399. package/dist/types/sync-store/index.d.ts +135 -0
  400. package/dist/types/sync-store/index.d.ts.map +1 -0
  401. package/dist/types/sync-store/migrations.d.ts +8 -0
  402. package/dist/types/sync-store/migrations.d.ts.map +1 -0
  403. package/dist/types/sync-store/schema.d.ts +1828 -0
  404. package/dist/types/sync-store/schema.d.ts.map +1 -0
  405. package/dist/types/types/db.d.ts +213 -0
  406. package/dist/types/types/db.d.ts.map +1 -0
  407. package/dist/types/types/eth.d.ts +196 -0
  408. package/dist/types/types/eth.d.ts.map +1 -0
  409. package/dist/types/types/utils.d.ts +38 -0
  410. package/dist/types/types/utils.d.ts.map +1 -0
  411. package/dist/types/types/virtual.d.ts +99 -0
  412. package/dist/types/types/virtual.d.ts.map +1 -0
  413. package/dist/types/ui/app.d.ts +22 -0
  414. package/dist/types/ui/app.d.ts.map +1 -0
  415. package/dist/types/ui/index.d.ts +5 -0
  416. package/dist/types/ui/index.d.ts.map +1 -0
  417. package/dist/types/ui/patch.d.ts +7 -0
  418. package/dist/types/ui/patch.d.ts.map +1 -0
  419. package/dist/types/utils/abi.d.ts +23 -0
  420. package/dist/types/utils/abi.d.ts.map +1 -0
  421. package/dist/types/utils/bigint.d.ts +15 -0
  422. package/dist/types/utils/bigint.d.ts.map +1 -0
  423. package/dist/types/utils/chains.d.ts +42 -0
  424. package/dist/types/utils/chains.d.ts.map +1 -0
  425. package/dist/types/utils/checkpoint.d.ts +52 -0
  426. package/dist/types/utils/checkpoint.d.ts.map +1 -0
  427. package/dist/types/utils/chunk.d.ts +2 -0
  428. package/dist/types/utils/chunk.d.ts.map +1 -0
  429. package/dist/types/utils/copy.d.ts +16 -0
  430. package/dist/types/utils/copy.d.ts.map +1 -0
  431. package/dist/types/utils/date.d.ts +7 -0
  432. package/dist/types/utils/date.d.ts.map +1 -0
  433. package/dist/types/utils/debug.d.ts +105 -0
  434. package/dist/types/utils/debug.d.ts.map +1 -0
  435. package/dist/types/utils/decodeAbiParameters.d.ts +28 -0
  436. package/dist/types/utils/decodeAbiParameters.d.ts.map +1 -0
  437. package/dist/types/utils/decodeEventLog.d.ts +12 -0
  438. package/dist/types/utils/decodeEventLog.d.ts.map +1 -0
  439. package/dist/types/utils/dedupe.d.ts +20 -0
  440. package/dist/types/utils/dedupe.d.ts.map +1 -0
  441. package/dist/types/utils/duplicates.d.ts +7 -0
  442. package/dist/types/utils/duplicates.d.ts.map +1 -0
  443. package/dist/types/utils/estimate.d.ts +11 -0
  444. package/dist/types/utils/estimate.d.ts.map +1 -0
  445. package/dist/types/utils/finality.d.ts +12 -0
  446. package/dist/types/utils/finality.d.ts.map +1 -0
  447. package/dist/types/utils/format.d.ts +3 -0
  448. package/dist/types/utils/format.d.ts.map +1 -0
  449. package/dist/types/utils/generators.d.ts +42 -0
  450. package/dist/types/utils/generators.d.ts.map +1 -0
  451. package/dist/types/utils/hash.d.ts +11 -0
  452. package/dist/types/utils/hash.d.ts.map +1 -0
  453. package/dist/types/utils/interval.d.ts +53 -0
  454. package/dist/types/utils/interval.d.ts.map +1 -0
  455. package/dist/types/utils/lowercase.d.ts +5 -0
  456. package/dist/types/utils/lowercase.d.ts.map +1 -0
  457. package/dist/types/utils/mutex.d.ts +5 -0
  458. package/dist/types/utils/mutex.d.ts.map +1 -0
  459. package/dist/types/utils/never.d.ts +2 -0
  460. package/dist/types/utils/never.d.ts.map +1 -0
  461. package/dist/types/utils/offset.d.ts +8 -0
  462. package/dist/types/utils/offset.d.ts.map +1 -0
  463. package/dist/types/utils/order.d.ts +2 -0
  464. package/dist/types/utils/order.d.ts.map +1 -0
  465. package/dist/types/utils/partition.d.ts +22 -0
  466. package/dist/types/utils/partition.d.ts.map +1 -0
  467. package/dist/types/utils/pg.d.ts +8 -0
  468. package/dist/types/utils/pg.d.ts.map +1 -0
  469. package/dist/types/utils/pglite.d.ts +25 -0
  470. package/dist/types/utils/pglite.d.ts.map +1 -0
  471. package/dist/types/utils/port.d.ts +5 -0
  472. package/dist/types/utils/port.d.ts.map +1 -0
  473. package/dist/types/utils/print.d.ts +2 -0
  474. package/dist/types/utils/print.d.ts.map +1 -0
  475. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  476. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  477. package/dist/types/utils/promiseWithResolvers.d.ts +10 -0
  478. package/dist/types/utils/promiseWithResolvers.d.ts.map +1 -0
  479. package/dist/types/utils/queue.d.ts +33 -0
  480. package/dist/types/utils/queue.d.ts.map +1 -0
  481. package/dist/types/utils/range.d.ts +8 -0
  482. package/dist/types/utils/range.d.ts.map +1 -0
  483. package/dist/types/utils/result.d.ts +17 -0
  484. package/dist/types/utils/result.d.ts.map +1 -0
  485. package/dist/types/utils/sql-parse.d.ts +21 -0
  486. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  487. package/dist/types/utils/timer.d.ts +6 -0
  488. package/dist/types/utils/timer.d.ts.map +1 -0
  489. package/dist/types/utils/truncate.d.ts +9 -0
  490. package/dist/types/utils/truncate.d.ts.map +1 -0
  491. package/dist/types/utils/wait.d.ts +6 -0
  492. package/dist/types/utils/wait.d.ts.map +1 -0
  493. package/dist/types/utils/zipper.d.ts +36 -0
  494. package/dist/types/utils/zipper.d.ts.map +1 -0
  495. package/package.json +114 -0
  496. package/src/bin/commands/codegen.ts +56 -0
  497. package/src/bin/commands/createViews.ts +318 -0
  498. package/src/bin/commands/dev.ts +490 -0
  499. package/src/bin/commands/list.ts +208 -0
  500. package/src/bin/commands/prune.ts +322 -0
  501. package/src/bin/commands/serve.ts +236 -0
  502. package/src/bin/commands/start.ts +319 -0
  503. package/src/bin/isolatedController.ts +300 -0
  504. package/src/bin/isolatedWorker.ts +192 -0
  505. package/src/bin/ponder.ts +208 -0
  506. package/src/bin/utils/codegen.ts +32 -0
  507. package/src/bin/utils/exit.ts +112 -0
  508. package/src/build/config.ts +1141 -0
  509. package/src/build/factory.ts +147 -0
  510. package/src/build/index.ts +790 -0
  511. package/src/build/plugin.ts +58 -0
  512. package/src/build/pre.ts +114 -0
  513. package/src/build/schema.ts +358 -0
  514. package/src/build/stacktrace.ts +137 -0
  515. package/src/client/index.ts +551 -0
  516. package/src/config/address.ts +45 -0
  517. package/src/config/eventFilter.ts +33 -0
  518. package/src/config/index.ts +240 -0
  519. package/src/config/utilityTypes.ts +152 -0
  520. package/src/database/actions.ts +873 -0
  521. package/src/database/index.ts +1029 -0
  522. package/src/database/queryBuilder.ts +537 -0
  523. package/src/drizzle/bigint.ts +57 -0
  524. package/src/drizzle/bytes.ts +68 -0
  525. package/src/drizzle/hex.ts +58 -0
  526. package/src/drizzle/index.ts +40 -0
  527. package/src/drizzle/json.ts +159 -0
  528. package/src/drizzle/kit/index.ts +1348 -0
  529. package/src/drizzle/onchain.ts +476 -0
  530. package/src/drizzle/text.ts +77 -0
  531. package/src/graphql/graphiql.html.ts +59 -0
  532. package/src/graphql/index.ts +1351 -0
  533. package/src/graphql/json.ts +62 -0
  534. package/src/graphql/middleware.ts +115 -0
  535. package/src/index.ts +139 -0
  536. package/src/indexing/addStackTrace.ts +69 -0
  537. package/src/indexing/client.ts +1184 -0
  538. package/src/indexing/index.ts +976 -0
  539. package/src/indexing/profile.ts +771 -0
  540. package/src/indexing-store/cache.ts +1057 -0
  541. package/src/indexing-store/index.ts +628 -0
  542. package/src/indexing-store/profile.ts +557 -0
  543. package/src/indexing-store/utils.ts +162 -0
  544. package/src/internal/common.ts +15 -0
  545. package/src/internal/errors.ts +228 -0
  546. package/src/internal/logger.ts +252 -0
  547. package/src/internal/metrics.ts +1030 -0
  548. package/src/internal/options.ts +130 -0
  549. package/src/internal/shutdown.ts +32 -0
  550. package/src/internal/telemetry.ts +303 -0
  551. package/src/internal/types.ts +611 -0
  552. package/src/rpc/actions.ts +1344 -0
  553. package/src/rpc/http.ts +164 -0
  554. package/src/rpc/index.ts +959 -0
  555. package/src/runtime/events.ts +875 -0
  556. package/src/runtime/filter.ts +705 -0
  557. package/src/runtime/fragments.ts +674 -0
  558. package/src/runtime/historical.ts +1522 -0
  559. package/src/runtime/index.ts +569 -0
  560. package/src/runtime/init.ts +49 -0
  561. package/src/runtime/isolated.ts +775 -0
  562. package/src/runtime/multichain.ts +860 -0
  563. package/src/runtime/omnichain.ts +920 -0
  564. package/src/runtime/realtime.ts +1164 -0
  565. package/src/server/error.ts +68 -0
  566. package/src/server/index.ts +173 -0
  567. package/src/sync-historical/index.ts +1065 -0
  568. package/src/sync-realtime/bloom.ts +102 -0
  569. package/src/sync-realtime/index.ts +1304 -0
  570. package/src/sync-store/encode.ts +153 -0
  571. package/src/sync-store/index.ts +1633 -0
  572. package/src/sync-store/migrations.ts +1801 -0
  573. package/src/sync-store/schema.ts +248 -0
  574. package/src/types/db.ts +292 -0
  575. package/src/types/eth.ts +216 -0
  576. package/src/types/utils.ts +47 -0
  577. package/src/types/virtual.ts +244 -0
  578. package/src/types.d.ts +38 -0
  579. package/src/ui/app.ts +207 -0
  580. package/src/ui/index.ts +37 -0
  581. package/src/ui/patch.ts +204 -0
  582. package/src/utils/abi.ts +103 -0
  583. package/src/utils/bigint.ts +41 -0
  584. package/src/utils/chains.ts +22 -0
  585. package/src/utils/checkpoint.ts +203 -0
  586. package/src/utils/chunk.ts +7 -0
  587. package/src/utils/copy.ts +151 -0
  588. package/src/utils/date.ts +26 -0
  589. package/src/utils/debug.ts +110 -0
  590. package/src/utils/decodeAbiParameters.ts +428 -0
  591. package/src/utils/decodeEventLog.ts +100 -0
  592. package/src/utils/dedupe.ts +32 -0
  593. package/src/utils/duplicates.ts +19 -0
  594. package/src/utils/estimate.ts +27 -0
  595. package/src/utils/finality.ts +40 -0
  596. package/src/utils/format.ts +22 -0
  597. package/src/utils/generators.ts +157 -0
  598. package/src/utils/hash.ts +22 -0
  599. package/src/utils/interval.ts +212 -0
  600. package/src/utils/lowercase.ts +6 -0
  601. package/src/utils/mutex.ts +33 -0
  602. package/src/utils/never.ts +3 -0
  603. package/src/utils/offset.ts +133 -0
  604. package/src/utils/order.ts +16 -0
  605. package/src/utils/partition.ts +53 -0
  606. package/src/utils/pg.ts +230 -0
  607. package/src/utils/pglite.ts +97 -0
  608. package/src/utils/port.ts +34 -0
  609. package/src/utils/print.ts +31 -0
  610. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  611. package/src/utils/promiseWithResolvers.ts +20 -0
  612. package/src/utils/queue.ts +258 -0
  613. package/src/utils/range.ts +8 -0
  614. package/src/utils/result.ts +26 -0
  615. package/src/utils/sql-parse.ts +1477 -0
  616. package/src/utils/timer.ts +8 -0
  617. package/src/utils/truncate.ts +15 -0
  618. package/src/utils/wait.ts +8 -0
  619. package/src/utils/zipper.ts +80 -0
@@ -0,0 +1,1633 @@
1
+ import crypto from "node:crypto";
2
+ import type { QB } from "@/database/queryBuilder.js";
3
+ import { extractBlockNumberParam } from "@/indexing/client.js";
4
+ import type { Common } from "@/internal/common.js";
5
+ import type { Logger } from "@/internal/logger.js";
6
+ import type {
7
+ BlockFilter,
8
+ Factory,
9
+ Filter,
10
+ Fragment,
11
+ FragmentId,
12
+ InternalBlock,
13
+ InternalLog,
14
+ InternalTrace,
15
+ InternalTransaction,
16
+ InternalTransactionReceipt,
17
+ LightBlock,
18
+ LogFilter,
19
+ RequiredInternalBlockColumns,
20
+ RequiredInternalTraceColumns,
21
+ RequiredInternalTransactionColumns,
22
+ RequiredInternalTransactionReceiptColumns,
23
+ SyncBlock,
24
+ SyncBlockHeader,
25
+ SyncLog,
26
+ SyncTrace,
27
+ SyncTransaction,
28
+ SyncTransactionReceipt,
29
+ TraceFilter,
30
+ TransactionFilter,
31
+ TransferFilter,
32
+ } from "@/internal/types.js";
33
+ import type { RequestParameters } from "@/rpc/index.js";
34
+ import {
35
+ getFilterFactories,
36
+ isAddressFactory,
37
+ unionFilterIncludeBlock,
38
+ unionFilterIncludeTrace,
39
+ unionFilterIncludeTransaction,
40
+ unionFilterIncludeTransactionReceipt,
41
+ } from "@/runtime/filter.js";
42
+ import {
43
+ encodeFragment,
44
+ getFactoryFragments,
45
+ getFragments,
46
+ } from "@/runtime/fragments.js";
47
+ import type {
48
+ IntervalWithFactory,
49
+ IntervalWithFilter,
50
+ } from "@/runtime/index.js";
51
+ import type { Interval } from "@/utils/interval.js";
52
+ import { intervalUnion } from "@/utils/interval.js";
53
+ import { toLowerCase } from "@/utils/lowercase.js";
54
+ import { orderObject } from "@/utils/order.js";
55
+ import { startClock } from "@/utils/timer.js";
56
+ import {
57
+ type SQL,
58
+ and,
59
+ asc,
60
+ desc,
61
+ eq,
62
+ gte,
63
+ inArray,
64
+ isNull,
65
+ lt,
66
+ lte,
67
+ or,
68
+ sql,
69
+ } from "drizzle-orm";
70
+ import {
71
+ type PgColumn,
72
+ type PgSelectBase,
73
+ unionAll,
74
+ } from "drizzle-orm/pg-core";
75
+ import { type Address, hexToNumber, isHex } from "viem";
76
+ import {
77
+ encodeBlock,
78
+ encodeLog,
79
+ encodeTrace,
80
+ encodeTransaction,
81
+ encodeTransactionReceipt,
82
+ } from "./encode.js";
83
+ import * as PONDER_SYNC from "./schema.js";
84
+
85
+ export type SyncStore = {
86
+ insertIntervals(
87
+ args: {
88
+ intervals: IntervalWithFilter[];
89
+ factoryIntervals: IntervalWithFactory[];
90
+ chainId: number;
91
+ },
92
+ context?: { logger?: Logger },
93
+ ): Promise<void>;
94
+ getIntervals(
95
+ args: { filters: Filter[] },
96
+ context?: { logger?: Logger },
97
+ ): Promise<
98
+ Map<Filter | Factory, { fragment: Fragment; intervals: Interval[] }[]>
99
+ >;
100
+ insertChildAddresses(
101
+ args: {
102
+ factory: Factory;
103
+ childAddresses: Map<Address, number>;
104
+ chainId: number;
105
+ },
106
+ context?: { logger?: Logger },
107
+ ): Promise<void>;
108
+ getChildAddresses(
109
+ args: { factory: Factory },
110
+ context?: { logger?: Logger },
111
+ ): Promise<Map<Address, number>>;
112
+ getSafeCrashRecoveryBlock(
113
+ args: {
114
+ chainId: number;
115
+ timestamp: number;
116
+ },
117
+ context?: { logger?: Logger },
118
+ ): Promise<{ number: bigint; timestamp: bigint } | undefined>;
119
+ insertLogs(
120
+ args: { logs: SyncLog[]; chainId: number },
121
+ context?: { logger?: Logger },
122
+ ): Promise<void>;
123
+ insertBlocks(
124
+ args: {
125
+ blocks: (SyncBlock | SyncBlockHeader)[];
126
+ chainId: number;
127
+ },
128
+ context?: { logger?: Logger },
129
+ ): Promise<void>;
130
+ insertTransactions(
131
+ args: {
132
+ transactions: SyncTransaction[];
133
+ chainId: number;
134
+ },
135
+ context?: { logger?: Logger },
136
+ ): Promise<void>;
137
+ insertTransactionReceipts(
138
+ args: {
139
+ transactionReceipts: SyncTransactionReceipt[];
140
+ chainId: number;
141
+ },
142
+ context?: { logger?: Logger },
143
+ ): Promise<void>;
144
+ insertTraces(
145
+ args: {
146
+ traces: {
147
+ trace: SyncTrace;
148
+ block: SyncBlock;
149
+ transaction: SyncTransaction;
150
+ }[];
151
+ chainId: number;
152
+ },
153
+ context?: { logger?: Logger },
154
+ ): Promise<void>;
155
+ getEventData(
156
+ args: {
157
+ filters: Filter[];
158
+ fromBlock: number;
159
+ toBlock: number;
160
+ chainId: number;
161
+ limit: number;
162
+ },
163
+ context?: { logger?: Logger },
164
+ ): Promise<{
165
+ blocks: InternalBlock[];
166
+ logs: InternalLog[];
167
+ transactions: InternalTransaction[];
168
+ transactionReceipts: InternalTransactionReceipt[];
169
+ traces: InternalTrace[];
170
+ cursor: number;
171
+ }>;
172
+ insertRpcRequestResults(
173
+ args: {
174
+ requests: {
175
+ request: RequestParameters;
176
+ blockNumber: number | undefined;
177
+ result: string;
178
+ }[];
179
+ chainId: number;
180
+ },
181
+ context?: { logger?: Logger },
182
+ ): Promise<void>;
183
+ getRpcRequestResults(
184
+ args: {
185
+ requests: RequestParameters[];
186
+ chainId: number;
187
+ },
188
+ context?: { logger?: Logger },
189
+ ): Promise<(string | undefined)[]>;
190
+ pruneRpcRequestResults(
191
+ args: {
192
+ blocks: Pick<LightBlock, "number">[];
193
+ chainId: number;
194
+ },
195
+ context?: { logger?: Logger },
196
+ ): Promise<void>;
197
+ pruneByChain(
198
+ args: { chainId: number },
199
+ context?: { logger?: Logger },
200
+ ): Promise<void>;
201
+ };
202
+
203
+ export const createSyncStore = ({
204
+ common,
205
+ qb,
206
+ }: { common: Common; qb: QB<typeof PONDER_SYNC> }): SyncStore => {
207
+ const syncStore = {
208
+ insertIntervals: async (
209
+ { intervals, factoryIntervals, chainId },
210
+ context,
211
+ ) => {
212
+ if (intervals.length === 0 && factoryIntervals.length === 0) return;
213
+
214
+ const perFragmentIntervals = new Map<FragmentId, Interval[]>();
215
+ const values: (typeof PONDER_SYNC.intervals.$inferInsert)[] = [];
216
+
217
+ // dedupe and merge matching fragments
218
+
219
+ for (const { filter, interval } of intervals) {
220
+ for (const fragment of getFragments(filter)) {
221
+ const fragmentId = encodeFragment(fragment.fragment);
222
+ if (perFragmentIntervals.has(fragmentId) === false) {
223
+ perFragmentIntervals.set(fragmentId, []);
224
+ }
225
+
226
+ perFragmentIntervals.get(fragmentId)!.push(interval);
227
+ }
228
+ }
229
+
230
+ for (const { factory, interval } of factoryIntervals) {
231
+ for (const fragment of getFactoryFragments(factory)) {
232
+ const fragmentId = encodeFragment(fragment);
233
+ if (perFragmentIntervals.has(fragmentId) === false) {
234
+ perFragmentIntervals.set(fragmentId, []);
235
+ }
236
+
237
+ perFragmentIntervals.get(fragmentId)!.push(interval);
238
+ }
239
+ }
240
+
241
+ // NOTE: In order to force proper range union behavior, `interval[1]` must
242
+ // be rounded up.
243
+
244
+ for (const [fragmentId, intervals] of perFragmentIntervals) {
245
+ const numranges = intervals
246
+ .map((interval) => {
247
+ const start = interval[0];
248
+ const end = interval[1] + 1;
249
+ return `numrange(${start}, ${end}, '[]')`;
250
+ })
251
+ .join(", ");
252
+
253
+ values.push({
254
+ fragmentId: fragmentId,
255
+ chainId: BigInt(chainId),
256
+ // @ts-expect-error
257
+ blocks: sql.raw(`nummultirange(${numranges})`),
258
+ });
259
+ }
260
+
261
+ const batchSize = Math.floor(
262
+ common.options.databaseMaxQueryParameters / 3,
263
+ );
264
+
265
+ for (let i = 0; i < values.length; i += batchSize) {
266
+ await qb.wrap(
267
+ { label: "insert_intervals" },
268
+ (db) =>
269
+ db
270
+ .insert(PONDER_SYNC.intervals)
271
+ .values(values.slice(i, i + batchSize))
272
+ .onConflictDoUpdate({
273
+ target: PONDER_SYNC.intervals.fragmentId,
274
+ set: { blocks: sql`intervals.blocks + excluded.blocks` },
275
+ }),
276
+ context,
277
+ );
278
+ }
279
+ },
280
+ getIntervals: async ({ filters }, context) => {
281
+ const queries: PgSelectBase<
282
+ "unnested",
283
+ {
284
+ mergedBlocks: SQL.Aliased<string>;
285
+ fragment: SQL.Aliased<unknown>;
286
+ },
287
+ "partial"
288
+ >[] = [];
289
+ let index = 0;
290
+
291
+ for (const filter of filters) {
292
+ const fragments = getFragments(filter);
293
+
294
+ for (const fragment of fragments) {
295
+ queries.push(
296
+ qb.raw
297
+ .select({
298
+ mergedBlocks: sql<string>`range_agg(unnested.blocks)`.as(
299
+ "merged_blocks",
300
+ ),
301
+ fragment: sql.raw(`'${index++}'`).as("fragment"),
302
+ })
303
+ .from(
304
+ qb.raw
305
+ .select({ blocks: sql.raw("unnest(blocks)").as("blocks") })
306
+ .from(PONDER_SYNC.intervals)
307
+ .where(
308
+ sql.raw(
309
+ `fragment_id IN (${fragment.adjacentIds.map((id) => `'${id}'`).join(", ")})`,
310
+ ),
311
+ )
312
+ .as("unnested"),
313
+ ),
314
+ );
315
+ }
316
+
317
+ for (const factory of getFilterFactories(filter)) {
318
+ for (const fragment of getFactoryFragments(factory)) {
319
+ queries.push(
320
+ qb.raw
321
+ .select({
322
+ mergedBlocks: sql<string>`range_agg(unnested.blocks)`.as(
323
+ "merged_blocks",
324
+ ),
325
+ fragment: sql.raw(`'${index++}'`).as("fragment"),
326
+ })
327
+ .from(
328
+ qb.raw
329
+ .select({
330
+ blocks: sql.raw("unnest(blocks)").as("blocks"),
331
+ })
332
+ .from(PONDER_SYNC.intervals)
333
+ .where(
334
+ sql.raw(`fragment_id = '${encodeFragment(fragment)}'`),
335
+ )
336
+ .as("unnested"),
337
+ ),
338
+ );
339
+ }
340
+ }
341
+ }
342
+
343
+ let rows: Awaited<(typeof queries)[number]> = [];
344
+
345
+ if (queries.length > 1) {
346
+ // Note: This query has no parameters, but there is a bug with
347
+ // drizzle causing a "maximum call stack size exceeded" error.
348
+ // Related: https://github.com/drizzle-team/drizzle-orm/issues/1740
349
+ const batchSize = 200;
350
+
351
+ for (let i = 0; i < queries.length; i += batchSize) {
352
+ const _rows = await qb.wrap(
353
+ { label: "select_intervals" },
354
+ () =>
355
+ // @ts-expect-error
356
+ unionAll(...queries.slice(i, i + batchSize)),
357
+ context,
358
+ );
359
+
360
+ if (i === 0) {
361
+ rows = _rows;
362
+ } else {
363
+ rows.push(..._rows);
364
+ }
365
+ }
366
+ } else {
367
+ rows = await qb.wrap(
368
+ { label: "select_intervals" },
369
+ () => queries[0]!.execute(),
370
+ context,
371
+ );
372
+ }
373
+
374
+ const result = new Map<
375
+ Filter | Factory,
376
+ { fragment: Fragment; intervals: Interval[] }[]
377
+ >();
378
+
379
+ // NOTE: `interval[1]` must be rounded down in order to offset the previous
380
+ // rounding.
381
+
382
+ index = 0;
383
+
384
+ for (const filter of filters) {
385
+ const fragments = getFragments(filter);
386
+ result.set(filter, []);
387
+
388
+ for (const fragment of fragments) {
389
+ const intervals = rows
390
+ .filter((row) => row.fragment === `${index}`)
391
+ .map((row) =>
392
+ (row.mergedBlocks
393
+ ? (JSON.parse(
394
+ `[${row.mergedBlocks.slice(1, -1)}]`,
395
+ ) as Interval[])
396
+ : []
397
+ ).map((interval) => [interval[0], interval[1] - 1] as Interval),
398
+ )[0]!;
399
+
400
+ index += 1;
401
+
402
+ result.get(filter)!.push({ fragment: fragment.fragment, intervals });
403
+ }
404
+
405
+ for (const factory of getFilterFactories(filter)) {
406
+ result.set(factory, []);
407
+ for (const fragment of getFactoryFragments(factory)) {
408
+ const intervals = rows
409
+ .filter((row) => row.fragment === `${index}`)
410
+ .map((row) =>
411
+ (row.mergedBlocks
412
+ ? (JSON.parse(
413
+ `[${row.mergedBlocks.slice(1, -1)}]`,
414
+ ) as Interval[])
415
+ : []
416
+ ).map((interval) => [interval[0], interval[1] - 1] as Interval),
417
+ )[0]!;
418
+
419
+ index += 1;
420
+
421
+ result.get(factory)!.push({ fragment, intervals });
422
+ }
423
+
424
+ // Note: This is a stand-in for a migration to the `intervals` table
425
+ // required in `v0.15`. It is an invariant that filter with factories
426
+ // have a row in the intervals table for both the filter and the factory.
427
+ // If this invariant is broken, it must be because of the migration from
428
+ // `v0.14` to `v0.15`. In this case, we can assume that the factory interval
429
+ // is the same as the filter interval.
430
+
431
+ const filterIntervals = intervalUnion(
432
+ result.get(filter)!.flatMap(({ intervals }) => intervals),
433
+ );
434
+ const factoryIntervals = intervalUnion(
435
+ result.get(factory)!.flatMap(({ intervals }) => intervals),
436
+ );
437
+
438
+ if (
439
+ filterIntervals.length > 0 &&
440
+ factoryIntervals.length === 0 &&
441
+ filter.fromBlock === factory.fromBlock &&
442
+ filter.toBlock === factory.toBlock
443
+ ) {
444
+ for (const factoryInterval of result.get(factory)!) {
445
+ factoryInterval.intervals = filterIntervals;
446
+ }
447
+ }
448
+ }
449
+ }
450
+
451
+ return result;
452
+ },
453
+ insertChildAddresses: async (
454
+ { factory, childAddresses, chainId },
455
+ context,
456
+ ) => {
457
+ if (childAddresses.size === 0) return;
458
+
459
+ const { id, sourceId: _sourceId, ..._factory } = factory;
460
+
461
+ const batchSize = Math.floor(
462
+ common.options.databaseMaxQueryParameters / 3,
463
+ );
464
+
465
+ const values: (typeof PONDER_SYNC.factoryAddresses.$inferInsert)[] = [];
466
+
467
+ const factoryInsert = qb.raw.$with("factory_insert").as(
468
+ qb.raw
469
+ .insert(PONDER_SYNC.factories)
470
+ .values({ factory: _factory })
471
+ // @ts-expect-error bug with drizzle-orm
472
+ .returning({ id: PONDER_SYNC.factories.id })
473
+ .onConflictDoUpdate({
474
+ target: PONDER_SYNC.factories.factory,
475
+ set: { factory: sql`excluded.factory` },
476
+ }),
477
+ );
478
+
479
+ for (const [address, blockNumber] of childAddresses) {
480
+ values.push({
481
+ // @ts-expect-error
482
+ factoryId: sql`(SELECT id FROM factory_insert)`,
483
+ chainId: BigInt(chainId),
484
+ blockNumber: BigInt(blockNumber),
485
+ address,
486
+ });
487
+ }
488
+
489
+ for (let i = 0; i < values.length; i += batchSize) {
490
+ await qb.wrap(
491
+ { label: "insert_child_addresses" },
492
+ (db) =>
493
+ db
494
+ .with(factoryInsert)
495
+ .insert(PONDER_SYNC.factoryAddresses)
496
+ .values(values.slice(i, i + batchSize)),
497
+ context,
498
+ );
499
+ }
500
+ },
501
+ getChildAddresses: ({ factory }, context) => {
502
+ const { id, sourceId: _sourceId, ..._factory } = factory;
503
+
504
+ const factoryInsert = qb.raw.$with("factory_insert").as(
505
+ qb.raw
506
+ .insert(PONDER_SYNC.factories)
507
+ .values({ factory: _factory })
508
+ // @ts-expect-error bug with drizzle-orm
509
+ .returning({ id: PONDER_SYNC.factories.id })
510
+ .onConflictDoUpdate({
511
+ target: PONDER_SYNC.factories.factory,
512
+ set: { factory: sql`excluded.factory` },
513
+ }),
514
+ );
515
+
516
+ return qb
517
+ .wrap(
518
+ { label: "select_child_addresses" },
519
+ (db) =>
520
+ db
521
+ .with(factoryInsert)
522
+ .select({
523
+ address: PONDER_SYNC.factoryAddresses.address,
524
+ blockNumber: PONDER_SYNC.factoryAddresses.blockNumber,
525
+ })
526
+ .from(PONDER_SYNC.factoryAddresses)
527
+ .where(
528
+ eq(
529
+ PONDER_SYNC.factoryAddresses.factoryId,
530
+ qb.raw.select({ id: factoryInsert.id }).from(factoryInsert),
531
+ ),
532
+ ),
533
+ context,
534
+ )
535
+ .then((rows) => {
536
+ const result = new Map<Address, number>();
537
+ for (const { address, blockNumber } of rows) {
538
+ if (
539
+ result.has(address) === false ||
540
+ result.get(address)! > Number(blockNumber)
541
+ ) {
542
+ result.set(address, Number(blockNumber));
543
+ }
544
+ }
545
+ return result;
546
+ });
547
+ },
548
+ getSafeCrashRecoveryBlock: async ({ chainId, timestamp }, context) => {
549
+ const rows = await qb.wrap(
550
+ { label: "select_crash_recovery_block" },
551
+ (db) =>
552
+ db
553
+ .select({
554
+ number: PONDER_SYNC.blocks.number,
555
+ timestamp: PONDER_SYNC.blocks.timestamp,
556
+ })
557
+ .from(PONDER_SYNC.blocks)
558
+ .where(
559
+ and(
560
+ eq(PONDER_SYNC.blocks.chainId, BigInt(chainId)),
561
+ lt(PONDER_SYNC.blocks.timestamp, BigInt(timestamp)),
562
+ ),
563
+ )
564
+ .orderBy(desc(PONDER_SYNC.blocks.number))
565
+ .limit(1),
566
+ context,
567
+ );
568
+
569
+ return rows[0];
570
+ },
571
+ insertLogs: async ({ logs, chainId }, context) => {
572
+ if (logs.length === 0) return;
573
+
574
+ // Calculate `batchSize` based on how many parameters the
575
+ // input will have
576
+ const batchSize = Math.floor(
577
+ common.options.databaseMaxQueryParameters /
578
+ Object.keys(encodeLog({ log: logs[0]!, chainId })).length,
579
+ );
580
+
581
+ // As an optimization, logs that are matched by a factory do
582
+ // not contain a checkpoint, because not corresponding block is
583
+ // fetched (no block.timestamp). However, when a log is matched by
584
+ // both a log filter and a factory, the checkpoint must be included
585
+ // in the db.
586
+
587
+ for (let i = 0; i < logs.length; i += batchSize) {
588
+ await qb.wrap(
589
+ { label: "insert_logs" },
590
+ (db) =>
591
+ db
592
+ .insert(PONDER_SYNC.logs)
593
+ .values(
594
+ logs
595
+ .slice(i, i + batchSize)
596
+ .map((log) => encodeLog({ log, chainId })),
597
+ )
598
+ .onConflictDoNothing({
599
+ target: [
600
+ PONDER_SYNC.logs.chainId,
601
+ PONDER_SYNC.logs.blockNumber,
602
+ PONDER_SYNC.logs.logIndex,
603
+ ],
604
+ }),
605
+ context,
606
+ );
607
+ }
608
+ },
609
+ insertBlocks: async ({ blocks, chainId }, context) => {
610
+ if (blocks.length === 0) return;
611
+
612
+ // Calculate `batchSize` based on how many parameters the
613
+ // input will have
614
+ const batchSize = Math.floor(
615
+ common.options.databaseMaxQueryParameters /
616
+ Object.keys(encodeBlock({ block: blocks[0]!, chainId })).length,
617
+ );
618
+
619
+ for (let i = 0; i < blocks.length; i += batchSize) {
620
+ await qb.wrap(
621
+ { label: "insert_blocks" },
622
+ (db) =>
623
+ db
624
+ .insert(PONDER_SYNC.blocks)
625
+ .values(
626
+ blocks
627
+ .slice(i, i + batchSize)
628
+ .map((block) => encodeBlock({ block, chainId })),
629
+ )
630
+ .onConflictDoNothing({
631
+ target: [PONDER_SYNC.blocks.chainId, PONDER_SYNC.blocks.number],
632
+ }),
633
+ context,
634
+ );
635
+ }
636
+ },
637
+ insertTransactions: async ({ transactions, chainId }, context) => {
638
+ if (transactions.length === 0) return;
639
+
640
+ // Calculate `batchSize` based on how many parameters the
641
+ // input will have
642
+ const batchSize = Math.floor(
643
+ common.options.databaseMaxQueryParameters /
644
+ Object.keys(
645
+ encodeTransaction({
646
+ transaction: transactions[0]!,
647
+ chainId,
648
+ }),
649
+ ).length,
650
+ );
651
+
652
+ for (let i = 0; i < transactions.length; i += batchSize) {
653
+ await qb.wrap(
654
+ { label: "insert_transactions" },
655
+ (db) =>
656
+ db
657
+ .insert(PONDER_SYNC.transactions)
658
+ .values(
659
+ transactions
660
+ .slice(i, i + batchSize)
661
+ .map((transaction) =>
662
+ encodeTransaction({ transaction, chainId }),
663
+ ),
664
+ )
665
+ .onConflictDoNothing({
666
+ target: [
667
+ PONDER_SYNC.transactions.chainId,
668
+ PONDER_SYNC.transactions.blockNumber,
669
+ PONDER_SYNC.transactions.transactionIndex,
670
+ ],
671
+ }),
672
+ context,
673
+ );
674
+ }
675
+ },
676
+ insertTransactionReceipts: async (
677
+ { transactionReceipts, chainId },
678
+ context,
679
+ ) => {
680
+ if (transactionReceipts.length === 0) return;
681
+
682
+ // Calculate `batchSize` based on how many parameters the
683
+ // input will have
684
+ const batchSize = Math.floor(
685
+ common.options.databaseMaxQueryParameters /
686
+ Object.keys(
687
+ encodeTransactionReceipt({
688
+ transactionReceipt: transactionReceipts[0]!,
689
+ chainId,
690
+ }),
691
+ ).length,
692
+ );
693
+
694
+ for (let i = 0; i < transactionReceipts.length; i += batchSize) {
695
+ await qb.wrap(
696
+ { label: "insert_transaction_receipts" },
697
+ (db) =>
698
+ db
699
+ .insert(PONDER_SYNC.transactionReceipts)
700
+ .values(
701
+ transactionReceipts
702
+ .slice(i, i + batchSize)
703
+ .map((transactionReceipt) =>
704
+ encodeTransactionReceipt({
705
+ transactionReceipt,
706
+ chainId,
707
+ }),
708
+ ),
709
+ )
710
+ .onConflictDoNothing({
711
+ target: [
712
+ PONDER_SYNC.transactionReceipts.chainId,
713
+ PONDER_SYNC.transactionReceipts.blockNumber,
714
+ PONDER_SYNC.transactionReceipts.transactionIndex,
715
+ ],
716
+ }),
717
+ context,
718
+ );
719
+ }
720
+ },
721
+ insertTraces: async ({ traces, chainId }, context) => {
722
+ if (traces.length === 0) return;
723
+
724
+ // Calculate `batchSize` based on how many parameters the
725
+ // input will have
726
+ const batchSize = Math.floor(
727
+ common.options.databaseMaxQueryParameters /
728
+ Object.keys(
729
+ encodeTrace({
730
+ trace: traces[0]!.trace,
731
+ block: traces[0]!.block,
732
+ transaction: traces[0]!.transaction,
733
+ chainId,
734
+ }),
735
+ ).length,
736
+ );
737
+
738
+ for (let i = 0; i < traces.length; i += batchSize) {
739
+ await qb.wrap(
740
+ { label: "insert_traces" },
741
+ (db) =>
742
+ db
743
+ .insert(PONDER_SYNC.traces)
744
+ .values(
745
+ traces
746
+ .slice(i, i + batchSize)
747
+ .map(({ trace, block, transaction }) =>
748
+ encodeTrace({ trace, block, transaction, chainId }),
749
+ ),
750
+ )
751
+ .onConflictDoNothing({
752
+ target: [
753
+ PONDER_SYNC.traces.chainId,
754
+ PONDER_SYNC.traces.blockNumber,
755
+ PONDER_SYNC.traces.transactionIndex,
756
+ PONDER_SYNC.traces.traceIndex,
757
+ ],
758
+ }),
759
+ context,
760
+ );
761
+ }
762
+ },
763
+ getEventData: async (
764
+ { filters, fromBlock, toBlock, chainId, limit },
765
+ context,
766
+ ): Promise<{
767
+ blocks: InternalBlock[];
768
+ logs: InternalLog[];
769
+ transactions: InternalTransaction[];
770
+ transactionReceipts: InternalTransactionReceipt[];
771
+ traces: InternalTrace[];
772
+ cursor: number;
773
+ }> => {
774
+ const logFilters = filters.filter(
775
+ (f): f is LogFilter => f.type === "log",
776
+ );
777
+ const transactionFilters = filters.filter(
778
+ (f): f is TransactionFilter => f.type === "transaction",
779
+ );
780
+ const traceFilters = filters.filter(
781
+ (f): f is TraceFilter => f.type === "trace",
782
+ );
783
+ const transferFilters = filters.filter(
784
+ (f): f is TransferFilter => f.type === "transfer",
785
+ );
786
+
787
+ const shouldQueryBlocks = true;
788
+ const shouldQueryLogs = logFilters.length > 0;
789
+ const shouldQueryTraces =
790
+ traceFilters.length > 0 || transferFilters.length > 0;
791
+ const shouldQueryTransactions =
792
+ transactionFilters.length > 0 || shouldQueryLogs || shouldQueryTraces;
793
+ const shouldQueryTransactionReceipts = filters.some(
794
+ (filter) => filter.hasTransactionReceipt,
795
+ );
796
+
797
+ type BlockSelect = {
798
+ [P in RequiredInternalBlockColumns]: (typeof PONDER_SYNC.blocks)[P];
799
+ } & {
800
+ [P in Exclude<
801
+ keyof typeof PONDER_SYNC.blocks.$inferSelect,
802
+ RequiredInternalBlockColumns
803
+ >]?: (typeof PONDER_SYNC.blocks)[P];
804
+ };
805
+ type TransactionSelect = {
806
+ [P in RequiredInternalTransactionColumns]: (typeof PONDER_SYNC.transactions)[P];
807
+ } & {
808
+ [P in Exclude<
809
+ keyof typeof PONDER_SYNC.transactions.$inferSelect,
810
+ RequiredInternalTransactionColumns
811
+ >]?: (typeof PONDER_SYNC.transactions)[P];
812
+ };
813
+ type TransactionReceiptSelect = {
814
+ [P in RequiredInternalTransactionReceiptColumns]: (typeof PONDER_SYNC.transactionReceipts)[P];
815
+ } & {
816
+ [P in Exclude<
817
+ keyof typeof PONDER_SYNC.transactionReceipts.$inferSelect,
818
+ RequiredInternalTransactionReceiptColumns
819
+ >]?: (typeof PONDER_SYNC.transactionReceipts)[P];
820
+ };
821
+ type TraceSelect = {
822
+ [P in RequiredInternalTraceColumns]: (typeof PONDER_SYNC.traces)[P];
823
+ } & {
824
+ [P in Exclude<
825
+ keyof typeof PONDER_SYNC.traces.$inferSelect,
826
+ RequiredInternalTraceColumns
827
+ >]?: (typeof PONDER_SYNC.traces)[P];
828
+ };
829
+ // Note: `LogSelect` doesn't exist because all log columns are required.
830
+
831
+ const blockSelect: BlockSelect = {
832
+ number: PONDER_SYNC.blocks.number,
833
+ hash: PONDER_SYNC.blocks.hash,
834
+ timestamp: PONDER_SYNC.blocks.timestamp,
835
+ };
836
+
837
+ for (const column of unionFilterIncludeBlock(filters)) {
838
+ // @ts-ignore
839
+ blockSelect[column] = PONDER_SYNC.blocks[column];
840
+ }
841
+
842
+ const blocksQuery = qb.raw
843
+ .select(blockSelect)
844
+ .from(PONDER_SYNC.blocks)
845
+ .where(
846
+ and(
847
+ eq(PONDER_SYNC.blocks.chainId, BigInt(chainId)),
848
+ gte(PONDER_SYNC.blocks.number, BigInt(fromBlock)),
849
+ lte(PONDER_SYNC.blocks.number, BigInt(toBlock)),
850
+ ),
851
+ )
852
+ .orderBy(asc(PONDER_SYNC.blocks.number))
853
+ .limit(limit);
854
+
855
+ const transactionSelect: TransactionSelect = {
856
+ blockNumber: PONDER_SYNC.transactions.blockNumber,
857
+ transactionIndex: PONDER_SYNC.transactions.transactionIndex,
858
+ from: PONDER_SYNC.transactions.from,
859
+ to: PONDER_SYNC.transactions.to,
860
+ hash: PONDER_SYNC.transactions.hash,
861
+ type: PONDER_SYNC.transactions.type,
862
+ };
863
+
864
+ for (const column of unionFilterIncludeTransaction(filters)) {
865
+ // @ts-ignore
866
+ transactionSelect[column] = PONDER_SYNC.transactions[column];
867
+ }
868
+
869
+ const transactionsQuery = qb.raw
870
+ .select(transactionSelect)
871
+ .from(PONDER_SYNC.transactions)
872
+ .where(
873
+ and(
874
+ eq(PONDER_SYNC.transactions.chainId, BigInt(chainId)),
875
+ gte(PONDER_SYNC.transactions.blockNumber, BigInt(fromBlock)),
876
+ lte(PONDER_SYNC.transactions.blockNumber, BigInt(toBlock)),
877
+ ),
878
+ )
879
+ .orderBy(
880
+ asc(PONDER_SYNC.transactions.blockNumber),
881
+ asc(PONDER_SYNC.transactions.transactionIndex),
882
+ )
883
+ .limit(limit);
884
+
885
+ const transactionReceiptSelect: TransactionReceiptSelect = {
886
+ blockNumber: PONDER_SYNC.transactionReceipts.blockNumber,
887
+ transactionIndex: PONDER_SYNC.transactionReceipts.transactionIndex,
888
+ status: PONDER_SYNC.transactionReceipts.status,
889
+ from: PONDER_SYNC.transactionReceipts.from,
890
+ to: PONDER_SYNC.transactionReceipts.to,
891
+ };
892
+
893
+ for (const column of unionFilterIncludeTransactionReceipt(filters)) {
894
+ // @ts-ignore
895
+ transactionReceiptSelect[column] =
896
+ PONDER_SYNC.transactionReceipts[column];
897
+ }
898
+
899
+ const transactionReceiptsQuery = qb.raw
900
+ .select(transactionReceiptSelect)
901
+ .from(PONDER_SYNC.transactionReceipts)
902
+ .where(
903
+ and(
904
+ eq(PONDER_SYNC.transactionReceipts.chainId, BigInt(chainId)),
905
+ gte(PONDER_SYNC.transactionReceipts.blockNumber, BigInt(fromBlock)),
906
+ lte(PONDER_SYNC.transactionReceipts.blockNumber, BigInt(toBlock)),
907
+ ),
908
+ )
909
+ .orderBy(
910
+ asc(PONDER_SYNC.transactionReceipts.blockNumber),
911
+ asc(PONDER_SYNC.transactionReceipts.transactionIndex),
912
+ )
913
+ .limit(limit);
914
+
915
+ const traceSelect: TraceSelect = {
916
+ blockNumber: PONDER_SYNC.traces.blockNumber,
917
+ transactionIndex: PONDER_SYNC.traces.transactionIndex,
918
+ from: PONDER_SYNC.traces.from,
919
+ to: PONDER_SYNC.traces.to,
920
+ input: PONDER_SYNC.traces.input,
921
+ output: PONDER_SYNC.traces.output,
922
+ value: PONDER_SYNC.traces.value,
923
+ type: PONDER_SYNC.traces.type,
924
+ error: PONDER_SYNC.traces.error,
925
+ traceIndex: PONDER_SYNC.traces.traceIndex,
926
+ };
927
+
928
+ for (const column of unionFilterIncludeTrace(filters)) {
929
+ // @ts-ignore
930
+ traceSelect[column] = PONDER_SYNC.traces[column];
931
+ }
932
+
933
+ const tracesQuery = qb.raw
934
+ .select(traceSelect)
935
+ .from(PONDER_SYNC.traces)
936
+ .where(
937
+ and(
938
+ eq(PONDER_SYNC.traces.chainId, BigInt(chainId)),
939
+ gte(PONDER_SYNC.traces.blockNumber, BigInt(fromBlock)),
940
+ lte(PONDER_SYNC.traces.blockNumber, BigInt(toBlock)),
941
+ or(
942
+ ...traceFilters.map((filter) => traceFilter(filter)),
943
+ ...transferFilters.map((filter) => transferFilter(filter)),
944
+ ),
945
+ ),
946
+ )
947
+ .orderBy(
948
+ asc(PONDER_SYNC.traces.blockNumber),
949
+ asc(PONDER_SYNC.traces.transactionIndex),
950
+ asc(PONDER_SYNC.traces.traceIndex),
951
+ )
952
+ .limit(limit);
953
+
954
+ const logsQuery = qb.raw
955
+ .select({
956
+ blockNumber: PONDER_SYNC.logs.blockNumber,
957
+ logIndex: PONDER_SYNC.logs.logIndex,
958
+ transactionIndex: PONDER_SYNC.logs.transactionIndex,
959
+ address: PONDER_SYNC.logs.address,
960
+ topic0: PONDER_SYNC.logs.topic0,
961
+ topic1: PONDER_SYNC.logs.topic1,
962
+ topic2: PONDER_SYNC.logs.topic2,
963
+ topic3: PONDER_SYNC.logs.topic3,
964
+ data: PONDER_SYNC.logs.data,
965
+ })
966
+ .from(PONDER_SYNC.logs)
967
+ .where(
968
+ and(
969
+ eq(PONDER_SYNC.logs.chainId, BigInt(chainId)),
970
+ gte(PONDER_SYNC.logs.blockNumber, BigInt(fromBlock)),
971
+ lte(PONDER_SYNC.logs.blockNumber, BigInt(toBlock)),
972
+ or(...logFilters.map((filter) => logFilter(filter))),
973
+ ),
974
+ )
975
+ .orderBy(
976
+ asc(PONDER_SYNC.logs.blockNumber),
977
+ asc(PONDER_SYNC.logs.logIndex),
978
+ )
979
+ .limit(limit);
980
+
981
+ let endClock = startClock();
982
+
983
+ const [
984
+ blocksRows,
985
+ transactionsRows,
986
+ transactionReceiptsRows,
987
+ logsRows,
988
+ tracesRows,
989
+ ] = await Promise.all([
990
+ shouldQueryBlocks
991
+ ? qb.wrap({ label: "select_blocks" }, () => blocksQuery)
992
+ : [],
993
+ shouldQueryTransactions
994
+ ? qb.wrap(
995
+ { label: "select_transactions" },
996
+ () => transactionsQuery,
997
+ context,
998
+ )
999
+ : [],
1000
+ shouldQueryTransactionReceipts
1001
+ ? qb.wrap(
1002
+ { label: "select_transaction_receipts" },
1003
+ () => transactionReceiptsQuery,
1004
+ context,
1005
+ )
1006
+ : [],
1007
+ shouldQueryLogs
1008
+ ? qb.wrap({ label: "select_logs" }, () => logsQuery, context)
1009
+ : [],
1010
+ shouldQueryTraces
1011
+ ? qb.wrap({ label: "select_traces" }, () => tracesQuery, context)
1012
+ : [],
1013
+ ]);
1014
+
1015
+ const supremum = Math.min(
1016
+ blocksRows.length < limit
1017
+ ? Number.POSITIVE_INFINITY
1018
+ : Number(blocksRows[blocksRows.length - 1]!.number),
1019
+ transactionsRows.length < limit
1020
+ ? Number.POSITIVE_INFINITY
1021
+ : Number(transactionsRows[transactionsRows.length - 1]!.blockNumber),
1022
+ transactionReceiptsRows.length < limit
1023
+ ? Number.POSITIVE_INFINITY
1024
+ : Number(
1025
+ transactionReceiptsRows[transactionReceiptsRows.length - 1]!
1026
+ .blockNumber,
1027
+ ),
1028
+ logsRows.length < limit
1029
+ ? Number.POSITIVE_INFINITY
1030
+ : Number(logsRows[logsRows.length - 1]!.blockNumber),
1031
+ tracesRows.length < limit
1032
+ ? Number.POSITIVE_INFINITY
1033
+ : Number(tracesRows[tracesRows.length - 1]!.blockNumber),
1034
+ );
1035
+
1036
+ endClock = startClock();
1037
+
1038
+ let cursor: number;
1039
+ if (
1040
+ Math.max(
1041
+ blocksRows.length,
1042
+ transactionsRows.length,
1043
+ transactionReceiptsRows.length,
1044
+ logsRows.length,
1045
+ tracesRows.length,
1046
+ ) !== limit
1047
+ ) {
1048
+ cursor = toBlock;
1049
+ } else if (
1050
+ blocksRows.length === limit &&
1051
+ Math.max(
1052
+ transactionsRows.length,
1053
+ transactionReceiptsRows.length,
1054
+ logsRows.length,
1055
+ tracesRows.length,
1056
+ ) !== limit
1057
+ ) {
1058
+ // all events for `supremum` block have been extracted
1059
+ cursor = supremum;
1060
+ } else {
1061
+ // there may be events for `supremum` block that have not been extracted
1062
+ cursor = supremum - 1;
1063
+
1064
+ if (cursor < fromBlock) {
1065
+ return syncStore.getEventData(
1066
+ {
1067
+ filters,
1068
+ fromBlock,
1069
+ toBlock,
1070
+ chainId,
1071
+ limit: limit * 2,
1072
+ },
1073
+ context,
1074
+ );
1075
+ }
1076
+ }
1077
+
1078
+ endClock = startClock();
1079
+
1080
+ for (let i = 0; i < blocksRows.length; i++) {
1081
+ if (Number(blocksRows[i]!.number) > cursor) {
1082
+ blocksRows.length = i;
1083
+ break;
1084
+ }
1085
+
1086
+ const block = blocksRows[i]!;
1087
+
1088
+ if (block.miner) {
1089
+ block.miner = toLowerCase(block.miner);
1090
+ }
1091
+ }
1092
+
1093
+ for (let i = 0; i < transactionsRows.length; i++) {
1094
+ if (Number(transactionsRows[i]!.blockNumber) > cursor) {
1095
+ transactionsRows.length = i;
1096
+ break;
1097
+ }
1098
+
1099
+ const transaction = transactionsRows[i]!;
1100
+ const internalTransaction =
1101
+ transaction as unknown as InternalTransaction;
1102
+
1103
+ internalTransaction.blockNumber = Number(transaction.blockNumber);
1104
+ internalTransaction.from = toLowerCase(transaction.from);
1105
+ if (transaction.to !== null) {
1106
+ internalTransaction.to = toLowerCase(transaction.to);
1107
+ }
1108
+
1109
+ if (transaction.type === "0x0") {
1110
+ internalTransaction.type = "legacy";
1111
+ internalTransaction.accessList = undefined;
1112
+ internalTransaction.maxFeePerGas = undefined;
1113
+ internalTransaction.maxPriorityFeePerGas = undefined;
1114
+ } else if (transaction.type === "0x1") {
1115
+ internalTransaction.type = "eip2930";
1116
+ internalTransaction.accessList =
1117
+ transaction.accessList === undefined
1118
+ ? undefined
1119
+ : JSON.parse(transaction.accessList!);
1120
+ internalTransaction.maxFeePerGas = undefined;
1121
+ internalTransaction.maxPriorityFeePerGas = undefined;
1122
+ } else if (transaction.type === "0x2") {
1123
+ internalTransaction.type = "eip1559";
1124
+ internalTransaction.gasPrice = undefined;
1125
+ internalTransaction.accessList = undefined;
1126
+ } else if (transaction.type === "0x7e") {
1127
+ internalTransaction.type = "deposit";
1128
+ internalTransaction.gasPrice = undefined;
1129
+ internalTransaction.accessList = undefined;
1130
+ }
1131
+ }
1132
+
1133
+ for (let i = 0; i < transactionReceiptsRows.length; i++) {
1134
+ if (Number(transactionReceiptsRows[i]!.blockNumber) > cursor) {
1135
+ transactionReceiptsRows.length = i;
1136
+ break;
1137
+ }
1138
+
1139
+ const transactionReceipt = transactionReceiptsRows[i]!;
1140
+
1141
+ const internalTransactionReceipt =
1142
+ transactionReceipt as unknown as InternalTransactionReceipt;
1143
+
1144
+ internalTransactionReceipt.blockNumber = Number(
1145
+ transactionReceipt.blockNumber,
1146
+ );
1147
+ if (transactionReceipt.contractAddress) {
1148
+ internalTransactionReceipt.contractAddress = toLowerCase(
1149
+ transactionReceipt.contractAddress,
1150
+ );
1151
+ }
1152
+ internalTransactionReceipt.from = toLowerCase(transactionReceipt.from);
1153
+ if (transactionReceipt.to !== null) {
1154
+ internalTransactionReceipt.to = toLowerCase(transactionReceipt.to);
1155
+ }
1156
+ internalTransactionReceipt.status =
1157
+ transactionReceipt.status === "0x1"
1158
+ ? "success"
1159
+ : transactionReceipt.status === "0x0"
1160
+ ? "reverted"
1161
+ : (transactionReceipt.status as InternalTransactionReceipt["status"]);
1162
+ internalTransactionReceipt.type =
1163
+ transactionReceipt.type === "0x0"
1164
+ ? "legacy"
1165
+ : transactionReceipt.type === "0x1"
1166
+ ? "eip2930"
1167
+ : transactionReceipt.type === "0x2"
1168
+ ? "eip1559"
1169
+ : transactionReceipt.type === "0x7e"
1170
+ ? "deposit"
1171
+ : transactionReceipt.type;
1172
+ }
1173
+
1174
+ for (let i = 0; i < tracesRows.length; i++) {
1175
+ if (Number(tracesRows[i]!.blockNumber) > cursor) {
1176
+ tracesRows.length = i;
1177
+ break;
1178
+ }
1179
+
1180
+ const trace = tracesRows[i]!;
1181
+ const internalTrace = trace as unknown as InternalTrace;
1182
+
1183
+ internalTrace.blockNumber = Number(trace.blockNumber);
1184
+
1185
+ internalTrace.from = toLowerCase(trace.from);
1186
+ if (trace.to !== null) {
1187
+ internalTrace.to = toLowerCase(trace.to);
1188
+ }
1189
+
1190
+ if (trace.output === null) {
1191
+ internalTrace.output = undefined;
1192
+ }
1193
+
1194
+ if (trace.error === null) {
1195
+ internalTrace.error = undefined;
1196
+ }
1197
+
1198
+ if (trace.revertReason === null) {
1199
+ internalTrace.revertReason = undefined;
1200
+ }
1201
+ }
1202
+
1203
+ for (let i = 0; i < logsRows.length; i++) {
1204
+ if (Number(logsRows[i]!.blockNumber) > cursor) {
1205
+ logsRows.length = i;
1206
+ break;
1207
+ }
1208
+
1209
+ const log = logsRows[i]!;
1210
+ const internalLog = log as unknown as InternalLog;
1211
+
1212
+ internalLog.blockNumber = Number(log.blockNumber);
1213
+ internalLog.address = toLowerCase(log.address);
1214
+ internalLog.removed = false;
1215
+ internalLog.topics = [
1216
+ // @ts-ignore
1217
+ log.topic0,
1218
+ log.topic1,
1219
+ log.topic2,
1220
+ log.topic3,
1221
+ ];
1222
+ // @ts-ignore
1223
+ log.topic0 = undefined;
1224
+ // @ts-ignore
1225
+ log.topic1 = undefined;
1226
+ // @ts-ignore
1227
+ log.topic2 = undefined;
1228
+ // @ts-ignore
1229
+ log.topic3 = undefined;
1230
+ }
1231
+
1232
+ common.metrics.ponder_historical_extract_duration.inc(
1233
+ { step: "format" },
1234
+ endClock(),
1235
+ );
1236
+
1237
+ await new Promise(setImmediate);
1238
+
1239
+ return {
1240
+ blocks: blocksRows as InternalBlock[],
1241
+ logs: logsRows as InternalLog[],
1242
+ transactions: transactionsRows as InternalTransaction[],
1243
+ transactionReceipts:
1244
+ transactionReceiptsRows as InternalTransactionReceipt[],
1245
+ traces: tracesRows as InternalTrace[],
1246
+ cursor,
1247
+ };
1248
+ },
1249
+ insertRpcRequestResults: async ({ requests, chainId }, context) => {
1250
+ if (requests.length === 0) return;
1251
+
1252
+ const values = requests.map(({ request, blockNumber, result }) => ({
1253
+ requestHash: crypto
1254
+ .createHash("md5")
1255
+ .update(toLowerCase(JSON.stringify(orderObject(request))))
1256
+ .digest("hex"),
1257
+ chainId: BigInt(chainId),
1258
+ blockNumber: blockNumber ? BigInt(blockNumber) : undefined,
1259
+ result,
1260
+ }));
1261
+
1262
+ await qb.wrap(
1263
+ { label: "insert_rpc_requests" },
1264
+ (db) =>
1265
+ db
1266
+ .insert(PONDER_SYNC.rpcRequestResults)
1267
+ .values(values)
1268
+ .onConflictDoNothing({
1269
+ target: [
1270
+ PONDER_SYNC.rpcRequestResults.requestHash,
1271
+ PONDER_SYNC.rpcRequestResults.chainId,
1272
+ ],
1273
+ }),
1274
+ context,
1275
+ );
1276
+ },
1277
+ getRpcRequestResults: async ({ requests, chainId }, context) => {
1278
+ if (requests.length === 0) return [];
1279
+
1280
+ // Optimized fast path for high number of `requests` using a range of block numbers
1281
+ // rather than querying each request individually.
1282
+
1283
+ const blockNumbersByRequest: (number | undefined)[] = new Array(
1284
+ requests.length,
1285
+ );
1286
+ const requestHashes: string[] = new Array(requests.length);
1287
+
1288
+ for (let i = 0; i < requests.length; i++) {
1289
+ const request = requests[i]!;
1290
+ const blockNumber = extractBlockNumberParam(request);
1291
+
1292
+ // Note: "latest" is not considered a block number
1293
+ if (isHex(blockNumber)) {
1294
+ blockNumbersByRequest[i] = hexToNumber(blockNumber);
1295
+ } else {
1296
+ blockNumbersByRequest[i] = undefined;
1297
+ }
1298
+
1299
+ const requestHash = crypto
1300
+ .createHash("md5")
1301
+ .update(toLowerCase(JSON.stringify(orderObject(request))))
1302
+ .digest("hex");
1303
+
1304
+ requestHashes[i] = requestHash;
1305
+ }
1306
+
1307
+ const blockNumbers = blockNumbersByRequest.filter(
1308
+ (blockNumber): blockNumber is number => blockNumber !== undefined,
1309
+ );
1310
+
1311
+ if (blockNumbers.length > 100) {
1312
+ const minBlockNumber = Math.min(...blockNumbers);
1313
+ const maxBlockNumber = Math.max(...blockNumbers);
1314
+
1315
+ const nonBlockRequestHashes = requestHashes.filter(
1316
+ (_, i) => blockNumbersByRequest[i] === undefined,
1317
+ );
1318
+
1319
+ const result = await Promise.all([
1320
+ qb.wrap(
1321
+ { label: "select_rpc_requests" },
1322
+ (db) =>
1323
+ db
1324
+ .select({
1325
+ request_hash: PONDER_SYNC.rpcRequestResults.requestHash,
1326
+ result: PONDER_SYNC.rpcRequestResults.result,
1327
+ })
1328
+ .from(PONDER_SYNC.rpcRequestResults)
1329
+ .where(
1330
+ and(
1331
+ eq(PONDER_SYNC.rpcRequestResults.chainId, BigInt(chainId)),
1332
+ gte(
1333
+ PONDER_SYNC.rpcRequestResults.blockNumber,
1334
+ BigInt(minBlockNumber),
1335
+ ),
1336
+ lte(
1337
+ PONDER_SYNC.rpcRequestResults.blockNumber,
1338
+ BigInt(maxBlockNumber),
1339
+ ),
1340
+ ),
1341
+ ),
1342
+ context,
1343
+ ),
1344
+ nonBlockRequestHashes.length === 0
1345
+ ? []
1346
+ : qb.wrap(
1347
+ { label: "select_rpc_requests" },
1348
+ (db) =>
1349
+ db
1350
+ .select({
1351
+ request_hash: PONDER_SYNC.rpcRequestResults.requestHash,
1352
+ result: PONDER_SYNC.rpcRequestResults.result,
1353
+ })
1354
+ .from(PONDER_SYNC.rpcRequestResults)
1355
+ .where(
1356
+ and(
1357
+ eq(
1358
+ PONDER_SYNC.rpcRequestResults.chainId,
1359
+ BigInt(chainId),
1360
+ ),
1361
+ inArray(
1362
+ PONDER_SYNC.rpcRequestResults.requestHash,
1363
+ nonBlockRequestHashes,
1364
+ ),
1365
+ ),
1366
+ ),
1367
+ context,
1368
+ ),
1369
+ ]);
1370
+
1371
+ const results = new Map<string, string | undefined>();
1372
+ for (const row of result[0]!) {
1373
+ results.set(row.request_hash, row.result);
1374
+ }
1375
+ for (const row of result[1]!) {
1376
+ results.set(row.request_hash, row.result);
1377
+ }
1378
+
1379
+ return requestHashes.map((requestHash) => results.get(requestHash));
1380
+ }
1381
+
1382
+ const result = await qb.wrap(
1383
+ { label: "select_rpc_requests" },
1384
+ (db) =>
1385
+ db
1386
+ .select({
1387
+ request_hash: PONDER_SYNC.rpcRequestResults.requestHash,
1388
+ result: PONDER_SYNC.rpcRequestResults.result,
1389
+ })
1390
+ .from(PONDER_SYNC.rpcRequestResults)
1391
+ .where(
1392
+ and(
1393
+ eq(PONDER_SYNC.rpcRequestResults.chainId, BigInt(chainId)),
1394
+ inArray(
1395
+ PONDER_SYNC.rpcRequestResults.requestHash,
1396
+ requestHashes,
1397
+ ),
1398
+ ),
1399
+ ),
1400
+ context,
1401
+ );
1402
+
1403
+ const results = new Map<string, string | undefined>();
1404
+ for (const row of result) {
1405
+ results.set(row.request_hash, row.result);
1406
+ }
1407
+
1408
+ return requestHashes.map((requestHash) => results.get(requestHash));
1409
+ },
1410
+ pruneRpcRequestResults: async ({ blocks, chainId }, context) => {
1411
+ if (blocks.length === 0) return;
1412
+
1413
+ const numbers = blocks.map(({ number }) => BigInt(hexToNumber(number)));
1414
+
1415
+ await qb.wrap(
1416
+ { label: "delete_rpc_requests" },
1417
+ (db) =>
1418
+ db
1419
+ .delete(PONDER_SYNC.rpcRequestResults)
1420
+ .where(
1421
+ and(
1422
+ eq(PONDER_SYNC.rpcRequestResults.chainId, BigInt(chainId)),
1423
+ inArray(PONDER_SYNC.rpcRequestResults.blockNumber, numbers),
1424
+ ),
1425
+ ),
1426
+ context,
1427
+ );
1428
+ },
1429
+ pruneByChain: async ({ chainId }, context) =>
1430
+ qb.transaction(async (tx) => {
1431
+ await tx.wrap(
1432
+ { label: "delete_logs" },
1433
+ (db) =>
1434
+ db
1435
+ .delete(PONDER_SYNC.logs)
1436
+ .where(eq(PONDER_SYNC.logs.chainId, BigInt(chainId)))
1437
+ .execute(),
1438
+ context,
1439
+ );
1440
+ await tx.wrap(
1441
+ { label: "delete_blocks" },
1442
+ (db) =>
1443
+ db
1444
+ .delete(PONDER_SYNC.blocks)
1445
+ .where(eq(PONDER_SYNC.blocks.chainId, BigInt(chainId)))
1446
+ .execute(),
1447
+ context,
1448
+ );
1449
+ await tx.wrap(
1450
+ { label: "delete_traces" },
1451
+ (db) =>
1452
+ db
1453
+ .delete(PONDER_SYNC.traces)
1454
+ .where(eq(PONDER_SYNC.traces.chainId, BigInt(chainId)))
1455
+ .execute(),
1456
+ context,
1457
+ );
1458
+ await tx.wrap(
1459
+ { label: "delete_transactions" },
1460
+ (db) =>
1461
+ db
1462
+ .delete(PONDER_SYNC.transactions)
1463
+ .where(eq(PONDER_SYNC.transactions.chainId, BigInt(chainId)))
1464
+ .execute(),
1465
+ context,
1466
+ );
1467
+ await tx.wrap(
1468
+ { label: "delete_transaction_receipts" },
1469
+ (db) =>
1470
+ db
1471
+ .delete(PONDER_SYNC.transactionReceipts)
1472
+ .where(
1473
+ eq(PONDER_SYNC.transactionReceipts.chainId, BigInt(chainId)),
1474
+ )
1475
+ .execute(),
1476
+ context,
1477
+ );
1478
+ await tx.wrap(
1479
+ { label: "delete_factory_addresses" },
1480
+ (db) =>
1481
+ db
1482
+ .delete(PONDER_SYNC.factoryAddresses)
1483
+ .where(eq(PONDER_SYNC.factoryAddresses.chainId, BigInt(chainId)))
1484
+ .execute(),
1485
+ context,
1486
+ );
1487
+ }),
1488
+ } satisfies SyncStore;
1489
+
1490
+ return syncStore;
1491
+ };
1492
+
1493
+ const addressFilter = (
1494
+ address:
1495
+ | LogFilter["address"]
1496
+ | TransactionFilter["fromAddress"]
1497
+ | TransactionFilter["toAddress"],
1498
+ column: PgColumn,
1499
+ ): SQL => {
1500
+ // `factory` filtering is handled in-memory
1501
+ if (isAddressFactory(address)) return sql`true`;
1502
+ // @ts-ignore
1503
+ if (Array.isArray(address)) return inArray(column, address);
1504
+ // @ts-ignore
1505
+ if (typeof address === "string") return eq(column, address);
1506
+ return sql`true`;
1507
+ };
1508
+
1509
+ export const logFilter = (filter: LogFilter): SQL => {
1510
+ const conditions: SQL[] = [];
1511
+
1512
+ for (const idx of [0, 1, 2, 3] as const) {
1513
+ // If it's an array of length 1, collapse it.
1514
+ const raw = filter[`topic${idx}`] ?? null;
1515
+ if (raw === null) continue;
1516
+ const topic = Array.isArray(raw) && raw.length === 1 ? raw[0]! : raw;
1517
+ if (Array.isArray(topic)) {
1518
+ conditions.push(inArray(PONDER_SYNC.logs[`topic${idx}`], topic));
1519
+ } else {
1520
+ conditions.push(eq(PONDER_SYNC.logs[`topic${idx}`], topic));
1521
+ }
1522
+ }
1523
+
1524
+ conditions.push(addressFilter(filter.address, PONDER_SYNC.logs.address));
1525
+
1526
+ if (filter.fromBlock !== undefined) {
1527
+ conditions.push(
1528
+ gte(PONDER_SYNC.logs.blockNumber, BigInt(filter.fromBlock!)),
1529
+ );
1530
+ }
1531
+ if (filter.toBlock !== undefined) {
1532
+ conditions.push(lte(PONDER_SYNC.logs.blockNumber, BigInt(filter.toBlock!)));
1533
+ }
1534
+
1535
+ return and(...conditions)!;
1536
+ };
1537
+
1538
+ export const blockFilter = (filter: BlockFilter): SQL => {
1539
+ const conditions: SQL[] = [];
1540
+
1541
+ conditions.push(
1542
+ sql`(blocks.number - ${filter.offset}) % ${filter.interval} = 0`,
1543
+ );
1544
+
1545
+ if (filter.fromBlock !== undefined) {
1546
+ conditions.push(gte(PONDER_SYNC.blocks.number, BigInt(filter.fromBlock!)));
1547
+ }
1548
+ if (filter.toBlock !== undefined) {
1549
+ conditions.push(lte(PONDER_SYNC.blocks.number, BigInt(filter.toBlock!)));
1550
+ }
1551
+
1552
+ return and(...conditions)!;
1553
+ };
1554
+
1555
+ export const transactionFilter = (filter: TransactionFilter): SQL => {
1556
+ const conditions: SQL[] = [];
1557
+
1558
+ conditions.push(
1559
+ addressFilter(filter.fromAddress, PONDER_SYNC.transactions.from),
1560
+ );
1561
+ conditions.push(addressFilter(filter.toAddress, PONDER_SYNC.transactions.to));
1562
+
1563
+ if (filter.fromBlock !== undefined) {
1564
+ conditions.push(
1565
+ gte(PONDER_SYNC.transactions.blockNumber, BigInt(filter.fromBlock!)),
1566
+ );
1567
+ }
1568
+ if (filter.toBlock !== undefined) {
1569
+ conditions.push(
1570
+ lte(PONDER_SYNC.transactions.blockNumber, BigInt(filter.toBlock!)),
1571
+ );
1572
+ }
1573
+
1574
+ return and(...conditions)!;
1575
+ };
1576
+
1577
+ export const transferFilter = (filter: TransferFilter): SQL => {
1578
+ const conditions: SQL[] = [];
1579
+
1580
+ conditions.push(addressFilter(filter.fromAddress, PONDER_SYNC.traces.from));
1581
+ conditions.push(addressFilter(filter.toAddress, PONDER_SYNC.traces.to));
1582
+
1583
+ if (filter.includeReverted === false) {
1584
+ conditions.push(isNull(PONDER_SYNC.traces.error));
1585
+ }
1586
+
1587
+ if (filter.fromBlock !== undefined) {
1588
+ conditions.push(
1589
+ gte(PONDER_SYNC.traces.blockNumber, BigInt(filter.fromBlock!)),
1590
+ );
1591
+ }
1592
+ if (filter.toBlock !== undefined) {
1593
+ conditions.push(
1594
+ lte(PONDER_SYNC.traces.blockNumber, BigInt(filter.toBlock!)),
1595
+ );
1596
+ }
1597
+
1598
+ return and(...conditions)!;
1599
+ };
1600
+
1601
+ export const traceFilter = (filter: TraceFilter): SQL => {
1602
+ const conditions: SQL[] = [];
1603
+
1604
+ conditions.push(addressFilter(filter.fromAddress, PONDER_SYNC.traces.from));
1605
+ conditions.push(addressFilter(filter.toAddress, PONDER_SYNC.traces.to));
1606
+
1607
+ if (filter.includeReverted === false) {
1608
+ conditions.push(isNull(PONDER_SYNC.traces.error));
1609
+ }
1610
+
1611
+ if (filter.callType !== undefined) {
1612
+ conditions.push(eq(PONDER_SYNC.traces.type, filter.callType));
1613
+ }
1614
+
1615
+ if (filter.functionSelector !== undefined) {
1616
+ conditions.push(
1617
+ eq(sql`substring(traces.input from 1 for 10)`, filter.functionSelector),
1618
+ );
1619
+ }
1620
+
1621
+ if (filter.fromBlock !== undefined) {
1622
+ conditions.push(
1623
+ gte(PONDER_SYNC.traces.blockNumber, BigInt(filter.fromBlock!)),
1624
+ );
1625
+ }
1626
+ if (filter.toBlock !== undefined) {
1627
+ conditions.push(
1628
+ lte(PONDER_SYNC.traces.blockNumber, BigInt(filter.toBlock!)),
1629
+ );
1630
+ }
1631
+
1632
+ return and(...conditions)!;
1633
+ };