tapimo 0.1.0 → 0.3.0

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 (520) hide show
  1. package/README.md +57 -16
  2. package/dist/ApiKey.d.ts +4 -1
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +6 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +98 -3
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +150 -1
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +7917 -2315
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +141 -329
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +20 -4
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +23 -4
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/Webhooks.d.ts +2 -2
  19. package/dist/Webhooks.d.ts.map +1 -1
  20. package/dist/Webhooks.js +2 -2
  21. package/dist/Webhooks.js.map +1 -1
  22. package/dist/admin/App.d.ts +203 -120
  23. package/dist/admin/App.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.d.ts +111 -6
  25. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  26. package/dist/admin/apps/api-keys.js +67 -0
  27. package/dist/admin/apps/api-keys.js.map +1 -1
  28. package/dist/admin/apps/scopes.d.ts +12 -1
  29. package/dist/admin/apps/scopes.d.ts.map +1 -1
  30. package/dist/admin/apps/scopes.js +3 -0
  31. package/dist/admin/apps/scopes.js.map +1 -1
  32. package/dist/admin/apps/verified-tokens.d.ts +116 -116
  33. package/dist/admin/apps/verified-tokens.js +1 -1
  34. package/dist/admin/apps/verified-tokens.js.map +1 -1
  35. package/dist/admin/ui.generated.d.ts +1 -1
  36. package/dist/admin/ui.generated.js +13 -13
  37. package/dist/admin/ui.generated.js.map +1 -1
  38. package/dist/analytics/Analytics.d.ts +151 -0
  39. package/dist/analytics/Analytics.d.ts.map +1 -0
  40. package/dist/analytics/Analytics.js +212 -0
  41. package/dist/analytics/Analytics.js.map +1 -0
  42. package/dist/analytics/tables/requestEvents.d.ts +215 -0
  43. package/dist/analytics/tables/requestEvents.d.ts.map +1 -0
  44. package/dist/analytics/tables/requestEvents.js +264 -0
  45. package/dist/analytics/tables/requestEvents.js.map +1 -0
  46. package/dist/apps/data/App.d.ts +19576 -0
  47. package/dist/apps/data/App.d.ts.map +1 -0
  48. package/dist/apps/data/App.js +272 -0
  49. package/dist/apps/data/App.js.map +1 -0
  50. package/dist/apps/data/index.d.ts +3 -0
  51. package/dist/apps/data/index.d.ts.map +1 -0
  52. package/dist/apps/data/index.js +3 -0
  53. package/dist/apps/data/index.js.map +1 -0
  54. package/dist/apps/{activities.d.ts → data/routes/activities.d.ts} +32 -32
  55. package/dist/apps/{activities.d.ts.map → data/routes/activities.d.ts.map} +1 -1
  56. package/dist/apps/{activities.js → data/routes/activities.js} +13 -13
  57. package/dist/apps/data/routes/activities.js.map +1 -0
  58. package/dist/apps/{addresses.d.ts → data/routes/addresses.d.ts} +22 -22
  59. package/dist/apps/{addresses.d.ts.map → data/routes/addresses.d.ts.map} +1 -1
  60. package/dist/apps/{addresses.js → data/routes/addresses.js} +5 -5
  61. package/dist/apps/data/routes/addresses.js.map +1 -0
  62. package/dist/apps/{balances.d.ts → data/routes/balances.d.ts} +4 -4
  63. package/dist/apps/data/routes/balances.d.ts.map +1 -0
  64. package/dist/apps/{balances.js → data/routes/balances.js} +42 -11
  65. package/dist/apps/data/routes/balances.js.map +1 -0
  66. package/dist/apps/{blocks.d.ts → data/routes/blocks.d.ts} +47 -47
  67. package/dist/apps/data/routes/blocks.d.ts.map +1 -0
  68. package/dist/apps/{blocks.js → data/routes/blocks.js} +13 -13
  69. package/dist/apps/data/routes/blocks.js.map +1 -0
  70. package/dist/apps/{coingecko.d.ts → data/routes/coingecko.d.ts} +8 -8
  71. package/dist/apps/data/routes/coingecko.d.ts.map +1 -0
  72. package/dist/apps/{coingecko.js → data/routes/coingecko.js} +13 -13
  73. package/dist/apps/data/routes/coingecko.js.map +1 -0
  74. package/dist/apps/{exchanges.d.ts → data/routes/exchanges.d.ts} +108 -108
  75. package/dist/apps/data/routes/exchanges.d.ts.map +1 -0
  76. package/dist/apps/{exchanges.js → data/routes/exchanges.js} +19 -19
  77. package/dist/apps/data/routes/exchanges.js.map +1 -0
  78. package/dist/apps/{fee-amm.d.ts → data/routes/fee-amm.d.ts} +39 -39
  79. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -0
  80. package/dist/apps/{fee-amm.js → data/routes/fee-amm.js} +17 -17
  81. package/dist/apps/data/routes/fee-amm.js.map +1 -0
  82. package/dist/apps/data/routes/funding.d.ts +765 -0
  83. package/dist/apps/data/routes/funding.d.ts.map +1 -0
  84. package/dist/apps/data/routes/funding.js +383 -0
  85. package/dist/apps/data/routes/funding.js.map +1 -0
  86. package/dist/apps/{indexer.d.ts → data/routes/indexer.d.ts} +4 -4
  87. package/dist/apps/data/routes/indexer.d.ts.map +1 -0
  88. package/dist/apps/{indexer.js → data/routes/indexer.js} +13 -9
  89. package/dist/apps/data/routes/indexer.js.map +1 -0
  90. package/dist/apps/{receipts.d.ts → data/routes/receipts.d.ts} +49 -49
  91. package/dist/apps/data/routes/receipts.d.ts.map +1 -0
  92. package/dist/apps/{receipts.js → data/routes/receipts.js} +14 -20
  93. package/dist/apps/data/routes/receipts.js.map +1 -0
  94. package/dist/apps/{rpc.d.ts → data/routes/rpc.d.ts} +33 -40
  95. package/dist/apps/data/routes/rpc.d.ts.map +1 -0
  96. package/dist/apps/{rpc.js → data/routes/rpc.js} +35 -7
  97. package/dist/apps/data/routes/rpc.js.map +1 -0
  98. package/dist/apps/{tokenlist.d.ts → data/routes/tokenlist.d.ts} +40 -40
  99. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -0
  100. package/dist/apps/{tokenlist.js → data/routes/tokenlist.js} +8 -8
  101. package/dist/apps/data/routes/tokenlist.js.map +1 -0
  102. package/dist/apps/{tokens.d.ts → data/routes/tokens.d.ts} +468 -468
  103. package/dist/apps/data/routes/tokens.d.ts.map +1 -0
  104. package/dist/apps/{tokens.js → data/routes/tokens.js} +19 -19
  105. package/dist/apps/data/routes/tokens.js.map +1 -0
  106. package/dist/apps/{transactions.d.ts → data/routes/transactions.d.ts} +304 -304
  107. package/dist/apps/data/routes/transactions.d.ts.map +1 -0
  108. package/dist/apps/{transactions.js → data/routes/transactions.js} +13 -13
  109. package/dist/apps/data/routes/transactions.js.map +1 -0
  110. package/dist/apps/{transfers.d.ts → data/routes/transfers.d.ts} +62 -62
  111. package/dist/apps/data/routes/transfers.d.ts.map +1 -0
  112. package/dist/apps/{transfers.js → data/routes/transfers.js} +13 -13
  113. package/dist/apps/data/routes/transfers.js.map +1 -0
  114. package/dist/apps/{verified-tokens.d.ts → data/routes/verified-tokens.d.ts} +6 -6
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -0
  116. package/dist/apps/{verified-tokens.js → data/routes/verified-tokens.js} +9 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -0
  118. package/dist/apps/{webhooks.d.ts → data/routes/webhooks.d.ts} +17 -17
  119. package/dist/apps/{webhooks.d.ts.map → data/routes/webhooks.d.ts.map} +1 -1
  120. package/dist/apps/{webhooks.js → data/routes/webhooks.js} +38 -34
  121. package/dist/apps/data/routes/webhooks.js.map +1 -0
  122. package/dist/apps/docs/App.d.ts +29 -0
  123. package/dist/apps/docs/App.d.ts.map +1 -0
  124. package/dist/apps/docs/App.js +54 -0
  125. package/dist/apps/docs/App.js.map +1 -0
  126. package/dist/{internal/OpenApi.fonts.d.ts → apps/docs/fonts.d.ts} +1 -1
  127. package/dist/apps/docs/fonts.d.ts.map +1 -0
  128. package/dist/{internal/OpenApi.fonts.js → apps/docs/fonts.js} +1 -1
  129. package/dist/apps/docs/fonts.js.map +1 -0
  130. package/dist/apps/docs/index.d.ts +2 -0
  131. package/dist/apps/docs/index.d.ts.map +1 -0
  132. package/dist/apps/docs/index.js +2 -0
  133. package/dist/apps/docs/index.js.map +1 -0
  134. package/dist/{internal/OpenApi.logo.d.ts → apps/docs/logo.d.ts} +1 -1
  135. package/dist/apps/docs/logo.d.ts.map +1 -0
  136. package/dist/{internal/OpenApi.logo.js → apps/docs/logo.js} +1 -1
  137. package/dist/apps/docs/logo.js.map +1 -0
  138. package/dist/apps/docs/reference.d.ts +21 -0
  139. package/dist/apps/docs/reference.d.ts.map +1 -0
  140. package/dist/apps/docs/reference.js +112 -0
  141. package/dist/apps/docs/reference.js.map +1 -0
  142. package/dist/apps/index.d.ts +5 -0
  143. package/dist/apps/index.d.ts.map +1 -0
  144. package/dist/apps/index.js +5 -0
  145. package/dist/apps/index.js.map +1 -0
  146. package/dist/apps/mcp.d.ts +76 -0
  147. package/dist/apps/mcp.d.ts.map +1 -0
  148. package/dist/apps/mcp.js +188 -0
  149. package/dist/apps/mcp.js.map +1 -0
  150. package/dist/apps/metadata.d.ts +7 -0
  151. package/dist/apps/metadata.d.ts.map +1 -0
  152. package/dist/apps/metadata.js +15 -0
  153. package/dist/apps/metadata.js.map +1 -0
  154. package/dist/apps/platform/App.d.ts +5262 -0
  155. package/dist/apps/platform/App.d.ts.map +1 -0
  156. package/dist/apps/platform/App.js +84 -0
  157. package/dist/apps/platform/App.js.map +1 -0
  158. package/dist/apps/platform/Billing.d.ts +279 -0
  159. package/dist/apps/platform/Billing.d.ts.map +1 -0
  160. package/dist/apps/platform/Billing.js +477 -0
  161. package/dist/apps/platform/Billing.js.map +1 -0
  162. package/dist/apps/platform/index.d.ts +3 -0
  163. package/dist/apps/platform/index.d.ts.map +1 -0
  164. package/dist/apps/platform/index.js +3 -0
  165. package/dist/apps/platform/index.js.map +1 -0
  166. package/dist/apps/platform/routes/api-keys.d.ts +973 -0
  167. package/dist/apps/platform/routes/api-keys.d.ts.map +1 -0
  168. package/dist/apps/platform/routes/api-keys.js +430 -0
  169. package/dist/apps/platform/routes/api-keys.js.map +1 -0
  170. package/dist/apps/platform/routes/billing.d.ts +1520 -0
  171. package/dist/apps/platform/routes/billing.d.ts.map +1 -0
  172. package/dist/apps/platform/routes/billing.js +795 -0
  173. package/dist/apps/platform/routes/billing.js.map +1 -0
  174. package/dist/apps/platform/routes/invitations.d.ts +851 -0
  175. package/dist/apps/platform/routes/invitations.d.ts.map +1 -0
  176. package/dist/apps/platform/routes/invitations.js +471 -0
  177. package/dist/apps/platform/routes/invitations.js.map +1 -0
  178. package/dist/apps/platform/routes/me.d.ts +95 -0
  179. package/dist/apps/platform/routes/me.d.ts.map +1 -0
  180. package/dist/apps/platform/routes/me.js +81 -0
  181. package/dist/apps/platform/routes/me.js.map +1 -0
  182. package/dist/apps/platform/routes/members.d.ts +554 -0
  183. package/dist/apps/platform/routes/members.d.ts.map +1 -0
  184. package/dist/apps/platform/routes/members.js +251 -0
  185. package/dist/apps/platform/routes/members.js.map +1 -0
  186. package/dist/apps/platform/routes/orgs.d.ts +596 -0
  187. package/dist/apps/platform/routes/orgs.d.ts.map +1 -0
  188. package/dist/apps/platform/routes/orgs.js +276 -0
  189. package/dist/apps/platform/routes/orgs.js.map +1 -0
  190. package/dist/apps/platform/routes/projects.d.ts +740 -0
  191. package/dist/apps/platform/routes/projects.d.ts.map +1 -0
  192. package/dist/apps/platform/routes/projects.js +286 -0
  193. package/dist/apps/platform/routes/projects.js.map +1 -0
  194. package/dist/apps/platform/routes/scopes.d.ts +107 -0
  195. package/dist/apps/platform/routes/scopes.d.ts.map +1 -0
  196. package/dist/apps/platform/routes/scopes.js +66 -0
  197. package/dist/apps/platform/routes/scopes.js.map +1 -0
  198. package/dist/apps/platform/routes/usage.d.ts +588 -0
  199. package/dist/apps/platform/routes/usage.d.ts.map +1 -0
  200. package/dist/apps/platform/routes/usage.js +391 -0
  201. package/dist/apps/platform/routes/usage.js.map +1 -0
  202. package/dist/apps/relay/App.d.ts +44 -0
  203. package/dist/apps/relay/App.d.ts.map +1 -0
  204. package/dist/apps/relay/App.js +211 -0
  205. package/dist/apps/relay/App.js.map +1 -0
  206. package/dist/apps/relay/Sponsorships.d.ts +107 -0
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -0
  208. package/dist/apps/relay/Sponsorships.js +194 -0
  209. package/dist/apps/relay/Sponsorships.js.map +1 -0
  210. package/dist/apps/relay/index.d.ts +3 -0
  211. package/dist/apps/relay/index.d.ts.map +1 -0
  212. package/dist/apps/relay/index.js +3 -0
  213. package/dist/apps/relay/index.js.map +1 -0
  214. package/dist/cli/Cli.d.ts +9 -2
  215. package/dist/cli/Cli.d.ts.map +1 -1
  216. package/dist/cli/Cli.js +12 -4
  217. package/dist/cli/Cli.js.map +1 -1
  218. package/dist/cli/commands/admin.d.ts +5 -1
  219. package/dist/cli/commands/admin.d.ts.map +1 -1
  220. package/dist/cli/commands/admin.js +82 -3
  221. package/dist/cli/commands/admin.js.map +1 -1
  222. package/dist/db/Db.d.ts +17 -0
  223. package/dist/db/Db.d.ts.map +1 -1
  224. package/dist/db/Db.js +254 -0
  225. package/dist/db/Db.js.map +1 -1
  226. package/dist/db/Schema.d.ts +159 -0
  227. package/dist/db/Schema.d.ts.map +1 -1
  228. package/dist/db/Schema.js +187 -2
  229. package/dist/db/Schema.js.map +1 -1
  230. package/dist/db/tables/billingSettings.d.ts +55 -0
  231. package/dist/db/tables/billingSettings.d.ts.map +1 -0
  232. package/dist/db/tables/billingSettings.js +70 -0
  233. package/dist/db/tables/billingSettings.js.map +1 -0
  234. package/dist/db/tables/invitations.d.ts +84 -0
  235. package/dist/db/tables/invitations.d.ts.map +1 -0
  236. package/dist/db/tables/invitations.js +165 -0
  237. package/dist/db/tables/invitations.js.map +1 -0
  238. package/dist/db/tables/memberships.d.ts +108 -0
  239. package/dist/db/tables/memberships.d.ts.map +1 -0
  240. package/dist/db/tables/memberships.js +153 -0
  241. package/dist/db/tables/memberships.js.map +1 -0
  242. package/dist/db/tables/organizations.d.ts +48 -0
  243. package/dist/db/tables/organizations.d.ts.map +1 -1
  244. package/dist/db/tables/organizations.js +97 -2
  245. package/dist/db/tables/organizations.js.map +1 -1
  246. package/dist/db/tables/projects.d.ts +65 -0
  247. package/dist/db/tables/projects.d.ts.map +1 -0
  248. package/dist/db/tables/projects.js +75 -0
  249. package/dist/db/tables/projects.js.map +1 -0
  250. package/dist/db/tables/requestUsage.d.ts +121 -0
  251. package/dist/db/tables/requestUsage.d.ts.map +1 -0
  252. package/dist/db/tables/requestUsage.js +150 -0
  253. package/dist/db/tables/requestUsage.js.map +1 -0
  254. package/dist/db/tables/sponsoredTransactions.d.ts +239 -0
  255. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -0
  256. package/dist/db/tables/sponsoredTransactions.js +314 -0
  257. package/dist/db/tables/sponsoredTransactions.js.map +1 -0
  258. package/dist/db/tables/stripeCustomers.d.ts +81 -0
  259. package/dist/db/tables/stripeCustomers.d.ts.map +1 -0
  260. package/dist/db/tables/stripeCustomers.js +120 -0
  261. package/dist/db/tables/stripeCustomers.js.map +1 -0
  262. package/dist/db/tables/users.d.ts +48 -0
  263. package/dist/db/tables/users.d.ts.map +1 -0
  264. package/dist/db/tables/users.js +65 -0
  265. package/dist/db/tables/users.js.map +1 -0
  266. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  267. package/dist/handlers/internal/executionError.js +2 -0
  268. package/dist/handlers/internal/executionError.js.map +1 -1
  269. package/dist/handlers/internal/multisig.d.ts +2 -6
  270. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  271. package/dist/handlers/internal/multisig.js +11 -36
  272. package/dist/handlers/internal/multisig.js.map +1 -1
  273. package/dist/handlers/internal/sponsorship.d.ts +35 -2
  274. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  275. package/dist/handlers/internal/sponsorship.js +53 -14
  276. package/dist/handlers/internal/sponsorship.js.map +1 -1
  277. package/dist/handlers/internal/utils.d.ts +10 -3
  278. package/dist/handlers/internal/utils.d.ts.map +1 -1
  279. package/dist/handlers/internal/utils.js +14 -6
  280. package/dist/handlers/internal/utils.js.map +1 -1
  281. package/dist/handlers/relay.d.ts +6 -2
  282. package/dist/handlers/relay.d.ts.map +1 -1
  283. package/dist/handlers/relay.js +16 -2
  284. package/dist/handlers/relay.js.map +1 -1
  285. package/dist/index.d.ts +1 -0
  286. package/dist/index.d.ts.map +1 -1
  287. package/dist/index.js +1 -0
  288. package/dist/index.js.map +1 -1
  289. package/dist/internal/Auth.d.ts +222 -6
  290. package/dist/internal/Auth.d.ts.map +1 -1
  291. package/dist/internal/Auth.js +625 -74
  292. package/dist/internal/Auth.js.map +1 -1
  293. package/dist/internal/Cache.d.ts.map +1 -1
  294. package/dist/internal/Cache.js +4 -1
  295. package/dist/internal/Cache.js.map +1 -1
  296. package/dist/internal/EdgeCache.d.ts +10 -0
  297. package/dist/internal/EdgeCache.d.ts.map +1 -1
  298. package/dist/internal/EdgeCache.js +39 -8
  299. package/dist/internal/EdgeCache.js.map +1 -1
  300. package/dist/internal/Fees.d.ts +27 -0
  301. package/dist/internal/Fees.d.ts.map +1 -0
  302. package/dist/internal/Fees.js +48 -0
  303. package/dist/internal/Fees.js.map +1 -0
  304. package/dist/internal/FundingRoutes.d.ts +183 -0
  305. package/dist/internal/FundingRoutes.d.ts.map +1 -0
  306. package/dist/internal/FundingRoutes.js +490 -0
  307. package/dist/internal/FundingRoutes.js.map +1 -0
  308. package/dist/internal/Id.d.ts +15 -0
  309. package/dist/internal/Id.d.ts.map +1 -0
  310. package/dist/internal/Id.js +22 -0
  311. package/dist/internal/Id.js.map +1 -0
  312. package/dist/internal/Log.d.ts +9 -3
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +7 -0
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/OpenApi.d.ts +10 -20
  317. package/dist/internal/OpenApi.d.ts.map +1 -1
  318. package/dist/internal/OpenApi.js +8 -58
  319. package/dist/internal/OpenApi.js.map +1 -1
  320. package/dist/internal/RateLimit.d.ts +25 -0
  321. package/dist/internal/RateLimit.d.ts.map +1 -1
  322. package/dist/internal/RateLimit.js +51 -0
  323. package/dist/internal/RateLimit.js.map +1 -1
  324. package/dist/internal/Response.d.ts +1 -1
  325. package/dist/internal/Response.d.ts.map +1 -1
  326. package/dist/internal/Schema.d.ts +8 -0
  327. package/dist/internal/Schema.d.ts.map +1 -1
  328. package/dist/internal/Schema.js +7 -0
  329. package/dist/internal/Schema.js.map +1 -1
  330. package/dist/internal/Store.d.ts +7 -1
  331. package/dist/internal/Store.d.ts.map +1 -1
  332. package/dist/internal/Store.js +16 -2
  333. package/dist/internal/Store.js.map +1 -1
  334. package/dist/internal/Viem.d.ts +84 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Webhooks.d.ts +1 -1
  337. package/dist/internal/Webhooks.d.ts.map +1 -1
  338. package/dist/internal/Webhooks.js +3 -3
  339. package/dist/internal/Webhooks.js.map +1 -1
  340. package/package.json +33 -6
  341. package/src/ApiKey.ts +10 -2
  342. package/src/ApiKeys.test.ts +155 -1
  343. package/src/ApiKeys.ts +203 -1
  344. package/src/App.test.ts +64 -75741
  345. package/src/App.ts +218 -420
  346. package/src/Client.test-d.ts +657 -15
  347. package/src/Scope.ts +26 -4
  348. package/src/Webhooks.ts +2 -2
  349. package/src/admin/apps/api-keys.test.ts +51 -0
  350. package/src/admin/apps/api-keys.ts +84 -0
  351. package/src/admin/apps/scopes.test.ts +11 -1
  352. package/src/admin/apps/scopes.ts +3 -0
  353. package/src/admin/apps/verified-tokens.ts +1 -1
  354. package/src/admin/ui/src/components/Page.tsx +2 -3
  355. package/src/admin/ui/src/routes/__root.tsx +2 -2
  356. package/src/admin/ui/src/routes/api-keys.tsx +2 -2
  357. package/src/admin/ui.generated.ts +13 -13
  358. package/src/analytics/Analytics.test.ts +527 -0
  359. package/src/analytics/Analytics.ts +318 -0
  360. package/src/analytics/tables/requestEvents.ts +523 -0
  361. package/src/apps/composition.test.ts +66 -0
  362. package/src/apps/data/App.test.ts +72 -0
  363. package/src/apps/data/App.ts +330 -0
  364. package/src/apps/data/index.ts +2 -0
  365. package/src/apps/{activities.test.ts → data/routes/activities.test.ts} +3 -3
  366. package/src/apps/{activities.ts → data/routes/activities.ts} +15 -15
  367. package/src/apps/{addresses.ts → data/routes/addresses.ts} +6 -6
  368. package/src/apps/{balances.test.ts → data/routes/balances.test.ts} +2 -2
  369. package/src/apps/{balances.ts → data/routes/balances.ts} +46 -12
  370. package/src/apps/{blocks.test.ts → data/routes/blocks.test.ts} +3 -3
  371. package/src/apps/{blocks.ts → data/routes/blocks.ts} +14 -14
  372. package/src/apps/{coingecko.test.ts → data/routes/coingecko.test.ts} +2 -2
  373. package/src/apps/{coingecko.ts → data/routes/coingecko.ts} +14 -14
  374. package/src/apps/{exchanges.test.ts → data/routes/exchanges.test.ts} +1 -1
  375. package/src/apps/{exchanges.ts → data/routes/exchanges.ts} +20 -20
  376. package/src/apps/{fee-amm.test.ts → data/routes/fee-amm.test.ts} +3 -3
  377. package/src/apps/{fee-amm.ts → data/routes/fee-amm.ts} +18 -18
  378. package/src/apps/data/routes/funding.test.ts +214 -0
  379. package/src/apps/data/routes/funding.ts +584 -0
  380. package/src/apps/{indexer.test.ts → data/routes/indexer.test.ts} +26 -5
  381. package/src/apps/{indexer.ts → data/routes/indexer.ts} +13 -10
  382. package/src/apps/{receipts.test.ts → data/routes/receipts.test.ts} +3 -3
  383. package/src/apps/{receipts.ts → data/routes/receipts.ts} +15 -22
  384. package/src/apps/{rpc.test.ts → data/routes/rpc.test.ts} +122 -7
  385. package/src/apps/{rpc.ts → data/routes/rpc.ts} +38 -8
  386. package/src/apps/{tokenlist.test.ts → data/routes/tokenlist.test.ts} +3 -3
  387. package/src/apps/{tokenlist.ts → data/routes/tokenlist.ts} +9 -9
  388. package/src/apps/{tokens.test.ts → data/routes/tokens.test.ts} +2 -2
  389. package/src/apps/{tokens.ts → data/routes/tokens.ts} +20 -20
  390. package/src/apps/{transactions.test.ts → data/routes/transactions.test.ts} +3 -3
  391. package/src/apps/{transactions.ts → data/routes/transactions.ts} +15 -15
  392. package/src/apps/{transfers.test.ts → data/routes/transfers.test.ts} +2 -2
  393. package/src/apps/{transfers.ts → data/routes/transfers.ts} +15 -15
  394. package/src/apps/{verified-tokens.test.ts → data/routes/verified-tokens.test.ts} +3 -3
  395. package/src/apps/{verified-tokens.ts → data/routes/verified-tokens.ts} +10 -10
  396. package/src/apps/{webhooks.test.ts → data/routes/webhooks.test.ts} +7 -7
  397. package/src/apps/{webhooks.ts → data/routes/webhooks.ts} +50 -43
  398. package/src/apps/docs/App.ts +65 -0
  399. package/src/apps/docs/index.ts +1 -0
  400. package/src/apps/docs/reference.ts +132 -0
  401. package/src/apps/index.ts +4 -0
  402. package/src/apps/mcp.test.ts +206 -0
  403. package/src/apps/mcp.ts +250 -0
  404. package/src/apps/metadata.ts +23 -0
  405. package/src/apps/platform/App.ts +169 -0
  406. package/src/apps/platform/Billing.test.ts +530 -0
  407. package/src/apps/platform/Billing.ts +682 -0
  408. package/src/apps/platform/index.ts +2 -0
  409. package/src/apps/platform/routes/api-keys.test.ts +493 -0
  410. package/src/apps/platform/routes/api-keys.ts +543 -0
  411. package/src/apps/platform/routes/billing.test.ts +1100 -0
  412. package/src/apps/platform/routes/billing.ts +966 -0
  413. package/src/apps/platform/routes/invitations.test.ts +409 -0
  414. package/src/apps/platform/routes/invitations.ts +587 -0
  415. package/src/apps/platform/routes/me.test.ts +351 -0
  416. package/src/apps/platform/routes/me.ts +106 -0
  417. package/src/apps/platform/routes/members.test.ts +195 -0
  418. package/src/apps/platform/routes/members.ts +313 -0
  419. package/src/apps/platform/routes/orgs.test.ts +313 -0
  420. package/src/apps/platform/routes/orgs.ts +365 -0
  421. package/src/apps/platform/routes/projects.test.ts +181 -0
  422. package/src/apps/platform/routes/projects.ts +367 -0
  423. package/src/apps/platform/routes/scopes.test.ts +29 -0
  424. package/src/apps/platform/routes/scopes.ts +85 -0
  425. package/src/apps/platform/routes/usage.test.ts +422 -0
  426. package/src/apps/platform/routes/usage.ts +527 -0
  427. package/src/apps/relay/App.test.ts +933 -0
  428. package/src/apps/relay/App.ts +236 -0
  429. package/src/apps/relay/Sponsorships.test.ts +375 -0
  430. package/src/apps/relay/Sponsorships.ts +306 -0
  431. package/src/apps/relay/index.ts +2 -0
  432. package/src/cli/Cli.test.ts +25 -2
  433. package/src/cli/Cli.ts +18 -3
  434. package/src/cli/commands/admin.test.ts +83 -0
  435. package/src/cli/commands/admin.ts +91 -3
  436. package/src/db/Db.ts +296 -0
  437. package/src/db/Schema.ts +241 -2
  438. package/src/db/tables/billingSettings.test.ts +87 -0
  439. package/src/db/tables/billingSettings.ts +108 -0
  440. package/src/db/tables/invitations.ts +198 -0
  441. package/src/db/tables/memberships.ts +208 -0
  442. package/src/db/tables/organizations.test.ts +38 -2
  443. package/src/db/tables/organizations.ts +117 -2
  444. package/src/db/tables/projects.ts +107 -0
  445. package/src/db/tables/requestUsage.ts +231 -0
  446. package/src/db/tables/sponsoredTransactions.test.ts +325 -0
  447. package/src/db/tables/sponsoredTransactions.ts +464 -0
  448. package/src/db/tables/stripeCustomers.test.ts +109 -0
  449. package/src/db/tables/stripeCustomers.ts +162 -0
  450. package/src/db/tables/users.ts +85 -0
  451. package/src/handlers/internal/executionError.ts +2 -0
  452. package/src/handlers/internal/multisig.test.ts +84 -10
  453. package/src/handlers/internal/multisig.ts +15 -50
  454. package/src/handlers/internal/sponsorship.ts +106 -20
  455. package/src/handlers/internal/utils.ts +19 -7
  456. package/src/handlers/{internal/relay.localnet.test.ts → relay.test.ts} +2 -2
  457. package/src/handlers/relay.ts +23 -5
  458. package/src/index.ts +1 -0
  459. package/src/internal/Auth.test.ts +491 -25
  460. package/src/internal/Auth.ts +839 -84
  461. package/src/internal/Cache.ts +5 -1
  462. package/src/internal/Cursor.test.ts +3 -2
  463. package/src/internal/EdgeCache.test.ts +27 -4
  464. package/src/internal/EdgeCache.ts +47 -9
  465. package/src/internal/Fees.test.ts +32 -0
  466. package/src/internal/Fees.ts +51 -0
  467. package/src/internal/FundingRoutes.ts +583 -0
  468. package/src/internal/Id.test.ts +17 -0
  469. package/src/internal/Id.ts +24 -0
  470. package/src/internal/Log.test.ts +2 -1
  471. package/src/internal/Log.ts +16 -3
  472. package/src/internal/MetricSink.ts +1 -1
  473. package/src/internal/OpenApi.ts +12 -60
  474. package/src/internal/RateLimit.test.ts +84 -0
  475. package/src/internal/RateLimit.ts +70 -0
  476. package/src/internal/Response.ts +1 -1
  477. package/src/internal/Schema.ts +8 -0
  478. package/src/internal/Store.test.ts +52 -0
  479. package/src/internal/Store.ts +24 -5
  480. package/src/internal/Tidx.local.test.ts +1 -1
  481. package/src/internal/VerifiedTokens.test.ts +1 -1
  482. package/src/internal/WebhookDestination.test.ts +1 -1
  483. package/src/internal/Webhooks.test.ts +7 -7
  484. package/src/internal/Webhooks.ts +4 -4
  485. package/dist/apps/activities.js.map +0 -1
  486. package/dist/apps/addresses.js.map +0 -1
  487. package/dist/apps/balances.d.ts.map +0 -1
  488. package/dist/apps/balances.js.map +0 -1
  489. package/dist/apps/blocks.d.ts.map +0 -1
  490. package/dist/apps/blocks.js.map +0 -1
  491. package/dist/apps/coingecko.d.ts.map +0 -1
  492. package/dist/apps/coingecko.js.map +0 -1
  493. package/dist/apps/exchanges.d.ts.map +0 -1
  494. package/dist/apps/exchanges.js.map +0 -1
  495. package/dist/apps/fee-amm.d.ts.map +0 -1
  496. package/dist/apps/fee-amm.js.map +0 -1
  497. package/dist/apps/indexer.d.ts.map +0 -1
  498. package/dist/apps/indexer.js.map +0 -1
  499. package/dist/apps/receipts.d.ts.map +0 -1
  500. package/dist/apps/receipts.js.map +0 -1
  501. package/dist/apps/rpc.d.ts.map +0 -1
  502. package/dist/apps/rpc.js.map +0 -1
  503. package/dist/apps/tokenlist.d.ts.map +0 -1
  504. package/dist/apps/tokenlist.js.map +0 -1
  505. package/dist/apps/tokens.d.ts.map +0 -1
  506. package/dist/apps/tokens.js.map +0 -1
  507. package/dist/apps/transactions.d.ts.map +0 -1
  508. package/dist/apps/transactions.js.map +0 -1
  509. package/dist/apps/transfers.d.ts.map +0 -1
  510. package/dist/apps/transfers.js.map +0 -1
  511. package/dist/apps/verified-tokens.d.ts.map +0 -1
  512. package/dist/apps/verified-tokens.js.map +0 -1
  513. package/dist/apps/webhooks.js.map +0 -1
  514. package/dist/internal/OpenApi.fonts.d.ts.map +0 -1
  515. package/dist/internal/OpenApi.fonts.js.map +0 -1
  516. package/dist/internal/OpenApi.logo.d.ts.map +0 -1
  517. package/dist/internal/OpenApi.logo.js.map +0 -1
  518. package/src/handlers/internal/multisig.localnet.test.ts +0 -146
  519. /package/src/{internal/OpenApi.fonts.ts → apps/docs/fonts.ts} +0 -0
  520. /package/src/{internal/OpenApi.logo.ts → apps/docs/logo.ts} +0 -0
@@ -5,14 +5,14 @@ import { type Address as ViemAddress, formatUnits } from 'viem'
5
5
  import { Addresses, Tick } from 'viem/tempo'
6
6
  import * as z from 'zod/mini'
7
7
 
8
- import type * as App from '../App.js'
9
- import * as Auth from '../internal/Auth.js'
10
- import * as Cache from '../internal/Cache.js'
11
- import * as OpenApi from '../internal/OpenApi.js'
12
- import * as Response from '../internal/Response.js'
13
- import * as Schema from '../internal/Schema.js'
14
- import * as Timing from '../internal/Timing.js'
15
- import * as Value from '../internal/Value.js'
8
+ import type * as App from '../../../App.js'
9
+ import * as Auth from '../../../internal/Auth.js'
10
+ import * as Cache from '../../../internal/Cache.js'
11
+ import * as OpenApi from '../../../internal/OpenApi.js'
12
+ import * as Response from '../../../internal/Response.js'
13
+ import * as Schema from '../../../internal/Schema.js'
14
+ import * as Timing from '../../../internal/Timing.js'
15
+ import * as Value from '../../../internal/Value.js'
16
16
  import { resolveBookQuotes, resolveBookReserves, resolveOrderStates } from './exchanges.js'
17
17
  import { getTokenMetadata } from './tokens.js'
18
18
 
@@ -484,9 +484,9 @@ const guardChainId = createMiddleware<App.Environment>(async (c, next) => {
484
484
 
485
485
  export function coingecko() {
486
486
  return new Hono<App.Environment>()
487
- .use('/:chainId/*', guardChainId)
487
+ .use('/gecko/:chainId/*', guardChainId)
488
488
  .get(
489
- '/:chainId/latest-block',
489
+ '/gecko/:chainId/latest-block',
490
490
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
491
491
  OpenApi.validate('param', schema.ChainIdParam, {
492
492
  code: 'chain_id_invalid',
@@ -527,7 +527,7 @@ export function coingecko() {
527
527
  },
528
528
  )
529
529
  .get(
530
- '/:chainId/assets/:address',
530
+ '/gecko/:chainId/assets/:address',
531
531
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
532
532
  OpenApi.validate('param', schema.AssetParams, {
533
533
  code: 'address_invalid',
@@ -578,7 +578,7 @@ export function coingecko() {
578
578
  },
579
579
  )
580
580
  .get(
581
- '/:chainId/pairs',
581
+ '/gecko/:chainId/pairs',
582
582
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
583
583
  OpenApi.validate('param', schema.ChainIdParam, {
584
584
  code: 'chain_id_invalid',
@@ -649,7 +649,7 @@ export function coingecko() {
649
649
  },
650
650
  )
651
651
  .get(
652
- '/:chainId/pairs/:pairId',
652
+ '/gecko/:chainId/pairs/:pairId',
653
653
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
654
654
  OpenApi.validate('param', schema.PairParams, {
655
655
  code: 'pair_id_invalid',
@@ -711,7 +711,7 @@ export function coingecko() {
711
711
  },
712
712
  )
713
713
  .get(
714
- '/:chainId/events',
714
+ '/gecko/:chainId/events',
715
715
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
716
716
  OpenApi.validate('param', schema.ChainIdParam, {
717
717
  code: 'chain_id_invalid',
@@ -1,7 +1,7 @@
1
1
  import type * as z from 'zod/mini'
2
2
  import { Schema } from 'tapimo'
3
3
 
4
- import * as TestApp from '../../test/App.js'
4
+ import * as TestApp from '../../../../test/App.js'
5
5
  import * as Exchanges from './exchanges.js'
6
6
 
7
7
  type OrdersResponse = z.output<typeof Exchanges.schema.getOrders.Response>
@@ -10,18 +10,18 @@ import {
10
10
  import { Actions, Addresses, Tick } from 'viem/tempo'
11
11
  import * as z from 'zod/mini'
12
12
 
13
- import type * as App from '../App.js'
14
- import * as Auth from '../internal/Auth.js'
15
- import * as Cache from '../internal/Cache.js'
16
- import * as Cursor from '../internal/Cursor.js'
17
- import * as OpenApi from '../internal/OpenApi.js'
18
- import * as Response from '../internal/Response.js'
19
- import * as Schema from '../internal/Schema.js'
20
- import * as Store from '../internal/Store.js'
21
- import * as Timing from '../internal/Timing.js'
22
- import * as Ttl from '../internal/Ttl.js'
23
- import * as Value from '../internal/Value.js'
24
- import * as VerifiedTokens from '../internal/VerifiedTokens.js'
13
+ import type * as App from '../../../App.js'
14
+ import * as Auth from '../../../internal/Auth.js'
15
+ import * as Cache from '../../../internal/Cache.js'
16
+ import * as Cursor from '../../../internal/Cursor.js'
17
+ import * as OpenApi from '../../../internal/OpenApi.js'
18
+ import * as Response from '../../../internal/Response.js'
19
+ import * as Schema from '../../../internal/Schema.js'
20
+ import * as Store from '../../../internal/Store.js'
21
+ import * as Timing from '../../../internal/Timing.js'
22
+ import * as Ttl from '../../../internal/Ttl.js'
23
+ import * as Value from '../../../internal/Value.js'
24
+ import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
25
25
  import * as Tokens from './tokens.js'
26
26
 
27
27
  // Stablecoin DEX precompile. Pair lifecycle is announced by `PairCreated` from
@@ -1312,7 +1312,7 @@ export namespace schema {
1312
1312
  export function exchanges() {
1313
1313
  return new Hono<App.Environment>()
1314
1314
  .get(
1315
- '/swaps',
1315
+ '/v1/exchange/swaps',
1316
1316
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1317
1317
  OpenApi.validate('query', schema.getSwaps.Query, {
1318
1318
  code: 'query_invalid',
@@ -1422,7 +1422,7 @@ export function exchanges() {
1422
1422
  },
1423
1423
  )
1424
1424
  .get(
1425
- '/pairs',
1425
+ '/v1/exchange/pairs',
1426
1426
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1427
1427
  OpenApi.validate('query', schema.getPairs.Query, {
1428
1428
  code: 'query_invalid',
@@ -1529,7 +1529,7 @@ export function exchanges() {
1529
1529
  .get(
1530
1530
  // Single trading pair detail. The base address alone identifies the
1531
1531
  // pair (its quote is intrinsic to the base token on-chain).
1532
- '/pairs/:base',
1532
+ '/v1/exchange/pairs/:base',
1533
1533
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1534
1534
  OpenApi.validate('param', schema.getPair.Params, {
1535
1535
  code: 'pair_invalid',
@@ -1622,7 +1622,7 @@ export function exchanges() {
1622
1622
  )
1623
1623
  .get(
1624
1624
  // Resting-order feed, optionally scoped to one pair via `base`.
1625
- '/orders',
1625
+ '/v1/exchange/orders',
1626
1626
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1627
1627
  OpenApi.validate('query', schema.getOrders.Query, {
1628
1628
  code: 'query_invalid',
@@ -1747,7 +1747,7 @@ export function exchanges() {
1747
1747
  .get(
1748
1748
  // Single-order detail. The path-param schema rejects non-decimal
1749
1749
  // `orderId` values, surfacing the canonical `order_invalid` error.
1750
- '/orders/:orderId',
1750
+ '/v1/exchange/orders/:orderId',
1751
1751
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1752
1752
  OpenApi.validate('param', schema.getOrder.Params, {
1753
1753
  code: 'order_invalid',
@@ -1856,7 +1856,7 @@ export function exchanges() {
1856
1856
  )
1857
1857
  .get(
1858
1858
  // Paginated fill history for a single order.
1859
- '/orders/:orderId/fills',
1859
+ '/v1/exchange/orders/:orderId/fills',
1860
1860
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1861
1861
  OpenApi.validate('param', schema.getOrderFills.Params, {
1862
1862
  code: 'order_invalid',
@@ -1945,7 +1945,7 @@ export function exchanges() {
1945
1945
  .get(
1946
1946
  // OHLC (candlestick) aggregations for a single pair, addressed by its
1947
1947
  // base token.
1948
- '/pairs/:base/ohlc',
1948
+ '/v1/exchange/pairs/:base/ohlc',
1949
1949
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1950
1950
  OpenApi.validate('param', schema.getPairOhlc.Params, {
1951
1951
  code: 'pair_invalid',
@@ -2053,7 +2053,7 @@ export function exchanges() {
2053
2053
  .get(
2054
2054
  // Orderbook depth (cumulative size per tick) for a single pair,
2055
2055
  // addressed by its base token.
2056
- '/pairs/:base/depth',
2056
+ '/v1/exchange/pairs/:base/depth',
2057
2057
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
2058
2058
  OpenApi.validate('param', schema.getPairDepth.Params, {
2059
2059
  code: 'pair_invalid',
@@ -1,8 +1,8 @@
1
1
  import { Abis, Addresses } from 'viem/tempo'
2
2
 
3
- import * as TestApp from '../../test/App.js'
4
- import * as Runtime from '../../test/runtime.js'
5
- import * as TestViem from '../../test/Viem.js'
3
+ import * as TestApp from '../../../../test/App.js'
4
+ import * as Runtime from '../../../../test/runtime.js'
5
+ import * as TestViem from '../../../../test/Viem.js'
6
6
  import * as FeeAmm from './fee-amm.js'
7
7
 
8
8
  /** Validator-side token with live fee-AMM activity on Tempo Moderato. */
@@ -3,18 +3,18 @@ import { AbiEvent, AbiParameters, Hash, type Hex, Value as core_Value } from 'ox
3
3
  import { Abis, Addresses } from 'viem/tempo'
4
4
  import * as z from 'zod/mini'
5
5
 
6
- import type * as App from '../App.js'
7
- import * as Auth from '../internal/Auth.js'
8
- import * as Cache from '../internal/Cache.js'
9
- import * as Cursor from '../internal/Cursor.js'
10
- import * as OpenApi from '../internal/OpenApi.js'
11
- import * as Response from '../internal/Response.js'
12
- import * as Schema from '../internal/Schema.js'
13
- import * as Store from '../internal/Store.js'
14
- import * as Timing from '../internal/Timing.js'
15
- import * as Ttl from '../internal/Ttl.js'
16
- import * as Value from '../internal/Value.js'
17
- import * as VerifiedTokens from '../internal/VerifiedTokens.js'
6
+ import type * as App from '../../../App.js'
7
+ import * as Auth from '../../../internal/Auth.js'
8
+ import * as Cache from '../../../internal/Cache.js'
9
+ import * as Cursor from '../../../internal/Cursor.js'
10
+ import * as OpenApi from '../../../internal/OpenApi.js'
11
+ import * as Response from '../../../internal/Response.js'
12
+ import * as Schema from '../../../internal/Schema.js'
13
+ import * as Store from '../../../internal/Store.js'
14
+ import * as Timing from '../../../internal/Timing.js'
15
+ import * as Ttl from '../../../internal/Ttl.js'
16
+ import * as Value from '../../../internal/Value.js'
17
+ import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
18
18
  import * as Tokens from './tokens.js'
19
19
 
20
20
  // The protocol Fee AMM lives at the reserved FeeManager address. Pools are
@@ -308,7 +308,7 @@ export namespace schema {
308
308
  export function feeAmm() {
309
309
  return new Hono<App.Environment>()
310
310
  .get(
311
- '/pools',
311
+ '/v1/fee-amm/pools',
312
312
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
313
313
  OpenApi.validate('query', schema.getFeeAmmPools.Query, {
314
314
  code: 'query_invalid',
@@ -420,7 +420,7 @@ export function feeAmm() {
420
420
  },
421
421
  )
422
422
  .get(
423
- '/mints',
423
+ '/v1/fee-amm/mints',
424
424
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
425
425
  OpenApi.validate('query', schema.getFeeAmmMints.Query, {
426
426
  code: 'query_invalid',
@@ -520,8 +520,8 @@ export function feeAmm() {
520
520
  * Discovers fee pools by aggregating the FeeManager's `Mint` logs into one
521
521
  * row per `(userToken, validatorToken)` pair, paginated and ordered by mint
522
522
  * count (most active first), so the real fee pools (thousands to millions of
523
- * mints) lead the head pages and the one-shot spam pairs (mint count 1) sink
524
- * to the tail.
523
+ * mints) lead the head pages and the spam pairs (mint count 1) sink to the
524
+ * tail.
525
525
  *
526
526
  * Keyset pagination on `(mint_count, topic2, topic3)`: `mint_count` ranks the
527
527
  * page (mutable — it grows as pools mint — so this is best-effort across mint
@@ -568,7 +568,7 @@ function listPools(c: Context<App.Environment>, options: listPools.Options) {
568
568
 
569
569
  // Raw-`logs` ClickHouse aggregate (dynamic query, hence the cast):
570
570
  // ordering is by mint count so the head pages surface the real fee
571
- // pools and the one-shot spam pairs sink to the tail. Fetch one extra
571
+ // pools and the single-mint spam pairs sink to the tail. Fetch one extra
572
572
  // row to detect `hasMore` without a separate count query.
573
573
  const result = await tidx.fetch({
574
574
  chainId,
@@ -669,7 +669,7 @@ declare namespace listPools {
669
669
  * Addresses are lowercased to match the indexer's stored casing.
670
670
  *
671
671
  * The set is intentionally gated to the verified list rather than every pooled
672
- * token: anyone can mint a one-shot spam pool, so the raw set of pool
672
+ * token: anyone can mint a single-mint spam pool, so the raw set of pool
673
673
  * `userToken`s is unbounded (tens of thousands on busy chains) and those
674
674
  * liquidity-less pools can't actually settle fees. Restricting to verified
675
675
  * tokens keeps the set small (a handful of USD stablecoins), bounds the scan
@@ -0,0 +1,214 @@
1
+ import { Schema } from 'tapimo'
2
+
3
+ import * as TestApp from '../../../../test/App.js'
4
+ import * as Funding from './funding.js'
5
+
6
+ describe('GET /funding/routes', () => {
7
+ test('returns static inventory-backed route candidates', async () => {
8
+ const response = await TestApp.client().v1.funding.routes.$get(
9
+ {
10
+ query: {
11
+ destinationToken: 'USDC.e',
12
+ sourceAmount: '1000000',
13
+ sourceChain: 'base',
14
+ sourceToken: 'USDC',
15
+ },
16
+ },
17
+ TestApp.auth,
18
+ )
19
+ expect(response.status).toBe(200)
20
+ const body = await TestApp.json(response, Funding.schema.listFundingRoutes.Response)
21
+
22
+ expect(body.data.map((route) => route.provider.id)).toEqual([
23
+ 'across',
24
+ 'relay',
25
+ 'bridge',
26
+ 'bungee',
27
+ ])
28
+ expect(body.data[0]).toMatchObject({
29
+ destinationChain: { id: 'eip155:4217', name: 'Tempo' },
30
+ destinationToken: { symbol: 'USDC.e' },
31
+ id: 'base-usdc-tempo-usdce-across',
32
+ quality: { liquiditySource: 'staticInventory', tier: 'unknown' },
33
+ sourceAmount: { amount: '1000000', formatted: '1' },
34
+ sourceChain: { id: 'eip155:8453', name: 'Base' },
35
+ sourceToken: { symbol: 'USDC' },
36
+ status: 'unknown',
37
+ })
38
+ })
39
+
40
+ test('converts decimal source amounts after resolving the source token', async () => {
41
+ const response = await TestApp.client().v1.funding.routes.$get(
42
+ {
43
+ query: {
44
+ provider: 'relay',
45
+ sourceAmount: '1.25',
46
+ sourceAmountUnits: 'decimal',
47
+ sourceChain: 'eip155:8453',
48
+ sourceToken: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
49
+ },
50
+ },
51
+ TestApp.auth,
52
+ )
53
+ expect(response.status).toBe(200)
54
+ const body = await TestApp.json(response, Funding.schema.listFundingRoutes.Response)
55
+
56
+ expect(body.data).toHaveLength(1)
57
+ expect(body.data[0]?.sourceAmount).toMatchObject({
58
+ amount: '1250000',
59
+ formatted: '1.25',
60
+ })
61
+ })
62
+
63
+ test('does not case-fold non-EVM source token identifiers', async () => {
64
+ const solanaMint = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
65
+ const exactResponse = await TestApp.client().v1.funding.routes.$get(
66
+ {
67
+ query: {
68
+ sourceAmount: '1000000',
69
+ sourceChain: 'solana',
70
+ sourceToken: solanaMint,
71
+ },
72
+ },
73
+ TestApp.auth,
74
+ )
75
+ expect(exactResponse.status).toBe(200)
76
+ const exactBody = await TestApp.json(exactResponse, Funding.schema.listFundingRoutes.Response)
77
+ expect(exactBody.data.map((route) => route.provider.id)).toEqual(['bridge'])
78
+
79
+ const lowercasedSolanaResponse = await TestApp.client().v1.funding.routes.$get(
80
+ {
81
+ query: {
82
+ sourceAmount: '1000000',
83
+ sourceChain: 'solana',
84
+ sourceToken: solanaMint.toLowerCase(),
85
+ },
86
+ },
87
+ TestApp.auth,
88
+ )
89
+ expect(lowercasedSolanaResponse.status).toBe(200)
90
+ const lowercasedSolanaBody = await TestApp.json(
91
+ lowercasedSolanaResponse,
92
+ Funding.schema.listFundingRoutes.Response,
93
+ )
94
+ expect(lowercasedSolanaBody.data).toEqual([])
95
+
96
+ const lowercasedTronResponse = await TestApp.client().v1.funding.routes.$get(
97
+ {
98
+ query: {
99
+ sourceAmount: '1000000',
100
+ sourceChain: 'tron',
101
+ sourceToken: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'.toLowerCase(),
102
+ },
103
+ },
104
+ TestApp.auth,
105
+ )
106
+ expect(lowercasedTronResponse.status).toBe(200)
107
+ const lowercasedTronBody = await TestApp.json(
108
+ lowercasedTronResponse,
109
+ Funding.schema.listFundingRoutes.Response,
110
+ )
111
+ expect(lowercasedTronBody.data).toEqual([])
112
+ })
113
+
114
+ test('returns no candidates for an unsupported source token', async () => {
115
+ const response = await TestApp.client().v1.funding.routes.$get(
116
+ {
117
+ query: {
118
+ sourceAmount: '1.234567890',
119
+ sourceAmountUnits: 'decimal',
120
+ sourceChain: 'base',
121
+ sourceToken: 'DAI',
122
+ },
123
+ },
124
+ TestApp.auth,
125
+ )
126
+ expect(response.status).toBe(200)
127
+ const body = await TestApp.json(response, Funding.schema.listFundingRoutes.Response)
128
+ expect(body.data).toEqual([])
129
+ })
130
+
131
+ test('rejects amounts that cannot be represented in source decimals', async () => {
132
+ const response = await TestApp.client().v1.funding.routes.$get(
133
+ {
134
+ query: {
135
+ sourceAmount: '1.0000001',
136
+ sourceAmountUnits: 'decimal',
137
+ sourceChain: 'base',
138
+ sourceToken: 'USDC',
139
+ },
140
+ },
141
+ TestApp.auth,
142
+ )
143
+ expect(response.status).toBe(400)
144
+ const body = await TestApp.json(response, Schema.ErrorResponse)
145
+ expect(body.error.code).toBe('query_invalid')
146
+ })
147
+
148
+ test('rejects unimplemented include parameters', async () => {
149
+ const response = await TestApp.create().request(
150
+ '/v1/funding/routes?sourceChain=base&sourceToken=USDC&sourceAmount=1000000&include=quotes',
151
+ { headers: TestApp.auth.headers },
152
+ )
153
+ expect(response.status).toBe(400)
154
+ const body = await TestApp.json(response, Schema.ErrorResponse)
155
+ expect(body.error.code).toBe('query_invalid')
156
+ })
157
+ })
158
+
159
+ describe('GET /funding/chains', () => {
160
+ test('lists source chain and stablecoin inventory', async () => {
161
+ const response = await TestApp.client().v1.funding.chains.$get(undefined, TestApp.auth)
162
+ expect(response.status).toBe(200)
163
+ const body = await TestApp.json(response, Funding.schema.listFundingChains.Response)
164
+
165
+ expect(body.data.map((chain) => chain.id)).toEqual([
166
+ 'eip155:1',
167
+ 'eip155:8453',
168
+ 'eip155:56',
169
+ 'solana:mainnet',
170
+ 'tron:mainnet',
171
+ ])
172
+ expect(body.data.find((chain) => chain.id === 'solana:mainnet')?.tokens).toEqual(
173
+ expect.arrayContaining([expect.objectContaining({ symbol: 'USDC', standard: 'SPL' })]),
174
+ )
175
+ })
176
+ })
177
+
178
+ describe('GET /providers', () => {
179
+ test('lists providers filtered by capability', async () => {
180
+ const response = await TestApp.client().v1.providers.$get(
181
+ { query: { capability: 'fundingRoutes' } },
182
+ TestApp.auth,
183
+ )
184
+ expect(response.status).toBe(200)
185
+ const body = await TestApp.json(response, Funding.schema.listProviders.Response)
186
+
187
+ expect(body.data.map((provider) => provider.id)).toEqual([
188
+ 'across',
189
+ 'relay',
190
+ 'bridge',
191
+ 'bungee',
192
+ 'lifi',
193
+ ])
194
+ expect(body.data.every((provider) => provider.capabilities.includes('fundingRoutes'))).toBe(
195
+ true,
196
+ )
197
+ expect(body.data.map((provider) => provider.status)).toEqual([
198
+ 'inventoryOnly',
199
+ 'inventoryOnly',
200
+ 'inventoryOnly',
201
+ 'inventoryOnly',
202
+ 'planned',
203
+ ])
204
+ })
205
+
206
+ test('rejects unsupported provider capabilities', async () => {
207
+ const response = await TestApp.create().request('/v1/providers?capability=settlement', {
208
+ headers: TestApp.auth.headers,
209
+ })
210
+ expect(response.status).toBe(400)
211
+ const body = await TestApp.json(response, Schema.ErrorResponse)
212
+ expect(body.error.code).toBe('query_invalid')
213
+ })
214
+ })