tapimo 0.7.0 → 0.7.2

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 (689) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +151 -95
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +14377 -10165
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1231 -324
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  78. package/dist/apps/data/routes/fee-amm.js +59 -8
  79. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  80. package/dist/apps/data/routes/funding.d.ts +4092 -387
  81. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  82. package/dist/apps/data/routes/funding.js +1403 -256
  83. package/dist/apps/data/routes/funding.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +5 -5
  85. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  86. package/dist/apps/data/routes/indexer.js +19 -2
  87. package/dist/apps/data/routes/indexer.js.map +1 -1
  88. package/dist/apps/data/routes/receipts.d.ts +265 -265
  89. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  90. package/dist/apps/data/routes/receipts.js +11 -11
  91. package/dist/apps/data/routes/receipts.js.map +1 -1
  92. package/dist/apps/data/routes/rpc.d.ts +5 -5
  93. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  94. package/dist/apps/data/routes/rpc.js +211 -22
  95. package/dist/apps/data/routes/rpc.js.map +1 -1
  96. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  97. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  98. package/dist/apps/data/routes/tokenlist.js +49 -9
  99. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  100. package/dist/apps/data/routes/tokens.d.ts +116 -88
  101. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/tokens.js +198 -91
  103. package/dist/apps/data/routes/tokens.js.map +1 -1
  104. package/dist/apps/data/routes/transactions.d.ts +55 -55
  105. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  106. package/dist/apps/data/routes/transactions.js +78 -39
  107. package/dist/apps/data/routes/transactions.js.map +1 -1
  108. package/dist/apps/data/routes/transfers.d.ts +78 -29
  109. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  110. package/dist/apps/data/routes/transfers.js +165 -67
  111. package/dist/apps/data/routes/transfers.js.map +1 -1
  112. package/dist/apps/data/routes/valuation.d.ts +10 -10
  113. package/dist/apps/data/routes/valuation.js +2 -2
  114. package/dist/apps/data/routes/valuation.js.map +1 -1
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  116. package/dist/apps/data/routes/verified-tokens.js +34 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  118. package/dist/apps/data/routes/webhooks.d.ts +5 -3
  119. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  120. package/dist/apps/data/routes/webhooks.js +175 -65
  121. package/dist/apps/data/routes/webhooks.js.map +1 -1
  122. package/dist/apps/data/routes/zones.d.ts +281 -0
  123. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  124. package/dist/apps/data/routes/zones.js +252 -0
  125. package/dist/apps/data/routes/zones.js.map +1 -0
  126. package/dist/apps/docs/reference.js +6 -5
  127. package/dist/apps/docs/reference.js.map +1 -1
  128. package/dist/apps/index.d.ts +2 -1
  129. package/dist/apps/index.d.ts.map +1 -1
  130. package/dist/apps/index.js +2 -1
  131. package/dist/apps/index.js.map +1 -1
  132. package/dist/apps/management/App.d.ts +670 -670
  133. package/dist/apps/management/Billing.d.ts +8 -0
  134. package/dist/apps/management/Billing.d.ts.map +1 -1
  135. package/dist/apps/management/Billing.js +12 -0
  136. package/dist/apps/management/Billing.js.map +1 -1
  137. package/dist/apps/management/Error.d.ts +12 -0
  138. package/dist/apps/management/Error.d.ts.map +1 -0
  139. package/dist/apps/management/Error.js +10 -0
  140. package/dist/apps/management/Error.js.map +1 -0
  141. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  142. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  143. package/dist/apps/management/routes/api-keys.js +2 -8
  144. package/dist/apps/management/routes/api-keys.js.map +1 -1
  145. package/dist/apps/management/routes/billing.d.ts +119 -119
  146. package/dist/apps/management/routes/faucet.d.ts +35 -35
  147. package/dist/apps/management/routes/invitations.d.ts +62 -62
  148. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  149. package/dist/apps/management/routes/invitations.js +4 -10
  150. package/dist/apps/management/routes/invitations.js.map +1 -1
  151. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  152. package/dist/apps/management/routes/me.d.ts +6 -6
  153. package/dist/apps/management/routes/members.d.ts +78 -78
  154. package/dist/apps/management/routes/orgs.d.ts +48 -48
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +2 -8
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +9 -9
  159. package/dist/apps/management/routes/scopes.js +2 -2
  160. package/dist/apps/management/routes/scopes.js.map +1 -1
  161. package/dist/apps/management/routes/usage.d.ts +80 -80
  162. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  163. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  164. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  165. package/dist/apps/management/routes/webhooks.js +15 -3
  166. package/dist/apps/management/routes/webhooks.js.map +1 -1
  167. package/dist/apps/mpp/App.d.ts +55 -56
  168. package/dist/apps/mpp/App.d.ts.map +1 -1
  169. package/dist/apps/mpp/App.js +192 -27
  170. package/dist/apps/mpp/App.js.map +1 -1
  171. package/dist/apps/mpp/Mpp.d.ts +0 -20
  172. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  173. package/dist/apps/mpp/Mpp.js +0 -24
  174. package/dist/apps/mpp/Mpp.js.map +1 -1
  175. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  176. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  177. package/dist/apps/mpp/internal/Adapter.js +66 -0
  178. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  179. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  180. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  181. package/dist/apps/mpp/internal/Error.js +41 -0
  182. package/dist/apps/mpp/internal/Error.js.map +1 -0
  183. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  184. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  185. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  186. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  187. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  188. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  189. package/dist/apps/mpp/internal/Policy.js +57 -0
  190. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  191. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  192. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  193. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  194. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  195. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  196. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  197. package/dist/apps/mpp/internal/Screening.js +20 -0
  198. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  200. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  201. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  202. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  203. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  204. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  205. package/dist/apps/mpp/internal/Utils.js +24 -0
  206. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  207. package/dist/apps/relay/App.js +184 -24
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +16 -7
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/db/Db.d.ts +20 -0
  214. package/dist/db/Db.d.ts.map +1 -1
  215. package/dist/db/Db.js +342 -0
  216. package/dist/db/Db.js.map +1 -1
  217. package/dist/db/Schema.d.ts +921 -1
  218. package/dist/db/Schema.d.ts.map +1 -1
  219. package/dist/db/Schema.js +269 -1
  220. package/dist/db/Schema.js.map +1 -1
  221. package/dist/db/tables/earnVaults.d.ts +68 -0
  222. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  223. package/dist/db/tables/earnVaults.js +72 -0
  224. package/dist/db/tables/earnVaults.js.map +1 -0
  225. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  226. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  227. package/dist/db/tables/fundingCatalog.js +85 -0
  228. package/dist/db/tables/fundingCatalog.js.map +1 -0
  229. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  230. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  231. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  232. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  233. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  234. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  235. package/dist/db/tables/fundingDeposits.js +100 -0
  236. package/dist/db/tables/fundingDeposits.js.map +1 -0
  237. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  238. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  239. package/dist/db/tables/fundingIdempotency.js +103 -0
  240. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  241. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  242. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  243. package/dist/db/tables/fundingTransferEvents.js +18 -0
  244. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  245. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  246. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  247. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  248. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  249. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  250. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  251. package/dist/db/tables/fundingTransfers.js +89 -0
  252. package/dist/db/tables/fundingTransfers.js.map +1 -0
  253. package/dist/db/tables/organizations.d.ts +8 -0
  254. package/dist/db/tables/organizations.d.ts.map +1 -1
  255. package/dist/db/tables/organizations.js +35 -0
  256. package/dist/db/tables/organizations.js.map +1 -1
  257. package/dist/db/tables/projects.d.ts +8 -0
  258. package/dist/db/tables/projects.d.ts.map +1 -1
  259. package/dist/db/tables/projects.js +16 -0
  260. package/dist/db/tables/projects.js.map +1 -1
  261. package/dist/db/tables/requestUsage.d.ts +13 -0
  262. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  263. package/dist/db/tables/requestUsage.js +16 -0
  264. package/dist/db/tables/requestUsage.js.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
  266. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  267. package/dist/db/tables/sponsoredTransactions.js +14 -4
  268. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  269. package/dist/db/tables/users.d.ts +8 -0
  270. package/dist/db/tables/users.d.ts.map +1 -1
  271. package/dist/db/tables/users.js +16 -0
  272. package/dist/db/tables/users.js.map +1 -1
  273. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  274. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  275. package/dist/db/tables/verifiedTokens.js +9 -7
  276. package/dist/db/tables/verifiedTokens.js.map +1 -1
  277. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  278. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  279. package/dist/db/tables/webhookSubscriptions.js +24 -3
  280. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  281. package/dist/handlers/relay.js +108 -108
  282. package/dist/handlers/relay.js.map +1 -1
  283. package/dist/internal/Auth.d.ts +26 -0
  284. package/dist/internal/Auth.d.ts.map +1 -1
  285. package/dist/internal/Auth.js +35 -2
  286. package/dist/internal/Auth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts.map +1 -1
  288. package/dist/internal/Cache.js +16 -10
  289. package/dist/internal/Cache.js.map +1 -1
  290. package/dist/internal/Cursor.js +1 -1
  291. package/dist/internal/Cursor.js.map +1 -1
  292. package/dist/internal/EarnRates.d.ts +89 -0
  293. package/dist/internal/EarnRates.d.ts.map +1 -0
  294. package/dist/internal/EarnRates.js +266 -0
  295. package/dist/internal/EarnRates.js.map +1 -0
  296. package/dist/internal/EarnVaults.d.ts +171 -0
  297. package/dist/internal/EarnVaults.d.ts.map +1 -0
  298. package/dist/internal/EarnVaults.js +547 -0
  299. package/dist/internal/EarnVaults.js.map +1 -0
  300. package/dist/internal/EdgeCache.d.ts +9 -2
  301. package/dist/internal/EdgeCache.d.ts.map +1 -1
  302. package/dist/internal/EdgeCache.js +36 -9
  303. package/dist/internal/EdgeCache.js.map +1 -1
  304. package/dist/internal/Id.d.ts +11 -0
  305. package/dist/internal/Id.d.ts.map +1 -1
  306. package/dist/internal/Id.js +13 -0
  307. package/dist/internal/Id.js.map +1 -1
  308. package/dist/internal/Idempotency.d.ts +83 -0
  309. package/dist/internal/Idempotency.d.ts.map +1 -0
  310. package/dist/internal/Idempotency.js +113 -0
  311. package/dist/internal/Idempotency.js.map +1 -0
  312. package/dist/internal/Log.d.ts +64 -9
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +29 -7
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/MetricSink.d.ts.map +1 -1
  317. package/dist/internal/MetricSink.js +47 -1
  318. package/dist/internal/MetricSink.js.map +1 -1
  319. package/dist/internal/OpenApi.d.ts +1 -1
  320. package/dist/internal/OpenApi.d.ts.map +1 -1
  321. package/dist/internal/OpenApi.js +3 -0
  322. package/dist/internal/OpenApi.js.map +1 -1
  323. package/dist/internal/Provider.d.ts +14 -0
  324. package/dist/internal/Provider.d.ts.map +1 -0
  325. package/dist/internal/Provider.js +5 -0
  326. package/dist/internal/Provider.js.map +1 -0
  327. package/dist/internal/Schema.d.ts +8 -3
  328. package/dist/internal/Schema.d.ts.map +1 -1
  329. package/dist/internal/Schema.js +24 -13
  330. package/dist/internal/Schema.js.map +1 -1
  331. package/dist/internal/Store.d.ts +6 -0
  332. package/dist/internal/Store.d.ts.map +1 -1
  333. package/dist/internal/Store.js +35 -0
  334. package/dist/internal/Store.js.map +1 -1
  335. package/dist/internal/Tidx.d.ts +43 -24
  336. package/dist/internal/Tidx.d.ts.map +1 -1
  337. package/dist/internal/Tidx.js +79 -11
  338. package/dist/internal/Tidx.js.map +1 -1
  339. package/dist/internal/Viem.d.ts +82 -65
  340. package/dist/internal/Viem.d.ts.map +1 -1
  341. package/dist/internal/Viem.js +83 -12
  342. package/dist/internal/Viem.js.map +1 -1
  343. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  344. package/dist/internal/WebhookDestination.js +34 -28
  345. package/dist/internal/WebhookDestination.js.map +1 -1
  346. package/dist/internal/Webhooks.d.ts +9 -0
  347. package/dist/internal/Webhooks.d.ts.map +1 -1
  348. package/dist/internal/Webhooks.js +15 -10
  349. package/dist/internal/Webhooks.js.map +1 -1
  350. package/dist/internal/exchange/Provider.d.ts +219 -0
  351. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  352. package/dist/internal/exchange/Provider.js +117 -0
  353. package/dist/internal/exchange/Provider.js.map +1 -0
  354. package/dist/internal/exchange/index.d.ts +2 -0
  355. package/dist/internal/exchange/index.d.ts.map +1 -0
  356. package/dist/internal/exchange/index.js +2 -0
  357. package/dist/internal/exchange/index.js.map +1 -0
  358. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  359. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  360. package/dist/internal/exchange/providers/uniswap.js +553 -0
  361. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  362. package/dist/internal/funding/Action.d.ts +55 -0
  363. package/dist/internal/funding/Action.d.ts.map +1 -0
  364. package/dist/internal/funding/Action.js +74 -0
  365. package/dist/internal/funding/Action.js.map +1 -0
  366. package/dist/internal/funding/Catalog.d.ts +107 -0
  367. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  368. package/dist/internal/funding/Catalog.js +270 -0
  369. package/dist/internal/funding/Catalog.js.map +1 -0
  370. package/dist/internal/funding/Chain.d.ts +76 -0
  371. package/dist/internal/funding/Chain.d.ts.map +1 -0
  372. package/dist/internal/funding/Chain.js +38 -0
  373. package/dist/internal/funding/Chain.js.map +1 -0
  374. package/dist/internal/funding/Deposit.d.ts +366 -0
  375. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  376. package/dist/internal/funding/Deposit.js +286 -0
  377. package/dist/internal/funding/Deposit.js.map +1 -0
  378. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  379. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  380. package/dist/internal/funding/DepositAddress.js +189 -0
  381. package/dist/internal/funding/DepositAddress.js.map +1 -0
  382. package/dist/internal/funding/Evidence.d.ts +52 -0
  383. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  384. package/dist/internal/funding/Evidence.js +314 -0
  385. package/dist/internal/funding/Evidence.js.map +1 -0
  386. package/dist/internal/funding/Provider.d.ts +1186 -0
  387. package/dist/internal/funding/Provider.d.ts.map +1 -0
  388. package/dist/internal/funding/Provider.js +1081 -0
  389. package/dist/internal/funding/Provider.js.map +1 -0
  390. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  391. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  392. package/dist/internal/funding/Reconciliation.js +676 -0
  393. package/dist/internal/funding/Reconciliation.js.map +1 -0
  394. package/dist/internal/funding/Route.d.ts +21 -0
  395. package/dist/internal/funding/Route.d.ts.map +1 -0
  396. package/dist/internal/funding/Route.js +5 -0
  397. package/dist/internal/funding/Route.js.map +1 -0
  398. package/dist/internal/funding/Subsidy.d.ts +113 -0
  399. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  400. package/dist/internal/funding/Subsidy.js +138 -0
  401. package/dist/internal/funding/Subsidy.js.map +1 -0
  402. package/dist/internal/funding/Token.d.ts +41 -0
  403. package/dist/internal/funding/Token.d.ts.map +1 -0
  404. package/dist/internal/funding/Token.js +22 -0
  405. package/dist/internal/funding/Token.js.map +1 -0
  406. package/dist/internal/funding/Transfer.d.ts +643 -0
  407. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  408. package/dist/internal/funding/Transfer.js +332 -0
  409. package/dist/internal/funding/Transfer.js.map +1 -0
  410. package/dist/internal/funding/index.d.ts +13 -0
  411. package/dist/internal/funding/index.d.ts.map +1 -0
  412. package/dist/internal/funding/index.js +13 -0
  413. package/dist/internal/funding/index.js.map +1 -0
  414. package/dist/internal/funding/providers/across.d.ts +21 -0
  415. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  416. package/dist/internal/funding/providers/across.js +117 -0
  417. package/dist/internal/funding/providers/across.js.map +1 -0
  418. package/dist/internal/funding/providers/relay.d.ts +46 -0
  419. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  420. package/dist/internal/funding/providers/relay.js +464 -0
  421. package/dist/internal/funding/providers/relay.js.map +1 -0
  422. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  423. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  424. package/dist/internal/funding/providers/rhino.js +116 -0
  425. package/dist/internal/funding/providers/rhino.js.map +1 -0
  426. package/dist/internal/funding/providers/squid.d.ts +19 -0
  427. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  428. package/dist/internal/funding/providers/squid.js +120 -0
  429. package/dist/internal/funding/providers/squid.js.map +1 -0
  430. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  431. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  432. package/dist/internal/funding/providers/symbiosis.js +176 -0
  433. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  434. package/dist/internal/index.d.ts +5 -1
  435. package/dist/internal/index.d.ts.map +1 -1
  436. package/dist/internal/index.js +5 -1
  437. package/dist/internal/index.js.map +1 -1
  438. package/dist/internal/webhookDestinations/url.js +61 -57
  439. package/dist/internal/webhookDestinations/url.js.map +1 -1
  440. package/dist/providers/index.d.ts +43 -0
  441. package/dist/providers/index.d.ts.map +1 -0
  442. package/dist/providers/index.js +19 -0
  443. package/dist/providers/index.js.map +1 -0
  444. package/package.json +9 -4
  445. package/src/ApiKeys.test.ts +11 -7
  446. package/src/ApiKeys.ts +37 -9
  447. package/src/App.test.ts +85 -10
  448. package/src/App.ts +224 -137
  449. package/src/Assets.ts +29 -4
  450. package/src/Client.test-d.ts +650 -30
  451. package/src/Scope.test.ts +19 -0
  452. package/src/Scope.ts +28 -11
  453. package/src/Webhooks.test.ts +25 -0
  454. package/src/Webhooks.ts +1 -1
  455. package/src/admin/App.test.ts +9 -2
  456. package/src/admin/App.ts +32 -9
  457. package/src/admin/apps/api-keys.test.ts +167 -23
  458. package/src/admin/apps/api-keys.ts +166 -28
  459. package/src/admin/apps/earn-vaults.test.ts +338 -0
  460. package/src/admin/apps/earn-vaults.ts +572 -0
  461. package/src/admin/apps/scopes.test.ts +16 -1
  462. package/src/admin/ui/plugin.ts +2 -2
  463. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  464. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  465. package/src/admin/ui/src/components/Page.tsx +1 -1
  466. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  467. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  468. package/src/admin/ui/src/lib/client.ts +1 -1
  469. package/src/admin/ui/src/lib/config.ts +1 -1
  470. package/src/admin/ui/src/lib/early-access.ts +8 -9
  471. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  472. package/src/admin/ui/src/lib/format.ts +13 -0
  473. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  474. package/src/admin/ui/src/lib/organizations.ts +7 -1
  475. package/src/admin/ui/src/lib/response.ts +22 -0
  476. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  477. package/src/admin/ui/src/lib/scopes.ts +28 -7
  478. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  479. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  480. package/src/admin/ui/src/router.tsx +2 -2
  481. package/src/admin/ui/src/routes/__root.tsx +9 -8
  482. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  483. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  484. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  485. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  486. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  487. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  488. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  489. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  490. package/src/admin/ui/vite.config.ts +4 -1
  491. package/src/admin/ui.generated.ts +189 -95
  492. package/src/analytics/Analytics.test.ts +69 -10
  493. package/src/analytics/Analytics.ts +20 -1
  494. package/src/analytics/tables/requestEvents.ts +79 -37
  495. package/src/apps/Zones.test.ts +33 -0
  496. package/src/apps/Zones.ts +40 -0
  497. package/src/apps/composition.test.ts +84 -1
  498. package/src/apps/data/App.test.ts +38 -9
  499. package/src/apps/data/App.ts +96 -33
  500. package/src/apps/data/FxOracle.ts +1 -1
  501. package/src/apps/data/index.ts +0 -1
  502. package/src/apps/data/routes/activities.test.ts +82 -6
  503. package/src/apps/data/routes/activities.ts +131 -71
  504. package/src/apps/data/routes/balances.test.ts +50 -37
  505. package/src/apps/data/routes/balances.ts +5 -5
  506. package/src/apps/data/routes/blocks.test.ts +2 -0
  507. package/src/apps/data/routes/coingecko.test.ts +22 -0
  508. package/src/apps/data/routes/coingecko.ts +84 -48
  509. package/src/apps/data/routes/earn.test.ts +1108 -0
  510. package/src/apps/data/routes/earn.ts +1391 -0
  511. package/src/apps/data/routes/exchanges.test.ts +82 -33
  512. package/src/apps/data/routes/exchanges.ts +842 -227
  513. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  514. package/src/apps/data/routes/fee-amm.ts +69 -12
  515. package/src/apps/data/routes/funding.test.ts +2712 -221
  516. package/src/apps/data/routes/funding.ts +1604 -387
  517. package/src/apps/data/routes/indexer.test.ts +43 -34
  518. package/src/apps/data/routes/indexer.ts +19 -2
  519. package/src/apps/data/routes/receipts.test.ts +5 -3
  520. package/src/apps/data/routes/receipts.ts +13 -11
  521. package/src/apps/data/routes/rpc.test.ts +446 -28
  522. package/src/apps/data/routes/rpc.ts +243 -25
  523. package/src/apps/data/routes/tokenlist.test.ts +15 -0
  524. package/src/apps/data/routes/tokenlist.ts +88 -22
  525. package/src/apps/data/routes/tokens.ts +262 -86
  526. package/src/apps/data/routes/transactions.test.ts +2 -0
  527. package/src/apps/data/routes/transactions.ts +77 -42
  528. package/src/apps/data/routes/transfers.test.ts +166 -4
  529. package/src/apps/data/routes/transfers.ts +216 -78
  530. package/src/apps/data/routes/valuation.test.ts +62 -9
  531. package/src/apps/data/routes/valuation.ts +2 -2
  532. package/src/apps/data/routes/verified-tokens.test.ts +51 -0
  533. package/src/apps/data/routes/verified-tokens.ts +52 -15
  534. package/src/apps/data/routes/webhooks.test.ts +432 -33
  535. package/src/apps/data/routes/webhooks.ts +189 -79
  536. package/src/apps/data/routes/zones.test.ts +473 -0
  537. package/src/apps/data/routes/zones.ts +338 -0
  538. package/src/apps/docs/reference.ts +8 -6
  539. package/src/apps/index.ts +2 -1
  540. package/src/apps/management/Billing.test.ts +29 -0
  541. package/src/apps/management/Billing.ts +23 -0
  542. package/src/apps/management/Error.ts +12 -0
  543. package/src/apps/management/routes/api-keys.test.ts +5 -3
  544. package/src/apps/management/routes/api-keys.ts +2 -9
  545. package/src/apps/management/routes/invitations.ts +4 -11
  546. package/src/apps/management/routes/orgs.ts +2 -9
  547. package/src/apps/management/routes/scopes.test.ts +7 -2
  548. package/src/apps/management/routes/scopes.ts +2 -2
  549. package/src/apps/management/routes/webhooks.test.ts +6 -1
  550. package/src/apps/management/routes/webhooks.ts +15 -3
  551. package/src/apps/mpp/App.ts +276 -29
  552. package/src/apps/mpp/Mpp.test.ts +631 -26
  553. package/src/apps/mpp/Mpp.ts +0 -42
  554. package/src/apps/mpp/internal/Adapter.ts +108 -3
  555. package/src/apps/mpp/internal/Error.test.ts +33 -0
  556. package/src/apps/mpp/internal/Error.ts +44 -6
  557. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  558. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  559. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  560. package/src/apps/mpp/internal/Policy.ts +98 -0
  561. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  562. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  563. package/src/apps/mpp/internal/Screening.ts +40 -3
  564. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  565. package/src/apps/mpp/internal/Utils.ts +30 -0
  566. package/src/apps/relay/App.test.ts +495 -64
  567. package/src/apps/relay/App.ts +234 -24
  568. package/src/apps/relay/Sponsorships.test.ts +51 -0
  569. package/src/apps/relay/Sponsorships.ts +19 -7
  570. package/src/db/Db.ts +439 -0
  571. package/src/db/Schema.ts +325 -2
  572. package/src/db/tables/earnVaults.test.ts +185 -0
  573. package/src/db/tables/earnVaults.ts +151 -0
  574. package/src/db/tables/fundingCatalog.test.ts +108 -0
  575. package/src/db/tables/fundingCatalog.ts +157 -0
  576. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  577. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  578. package/src/db/tables/fundingDeposits.test.ts +261 -0
  579. package/src/db/tables/fundingDeposits.ts +229 -0
  580. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  581. package/src/db/tables/fundingIdempotency.ts +180 -0
  582. package/src/db/tables/fundingTransferEvents.ts +28 -0
  583. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  584. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  585. package/src/db/tables/fundingTransfers.test.ts +89 -0
  586. package/src/db/tables/fundingTransfers.ts +153 -0
  587. package/src/db/tables/organizations.test.ts +88 -0
  588. package/src/db/tables/organizations.ts +42 -1
  589. package/src/db/tables/projects.ts +16 -0
  590. package/src/db/tables/requestUsage.ts +23 -0
  591. package/src/db/tables/sponsoredTransactions.test.ts +52 -2
  592. package/src/db/tables/sponsoredTransactions.ts +18 -6
  593. package/src/db/tables/users.ts +16 -0
  594. package/src/db/tables/verifiedTokens.ts +19 -14
  595. package/src/db/tables/webhookSubscriptions.ts +58 -3
  596. package/src/handlers/relay.test.ts +2 -0
  597. package/src/handlers/relay.ts +95 -99
  598. package/src/internal/Auth.test.ts +48 -0
  599. package/src/internal/Auth.ts +61 -2
  600. package/src/internal/Cache.ts +13 -9
  601. package/src/internal/Cursor.test.ts +2 -2
  602. package/src/internal/Cursor.ts +1 -1
  603. package/src/internal/EarnRates.test.ts +125 -0
  604. package/src/internal/EarnRates.ts +409 -0
  605. package/src/internal/EarnVaults.test.ts +195 -0
  606. package/src/internal/EarnVaults.ts +876 -0
  607. package/src/internal/EdgeCache.test.ts +37 -5
  608. package/src/internal/EdgeCache.ts +39 -7
  609. package/src/internal/Id.ts +14 -0
  610. package/src/internal/Idempotency.test.ts +109 -0
  611. package/src/internal/Idempotency.ts +237 -0
  612. package/src/internal/Log.test-d.ts +41 -8
  613. package/src/internal/Log.test.ts +189 -8
  614. package/src/internal/Log.ts +124 -17
  615. package/src/internal/MetricSink.test.ts +244 -4
  616. package/src/internal/MetricSink.ts +51 -1
  617. package/src/internal/OpenApi.ts +3 -0
  618. package/src/internal/Provider.test.ts +17 -0
  619. package/src/internal/Provider.ts +17 -0
  620. package/src/internal/Schema.test.ts +13 -0
  621. package/src/internal/Schema.ts +41 -24
  622. package/src/internal/Store.test.ts +25 -0
  623. package/src/internal/Store.ts +46 -0
  624. package/src/internal/Tidx.local.test.ts +78 -3
  625. package/src/internal/Tidx.test.ts +212 -18
  626. package/src/internal/Tidx.ts +112 -32
  627. package/src/internal/VerifiedTokens.test.ts +15 -0
  628. package/src/internal/Viem.test.ts +170 -17
  629. package/src/internal/Viem.ts +111 -28
  630. package/src/internal/WebhookDestination.ts +25 -23
  631. package/src/internal/Webhooks.test.ts +59 -0
  632. package/src/internal/Webhooks.ts +34 -10
  633. package/src/internal/exchange/Provider.test.ts +216 -0
  634. package/src/internal/exchange/Provider.ts +326 -0
  635. package/src/internal/exchange/index.test.ts +6 -0
  636. package/src/internal/exchange/index.ts +1 -0
  637. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  638. package/src/internal/exchange/providers/uniswap.ts +682 -0
  639. package/src/internal/funding/Action.test.ts +138 -0
  640. package/src/internal/funding/Action.ts +117 -0
  641. package/src/internal/funding/Catalog.test.ts +311 -0
  642. package/src/internal/funding/Catalog.ts +347 -0
  643. package/src/internal/funding/Chain.test.ts +79 -0
  644. package/src/internal/funding/Chain.ts +120 -0
  645. package/src/internal/funding/Deposit.test.ts +26 -0
  646. package/src/internal/funding/Deposit.ts +453 -0
  647. package/src/internal/funding/DepositAddress.test.ts +18 -0
  648. package/src/internal/funding/DepositAddress.ts +312 -0
  649. package/src/internal/funding/Evidence.test.ts +297 -0
  650. package/src/internal/funding/Evidence.ts +430 -0
  651. package/src/internal/funding/Provider.test.ts +1328 -0
  652. package/src/internal/funding/Provider.ts +1796 -0
  653. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  654. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  655. package/src/internal/funding/Reconciliation.ts +930 -0
  656. package/src/internal/funding/Route.test.ts +66 -0
  657. package/src/internal/funding/Route.ts +29 -0
  658. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  659. package/src/internal/funding/Subsidy.test.ts +75 -0
  660. package/src/internal/funding/Subsidy.ts +260 -0
  661. package/src/internal/funding/Token.test.ts +47 -0
  662. package/src/internal/funding/Token.ts +59 -0
  663. package/src/internal/funding/Transfer.test.ts +369 -0
  664. package/src/internal/funding/Transfer.ts +522 -0
  665. package/src/internal/funding/index.test.ts +20 -0
  666. package/src/internal/funding/index.ts +12 -0
  667. package/src/internal/funding/providers/across.ts +149 -0
  668. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  669. package/src/internal/funding/providers/relay.test.ts +474 -0
  670. package/src/internal/funding/providers/relay.ts +559 -0
  671. package/src/internal/funding/providers/rhino.ts +139 -0
  672. package/src/internal/funding/providers/squid.ts +151 -0
  673. package/src/internal/funding/providers/symbiosis.ts +221 -0
  674. package/src/internal/index.test.ts +5 -1
  675. package/src/internal/index.ts +5 -1
  676. package/src/internal/webhookDestinations/url.ts +49 -45
  677. package/src/providers/index.test.ts +14 -0
  678. package/src/providers/index.ts +54 -0
  679. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  680. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  681. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  682. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  683. package/dist/internal/FundingQuotes.d.ts +0 -864
  684. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  685. package/dist/internal/FundingQuotes.js +0 -672
  686. package/dist/internal/FundingQuotes.js.map +0 -1
  687. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  688. package/src/internal/FundingQuotes.test.ts +0 -456
  689. package/src/internal/FundingQuotes.ts +0 -944
@@ -15,7 +15,7 @@ import type * as Tidx from '../../../internal/Tidx.js'
15
15
  import * as Ttl from '../../../internal/Ttl.js'
16
16
  import * as Value from '../../../internal/Value.js'
17
17
  import type * as Viem from '../../../internal/Viem.js'
18
- import type * as WebhookDestination from '../../../internal/WebhookDestination.js'
18
+ import * as WebhookDestination from '../../../internal/WebhookDestination.js'
19
19
  import * as Webhooks from '../../../internal/Webhooks.js'
20
20
  import * as Receipts from './receipts.js'
21
21
  import * as Transactions from './transactions.js'
@@ -1355,6 +1355,12 @@ export function webhooks(options: webhooks.Options = {}) {
1355
1355
  return Response.unsupportedChainId(c, chainId, supportedChainIds)
1356
1356
 
1357
1357
  try {
1358
+ // Preserve destination errors before the creation-time RPC dependency.
1359
+ WebhookDestination.assertDestination(body.destination)
1360
+ const maxPerOwner = webhook.maxPerOwner ?? defaultMaxPerOwner
1361
+ if ((await Webhooks.countSubscriptions(db, owner)) >= maxPerOwner)
1362
+ throw new Webhooks.LimitExceededError(maxPerOwner)
1363
+ const startBlockNumber = await getRpcHead(c.get('getClient')(chainId))
1358
1364
  const subscription = await Webhooks.createSubscription(
1359
1365
  db,
1360
1366
  {
@@ -1366,7 +1372,10 @@ export function webhooks(options: webhooks.Options = {}) {
1366
1372
  owner,
1367
1373
  ...(owner.type === 'mpp' ? { ttl: mppTtlMs } : {}),
1368
1374
  },
1369
- { maxPerOwner: webhook.maxPerOwner ?? defaultMaxPerOwner },
1375
+ {
1376
+ maxPerOwner,
1377
+ startBlockNumber,
1378
+ },
1370
1379
  )
1371
1380
  return c.json(
1372
1381
  Response.validated(schema.createWebhook.Response, toCreated(subscription)),
@@ -1878,18 +1887,17 @@ export declare namespace webhooks {
1878
1887
  * can equal it).
1879
1888
  */
1880
1889
  const endOfBlockIndex = 2_147_483_647
1890
+ const scanPageSize = 100
1881
1891
 
1882
1892
  /** A scanned row paired with its `(block, index)` keyset position. */
1883
1893
  type ScanItem = { cursor: readonly [number, number]; data: unknown }
1884
1894
 
1885
1895
  /**
1886
- * The result of scanning one subscription for a tick. Two flavours:
1896
+ * The result of scanning one subscription page. Two flavours:
1887
1897
  *
1888
- * - **window** (the RPC scanners): every block in the confirmed window was
1889
- * inspected in full, so `scannedThrough` is the highest block fully scanned.
1890
- * The poller advances the cursor to `(scannedThrough, endOfBlockIndex)` on a
1891
- * clean scan even when no rows matched — a rare-filter subscription never
1892
- * rescans the same empty range.
1898
+ * - **window** (the RPC scanners): `scannedThrough` is the highest block fully
1899
+ * scanned. A batch-limited page omits it, so the poller resumes after the last
1900
+ * dispatched row instead of skipping later matches.
1893
1901
  * - **keyset** (the TIDX legacy scanners): rows come back `LIMIT`-bounded, so
1894
1902
  * the page only reports whether `hasMore` rows remain past it; the poller
1895
1903
  * advances only past the last dispatched row (jumping to the window end only
@@ -1901,6 +1909,27 @@ type ScanPage = {
1901
1909
  scannedThrough?: number | undefined
1902
1910
  }
1903
1911
 
1912
+ /** Per-subscription state retained between fair scan passes. */
1913
+ type PollState = {
1914
+ cursor: string
1915
+ remaining: number
1916
+ safeBlock: number
1917
+ subscription: Webhooks.Subscription
1918
+ }
1919
+
1920
+ /** Returns `candidate` only when it is lexicographically after `current`. */
1921
+ function laterCursor(current: string, candidate: string): string {
1922
+ const before = Cursor.decode(current, ['int', 'int'])
1923
+ const after = Cursor.decode(candidate, ['int', 'int'])
1924
+ if (!after) return current
1925
+ if (!before) return candidate
1926
+ const [beforeBlock, beforeIndex] = before as [number, number]
1927
+ const [afterBlock, afterIndex] = after as [number, number]
1928
+ return afterBlock > beforeBlock || (afterBlock === beforeBlock && afterIndex > beforeIndex)
1929
+ ? candidate
1930
+ : current
1931
+ }
1932
+
1904
1933
  /**
1905
1934
  * Polls the chain over RPC for new events and dispatches a signed envelope per
1906
1935
  * matching row, advancing each active subscription's `(block, index)` keyset
@@ -1921,10 +1950,12 @@ type ScanPage = {
1921
1950
  *
1922
1951
  * Cursor advances only past successfully dispatched rows, so a dispatch failure
1923
1952
  * pauses that subscription at the last good position and the next tick resumes.
1953
+ * Scan failures leave that subscription unchanged; the first error is rethrown
1954
+ * after the remaining subscriptions run.
1924
1955
  */
1925
1956
  export async function poll(options: poll.Options): Promise<poll.Result> {
1926
1957
  const {
1927
- batchSize = 100,
1958
+ batchSize = 200,
1928
1959
  cache: cache_metadata = Store.memory(),
1929
1960
  chainId,
1930
1961
  client,
@@ -1967,80 +1998,134 @@ export async function poll(options: poll.Options): Promise<poll.Result> {
1967
1998
  scanned: 0,
1968
1999
  subscriptions: 0,
1969
2000
  }
2001
+ const scanErrors: unknown[] = []
1970
2002
 
1971
2003
  for (const eventType of eventTypes) {
1972
2004
  const legacy = eventType === 'token:transfer'
1973
2005
  const safeBlock = legacy ? Math.max(0, (await resolveTidxHead()) - confirmations) : rpcSafeBlock
1974
2006
  const subscriptions = await Webhooks.listActive(db, chainId, eventType)
2007
+ let states: PollState[] = []
1975
2008
  for (const subscription of subscriptions) {
1976
2009
  result.subscriptions++
1977
- const cursor = await Webhooks.getCursor(db, subscription.id)
2010
+ let cursor = await Webhooks.getCursor(db, subscription.id)
1978
2011
  if (cursor === null) {
1979
- // First time we've seen this subscription: anchor it at the head of the
1980
- // confirmed window so we never backfill from genesis. Events start
1981
- // flowing from the next tick onward.
1982
- await Webhooks.setCursor(db, subscription.id, Cursor.encode([safeBlock, endOfBlockIndex]))
2012
+ // Legacy subscriptions without a creation checkpoint anchor at the
2013
+ // current confirmed head, avoiding a genesis backfill.
2014
+ await Webhooks.compareAndSetCursor(db, {
2015
+ cursor: Cursor.encode([safeBlock, endOfBlockIndex]),
2016
+ expectedCursor: null,
2017
+ subscriptionId: subscription.id,
2018
+ })
1983
2019
  continue
1984
2020
  }
1985
- const page = await scanSubscription({
1986
- batchSize,
1987
- cache,
1988
- client,
2021
+ const checkpoint = Cursor.decode(cursor, ['int'])
2022
+ if (checkpoint) {
2023
+ // Creation checkpoints record the live head without finalizing it. Rebase
2024
+ // to this poller's confirmed boundary so replacement blocks stay eligible.
2025
+ const confirmedCursor = Cursor.encode([
2026
+ Math.max(0, (checkpoint[0] as number) - confirmations),
2027
+ endOfBlockIndex,
2028
+ ])
2029
+ const committed = await Webhooks.compareAndSetCursor(db, {
2030
+ cursor: confirmedCursor,
2031
+ expectedCursor: cursor,
2032
+ subscriptionId: subscription.id,
2033
+ })
2034
+ if (!committed) continue
2035
+ cursor = confirmedCursor
2036
+ }
2037
+ const window = legacy ? undefined : scanWindow(cursor, safeBlock, maxBlocks)
2038
+ states.push({
1989
2039
  cursor,
1990
- maxBlocks,
1991
- safeBlock,
2040
+ remaining: batchSize,
2041
+ safeBlock: window?.to ?? safeBlock,
1992
2042
  subscription,
1993
- tidx,
1994
2043
  })
1995
- result.scanned += page.items.length
1996
-
1997
- let accepted: readonly [number, number] | undefined
1998
- let failed = false
1999
- for (const item of page.items) {
2000
- // Token metadata is best-effort for webhooks: transfers use it for display,
2001
- // while transactions expose fee-token references without blocking delivery.
2002
- const data =
2003
- eventType === 'token:transfer'
2004
- ? await withTokenMetadata(item.data, { cache: cache_metadata, chainId, client })
2005
- : eventType === 'transaction:included'
2006
- ? await withFeeTokenMetadata(item.data, { cache: cache_metadata, chainId, client })
2007
- : item.data
2008
- const envelope = Webhooks.buildEnvelope({
2009
- blockNumber: item.cursor[0],
2010
- createdAt: now(),
2011
- data,
2012
- logIndex: item.cursor[1],
2013
- subscription,
2014
- })
2015
- const delivered = await dispatch({ envelope, subscription })
2016
- if (!delivered.ok) {
2017
- result.failed++
2018
- failed = true
2019
- break
2044
+ }
2045
+
2046
+ // Every subscription gets one bounded page before any subscription gets a
2047
+ // continuation page, preserving fairness while allowing catch-up.
2048
+ while (states.length > 0) {
2049
+ const continuations: PollState[] = []
2050
+ for (const state of states) {
2051
+ const { subscription } = state
2052
+ let page: ScanPage
2053
+ try {
2054
+ page = await scanSubscription({
2055
+ batchSize: Math.min(scanPageSize, state.remaining),
2056
+ cache,
2057
+ client,
2058
+ cursor: state.cursor,
2059
+ maxBlocks,
2060
+ safeBlock: state.safeBlock,
2061
+ subscription,
2062
+ tidx,
2063
+ })
2064
+ } catch (error) {
2065
+ scanErrors.push(error)
2066
+ continue
2067
+ }
2068
+ result.scanned += page.items.length
2069
+ state.remaining -= page.items.length
2070
+
2071
+ let accepted: readonly [number, number] | undefined
2072
+ let failed = false
2073
+ for (const item of page.items) {
2074
+ // Token metadata is best-effort for webhooks: transfers use it for display,
2075
+ // while transactions expose fee-token references without blocking delivery.
2076
+ const data =
2077
+ eventType === 'token:transfer'
2078
+ ? await withTokenMetadata(item.data, { cache: cache_metadata, chainId, client })
2079
+ : eventType === 'transaction:included'
2080
+ ? await withFeeTokenMetadata(item.data, { cache: cache_metadata, chainId, client })
2081
+ : item.data
2082
+ const envelope = Webhooks.buildEnvelope({
2083
+ blockNumber: item.cursor[0],
2084
+ createdAt: now(),
2085
+ data,
2086
+ logIndex: item.cursor[1],
2087
+ subscription,
2088
+ })
2089
+ const delivered = await dispatch({ envelope, subscription })
2090
+ if (!delivered.ok) {
2091
+ result.failed++
2092
+ failed = true
2093
+ break
2094
+ }
2095
+ accepted = item.cursor
2096
+ result.dispatched++
2020
2097
  }
2021
- accepted = item.cursor
2022
- result.dispatched++
2023
- }
2024
2098
 
2025
- // Advance the high-water mark. On a dispatch failure, stop at the last
2026
- // accepted row so the failed one retries next tick. Otherwise: window
2027
- // scanners jump to the end of the fully-scanned range (even with zero
2028
- // matches); keyset scanners advance past the last dispatched row, or — on
2029
- // a complete empty page to the end of the confirmed window.
2030
- if (failed) {
2031
- if (accepted) await Webhooks.setCursor(db, subscription.id, Cursor.encode([...accepted]))
2032
- } else if (page.scannedThrough !== undefined)
2033
- await Webhooks.setCursor(
2034
- db,
2035
- subscription.id,
2036
- Cursor.encode([page.scannedThrough, endOfBlockIndex]),
2037
- )
2038
- else if (accepted) await Webhooks.setCursor(db, subscription.id, Cursor.encode([...accepted]))
2039
- else if (!page.hasMore)
2040
- await Webhooks.setCursor(db, subscription.id, Cursor.encode([safeBlock, endOfBlockIndex]))
2099
+ // Persist every accepted page before another subscription begins its
2100
+ // continuation, so a later scan failure retains completed work.
2101
+ const candidate = (() => {
2102
+ if (failed) return accepted ? Cursor.encode([...accepted]) : undefined
2103
+ if (page.scannedThrough !== undefined)
2104
+ return Cursor.encode([page.scannedThrough, endOfBlockIndex])
2105
+ if (accepted) return Cursor.encode([...accepted])
2106
+ if (!page.hasMore) return Cursor.encode([state.safeBlock, endOfBlockIndex])
2107
+ return undefined
2108
+ })()
2109
+ const cursor = candidate ? laterCursor(state.cursor, candidate) : state.cursor
2110
+ const progressed = cursor !== state.cursor
2111
+ let committed = false
2112
+ if (progressed) {
2113
+ committed = await Webhooks.compareAndSetCursor(db, {
2114
+ cursor,
2115
+ expectedCursor: state.cursor,
2116
+ subscriptionId: subscription.id,
2117
+ })
2118
+ if (committed) state.cursor = cursor
2119
+ }
2120
+
2121
+ if (!failed && page.hasMore === true && committed && state.remaining > 0)
2122
+ continuations.push(state)
2123
+ }
2124
+ states = continuations
2041
2125
  }
2042
2126
  }
2043
2127
 
2128
+ if (scanErrors.length > 0) throw scanErrors[0]
2044
2129
  return result
2045
2130
  }
2046
2131
 
@@ -2054,7 +2139,7 @@ export declare namespace poll {
2054
2139
  }
2055
2140
  /** Options for {@link poll}. */
2056
2141
  type Options = {
2057
- /** Max matching rows scanned per subscription per tick (default 100). */
2142
+ /** Max matching rows scanned per subscription per tick (default 200). */
2058
2143
  batchSize?: number | undefined
2059
2144
  /** Cache store for the token-metadata memoize (defaults to a fresh in-memory store; pass a persistent one to share lookups across ticks). */
2060
2145
  cache?: Store.Store | undefined
@@ -2269,6 +2354,7 @@ async function scanSubscription(options: {
2269
2354
 
2270
2355
  if (subscription.eventType === 'log:emitted')
2271
2356
  return scanLogs({
2357
+ batchSize,
2272
2358
  cache,
2273
2359
  client,
2274
2360
  cursor,
@@ -2279,6 +2365,7 @@ async function scanSubscription(options: {
2279
2365
 
2280
2366
  if (subscription.eventType === 'block:created')
2281
2367
  return scanBlocks({
2368
+ batchSize,
2282
2369
  cache,
2283
2370
  cursor,
2284
2371
  filters: parseFilters('block:created', subscription.filters),
@@ -2288,6 +2375,7 @@ async function scanSubscription(options: {
2288
2375
 
2289
2376
  if (subscription.eventType === 'transaction:included')
2290
2377
  return scanTxs({
2378
+ batchSize,
2291
2379
  cache,
2292
2380
  cursor,
2293
2381
  filters: parseFilters('transaction:included', subscription.filters),
@@ -2302,6 +2390,9 @@ async function scanSubscription(options: {
2302
2390
  { tidx },
2303
2391
  { chainId, cursor, limit: batchSize, order: 'asc', toBlock: safeBlock, ...filters },
2304
2392
  )
2393
+ // A cap-truncated fallback sample is an arbitrary subset: dispatching it
2394
+ // would advance the cursor past unseen matches. Hold position and retry.
2395
+ if (page.capped) return { hasMore: true, items: [] }
2305
2396
  return { hasMore: page.hasMore, items: page.items }
2306
2397
  }
2307
2398
 
@@ -2485,7 +2576,7 @@ type RpcBlock = Awaited<ReturnType<Viem.getClient.ReturnType['getBlock']>>
2485
2576
  /** Per-tick lazy cache of fetched block headers, full blocks, and receipts. */
2486
2577
  type ChainCache = {
2487
2578
  /** Full raw block (with transactions) via `eth_getBlockByNumber(n, true)`. */
2488
- block(n: number): Promise<Record<string, unknown> | undefined>
2579
+ block(n: number): Promise<Record<string, unknown>>
2489
2580
  /** Viem-formatted block header (transaction hashes only) via `getBlock`. */
2490
2581
  header(n: number): Promise<RpcBlock | undefined>
2491
2582
  /** Receipts for a block keyed by lowercased transaction hash. */
@@ -2495,7 +2586,7 @@ type ChainCache = {
2495
2586
  /** Builds a per-tick {@link ChainCache} bound to a viem client. */
2496
2587
  function createChainCache(client: Viem.getClient.ReturnType): ChainCache {
2497
2588
  const headers = new Map<number, Promise<RpcBlock | undefined>>()
2498
- const blocks = new Map<number, Promise<Record<string, unknown> | undefined>>()
2589
+ const blocks = new Map<number, Promise<Record<string, unknown>>>()
2499
2590
  const receipts = new Map<number, Promise<Map<string, Record<string, unknown>>>>()
2500
2591
  return {
2501
2592
  block(n) {
@@ -2506,7 +2597,10 @@ function createChainCache(client: Viem.getClient.ReturnType): ChainCache {
2506
2597
  p = rpc<Record<string, unknown> | null>(client, 'eth_getBlockByNumber', [
2507
2598
  blockTag(n),
2508
2599
  true,
2509
- ]).then((b) => b ?? undefined)
2600
+ ]).then((block) => {
2601
+ if (!block) throw new BlockUnavailableError(n)
2602
+ return block
2603
+ })
2510
2604
  blocks.set(n, p)
2511
2605
  }
2512
2606
  return p
@@ -2514,9 +2608,7 @@ function createChainCache(client: Viem.getClient.ReturnType): ChainCache {
2514
2608
  header(n) {
2515
2609
  let p = headers.get(n)
2516
2610
  if (!p) {
2517
- p = client
2518
- .getBlock({ blockNumber: BigInt(n), includeTransactions: false })
2519
- .catch(() => undefined)
2611
+ p = client.getBlock({ blockNumber: BigInt(n), includeTransactions: false })
2520
2612
  headers.set(n, p)
2521
2613
  }
2522
2614
  return p
@@ -2744,6 +2836,7 @@ function decodeScanLog(log: ScanLog, event: AbiEvent): ScanLog {
2744
2836
  * all operators are re-checked in JS over the narrow window.
2745
2837
  */
2746
2838
  async function scanLogs(options: {
2839
+ batchSize: number
2747
2840
  cache: ChainCache
2748
2841
  client: Viem.getClient.ReturnType
2749
2842
  cursor: string | undefined
@@ -2751,7 +2844,7 @@ async function scanLogs(options: {
2751
2844
  maxBlocks: number
2752
2845
  safeBlock: number
2753
2846
  }): Promise<ScanPage> {
2754
- const { cache, client, cursor, filters, maxBlocks, safeBlock } = options
2847
+ const { batchSize, cache, client, cursor, filters, maxBlocks, safeBlock } = options
2755
2848
  const f = filters as z.output<typeof schema.LogFilters>
2756
2849
  const window = scanWindow(cursor, safeBlock, maxBlocks)
2757
2850
  if (!window) return { items: [], scannedThrough: undefined }
@@ -2807,7 +2900,10 @@ async function scanLogs(options: {
2807
2900
  const header = await cache.header(blockNumber)
2808
2901
  const timestamp = blockIso(header)
2809
2902
  const data = toLogEvent(log, timestamp, f.signature, event)
2810
- if (data) items.push({ cursor: [data.blockNumber, data.logIndex], data })
2903
+ if (data) {
2904
+ items.push({ cursor: [data.blockNumber, data.logIndex], data })
2905
+ if (items.length >= batchSize) return { hasMore: true, items }
2906
+ }
2811
2907
  }
2812
2908
  return { items, scannedThrough: window.to }
2813
2909
  }
@@ -2908,13 +3004,14 @@ function toBlockEvent(block: RpcBlock): BlockEventData | undefined {
2908
3004
  * empty filter is a per-block heartbeat.
2909
3005
  */
2910
3006
  async function scanBlocks(options: {
3007
+ batchSize: number
2911
3008
  cache: ChainCache
2912
3009
  cursor: string | undefined
2913
3010
  filters: Record<string, unknown>
2914
3011
  maxBlocks: number
2915
3012
  safeBlock: number
2916
3013
  }): Promise<ScanPage> {
2917
- const { cache, cursor, filters, maxBlocks, safeBlock } = options
3014
+ const { batchSize, cache, cursor, filters, maxBlocks, safeBlock } = options
2918
3015
  const f = filters as z.output<typeof schema.BlockFilters>
2919
3016
  const window = scanWindow(cursor, safeBlock, maxBlocks)
2920
3017
  if (!window) return { items: [], scannedThrough: undefined }
@@ -2926,7 +3023,10 @@ async function scanBlocks(options: {
2926
3023
  if (!block) continue
2927
3024
  if (!matchesBlock(block, f)) continue
2928
3025
  const data = toBlockEvent(block)
2929
- if (data) items.push({ cursor: [data.number, 0], data })
3026
+ if (data) {
3027
+ items.push({ cursor: [data.number, 0], data })
3028
+ if (items.length >= batchSize) return { hasMore: true, items }
3029
+ }
2930
3030
  }
2931
3031
  return { items, scannedThrough: window.to }
2932
3032
  }
@@ -2979,13 +3079,14 @@ const txFields = {
2979
3079
  * poller then resolves its fee-token references.
2980
3080
  */
2981
3081
  async function scanTxs(options: {
3082
+ batchSize: number
2982
3083
  cache: ChainCache
2983
3084
  cursor: string | undefined
2984
3085
  filters: Record<string, unknown>
2985
3086
  maxBlocks: number
2986
3087
  safeBlock: number
2987
3088
  }): Promise<ScanPage> {
2988
- const { cache, cursor, filters, maxBlocks, safeBlock } = options
3089
+ const { batchSize, cache, cursor, filters, maxBlocks, safeBlock } = options
2989
3090
  const f = filters as z.output<typeof schema.TxFilters>
2990
3091
  const window = scanWindow(cursor, safeBlock, maxBlocks)
2991
3092
  if (!window) return { items: [], scannedThrough: undefined }
@@ -2999,10 +3100,10 @@ async function scanTxs(options: {
2999
3100
  const items: ScanItem[] = []
3000
3101
  for (let n = window.from; n <= window.to; n++) {
3001
3102
  const block = await cache.block(n)
3002
- const txs = Array.isArray(block?.['transactions']) ? (block!['transactions'] as unknown[]) : []
3103
+ const txs = Array.isArray(block['transactions']) ? (block['transactions'] as unknown[]) : []
3003
3104
  if (txs.length === 0) continue
3004
3105
  const receipts = needsReceipt || includeReceipt ? await cache.receipts(n) : undefined
3005
- const timestamp = asString(block?.['timestamp'])
3106
+ const timestamp = asString(block['timestamp'])
3006
3107
 
3007
3108
  for (let i = 0; i < txs.length; i++) {
3008
3109
  const tx = txs[i] as Record<string, unknown>
@@ -3028,6 +3129,7 @@ async function scanTxs(options: {
3028
3129
  }
3029
3130
  }
3030
3131
  items.push({ cursor: [n, index], data })
3132
+ if (items.length >= batchSize) return { hasMore: true, items }
3031
3133
  }
3032
3134
  }
3033
3135
  return { items, scannedThrough: window.to }
@@ -3195,3 +3297,11 @@ function unauthorized(c: Context<App.Environment>) {
3195
3297
  status: 401,
3196
3298
  })
3197
3299
  }
3300
+
3301
+ class BlockUnavailableError extends Error {
3302
+ override name = 'Webhooks.BlockUnavailableError'
3303
+
3304
+ constructor(blockNumber: number) {
3305
+ super(`Block ${blockNumber} is unavailable.`)
3306
+ }
3307
+ }