@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,873 @@
1
+ import { getPrimaryKeyColumns } from "@/drizzle/index.js";
2
+ import { getColumnCasing, getReorgTable } from "@/drizzle/kit/index.js";
3
+ import {
4
+ getLiveQueryChannelName,
5
+ getLiveQueryNotifyProcedureName,
6
+ getLiveQueryNotifyTriggerName,
7
+ getLiveQueryProcedureName,
8
+ getLiveQueryTempTableName,
9
+ getLiveQueryTriggerName,
10
+ getPartitionName,
11
+ getReorgProcedureName,
12
+ getReorgTableName,
13
+ getReorgTriggerName,
14
+ getViewsLiveQueryNotifyTriggerName,
15
+ } from "@/drizzle/onchain.js";
16
+ import type { Logger } from "@/internal/logger.js";
17
+ import type {
18
+ NamespaceBuild,
19
+ PreBuild,
20
+ SchemaBuild,
21
+ } from "@/internal/types.js";
22
+ import { MAX_CHECKPOINT_STRING, decodeCheckpoint } from "@/utils/checkpoint.js";
23
+ import {
24
+ type SQL,
25
+ type Table,
26
+ type View,
27
+ and,
28
+ eq,
29
+ getTableColumns,
30
+ getTableName,
31
+ getViewName,
32
+ lte,
33
+ sql,
34
+ } from "drizzle-orm";
35
+ import { getTableConfig } from "drizzle-orm/pg-core";
36
+ import {
37
+ PONDER_CHECKPOINT_TABLE_NAME,
38
+ PONDER_META_TABLE_NAME,
39
+ getPonderCheckpointTable,
40
+ } from "./index.js";
41
+ import type { QB } from "./queryBuilder.js";
42
+
43
+ export const createIndexes = async (
44
+ qb: QB,
45
+ { statements }: { statements: SchemaBuild["statements"] },
46
+ context?: { logger?: Logger },
47
+ ) => {
48
+ for (const statement of statements.indexes.sql) {
49
+ await qb.transaction(
50
+ { label: "create_indexes" },
51
+ async (tx) => {
52
+ // 60 minutes
53
+ await tx.wrap((tx) => tx.execute("SET statement_timeout = 3600000;"));
54
+ await tx.wrap((tx) => tx.execute(statement));
55
+ },
56
+ undefined,
57
+ context,
58
+ );
59
+ }
60
+ };
61
+
62
+ export const createTriggers = async (
63
+ qb: QB,
64
+ { tables, chainId }: { tables: Table[]; chainId?: number },
65
+ context?: { logger?: Logger },
66
+ ) => {
67
+ await qb.transaction(
68
+ async (tx) => {
69
+ await Promise.all(
70
+ tables.map(async (table) => {
71
+ const schema = getTableConfig(table).schema ?? "public";
72
+ const columns = getTableColumns(table);
73
+
74
+ const columnNames = Object.values(columns).map(
75
+ (column) => `"${getColumnCasing(column, "snake_case")}"`,
76
+ );
77
+
78
+ await tx.wrap({ label: "create_trigger" }, (tx) =>
79
+ tx.execute(
80
+ `
81
+ CREATE OR REPLACE FUNCTION "${schema}".${getReorgProcedureName(table)}
82
+ RETURNS TRIGGER AS $$
83
+ BEGIN
84
+ IF TG_OP = 'INSERT' THEN
85
+ INSERT INTO "${schema}"."${getReorgTableName(table)}" (${columnNames.join(",")}, operation, checkpoint)
86
+ VALUES (${columnNames.map((name) => `NEW.${name}`).join(",")}, 0, '${MAX_CHECKPOINT_STRING}');
87
+ ELSIF TG_OP = 'UPDATE' THEN
88
+ INSERT INTO "${schema}"."${getReorgTableName(table)}" (${columnNames.join(",")}, operation, checkpoint)
89
+ VALUES (${columnNames.map((name) => `OLD.${name}`).join(",")}, 1, '${MAX_CHECKPOINT_STRING}');
90
+ ELSIF TG_OP = 'DELETE' THEN
91
+ INSERT INTO "${schema}"."${getReorgTableName(table)}" (${columnNames.join(",")}, operation, checkpoint)
92
+ VALUES (${columnNames.map((name) => `OLD.${name}`).join(",")}, 2, '${MAX_CHECKPOINT_STRING}');
93
+ END IF;
94
+ RETURN NULL;
95
+ END;
96
+ $$ LANGUAGE plpgsql`,
97
+ ),
98
+ );
99
+
100
+ await tx.wrap({ label: "create_trigger" }, (tx) =>
101
+ tx.execute(
102
+ `
103
+ CREATE OR REPLACE TRIGGER "${getReorgTriggerName()}"
104
+ AFTER INSERT OR UPDATE OR DELETE ON "${schema}"."${chainId === undefined ? getTableName(table) : getPartitionName(table, chainId)}"
105
+ FOR EACH ROW EXECUTE PROCEDURE "${schema}".${getReorgProcedureName(table)};
106
+ `,
107
+ ),
108
+ );
109
+ }),
110
+ );
111
+ },
112
+ undefined,
113
+ context,
114
+ );
115
+ };
116
+
117
+ export const dropTriggers = async (
118
+ qb: QB,
119
+ { tables, chainId }: { tables: Table[]; chainId?: number },
120
+ context?: { logger?: Logger },
121
+ ) => {
122
+ await qb.transaction(
123
+ async (tx) => {
124
+ await Promise.all(
125
+ tables.map(async (table) => {
126
+ const schema = getTableConfig(table).schema ?? "public";
127
+
128
+ await tx.wrap({ label: "drop_trigger" }, (tx) =>
129
+ tx.execute(
130
+ `DROP TRIGGER IF EXISTS "${getReorgTriggerName()}" ON "${schema}"."${chainId === undefined ? getTableName(table) : getPartitionName(table, chainId)}"`,
131
+ ),
132
+ );
133
+ }),
134
+ );
135
+ },
136
+ undefined,
137
+ context,
138
+ );
139
+ };
140
+
141
+ export const createLiveQueryTriggers = async (
142
+ qb: QB,
143
+ {
144
+ namespaceBuild,
145
+ tables,
146
+ chainId,
147
+ }: { namespaceBuild: NamespaceBuild; tables: Table[]; chainId?: number },
148
+ context?: { logger?: Logger },
149
+ ) => {
150
+ await qb.transaction(
151
+ async (tx) => {
152
+ const notifyProcedure = getLiveQueryNotifyProcedureName();
153
+ const notifyTrigger = getLiveQueryNotifyTriggerName();
154
+
155
+ await tx.wrap((tx) =>
156
+ tx.execute(
157
+ `
158
+ CREATE OR REPLACE TRIGGER "${notifyTrigger}"
159
+ AFTER INSERT OR UPDATE OR DELETE ON "${namespaceBuild.schema}"."${PONDER_CHECKPOINT_TABLE_NAME}"
160
+ FOR EACH STATEMENT EXECUTE PROCEDURE "${namespaceBuild.schema}".${notifyProcedure};`,
161
+ ),
162
+ );
163
+
164
+ const trigger = getLiveQueryTriggerName();
165
+ const procedure = getLiveQueryProcedureName();
166
+
167
+ for (const table of tables) {
168
+ const schema = getTableConfig(table).schema ?? "public";
169
+
170
+ // Note: Because the realtime indexing store writes to the parent table, we create the trigger on
171
+ // the parent table instead of the partition table.
172
+ await tx.wrap((tx) =>
173
+ tx.execute(
174
+ `
175
+ CREATE OR REPLACE TRIGGER "${trigger}"
176
+ AFTER INSERT OR UPDATE OR DELETE ON "${schema}"."${chainId === undefined ? getTableName(table) : getPartitionName(table, chainId)}"
177
+ FOR EACH ROW EXECUTE PROCEDURE "${schema}".${procedure};`,
178
+ ),
179
+ );
180
+ }
181
+ },
182
+ undefined,
183
+ context,
184
+ );
185
+ };
186
+
187
+ export const dropLiveQueryTriggers = async (
188
+ qb: QB,
189
+ {
190
+ namespaceBuild,
191
+ tables,
192
+ chainId,
193
+ }: { namespaceBuild: NamespaceBuild; tables: Table[]; chainId?: number },
194
+ context?: { logger?: Logger },
195
+ ) => {
196
+ await qb.transaction(
197
+ async (tx) => {
198
+ const notifyTrigger = getLiveQueryNotifyTriggerName();
199
+ await tx.wrap((tx) =>
200
+ tx.execute(
201
+ `DROP TRIGGER IF EXISTS "${notifyTrigger}" ON "${namespaceBuild.schema}"."${PONDER_CHECKPOINT_TABLE_NAME}";`,
202
+ ),
203
+ );
204
+
205
+ const trigger = getLiveQueryTriggerName();
206
+ for (const table of tables) {
207
+ const schema = getTableConfig(table).schema ?? "public";
208
+
209
+ await tx.wrap((tx) =>
210
+ tx.execute(
211
+ `DROP TRIGGER IF EXISTS "${trigger}" ON "${schema}"."${chainId === undefined ? getTableName(table) : getPartitionName(table, chainId)}";`,
212
+ ),
213
+ );
214
+ }
215
+ },
216
+ undefined,
217
+ context,
218
+ );
219
+ };
220
+
221
+ export const createLiveQueryProcedures = async (
222
+ qb: QB,
223
+ { namespaceBuild }: { namespaceBuild: NamespaceBuild },
224
+ context?: { logger?: Logger },
225
+ ) => {
226
+ await qb.transaction(
227
+ async (tx) => {
228
+ const schema = namespaceBuild.schema;
229
+ const procedure = getLiveQueryProcedureName();
230
+
231
+ await tx.wrap(
232
+ (tx) =>
233
+ tx.execute(
234
+ `
235
+ CREATE OR REPLACE FUNCTION "${schema}".${procedure}
236
+ RETURNS TRIGGER LANGUAGE plpgsql
237
+ AS $$
238
+ BEGIN
239
+ INSERT INTO ${getLiveQueryTempTableName()} (table_name)
240
+ VALUES (TG_TABLE_NAME)
241
+ ON CONFLICT (table_name) DO NOTHING;
242
+ RETURN NULL;
243
+ END;
244
+ $$;`,
245
+ ),
246
+ context,
247
+ );
248
+
249
+ const notifyProcedure = getLiveQueryNotifyProcedureName();
250
+ const channel = getLiveQueryChannelName(namespaceBuild.schema);
251
+
252
+ await tx.wrap(
253
+ (tx) =>
254
+ tx.execute(`
255
+ CREATE OR REPLACE FUNCTION "${schema}".${notifyProcedure}
256
+ RETURNS TRIGGER LANGUAGE plpgsql
257
+ AS $$
258
+ DECLARE
259
+ table_names json;
260
+ table_exists boolean := false;
261
+ BEGIN
262
+ SELECT EXISTS (
263
+ SELECT 1
264
+ FROM information_schema.tables
265
+ WHERE table_name = '${getLiveQueryTempTableName()}'
266
+ AND table_type = 'LOCAL TEMPORARY'
267
+ ) INTO table_exists;
268
+
269
+ IF table_exists THEN
270
+ SELECT json_agg(table_name) INTO table_names
271
+ FROM ${getLiveQueryTempTableName()};
272
+
273
+ table_names := COALESCE(table_names, '[]'::json);
274
+ PERFORM pg_notify('${channel}', table_names::text);
275
+ END IF;
276
+
277
+ RETURN NULL;
278
+ END;
279
+ $$;`),
280
+ context,
281
+ );
282
+ },
283
+ undefined,
284
+ context,
285
+ );
286
+ };
287
+
288
+ export const createViews = async (
289
+ qb: QB,
290
+ {
291
+ tables,
292
+ views,
293
+ namespaceBuild,
294
+ }: { tables: Table[]; views: View[]; namespaceBuild: NamespaceBuild },
295
+ context?: { logger?: Logger },
296
+ ) => {
297
+ await qb.transaction(
298
+ { label: "create_views" },
299
+ async (tx) => {
300
+ await tx.wrap((tx) =>
301
+ tx.execute(
302
+ `CREATE SCHEMA IF NOT EXISTS "${namespaceBuild.viewsSchema}"`,
303
+ ),
304
+ );
305
+
306
+ // Note: Drop views before creating new ones because Postgres does not support
307
+ // altering the schema of a view with CREATE OR REPLACE VIEW.
308
+
309
+ for (const table of tables) {
310
+ await tx.wrap((tx) =>
311
+ tx.execute(
312
+ `DROP VIEW IF EXISTS "${namespaceBuild.viewsSchema}"."${getTableName(table)}"`,
313
+ ),
314
+ );
315
+
316
+ await tx.wrap((tx) =>
317
+ tx.execute(
318
+ `CREATE VIEW "${namespaceBuild.viewsSchema}"."${getTableName(table)}" AS SELECT * FROM "${namespaceBuild.schema}"."${getTableName(table)}"`,
319
+ ),
320
+ );
321
+ }
322
+
323
+ for (const view of views) {
324
+ await tx.wrap((tx) =>
325
+ tx.execute(
326
+ `DROP VIEW IF EXISTS "${namespaceBuild.viewsSchema}"."${getViewName(view)}"`,
327
+ ),
328
+ );
329
+
330
+ await tx.wrap((tx) =>
331
+ tx.execute(
332
+ `CREATE VIEW "${namespaceBuild.viewsSchema}"."${getViewName(view)}" AS SELECT * FROM "${namespaceBuild.schema}"."${getViewName(view)}"`,
333
+ ),
334
+ );
335
+ }
336
+
337
+ await tx.wrap((tx) =>
338
+ tx.execute(
339
+ `DROP VIEW IF EXISTS "${namespaceBuild.viewsSchema}"."${PONDER_META_TABLE_NAME}"`,
340
+ ),
341
+ );
342
+
343
+ await tx.wrap((tx) =>
344
+ tx.execute(
345
+ `DROP VIEW IF EXISTS "${namespaceBuild.viewsSchema}"."${PONDER_CHECKPOINT_TABLE_NAME}"`,
346
+ ),
347
+ );
348
+
349
+ await tx.wrap((tx) =>
350
+ tx.execute(
351
+ `CREATE VIEW "${namespaceBuild.viewsSchema}"."${PONDER_META_TABLE_NAME}" AS SELECT * FROM "${namespaceBuild.schema}"."${PONDER_META_TABLE_NAME}"`,
352
+ ),
353
+ );
354
+
355
+ await tx.wrap((tx) =>
356
+ tx.execute(
357
+ `CREATE VIEW "${namespaceBuild.viewsSchema}"."${PONDER_CHECKPOINT_TABLE_NAME}" AS SELECT * FROM "${namespaceBuild.schema}"."${PONDER_CHECKPOINT_TABLE_NAME}"`,
358
+ ),
359
+ );
360
+
361
+ const notifyProcedure = getLiveQueryNotifyProcedureName();
362
+ const channel = getLiveQueryChannelName(namespaceBuild.viewsSchema!);
363
+
364
+ await tx.wrap((tx) =>
365
+ tx.execute(`
366
+ CREATE OR REPLACE FUNCTION "${namespaceBuild.viewsSchema}".${notifyProcedure}
367
+ RETURNS TRIGGER LANGUAGE plpgsql
368
+ AS $$
369
+ DECLARE
370
+ table_names json;
371
+ table_exists boolean := false;
372
+ BEGIN
373
+ SELECT EXISTS (
374
+ SELECT 1
375
+ FROM information_schema.tables
376
+ WHERE table_name = '${getLiveQueryTempTableName()}'
377
+ AND table_type = 'LOCAL TEMPORARY'
378
+ ) INTO table_exists;
379
+
380
+ IF table_exists THEN
381
+ SELECT json_agg(table_name) INTO table_names
382
+ FROM ${getLiveQueryTempTableName()};
383
+
384
+ table_names := COALESCE(table_names, '[]'::json);
385
+ PERFORM pg_notify('${channel}', table_names::text);
386
+ END IF;
387
+
388
+ RETURN NULL;
389
+ END;
390
+ $$;`),
391
+ );
392
+
393
+ const trigger = getViewsLiveQueryNotifyTriggerName(
394
+ namespaceBuild.viewsSchema!,
395
+ );
396
+
397
+ await tx.wrap((tx) =>
398
+ tx.execute(
399
+ `
400
+ CREATE OR REPLACE TRIGGER "${trigger}"
401
+ AFTER INSERT OR UPDATE OR DELETE
402
+ ON "${namespaceBuild.schema!}"."${PONDER_CHECKPOINT_TABLE_NAME}"
403
+ FOR EACH STATEMENT
404
+ EXECUTE PROCEDURE "${namespaceBuild.viewsSchema}".${notifyProcedure};`,
405
+ ),
406
+ );
407
+ },
408
+ undefined,
409
+ context,
410
+ );
411
+ };
412
+
413
+ export const revertOmnichain = async (
414
+ qb: QB,
415
+ {
416
+ checkpoint,
417
+ tables,
418
+ }: {
419
+ checkpoint: string;
420
+ tables: Table[];
421
+ },
422
+ context?: { logger?: Logger },
423
+ ): Promise<number[]> => {
424
+ if (tables.length === 0) return [];
425
+
426
+ return qb.transaction(
427
+ { label: "revert" },
428
+ async (tx) => {
429
+ const counts: number[] = [];
430
+
431
+ for (const table of tables) {
432
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
433
+ const schema = getTableConfig(table).schema ?? "public";
434
+
435
+ const result = await tx.wrap((tx) =>
436
+ tx.execute(`
437
+ WITH reverted1 AS (
438
+ DELETE FROM "${schema}"."${getReorgTableName(table)}"
439
+ WHERE checkpoint > '${checkpoint}' RETURNING *
440
+ ), reverted2 AS (
441
+ SELECT ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}, MIN(operation_id) AS operation_id FROM reverted1
442
+ GROUP BY ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}
443
+ ), reverted3 AS (
444
+ SELECT ${Object.values(getTableColumns(table))
445
+ .map((column) => `reverted1."${getColumnCasing(column, "snake_case")}"`)
446
+ .join(", ")}, reverted1.operation FROM reverted2
447
+ INNER JOIN reverted1
448
+ ON ${primaryKeyColumns.map(({ sql }) => `reverted2."${sql}" = reverted1."${sql}"`).join("AND ")}
449
+ AND reverted2.operation_id = reverted1.operation_id
450
+ ), ${getRevertSql({ table })};`),
451
+ );
452
+
453
+ // @ts-ignore
454
+ counts.push(result.rows[0]!.count);
455
+ }
456
+
457
+ return counts;
458
+ },
459
+ undefined,
460
+ context,
461
+ );
462
+ };
463
+
464
+ export const revertMultichain = async (
465
+ qb: QB,
466
+ {
467
+ checkpoint,
468
+ tables,
469
+ }: {
470
+ checkpoint: string;
471
+ tables: Table[];
472
+ },
473
+ context?: { logger?: Logger },
474
+ ): Promise<number[]> => {
475
+ if (tables.length === 0) return [];
476
+
477
+ return qb.transaction(
478
+ { label: "revert" },
479
+ async (tx) => {
480
+ const counts: number[] = [];
481
+
482
+ const minOperationId = await tx
483
+ .wrap((tx) =>
484
+ tx.execute(`
485
+ SELECT MIN(operation_id) AS operation_id FROM (
486
+ ${tables
487
+ .map(
488
+ (table) => `
489
+ SELECT MIN(operation_id) AS operation_id FROM "${getTableConfig(table).schema ?? "public"}"."${getReorgTableName(table)}"
490
+ WHERE SUBSTRING(checkpoint, 11, 16)::numeric = ${String(decodeCheckpoint(checkpoint).chainId)}
491
+ AND checkpoint > '${checkpoint}'`,
492
+ )
493
+ .join(" UNION ALL ")}) AS all_mins;`),
494
+ )
495
+ .then((result) => {
496
+ // @ts-ignore
497
+ return result.rows[0]?.operation_id as string | null;
498
+ });
499
+
500
+ for (const table of tables) {
501
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
502
+ const schema = getTableConfig(table).schema ?? "public";
503
+
504
+ const result = await tx.wrap((tx) =>
505
+ tx.execute(`
506
+ WITH reverted1 AS (
507
+ DELETE FROM "${schema}"."${getReorgTableName(table)}"
508
+ WHERE ${minOperationId!} IS NOT NULL AND operation_id >= ${minOperationId!}
509
+ RETURNING *
510
+ ), reverted2 AS (
511
+ SELECT ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}, MIN(operation_id) AS operation_id FROM reverted1
512
+ GROUP BY ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}
513
+ ), reverted3 AS (
514
+ SELECT ${Object.values(getTableColumns(table))
515
+ .map((column) => `reverted1."${getColumnCasing(column, "snake_case")}"`)
516
+ .join(", ")}, reverted1.operation FROM reverted2
517
+ INNER JOIN reverted1
518
+ ON ${primaryKeyColumns.map(({ sql }) => `reverted2."${sql}" = reverted1."${sql}"`).join("AND ")}
519
+ AND reverted2.operation_id = reverted1.operation_id
520
+ ), ${getRevertSql({ table })};`),
521
+ );
522
+
523
+ // @ts-ignore
524
+ counts.push(result.rows[0]!.count);
525
+ }
526
+
527
+ return counts;
528
+ },
529
+ undefined,
530
+ context,
531
+ );
532
+ };
533
+
534
+ export const revertIsolated = async (
535
+ qb: QB,
536
+ {
537
+ checkpoint,
538
+ tables,
539
+ }: {
540
+ checkpoint: string;
541
+ tables: Table[];
542
+ },
543
+ context?: { logger?: Logger },
544
+ ) => {
545
+ if (tables.length === 0) return [];
546
+
547
+ return qb.transaction(
548
+ { label: "revert" },
549
+ async (tx) => {
550
+ const counts: number[] = [];
551
+
552
+ for (const table of tables) {
553
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
554
+ const schema = getTableConfig(table).schema ?? "public";
555
+
556
+ const result = await tx.wrap((tx) =>
557
+ tx.execute(`
558
+ WITH reverted1 AS (
559
+ DELETE FROM "${schema}"."${getReorgTableName(table)}"
560
+ WHERE checkpoint > '${checkpoint}' AND SUBSTRING(checkpoint, 11, 16)::numeric = ${String(decodeCheckpoint(checkpoint).chainId)} RETURNING *
561
+ ), reverted2 AS (
562
+ SELECT ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}, MIN(operation_id) AS operation_id FROM reverted1
563
+ GROUP BY ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}
564
+ ), reverted3 AS (
565
+ SELECT ${Object.values(getTableColumns(table))
566
+ .map((column) => `reverted1."${getColumnCasing(column, "snake_case")}"`)
567
+ .join(", ")}, reverted1.operation FROM reverted2
568
+ INNER JOIN reverted1
569
+ ON ${primaryKeyColumns.map(({ sql }) => `reverted2."${sql}" = reverted1."${sql}"`).join("AND ")}
570
+ AND reverted2.operation_id = reverted1.operation_id
571
+ ), ${getRevertSql({ table })};`),
572
+ );
573
+
574
+ // @ts-ignore
575
+ counts.push(result.rows[0]!.count);
576
+ }
577
+
578
+ return counts;
579
+ },
580
+ undefined,
581
+ context,
582
+ );
583
+ };
584
+
585
+ export const finalizeOmnichain = async (
586
+ qb: QB,
587
+ {
588
+ checkpoint,
589
+ tables,
590
+ namespaceBuild,
591
+ }: {
592
+ checkpoint: string;
593
+ tables: Table[];
594
+ namespaceBuild: NamespaceBuild;
595
+ },
596
+ context?: { logger?: Logger },
597
+ ) => {
598
+ const PONDER_CHECKPOINT = getPonderCheckpointTable(namespaceBuild.schema);
599
+
600
+ // TODO(kyle) is this breaking an invariant?
601
+ if (tables.length === 0) {
602
+ await qb.wrap(
603
+ (db) =>
604
+ db
605
+ .update(PONDER_CHECKPOINT)
606
+ .set({ finalizedCheckpoint: checkpoint, safeCheckpoint: checkpoint }),
607
+ context,
608
+ );
609
+ return;
610
+ }
611
+
612
+ return qb.transaction(
613
+ { label: "finalize" },
614
+ async (tx) => {
615
+ await tx.wrap((tx) =>
616
+ tx.update(PONDER_CHECKPOINT).set({
617
+ finalizedCheckpoint: checkpoint,
618
+ safeCheckpoint: checkpoint,
619
+ }),
620
+ );
621
+
622
+ for (const table of tables) {
623
+ await tx.wrap((tx) =>
624
+ tx
625
+ .delete(getReorgTable(table))
626
+ .where(lte(getReorgTable(table).checkpoint, checkpoint)),
627
+ );
628
+ }
629
+ },
630
+ undefined,
631
+ context,
632
+ );
633
+ };
634
+
635
+ export const finalizeMultichain = async (
636
+ qb: QB,
637
+ {
638
+ checkpoint,
639
+ tables,
640
+ namespaceBuild,
641
+ }: {
642
+ checkpoint: string;
643
+ tables: Table[];
644
+ namespaceBuild: NamespaceBuild;
645
+ },
646
+ context?: { logger?: Logger },
647
+ ) => {
648
+ const PONDER_CHECKPOINT = getPonderCheckpointTable(namespaceBuild.schema);
649
+
650
+ // TODO(kyle) is this breaking an invariant?
651
+ if (tables.length === 0) {
652
+ await qb.wrap(
653
+ (db) =>
654
+ db
655
+ .update(PONDER_CHECKPOINT)
656
+ .set({ finalizedCheckpoint: checkpoint, safeCheckpoint: checkpoint }),
657
+ context,
658
+ );
659
+ return;
660
+ }
661
+
662
+ // NOTE: It is invariant that PONDER_CHECKPOINT has a value for each chain.
663
+
664
+ return qb.transaction(
665
+ { label: "finalize" },
666
+ async (tx) => {
667
+ await tx.wrap((tx) =>
668
+ tx
669
+ .update(PONDER_CHECKPOINT)
670
+ .set({ finalizedCheckpoint: checkpoint })
671
+ .where(
672
+ eq(
673
+ PONDER_CHECKPOINT.chainId,
674
+ Number(decodeCheckpoint(checkpoint).chainId),
675
+ ),
676
+ ),
677
+ );
678
+
679
+ const minOperationId = await tx
680
+ .wrap((tx) =>
681
+ tx.execute(`
682
+ SELECT MIN(operation_id) AS operation_id FROM (
683
+ ${tables
684
+ .map(
685
+ (table) => `
686
+ SELECT MIN(operation_id) AS operation_id FROM "${getTableConfig(table).schema ?? "public"}"."${getTableName(getReorgTable(table))}"
687
+ WHERE checkpoint > (
688
+ SELECT finalized_checkpoint
689
+ FROM "${getTableConfig(PONDER_CHECKPOINT).schema ?? "public"}"."${getTableName(PONDER_CHECKPOINT)}"
690
+ WHERE chain_id = SUBSTRING(checkpoint, 11, 16)::numeric
691
+ )`,
692
+ )
693
+ .join(" UNION ALL ")}) AS all_mins;`),
694
+ )
695
+ .then((result) => {
696
+ // @ts-ignore
697
+ return result.rows[0]?.operation_id as string | null;
698
+ });
699
+
700
+ const result = await tx.wrap((tx) =>
701
+ tx.execute(`
702
+ WITH ${tables
703
+ .map(
704
+ (table, index) => `
705
+ deleted_${index} AS (
706
+ DELETE FROM "${getTableConfig(table).schema ?? "public"}"."${getTableName(getReorgTable(table))}"
707
+ WHERE ${minOperationId} IS NULL OR operation_id < ${minOperationId}
708
+ RETURNING *
709
+ )`,
710
+ )
711
+ .join(",\n")},
712
+ all_deleted AS (
713
+ ${tables
714
+ .map((_, index) => `SELECT checkpoint FROM deleted_${index}`)
715
+ .join(" UNION ALL ")}
716
+ )
717
+ SELECT MAX(checkpoint) as safe_checkpoint, SUBSTRING(checkpoint, 11, 16)::numeric as chain_id
718
+ FROM all_deleted
719
+ GROUP BY SUBSTRING(checkpoint, 11, 16)::numeric;`),
720
+ );
721
+
722
+ for (const { chain_id, safe_checkpoint } of result.rows) {
723
+ await tx.wrap((tx) =>
724
+ tx
725
+ .update(PONDER_CHECKPOINT)
726
+ .set({ safeCheckpoint: safe_checkpoint as string })
727
+ .where(eq(PONDER_CHECKPOINT.chainId, chain_id as number)),
728
+ );
729
+ }
730
+ },
731
+ undefined,
732
+ context,
733
+ );
734
+ };
735
+
736
+ export const finalizeIsolated = async (
737
+ qb: QB,
738
+ {
739
+ checkpoint,
740
+ tables,
741
+ namespaceBuild,
742
+ }: {
743
+ checkpoint: string;
744
+ tables: Table[];
745
+ namespaceBuild: NamespaceBuild;
746
+ },
747
+ context?: { logger?: Logger },
748
+ ) => {
749
+ const PONDER_CHECKPOINT = getPonderCheckpointTable(namespaceBuild.schema);
750
+ const chainId = Number(decodeCheckpoint(checkpoint).chainId);
751
+
752
+ if (tables.length === 0) {
753
+ await qb.wrap(
754
+ (db) =>
755
+ db
756
+ .update(PONDER_CHECKPOINT)
757
+ .set({ finalizedCheckpoint: checkpoint, safeCheckpoint: checkpoint })
758
+ .where(eq(PONDER_CHECKPOINT.chainId, chainId)),
759
+ context,
760
+ );
761
+ return;
762
+ }
763
+ return qb.transaction({ label: "finalize" }, async (tx) => {
764
+ await tx.wrap((tx) =>
765
+ tx
766
+ .update(PONDER_CHECKPOINT)
767
+ .set({ finalizedCheckpoint: checkpoint, safeCheckpoint: checkpoint })
768
+ .where(eq(PONDER_CHECKPOINT.chainId, chainId)),
769
+ );
770
+
771
+ for (const table of tables) {
772
+ await tx.wrap((tx) =>
773
+ tx
774
+ .delete(getReorgTable(table))
775
+ .where(
776
+ and(
777
+ lte(getReorgTable(table).checkpoint, checkpoint),
778
+ eq(sql`chain_id`, chainId),
779
+ ),
780
+ ),
781
+ );
782
+ }
783
+ });
784
+ };
785
+
786
+ export const commitBlock = async (
787
+ qb: QB,
788
+ {
789
+ checkpoint,
790
+ table,
791
+ preBuild,
792
+ }: { checkpoint: string; table: Table; preBuild: Pick<PreBuild, "ordering"> },
793
+ context?: { logger?: Logger },
794
+ ) => {
795
+ const reorgTable = getReorgTable(table);
796
+ let whereClause: SQL;
797
+ if (preBuild.ordering === "experimental_isolated") {
798
+ // Note: Query must include `chain_id` because it's possible for multiple chains to be indexing in parallel.
799
+ const chainId = Number(decodeCheckpoint(checkpoint).chainId);
800
+ whereClause = and(
801
+ eq(reorgTable.checkpoint, MAX_CHECKPOINT_STRING),
802
+ eq(sql`chain_id`, chainId),
803
+ )!;
804
+ } else {
805
+ whereClause = eq(reorgTable.checkpoint, MAX_CHECKPOINT_STRING);
806
+ }
807
+
808
+ await qb.wrap(
809
+ { label: "commit_block" },
810
+ (db) => db.update(reorgTable).set({ checkpoint }).where(whereClause),
811
+ context,
812
+ );
813
+ };
814
+
815
+ export const crashRecovery = async (
816
+ qb: QB,
817
+ { table }: { table: Table },
818
+ context?: { logger?: Logger },
819
+ ) => {
820
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
821
+ const schema = getTableConfig(table).schema ?? "public";
822
+
823
+ await qb.wrap(
824
+ (db) =>
825
+ db.execute(`
826
+ WITH reverted1 AS (
827
+ DELETE FROM "${schema}"."${getTableName(getReorgTable(table))}"
828
+ RETURNING *
829
+ ), reverted2 AS (
830
+ SELECT ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}, MIN(operation_id) AS operation_id FROM reverted1
831
+ GROUP BY ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}
832
+ ), reverted3 AS (
833
+ SELECT ${Object.values(getTableColumns(table))
834
+ .map((column) => `reverted1."${getColumnCasing(column, "snake_case")}"`)
835
+ .join(", ")}, reverted1.operation FROM reverted2
836
+ INNER JOIN reverted1
837
+ ON ${primaryKeyColumns.map(({ sql }) => `reverted2."${sql}" = reverted1."${sql}"`).join("AND ")}
838
+ AND reverted2.operation_id = reverted1.operation_id
839
+ ), ${getRevertSql({ table })}`),
840
+ context,
841
+ );
842
+ };
843
+
844
+ const getRevertSql = ({ table }: { table: Table }) => {
845
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
846
+ const schema = getTableConfig(table).schema ?? "public";
847
+
848
+ return `
849
+ inserted AS (
850
+ DELETE FROM "${schema}"."${getTableName(table)}" as t
851
+ WHERE EXISTS (
852
+ SELECT * FROM reverted3
853
+ WHERE ${primaryKeyColumns.map(({ sql }) => `t."${sql}" = reverted3."${sql}"`).join("AND ")}
854
+ AND OPERATION = 0
855
+ )
856
+ RETURNING *
857
+ ), updated_or_deleted AS (
858
+ INSERT INTO "${schema}"."${getTableName(table)}"
859
+ SELECT ${Object.values(getTableColumns(table))
860
+ .map((column) => `"${getColumnCasing(column, "snake_case")}"`)
861
+ .join(", ")} FROM reverted3
862
+ WHERE operation = 1 OR operation = 2
863
+ ON CONFLICT (${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")})
864
+ DO UPDATE SET
865
+ ${Object.values(getTableColumns(table))
866
+ .map(
867
+ (column) =>
868
+ `"${getColumnCasing(column, "snake_case")}" = EXCLUDED."${getColumnCasing(column, "snake_case")}"`,
869
+ )
870
+ .join(", ")}
871
+ RETURNING *
872
+ ) SELECT COUNT(*) FROM reverted1 as count;`;
873
+ };