tapimo 0.7.1 → 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 (681) 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 +99 -43
  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 +12125 -7913
  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 +1625 -718
  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 +108 -108
  78. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  79. package/dist/apps/data/routes/fee-amm.js +59 -8
  80. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  81. package/dist/apps/data/routes/funding.d.ts +4092 -387
  82. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  83. package/dist/apps/data/routes/funding.js +1403 -256
  84. package/dist/apps/data/routes/funding.js.map +1 -1
  85. package/dist/apps/data/routes/indexer.d.ts +30 -30
  86. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  87. package/dist/apps/data/routes/indexer.js +19 -2
  88. package/dist/apps/data/routes/indexer.js.map +1 -1
  89. package/dist/apps/data/routes/receipts.d.ts +263 -263
  90. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  91. package/dist/apps/data/routes/receipts.js +11 -11
  92. package/dist/apps/data/routes/receipts.js.map +1 -1
  93. package/dist/apps/data/routes/rpc.d.ts +5 -5
  94. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  95. package/dist/apps/data/routes/rpc.js +211 -22
  96. package/dist/apps/data/routes/rpc.js.map +1 -1
  97. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  98. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  99. package/dist/apps/data/routes/tokenlist.js +39 -8
  100. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  101. package/dist/apps/data/routes/tokens.d.ts +114 -86
  102. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokens.js +194 -91
  104. package/dist/apps/data/routes/tokens.js.map +1 -1
  105. package/dist/apps/data/routes/transactions.d.ts +53 -53
  106. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  107. package/dist/apps/data/routes/transactions.js +78 -39
  108. package/dist/apps/data/routes/transactions.js.map +1 -1
  109. package/dist/apps/data/routes/transfers.d.ts +76 -27
  110. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transfers.js +165 -67
  112. package/dist/apps/data/routes/transfers.js.map +1 -1
  113. package/dist/apps/data/routes/valuation.d.ts +42 -42
  114. package/dist/apps/data/routes/valuation.js +2 -2
  115. package/dist/apps/data/routes/valuation.js.map +1 -1
  116. package/dist/apps/data/routes/webhooks.d.ts +369 -367
  117. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  118. package/dist/apps/data/routes/webhooks.js +161 -59
  119. package/dist/apps/data/routes/webhooks.js.map +1 -1
  120. package/dist/apps/data/routes/zones.d.ts +281 -0
  121. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  122. package/dist/apps/data/routes/zones.js +252 -0
  123. package/dist/apps/data/routes/zones.js.map +1 -0
  124. package/dist/apps/docs/reference.js +6 -5
  125. package/dist/apps/docs/reference.js.map +1 -1
  126. package/dist/apps/index.d.ts +2 -1
  127. package/dist/apps/index.d.ts.map +1 -1
  128. package/dist/apps/index.js +2 -1
  129. package/dist/apps/index.js.map +1 -1
  130. package/dist/apps/management/App.d.ts +670 -670
  131. package/dist/apps/management/Billing.d.ts +8 -0
  132. package/dist/apps/management/Billing.d.ts.map +1 -1
  133. package/dist/apps/management/Billing.js +12 -0
  134. package/dist/apps/management/Billing.js.map +1 -1
  135. package/dist/apps/management/Error.d.ts +12 -0
  136. package/dist/apps/management/Error.d.ts.map +1 -0
  137. package/dist/apps/management/Error.js +10 -0
  138. package/dist/apps/management/Error.js.map +1 -0
  139. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  140. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  141. package/dist/apps/management/routes/api-keys.js +2 -8
  142. package/dist/apps/management/routes/api-keys.js.map +1 -1
  143. package/dist/apps/management/routes/billing.d.ts +119 -119
  144. package/dist/apps/management/routes/faucet.d.ts +2 -2
  145. package/dist/apps/management/routes/invitations.d.ts +62 -62
  146. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  147. package/dist/apps/management/routes/invitations.js +4 -10
  148. package/dist/apps/management/routes/invitations.js.map +1 -1
  149. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  150. package/dist/apps/management/routes/me.d.ts +6 -6
  151. package/dist/apps/management/routes/members.d.ts +2 -2
  152. package/dist/apps/management/routes/orgs.d.ts +48 -48
  153. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  154. package/dist/apps/management/routes/orgs.js +2 -8
  155. package/dist/apps/management/routes/orgs.js.map +1 -1
  156. package/dist/apps/management/routes/projects.d.ts +9 -9
  157. package/dist/apps/management/routes/scopes.js +2 -2
  158. package/dist/apps/management/routes/scopes.js.map +1 -1
  159. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  160. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  161. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  162. package/dist/apps/management/routes/webhooks.js +15 -3
  163. package/dist/apps/management/routes/webhooks.js.map +1 -1
  164. package/dist/apps/mpp/App.d.ts +55 -56
  165. package/dist/apps/mpp/App.d.ts.map +1 -1
  166. package/dist/apps/mpp/App.js +192 -27
  167. package/dist/apps/mpp/App.js.map +1 -1
  168. package/dist/apps/mpp/Mpp.d.ts +0 -20
  169. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  170. package/dist/apps/mpp/Mpp.js +0 -24
  171. package/dist/apps/mpp/Mpp.js.map +1 -1
  172. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  173. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  174. package/dist/apps/mpp/internal/Adapter.js +66 -0
  175. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  176. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  177. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  178. package/dist/apps/mpp/internal/Error.js +41 -0
  179. package/dist/apps/mpp/internal/Error.js.map +1 -0
  180. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  181. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  182. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  183. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  184. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  185. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  186. package/dist/apps/mpp/internal/Policy.js +57 -0
  187. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  188. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  189. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  190. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  191. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  192. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  193. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  194. package/dist/apps/mpp/internal/Screening.js +20 -0
  195. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  196. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  197. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  198. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  199. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  200. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  201. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  202. package/dist/apps/mpp/internal/Utils.js +24 -0
  203. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  204. package/dist/apps/relay/App.js +183 -23
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  208. package/dist/apps/relay/Sponsorships.js +15 -6
  209. package/dist/apps/relay/Sponsorships.js.map +1 -1
  210. package/dist/db/Db.d.ts +20 -0
  211. package/dist/db/Db.d.ts.map +1 -1
  212. package/dist/db/Db.js +342 -0
  213. package/dist/db/Db.js.map +1 -1
  214. package/dist/db/Schema.d.ts +921 -1
  215. package/dist/db/Schema.d.ts.map +1 -1
  216. package/dist/db/Schema.js +269 -1
  217. package/dist/db/Schema.js.map +1 -1
  218. package/dist/db/tables/earnVaults.d.ts +68 -0
  219. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  220. package/dist/db/tables/earnVaults.js +72 -0
  221. package/dist/db/tables/earnVaults.js.map +1 -0
  222. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  223. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  224. package/dist/db/tables/fundingCatalog.js +85 -0
  225. package/dist/db/tables/fundingCatalog.js.map +1 -0
  226. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  227. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  228. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  229. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  230. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  231. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  232. package/dist/db/tables/fundingDeposits.js +100 -0
  233. package/dist/db/tables/fundingDeposits.js.map +1 -0
  234. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  235. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  236. package/dist/db/tables/fundingIdempotency.js +103 -0
  237. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  238. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  239. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  240. package/dist/db/tables/fundingTransferEvents.js +18 -0
  241. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  242. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  243. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  244. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  245. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  246. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  247. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  248. package/dist/db/tables/fundingTransfers.js +89 -0
  249. package/dist/db/tables/fundingTransfers.js.map +1 -0
  250. package/dist/db/tables/organizations.d.ts +8 -0
  251. package/dist/db/tables/organizations.d.ts.map +1 -1
  252. package/dist/db/tables/organizations.js +16 -0
  253. package/dist/db/tables/organizations.js.map +1 -1
  254. package/dist/db/tables/projects.d.ts +8 -0
  255. package/dist/db/tables/projects.d.ts.map +1 -1
  256. package/dist/db/tables/projects.js +16 -0
  257. package/dist/db/tables/projects.js.map +1 -1
  258. package/dist/db/tables/requestUsage.d.ts +13 -0
  259. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  260. package/dist/db/tables/requestUsage.js +16 -0
  261. package/dist/db/tables/requestUsage.js.map +1 -1
  262. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  263. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  264. package/dist/db/tables/sponsoredTransactions.js +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  266. package/dist/db/tables/users.d.ts +8 -0
  267. package/dist/db/tables/users.d.ts.map +1 -1
  268. package/dist/db/tables/users.js +16 -0
  269. package/dist/db/tables/users.js.map +1 -1
  270. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  271. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  272. package/dist/db/tables/verifiedTokens.js +9 -7
  273. package/dist/db/tables/verifiedTokens.js.map +1 -1
  274. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  275. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  276. package/dist/db/tables/webhookSubscriptions.js +24 -3
  277. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  278. package/dist/handlers/relay.js +108 -108
  279. package/dist/handlers/relay.js.map +1 -1
  280. package/dist/internal/Auth.d.ts +26 -0
  281. package/dist/internal/Auth.d.ts.map +1 -1
  282. package/dist/internal/Auth.js +35 -2
  283. package/dist/internal/Auth.js.map +1 -1
  284. package/dist/internal/Cache.d.ts.map +1 -1
  285. package/dist/internal/Cache.js +16 -10
  286. package/dist/internal/Cache.js.map +1 -1
  287. package/dist/internal/Cursor.js +1 -1
  288. package/dist/internal/Cursor.js.map +1 -1
  289. package/dist/internal/EarnRates.d.ts +89 -0
  290. package/dist/internal/EarnRates.d.ts.map +1 -0
  291. package/dist/internal/EarnRates.js +266 -0
  292. package/dist/internal/EarnRates.js.map +1 -0
  293. package/dist/internal/EarnVaults.d.ts +171 -0
  294. package/dist/internal/EarnVaults.d.ts.map +1 -0
  295. package/dist/internal/EarnVaults.js +547 -0
  296. package/dist/internal/EarnVaults.js.map +1 -0
  297. package/dist/internal/EdgeCache.d.ts +8 -1
  298. package/dist/internal/EdgeCache.d.ts.map +1 -1
  299. package/dist/internal/EdgeCache.js +33 -7
  300. package/dist/internal/EdgeCache.js.map +1 -1
  301. package/dist/internal/Id.d.ts +11 -0
  302. package/dist/internal/Id.d.ts.map +1 -1
  303. package/dist/internal/Id.js +13 -0
  304. package/dist/internal/Id.js.map +1 -1
  305. package/dist/internal/Idempotency.d.ts +83 -0
  306. package/dist/internal/Idempotency.d.ts.map +1 -0
  307. package/dist/internal/Idempotency.js +113 -0
  308. package/dist/internal/Idempotency.js.map +1 -0
  309. package/dist/internal/Log.d.ts +64 -9
  310. package/dist/internal/Log.d.ts.map +1 -1
  311. package/dist/internal/Log.js +29 -7
  312. package/dist/internal/Log.js.map +1 -1
  313. package/dist/internal/MetricSink.d.ts.map +1 -1
  314. package/dist/internal/MetricSink.js +47 -1
  315. package/dist/internal/MetricSink.js.map +1 -1
  316. package/dist/internal/OpenApi.d.ts +1 -1
  317. package/dist/internal/OpenApi.d.ts.map +1 -1
  318. package/dist/internal/OpenApi.js +3 -0
  319. package/dist/internal/OpenApi.js.map +1 -1
  320. package/dist/internal/Provider.d.ts +14 -0
  321. package/dist/internal/Provider.d.ts.map +1 -0
  322. package/dist/internal/Provider.js +5 -0
  323. package/dist/internal/Provider.js.map +1 -0
  324. package/dist/internal/Schema.d.ts +6 -1
  325. package/dist/internal/Schema.d.ts.map +1 -1
  326. package/dist/internal/Schema.js +20 -11
  327. package/dist/internal/Schema.js.map +1 -1
  328. package/dist/internal/Store.d.ts +6 -0
  329. package/dist/internal/Store.d.ts.map +1 -1
  330. package/dist/internal/Store.js +35 -0
  331. package/dist/internal/Store.js.map +1 -1
  332. package/dist/internal/Tidx.d.ts +43 -24
  333. package/dist/internal/Tidx.d.ts.map +1 -1
  334. package/dist/internal/Tidx.js +79 -11
  335. package/dist/internal/Tidx.js.map +1 -1
  336. package/dist/internal/Viem.d.ts +82 -65
  337. package/dist/internal/Viem.d.ts.map +1 -1
  338. package/dist/internal/Viem.js +83 -12
  339. package/dist/internal/Viem.js.map +1 -1
  340. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  341. package/dist/internal/WebhookDestination.js +34 -28
  342. package/dist/internal/WebhookDestination.js.map +1 -1
  343. package/dist/internal/Webhooks.d.ts +9 -0
  344. package/dist/internal/Webhooks.d.ts.map +1 -1
  345. package/dist/internal/Webhooks.js +15 -10
  346. package/dist/internal/Webhooks.js.map +1 -1
  347. package/dist/internal/exchange/Provider.d.ts +219 -0
  348. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  349. package/dist/internal/exchange/Provider.js +117 -0
  350. package/dist/internal/exchange/Provider.js.map +1 -0
  351. package/dist/internal/exchange/index.d.ts +2 -0
  352. package/dist/internal/exchange/index.d.ts.map +1 -0
  353. package/dist/internal/exchange/index.js +2 -0
  354. package/dist/internal/exchange/index.js.map +1 -0
  355. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  356. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  357. package/dist/internal/exchange/providers/uniswap.js +553 -0
  358. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  359. package/dist/internal/funding/Action.d.ts +55 -0
  360. package/dist/internal/funding/Action.d.ts.map +1 -0
  361. package/dist/internal/funding/Action.js +74 -0
  362. package/dist/internal/funding/Action.js.map +1 -0
  363. package/dist/internal/funding/Catalog.d.ts +107 -0
  364. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  365. package/dist/internal/funding/Catalog.js +270 -0
  366. package/dist/internal/funding/Catalog.js.map +1 -0
  367. package/dist/internal/funding/Chain.d.ts +76 -0
  368. package/dist/internal/funding/Chain.d.ts.map +1 -0
  369. package/dist/internal/funding/Chain.js +38 -0
  370. package/dist/internal/funding/Chain.js.map +1 -0
  371. package/dist/internal/funding/Deposit.d.ts +366 -0
  372. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  373. package/dist/internal/funding/Deposit.js +286 -0
  374. package/dist/internal/funding/Deposit.js.map +1 -0
  375. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  376. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  377. package/dist/internal/funding/DepositAddress.js +189 -0
  378. package/dist/internal/funding/DepositAddress.js.map +1 -0
  379. package/dist/internal/funding/Evidence.d.ts +52 -0
  380. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  381. package/dist/internal/funding/Evidence.js +314 -0
  382. package/dist/internal/funding/Evidence.js.map +1 -0
  383. package/dist/internal/funding/Provider.d.ts +1186 -0
  384. package/dist/internal/funding/Provider.d.ts.map +1 -0
  385. package/dist/internal/funding/Provider.js +1081 -0
  386. package/dist/internal/funding/Provider.js.map +1 -0
  387. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  388. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  389. package/dist/internal/funding/Reconciliation.js +676 -0
  390. package/dist/internal/funding/Reconciliation.js.map +1 -0
  391. package/dist/internal/funding/Route.d.ts +21 -0
  392. package/dist/internal/funding/Route.d.ts.map +1 -0
  393. package/dist/internal/funding/Route.js +5 -0
  394. package/dist/internal/funding/Route.js.map +1 -0
  395. package/dist/internal/funding/Subsidy.d.ts +113 -0
  396. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  397. package/dist/internal/funding/Subsidy.js +138 -0
  398. package/dist/internal/funding/Subsidy.js.map +1 -0
  399. package/dist/internal/funding/Token.d.ts +41 -0
  400. package/dist/internal/funding/Token.d.ts.map +1 -0
  401. package/dist/internal/funding/Token.js +22 -0
  402. package/dist/internal/funding/Token.js.map +1 -0
  403. package/dist/internal/funding/Transfer.d.ts +643 -0
  404. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  405. package/dist/internal/funding/Transfer.js +332 -0
  406. package/dist/internal/funding/Transfer.js.map +1 -0
  407. package/dist/internal/funding/index.d.ts +13 -0
  408. package/dist/internal/funding/index.d.ts.map +1 -0
  409. package/dist/internal/funding/index.js +13 -0
  410. package/dist/internal/funding/index.js.map +1 -0
  411. package/dist/internal/funding/providers/across.d.ts +21 -0
  412. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  413. package/dist/internal/funding/providers/across.js +117 -0
  414. package/dist/internal/funding/providers/across.js.map +1 -0
  415. package/dist/internal/funding/providers/relay.d.ts +46 -0
  416. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  417. package/dist/internal/funding/providers/relay.js +464 -0
  418. package/dist/internal/funding/providers/relay.js.map +1 -0
  419. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  420. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  421. package/dist/internal/funding/providers/rhino.js +116 -0
  422. package/dist/internal/funding/providers/rhino.js.map +1 -0
  423. package/dist/internal/funding/providers/squid.d.ts +19 -0
  424. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  425. package/dist/internal/funding/providers/squid.js +120 -0
  426. package/dist/internal/funding/providers/squid.js.map +1 -0
  427. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  428. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  429. package/dist/internal/funding/providers/symbiosis.js +176 -0
  430. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  431. package/dist/internal/index.d.ts +5 -1
  432. package/dist/internal/index.d.ts.map +1 -1
  433. package/dist/internal/index.js +5 -1
  434. package/dist/internal/index.js.map +1 -1
  435. package/dist/internal/webhookDestinations/url.js +61 -57
  436. package/dist/internal/webhookDestinations/url.js.map +1 -1
  437. package/dist/providers/index.d.ts +43 -0
  438. package/dist/providers/index.d.ts.map +1 -0
  439. package/dist/providers/index.js +19 -0
  440. package/dist/providers/index.js.map +1 -0
  441. package/package.json +9 -4
  442. package/src/ApiKeys.test.ts +11 -7
  443. package/src/ApiKeys.ts +37 -9
  444. package/src/App.test.ts +85 -10
  445. package/src/App.ts +224 -137
  446. package/src/Assets.ts +29 -4
  447. package/src/Client.test-d.ts +650 -30
  448. package/src/Scope.test.ts +19 -0
  449. package/src/Scope.ts +28 -11
  450. package/src/Webhooks.test.ts +25 -0
  451. package/src/Webhooks.ts +1 -1
  452. package/src/admin/App.test.ts +9 -2
  453. package/src/admin/App.ts +32 -9
  454. package/src/admin/apps/api-keys.test.ts +167 -23
  455. package/src/admin/apps/api-keys.ts +166 -28
  456. package/src/admin/apps/earn-vaults.test.ts +338 -0
  457. package/src/admin/apps/earn-vaults.ts +572 -0
  458. package/src/admin/apps/scopes.test.ts +16 -1
  459. package/src/admin/ui/plugin.ts +2 -2
  460. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  461. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  462. package/src/admin/ui/src/components/Page.tsx +1 -1
  463. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  464. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  465. package/src/admin/ui/src/lib/client.ts +1 -1
  466. package/src/admin/ui/src/lib/config.ts +1 -1
  467. package/src/admin/ui/src/lib/early-access.ts +8 -9
  468. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  469. package/src/admin/ui/src/lib/format.ts +13 -0
  470. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  471. package/src/admin/ui/src/lib/organizations.ts +7 -1
  472. package/src/admin/ui/src/lib/response.ts +22 -0
  473. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  474. package/src/admin/ui/src/lib/scopes.ts +28 -7
  475. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  476. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  477. package/src/admin/ui/src/router.tsx +2 -2
  478. package/src/admin/ui/src/routes/__root.tsx +9 -8
  479. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  480. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  481. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  482. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  483. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  484. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  485. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  486. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  487. package/src/admin/ui/vite.config.ts +4 -1
  488. package/src/admin/ui.generated.ts +113 -43
  489. package/src/analytics/Analytics.test.ts +69 -10
  490. package/src/analytics/Analytics.ts +20 -1
  491. package/src/analytics/tables/requestEvents.ts +79 -37
  492. package/src/apps/Zones.test.ts +33 -0
  493. package/src/apps/Zones.ts +40 -0
  494. package/src/apps/composition.test.ts +84 -1
  495. package/src/apps/data/App.test.ts +28 -11
  496. package/src/apps/data/App.ts +96 -33
  497. package/src/apps/data/FxOracle.ts +1 -1
  498. package/src/apps/data/index.ts +0 -1
  499. package/src/apps/data/routes/activities.test.ts +82 -6
  500. package/src/apps/data/routes/activities.ts +131 -71
  501. package/src/apps/data/routes/balances.test.ts +50 -37
  502. package/src/apps/data/routes/balances.ts +5 -5
  503. package/src/apps/data/routes/blocks.test.ts +2 -0
  504. package/src/apps/data/routes/coingecko.test.ts +22 -0
  505. package/src/apps/data/routes/coingecko.ts +84 -48
  506. package/src/apps/data/routes/earn.test.ts +1108 -0
  507. package/src/apps/data/routes/earn.ts +1391 -0
  508. package/src/apps/data/routes/exchanges.test.ts +82 -33
  509. package/src/apps/data/routes/exchanges.ts +842 -227
  510. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  511. package/src/apps/data/routes/fee-amm.ts +69 -12
  512. package/src/apps/data/routes/funding.test.ts +2712 -221
  513. package/src/apps/data/routes/funding.ts +1604 -387
  514. package/src/apps/data/routes/indexer.test.ts +43 -34
  515. package/src/apps/data/routes/indexer.ts +19 -2
  516. package/src/apps/data/routes/receipts.test.ts +5 -3
  517. package/src/apps/data/routes/receipts.ts +13 -11
  518. package/src/apps/data/routes/rpc.test.ts +446 -28
  519. package/src/apps/data/routes/rpc.ts +243 -25
  520. package/src/apps/data/routes/tokenlist.ts +72 -19
  521. package/src/apps/data/routes/tokens.ts +258 -86
  522. package/src/apps/data/routes/transactions.test.ts +2 -0
  523. package/src/apps/data/routes/transactions.ts +77 -42
  524. package/src/apps/data/routes/transfers.test.ts +166 -4
  525. package/src/apps/data/routes/transfers.ts +216 -78
  526. package/src/apps/data/routes/valuation.test.ts +62 -9
  527. package/src/apps/data/routes/valuation.ts +2 -2
  528. package/src/apps/data/routes/webhooks.test.ts +386 -43
  529. package/src/apps/data/routes/webhooks.ts +172 -71
  530. package/src/apps/data/routes/zones.test.ts +473 -0
  531. package/src/apps/data/routes/zones.ts +338 -0
  532. package/src/apps/docs/reference.ts +8 -6
  533. package/src/apps/index.ts +2 -1
  534. package/src/apps/management/Billing.test.ts +29 -0
  535. package/src/apps/management/Billing.ts +23 -0
  536. package/src/apps/management/Error.ts +12 -0
  537. package/src/apps/management/routes/api-keys.test.ts +5 -3
  538. package/src/apps/management/routes/api-keys.ts +2 -9
  539. package/src/apps/management/routes/invitations.ts +4 -11
  540. package/src/apps/management/routes/orgs.ts +2 -9
  541. package/src/apps/management/routes/scopes.test.ts +7 -2
  542. package/src/apps/management/routes/scopes.ts +2 -2
  543. package/src/apps/management/routes/webhooks.test.ts +6 -1
  544. package/src/apps/management/routes/webhooks.ts +15 -3
  545. package/src/apps/mpp/App.ts +276 -29
  546. package/src/apps/mpp/Mpp.test.ts +631 -26
  547. package/src/apps/mpp/Mpp.ts +0 -42
  548. package/src/apps/mpp/internal/Adapter.ts +108 -3
  549. package/src/apps/mpp/internal/Error.test.ts +33 -0
  550. package/src/apps/mpp/internal/Error.ts +44 -6
  551. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  552. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  553. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  554. package/src/apps/mpp/internal/Policy.ts +98 -0
  555. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  556. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  557. package/src/apps/mpp/internal/Screening.ts +40 -3
  558. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  559. package/src/apps/mpp/internal/Utils.ts +30 -0
  560. package/src/apps/relay/App.test.ts +493 -62
  561. package/src/apps/relay/App.ts +233 -23
  562. package/src/apps/relay/Sponsorships.test.ts +49 -0
  563. package/src/apps/relay/Sponsorships.ts +18 -6
  564. package/src/db/Db.ts +439 -0
  565. package/src/db/Schema.ts +325 -2
  566. package/src/db/tables/earnVaults.test.ts +185 -0
  567. package/src/db/tables/earnVaults.ts +151 -0
  568. package/src/db/tables/fundingCatalog.test.ts +108 -0
  569. package/src/db/tables/fundingCatalog.ts +157 -0
  570. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  571. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  572. package/src/db/tables/fundingDeposits.test.ts +261 -0
  573. package/src/db/tables/fundingDeposits.ts +229 -0
  574. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  575. package/src/db/tables/fundingIdempotency.ts +180 -0
  576. package/src/db/tables/fundingTransferEvents.ts +28 -0
  577. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  578. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  579. package/src/db/tables/fundingTransfers.test.ts +89 -0
  580. package/src/db/tables/fundingTransfers.ts +153 -0
  581. package/src/db/tables/organizations.ts +16 -0
  582. package/src/db/tables/projects.ts +16 -0
  583. package/src/db/tables/requestUsage.ts +23 -0
  584. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  585. package/src/db/tables/sponsoredTransactions.ts +3 -3
  586. package/src/db/tables/users.ts +16 -0
  587. package/src/db/tables/verifiedTokens.ts +19 -14
  588. package/src/db/tables/webhookSubscriptions.ts +58 -3
  589. package/src/handlers/relay.test.ts +2 -0
  590. package/src/handlers/relay.ts +95 -99
  591. package/src/internal/Auth.test.ts +48 -0
  592. package/src/internal/Auth.ts +61 -2
  593. package/src/internal/Cache.ts +13 -9
  594. package/src/internal/Cursor.test.ts +2 -2
  595. package/src/internal/Cursor.ts +1 -1
  596. package/src/internal/EarnRates.test.ts +125 -0
  597. package/src/internal/EarnRates.ts +409 -0
  598. package/src/internal/EarnVaults.test.ts +195 -0
  599. package/src/internal/EarnVaults.ts +876 -0
  600. package/src/internal/EdgeCache.test.ts +19 -0
  601. package/src/internal/EdgeCache.ts +35 -5
  602. package/src/internal/Id.ts +14 -0
  603. package/src/internal/Idempotency.test.ts +109 -0
  604. package/src/internal/Idempotency.ts +237 -0
  605. package/src/internal/Log.test-d.ts +41 -8
  606. package/src/internal/Log.test.ts +189 -8
  607. package/src/internal/Log.ts +124 -17
  608. package/src/internal/MetricSink.test.ts +244 -4
  609. package/src/internal/MetricSink.ts +51 -1
  610. package/src/internal/OpenApi.ts +3 -0
  611. package/src/internal/Provider.test.ts +17 -0
  612. package/src/internal/Provider.ts +17 -0
  613. package/src/internal/Schema.ts +27 -17
  614. package/src/internal/Store.test.ts +25 -0
  615. package/src/internal/Store.ts +46 -0
  616. package/src/internal/Tidx.local.test.ts +78 -3
  617. package/src/internal/Tidx.test.ts +212 -18
  618. package/src/internal/Tidx.ts +112 -32
  619. package/src/internal/VerifiedTokens.test.ts +15 -0
  620. package/src/internal/Viem.test.ts +170 -17
  621. package/src/internal/Viem.ts +111 -28
  622. package/src/internal/WebhookDestination.ts +25 -23
  623. package/src/internal/Webhooks.test.ts +59 -0
  624. package/src/internal/Webhooks.ts +34 -10
  625. package/src/internal/exchange/Provider.test.ts +216 -0
  626. package/src/internal/exchange/Provider.ts +326 -0
  627. package/src/internal/exchange/index.test.ts +6 -0
  628. package/src/internal/exchange/index.ts +1 -0
  629. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  630. package/src/internal/exchange/providers/uniswap.ts +682 -0
  631. package/src/internal/funding/Action.test.ts +138 -0
  632. package/src/internal/funding/Action.ts +117 -0
  633. package/src/internal/funding/Catalog.test.ts +311 -0
  634. package/src/internal/funding/Catalog.ts +347 -0
  635. package/src/internal/funding/Chain.test.ts +79 -0
  636. package/src/internal/funding/Chain.ts +120 -0
  637. package/src/internal/funding/Deposit.test.ts +26 -0
  638. package/src/internal/funding/Deposit.ts +453 -0
  639. package/src/internal/funding/DepositAddress.test.ts +18 -0
  640. package/src/internal/funding/DepositAddress.ts +312 -0
  641. package/src/internal/funding/Evidence.test.ts +297 -0
  642. package/src/internal/funding/Evidence.ts +430 -0
  643. package/src/internal/funding/Provider.test.ts +1328 -0
  644. package/src/internal/funding/Provider.ts +1796 -0
  645. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  646. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  647. package/src/internal/funding/Reconciliation.ts +930 -0
  648. package/src/internal/funding/Route.test.ts +66 -0
  649. package/src/internal/funding/Route.ts +29 -0
  650. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  651. package/src/internal/funding/Subsidy.test.ts +75 -0
  652. package/src/internal/funding/Subsidy.ts +260 -0
  653. package/src/internal/funding/Token.test.ts +47 -0
  654. package/src/internal/funding/Token.ts +59 -0
  655. package/src/internal/funding/Transfer.test.ts +369 -0
  656. package/src/internal/funding/Transfer.ts +522 -0
  657. package/src/internal/funding/index.test.ts +20 -0
  658. package/src/internal/funding/index.ts +12 -0
  659. package/src/internal/funding/providers/across.ts +149 -0
  660. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  661. package/src/internal/funding/providers/relay.test.ts +474 -0
  662. package/src/internal/funding/providers/relay.ts +559 -0
  663. package/src/internal/funding/providers/rhino.ts +139 -0
  664. package/src/internal/funding/providers/squid.ts +151 -0
  665. package/src/internal/funding/providers/symbiosis.ts +221 -0
  666. package/src/internal/index.test.ts +5 -1
  667. package/src/internal/index.ts +5 -1
  668. package/src/internal/webhookDestinations/url.ts +49 -45
  669. package/src/providers/index.test.ts +14 -0
  670. package/src/providers/index.ts +54 -0
  671. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  672. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  673. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  674. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  675. package/dist/internal/FundingQuotes.d.ts +0 -864
  676. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  677. package/dist/internal/FundingQuotes.js +0 -672
  678. package/dist/internal/FundingQuotes.js.map +0 -1
  679. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  680. package/src/internal/FundingQuotes.test.ts +0 -456
  681. package/src/internal/FundingQuotes.ts +0 -944
@@ -1,6 +1,7 @@
1
1
  import { type Db, Webhooks as Core } from 'tapimo'
2
2
  import * as z from 'zod/mini'
3
3
 
4
+ import * as Cursor from '../../../internal/Cursor.js'
4
5
  import * as Tidx from '../../../internal/Tidx.js'
5
6
  import * as Viem from '../../../internal/Viem.js'
6
7
  import * as TestApp from '../../../../test/App.js'
@@ -163,12 +164,7 @@ describe('access matrix', () => {
163
164
  const zone = 421_700_001
164
165
  const app = TestApp.client({
165
166
  auth: { keys: [writer] },
166
- zones: [
167
- {
168
- chainId: zone,
169
- forwardRpcUrl: 'https://zone.rpc.test',
170
- },
171
- ],
167
+ zones: [TestApp.zone({ chainId: zone, rpcUrl: 'https://zone.rpc.test' })],
172
168
  })
173
169
  const response = await app.v1.webhooks.$post(
174
170
  { json: { ...validBody, chainId: zone } },
@@ -226,7 +222,11 @@ describe('access matrix', () => {
226
222
 
227
223
  describe('CRUD lifecycle', () => {
228
224
  test('creates, reads, lists, updates, and deletes a subscription', async () => {
229
- const app = client()
225
+ const db = TestApp.database()
226
+ const app = TestApp.client({
227
+ auth: { keys: [writer, reader, other] },
228
+ db,
229
+ })
230
230
 
231
231
  // Create returns the one-time signing secret.
232
232
  const created = await app.v1.webhooks.$post({ json: validBody }, as(writer))
@@ -239,6 +239,9 @@ describe('CRUD lifecycle', () => {
239
239
  // API-key-owned subscriptions never expire.
240
240
  expect(createdBody.expiresAt).toMatchInlineSnapshot(`undefined`)
241
241
  expect(createdBody).not.toHaveProperty('owner')
242
+ expect(Cursor.decode((await Core.getCursor(db, createdBody.id))!, ['int'])).toEqual([
243
+ expect.any(Number),
244
+ ])
242
245
 
243
246
  // Reads never expose the secret.
244
247
  const read = await app.v1.webhooks[':id{wh_[A-Za-z0-9_-]+}'].$get(
@@ -1320,15 +1323,17 @@ describe('envelope schema', () => {
1320
1323
  describe('MPP access (disabled for now — API-key-only)', () => {
1321
1324
  test('rejects an MPP payer with 401, offering no payment challenge', async () => {
1322
1325
  const app = TestApp.create({
1323
- auth: { keys: [] },
1324
- mpp: {
1325
- secretKey: 'secret_test_key_0123456789abcdef',
1326
- session: {
1327
- chainId: Tempo.chain.id,
1328
- currency: Tempo.currency,
1329
- decimals: 6,
1330
- getClient: () => Tempo.client,
1331
- recipient: Tempo.accounts[2].address,
1326
+ auth: {
1327
+ keys: [],
1328
+ mpp: {
1329
+ secretKey: 'secret_test_key_0123456789abcdef',
1330
+ session: {
1331
+ chainId: Tempo.chain.id,
1332
+ currency: Tempo.currency,
1333
+ decimals: 6,
1334
+ getClient: () => Tempo.client,
1335
+ recipient: Tempo.accounts[2].address,
1336
+ },
1332
1337
  },
1333
1338
  },
1334
1339
  })
@@ -1352,11 +1357,11 @@ describe('MPP access (disabled for now — API-key-only)', () => {
1352
1357
  // redirected to the disposable local chain, which lacks that history, so the
1353
1358
  // whole block is testnet-only.
1354
1359
  describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1355
- /** Decodes the opaque `(block, index)` keyset cursor the poller stores. */
1356
- function decodeCursor(token: string | null): [number, number] | null {
1360
+ /** Decodes an opaque creation checkpoint or `(block, index)` poller cursor. */
1361
+ function decodeCursor(token: string | null): number[] | null {
1357
1362
  if (!token) return null
1358
1363
  const json = atob(token.replaceAll('-', '+').replaceAll('_', '/'))
1359
- return JSON.parse(json) as [number, number]
1364
+ return JSON.parse(json) as number[]
1360
1365
  }
1361
1366
 
1362
1367
  /** Encodes a `(block, index)` keyset cursor in the poller's opaque format. */
@@ -1373,7 +1378,7 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1373
1378
  // the real keyset/`toBlock` SQL and decode path end to end — no fabricated rows.
1374
1379
  const realTidx = Tidx.getClient({
1375
1380
  chainId: 42431,
1376
- tidx: { baseUrl: 'https://tidx.tempo.xyz', basicAuth: process.env.TIDX_BASIC_AUTH },
1381
+ tidx: { auth: process.env.TIDX_AUTH, baseUrl: 'https://tidx.tempo.xyz' },
1377
1382
  })
1378
1383
  // The monitoring scanners (`log:emitted`/`block:created`/`transaction:included`)
1379
1384
  // read the same immutable historical window over real RPC (chain 42431 →
@@ -1390,6 +1395,9 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1390
1395
  // rows, both in block 1,000,002 (`log_idx` 0 then 1): a TIP-20 transfer
1391
1396
  // followed by its fee payment. Filtering on it makes the scan deterministic.
1392
1397
  const windowSender = '0xe7687128b0a808c2831ff94d4f7b2fb35c65af38'
1398
+ // This token has 226 transfers across blocks 1,000,000 through 1,000,003.
1399
+ const volumeHead = 1_000_005
1400
+ const volumeToken = '0x20c0000000000000000000000000000000000001'
1393
1401
 
1394
1402
  async function createTransferSubscription(db: Db.Db) {
1395
1403
  return Core.createSubscription(db, {
@@ -1401,6 +1409,16 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1401
1409
  })
1402
1410
  }
1403
1411
 
1412
+ async function createVolumeSubscription(db: Db.Db, ownerId = 'org_test') {
1413
+ return Core.createSubscription(db, {
1414
+ chainId: 42431,
1415
+ destination: { type: 'url', url: `https://hooks.example.com/${ownerId}` },
1416
+ eventType: 'token:transfer',
1417
+ filters: { token: volumeToken },
1418
+ owner: { orgId: ownerId, type: 'api_key' },
1419
+ })
1420
+ }
1421
+
1404
1422
  test('dispatches a signed envelope per row and advances the cursor', async () => {
1405
1423
  const db = TestApp.database()
1406
1424
  const subscription = await createTransferSubscription(db)
@@ -1519,6 +1537,104 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1519
1537
  `)
1520
1538
  })
1521
1539
 
1540
+ test('drains two bounded transfer pages per tick without gaps', async () => {
1541
+ const db = TestApp.database()
1542
+ const subscription = await createVolumeSubscription(db)
1543
+ await Core.setCursor(db, subscription.id, windowCursor)
1544
+
1545
+ const positions: string[] = []
1546
+ const tick = () =>
1547
+ Webhooks.poll({
1548
+ chainId: 42431,
1549
+ client,
1550
+ db,
1551
+ dispatch: async ({ envelope }) => {
1552
+ const data = envelope.data as { blockNumber: number; logIndex: number }
1553
+ positions.push(`${data.blockNumber}:${data.logIndex}`)
1554
+ return { ok: true }
1555
+ },
1556
+ eventTypes: ['token:transfer'],
1557
+ headBlockNumber: volumeHead,
1558
+ tidx: realTidx,
1559
+ })
1560
+
1561
+ expect((await tick()).dispatched).toBe(200)
1562
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([1_000_003, 144])
1563
+ expect((await tick()).dispatched).toBe(26)
1564
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([1_000_003, 223])
1565
+ expect(positions).toHaveLength(226)
1566
+ expect(new Set(positions).size).toBe(226)
1567
+ expect(positions[99]).toBe('1000002:9')
1568
+ expect(positions[100]).toBe('1000002:10')
1569
+ })
1570
+
1571
+ test('commits the first page before a continuation delivery fails', async () => {
1572
+ const db = TestApp.database()
1573
+ const subscription = await createVolumeSubscription(db)
1574
+ await Core.setCursor(db, subscription.id, windowCursor)
1575
+
1576
+ let calls = 0
1577
+ const first = await Webhooks.poll({
1578
+ chainId: 42431,
1579
+ client,
1580
+ db,
1581
+ dispatch: async () => (++calls === 101 ? { error: 'unreachable', ok: false } : { ok: true }),
1582
+ eventTypes: ['token:transfer'],
1583
+ headBlockNumber: volumeHead,
1584
+ tidx: realTidx,
1585
+ })
1586
+
1587
+ expect(first.dispatched).toBe(100)
1588
+ expect(first.failed).toBe(1)
1589
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([1_000_002, 9])
1590
+
1591
+ let resumed: readonly [number, number] | undefined
1592
+ await Webhooks.poll({
1593
+ batchSize: 1,
1594
+ chainId: 42431,
1595
+ client,
1596
+ db,
1597
+ dispatch: async ({ envelope }) => {
1598
+ const data = envelope.data as { blockNumber: number; logIndex: number }
1599
+ resumed = [data.blockNumber, data.logIndex]
1600
+ return { ok: true }
1601
+ },
1602
+ eventTypes: ['token:transfer'],
1603
+ headBlockNumber: volumeHead,
1604
+ tidx: realTidx,
1605
+ })
1606
+ expect(resumed).toEqual([1_000_002, 10])
1607
+ })
1608
+
1609
+ test('round-robins continuation pages across subscriptions', async () => {
1610
+ const db = TestApp.database()
1611
+ const a = await createVolumeSubscription(db, 'org_a')
1612
+ const b = await createVolumeSubscription(db, 'org_b')
1613
+ await Core.setCursor(db, a.id, windowCursor)
1614
+ await Core.setCursor(db, b.id, windowCursor)
1615
+ const [first, second] = [a.id, b.id].sort()
1616
+
1617
+ const order: string[] = []
1618
+ await Webhooks.poll({
1619
+ chainId: 42431,
1620
+ client,
1621
+ db,
1622
+ dispatch: async ({ subscription }) => {
1623
+ order.push(subscription.id)
1624
+ return { ok: true }
1625
+ },
1626
+ eventTypes: ['token:transfer'],
1627
+ headBlockNumber: volumeHead,
1628
+ tidx: realTidx,
1629
+ })
1630
+
1631
+ expect(order).toHaveLength(400)
1632
+ expect(new Set(order.slice(0, 100))).toEqual(new Set([first]))
1633
+ expect(new Set(order.slice(100, 200))).toEqual(new Set([second]))
1634
+ expect(new Set(order.slice(200, 300))).toEqual(new Set([first]))
1635
+ expect(new Set(order.slice(300, 400))).toEqual(new Set([second]))
1636
+ })
1637
+
1522
1638
  test('anchors a first-seen subscription at the confirmed head without backfilling', async () => {
1523
1639
  const db = TestApp.database()
1524
1640
  const subscription = await createTransferSubscription(db)
@@ -1550,6 +1666,82 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1550
1666
  `)
1551
1667
  })
1552
1668
 
1669
+ test('dispatches creation-head replacements once confirmed', async () => {
1670
+ const db = TestApp.database()
1671
+ const creationHead = windowTo
1672
+ const subscription = await Core.createSubscription(
1673
+ db,
1674
+ {
1675
+ chainId: 42431,
1676
+ destination: { type: 'url', url: 'https://hooks.example.com/x' },
1677
+ eventType: 'token:transfer',
1678
+ filters: { sender: windowSender },
1679
+ owner: { orgId: 'org_test', type: 'api_key' },
1680
+ },
1681
+ { startBlockNumber: creationHead },
1682
+ )
1683
+
1684
+ const result = await Webhooks.poll({
1685
+ chainId: 42431,
1686
+ confirmations: 3,
1687
+ dispatch: async () => ({ ok: true }),
1688
+ eventTypes: ['token:transfer'],
1689
+ headBlockNumber: creationHead + 3,
1690
+ client,
1691
+ db,
1692
+ tidx: realTidx,
1693
+ })
1694
+
1695
+ expect(result.dispatched).toBe(2)
1696
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 1])
1697
+ })
1698
+
1699
+ test('keeps confirmed creation anchors while sources catch up', async () => {
1700
+ const db = TestApp.database()
1701
+ const startBlockNumber = windowTo + 100
1702
+ const transfer = await Core.createSubscription(
1703
+ db,
1704
+ {
1705
+ chainId: 42431,
1706
+ destination: { type: 'url', url: 'https://hooks.example.com/transfer' },
1707
+ eventType: 'token:transfer',
1708
+ filters: { sender: windowSender },
1709
+ owner: { orgId: 'org_transfer', type: 'api_key' },
1710
+ },
1711
+ { startBlockNumber },
1712
+ )
1713
+ const block = await Core.createSubscription(
1714
+ db,
1715
+ {
1716
+ chainId: 42431,
1717
+ destination: { type: 'url', url: 'https://hooks.example.com/block' },
1718
+ eventType: 'block:created',
1719
+ filters: {},
1720
+ owner: { orgId: 'org_block', type: 'api_key' },
1721
+ },
1722
+ { startBlockNumber },
1723
+ )
1724
+
1725
+ await Webhooks.poll({
1726
+ chainId: 42431,
1727
+ dispatch: async () => ({ ok: true }),
1728
+ eventTypes: ['token:transfer', 'block:created'],
1729
+ headBlockNumber: windowHead,
1730
+ client,
1731
+ db,
1732
+ tidx: realTidx,
1733
+ })
1734
+
1735
+ expect(decodeCursor(await Core.getCursor(db, transfer.id))).toEqual([
1736
+ startBlockNumber - 2,
1737
+ endOfBlockIndex,
1738
+ ])
1739
+ expect(decodeCursor(await Core.getCursor(db, block.id))).toEqual([
1740
+ startBlockNumber - 2,
1741
+ endOfBlockIndex,
1742
+ ])
1743
+ })
1744
+
1553
1745
  test('advances to the end of the confirmed window on an empty scan', async () => {
1554
1746
  const db = TestApp.database()
1555
1747
  const subscription = await createTransferSubscription(db)
@@ -1687,27 +1879,67 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1687
1879
  `)
1688
1880
  })
1689
1881
 
1690
- test('block:created scans new blocks and resolves transaction counts', async () => {
1882
+ test('log:emitted limits a tick and resumes within the block', async () => {
1691
1883
  const db = TestApp.database()
1692
1884
  const subscription = await Core.createSubscription(db, {
1693
1885
  chainId: 42431,
1694
- eventType: 'block:created',
1695
- // Pin to a single block so the heartbeat feed is deterministic.
1696
- filters: { number: { eq: `0x${windowTo.toString(16)}` } },
1697
- owner: { orgId: 'org_test', type: 'api_key' },
1698
1886
  destination: { type: 'url', url: 'https://hooks.example.com/x' },
1887
+ eventType: 'log:emitted',
1888
+ filters: { args: { from: windowSender }, signature: transferSignature },
1889
+ owner: { orgId: 'org_test', type: 'api_key' },
1699
1890
  })
1700
1891
  await Core.setCursor(db, subscription.id, windowCursor)
1701
1892
 
1893
+ const dispatched: Webhooks.poll.Dispatchable[] = []
1894
+ const tick = () =>
1895
+ Webhooks.poll({
1896
+ batchSize: 1,
1897
+ chainId: 42431,
1898
+ client,
1899
+ db,
1900
+ dispatch: async (input) => {
1901
+ dispatched.push(input)
1902
+ return { ok: true }
1903
+ },
1904
+ eventTypes: ['log:emitted'],
1905
+ headBlockNumber: windowHead,
1906
+ tidx: realTidx,
1907
+ })
1908
+
1909
+ expect((await tick()).dispatched).toBe(1)
1910
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 0])
1911
+ expect((await tick()).dispatched).toBe(1)
1912
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 1])
1913
+ expect(
1914
+ dispatched.map(({ envelope }) => (envelope.data as { logIndex: number }).logIndex),
1915
+ ).toEqual([0, 1])
1916
+ })
1917
+
1918
+ test('block:created scans new blocks and resolves transaction counts', async () => {
1919
+ const db = TestApp.database()
1920
+ const subscription = await Core.createSubscription(
1921
+ db,
1922
+ {
1923
+ chainId: 42431,
1924
+ eventType: 'block:created',
1925
+ // Pin to the creation-head height, which may be replaced before confirmation.
1926
+ filters: { number: { eq: `0x${windowTo.toString(16)}` } },
1927
+ owner: { orgId: 'org_test', type: 'api_key' },
1928
+ destination: { type: 'url', url: 'https://hooks.example.com/x' },
1929
+ },
1930
+ { startBlockNumber: windowTo },
1931
+ )
1932
+
1702
1933
  const dispatched: Webhooks.poll.Dispatchable[] = []
1703
1934
  const result = await Webhooks.poll({
1704
1935
  chainId: 42431,
1936
+ confirmations: 3,
1705
1937
  dispatch: async (input) => {
1706
1938
  dispatched.push(input)
1707
1939
  return { ok: true }
1708
1940
  },
1709
1941
  eventTypes: ['block:created'],
1710
- headBlockNumber: windowHead,
1942
+ headBlockNumber: windowTo + 3,
1711
1943
  client,
1712
1944
  db,
1713
1945
  tidx: realTidx,
@@ -1736,55 +1968,126 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1736
1968
  `)
1737
1969
  })
1738
1970
 
1739
- test('block:created preserves the cursor when a block header cannot be read', async () => {
1971
+ test('block:created limits a tick and resumes at the next block', async () => {
1740
1972
  const db = TestApp.database()
1741
- const missingBlock = 4_000_000_000
1742
- const cursor = encodeCursor([missingBlock - 1, endOfBlockIndex])
1743
1973
  const subscription = await Core.createSubscription(db, {
1744
1974
  chainId: 42431,
1745
1975
  destination: { type: 'url', url: 'https://hooks.example.com/x' },
1746
1976
  eventType: 'block:created',
1747
- filters: { number: { eq: `0x${missingBlock.toString(16)}` } },
1977
+ filters: {},
1748
1978
  owner: { orgId: 'org_test', type: 'api_key' },
1749
1979
  })
1750
- await Core.setCursor(db, subscription.id, cursor)
1980
+ await Core.setCursor(db, subscription.id, windowCursor)
1981
+
1982
+ const dispatched: Webhooks.poll.Dispatchable[] = []
1983
+ const tick = () =>
1984
+ Webhooks.poll({
1985
+ batchSize: 1,
1986
+ chainId: 42431,
1987
+ client,
1988
+ db,
1989
+ dispatch: async (input) => {
1990
+ dispatched.push(input)
1991
+ return { ok: true }
1992
+ },
1993
+ eventTypes: ['block:created'],
1994
+ headBlockNumber: windowHead,
1995
+ tidx: realTidx,
1996
+ })
1997
+
1998
+ expect((await tick()).dispatched).toBe(1)
1999
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowFrom, 0])
2000
+ expect((await tick()).dispatched).toBe(1)
2001
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowFrom + 1, 0])
2002
+ expect(dispatched.map(({ envelope }) => (envelope.data as { number: number }).number)).toEqual([
2003
+ windowFrom,
2004
+ windowFrom + 1,
2005
+ ])
2006
+ })
2007
+
2008
+ test('block:created continues other subscriptions when a block header cannot be read', async () => {
2009
+ const db = TestApp.database()
2010
+ const missingBlock = 4_000_000_000
2011
+ const cursor = encodeCursor([missingBlock - 1, endOfBlockIndex])
2012
+ const unavailable = await Core.createSubscription(
2013
+ db,
2014
+ {
2015
+ chainId: 42431,
2016
+ destination: { type: 'url', url: 'https://hooks.example.com/unavailable' },
2017
+ eventType: 'block:created',
2018
+ filters: { number: { eq: `0x${missingBlock.toString(16)}` } },
2019
+ owner: { orgId: 'org_test', type: 'api_key' },
2020
+ },
2021
+ { now: () => new Date('2026-01-01T00:00:00.000Z') },
2022
+ )
2023
+ const healthy = await Core.createSubscription(
2024
+ db,
2025
+ {
2026
+ chainId: 42431,
2027
+ destination: { type: 'url', url: 'https://hooks.example.com/healthy' },
2028
+ eventType: 'block:created',
2029
+ filters: { number: { eq: `0x${windowTo.toString(16)}` } },
2030
+ owner: { orgId: 'org_test', type: 'api_key' },
2031
+ },
2032
+ { now: () => new Date('2026-01-01T00:00:01.000Z') },
2033
+ )
2034
+ await Core.setCursor(db, unavailable.id, cursor)
2035
+ await Core.setCursor(db, healthy.id, windowCursor)
2036
+
2037
+ const dispatched: Webhooks.poll.Dispatchable[] = []
1751
2038
 
1752
2039
  await expect(
1753
2040
  Webhooks.poll({
1754
2041
  chainId: 42431,
2042
+ dispatch: async (input) => {
2043
+ dispatched.push(input)
2044
+ return { ok: true }
2045
+ },
1755
2046
  eventTypes: ['block:created'],
1756
2047
  headBlockNumber: missingBlock + 2,
1757
2048
  client,
1758
2049
  db,
2050
+ maxBlocks: 3,
1759
2051
  tidx: realTidx,
1760
2052
  }),
1761
2053
  ).rejects.toThrow()
1762
2054
 
1763
- expect(await Core.getCursor(db, subscription.id)).toBe(cursor)
2055
+ expect(await Core.getCursor(db, unavailable.id)).toBe(cursor)
2056
+ expect(decodeCursor(await Core.getCursor(db, healthy.id))).toMatchInlineSnapshot(`
2057
+ [
2058
+ 1000002,
2059
+ 2147483647,
2060
+ ]
2061
+ `)
2062
+ expect(dispatched.map(({ subscription }) => subscription.id)).toEqual([healthy.id])
1764
2063
  })
1765
2064
 
1766
2065
  test('transaction:included filters on txs columns and inner calls', async () => {
1767
2066
  const db = TestApp.database()
1768
- const subscription = await Core.createSubscription(db, {
1769
- chainId: 42431,
1770
- eventType: 'transaction:included',
1771
- // `from` + an `input` selector (ERC20 `transfer` = 0xa9059cbb) pins the
1772
- // scan to the deterministic window tx.
1773
- filters: { from: windowSender, input: { selector: '0xa9059cbb' } },
1774
- owner: { orgId: 'org_test', type: 'api_key' },
1775
- destination: { type: 'url', url: 'https://hooks.example.com/x' },
1776
- })
1777
- await Core.setCursor(db, subscription.id, windowCursor)
2067
+ const subscription = await Core.createSubscription(
2068
+ db,
2069
+ {
2070
+ chainId: 42431,
2071
+ eventType: 'transaction:included',
2072
+ // `from` + an `input` selector (ERC20 `transfer` = 0xa9059cbb) pins the
2073
+ // scan to the deterministic creation-head transaction.
2074
+ filters: { from: windowSender, input: { selector: '0xa9059cbb' } },
2075
+ owner: { orgId: 'org_test', type: 'api_key' },
2076
+ destination: { type: 'url', url: 'https://hooks.example.com/x' },
2077
+ },
2078
+ { startBlockNumber: windowTo },
2079
+ )
1778
2080
 
1779
2081
  const dispatched: Webhooks.poll.Dispatchable[] = []
1780
2082
  const result = await Webhooks.poll({
1781
2083
  chainId: 42431,
2084
+ confirmations: 3,
1782
2085
  dispatch: async (input) => {
1783
2086
  dispatched.push(input)
1784
2087
  return { ok: true }
1785
2088
  },
1786
2089
  eventTypes: ['transaction:included'],
1787
- headBlockNumber: windowHead,
2090
+ headBlockNumber: windowTo + 3,
1788
2091
  client,
1789
2092
  db,
1790
2093
  tidx: realTidx,
@@ -1803,6 +2106,46 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
1803
2106
  expect(typeof tx.feeToken?.name).toBe('string')
1804
2107
  expect(typeof tx.feeToken?.symbol).toBe('string')
1805
2108
  } else expect(tx?.feeToken).toBeUndefined()
2109
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([
2110
+ windowTo,
2111
+ endOfBlockIndex,
2112
+ ])
2113
+ })
2114
+
2115
+ test('transaction:included limits a tick and resumes within the block', async () => {
2116
+ const db = TestApp.database()
2117
+ const subscription = await Core.createSubscription(db, {
2118
+ chainId: 42431,
2119
+ destination: { type: 'url', url: 'https://hooks.example.com/x' },
2120
+ eventType: 'transaction:included',
2121
+ filters: {},
2122
+ owner: { orgId: 'org_test', type: 'api_key' },
2123
+ })
2124
+ await Core.setCursor(db, subscription.id, encodeCursor([windowTo - 1, endOfBlockIndex]))
2125
+
2126
+ const dispatched: Webhooks.poll.Dispatchable[] = []
2127
+ const tick = () =>
2128
+ Webhooks.poll({
2129
+ batchSize: 1,
2130
+ chainId: 42431,
2131
+ client,
2132
+ db,
2133
+ dispatch: async (input) => {
2134
+ dispatched.push(input)
2135
+ return { ok: true }
2136
+ },
2137
+ eventTypes: ['transaction:included'],
2138
+ headBlockNumber: windowHead,
2139
+ tidx: realTidx,
2140
+ })
2141
+
2142
+ expect((await tick()).dispatched).toBe(1)
2143
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 0])
2144
+ expect((await tick()).dispatched).toBe(1)
2145
+ expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 1])
2146
+ expect(
2147
+ new Set(dispatched.map(({ envelope }) => (envelope.data as { hash: string }).hash)).size,
2148
+ ).toBe(2)
1806
2149
  })
1807
2150
 
1808
2151
  test('transaction:included preserves the cursor when a confirmed block is unavailable', async () => {