@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,1801 @@
1
+ import { type Logger, createNoopLogger } from "@/internal/logger.js";
2
+ import type { Kysely, Migration, MigrationProvider } from "kysely";
3
+ import { sql } from "kysely";
4
+ import { maxUint256 } from "viem";
5
+
6
+ let logger = createNoopLogger();
7
+
8
+ class StaticMigrationProvider implements MigrationProvider {
9
+ async getMigrations() {
10
+ return migrations;
11
+ }
12
+ }
13
+
14
+ export function buildMigrationProvider(logger_: Logger) {
15
+ logger = logger_;
16
+ const migrationProvider = new StaticMigrationProvider();
17
+ return migrationProvider;
18
+ }
19
+
20
+ const migrations: Record<string, Migration> = {
21
+ "2023_05_15_0_initial": {
22
+ async up(db: Kysely<any>) {
23
+ await db.schema
24
+ .createTable("blocks")
25
+ .addColumn("baseFeePerGas", sql`bytea`) // BigInt
26
+ .addColumn("chainId", "integer", (col) => col.notNull())
27
+ .addColumn("difficulty", sql`bytea`, (col) => col.notNull()) // BigInt
28
+ .addColumn("extraData", "text", (col) => col.notNull())
29
+ .addColumn("finalized", "integer", (col) => col.notNull()) // Boolean (0 or 1).
30
+ .addColumn("gasLimit", sql`bytea`, (col) => col.notNull()) // BigInt
31
+ .addColumn("gasUsed", sql`bytea`, (col) => col.notNull()) // BigInt
32
+ .addColumn("hash", "text", (col) => col.notNull().primaryKey())
33
+ .addColumn("logsBloom", "text", (col) => col.notNull())
34
+ .addColumn("miner", "text", (col) => col.notNull())
35
+ .addColumn("mixHash", "text", (col) => col.notNull())
36
+ .addColumn("nonce", "text", (col) => col.notNull())
37
+ .addColumn("number", sql`bytea`, (col) => col.notNull()) // BigInt
38
+ .addColumn("parentHash", "text", (col) => col.notNull())
39
+ .addColumn("receiptsRoot", "text", (col) => col.notNull())
40
+ .addColumn("sha3Uncles", "text", (col) => col.notNull())
41
+ .addColumn("size", sql`bytea`, (col) => col.notNull()) // BigInt
42
+ .addColumn("stateRoot", "text", (col) => col.notNull())
43
+ .addColumn("timestamp", sql`bytea`, (col) => col.notNull()) // BigInt
44
+ .addColumn("totalDifficulty", sql`bytea`, (col) => col.notNull()) // BigInt
45
+ .addColumn("transactionsRoot", "text", (col) => col.notNull())
46
+ .execute();
47
+
48
+ await db.schema
49
+ .createTable("transactions")
50
+ .addColumn("accessList", "text")
51
+ .addColumn("blockHash", "text", (col) => col.notNull())
52
+ .addColumn("blockNumber", sql`bytea`, (col) => col.notNull()) // BigInt
53
+ .addColumn("chainId", "integer", (col) => col.notNull())
54
+ .addColumn("finalized", "integer", (col) => col.notNull()) // Boolean (0 or 1).
55
+ .addColumn("from", "text", (col) => col.notNull())
56
+ .addColumn("gas", sql`bytea`, (col) => col.notNull()) // BigInt
57
+ .addColumn("gasPrice", sql`bytea`) // BigInt
58
+ .addColumn("hash", "text", (col) => col.notNull().primaryKey())
59
+ .addColumn("input", "text", (col) => col.notNull())
60
+ .addColumn("maxFeePerGas", sql`bytea`) // BigInt
61
+ .addColumn("maxPriorityFeePerGas", sql`bytea`) // BigInt
62
+ .addColumn("nonce", "integer", (col) => col.notNull())
63
+ .addColumn("r", "text", (col) => col.notNull())
64
+ .addColumn("s", "text", (col) => col.notNull())
65
+ .addColumn("to", "text")
66
+ .addColumn("transactionIndex", "integer", (col) => col.notNull())
67
+ .addColumn("type", "text", (col) => col.notNull())
68
+ .addColumn("value", sql`bytea`, (col) => col.notNull()) // BigInt
69
+ .addColumn("v", sql`bytea`, (col) => col.notNull()) // BigInt
70
+ .execute();
71
+
72
+ await db.schema
73
+ .createTable("logs")
74
+ .addColumn("address", "text", (col) => col.notNull())
75
+ .addColumn("blockHash", "text", (col) => col.notNull())
76
+ .addColumn("blockNumber", sql`bytea`, (col) => col.notNull()) // BigInt
77
+ .addColumn("chainId", "integer", (col) => col.notNull())
78
+ .addColumn("data", "text", (col) => col.notNull())
79
+ .addColumn("finalized", "integer", (col) => col.notNull()) // Boolean (0 or 1).
80
+ .addColumn("id", "text", (col) => col.notNull().primaryKey())
81
+ .addColumn("logIndex", "integer", (col) => col.notNull())
82
+ .addColumn("topic0", "text")
83
+ .addColumn("topic1", "text")
84
+ .addColumn("topic2", "text")
85
+ .addColumn("topic3", "text")
86
+ .addColumn("transactionHash", "text", (col) => col.notNull())
87
+ .addColumn("transactionIndex", "integer", (col) => col.notNull())
88
+ .execute();
89
+
90
+ await db.schema
91
+ .createTable("contractReadResults")
92
+ .addColumn("address", "text", (col) => col.notNull())
93
+ .addColumn("blockNumber", sql`bytea`, (col) => col.notNull()) // BigInt
94
+ .addColumn("chainId", "integer", (col) => col.notNull())
95
+ .addColumn("data", "text", (col) => col.notNull())
96
+ .addColumn("finalized", "integer", (col) => col.notNull()) // Boolean (0 or 1).
97
+ .addColumn("result", "text", (col) => col.notNull())
98
+ .addPrimaryKeyConstraint("contractReadResultPrimaryKey", [
99
+ "chainId",
100
+ "blockNumber",
101
+ "address",
102
+ "data",
103
+ ])
104
+ .execute();
105
+
106
+ await db.schema
107
+ .createTable("logFilterCachedRanges")
108
+ .addColumn("endBlock", sql`bytea`, (col) => col.notNull()) // BigInt
109
+ .addColumn("endBlockTimestamp", sql`bytea`, (col) => col.notNull()) // BigInt
110
+ .addColumn("filterKey", "text", (col) => col.notNull())
111
+ // The `id` column should not be included in INSERT statements.
112
+ // This column uses Postgres SERIAL type which autoincrements.
113
+ .addColumn("id", "serial", (col) => col.notNull().primaryKey())
114
+ .addColumn("startBlock", sql`bytea`, (col) => col.notNull()) // BigInt
115
+ .execute();
116
+ },
117
+ },
118
+ "2023_06_20_0_indices": {
119
+ async up(db: Kysely<any>) {
120
+ await db.schema
121
+ .createIndex("log_events_index")
122
+ .on("logs")
123
+ .columns(["address", "chainId", "blockHash"])
124
+ .execute();
125
+
126
+ await db.schema
127
+ .createIndex("blocks_index")
128
+ .on("blocks")
129
+ .columns(["timestamp", "number"])
130
+ .execute();
131
+
132
+ await db.schema
133
+ .createIndex("logFilterCachedRanges_index")
134
+ .on("logFilterCachedRanges")
135
+ .columns(["filterKey"])
136
+ .execute();
137
+ },
138
+ },
139
+ "2023_07_18_0_better_indices": {
140
+ async up(db: Kysely<any>) {
141
+ // Drop old indices.
142
+ await db.schema.dropIndex("log_events_index").execute();
143
+ await db.schema.dropIndex("blocks_index").execute();
144
+
145
+ // Block hash is a join key.
146
+ await db.schema
147
+ .createIndex("log_block_hash_index")
148
+ .on("logs")
149
+ .column("blockHash")
150
+ .execute();
151
+
152
+ // Chain ID, address and topic0 are all used in WHERE clauses.
153
+ await db.schema
154
+ .createIndex("log_chain_id_index")
155
+ .on("logs")
156
+ .column("chainId")
157
+ .execute();
158
+ await db.schema
159
+ .createIndex("log_address_index")
160
+ .on("logs")
161
+ .column("address")
162
+ .execute();
163
+ await db.schema
164
+ .createIndex("log_topic0_index")
165
+ .on("logs")
166
+ .column("topic0")
167
+ .execute();
168
+
169
+ // Block timestamp and number are both used in WHERE and SORT clauses.
170
+ await db.schema
171
+ .createIndex("block_timestamp_index")
172
+ .on("blocks")
173
+ .column("timestamp")
174
+ .execute();
175
+ await db.schema
176
+ .createIndex("block_number_index")
177
+ .on("blocks")
178
+ .column("number")
179
+ .execute();
180
+ },
181
+ },
182
+ "2023_07_24_0_drop_finalized": {
183
+ async up(db: Kysely<any>) {
184
+ await db.schema.alterTable("blocks").dropColumn("finalized").execute();
185
+ await db.schema
186
+ .alterTable("transactions")
187
+ .dropColumn("finalized")
188
+ .execute();
189
+ await db.schema.alterTable("logs").dropColumn("finalized").execute();
190
+ await db.schema
191
+ .alterTable("contractReadResults")
192
+ .dropColumn("finalized")
193
+ .execute();
194
+ },
195
+ },
196
+ "2023_09_19_0_new_sync_design": {
197
+ async up(db: Kysely<any>) {
198
+ /** This table is no longer being used. */
199
+ await db.schema.dropTable("logFilterCachedRanges").execute();
200
+
201
+ /** Drop and re-create all tables to fix bigint encoding. */
202
+ await db.schema.dropTable("blocks").execute();
203
+ await db.schema
204
+ .createTable("blocks")
205
+ .addColumn("baseFeePerGas", "numeric(78, 0)")
206
+ .addColumn("chainId", "integer", (col) => col.notNull())
207
+ .addColumn("difficulty", "numeric(78, 0)", (col) => col.notNull())
208
+ .addColumn("extraData", "text", (col) => col.notNull())
209
+ .addColumn("gasLimit", "numeric(78, 0)", (col) => col.notNull())
210
+ .addColumn("gasUsed", "numeric(78, 0)", (col) => col.notNull())
211
+ .addColumn("hash", "varchar(66)", (col) => col.notNull().primaryKey())
212
+ .addColumn("logsBloom", "varchar(514)", (col) => col.notNull())
213
+ .addColumn("miner", "varchar(42)", (col) => col.notNull())
214
+ .addColumn("mixHash", "varchar(66)", (col) => col.notNull())
215
+ .addColumn("nonce", "varchar(18)", (col) => col.notNull())
216
+ .addColumn("number", "numeric(78, 0)", (col) => col.notNull())
217
+ .addColumn("parentHash", "varchar(66)", (col) => col.notNull())
218
+ .addColumn("receiptsRoot", "varchar(66)", (col) => col.notNull())
219
+ .addColumn("sha3Uncles", "varchar(66)", (col) => col.notNull())
220
+ .addColumn("size", "numeric(78, 0)", (col) => col.notNull())
221
+ .addColumn("stateRoot", "varchar(66)", (col) => col.notNull())
222
+ .addColumn("timestamp", "numeric(78, 0)", (col) => col.notNull())
223
+ .addColumn("totalDifficulty", "numeric(78, 0)", (col) => col.notNull())
224
+ .addColumn("transactionsRoot", "varchar(66)", (col) => col.notNull())
225
+ .execute();
226
+ await db.schema
227
+ .createIndex("blockTimestampIndex")
228
+ .on("blocks")
229
+ .column("timestamp")
230
+ .execute();
231
+ await db.schema
232
+ .createIndex("blockNumberIndex")
233
+ .on("blocks")
234
+ .column("number")
235
+ .execute();
236
+
237
+ await db.schema.dropTable("transactions").execute();
238
+ await db.schema
239
+ .createTable("transactions")
240
+ .addColumn("accessList", "text")
241
+ .addColumn("blockHash", "varchar(66)", (col) => col.notNull())
242
+ .addColumn("blockNumber", "numeric(78, 0)", (col) => col.notNull())
243
+ .addColumn("chainId", "integer", (col) => col.notNull())
244
+ .addColumn("from", "varchar(42)", (col) => col.notNull())
245
+ .addColumn("gas", "numeric(78, 0)", (col) => col.notNull())
246
+ .addColumn("gasPrice", "numeric(78, 0)")
247
+ .addColumn("hash", "varchar(66)", (col) => col.notNull().primaryKey())
248
+ .addColumn("input", "text", (col) => col.notNull())
249
+ .addColumn("maxFeePerGas", "numeric(78, 0)")
250
+ .addColumn("maxPriorityFeePerGas", "numeric(78, 0)")
251
+ .addColumn("nonce", "integer", (col) => col.notNull())
252
+ .addColumn("r", "varchar(66)", (col) => col.notNull())
253
+ .addColumn("s", "varchar(66)", (col) => col.notNull())
254
+ .addColumn("to", "varchar(42)")
255
+ .addColumn("transactionIndex", "integer", (col) => col.notNull())
256
+ .addColumn("type", "text", (col) => col.notNull())
257
+ .addColumn("value", "numeric(78, 0)", (col) => col.notNull())
258
+ .addColumn("v", "numeric(78, 0)", (col) => col.notNull())
259
+ .execute();
260
+
261
+ await db.schema.dropTable("logs").execute();
262
+ await db.schema
263
+ .createTable("logs")
264
+ .addColumn("address", "varchar(42)", (col) => col.notNull())
265
+ .addColumn("blockHash", "varchar(66)", (col) => col.notNull())
266
+ .addColumn("blockNumber", "numeric(78, 0)", (col) => col.notNull())
267
+ .addColumn("chainId", "integer", (col) => col.notNull())
268
+ .addColumn("data", "text", (col) => col.notNull())
269
+ .addColumn("id", "text", (col) => col.notNull().primaryKey())
270
+ .addColumn("logIndex", "integer", (col) => col.notNull())
271
+ .addColumn("topic0", "varchar(66)")
272
+ .addColumn("topic1", "varchar(66)")
273
+ .addColumn("topic2", "varchar(66)")
274
+ .addColumn("topic3", "varchar(66)")
275
+ .addColumn("transactionHash", "varchar(66)", (col) => col.notNull())
276
+ .addColumn("transactionIndex", "integer", (col) => col.notNull())
277
+ .execute();
278
+ await db.schema
279
+ .createIndex("logBlockHashIndex")
280
+ .on("logs")
281
+ .column("blockHash")
282
+ .execute();
283
+ await db.schema
284
+ .createIndex("logChainIdIndex")
285
+ .on("logs")
286
+ .column("chainId")
287
+ .execute();
288
+ await db.schema
289
+ .createIndex("logAddressIndex")
290
+ .on("logs")
291
+ .column("address")
292
+ .execute();
293
+ await db.schema
294
+ .createIndex("logTopic0Index")
295
+ .on("logs")
296
+ .column("topic0")
297
+ .execute();
298
+
299
+ await db.schema.dropTable("contractReadResults").execute();
300
+ await db.schema
301
+ .createTable("contractReadResults")
302
+ .addColumn("address", "varchar(42)", (col) => col.notNull())
303
+ .addColumn("blockNumber", "numeric(78, 0)", (col) => col.notNull())
304
+ .addColumn("chainId", "integer", (col) => col.notNull())
305
+ .addColumn("data", "text", (col) => col.notNull())
306
+ .addColumn("result", "text", (col) => col.notNull())
307
+ .addPrimaryKeyConstraint("contractReadResultPrimaryKey", [
308
+ "chainId",
309
+ "blockNumber",
310
+ "address",
311
+ "data",
312
+ ])
313
+ .execute();
314
+
315
+ /** Add new log filter and factory contract interval tables. */
316
+ await db.schema
317
+ .createTable("logFilters")
318
+ .addColumn("id", "text", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${topic0}_${topic1}_${topic2}_${topic3}`
319
+ .addColumn("chainId", "integer", (col) => col.notNull())
320
+ .addColumn("address", "varchar(66)")
321
+ .addColumn("topic0", "varchar(66)")
322
+ .addColumn("topic1", "varchar(66)")
323
+ .addColumn("topic2", "varchar(66)")
324
+ .addColumn("topic3", "varchar(66)")
325
+ .execute();
326
+ await db.schema
327
+ .createTable("logFilterIntervals")
328
+ .addColumn("id", "serial", (col) => col.notNull().primaryKey()) // Auto-increment
329
+ .addColumn("logFilterId", "text", (col) =>
330
+ col.notNull().references("logFilters.id"),
331
+ )
332
+ .addColumn("startBlock", "numeric(78, 0)", (col) => col.notNull())
333
+ .addColumn("endBlock", "numeric(78, 0)", (col) => col.notNull())
334
+ .execute();
335
+ await db.schema
336
+ .createIndex("logFilterIntervalsLogFilterId")
337
+ .on("logFilterIntervals")
338
+ .column("logFilterId")
339
+ .execute();
340
+
341
+ await db.schema
342
+ .createTable("factories")
343
+ .addColumn("id", "text", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${eventSelector}_${childAddressLocation}`
344
+ .addColumn("chainId", "integer", (col) => col.notNull())
345
+ .addColumn("address", "varchar(42)", (col) => col.notNull())
346
+ .addColumn("eventSelector", "varchar(66)", (col) => col.notNull())
347
+ .addColumn("childAddressLocation", "text", (col) => col.notNull()) // `topic${number}` or `offset${number}`
348
+ .addColumn("topic0", "varchar(66)")
349
+ .addColumn("topic1", "varchar(66)")
350
+ .addColumn("topic2", "varchar(66)")
351
+ .addColumn("topic3", "varchar(66)")
352
+ .execute();
353
+ await db.schema
354
+ .createTable("factoryLogFilterIntervals")
355
+ .addColumn("id", "serial", (col) => col.notNull().primaryKey()) // Auto-increment
356
+ .addColumn("factoryId", "text", (col) =>
357
+ col.notNull().references("factories.id"),
358
+ )
359
+ .addColumn("startBlock", "numeric(78, 0)", (col) => col.notNull())
360
+ .addColumn("endBlock", "numeric(78, 0)", (col) => col.notNull())
361
+ .execute();
362
+ await db.schema
363
+ .createIndex("factoryLogFilterIntervalsFactoryId")
364
+ .on("factoryLogFilterIntervals")
365
+ .column("factoryId")
366
+ .execute();
367
+ },
368
+ },
369
+ "2023_11_06_0_new_rpc_cache_design": {
370
+ async up(db: Kysely<any>) {
371
+ await db.schema.dropTable("contractReadResults").execute();
372
+
373
+ /**
374
+ * Formatting for "request" field values:
375
+ *
376
+ * eth_call: eth_call_{to}_{data}
377
+ * eth_getBalance: eth_getBalance_{address}
378
+ * eth_getCode: eth_getCode_{address}
379
+ * eth_getStorageAt: eth_getStorageAt_{address}_{slot}
380
+ */
381
+ await db.schema
382
+ .createTable("rpcRequestResults")
383
+ .addColumn("request", "text", (col) => col.notNull())
384
+ .addColumn("blockNumber", "numeric(78, 0)", (col) => col.notNull())
385
+ .addColumn("chainId", "integer", (col) => col.notNull())
386
+ .addColumn("result", "text", (col) => col.notNull())
387
+ .addPrimaryKeyConstraint("rpcRequestResultPrimaryKey", [
388
+ "request",
389
+ "chainId",
390
+ "blockNumber",
391
+ ])
392
+ .execute();
393
+ },
394
+ },
395
+ "2024_01_30_0_change_chain_id_type": {
396
+ async up(db: Kysely<any>) {
397
+ await db.schema
398
+ .alterTable("blocks")
399
+ .alterColumn("chainId", (col) => col.setDataType("int8"))
400
+ .execute();
401
+
402
+ await db.schema
403
+ .alterTable("transactions")
404
+ .alterColumn("chainId", (col) => col.setDataType("int8"))
405
+ .execute();
406
+
407
+ await db.schema
408
+ .alterTable("logs")
409
+ .alterColumn("chainId", (col) => col.setDataType("int8"))
410
+ .execute();
411
+
412
+ await db.schema
413
+ .alterTable("logFilters")
414
+ .alterColumn("chainId", (col) => col.setDataType("int8"))
415
+ .execute();
416
+
417
+ await db.schema
418
+ .alterTable("factories")
419
+ .alterColumn("chainId", (col) => col.setDataType("int8"))
420
+ .execute();
421
+
422
+ await db.schema
423
+ .alterTable("rpcRequestResults")
424
+ .alterColumn("chainId", (col) => col.setDataType("int8"))
425
+ .execute();
426
+ },
427
+ },
428
+ "2024_02_1_0_nullable_block_columns": {
429
+ async up(db: Kysely<any>) {
430
+ await db.schema
431
+ .alterTable("blocks")
432
+ .alterColumn("mixHash", (col) => col.dropNotNull())
433
+ .execute();
434
+ await db.schema
435
+ .alterTable("blocks")
436
+ .alterColumn("nonce", (col) => col.dropNotNull())
437
+ .execute();
438
+ },
439
+ },
440
+ "2024_03_00_0_log_transaction_hash_index": {
441
+ async up(db: Kysely<any>) {
442
+ await db.schema
443
+ .createIndex("log_transaction_hash_index")
444
+ .on("logs")
445
+ .column("transactionHash")
446
+ .execute();
447
+ },
448
+ },
449
+ "2024_03_13_0_nullable_block_columns_sha3uncles": {
450
+ async up(db: Kysely<any>) {
451
+ await db.schema
452
+ .alterTable("blocks")
453
+ .alterColumn("sha3Uncles", (col) => col.dropNotNull())
454
+ .execute();
455
+ },
456
+ },
457
+ "2024_03_14_0_nullable_transaction_rsv": {
458
+ async up(db: Kysely<any>) {
459
+ await db.schema
460
+ .alterTable("transactions")
461
+ .alterColumn("r", (col) => col.dropNotNull())
462
+ .execute();
463
+ await db.schema
464
+ .alterTable("transactions")
465
+ .alterColumn("s", (col) => col.dropNotNull())
466
+ .execute();
467
+ await db.schema
468
+ .alterTable("transactions")
469
+ .alterColumn("v", (col) => col.dropNotNull())
470
+ .execute();
471
+ },
472
+ },
473
+ "2024_03_20_0_checkpoint_in_logs_table": {
474
+ async up(_db: Kysely<any>) {
475
+ // no-op migration to avoid crashing databases that successfully ran this migration
476
+ return;
477
+ },
478
+ },
479
+ "2024_04_04_0_log_events_indexes": {
480
+ async up(db: Kysely<any>) {
481
+ await db.schema.dropIndex("blockNumberIndex").ifExists().execute();
482
+ await db.schema.dropIndex("blockTimestampIndex").ifExists().execute();
483
+
484
+ await db.schema
485
+ .createIndex("logBlockNumberIndex")
486
+ .on("logs")
487
+ .column("blockNumber")
488
+ .execute();
489
+ },
490
+ },
491
+ "2024_04_14_0_nullable_block_total_difficulty": {
492
+ async up(db: Kysely<any>) {
493
+ await db.schema
494
+ .alterTable("blocks")
495
+ .alterColumn("totalDifficulty", (col) => col.dropNotNull())
496
+ .execute();
497
+ },
498
+ },
499
+ "2024_04_14_1_add_checkpoint_column_to_logs_table": {
500
+ async up(db: Kysely<any>) {
501
+ await db.executeQuery(
502
+ sql`
503
+ ALTER TABLE ponder_sync.logs
504
+ ADD COLUMN IF NOT EXISTS
505
+ checkpoint varchar(75)`.compile(db),
506
+ );
507
+ },
508
+ },
509
+ "2024_04_14_2_set_checkpoint_in_logs_table": {
510
+ async up(db: Kysely<any>) {
511
+ await db.executeQuery(sql`SET statement_timeout = 3600000;`.compile(db));
512
+ await db.executeQuery(
513
+ sql`
514
+ CREATE TEMP TABLE cp_vals AS
515
+ SELECT
516
+ logs.id,
517
+ (lpad(blocks.timestamp::text, 10, '0') ||
518
+ lpad(blocks."chainId"::text, 16, '0') ||
519
+ lpad(blocks.number::text, 16, '0') ||
520
+ lpad(logs."transactionIndex"::text, 16, '0') ||
521
+ '5' ||
522
+ lpad(logs."logIndex"::text, 16, '0')) AS checkpoint
523
+ FROM ponder_sync.logs logs
524
+ JOIN ponder_sync.blocks blocks ON logs."blockHash" = blocks.hash;
525
+ `.compile(db),
526
+ );
527
+
528
+ await db.executeQuery(
529
+ sql`
530
+ CREATE INDEX ON cp_vals(id)
531
+ `.compile(db),
532
+ );
533
+
534
+ await db.executeQuery(
535
+ sql`
536
+ UPDATE ponder_sync.logs
537
+ SET checkpoint=cp_vals.checkpoint
538
+ FROM cp_vals
539
+ WHERE ponder_sync.logs.id = cp_vals.id
540
+ `.compile(db),
541
+ );
542
+
543
+ await db.executeQuery(
544
+ sql`DROP TABLE IF EXISTS cp_vals CASCADE;`.compile(db),
545
+ );
546
+ },
547
+ },
548
+ "2024_04_14_3_index_on_logs_checkpoint": {
549
+ async up(db: Kysely<any>) {
550
+ await db.schema
551
+ .createIndex("logs_checkpoint_index")
552
+ .ifNotExists()
553
+ .on("logs")
554
+ .column("checkpoint")
555
+ .execute();
556
+ },
557
+ },
558
+ "2024_04_22_0_transaction_receipts": {
559
+ async up(db: Kysely<any>) {
560
+ // Update the log filter ID keys to include the integer includeTransactionReceipts value.
561
+ // Note that we have to remove the FK constraint, which is fine given our app logic.
562
+ await db.schema
563
+ .alterTable("logFilterIntervals")
564
+ .dropConstraint("logFilterIntervals_logFilterId_fkey")
565
+ .execute();
566
+ await db
567
+ .updateTable("logFilters")
568
+ .set({ id: sql`"id" || '_0'` })
569
+ .execute();
570
+ await db
571
+ .updateTable("logFilterIntervals")
572
+ .set({ logFilterId: sql`"logFilterId" || '_0'` })
573
+ .execute();
574
+ // Add the includeTransactionReceipts column. By setting a default in the ADD COLUMN statement,
575
+ // Postgres will automatically populate all existing rows with the default value. But, we don't
576
+ // actually want a default (want to require a value on insertion), so immediately drop the default.
577
+ await db.schema
578
+ .alterTable("logFilters")
579
+ .addColumn("includeTransactionReceipts", "integer", (col) =>
580
+ col.notNull().defaultTo(0),
581
+ )
582
+ .execute();
583
+ await db.schema
584
+ .alterTable("logFilters")
585
+ .alterColumn("includeTransactionReceipts", (col) => col.dropDefault())
586
+ .execute();
587
+
588
+ // Repeat the same 2 steps for the factory tables.
589
+ await db.schema
590
+ .alterTable("factoryLogFilterIntervals")
591
+ .dropConstraint("factoryLogFilterIntervals_factoryId_fkey")
592
+ .execute();
593
+ await db
594
+ .updateTable("factories")
595
+ .set({ id: sql`"id" || '_0'` })
596
+ .execute();
597
+ await db
598
+ .updateTable("factoryLogFilterIntervals")
599
+ .set({ factoryId: sql`"factoryId" || '_0'` })
600
+ .execute();
601
+ await db.schema
602
+ .alterTable("factories")
603
+ .addColumn("includeTransactionReceipts", "integer", (col) =>
604
+ col.notNull().defaultTo(0),
605
+ )
606
+ .execute();
607
+ await db.schema
608
+ .alterTable("factories")
609
+ .alterColumn("includeTransactionReceipts", (col) => col.dropDefault())
610
+ .execute();
611
+
612
+ await db.schema
613
+ .createTable("transactionReceipts")
614
+ .addColumn("blockHash", "varchar(66)", (col) => col.notNull())
615
+ .addColumn("blockNumber", "numeric(78, 0)", (col) => col.notNull())
616
+ .addColumn("chainId", "integer", (col) => col.notNull())
617
+ .addColumn("contractAddress", "varchar(66)")
618
+ .addColumn("cumulativeGasUsed", "numeric(78, 0)", (col) =>
619
+ col.notNull(),
620
+ )
621
+ .addColumn("effectiveGasPrice", "numeric(78, 0)", (col) =>
622
+ col.notNull(),
623
+ )
624
+ .addColumn("from", "varchar(42)", (col) => col.notNull())
625
+ .addColumn("gasUsed", "numeric(78, 0)", (col) => col.notNull())
626
+ .addColumn("logs", "text", (col) => col.notNull())
627
+ .addColumn("logsBloom", "varchar(514)", (col) => col.notNull())
628
+ .addColumn("status", "text", (col) => col.notNull())
629
+ .addColumn("to", "varchar(42)")
630
+ .addColumn("transactionHash", "varchar(66)", (col) =>
631
+ col.notNull().primaryKey(),
632
+ )
633
+ .addColumn("transactionIndex", "integer", (col) => col.notNull())
634
+ .addColumn("type", "text", (col) => col.notNull())
635
+ .execute();
636
+ },
637
+ },
638
+ "2024_04_23_0_block_filters": {
639
+ async up(db: Kysely<any>) {
640
+ await db.schema
641
+ .createTable("blockFilters")
642
+ .addColumn("id", "text", (col) => col.notNull().primaryKey()) // `${chainId}_${interval}_${offset}`
643
+ .addColumn("chainId", "integer", (col) => col.notNull())
644
+ .addColumn("interval", "integer", (col) => col.notNull())
645
+ .addColumn("offset", "integer", (col) => col.notNull())
646
+ .execute();
647
+ await db.schema
648
+ .createTable("blockFilterIntervals")
649
+ .addColumn("id", "serial", (col) => col.notNull().primaryKey()) // Auto-increment
650
+ .addColumn("blockFilterId", "text", (col) =>
651
+ col.notNull().references("blockFilters.id"),
652
+ )
653
+ .addColumn("startBlock", "numeric(78, 0)", (col) => col.notNull())
654
+ .addColumn("endBlock", "numeric(78, 0)", (col) => col.notNull())
655
+ .execute();
656
+ await db.schema
657
+ .createIndex("blockFilterIntervalsBlockFilterId")
658
+ .on("blockFilterIntervals")
659
+ .column("blockFilterId")
660
+ .execute();
661
+
662
+ await db.schema
663
+ .alterTable("blocks")
664
+ .addColumn("checkpoint", "varchar(75)")
665
+ .execute();
666
+
667
+ await db.executeQuery(
668
+ sql`
669
+ CREATE TEMP TABLE bcp_vals AS
670
+ SELECT
671
+ blocks.hash,
672
+ (lpad(blocks.timestamp::text, 10, '0') ||
673
+ lpad(blocks."chainId"::text, 16, '0') ||
674
+ lpad(blocks.number::text, 16, '0') ||
675
+ '9999999999999999' ||
676
+ '5' ||
677
+ '0000000000000000') AS checkpoint
678
+ FROM ponder_sync.blocks
679
+ `.compile(db),
680
+ );
681
+
682
+ await db.executeQuery(
683
+ sql`
684
+ UPDATE ponder_sync.blocks
685
+ SET checkpoint=bcp_vals.checkpoint
686
+ FROM bcp_vals
687
+ WHERE ponder_sync.blocks.hash = bcp_vals.hash
688
+ `.compile(db),
689
+ );
690
+
691
+ await db.executeQuery(
692
+ sql`DROP TABLE IF EXISTS bcp_vals CASCADE;`.compile(db),
693
+ );
694
+
695
+ await db.schema
696
+ .alterTable("blocks")
697
+ .alterColumn("checkpoint", (col) => col.setNotNull())
698
+ .execute();
699
+
700
+ // The blocks.number index supports getEvents and deleteRealtimeData
701
+ await db.schema
702
+ .createIndex("blockNumberIndex")
703
+ .on("blocks")
704
+ .column("number")
705
+ .execute();
706
+ // The blocks.chainId index supports getEvents and deleteRealtimeData
707
+ await db.schema
708
+ .createIndex("blockChainIdIndex")
709
+ .on("blocks")
710
+ .column("chainId")
711
+ .execute();
712
+ // The blocks.checkpoint index supports getEvents
713
+ await db.schema
714
+ .createIndex("blockCheckpointIndex")
715
+ .on("blocks")
716
+ .column("checkpoint")
717
+ .execute();
718
+ },
719
+ },
720
+ "2024_05_07_0_trace_filters": {
721
+ async up(db: Kysely<any>) {
722
+ // TODO(kyle) drop foreign key constraint on "blockFilterIntervals.blockFilterId".
723
+
724
+ await db.schema
725
+ .createTable("traceFilters")
726
+ .addColumn("id", "text", (col) => col.notNull().primaryKey()) // `${chainId}_${fromAddress}_${toAddress}`
727
+ .addColumn("chainId", "integer", (col) => col.notNull())
728
+ .addColumn("fromAddress", "varchar(42)")
729
+ .addColumn("toAddress", "varchar(42)")
730
+ .execute();
731
+ await db.schema
732
+ .createTable("traceFilterIntervals")
733
+ .addColumn("id", "serial", (col) => col.notNull().primaryKey()) // Auto-increment
734
+ .addColumn("traceFilterId", "text", (col) => col.notNull())
735
+ .addColumn("startBlock", "numeric(78, 0)", (col) => col.notNull())
736
+ .addColumn("endBlock", "numeric(78, 0)", (col) => col.notNull())
737
+ .execute();
738
+ await db.schema
739
+ .createIndex("traceFilterIntervalsTraceFilterId")
740
+ .on("traceFilterIntervals")
741
+ .column("traceFilterId")
742
+ .execute();
743
+
744
+ await db.schema
745
+ .createTable("callTraces")
746
+ .addColumn("id", "text", (col) => col.notNull().primaryKey())
747
+ .addColumn("callType", "text", (col) => col.notNull())
748
+ .addColumn("from", "varchar(42)", (col) => col.notNull())
749
+ .addColumn("gas", "numeric(78, 0)", (col) => col.notNull())
750
+ .addColumn("input", "text", (col) => col.notNull())
751
+ .addColumn("to", "varchar(42)", (col) => col.notNull())
752
+ .addColumn("value", "numeric(78, 0)", (col) => col.notNull())
753
+ .addColumn("blockHash", "varchar(66)", (col) => col.notNull())
754
+ .addColumn("blockNumber", "numeric(78, 0)", (col) => col.notNull())
755
+ .addColumn("error", "text")
756
+ .addColumn("gasUsed", "numeric(78, 0)")
757
+ .addColumn("output", "text")
758
+ .addColumn("subtraces", "integer", (col) => col.notNull())
759
+ .addColumn("traceAddress", "text", (col) => col.notNull())
760
+ .addColumn("transactionHash", "varchar(66)", (col) => col.notNull())
761
+ .addColumn("transactionPosition", "integer", (col) => col.notNull())
762
+ .addColumn("functionSelector", "varchar(10)", (col) => col.notNull())
763
+ .addColumn("chainId", "integer", (col) => col.notNull())
764
+ .addColumn("checkpoint", "varchar(75)", (col) => col.notNull())
765
+ .execute();
766
+
767
+ // The callTraces.blockNumber index supports getEvents and deleteRealtimeData
768
+ await db.schema
769
+ .createIndex("callTracesBlockNumberIndex")
770
+ .on("callTraces")
771
+ .column("blockNumber")
772
+ .execute();
773
+
774
+ // The callTraces.functionSelector index supports getEvents
775
+ await db.schema
776
+ .createIndex("callTracesFunctionSelectorIndex")
777
+ .on("callTraces")
778
+ .column("functionSelector")
779
+ .execute();
780
+
781
+ // The callTraces.error index supports getEvents
782
+ await db.schema
783
+ .createIndex("callTracesErrorIndex")
784
+ .on("callTraces")
785
+ .column("error")
786
+ .execute();
787
+
788
+ // The callTraces.blockHash index supports getEvents
789
+ await db.schema
790
+ .createIndex("callTracesBlockHashIndex")
791
+ .on("callTraces")
792
+ .column("blockHash")
793
+ .execute();
794
+
795
+ // The callTraces.transactionHash index supports getEvents
796
+ await db.schema
797
+ .createIndex("callTracesTransactionHashIndex")
798
+ .on("callTraces")
799
+ .column("transactionHash")
800
+ .execute();
801
+
802
+ // The callTraces.checkpoint index supports getEvents
803
+ await db.schema
804
+ .createIndex("callTracesCheckpointIndex")
805
+ .on("callTraces")
806
+ .column("checkpoint")
807
+ .execute();
808
+
809
+ // The callTraces.chainId index supports getEvents
810
+ await db.schema
811
+ .createIndex("callTracesChainIdIndex")
812
+ .on("callTraces")
813
+ .column("chainId")
814
+ .execute();
815
+
816
+ // The callTraces.from index supports getEvents
817
+ await db.schema
818
+ .createIndex("callTracesFromIndex")
819
+ .on("callTraces")
820
+ .column("from")
821
+ .execute();
822
+
823
+ // The callTraces.to index supports getEvents
824
+ await db.schema
825
+ .createIndex("callTracesToIndex")
826
+ .on("callTraces")
827
+ .column("to")
828
+ .execute();
829
+
830
+ await db.schema
831
+ .alterTable("factories")
832
+ .renameTo("factoryLogFilters")
833
+ .execute();
834
+
835
+ await db.schema
836
+ .createTable("factoryTraceFilters")
837
+ .addColumn("id", "text", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${eventSelector}_${childAddressLocation}_${fromAddress}`
838
+ .addColumn("chainId", "integer", (col) => col.notNull())
839
+ .addColumn("address", "varchar(42)", (col) => col.notNull())
840
+ .addColumn("eventSelector", "varchar(66)", (col) => col.notNull())
841
+ .addColumn("childAddressLocation", "text", (col) => col.notNull()) // `topic${number}` or `offset${number}`
842
+ .addColumn("fromAddress", "varchar(42)")
843
+ .execute();
844
+ await db.schema
845
+ .createTable("factoryTraceFilterIntervals")
846
+ .addColumn("id", "serial", (col) => col.notNull().primaryKey()) // Auto-increment
847
+ .addColumn("factoryId", "text")
848
+ .addColumn("startBlock", "numeric(78, 0)", (col) => col.notNull())
849
+ .addColumn("endBlock", "numeric(78, 0)", (col) => col.notNull())
850
+ .execute();
851
+ await db.schema
852
+ .createIndex("factoryTraceFilterIntervalsFactoryId")
853
+ .on("factoryTraceFilterIntervals")
854
+ .column("factoryId")
855
+ .execute();
856
+ },
857
+ },
858
+ "2024_11_04_0_request_cache": {
859
+ async up(db: Kysely<any>) {
860
+ await db.schema
861
+ .createTable("rpc_request_results")
862
+ .addColumn("request", "text", (col) => col.notNull())
863
+ .addColumn("block_number", "numeric(78, 0)")
864
+ .addColumn("chain_id", "integer", (col) => col.notNull())
865
+ .addColumn("result", "text", (col) => col.notNull())
866
+ .addPrimaryKeyConstraint("rpc_request_result_primary_key", [
867
+ "request",
868
+ "chain_id",
869
+ ])
870
+ .execute();
871
+
872
+ await db.executeQuery(
873
+ sql`
874
+ INSERT INTO ponder_sync.rpc_request_results (request, block_number, chain_id, result)
875
+ SELECT
876
+ CONCAT (
877
+ '{"method":"eth_getbalance","params":["',
878
+ LOWER(SUBSTRING(request, 16)),
879
+ '","0x',
880
+ to_hex("blockNumber"::bigint),
881
+ '"]}'
882
+ ) as request,
883
+ "blockNumber" as block_number,
884
+ "chainId" as chain_id,
885
+ result
886
+ FROM ponder_sync."rpcRequestResults"
887
+ WHERE ponder_sync."rpcRequestResults".request LIKE 'eth_getBalance_%'
888
+ AND ponder_sync."rpcRequestResults"."blockNumber" <= 9223372036854775807;
889
+ `.compile(db),
890
+ );
891
+
892
+ await db.executeQuery(
893
+ sql`
894
+ INSERT INTO ponder_sync.rpc_request_results (request, block_number, chain_id, result)
895
+ SELECT
896
+ CONCAT (
897
+ '{"method":"eth_call","params":[{"data":"',
898
+ LOWER(SUBSTRING(request, 53)),
899
+ '","to":"',
900
+ LOWER(SUBSTRING(request, 10, 42)),
901
+ '"},"0x',
902
+ to_hex("blockNumber"::bigint),
903
+ '"]}'
904
+ ) as request,
905
+ "blockNumber" as block_number,
906
+ "chainId" as chain_id,
907
+ result
908
+ FROM ponder_sync."rpcRequestResults"
909
+ WHERE ponder_sync."rpcRequestResults".request LIKE 'eth_call_%'
910
+ AND ponder_sync."rpcRequestResults"."blockNumber" <= 9223372036854775807;
911
+ `.compile(db),
912
+ );
913
+
914
+ await db.schema
915
+ .dropTable("rpcRequestResults")
916
+ .ifExists()
917
+ .cascade()
918
+ .execute();
919
+ },
920
+ },
921
+ "2024_11_09_0_adjacent_interval": {
922
+ async up(db: Kysely<any>) {
923
+ await db.schema
924
+ .createTable("intervals")
925
+ .addColumn("fragment_id", "text", (col) => col.notNull().primaryKey())
926
+ .addColumn("chain_id", "integer", (col) => col.notNull())
927
+ .addColumn("blocks", sql`nummultirange`, (col) => col.notNull())
928
+ .execute();
929
+
930
+ await db
931
+ .with("range(fragment_id, chain_id, blocks)", (db) =>
932
+ db
933
+ .selectFrom("logFilters as lf")
934
+ .innerJoin("logFilterIntervals as lfi", "lf.id", "lfi.logFilterId")
935
+ .select([
936
+ sql<string>`concat('log', '_', lf.id)`.as("fragment_id"),
937
+ "lf.chainId as chain_id",
938
+ sql`numrange(lfi."startBlock", lfi."endBlock" + 1, '[]')`.as(
939
+ "blocks",
940
+ ),
941
+ ]),
942
+ )
943
+ .insertInto("intervals")
944
+ .columns(["fragment_id", "chain_id", "blocks"])
945
+ .expression(
946
+ sql.raw(`
947
+ SELECT
948
+ fragment_id,
949
+ chain_id,
950
+ range_agg(range.blocks) as blocks
951
+ FROM range
952
+ GROUP BY fragment_id, chain_id
953
+ `),
954
+ )
955
+ .execute();
956
+
957
+ await db.schema.dropTable("logFilters").ifExists().cascade().execute();
958
+ await db.schema
959
+ .dropTable("logFilterIntervals")
960
+ .ifExists()
961
+ .cascade()
962
+ .execute();
963
+
964
+ await db
965
+ .with("range(fragment_id, chain_id, blocks)", (db) =>
966
+ db
967
+ .selectFrom("factoryLogFilters as flf")
968
+ .innerJoin(
969
+ "factoryLogFilterIntervals as flfi",
970
+ "flf.id",
971
+ "flfi.factoryId",
972
+ )
973
+ .select([
974
+ sql<string>`concat('log', '_', flf.id)`.as("fragment_id"),
975
+ "flf.chainId as chain_id",
976
+ sql`numrange(flfi."startBlock", flfi."endBlock" + 1, '[]')`.as(
977
+ "blocks",
978
+ ),
979
+ ]),
980
+ )
981
+ .insertInto("intervals")
982
+ .columns(["fragment_id", "chain_id", "blocks"])
983
+ .expression(
984
+ sql.raw(`
985
+ SELECT
986
+ fragment_id,
987
+ chain_id,
988
+ range_agg(range.blocks) as blocks
989
+ FROM range
990
+ GROUP BY fragment_id, chain_id
991
+ `),
992
+ )
993
+ .onConflict((oc) =>
994
+ oc.column("fragment_id").doUpdateSet({
995
+ blocks: sql`intervals.blocks + excluded.blocks`,
996
+ }),
997
+ )
998
+ .execute();
999
+
1000
+ await db.schema
1001
+ .dropTable("factoryLogFilters")
1002
+ .ifExists()
1003
+ .cascade()
1004
+ .execute();
1005
+ await db.schema
1006
+ .dropTable("factoryLogFilterIntervals")
1007
+ .ifExists()
1008
+ .cascade()
1009
+ .execute();
1010
+
1011
+ await db
1012
+ .with("range(fragment_id, chain_id, blocks)", (db) =>
1013
+ db
1014
+ .selectFrom("traceFilters as tf")
1015
+ .innerJoin(
1016
+ "traceFilterIntervals as tfi",
1017
+ "tf.id",
1018
+ "tfi.traceFilterId",
1019
+ )
1020
+ .select([
1021
+ sql<string>`concat('trace', '_', tf.id)`.as("fragment_id"),
1022
+ "tf.chainId as chain_id",
1023
+ sql`numrange(tfi."startBlock", tfi."endBlock" + 1, '[]')`.as(
1024
+ "blocks",
1025
+ ),
1026
+ ]),
1027
+ )
1028
+ .insertInto("intervals")
1029
+ .columns(["fragment_id", "chain_id", "blocks"])
1030
+ .expression(
1031
+ sql.raw(`
1032
+ SELECT
1033
+ fragment_id,
1034
+ chain_id,
1035
+ range_agg(range.blocks) as blocks
1036
+ FROM range
1037
+ GROUP BY fragment_id, chain_id
1038
+ `),
1039
+ )
1040
+ .onConflict((oc) =>
1041
+ oc.column("fragment_id").doUpdateSet({
1042
+ blocks: sql`intervals.blocks + excluded.blocks`,
1043
+ }),
1044
+ )
1045
+ .execute();
1046
+
1047
+ await db.schema.dropTable("traceFilters").ifExists().cascade().execute();
1048
+ await db.schema
1049
+ .dropTable("traceFilterIntervals")
1050
+ .ifExists()
1051
+ .cascade()
1052
+ .execute();
1053
+
1054
+ await db
1055
+ .with("range(fragment_id, chain_id, blocks)", (db) =>
1056
+ db
1057
+ .selectFrom("factoryTraceFilters as ftf")
1058
+ .innerJoin(
1059
+ "factoryTraceFilterIntervals as ftfi",
1060
+ "ftf.id",
1061
+ "ftfi.factoryId",
1062
+ )
1063
+ .select([
1064
+ sql<string>`concat('trace', '_', ftf.id)`.as("fragment_id"),
1065
+ "ftf.chainId as chain_id",
1066
+ sql`numrange(ftfi."startBlock", ftfi."endBlock" + 1, '[]')`.as(
1067
+ "blocks",
1068
+ ),
1069
+ ]),
1070
+ )
1071
+ .insertInto("intervals")
1072
+ .columns(["fragment_id", "chain_id", "blocks"])
1073
+ .expression(
1074
+ sql.raw(`
1075
+ SELECT
1076
+ fragment_id,
1077
+ chain_id,
1078
+ range_agg(range.blocks) as blocks
1079
+ FROM range
1080
+ GROUP BY fragment_id, chain_id
1081
+ `),
1082
+ )
1083
+ .onConflict((oc) =>
1084
+ oc.column("fragment_id").doUpdateSet({
1085
+ blocks: sql`intervals.blocks + excluded.blocks`,
1086
+ }),
1087
+ )
1088
+ .execute();
1089
+
1090
+ await db.schema
1091
+ .dropTable("factoryTraceFilters")
1092
+ .ifExists()
1093
+ .cascade()
1094
+ .execute();
1095
+ await db.schema
1096
+ .dropTable("factoryTraceFilterIntervals")
1097
+ .ifExists()
1098
+ .cascade()
1099
+ .execute();
1100
+
1101
+ await db
1102
+ .with("range(fragment_id, chain_id, blocks)", (db) =>
1103
+ db
1104
+ .selectFrom("blockFilters as bf")
1105
+ .innerJoin(
1106
+ "blockFilterIntervals as bfi",
1107
+ "bf.id",
1108
+ "bfi.blockFilterId",
1109
+ )
1110
+ .select([
1111
+ sql<string>`concat('block', '_', bf.id)`.as("fragment_id"),
1112
+ "bf.chainId as chain_id",
1113
+ sql`numrange(bfi."startBlock", bfi."endBlock" + 1, '[]')`.as(
1114
+ "blocks",
1115
+ ),
1116
+ ]),
1117
+ )
1118
+ .insertInto("intervals")
1119
+ .columns(["fragment_id", "chain_id", "blocks"])
1120
+ .expression(
1121
+ sql.raw(`
1122
+ SELECT
1123
+ fragment_id,
1124
+ chain_id,
1125
+ range_agg(range.blocks) as blocks
1126
+ FROM range
1127
+ GROUP BY fragment_id, chain_id
1128
+ `),
1129
+ )
1130
+ .onConflict((oc) =>
1131
+ oc.column("fragment_id").doUpdateSet({
1132
+ blocks: sql`intervals.blocks + excluded.blocks`,
1133
+ }),
1134
+ )
1135
+ .execute();
1136
+
1137
+ await db.schema.dropTable("blockFilters").ifExists().cascade().execute();
1138
+ await db.schema
1139
+ .dropTable("blockFilterIntervals")
1140
+ .ifExists()
1141
+ .cascade()
1142
+ .execute();
1143
+ },
1144
+ },
1145
+ "2024_11_12_0_debug": {
1146
+ async up(db) {
1147
+ await db.schema.dropTable("callTraces").ifExists().cascade().execute();
1148
+
1149
+ await db
1150
+ .deleteFrom("intervals")
1151
+ .where("fragment_id", "like", "trace_%")
1152
+ .execute();
1153
+
1154
+ await db.schema
1155
+ .createTable("traces")
1156
+ .addColumn("id", "text", (col) => col.notNull().primaryKey())
1157
+ .addColumn("chainId", "integer", (col) => col.notNull())
1158
+ .addColumn("checkpoint", "varchar(75)", (col) => col.notNull())
1159
+ .addColumn("type", "text", (col) => col.notNull())
1160
+ .addColumn("transactionHash", "varchar(66)", (col) => col.notNull())
1161
+ .addColumn("blockNumber", "numeric(78, 0)", (col) => col.notNull())
1162
+ .addColumn("blockHash", "varchar(66)", (col) => col.notNull())
1163
+ .addColumn("from", "varchar(42)", (col) => col.notNull())
1164
+ .addColumn("to", "varchar(42)")
1165
+ .addColumn("gas", "numeric(78, 0)", (col) => col.notNull())
1166
+ .addColumn("gasUsed", "numeric(78, 0)", (col) => col.notNull())
1167
+ .addColumn("input", "text", (col) => col.notNull())
1168
+ .addColumn("functionSelector", "text", (col) => col.notNull())
1169
+ .addColumn("output", "text")
1170
+ .addColumn("error", "text")
1171
+ .addColumn("revertReason", "text")
1172
+ .addColumn("value", "numeric(78, 0)")
1173
+ .addColumn("index", "integer", (col) => col.notNull())
1174
+ .addColumn("subcalls", "integer", (col) => col.notNull())
1175
+ .addColumn("isReverted", "integer", (col) => col.notNull())
1176
+ .execute();
1177
+
1178
+ // `getEvents` benefits from an index on
1179
+ // "blockNumber", "functionSelector", "blockHash"
1180
+ // "transactionHash", "checkpoint", "chainId", "from", "to",
1181
+ // "value", "type", and "isReverted"
1182
+
1183
+ await db.schema
1184
+ .createIndex("trace_block_number_index")
1185
+ .on("traces")
1186
+ .column("blockNumber")
1187
+ .execute();
1188
+
1189
+ await db.schema
1190
+ .createIndex("trace_function_selector_index")
1191
+ .on("traces")
1192
+ .column("functionSelector")
1193
+ .execute();
1194
+
1195
+ await db.schema
1196
+ .createIndex("trace_is_reverted_index")
1197
+ .on("traces")
1198
+ .column("isReverted")
1199
+ .execute();
1200
+
1201
+ await db.schema
1202
+ .createIndex("trace_block_hash_index")
1203
+ .on("traces")
1204
+ .column("blockHash")
1205
+ .execute();
1206
+
1207
+ await db.schema
1208
+ .createIndex("trace_transaction_hash_index")
1209
+ .on("traces")
1210
+ .column("transactionHash")
1211
+ .execute();
1212
+
1213
+ await db.schema
1214
+ .createIndex("trace_checkpoint_index")
1215
+ .on("traces")
1216
+ .column("checkpoint")
1217
+ .execute();
1218
+
1219
+ await db.schema
1220
+ .createIndex("trace_chain_id_index")
1221
+ .on("traces")
1222
+ .column("chainId")
1223
+ .execute();
1224
+
1225
+ await db.schema
1226
+ .createIndex("trace_value_index")
1227
+ .on("traces")
1228
+ .column("value")
1229
+ .execute();
1230
+
1231
+ await db.schema
1232
+ .createIndex("trace_from_index")
1233
+ .on("traces")
1234
+ .column("from")
1235
+ .execute();
1236
+
1237
+ await db.schema
1238
+ .createIndex("trace_to_index")
1239
+ .on("traces")
1240
+ .column("to")
1241
+ .execute();
1242
+
1243
+ await db.schema
1244
+ .createIndex("trace_type_index")
1245
+ .on("traces")
1246
+ .column("type")
1247
+ .execute();
1248
+
1249
+ // add `checkpoint` to `transactions`
1250
+ await db.schema
1251
+ .alterTable("transactions")
1252
+ .addColumn("checkpoint", "varchar(75)")
1253
+ .execute();
1254
+
1255
+ await db.schema
1256
+ .createIndex("transactions_checkpoint_index")
1257
+ .on("transactions")
1258
+ .column("checkpoint")
1259
+ .execute();
1260
+
1261
+ await db.schema
1262
+ .alterTable("transactionReceipts")
1263
+ .dropColumn("logs")
1264
+ .execute();
1265
+ },
1266
+ },
1267
+ "2024_12_02_0_request_cache": {
1268
+ async up(db) {
1269
+ await db.schema
1270
+ .alterTable("rpc_request_results")
1271
+ .addColumn("request_hash", "text", (col) =>
1272
+ col.generatedAlwaysAs(sql`MD5(request)`).stored().notNull(),
1273
+ )
1274
+ .execute();
1275
+
1276
+ // Drop previous primary key constraint, on columns "request" and "chain_id"
1277
+
1278
+ await db.schema
1279
+ .alterTable("rpc_request_results")
1280
+ .dropConstraint("rpc_request_result_primary_key")
1281
+ .execute();
1282
+
1283
+ await db.schema
1284
+ .alterTable("rpc_request_results")
1285
+ .addPrimaryKeyConstraint("rpc_request_result_primary_key", [
1286
+ "request_hash",
1287
+ "chain_id",
1288
+ ])
1289
+ .execute();
1290
+ },
1291
+ },
1292
+ "2025_02_19_0_primary_key": {
1293
+ async up(db) {
1294
+ // 1. drop unused indexes
1295
+ // 2. update column types
1296
+ // 3. drop primary key
1297
+ // 4. drop unused columns
1298
+ // 5. rename tables and columns
1299
+ // 6. create new primary key
1300
+ // 7. reset metadata
1301
+
1302
+ logger.debug({
1303
+ msg: `${new Date().toISOString()} [ponder_sync migration] started 2025_02_19_0_primary_key`,
1304
+ });
1305
+
1306
+ await db.executeQuery(sql`SET statement_timeout = 3600000;`.compile(db));
1307
+
1308
+ await db.schema.dropIndex("logAddressIndex").ifExists().execute();
1309
+ await db.schema.dropIndex("logBlockHashIndex").ifExists().execute();
1310
+ await db.schema.dropIndex("logBlockNumberIndex").ifExists().execute();
1311
+ await db.schema.dropIndex("logChainIdIndex").ifExists().execute();
1312
+ await db.schema.dropIndex("logTopic0Index").ifExists().execute();
1313
+ await db.schema
1314
+ .dropIndex("log_transaction_hash_index")
1315
+ .ifExists()
1316
+ .execute();
1317
+ await db.schema.dropIndex("logs_checkpoint_index").ifExists().execute();
1318
+ await db.schema.dropIndex("blockChainIdIndex").execute();
1319
+ await db.schema.dropIndex("blockCheckpointIndex").execute();
1320
+ await db.schema.dropIndex("blockNumberIndex").execute();
1321
+ await db.schema.dropIndex("transactions_checkpoint_index").execute();
1322
+ await db.schema.dropIndex("trace_block_hash_index").ifExists().execute();
1323
+ await db.schema
1324
+ .dropIndex("trace_block_number_index")
1325
+ .ifExists()
1326
+ .execute();
1327
+ await db.schema.dropIndex("trace_chain_id_index").ifExists().execute();
1328
+ await db.schema.dropIndex("trace_checkpoint_index").ifExists().execute();
1329
+ await db.schema.dropIndex("trace_from_index").ifExists().execute();
1330
+ await db.schema
1331
+ .dropIndex("trace_function_selector_index")
1332
+ .ifExists()
1333
+ .execute();
1334
+ await db.schema.dropIndex("trace_is_reverted_index").ifExists().execute();
1335
+ await db.schema.dropIndex("trace_to_index").ifExists().execute();
1336
+ await db.schema
1337
+ .dropIndex("trace_transaction_hash_index")
1338
+ .ifExists()
1339
+ .execute();
1340
+ await db.schema.dropIndex("trace_type_index").ifExists().execute();
1341
+ await db.schema.dropIndex("trace_value_index").ifExists().execute();
1342
+
1343
+ logger.debug({
1344
+ msg: `${new Date().toISOString()} [ponder_sync migration] dropped indexes`,
1345
+ });
1346
+
1347
+ await db.schema
1348
+ .alterTable("logs")
1349
+ .alterColumn("blockNumber", (qb) => qb.setDataType("bigint"))
1350
+ .execute();
1351
+ await db.schema
1352
+ .alterTable("blocks")
1353
+ .alterColumn("number", (qb) => qb.setDataType("bigint"))
1354
+ .execute();
1355
+ await db.schema
1356
+ .alterTable("blocks")
1357
+ .alterColumn("timestamp", (qb) => qb.setDataType("bigint"))
1358
+ .execute();
1359
+ await db.schema
1360
+ .alterTable("transactions")
1361
+ .alterColumn("blockNumber", (qb) => qb.setDataType("bigint"))
1362
+ .execute();
1363
+ await db.schema
1364
+ .alterTable("transactionReceipts")
1365
+ .alterColumn("blockNumber", (qb) => qb.setDataType("bigint"))
1366
+ .execute();
1367
+ await db.schema
1368
+ .alterTable("transactionReceipts")
1369
+ .alterColumn("chainId", (qb) => qb.setDataType("bigint"))
1370
+ .execute();
1371
+ await db.schema
1372
+ .alterTable("traces")
1373
+ .alterColumn("blockNumber", (qb) => qb.setDataType("bigint"))
1374
+ .execute();
1375
+ await db.schema
1376
+ .alterTable("traces")
1377
+ .alterColumn("chainId", (qb) => qb.setDataType("bigint"))
1378
+ .execute();
1379
+ await db.schema
1380
+ .alterTable("traces")
1381
+ .addColumn("transaction_index", "integer")
1382
+ .execute();
1383
+ await db
1384
+ .updateTable("traces")
1385
+ .set({ transaction_index: sql`SUBSTRING(checkpoint, 43, 16)::bigint` })
1386
+ .execute();
1387
+ await db.schema
1388
+ .alterTable("traces")
1389
+ .alterColumn("transaction_index", (col) => col.setNotNull())
1390
+ .execute();
1391
+ await db.schema
1392
+ .alterTable("intervals")
1393
+ .alterColumn("chain_id", (qb) => qb.setDataType("bigint"))
1394
+ .execute();
1395
+
1396
+ await db.deleteFrom("logs").where("checkpoint", "=", null).execute();
1397
+
1398
+ logger.debug({
1399
+ msg: `${new Date().toISOString()} [ponder_sync migration] updated column types`,
1400
+ });
1401
+
1402
+ await db.schema.alterTable("logs").dropConstraint("logs_pkey").execute();
1403
+ await db.schema
1404
+ .alterTable("blocks")
1405
+ .dropConstraint("blocks_pkey")
1406
+ .execute();
1407
+ await db.schema
1408
+ .alterTable("transactions")
1409
+ .dropConstraint("transactions_pkey")
1410
+ .execute();
1411
+ await db.schema
1412
+ .alterTable("transactionReceipts")
1413
+ .dropConstraint("transactionReceipts_pkey")
1414
+ .execute();
1415
+ await db.schema
1416
+ .alterTable("traces")
1417
+ .dropConstraint("traces_pkey")
1418
+ .execute();
1419
+
1420
+ await db.schema.alterTable("logs").dropColumn("checkpoint").execute();
1421
+ await db.schema.alterTable("logs").dropColumn("id").execute();
1422
+ await db.schema.alterTable("blocks").dropColumn("checkpoint").execute();
1423
+ await db.schema
1424
+ .alterTable("transactions")
1425
+ .dropColumn("checkpoint")
1426
+ .execute();
1427
+ await db.schema.alterTable("traces").dropColumn("id").execute();
1428
+ await db.schema.alterTable("traces").dropColumn("checkpoint").execute();
1429
+ await db.schema
1430
+ .alterTable("traces")
1431
+ .dropColumn("transactionHash")
1432
+ .execute();
1433
+ await db.schema.alterTable("traces").dropColumn("blockHash").execute();
1434
+ await db.schema
1435
+ .alterTable("traces")
1436
+ .dropColumn("functionSelector")
1437
+ .execute();
1438
+ await db.schema.alterTable("traces").dropColumn("isReverted").execute();
1439
+
1440
+ logger.debug({
1441
+ msg: `${new Date().toISOString()} [ponder_sync migration] dropped columns`,
1442
+ });
1443
+
1444
+ await db.schema
1445
+ .alterTable("logs")
1446
+ .renameColumn("chainId", "chain_id")
1447
+ .execute();
1448
+ await db.schema
1449
+ .alterTable("logs")
1450
+ .renameColumn("blockNumber", "block_number")
1451
+ .execute();
1452
+ await db.schema
1453
+ .alterTable("logs")
1454
+ .renameColumn("logIndex", "log_index")
1455
+ .execute();
1456
+ await db.schema
1457
+ .alterTable("logs")
1458
+ .renameColumn("transactionIndex", "transaction_index")
1459
+ .execute();
1460
+ await db.schema
1461
+ .alterTable("logs")
1462
+ .renameColumn("blockHash", "block_hash")
1463
+ .execute();
1464
+ await db.schema
1465
+ .alterTable("logs")
1466
+ .renameColumn("transactionHash", "transaction_hash")
1467
+ .execute();
1468
+ await db.schema
1469
+ .alterTable("blocks")
1470
+ .renameColumn("chainId", "chain_id")
1471
+ .execute();
1472
+ await db.schema
1473
+ .alterTable("blocks")
1474
+ .renameColumn("parentHash", "parent_hash")
1475
+ .execute();
1476
+ await db.schema
1477
+ .alterTable("blocks")
1478
+ .renameColumn("logsBloom", "logs_bloom")
1479
+ .execute();
1480
+ await db.schema
1481
+ .alterTable("blocks")
1482
+ .renameColumn("gasUsed", "gas_used")
1483
+ .execute();
1484
+ await db.schema
1485
+ .alterTable("blocks")
1486
+ .renameColumn("gasLimit", "gas_limit")
1487
+ .execute();
1488
+ await db.schema
1489
+ .alterTable("blocks")
1490
+ .renameColumn("baseFeePerGas", "base_fee_per_gas")
1491
+ .execute();
1492
+ await db.schema
1493
+ .alterTable("blocks")
1494
+ .renameColumn("mixHash", "mix_hash")
1495
+ .execute();
1496
+ await db.schema
1497
+ .alterTable("blocks")
1498
+ .renameColumn("stateRoot", "state_root")
1499
+ .execute();
1500
+ await db.schema
1501
+ .alterTable("blocks")
1502
+ .renameColumn("receiptsRoot", "receipts_root")
1503
+ .execute();
1504
+ await db.schema
1505
+ .alterTable("blocks")
1506
+ .renameColumn("transactionsRoot", "transactions_root")
1507
+ .execute();
1508
+ await db.schema
1509
+ .alterTable("blocks")
1510
+ .renameColumn("sha3Uncles", "sha3_uncles")
1511
+ .execute();
1512
+ await db.schema
1513
+ .alterTable("blocks")
1514
+ .renameColumn("totalDifficulty", "total_difficulty")
1515
+ .execute();
1516
+ await db.schema
1517
+ .alterTable("blocks")
1518
+ .renameColumn("extraData", "extra_data")
1519
+ .execute();
1520
+ await db.schema
1521
+ .alterTable("transactions")
1522
+ .renameColumn("chainId", "chain_id")
1523
+ .execute();
1524
+ await db.schema
1525
+ .alterTable("transactions")
1526
+ .renameColumn("blockNumber", "block_number")
1527
+ .execute();
1528
+ await db.schema
1529
+ .alterTable("transactions")
1530
+ .renameColumn("transactionIndex", "transaction_index")
1531
+ .execute();
1532
+ await db.schema
1533
+ .alterTable("transactions")
1534
+ .renameColumn("blockHash", "block_hash")
1535
+ .execute();
1536
+ await db.schema
1537
+ .alterTable("transactions")
1538
+ .renameColumn("gasPrice", "gas_price")
1539
+ .execute();
1540
+ await db.schema
1541
+ .alterTable("transactions")
1542
+ .renameColumn("maxFeePerGas", "max_fee_per_gas")
1543
+ .execute();
1544
+ await db.schema
1545
+ .alterTable("transactions")
1546
+ .renameColumn("maxPriorityFeePerGas", "max_priority_fee_per_gas")
1547
+ .execute();
1548
+ await db.schema
1549
+ .alterTable("transactions")
1550
+ .renameColumn("accessList", "access_list")
1551
+ .execute();
1552
+ await db.schema
1553
+ .alterTable("transactionReceipts")
1554
+ .renameTo("transaction_receipts")
1555
+ .execute();
1556
+ await db.schema
1557
+ .alterTable("transaction_receipts")
1558
+ .renameColumn("chainId", "chain_id")
1559
+ .execute();
1560
+ await db.schema
1561
+ .alterTable("transaction_receipts")
1562
+ .renameColumn("blockNumber", "block_number")
1563
+ .execute();
1564
+ await db.schema
1565
+ .alterTable("transaction_receipts")
1566
+ .renameColumn("transactionIndex", "transaction_index")
1567
+ .execute();
1568
+ await db.schema
1569
+ .alterTable("transaction_receipts")
1570
+ .renameColumn("blockHash", "block_hash")
1571
+ .execute();
1572
+ await db.schema
1573
+ .alterTable("transaction_receipts")
1574
+ .renameColumn("transactionHash", "transaction_hash")
1575
+ .execute();
1576
+ await db.schema
1577
+ .alterTable("transaction_receipts")
1578
+ .renameColumn("contractAddress", "contract_address")
1579
+ .execute();
1580
+ await db.schema
1581
+ .alterTable("transaction_receipts")
1582
+ .renameColumn("logsBloom", "logs_bloom")
1583
+ .execute();
1584
+ await db.schema
1585
+ .alterTable("transaction_receipts")
1586
+ .renameColumn("gasUsed", "gas_used")
1587
+ .execute();
1588
+ await db.schema
1589
+ .alterTable("transaction_receipts")
1590
+ .renameColumn("cumulativeGasUsed", "cumulative_gas_used")
1591
+ .execute();
1592
+ await db.schema
1593
+ .alterTable("transaction_receipts")
1594
+ .renameColumn("effectiveGasPrice", "effective_gas_price")
1595
+ .execute();
1596
+ await db.schema
1597
+ .alterTable("traces")
1598
+ .renameColumn("chainId", "chain_id")
1599
+ .execute();
1600
+ await db.schema
1601
+ .alterTable("traces")
1602
+ .renameColumn("blockNumber", "block_number")
1603
+ .execute();
1604
+ await db.schema
1605
+ .alterTable("traces")
1606
+ .renameColumn("index", "trace_index")
1607
+ .execute();
1608
+ await db.schema
1609
+ .alterTable("traces")
1610
+ .renameColumn("gasUsed", "gas_used")
1611
+ .execute();
1612
+ await db.schema
1613
+ .alterTable("traces")
1614
+ .renameColumn("revertReason", "revert_reason")
1615
+ .execute();
1616
+
1617
+ logger.debug({
1618
+ msg: `${new Date().toISOString()} [ponder_sync migration] renamed columns`,
1619
+ });
1620
+
1621
+ await db.schema
1622
+ .alterTable("logs")
1623
+ .addPrimaryKeyConstraint("logs_pkey", [
1624
+ "chain_id",
1625
+ "block_number",
1626
+ "log_index",
1627
+ ])
1628
+ .execute();
1629
+ await db.schema
1630
+ .alterTable("blocks")
1631
+ .addPrimaryKeyConstraint("blocks_pkey", ["chain_id", "number"])
1632
+ .execute();
1633
+ await db.schema
1634
+ .alterTable("transactions")
1635
+ .addPrimaryKeyConstraint("transactions_pkey", [
1636
+ "chain_id",
1637
+ "block_number",
1638
+ "transaction_index",
1639
+ ])
1640
+ .execute();
1641
+ await db.schema
1642
+ .alterTable("transaction_receipts")
1643
+ .addPrimaryKeyConstraint("transaction_receipts_pkey", [
1644
+ "chain_id",
1645
+ "block_number",
1646
+ "transaction_index",
1647
+ ])
1648
+ .execute();
1649
+ await db.schema
1650
+ .alterTable("traces")
1651
+ .addPrimaryKeyConstraint("traces_pkey", [
1652
+ "chain_id",
1653
+ "block_number",
1654
+ "transaction_index",
1655
+ "trace_index",
1656
+ ])
1657
+ .execute();
1658
+
1659
+ logger.debug({
1660
+ msg: `${new Date().toISOString()} [ponder_sync migration] added primary keys`,
1661
+ });
1662
+
1663
+ await sql`ANALYZE ponder_sync.logs`.execute(db);
1664
+ await sql`ANALYZE ponder_sync.blocks`.execute(db);
1665
+ await sql`ANALYZE ponder_sync.transactions`.execute(db);
1666
+ await sql`ANALYZE ponder_sync.transaction_receipts`.execute(db);
1667
+ await sql`ANALYZE ponder_sync.traces`.execute(db);
1668
+
1669
+ await sql`REINDEX TABLE ponder_sync.logs`.execute(db);
1670
+ await sql`REINDEX TABLE ponder_sync.blocks`.execute(db);
1671
+ await sql`REINDEX TABLE ponder_sync.transactions`.execute(db);
1672
+ await sql`REINDEX TABLE ponder_sync.transaction_receipts`.execute(db);
1673
+ await sql`REINDEX TABLE ponder_sync.traces`.execute(db);
1674
+
1675
+ logger.debug({
1676
+ msg: `${new Date().toISOString()} [ponder_sync migration] finished 2025_02_19_0_primary_key`,
1677
+ });
1678
+ },
1679
+ },
1680
+ "2025_02_26_0_factories": {
1681
+ async up(db) {
1682
+ logger.debug({
1683
+ msg: `${new Date().toISOString()} [ponder_sync migration] started 2025_02_26_0_factories`,
1684
+ });
1685
+ await db.executeQuery(sql`SET statement_timeout = 3600000;`.compile(db));
1686
+
1687
+ // drop any intervals that contain a factory address
1688
+ await db
1689
+ .deleteFrom("intervals")
1690
+ .where((qb) =>
1691
+ qb.or([
1692
+ qb("fragment_id", "like", "%offset%"),
1693
+ qb("fragment_id", "like", "%topic%"),
1694
+ ]),
1695
+ )
1696
+ .execute();
1697
+
1698
+ await db.schema
1699
+ .createTable("factories")
1700
+ .addColumn("id", "integer", (col) =>
1701
+ col.generatedAlwaysAsIdentity().primaryKey(),
1702
+ )
1703
+ .addColumn("factory", "jsonb", (col) => col.notNull().unique())
1704
+ .execute();
1705
+
1706
+ await db.schema
1707
+ .createTable("factory_addresses")
1708
+ .addColumn("id", "integer", (col) =>
1709
+ col.generatedAlwaysAsIdentity().primaryKey(),
1710
+ )
1711
+ .addColumn("factory_id", "integer", (col) => col.notNull())
1712
+ .addColumn("chain_id", "bigint", (col) => col.notNull())
1713
+ .addColumn("block_number", "bigint", (col) => col.notNull())
1714
+ .addColumn("address", "text", (col) => col.notNull())
1715
+ .execute();
1716
+
1717
+ await db.schema
1718
+ .createIndex("factories_factory_index")
1719
+ .on("factories")
1720
+ .column("factory")
1721
+ .execute();
1722
+
1723
+ await db.schema
1724
+ .createIndex("factory_addresses_factory_id_index")
1725
+ .on("factory_addresses")
1726
+ .column("factory_id")
1727
+ .execute();
1728
+
1729
+ logger.debug({
1730
+ msg: `${new Date().toISOString()} [ponder_sync migration] finished 2025_02_26_0_factories`,
1731
+ });
1732
+ },
1733
+ },
1734
+ "2025_02_26_1_rpc_request_results": {
1735
+ async up(db) {
1736
+ logger.debug({
1737
+ msg: `${new Date().toISOString()} [ponder_sync migration] started 2025_02_26_1_rpc_request_results`,
1738
+ });
1739
+ await db.executeQuery(sql`SET statement_timeout = 3600000;`.compile(db));
1740
+
1741
+ await db.schema
1742
+ .alterTable("rpc_request_results")
1743
+ .addColumn("request_hash_temp", "text")
1744
+ .execute();
1745
+ await db
1746
+ .updateTable("rpc_request_results")
1747
+ .set({ request_hash_temp: sql`request_hash` })
1748
+ .execute();
1749
+ await db.schema
1750
+ .alterTable("rpc_request_results")
1751
+ .dropConstraint("rpc_request_result_primary_key")
1752
+ .execute();
1753
+ await db.schema
1754
+ .alterTable("rpc_request_results")
1755
+ .dropColumn("request_hash")
1756
+ .execute();
1757
+ await db.schema
1758
+ .alterTable("rpc_request_results")
1759
+ .renameColumn("request_hash_temp", "request_hash")
1760
+ .execute();
1761
+ await db.schema
1762
+ .alterTable("rpc_request_results")
1763
+ .addPrimaryKeyConstraint("rpc_request_results_pkey", [
1764
+ "chain_id",
1765
+ "request_hash",
1766
+ ])
1767
+ .execute();
1768
+ await db.schema
1769
+ .alterTable("rpc_request_results")
1770
+ .dropColumn("request")
1771
+ .execute();
1772
+ await db
1773
+ .updateTable("rpc_request_results")
1774
+ .set({ block_number: 0 })
1775
+ .where("block_number", "=", maxUint256)
1776
+ .execute();
1777
+ await db.schema
1778
+ .alterTable("rpc_request_results")
1779
+ .alterColumn("block_number", (col) => col.setDataType("bigint"))
1780
+ .execute();
1781
+ await db.schema
1782
+ .alterTable("rpc_request_results")
1783
+ .alterColumn("chain_id", (col) => col.setDataType("bigint"))
1784
+ .execute();
1785
+ await db.schema
1786
+ .createIndex("rpc_request_results_chain_id_block_number_index")
1787
+ .on("rpc_request_results")
1788
+ .columns(["chain_id", "block_number"])
1789
+ .execute();
1790
+ await db
1791
+ .deleteFrom("rpc_request_results")
1792
+ .where("result", "=", "0x")
1793
+ .execute();
1794
+ await sql`ANALYZE ponder_sync.rpc_request_results`.execute(db);
1795
+
1796
+ logger.debug({
1797
+ msg: `${new Date().toISOString()} [ponder_sync migration] finished 2025_02_26_1_rpc_request_results`,
1798
+ });
1799
+ },
1800
+ },
1801
+ };