@subsquid/ponder 0.15.17-sqd.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 (654) hide show
  1. package/CHANGELOG.md +3386 -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 +224 -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 +743 -0
  28. package/dist/esm/build/config.js.map +1 -0
  29. package/dist/esm/build/factory.js +76 -0
  30. package/dist/esm/build/factory.js.map +1 -0
  31. package/dist/esm/build/index.js +538 -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 +76 -0
  36. package/dist/esm/build/pre.js.map +1 -0
  37. package/dist/esm/build/schema.js +164 -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 +597 -0
  54. package/dist/esm/database/index.js.map +1 -0
  55. package/dist/esm/database/queryBuilder.js +310 -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 +40 -0
  64. package/dist/esm/drizzle/index.js.map +1 -0
  65. package/dist/esm/drizzle/json.js +119 -0
  66. package/dist/esm/drizzle/json.js.map +1 -0
  67. package/dist/esm/drizzle/kit/index.js +928 -0
  68. package/dist/esm/drizzle/kit/index.js.map +1 -0
  69. package/dist/esm/drizzle/onchain.js +158 -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 +916 -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 +78 -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 +652 -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 +665 -0
  92. package/dist/esm/indexing-store/cache.js.map +1 -0
  93. package/dist/esm/indexing-store/historical.js +427 -0
  94. package/dist/esm/indexing-store/historical.js.map +1 -0
  95. package/dist/esm/indexing-store/index.js +35 -0
  96. package/dist/esm/indexing-store/index.js.map +1 -0
  97. package/dist/esm/indexing-store/profile.js +428 -0
  98. package/dist/esm/indexing-store/profile.js.map +1 -0
  99. package/dist/esm/indexing-store/realtime.js +305 -0
  100. package/dist/esm/indexing-store/realtime.js.map +1 -0
  101. package/dist/esm/indexing-store/utils.js +111 -0
  102. package/dist/esm/indexing-store/utils.js.map +1 -0
  103. package/dist/esm/internal/common.js +2 -0
  104. package/dist/esm/internal/common.js.map +1 -0
  105. package/dist/esm/internal/errors.js +300 -0
  106. package/dist/esm/internal/errors.js.map +1 -0
  107. package/dist/esm/internal/logger.js +178 -0
  108. package/dist/esm/internal/logger.js.map +1 -0
  109. package/dist/esm/internal/metrics.js +1046 -0
  110. package/dist/esm/internal/metrics.js.map +1 -0
  111. package/dist/esm/internal/options.js +73 -0
  112. package/dist/esm/internal/options.js.map +1 -0
  113. package/dist/esm/internal/shutdown.js +24 -0
  114. package/dist/esm/internal/shutdown.js.map +1 -0
  115. package/dist/esm/internal/telemetry.js +200 -0
  116. package/dist/esm/internal/telemetry.js.map +1 -0
  117. package/dist/esm/internal/types.js +2 -0
  118. package/dist/esm/internal/types.js.map +1 -0
  119. package/dist/esm/rpc/actions.js +988 -0
  120. package/dist/esm/rpc/actions.js.map +1 -0
  121. package/dist/esm/rpc/http.js +130 -0
  122. package/dist/esm/rpc/http.js.map +1 -0
  123. package/dist/esm/rpc/index.js +749 -0
  124. package/dist/esm/rpc/index.js.map +1 -0
  125. package/dist/esm/runtime/events.js +664 -0
  126. package/dist/esm/runtime/events.js.map +1 -0
  127. package/dist/esm/runtime/filter.js +443 -0
  128. package/dist/esm/runtime/filter.js.map +1 -0
  129. package/dist/esm/runtime/fragments.js +478 -0
  130. package/dist/esm/runtime/fragments.js.map +1 -0
  131. package/dist/esm/runtime/historical.js +985 -0
  132. package/dist/esm/runtime/historical.js.map +1 -0
  133. package/dist/esm/runtime/index.js +325 -0
  134. package/dist/esm/runtime/index.js.map +1 -0
  135. package/dist/esm/runtime/init.js +12 -0
  136. package/dist/esm/runtime/init.js.map +1 -0
  137. package/dist/esm/runtime/isolated.js +463 -0
  138. package/dist/esm/runtime/isolated.js.map +1 -0
  139. package/dist/esm/runtime/multichain.js +509 -0
  140. package/dist/esm/runtime/multichain.js.map +1 -0
  141. package/dist/esm/runtime/omnichain.js +544 -0
  142. package/dist/esm/runtime/omnichain.js.map +1 -0
  143. package/dist/esm/runtime/realtime.js +733 -0
  144. package/dist/esm/runtime/realtime.js.map +1 -0
  145. package/dist/esm/server/error.js +56 -0
  146. package/dist/esm/server/error.js.map +1 -0
  147. package/dist/esm/server/index.js +121 -0
  148. package/dist/esm/server/index.js.map +1 -0
  149. package/dist/esm/sync-historical/index.js +701 -0
  150. package/dist/esm/sync-historical/index.js.map +1 -0
  151. package/dist/esm/sync-historical/portal-realtime-wire.js +302 -0
  152. package/dist/esm/sync-historical/portal-realtime-wire.js.map +1 -0
  153. package/dist/esm/sync-historical/portal-realtime.js +154 -0
  154. package/dist/esm/sync-historical/portal-realtime.js.map +1 -0
  155. package/dist/esm/sync-historical/portal-transform.js +113 -0
  156. package/dist/esm/sync-historical/portal-transform.js.map +1 -0
  157. package/dist/esm/sync-historical/portal.js +949 -0
  158. package/dist/esm/sync-historical/portal.js.map +1 -0
  159. package/dist/esm/sync-historical/realtime.js +127 -0
  160. package/dist/esm/sync-historical/realtime.js.map +1 -0
  161. package/dist/esm/sync-realtime/bloom.js +76 -0
  162. package/dist/esm/sync-realtime/bloom.js.map +1 -0
  163. package/dist/esm/sync-realtime/index.js +917 -0
  164. package/dist/esm/sync-realtime/index.js.map +1 -0
  165. package/dist/esm/sync-store/encode.js +105 -0
  166. package/dist/esm/sync-store/encode.js.map +1 -0
  167. package/dist/esm/sync-store/index.js +885 -0
  168. package/dist/esm/sync-store/index.js.map +1 -0
  169. package/dist/esm/sync-store/migrations.js +1595 -0
  170. package/dist/esm/sync-store/migrations.js.map +1 -0
  171. package/dist/esm/sync-store/schema.js +181 -0
  172. package/dist/esm/sync-store/schema.js.map +1 -0
  173. package/dist/esm/types/db.js +2 -0
  174. package/dist/esm/types/db.js.map +1 -0
  175. package/dist/esm/types/eth.js +2 -0
  176. package/dist/esm/types/eth.js.map +1 -0
  177. package/dist/esm/types/utils.js +2 -0
  178. package/dist/esm/types/utils.js.map +1 -0
  179. package/dist/esm/types/virtual.js +2 -0
  180. package/dist/esm/types/virtual.js.map +1 -0
  181. package/dist/esm/ui/app.js +157 -0
  182. package/dist/esm/ui/app.js.map +1 -0
  183. package/dist/esm/ui/index.js +29 -0
  184. package/dist/esm/ui/index.js.map +1 -0
  185. package/dist/esm/ui/patch.js +103 -0
  186. package/dist/esm/ui/patch.js.map +1 -0
  187. package/dist/esm/utils/abi.js +55 -0
  188. package/dist/esm/utils/abi.js.map +1 -0
  189. package/dist/esm/utils/bigint.js +37 -0
  190. package/dist/esm/utils/bigint.js.map +1 -0
  191. package/dist/esm/utils/chains.js +21 -0
  192. package/dist/esm/utils/chains.js.map +1 -0
  193. package/dist/esm/utils/checkpoint.js +139 -0
  194. package/dist/esm/utils/checkpoint.js.map +1 -0
  195. package/dist/esm/utils/chunk.js +8 -0
  196. package/dist/esm/utils/chunk.js.map +1 -0
  197. package/dist/esm/utils/copy.js +129 -0
  198. package/dist/esm/utils/copy.js.map +1 -0
  199. package/dist/esm/utils/date.js +27 -0
  200. package/dist/esm/utils/date.js.map +1 -0
  201. package/dist/esm/utils/debug.js +2 -0
  202. package/dist/esm/utils/debug.js.map +1 -0
  203. package/dist/esm/utils/decodeAbiParameters.js +290 -0
  204. package/dist/esm/utils/decodeAbiParameters.js.map +1 -0
  205. package/dist/esm/utils/decodeEventLog.js +75 -0
  206. package/dist/esm/utils/decodeEventLog.js.map +1 -0
  207. package/dist/esm/utils/dedupe.js +29 -0
  208. package/dist/esm/utils/dedupe.js.map +1 -0
  209. package/dist/esm/utils/duplicates.js +19 -0
  210. package/dist/esm/utils/duplicates.js.map +1 -0
  211. package/dist/esm/utils/estimate.js +6 -0
  212. package/dist/esm/utils/estimate.js.map +1 -0
  213. package/dist/esm/utils/finality.js +38 -0
  214. package/dist/esm/utils/finality.js.map +1 -0
  215. package/dist/esm/utils/format.js +20 -0
  216. package/dist/esm/utils/format.js.map +1 -0
  217. package/dist/esm/utils/generators.js +121 -0
  218. package/dist/esm/utils/generators.js.map +1 -0
  219. package/dist/esm/utils/hash.js +11 -0
  220. package/dist/esm/utils/hash.js.map +1 -0
  221. package/dist/esm/utils/interval.js +171 -0
  222. package/dist/esm/utils/interval.js.map +1 -0
  223. package/dist/esm/utils/lowercase.js +7 -0
  224. package/dist/esm/utils/lowercase.js.map +1 -0
  225. package/dist/esm/utils/mutex.js +26 -0
  226. package/dist/esm/utils/mutex.js.map +1 -0
  227. package/dist/esm/utils/never.js +4 -0
  228. package/dist/esm/utils/never.js.map +1 -0
  229. package/dist/esm/utils/offset.js +101 -0
  230. package/dist/esm/utils/offset.js.map +1 -0
  231. package/dist/esm/utils/order.js +18 -0
  232. package/dist/esm/utils/order.js.map +1 -0
  233. package/dist/esm/utils/partition.js +46 -0
  234. package/dist/esm/utils/partition.js.map +1 -0
  235. package/dist/esm/utils/pg.js +149 -0
  236. package/dist/esm/utils/pg.js.map +1 -0
  237. package/dist/esm/utils/pglite.js +80 -0
  238. package/dist/esm/utils/pglite.js.map +1 -0
  239. package/dist/esm/utils/port.js +30 -0
  240. package/dist/esm/utils/port.js.map +1 -0
  241. package/dist/esm/utils/print.js +23 -0
  242. package/dist/esm/utils/print.js.map +1 -0
  243. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  244. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  245. package/dist/esm/utils/promiseWithResolvers.js +13 -0
  246. package/dist/esm/utils/promiseWithResolvers.js.map +1 -0
  247. package/dist/esm/utils/queue.js +150 -0
  248. package/dist/esm/utils/queue.js.map +1 -0
  249. package/dist/esm/utils/range.js +8 -0
  250. package/dist/esm/utils/range.js.map +1 -0
  251. package/dist/esm/utils/result.js +10 -0
  252. package/dist/esm/utils/result.js.map +1 -0
  253. package/dist/esm/utils/sql-parse.js +1326 -0
  254. package/dist/esm/utils/sql-parse.js.map +1 -0
  255. package/dist/esm/utils/timer.js +9 -0
  256. package/dist/esm/utils/timer.js.map +1 -0
  257. package/dist/esm/utils/truncate.js +15 -0
  258. package/dist/esm/utils/truncate.js.map +1 -0
  259. package/dist/esm/utils/wait.js +10 -0
  260. package/dist/esm/utils/wait.js.map +1 -0
  261. package/dist/esm/utils/zipper.js +67 -0
  262. package/dist/esm/utils/zipper.js.map +1 -0
  263. package/dist/types/bin/commands/codegen.d.ts +5 -0
  264. package/dist/types/bin/commands/codegen.d.ts.map +1 -0
  265. package/dist/types/bin/commands/createViews.d.ts +8 -0
  266. package/dist/types/bin/commands/createViews.d.ts.map +1 -0
  267. package/dist/types/bin/commands/dev.d.ts +5 -0
  268. package/dist/types/bin/commands/dev.d.ts.map +1 -0
  269. package/dist/types/bin/commands/list.d.ts +5 -0
  270. package/dist/types/bin/commands/list.d.ts.map +1 -0
  271. package/dist/types/bin/commands/prune.d.ts +5 -0
  272. package/dist/types/bin/commands/prune.d.ts.map +1 -0
  273. package/dist/types/bin/commands/serve.d.ts +5 -0
  274. package/dist/types/bin/commands/serve.d.ts.map +1 -0
  275. package/dist/types/bin/commands/start.d.ts +19 -0
  276. package/dist/types/bin/commands/start.d.ts.map +1 -0
  277. package/dist/types/bin/isolatedController.d.ts +13 -0
  278. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  279. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  280. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  281. package/dist/types/bin/ponder.d.ts +37 -0
  282. package/dist/types/bin/ponder.d.ts.map +1 -0
  283. package/dist/types/bin/utils/codegen.d.ts +6 -0
  284. package/dist/types/bin/utils/codegen.d.ts.map +1 -0
  285. package/dist/types/bin/utils/exit.d.ts +10 -0
  286. package/dist/types/bin/utils/exit.d.ts.map +1 -0
  287. package/dist/types/build/config.d.ts +97 -0
  288. package/dist/types/build/config.d.ts.map +1 -0
  289. package/dist/types/build/factory.d.ts +13 -0
  290. package/dist/types/build/factory.d.ts.map +1 -0
  291. package/dist/types/build/index.d.ts +84 -0
  292. package/dist/types/build/index.d.ts.map +1 -0
  293. package/dist/types/build/plugin.d.ts +4 -0
  294. package/dist/types/build/plugin.d.ts.map +1 -0
  295. package/dist/types/build/pre.d.ts +26 -0
  296. package/dist/types/build/pre.d.ts.map +1 -0
  297. package/dist/types/build/schema.d.ts +20 -0
  298. package/dist/types/build/schema.d.ts.map +1 -0
  299. package/dist/types/build/stacktrace.d.ts +13 -0
  300. package/dist/types/build/stacktrace.d.ts.map +1 -0
  301. package/dist/types/client/index.d.ts +27 -0
  302. package/dist/types/client/index.d.ts.map +1 -0
  303. package/dist/types/config/address.d.ts +24 -0
  304. package/dist/types/config/address.d.ts.map +1 -0
  305. package/dist/types/config/eventFilter.d.ts +18 -0
  306. package/dist/types/config/eventFilter.d.ts.map +1 -0
  307. package/dist/types/config/index.d.ts +149 -0
  308. package/dist/types/config/index.d.ts.map +1 -0
  309. package/dist/types/config/utilityTypes.d.ts +43 -0
  310. package/dist/types/config/utilityTypes.d.ts.map +1 -0
  311. package/dist/types/database/actions.d.ts +99 -0
  312. package/dist/types/database/actions.d.ts.map +1 -0
  313. package/dist/types/database/index.d.ts +481 -0
  314. package/dist/types/database/index.d.ts.map +1 -0
  315. package/dist/types/database/queryBuilder.d.ts +65 -0
  316. package/dist/types/database/queryBuilder.d.ts.map +1 -0
  317. package/dist/types/drizzle/bigint.d.ts +25 -0
  318. package/dist/types/drizzle/bigint.d.ts.map +1 -0
  319. package/dist/types/drizzle/bytes.d.ts +31 -0
  320. package/dist/types/drizzle/bytes.d.ts.map +1 -0
  321. package/dist/types/drizzle/hex.d.ts +25 -0
  322. package/dist/types/drizzle/hex.d.ts.map +1 -0
  323. package/dist/types/drizzle/index.d.ts +10 -0
  324. package/dist/types/drizzle/index.d.ts.map +1 -0
  325. package/dist/types/drizzle/json.d.ts +51 -0
  326. package/dist/types/drizzle/json.d.ts.map +1 -0
  327. package/dist/types/drizzle/kit/index.d.ts +189 -0
  328. package/dist/types/drizzle/kit/index.d.ts.map +1 -0
  329. package/dist/types/drizzle/onchain.d.ts +287 -0
  330. package/dist/types/drizzle/onchain.d.ts.map +1 -0
  331. package/dist/types/drizzle/text.d.ts +29 -0
  332. package/dist/types/drizzle/text.d.ts.map +1 -0
  333. package/dist/types/graphql/graphiql.html.d.ts +2 -0
  334. package/dist/types/graphql/graphiql.html.d.ts.map +1 -0
  335. package/dist/types/graphql/index.d.ts +12 -0
  336. package/dist/types/graphql/index.d.ts.map +1 -0
  337. package/dist/types/graphql/json.d.ts +3 -0
  338. package/dist/types/graphql/json.d.ts.map +1 -0
  339. package/dist/types/graphql/middleware.d.ts +29 -0
  340. package/dist/types/graphql/middleware.d.ts.map +1 -0
  341. package/dist/types/index.d.ts +23 -0
  342. package/dist/types/index.d.ts.map +1 -0
  343. package/dist/types/indexing/addStackTrace.d.ts +3 -0
  344. package/dist/types/indexing/addStackTrace.d.ts.map +1 -0
  345. package/dist/types/indexing/client.d.ts +154 -0
  346. package/dist/types/indexing/client.d.ts.map +1 -0
  347. package/dist/types/indexing/index.d.ts +75 -0
  348. package/dist/types/indexing/index.d.ts.map +1 -0
  349. package/dist/types/indexing/profile.d.ts +16 -0
  350. package/dist/types/indexing/profile.d.ts.map +1 -0
  351. package/dist/types/indexing-store/cache.d.ts +115 -0
  352. package/dist/types/indexing-store/cache.d.ts.map +1 -0
  353. package/dist/types/indexing-store/historical.d.ts +12 -0
  354. package/dist/types/indexing-store/historical.d.ts.map +1 -0
  355. package/dist/types/indexing-store/index.d.ts +14 -0
  356. package/dist/types/indexing-store/index.d.ts.map +1 -0
  357. package/dist/types/indexing-store/profile.d.ts +7 -0
  358. package/dist/types/indexing-store/profile.d.ts.map +1 -0
  359. package/dist/types/indexing-store/realtime.d.ts +10 -0
  360. package/dist/types/indexing-store/realtime.d.ts.map +1 -0
  361. package/dist/types/indexing-store/utils.d.ts +19 -0
  362. package/dist/types/indexing-store/utils.d.ts.map +1 -0
  363. package/dist/types/internal/common.d.ts +15 -0
  364. package/dist/types/internal/common.d.ts.map +1 -0
  365. package/dist/types/internal/errors.d.ts +101 -0
  366. package/dist/types/internal/errors.d.ts.map +1 -0
  367. package/dist/types/internal/logger.d.ts +37 -0
  368. package/dist/types/internal/logger.d.ts.map +1 -0
  369. package/dist/types/internal/metrics.d.ts +120 -0
  370. package/dist/types/internal/metrics.d.ts.map +1 -0
  371. package/dist/types/internal/options.d.ts +62 -0
  372. package/dist/types/internal/options.d.ts.map +1 -0
  373. package/dist/types/internal/shutdown.d.ts +8 -0
  374. package/dist/types/internal/shutdown.d.ts.map +1 -0
  375. package/dist/types/internal/telemetry.d.ts +43 -0
  376. package/dist/types/internal/telemetry.d.ts.map +1 -0
  377. package/dist/types/internal/types.d.ts +435 -0
  378. package/dist/types/internal/types.d.ts.map +1 -0
  379. package/dist/types/rpc/actions.d.ts +360 -0
  380. package/dist/types/rpc/actions.d.ts.map +1 -0
  381. package/dist/types/rpc/http.d.ts +17 -0
  382. package/dist/types/rpc/http.d.ts.map +1 -0
  383. package/dist/types/rpc/index.d.ts +43 -0
  384. package/dist/types/rpc/index.d.ts.map +1 -0
  385. package/dist/types/runtime/events.d.ts +40 -0
  386. package/dist/types/runtime/events.d.ts.map +1 -0
  387. package/dist/types/runtime/filter.d.ts +87 -0
  388. package/dist/types/runtime/filter.d.ts.map +1 -0
  389. package/dist/types/runtime/fragments.d.ts +30 -0
  390. package/dist/types/runtime/fragments.d.ts.map +1 -0
  391. package/dist/types/runtime/historical.d.ts +123 -0
  392. package/dist/types/runtime/historical.d.ts.map +1 -0
  393. package/dist/types/runtime/index.d.ts +89 -0
  394. package/dist/types/runtime/index.d.ts.map +1 -0
  395. package/dist/types/runtime/init.d.ts +28 -0
  396. package/dist/types/runtime/init.d.ts.map +1 -0
  397. package/dist/types/runtime/isolated.d.ts +14 -0
  398. package/dist/types/runtime/isolated.d.ts.map +1 -0
  399. package/dist/types/runtime/multichain.d.ts +13 -0
  400. package/dist/types/runtime/multichain.d.ts.map +1 -0
  401. package/dist/types/runtime/omnichain.d.ts +23 -0
  402. package/dist/types/runtime/omnichain.d.ts.map +1 -0
  403. package/dist/types/runtime/realtime.d.ts +93 -0
  404. package/dist/types/runtime/realtime.d.ts.map +1 -0
  405. package/dist/types/server/error.d.ts +5 -0
  406. package/dist/types/server/error.d.ts.map +1 -0
  407. package/dist/types/server/index.d.ts +13 -0
  408. package/dist/types/server/index.d.ts.map +1 -0
  409. package/dist/types/sync-historical/index.d.ts +36 -0
  410. package/dist/types/sync-historical/index.d.ts.map +1 -0
  411. package/dist/types/sync-historical/portal-realtime-wire.d.ts +102 -0
  412. package/dist/types/sync-historical/portal-realtime-wire.d.ts.map +1 -0
  413. package/dist/types/sync-historical/portal-realtime.d.ts +95 -0
  414. package/dist/types/sync-historical/portal-realtime.d.ts.map +1 -0
  415. package/dist/types/sync-historical/portal-transform.d.ts +51 -0
  416. package/dist/types/sync-historical/portal-transform.d.ts.map +1 -0
  417. package/dist/types/sync-historical/portal.d.ts +34 -0
  418. package/dist/types/sync-historical/portal.d.ts.map +1 -0
  419. package/dist/types/sync-historical/realtime.d.ts +71 -0
  420. package/dist/types/sync-historical/realtime.d.ts.map +1 -0
  421. package/dist/types/sync-realtime/bloom.d.ts +18 -0
  422. package/dist/types/sync-realtime/bloom.d.ts.map +1 -0
  423. package/dist/types/sync-realtime/index.d.ts +47 -0
  424. package/dist/types/sync-realtime/index.d.ts.map +1 -0
  425. package/dist/types/sync-store/encode.d.ts +25 -0
  426. package/dist/types/sync-store/encode.d.ts.map +1 -0
  427. package/dist/types/sync-store/index.d.ts +135 -0
  428. package/dist/types/sync-store/index.d.ts.map +1 -0
  429. package/dist/types/sync-store/migrations.d.ts +8 -0
  430. package/dist/types/sync-store/migrations.d.ts.map +1 -0
  431. package/dist/types/sync-store/schema.d.ts +1828 -0
  432. package/dist/types/sync-store/schema.d.ts.map +1 -0
  433. package/dist/types/types/db.d.ts +213 -0
  434. package/dist/types/types/db.d.ts.map +1 -0
  435. package/dist/types/types/eth.d.ts +196 -0
  436. package/dist/types/types/eth.d.ts.map +1 -0
  437. package/dist/types/types/utils.d.ts +38 -0
  438. package/dist/types/types/utils.d.ts.map +1 -0
  439. package/dist/types/types/virtual.d.ts +99 -0
  440. package/dist/types/types/virtual.d.ts.map +1 -0
  441. package/dist/types/ui/app.d.ts +22 -0
  442. package/dist/types/ui/app.d.ts.map +1 -0
  443. package/dist/types/ui/index.d.ts +5 -0
  444. package/dist/types/ui/index.d.ts.map +1 -0
  445. package/dist/types/ui/patch.d.ts +7 -0
  446. package/dist/types/ui/patch.d.ts.map +1 -0
  447. package/dist/types/utils/abi.d.ts +23 -0
  448. package/dist/types/utils/abi.d.ts.map +1 -0
  449. package/dist/types/utils/bigint.d.ts +15 -0
  450. package/dist/types/utils/bigint.d.ts.map +1 -0
  451. package/dist/types/utils/chains.d.ts +42 -0
  452. package/dist/types/utils/chains.d.ts.map +1 -0
  453. package/dist/types/utils/checkpoint.d.ts +52 -0
  454. package/dist/types/utils/checkpoint.d.ts.map +1 -0
  455. package/dist/types/utils/chunk.d.ts +2 -0
  456. package/dist/types/utils/chunk.d.ts.map +1 -0
  457. package/dist/types/utils/copy.d.ts +16 -0
  458. package/dist/types/utils/copy.d.ts.map +1 -0
  459. package/dist/types/utils/date.d.ts +7 -0
  460. package/dist/types/utils/date.d.ts.map +1 -0
  461. package/dist/types/utils/debug.d.ts +105 -0
  462. package/dist/types/utils/debug.d.ts.map +1 -0
  463. package/dist/types/utils/decodeAbiParameters.d.ts +28 -0
  464. package/dist/types/utils/decodeAbiParameters.d.ts.map +1 -0
  465. package/dist/types/utils/decodeEventLog.d.ts +12 -0
  466. package/dist/types/utils/decodeEventLog.d.ts.map +1 -0
  467. package/dist/types/utils/dedupe.d.ts +20 -0
  468. package/dist/types/utils/dedupe.d.ts.map +1 -0
  469. package/dist/types/utils/duplicates.d.ts +7 -0
  470. package/dist/types/utils/duplicates.d.ts.map +1 -0
  471. package/dist/types/utils/estimate.d.ts +11 -0
  472. package/dist/types/utils/estimate.d.ts.map +1 -0
  473. package/dist/types/utils/finality.d.ts +12 -0
  474. package/dist/types/utils/finality.d.ts.map +1 -0
  475. package/dist/types/utils/format.d.ts +3 -0
  476. package/dist/types/utils/format.d.ts.map +1 -0
  477. package/dist/types/utils/generators.d.ts +42 -0
  478. package/dist/types/utils/generators.d.ts.map +1 -0
  479. package/dist/types/utils/hash.d.ts +11 -0
  480. package/dist/types/utils/hash.d.ts.map +1 -0
  481. package/dist/types/utils/interval.d.ts +53 -0
  482. package/dist/types/utils/interval.d.ts.map +1 -0
  483. package/dist/types/utils/lowercase.d.ts +5 -0
  484. package/dist/types/utils/lowercase.d.ts.map +1 -0
  485. package/dist/types/utils/mutex.d.ts +5 -0
  486. package/dist/types/utils/mutex.d.ts.map +1 -0
  487. package/dist/types/utils/never.d.ts +2 -0
  488. package/dist/types/utils/never.d.ts.map +1 -0
  489. package/dist/types/utils/offset.d.ts +8 -0
  490. package/dist/types/utils/offset.d.ts.map +1 -0
  491. package/dist/types/utils/order.d.ts +2 -0
  492. package/dist/types/utils/order.d.ts.map +1 -0
  493. package/dist/types/utils/partition.d.ts +22 -0
  494. package/dist/types/utils/partition.d.ts.map +1 -0
  495. package/dist/types/utils/pg.d.ts +8 -0
  496. package/dist/types/utils/pg.d.ts.map +1 -0
  497. package/dist/types/utils/pglite.d.ts +25 -0
  498. package/dist/types/utils/pglite.d.ts.map +1 -0
  499. package/dist/types/utils/port.d.ts +5 -0
  500. package/dist/types/utils/port.d.ts.map +1 -0
  501. package/dist/types/utils/print.d.ts +2 -0
  502. package/dist/types/utils/print.d.ts.map +1 -0
  503. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  504. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  505. package/dist/types/utils/promiseWithResolvers.d.ts +10 -0
  506. package/dist/types/utils/promiseWithResolvers.d.ts.map +1 -0
  507. package/dist/types/utils/queue.d.ts +33 -0
  508. package/dist/types/utils/queue.d.ts.map +1 -0
  509. package/dist/types/utils/range.d.ts +8 -0
  510. package/dist/types/utils/range.d.ts.map +1 -0
  511. package/dist/types/utils/result.d.ts +17 -0
  512. package/dist/types/utils/result.d.ts.map +1 -0
  513. package/dist/types/utils/sql-parse.d.ts +21 -0
  514. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  515. package/dist/types/utils/timer.d.ts +6 -0
  516. package/dist/types/utils/timer.d.ts.map +1 -0
  517. package/dist/types/utils/truncate.d.ts +9 -0
  518. package/dist/types/utils/truncate.d.ts.map +1 -0
  519. package/dist/types/utils/wait.d.ts +6 -0
  520. package/dist/types/utils/wait.d.ts.map +1 -0
  521. package/dist/types/utils/zipper.d.ts +36 -0
  522. package/dist/types/utils/zipper.d.ts.map +1 -0
  523. package/package.json +116 -0
  524. package/src/bin/commands/codegen.ts +56 -0
  525. package/src/bin/commands/createViews.ts +311 -0
  526. package/src/bin/commands/dev.ts +490 -0
  527. package/src/bin/commands/list.ts +207 -0
  528. package/src/bin/commands/prune.ts +316 -0
  529. package/src/bin/commands/serve.ts +236 -0
  530. package/src/bin/commands/start.ts +319 -0
  531. package/src/bin/isolatedController.ts +300 -0
  532. package/src/bin/isolatedWorker.ts +192 -0
  533. package/src/bin/ponder.ts +200 -0
  534. package/src/bin/utils/codegen.ts +32 -0
  535. package/src/bin/utils/exit.ts +112 -0
  536. package/src/build/config.ts +1136 -0
  537. package/src/build/factory.ts +122 -0
  538. package/src/build/index.ts +747 -0
  539. package/src/build/plugin.ts +58 -0
  540. package/src/build/pre.ts +100 -0
  541. package/src/build/schema.ts +291 -0
  542. package/src/build/stacktrace.ts +137 -0
  543. package/src/client/index.ts +551 -0
  544. package/src/config/address.ts +32 -0
  545. package/src/config/eventFilter.ts +33 -0
  546. package/src/config/index.ts +245 -0
  547. package/src/config/utilityTypes.ts +152 -0
  548. package/src/database/actions.ts +870 -0
  549. package/src/database/index.ts +1018 -0
  550. package/src/database/queryBuilder.ts +534 -0
  551. package/src/drizzle/bigint.ts +57 -0
  552. package/src/drizzle/bytes.ts +68 -0
  553. package/src/drizzle/hex.ts +58 -0
  554. package/src/drizzle/index.ts +58 -0
  555. package/src/drizzle/json.ts +154 -0
  556. package/src/drizzle/kit/index.ts +1352 -0
  557. package/src/drizzle/onchain.ts +447 -0
  558. package/src/drizzle/text.ts +77 -0
  559. package/src/graphql/graphiql.html.ts +59 -0
  560. package/src/graphql/index.ts +1329 -0
  561. package/src/graphql/json.ts +62 -0
  562. package/src/graphql/middleware.ts +111 -0
  563. package/src/index.ts +139 -0
  564. package/src/indexing/addStackTrace.ts +69 -0
  565. package/src/indexing/client.ts +1184 -0
  566. package/src/indexing/index.ts +961 -0
  567. package/src/indexing/profile.ts +771 -0
  568. package/src/indexing-store/cache.ts +1056 -0
  569. package/src/indexing-store/historical.ts +555 -0
  570. package/src/indexing-store/index.ts +73 -0
  571. package/src/indexing-store/profile.ts +557 -0
  572. package/src/indexing-store/realtime.ts +412 -0
  573. package/src/indexing-store/utils.ts +162 -0
  574. package/src/internal/common.ts +15 -0
  575. package/src/internal/errors.ts +228 -0
  576. package/src/internal/logger.ts +252 -0
  577. package/src/internal/metrics.ts +1027 -0
  578. package/src/internal/options.ts +130 -0
  579. package/src/internal/shutdown.ts +32 -0
  580. package/src/internal/telemetry.ts +303 -0
  581. package/src/internal/types.ts +598 -0
  582. package/src/rpc/actions.ts +1344 -0
  583. package/src/rpc/http.ts +164 -0
  584. package/src/rpc/index.ts +959 -0
  585. package/src/runtime/events.ts +875 -0
  586. package/src/runtime/filter.ts +664 -0
  587. package/src/runtime/fragments.ts +674 -0
  588. package/src/runtime/historical.ts +1556 -0
  589. package/src/runtime/index.ts +578 -0
  590. package/src/runtime/init.ts +49 -0
  591. package/src/runtime/isolated.ts +769 -0
  592. package/src/runtime/multichain.ts +853 -0
  593. package/src/runtime/omnichain.ts +913 -0
  594. package/src/runtime/realtime.ts +1179 -0
  595. package/src/server/error.ts +68 -0
  596. package/src/server/index.ts +173 -0
  597. package/src/sync-historical/index.ts +1062 -0
  598. package/src/sync-historical/portal-realtime-wire.ts +389 -0
  599. package/src/sync-historical/portal-realtime.ts +209 -0
  600. package/src/sync-historical/portal-transform.ts +123 -0
  601. package/src/sync-historical/portal.ts +811 -0
  602. package/src/sync-historical/realtime.ts +132 -0
  603. package/src/sync-realtime/bloom.ts +102 -0
  604. package/src/sync-realtime/index.ts +1298 -0
  605. package/src/sync-store/encode.ts +153 -0
  606. package/src/sync-store/index.ts +1633 -0
  607. package/src/sync-store/migrations.ts +1801 -0
  608. package/src/sync-store/schema.ts +248 -0
  609. package/src/types/db.ts +292 -0
  610. package/src/types/eth.ts +216 -0
  611. package/src/types/utils.ts +47 -0
  612. package/src/types/virtual.ts +244 -0
  613. package/src/types.d.ts +38 -0
  614. package/src/ui/app.ts +207 -0
  615. package/src/ui/index.ts +37 -0
  616. package/src/ui/patch.ts +145 -0
  617. package/src/utils/abi.ts +103 -0
  618. package/src/utils/bigint.ts +41 -0
  619. package/src/utils/chains.ts +22 -0
  620. package/src/utils/checkpoint.ts +203 -0
  621. package/src/utils/chunk.ts +7 -0
  622. package/src/utils/copy.ts +151 -0
  623. package/src/utils/date.ts +26 -0
  624. package/src/utils/debug.ts +110 -0
  625. package/src/utils/decodeAbiParameters.ts +428 -0
  626. package/src/utils/decodeEventLog.ts +100 -0
  627. package/src/utils/dedupe.ts +32 -0
  628. package/src/utils/duplicates.ts +19 -0
  629. package/src/utils/estimate.ts +27 -0
  630. package/src/utils/finality.ts +40 -0
  631. package/src/utils/format.ts +22 -0
  632. package/src/utils/generators.ts +157 -0
  633. package/src/utils/hash.ts +22 -0
  634. package/src/utils/interval.ts +212 -0
  635. package/src/utils/lowercase.ts +6 -0
  636. package/src/utils/mutex.ts +33 -0
  637. package/src/utils/never.ts +3 -0
  638. package/src/utils/offset.ts +133 -0
  639. package/src/utils/order.ts +16 -0
  640. package/src/utils/partition.ts +53 -0
  641. package/src/utils/pg.ts +197 -0
  642. package/src/utils/pglite.ts +97 -0
  643. package/src/utils/port.ts +34 -0
  644. package/src/utils/print.ts +31 -0
  645. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  646. package/src/utils/promiseWithResolvers.ts +20 -0
  647. package/src/utils/queue.ts +258 -0
  648. package/src/utils/range.ts +8 -0
  649. package/src/utils/result.ts +26 -0
  650. package/src/utils/sql-parse.ts +1477 -0
  651. package/src/utils/timer.ts +8 -0
  652. package/src/utils/truncate.ts +15 -0
  653. package/src/utils/wait.ts +8 -0
  654. package/src/utils/zipper.ts +80 -0
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Wiring glue: Portal-native realtime → Ponder's realtime runtime.
3
+ *
4
+ * `portal-realtime.ts` produces `PortalRealtimeEvent`s from the Portal `/stream`. THIS module adapts them
5
+ * into ponder's own `RealtimeSyncEvent`s and drops into `runtime/realtime.ts` as an alternative to the
6
+ * `rpc.subscribe`+`createRealtimeSync` path — so the downstream indexing/checkpointing is UNCHANGED.
7
+ *
8
+ * Everything here is inert unless a chain has a Portal source AND `PORTAL_REALTIME==="stream"`. When the
9
+ * flag is unset/"rpc", `isPortalRealtime()` is false and `clampFinalizedToPortalHead()` is a pass-through,
10
+ * so the RPC realtime path (the "A-path") is byte-for-byte unchanged.
11
+ *
12
+ * WHY the finality clamp: ponder computes `syncProgress.finalized` from RPC (`latest−finalityBlockCount`),
13
+ * which can sit ABOVE the Portal's finalized head. If realtime streamed from below that finalized block it
14
+ * would silently regress ponder's persisted checkpoints; if historical skipped its RPC finality-gap
15
+ * fallback it would mark the gap "synced" with no data (a permanent silent hole). Both are avoided by
16
+ * making the Portal's finalized head the finality boundary in stream mode: `clampFinalizedToPortalHead()`
17
+ * lowers `syncProgress.finalized` to the Portal head, so (a) historical stops exactly at the Portal head
18
+ * (no gap, the RPC fallback never triggers) and (b) realtime streams `[portal-head+1 → tip]` — every block
19
+ * strictly ABOVE `finalized`, and every `finalize` monotonically at/above it.
20
+ */
21
+ import type { Common } from "@/internal/common.js";
22
+ import type {
23
+ Chain,
24
+ EventCallback,
25
+ Factory,
26
+ FactoryId,
27
+ Filter,
28
+ LightBlock,
29
+ LogFilter,
30
+ SyncLog,
31
+ } from "@/internal/types.js";
32
+ import {
33
+ getChildAddress,
34
+ getFilterFactories,
35
+ isAddressFactory,
36
+ isLogFactoryMatched,
37
+ } from "@/runtime/filter.js";
38
+ import { eth_getBlockByNumber } from "@/rpc/actions.js";
39
+ import type { Rpc } from "@/rpc/index.js";
40
+ import type { RealtimeSyncEvent } from "@/sync-realtime/index.js";
41
+ import { type Address, hexToNumber, numberToHex } from "viem";
42
+ import {
43
+ type Light,
44
+ type PortalRealtimeEvent,
45
+ portalRealtimeEvents,
46
+ } from "./portal-realtime.js";
47
+ import { hx } from "./portal-transform.js";
48
+
49
+ // ─────────────────────────────── flag / detection ───────────────────────────────
50
+
51
+ /** True when this chain should use the Portal `/stream` for realtime instead of ponder's RPC path. */
52
+ export const isPortalRealtime = (chain: { portal?: string | undefined }): boolean =>
53
+ typeof chain.portal === "string" && process.env.PORTAL_REALTIME === "stream";
54
+
55
+ const portalHeaders = (): Record<string, string> => {
56
+ const h: Record<string, string> = { "content-type": "application/json", "accept-encoding": "gzip" };
57
+ if (process.env.PORTAL_API_KEY) h["x-api-key"] = process.env.PORTAL_API_KEY;
58
+ return h;
59
+ };
60
+
61
+ const cleanUrl = (portal: string): string => portal.replace(/\/$/, "");
62
+
63
+ // ─────────────────────────────── Portal finalized head + finality clamp ───────────────────────────────
64
+
65
+ /** Poll the Portal `/finalized-head` (reused by both the historical finality-gap decision and here). */
66
+ export async function portalFinalizedHead(
67
+ portalUrl: string,
68
+ headers: Record<string, string>,
69
+ fetchImpl: typeof fetch = fetch,
70
+ ): Promise<number | undefined> {
71
+ try {
72
+ const h = await fetchImpl(`${cleanUrl(portalUrl)}/finalized-head`, { headers }).then((r) => r.json());
73
+ if (typeof h?.number === "number") return h.number;
74
+ } catch {
75
+ /* head unknown → caller stays conservative */
76
+ }
77
+ return undefined;
78
+ }
79
+
80
+ /**
81
+ * In stream mode, lower `finalizedBlock` to the Portal's finalized head (when the Portal lags ponder's
82
+ * RPC-derived finalized block). Pass-through for the A-path (no portal / flag off) and when the Portal is
83
+ * already at/ahead of the RPC finalized block — so it never RAISES the boundary. Called at every site that
84
+ * sets `syncProgress.finalized`: the initial `getLocalSyncProgress` and the backfill-cutover refetch.
85
+ */
86
+ export async function clampFinalizedToPortalHead(params: {
87
+ chain: Chain;
88
+ rpc: Rpc;
89
+ finalizedBlock: LightBlock;
90
+ common?: Common;
91
+ fetchImpl?: typeof fetch;
92
+ }): Promise<LightBlock> {
93
+ const { chain, rpc, finalizedBlock } = params;
94
+ if (isPortalRealtime(chain) === false) return finalizedBlock;
95
+
96
+ const portalUrl = cleanUrl(chain.portal!);
97
+ const head = await portalFinalizedHead(portalUrl, portalHeaders(), params.fetchImpl);
98
+ // Head unknown → stay conservative and keep the RPC finalized block (historical's own RPC finality-gap
99
+ // fallback remains the safety net). Portal at/ahead of RPC finalized → nothing to clamp.
100
+ if (head === undefined || head >= hexToNumber(finalizedBlock.number)) return finalizedBlock;
101
+
102
+ const clamped = (await eth_getBlockByNumber(rpc, [numberToHex(head), false], {
103
+ retryNullBlockRequest: true,
104
+ })) as unknown as LightBlock;
105
+ params.common?.logger.debug({
106
+ service: "portal",
107
+ msg: `Portal ${chain.name}: clamped realtime finalized ${hexToNumber(finalizedBlock.number)} → Portal head ${head} (stream mode)`,
108
+ });
109
+ return clamped;
110
+ }
111
+
112
+ // ─────────────────────────────── log-request construction (mirrors portal.ts) ───────────────────────────────
113
+
114
+ /** Portal `/stream` log filter — same shape the historical sync uses. */
115
+ export type PortalLogRequest = {
116
+ address?: string[];
117
+ topic0?: string[];
118
+ topic1?: string[];
119
+ topic2?: string[];
120
+ topic3?: string[];
121
+ };
122
+
123
+ const PORTAL_MAX_ADDRESSES = 1000;
124
+ const asArr = <T,>(v: T | T[]): T[] => (Array.isArray(v) ? v : [v]);
125
+ const lc = (a: string): string => a.toLowerCase();
126
+
127
+ /** The unique factories referenced by any filter (deduped by id). */
128
+ export const uniqueFactories = (eventCallbacks: { filter: Filter }[]): Factory[] =>
129
+ [
130
+ ...new Map(
131
+ eventCallbacks.flatMap((e) => getFilterFactories(e.filter)).map((f) => [f.id, f]),
132
+ ).values(),
133
+ ];
134
+
135
+ /** Log-filter → Portal log requests. Factory-address filters expand to the currently-known children. */
136
+ function logRequestsFor(
137
+ filter: LogFilter,
138
+ childAddresses: Map<FactoryId, Map<Address, number>>,
139
+ ): PortalLogRequest[] {
140
+ const base: PortalLogRequest = {};
141
+ if (filter.topic0) base.topic0 = asArr(filter.topic0);
142
+ if (filter.topic1) base.topic1 = asArr(filter.topic1 as any);
143
+ if (filter.topic2) base.topic2 = asArr(filter.topic2 as any);
144
+ if (filter.topic3) base.topic3 = asArr(filter.topic3 as any);
145
+ let addresses: string[] | undefined;
146
+ if (isAddressFactory(filter.address)) {
147
+ addresses = Array.from(childAddresses.get(filter.address.id)?.keys() ?? []);
148
+ if (addresses.length === 0) return []; // no children yet → nothing to request for this filter
149
+ } else if (filter.address === undefined) {
150
+ return [base];
151
+ } else {
152
+ addresses = asArr(filter.address).map(lc);
153
+ }
154
+ const out: PortalLogRequest[] = [];
155
+ for (let i = 0; i < addresses.length; i += PORTAL_MAX_ADDRESSES)
156
+ out.push({ ...base, address: addresses.slice(i, i + PORTAL_MAX_ADDRESSES) });
157
+ return out;
158
+ }
159
+
160
+ /** Collapse requests sharing the same address-set + topic1..3, unioning topic0 (keeps the body small). */
161
+ function mergeLogRequests(reqs: PortalLogRequest[]): PortalLogRequest[] {
162
+ const groups = new Map<string, PortalLogRequest>();
163
+ for (const r of reqs) {
164
+ const key = JSON.stringify([r.address ? [...r.address].sort() : null, r.topic1 ?? null, r.topic2 ?? null, r.topic3 ?? null]);
165
+ const g = groups.get(key);
166
+ if (!g) { groups.set(key, { ...r, topic0: r.topic0 ? [...new Set(r.topic0)] : undefined }); continue; }
167
+ if (g.topic0 === undefined || r.topic0 === undefined) g.topic0 = undefined;
168
+ else { const s = new Set(g.topic0); for (const t of r.topic0) s.add(t); g.topic0 = [...s]; }
169
+ }
170
+ return [...groups.values()];
171
+ }
172
+
173
+ /**
174
+ * Build the merged Portal `/stream` log filter for a chain's realtime: every log filter's
175
+ * address+topics PLUS a discovery request per factory (factory address + ProxyCreated selector), so new
176
+ * children are streamed and pruned/matched downstream. Mirrors `portal.ts` so the realtime and historical
177
+ * fetch-specs agree.
178
+ */
179
+ export function buildPortalLogRequests(
180
+ eventCallbacks: { filter: Filter }[],
181
+ childAddresses: Map<FactoryId, Map<Address, number>>,
182
+ ): PortalLogRequest[] {
183
+ const filters = eventCallbacks.map((e) => e.filter);
184
+ const reqs: PortalLogRequest[] = [];
185
+ for (const f of filters) if (f.type === "log") reqs.push(...logRequestsFor(f as LogFilter, childAddresses));
186
+ for (const factory of uniqueFactories(eventCallbacks)) {
187
+ const address = factory.address ? asArr(factory.address).map(lc) : undefined;
188
+ reqs.push({ address, topic0: [factory.eventSelector.toLowerCase()] });
189
+ }
190
+ return mergeLogRequests(reqs);
191
+ }
192
+
193
+ // ─────────────────────────────── factory child discovery ───────────────────────────────
194
+
195
+ /**
196
+ * Discover factory children in a block's logs — reuses ponder's own factory logic (`isLogFactoryMatched`
197
+ * + `getChildAddress`). For the euler `ProxyCreated(address indexed proxy,…)` factory the child is the
198
+ * `proxy` in topic1. Returns the per-factory children found in THIS block (keyed by `Factory`, the shape
199
+ * `handleRealtimeSyncEvent` finalizes into the sync-store).
200
+ */
201
+ export function discoverChildAddresses(
202
+ logs: SyncLog[],
203
+ factories: Factory[],
204
+ ): Map<Factory, Set<Address>> {
205
+ const out = new Map<Factory, Set<Address>>();
206
+ for (const factory of factories) {
207
+ for (const log of logs) {
208
+ if (isLogFactoryMatched({ factory, log }) === false) continue;
209
+ let address: Address;
210
+ try {
211
+ address = getChildAddress({ log, factory }).toLowerCase() as Address;
212
+ } catch {
213
+ continue; // ABI mismatch on a factory with no fixed address → skip (mirrors createRealtimeSync)
214
+ }
215
+ if (out.has(factory) === false) out.set(factory, new Set<Address>());
216
+ out.get(factory)!.add(address);
217
+ }
218
+ }
219
+ return out;
220
+ }
221
+
222
+ /**
223
+ * Fold this block's discovered children into the RUNNING `childAddresses` map (the one `buildEvents` reads
224
+ * to match factory-child logs) — so a child created in this block is matched for its own logs in the SAME
225
+ * block, exactly like `createRealtimeSync`. Returns true if any NEW child was added.
226
+ */
227
+ function applyDiscovered(
228
+ discovered: Map<Factory, Set<Address>>,
229
+ childAddresses: Map<FactoryId, Map<Address, number>>,
230
+ blockNumber: number,
231
+ ): boolean {
232
+ let added = false;
233
+ for (const [factory, addresses] of discovered) {
234
+ let rec = childAddresses.get(factory.id);
235
+ if (rec === undefined) { rec = new Map<Address, number>(); childAddresses.set(factory.id, rec); }
236
+ for (const address of addresses) {
237
+ if (rec.has(address) === false) { rec.set(address, blockNumber); added = true; }
238
+ }
239
+ }
240
+ return added;
241
+ }
242
+
243
+ // ─────────────────────────────── event conversion ───────────────────────────────
244
+
245
+ /** Portal `Light` (decimal number/timestamp) → ponder `LightBlock` (hex). */
246
+ export const lightToLightBlock = (l: Light): LightBlock => ({
247
+ number: hx(l.number),
248
+ hash: l.hash as LightBlock["hash"],
249
+ parentHash: l.parentHash as LightBlock["parentHash"],
250
+ timestamp: hx(l.timestamp),
251
+ });
252
+
253
+ /**
254
+ * PortalRealtimeEvent → ponder RealtimeSyncEvent. `block` becomes a log-only BlockWithEventData (no
255
+ * txs/receipts/traces — euler is log-indexed); `reorg`/`finalize` pass through with hex LightBlocks.
256
+ */
257
+ export function toRealtimeSyncEvent(
258
+ ev: PortalRealtimeEvent,
259
+ childAddresses: Map<Factory, Set<Address>>,
260
+ ): RealtimeSyncEvent {
261
+ switch (ev.type) {
262
+ case "block":
263
+ return {
264
+ type: "block",
265
+ hasMatchedFilter: ev.hasMatchedFilter,
266
+ block: ev.block,
267
+ logs: ev.logs,
268
+ transactions: [],
269
+ transactionReceipts: [],
270
+ traces: [],
271
+ childAddresses,
272
+ blockCallback: undefined, // no rpc.subscribe backpressure hook in the stream path (optional-chained downstream)
273
+ };
274
+ case "reorg":
275
+ return { type: "reorg", block: lightToLightBlock(ev.block), reorgedBlocks: ev.reorgedBlocks.map(lightToLightBlock) };
276
+ case "finalize":
277
+ return { type: "finalize", block: lightToLightBlock(ev.block) };
278
+ }
279
+ }
280
+
281
+ // ─────────────────────────────── drop-in realtime generator ───────────────────────────────
282
+
283
+ /**
284
+ * Drop-in replacement for `getRealtimeEventGenerator` when `isPortalRealtime(chain)`. Yields the SAME
285
+ * `{chain, event: RealtimeSyncEvent}` stream, sourced from the Portal `/stream` instead of
286
+ * `rpc.subscribe`+`createRealtimeSync`. Callers (omni/multi/isolated) are unchanged.
287
+ */
288
+ export async function* getPortalRealtimeEventGenerator(params: {
289
+ common: Common;
290
+ chain: Chain;
291
+ rpc: Rpc;
292
+ eventCallbacks: EventCallback[];
293
+ syncProgress: { finalized: LightBlock; end?: LightBlock | undefined };
294
+ childAddresses: Map<FactoryId, Map<Address, number>>;
295
+ fetchImpl?: typeof fetch; // injected for tests
296
+ finalizePollMs?: number; // injected for tests (prod: portal-realtime.ts default cadence)
297
+ }) {
298
+ const { common, chain, eventCallbacks, syncProgress, childAddresses } = params;
299
+ const portalUrl = cleanUrl(chain.portal!);
300
+ const headers = portalHeaders();
301
+ const factories = uniqueFactories(eventCallbacks);
302
+
303
+ const startupFinalized = hexToNumber(syncProgress.finalized.number);
304
+ const fromBlock = startupFinalized + 1; // finalized == Portal head (clamped) → stream (portal-head, tip]
305
+ const endBlock = syncProgress.end ? hexToNumber(syncProgress.end.number) : undefined;
306
+
307
+ // Mutable: rebuilt (in place) whenever a new child is discovered so the next stream reconnection filters
308
+ // the new child's logs too (portal-realtime.ts re-reads this array when it re-opens the stream).
309
+ const logs = buildPortalLogRequests(eventCallbacks, childAddresses);
310
+
311
+ let childCount = 0;
312
+ for (const [, m] of childAddresses) childCount += m.size;
313
+ common.logger.info({
314
+ service: "portal",
315
+ msg: "Started live indexing (Portal /stream)",
316
+ chain: chain.name,
317
+ chain_id: chain.id,
318
+ finalized_block: startupFinalized,
319
+ factory_address_count: childCount,
320
+ });
321
+
322
+ const controller = new AbortController();
323
+ let lastFinalized = startupFinalized;
324
+ try {
325
+ for await (const ev of portalRealtimeEvents({
326
+ portalUrl,
327
+ headers,
328
+ fromBlock,
329
+ logs,
330
+ blockFields: BLOCK_FIELDS,
331
+ logFields: LOG_FIELDS,
332
+ finalizedHead: () => portalFinalizedHead(portalUrl, headers, params.fetchImpl),
333
+ finalizePollMs: params.finalizePollMs,
334
+ signal: controller.signal,
335
+ fetchImpl: params.fetchImpl,
336
+ })) {
337
+ if (ev.type === "finalize") {
338
+ // Q3 safety: never regress ponder's finalized/safe checkpoints. Suppress a finalize at/below the
339
+ // startup boundary or below one already emitted (Portal head only ever advances, so this is defensive).
340
+ const n = ev.block.number;
341
+ if (n <= startupFinalized || n <= lastFinalized) continue;
342
+ lastFinalized = n;
343
+ yield { chain, event: toRealtimeSyncEvent(ev, new Map()) };
344
+ continue;
345
+ }
346
+
347
+ if (ev.type === "reorg") {
348
+ yield { chain, event: toRealtimeSyncEvent(ev, new Map()) };
349
+ continue;
350
+ }
351
+
352
+ // block
353
+ const discovered = discoverChildAddresses(ev.logs, factories);
354
+ const blockNumber = hexToNumber(ev.block.number);
355
+ if (applyDiscovered(discovered, childAddresses, blockNumber)) {
356
+ const next = buildPortalLogRequests(eventCallbacks, childAddresses);
357
+ logs.length = 0;
358
+ logs.push(...next); // mutate in place — picked up on the next `/stream` reconnection
359
+ }
360
+
361
+ yield { chain, event: toRealtimeSyncEvent(ev, discovered) };
362
+
363
+ if (endBlock !== undefined && blockNumber >= endBlock) {
364
+ common.logger.info({
365
+ service: "portal",
366
+ msg: "Completed live indexing (chain end block has been indexed)",
367
+ chain: chain.name,
368
+ chain_id: chain.id,
369
+ end_block: endBlock,
370
+ });
371
+ return;
372
+ }
373
+ }
374
+ } finally {
375
+ controller.abort();
376
+ }
377
+ }
378
+
379
+ // Block header fields — the RPC-path-equivalent set (kept in sync with portal.ts) so stored realtime
380
+ // blocks are byte-consistent with the historical Portal backfill.
381
+ const BLOCK_FIELDS: Record<string, boolean> = {
382
+ number: true, hash: true, parentHash: true, timestamp: true, logsBloom: true, miner: true,
383
+ gasUsed: true, gasLimit: true, stateRoot: true, receiptsRoot: true, transactionsRoot: true,
384
+ size: true, difficulty: true, extraData: true, baseFeePerGas: true, nonce: true, mixHash: true,
385
+ sha3Uncles: true, totalDifficulty: true,
386
+ };
387
+ const LOG_FIELDS: Record<string, boolean> = {
388
+ address: true, topics: true, data: true, transactionHash: true, transactionIndex: true, logIndex: true,
389
+ };
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Portal-native realtime — serve `[portal-finalized-head → tip]` from the Portal `/stream` (fork-aware
3
+ * hot-blocks) instead of RPC.
4
+ *
5
+ * WHY: in realtime mode the fork currently backfills `[deploy → portal-finalized-head]` from the Portal,
6
+ * then fetches `[portal-finalized-head → chain-finalized-head]` over RPC (the "finality gap") and runs
7
+ * ponder's RPC RealtimeSync for the tip. For dense chains under multichain load that RPC gap-fetch stalls
8
+ * — ponder's single-thread global ordering blocks on the slowest chain's gap. The Portal already holds
9
+ * these hot-blocks; streaming them removes the RPC gap at its source.
10
+ *
11
+ * HOW: `/stream` with `includeAllBlocks:true` yields EVERY block header (a consecutive parentHash chain,
12
+ * for reorg tracking) plus the filtered euler logs, in one request. We reconcile each block into a local
13
+ * unfinalized chain and emit ponder's own `RealtimeSyncEvent`s (`block` / `reorg` / `finalize`) reusing
14
+ * `portal-transform` — so the downstream indexing + checkpointing in runtime/realtime.ts is UNCHANGED.
15
+ *
16
+ * The reorg/finalize reconciliation is pure + unit-tested; the `/stream` read and `/finalized-head` poll
17
+ * are the I/O shell.
18
+ */
19
+ import type { SyncBlockHeader, SyncLog } from "@/internal/types.js";
20
+ import { hexToNumber, type Hex } from "viem";
21
+ import { hx, toSyncBlockHeader, toSyncLog, type RawHeader } from "./portal-transform.js";
22
+
23
+ // ─────────────────────────────── pure reorg / finalize core (unit-tested) ───────────────────────────────
24
+
25
+ /** The minimum a block needs for chain reconciliation. `number` is a decimal string (Portal-native). */
26
+ export type Light = { number: number; hash: string; parentHash: string; timestamp: number };
27
+
28
+ export type Reconcile =
29
+ | { kind: "append" } // extends the tip (normal case)
30
+ | { kind: "duplicate" } // already the tip (idempotent re-delivery)
31
+ | { kind: "reorg"; commonAncestor: Light; reorgedBlocks: Light[] } // forks off an earlier block
32
+ | { kind: "gap" }; // parent is unknown (beyond our window / a skipped block) → caller must re-sync
33
+
34
+ /**
35
+ * Reconcile a newly-streamed block against the local unfinalized chain (oldest→newest, linked
36
+ * parentHash→hash). Pure. With `includeAllBlocks` the happy path is always `append`; a reorg re-streams
37
+ * from the fork point, so the new block's `parentHash` matches an EARLIER block — everything after that
38
+ * common ancestor is reorged.
39
+ */
40
+ export function reconcile(unfinalized: Light[], next: Light): Reconcile {
41
+ if (unfinalized.length === 0) return { kind: "append" };
42
+ const tip = unfinalized[unfinalized.length - 1]!;
43
+ if (next.hash === tip.hash) return { kind: "duplicate" };
44
+ if (next.parentHash === tip.hash) return { kind: "append" };
45
+ const idx = unfinalized.findIndex((b) => b.hash === next.parentHash);
46
+ if (idx === -1) return { kind: "gap" };
47
+ return { kind: "reorg", commonAncestor: unfinalized[idx]!, reorgedBlocks: unfinalized.slice(idx + 1) };
48
+ }
49
+
50
+ /** Split the unfinalized chain at a newly-finalized block number. Pure. */
51
+ export function takeFinalized(
52
+ unfinalized: Light[],
53
+ finalizedNumber: number,
54
+ ): { finalizedTip: Light | undefined; remaining: Light[] } {
55
+ let finalizedTip: Light | undefined;
56
+ const remaining: Light[] = [];
57
+ for (const b of unfinalized) {
58
+ if (b.number <= finalizedNumber) finalizedTip = b;
59
+ else remaining.push(b);
60
+ }
61
+ return { finalizedTip, remaining };
62
+ }
63
+
64
+ export const toLight = (h: RawHeader): Light => ({
65
+ number: h.number,
66
+ hash: h.hash,
67
+ parentHash: h.parentHash,
68
+ timestamp: h.timestamp,
69
+ });
70
+
71
+ // ─────────────────────────────── /stream I/O shell ───────────────────────────────
72
+
73
+ export type PortalRealtimeArgs = {
74
+ portalUrl: string;
75
+ headers: Record<string, string>;
76
+ /** first block to stream (exclusive of already-indexed finalized head): syncProgress.finalized.number + 1 */
77
+ fromBlock: number;
78
+ /** euler log filters (address/topics), already merged — passed straight into the Portal query */
79
+ logs: Array<Record<string, unknown>>;
80
+ /** the block header fields ponder needs */
81
+ blockFields?: Record<string, boolean>;
82
+ logFields?: Record<string, boolean>;
83
+ signal?: AbortSignal;
84
+ fetchImpl?: typeof fetch;
85
+ };
86
+
87
+ /**
88
+ * Stream fork-aware hot-blocks with `includeAllBlocks` (every header + filtered logs). Yields raw Portal
89
+ * batch objects `{ header, logs }`. Re-opens the stream from the last seen block on disconnect so it runs
90
+ * continuously; a reorg simply re-streams from the fork point (reconcile() detects it).
91
+ */
92
+ export async function* streamHotBlocks(
93
+ args: PortalRealtimeArgs,
94
+ ): AsyncGenerator<{ header: RawHeader; logs: any[] }> {
95
+ const fetchImpl = args.fetchImpl ?? fetch;
96
+ let cursor = args.fromBlock;
97
+ for (;;) {
98
+ if (args.signal?.aborted) return;
99
+ const body = JSON.stringify({
100
+ type: "evm",
101
+ fromBlock: cursor,
102
+ includeAllBlocks: true,
103
+ fields: {
104
+ block: args.blockFields ?? { number: true, hash: true, parentHash: true, timestamp: true },
105
+ log: args.logFields ?? { address: true, topics: true, data: true, logIndex: true, transactionHash: true, transactionIndex: true },
106
+ },
107
+ logs: args.logs,
108
+ });
109
+ let res: Response;
110
+ try {
111
+ res = await fetchImpl(`${args.portalUrl}/stream`, { method: "POST", headers: { "content-type": "application/json", ...args.headers }, body, signal: args.signal });
112
+ } catch {
113
+ await sleep(1000, args.signal);
114
+ continue;
115
+ }
116
+ if (res.status === 204 || !res.body) { await sleep(500, args.signal); continue; } // no hot data yet; re-poll
117
+ if (!res.ok) { await sleep(1000, args.signal); continue; }
118
+ const reader = res.body.getReader();
119
+ const dec = new TextDecoder();
120
+ let buf = "";
121
+ try {
122
+ for (;;) {
123
+ const { done, value } = await reader.read();
124
+ if (done) break;
125
+ buf += dec.decode(value, { stream: true });
126
+ let nl: number;
127
+ while ((nl = buf.indexOf("\n")) >= 0) {
128
+ const line = buf.slice(0, nl);
129
+ buf = buf.slice(nl + 1);
130
+ if (!line) continue;
131
+ const batch = JSON.parse(line);
132
+ if (batch?.header?.number != null) {
133
+ cursor = batch.header.number + 1; // resume past this block on reconnect
134
+ yield { header: batch.header, logs: batch.logs ?? [] };
135
+ }
136
+ }
137
+ }
138
+ } catch {
139
+ /* stream cut — reconnect from cursor */
140
+ }
141
+ await sleep(200, args.signal);
142
+ }
143
+ }
144
+
145
+ const sleep = (ms: number, signal?: AbortSignal) =>
146
+ new Promise<void>((resolve) => {
147
+ if (signal?.aborted) return resolve();
148
+ const t = setTimeout(resolve, ms);
149
+ signal?.addEventListener("abort", () => { clearTimeout(t); resolve(); }, { once: true });
150
+ });
151
+
152
+ // ─────────────────────────────── event producer ───────────────────────────────
153
+ // Emits ponder RealtimeSyncEvent-shaped objects. `finalizedHead()` polls the Portal finalized head so we
154
+ // can emit `finalize` events (the RPC RealtimeSync derives finality from confirmations; the Portal tells
155
+ // us directly). NB: the exact ponder BlockWithEventData construction (transactions/receipts/traces/
156
+ // childAddresses) is completed at the wiring step in runtime/realtime.ts, which already has the factory
157
+ // child-address maps + buildEvents; here we surface the block header + logs + reorg/finalize control flow.
158
+
159
+ export type PortalRealtimeEvent =
160
+ | { type: "block"; block: SyncBlockHeader; logs: SyncLog[]; hasMatchedFilter: boolean }
161
+ | { type: "reorg"; block: Light; reorgedBlocks: Light[] }
162
+ | { type: "finalize"; block: Light };
163
+
164
+ export async function* portalRealtimeEvents(
165
+ args: PortalRealtimeArgs & { finalizedHead: () => Promise<number | undefined>; finalizePollMs?: number },
166
+ ): AsyncGenerator<PortalRealtimeEvent> {
167
+ const unfinalized: Light[] = [];
168
+ let lastFinalizePoll = 0;
169
+ const pollMs = args.finalizePollMs ?? 4000;
170
+
171
+ for await (const { header, logs } of streamHotBlocks(args)) {
172
+ const light = toLight(header);
173
+ const r = reconcile(unfinalized, light);
174
+ if (r.kind === "duplicate") continue;
175
+ if (r.kind === "gap") {
176
+ // parent unknown: our window is behind a deeper reorg. Drop to a resync by clearing and continuing
177
+ // from this block (the finalized floor still protects already-committed data).
178
+ unfinalized.length = 0;
179
+ } else if (r.kind === "reorg") {
180
+ // trim the local chain and surface the rollback to the common ancestor
181
+ while (unfinalized.length && unfinalized[unfinalized.length - 1]!.number > r.commonAncestor.number) unfinalized.pop();
182
+ yield { type: "reorg", block: r.commonAncestor, reorgedBlocks: r.reorgedBlocks };
183
+ }
184
+ unfinalized.push(light);
185
+
186
+ const block = toSyncBlockHeader(header);
187
+ const syncLogs = logs.map((l) => toSyncLog(l, header));
188
+ yield { type: "block", block, logs: syncLogs, hasMatchedFilter: syncLogs.length > 0 };
189
+
190
+ // finalize on a cadence (cheap head probe), not every block
191
+ const now = Date.now();
192
+ if (now - lastFinalizePoll >= pollMs) {
193
+ lastFinalizePoll = now;
194
+ const fh = await args.finalizedHead().catch(() => undefined);
195
+ if (fh !== undefined) {
196
+ const { finalizedTip, remaining } = takeFinalized(unfinalized, fh);
197
+ if (finalizedTip) {
198
+ unfinalized.length = 0;
199
+ unfinalized.push(...remaining);
200
+ yield { type: "finalize", block: finalizedTip };
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+
207
+ export { hx as _hx };
208
+ export type { SyncBlockHeader, SyncLog, Hex };
209
+ export { hexToNumber };