tapimo 0.2.0 → 0.4.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 (362) hide show
  1. package/README.md +36 -8
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +5 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +28 -1
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +34 -1
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +7532 -4850
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +11 -3
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +11 -2
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +14 -3
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +63 -53
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/apps/api-keys.d.ts +7 -0
  21. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  22. package/dist/admin/apps/scopes.d.ts +8 -0
  23. package/dist/admin/apps/scopes.d.ts.map +1 -1
  24. package/dist/admin/apps/scopes.js +3 -0
  25. package/dist/admin/apps/scopes.js.map +1 -1
  26. package/dist/admin/apps/verified-tokens.d.ts +57 -57
  27. package/dist/admin/ui.generated.d.ts +1 -1
  28. package/dist/admin/ui.generated.js +13 -13
  29. package/dist/admin/ui.generated.js.map +1 -1
  30. package/dist/analytics/Analytics.d.ts +151 -0
  31. package/dist/analytics/Analytics.d.ts.map +1 -0
  32. package/dist/analytics/Analytics.js +212 -0
  33. package/dist/analytics/Analytics.js.map +1 -0
  34. package/dist/analytics/tables/requestEvents.d.ts +215 -0
  35. package/dist/analytics/tables/requestEvents.d.ts.map +1 -0
  36. package/dist/analytics/tables/requestEvents.js +264 -0
  37. package/dist/analytics/tables/requestEvents.js.map +1 -0
  38. package/dist/apps/data/App.d.ts +1049 -624
  39. package/dist/apps/data/App.d.ts.map +1 -1
  40. package/dist/apps/data/App.js +36 -0
  41. package/dist/apps/data/App.js.map +1 -1
  42. package/dist/apps/data/FundingRouteProviders.d.ts +54 -0
  43. package/dist/apps/data/FundingRouteProviders.d.ts.map +1 -0
  44. package/dist/apps/data/FundingRouteProviders.js +355 -0
  45. package/dist/apps/data/FundingRouteProviders.js.map +1 -0
  46. package/dist/apps/data/index.d.ts +1 -0
  47. package/dist/apps/data/index.d.ts.map +1 -1
  48. package/dist/apps/data/index.js +1 -0
  49. package/dist/apps/data/index.js.map +1 -1
  50. package/dist/apps/data/routes/balances.d.ts +45 -45
  51. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  52. package/dist/apps/data/routes/exchanges.d.ts +455 -455
  53. package/dist/apps/data/routes/fee-amm.d.ts +101 -101
  54. package/dist/apps/data/routes/funding.d.ts +843 -0
  55. package/dist/apps/data/routes/funding.d.ts.map +1 -0
  56. package/dist/apps/data/routes/funding.js +443 -0
  57. package/dist/apps/data/routes/funding.js.map +1 -0
  58. package/dist/apps/data/routes/indexer.d.ts +5 -5
  59. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  60. package/dist/apps/data/routes/receipts.js +2 -8
  61. package/dist/apps/data/routes/receipts.js.map +1 -1
  62. package/dist/apps/data/routes/rpc.d.ts +29 -36
  63. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  64. package/dist/apps/data/routes/rpc.js +29 -1
  65. package/dist/apps/data/routes/rpc.js.map +1 -1
  66. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  67. package/dist/apps/data/routes/transfers.d.ts +56 -56
  68. package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
  69. package/dist/apps/data/routes/webhooks.d.ts +45 -45
  70. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  71. package/dist/apps/data/routes/webhooks.js +8 -8
  72. package/dist/apps/data/routes/webhooks.js.map +1 -1
  73. package/dist/apps/docs/App.d.ts +5 -3
  74. package/dist/apps/docs/App.d.ts.map +1 -1
  75. package/dist/apps/docs/App.js +28 -96
  76. package/dist/apps/docs/App.js.map +1 -1
  77. package/dist/apps/docs/reference.d.ts +21 -0
  78. package/dist/apps/docs/reference.d.ts.map +1 -0
  79. package/dist/apps/docs/reference.js +112 -0
  80. package/dist/apps/docs/reference.js.map +1 -0
  81. package/dist/apps/index.d.ts +3 -2
  82. package/dist/apps/index.d.ts.map +1 -1
  83. package/dist/apps/index.js +3 -2
  84. package/dist/apps/index.js.map +1 -1
  85. package/dist/apps/{platform → management}/App.d.ts +3015 -738
  86. package/dist/apps/management/App.d.ts.map +1 -0
  87. package/dist/apps/{platform → management}/App.js +20 -10
  88. package/dist/apps/management/App.js.map +1 -0
  89. package/dist/apps/management/Billing.d.ts +279 -0
  90. package/dist/apps/management/Billing.d.ts.map +1 -0
  91. package/dist/apps/management/Billing.js +477 -0
  92. package/dist/apps/management/Billing.js.map +1 -0
  93. package/dist/apps/management/index.d.ts +3 -0
  94. package/dist/apps/management/index.d.ts.map +1 -0
  95. package/dist/apps/management/index.js +3 -0
  96. package/dist/apps/management/index.js.map +1 -0
  97. package/dist/apps/{platform → management}/routes/api-keys.d.ts +341 -49
  98. package/dist/apps/management/routes/api-keys.d.ts.map +1 -0
  99. package/dist/apps/{platform → management}/routes/api-keys.js +116 -14
  100. package/dist/apps/management/routes/api-keys.js.map +1 -0
  101. package/dist/apps/management/routes/billing.d.ts +1520 -0
  102. package/dist/apps/management/routes/billing.d.ts.map +1 -0
  103. package/dist/apps/management/routes/billing.js +795 -0
  104. package/dist/apps/management/routes/billing.js.map +1 -0
  105. package/dist/apps/{platform → management}/routes/invitations.d.ts +202 -84
  106. package/dist/apps/management/routes/invitations.d.ts.map +1 -0
  107. package/dist/apps/{platform → management}/routes/invitations.js +59 -1
  108. package/dist/apps/management/routes/invitations.js.map +1 -0
  109. package/dist/apps/{platform → management}/routes/me.d.ts +17 -17
  110. package/dist/apps/management/routes/me.d.ts.map +1 -0
  111. package/dist/apps/management/routes/me.js.map +1 -0
  112. package/dist/apps/management/routes/members.d.ts.map +1 -0
  113. package/dist/apps/management/routes/members.js.map +1 -0
  114. package/dist/apps/{platform → management}/routes/orgs.d.ts +50 -36
  115. package/dist/apps/management/routes/orgs.d.ts.map +1 -0
  116. package/dist/apps/{platform → management}/routes/orgs.js +14 -3
  117. package/dist/apps/management/routes/orgs.js.map +1 -0
  118. package/dist/apps/{platform → management}/routes/projects.d.ts +97 -97
  119. package/dist/apps/{platform → management}/routes/projects.d.ts.map +1 -1
  120. package/dist/apps/management/routes/projects.js.map +1 -0
  121. package/dist/apps/management/routes/scopes.d.ts +107 -0
  122. package/dist/apps/management/routes/scopes.d.ts.map +1 -0
  123. package/dist/apps/management/routes/scopes.js +66 -0
  124. package/dist/apps/management/routes/scopes.js.map +1 -0
  125. package/dist/apps/management/routes/usage.d.ts +588 -0
  126. package/dist/apps/management/routes/usage.d.ts.map +1 -0
  127. package/dist/apps/management/routes/usage.js +391 -0
  128. package/dist/apps/management/routes/usage.js.map +1 -0
  129. package/dist/apps/mcp.d.ts +76 -0
  130. package/dist/apps/mcp.d.ts.map +1 -0
  131. package/dist/apps/mcp.js +188 -0
  132. package/dist/apps/mcp.js.map +1 -0
  133. package/dist/apps/relay/App.d.ts +4 -1
  134. package/dist/apps/relay/App.d.ts.map +1 -1
  135. package/dist/apps/relay/App.js +118 -10
  136. package/dist/apps/relay/App.js.map +1 -1
  137. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  138. package/dist/apps/relay/Sponsorships.js +2 -1
  139. package/dist/apps/relay/Sponsorships.js.map +1 -1
  140. package/dist/cli/Cli.d.ts +8 -1
  141. package/dist/cli/Cli.d.ts.map +1 -1
  142. package/dist/cli/Cli.js +11 -3
  143. package/dist/cli/Cli.js.map +1 -1
  144. package/dist/cli/commands/admin.d.ts +4 -0
  145. package/dist/cli/commands/admin.d.ts.map +1 -1
  146. package/dist/cli/commands/admin.js +80 -1
  147. package/dist/cli/commands/admin.js.map +1 -1
  148. package/dist/db/Db.d.ts +7 -0
  149. package/dist/db/Db.d.ts.map +1 -1
  150. package/dist/db/Db.js +126 -0
  151. package/dist/db/Db.js.map +1 -1
  152. package/dist/db/Schema.d.ts +79 -0
  153. package/dist/db/Schema.d.ts.map +1 -1
  154. package/dist/db/Schema.js +88 -2
  155. package/dist/db/Schema.js.map +1 -1
  156. package/dist/db/tables/billingSettings.d.ts +55 -0
  157. package/dist/db/tables/billingSettings.d.ts.map +1 -0
  158. package/dist/db/tables/billingSettings.js +70 -0
  159. package/dist/db/tables/billingSettings.js.map +1 -0
  160. package/dist/db/tables/invitations.js +2 -2
  161. package/dist/db/tables/invitations.js.map +1 -1
  162. package/dist/db/tables/organizations.d.ts +6 -2
  163. package/dist/db/tables/organizations.d.ts.map +1 -1
  164. package/dist/db/tables/organizations.js +10 -4
  165. package/dist/db/tables/organizations.js.map +1 -1
  166. package/dist/db/tables/projects.js +2 -2
  167. package/dist/db/tables/projects.js.map +1 -1
  168. package/dist/db/tables/requestUsage.d.ts +121 -0
  169. package/dist/db/tables/requestUsage.d.ts.map +1 -0
  170. package/dist/db/tables/requestUsage.js +150 -0
  171. package/dist/db/tables/requestUsage.js.map +1 -0
  172. package/dist/db/tables/sponsoredTransactions.d.ts +119 -0
  173. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  174. package/dist/db/tables/sponsoredTransactions.js +155 -2
  175. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  176. package/dist/db/tables/stripeCustomers.d.ts +81 -0
  177. package/dist/db/tables/stripeCustomers.d.ts.map +1 -0
  178. package/dist/db/tables/stripeCustomers.js +120 -0
  179. package/dist/db/tables/stripeCustomers.js.map +1 -0
  180. package/dist/db/tables/users.js +2 -2
  181. package/dist/db/tables/users.js.map +1 -1
  182. package/dist/handlers/internal/sponsorship.d.ts +5 -2
  183. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  184. package/dist/handlers/internal/sponsorship.js +19 -5
  185. package/dist/handlers/internal/sponsorship.js.map +1 -1
  186. package/dist/handlers/internal/utils.d.ts +10 -3
  187. package/dist/handlers/internal/utils.d.ts.map +1 -1
  188. package/dist/handlers/internal/utils.js +14 -6
  189. package/dist/handlers/internal/utils.js.map +1 -1
  190. package/dist/index.d.ts +1 -0
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +1 -0
  193. package/dist/index.js.map +1 -1
  194. package/dist/internal/Auth.d.ts +18 -4
  195. package/dist/internal/Auth.d.ts.map +1 -1
  196. package/dist/internal/Auth.js +149 -77
  197. package/dist/internal/Auth.js.map +1 -1
  198. package/dist/internal/Cache.d.ts.map +1 -1
  199. package/dist/internal/Cache.js +4 -1
  200. package/dist/internal/Cache.js.map +1 -1
  201. package/dist/internal/EdgeCache.d.ts +10 -0
  202. package/dist/internal/EdgeCache.d.ts.map +1 -1
  203. package/dist/internal/EdgeCache.js +39 -8
  204. package/dist/internal/EdgeCache.js.map +1 -1
  205. package/dist/internal/Fees.d.ts +27 -0
  206. package/dist/internal/Fees.d.ts.map +1 -0
  207. package/dist/internal/Fees.js +48 -0
  208. package/dist/internal/Fees.js.map +1 -0
  209. package/dist/internal/FundingRoutes.d.ts +915 -0
  210. package/dist/internal/FundingRoutes.d.ts.map +1 -0
  211. package/dist/internal/FundingRoutes.js +625 -0
  212. package/dist/internal/FundingRoutes.js.map +1 -0
  213. package/dist/internal/Id.d.ts +15 -0
  214. package/dist/internal/Id.d.ts.map +1 -0
  215. package/dist/internal/Id.js +22 -0
  216. package/dist/internal/Id.js.map +1 -0
  217. package/dist/internal/Log.d.ts +2 -0
  218. package/dist/internal/Log.d.ts.map +1 -1
  219. package/dist/internal/Log.js +3 -0
  220. package/dist/internal/Log.js.map +1 -1
  221. package/dist/internal/OpenApi.d.ts +10 -1
  222. package/dist/internal/OpenApi.d.ts.map +1 -1
  223. package/dist/internal/OpenApi.js +8 -1
  224. package/dist/internal/OpenApi.js.map +1 -1
  225. package/dist/internal/RateLimit.d.ts +25 -0
  226. package/dist/internal/RateLimit.d.ts.map +1 -1
  227. package/dist/internal/RateLimit.js +51 -0
  228. package/dist/internal/RateLimit.js.map +1 -1
  229. package/dist/internal/Response.d.ts +1 -1
  230. package/dist/internal/Response.d.ts.map +1 -1
  231. package/dist/internal/Schema.d.ts +8 -0
  232. package/dist/internal/Schema.d.ts.map +1 -1
  233. package/dist/internal/Schema.js +7 -0
  234. package/dist/internal/Schema.js.map +1 -1
  235. package/dist/internal/Webhooks.d.ts.map +1 -1
  236. package/dist/internal/Webhooks.js +3 -3
  237. package/dist/internal/Webhooks.js.map +1 -1
  238. package/package.json +8 -7
  239. package/src/ApiKey.ts +9 -2
  240. package/src/ApiKeys.test.ts +51 -0
  241. package/src/ApiKeys.ts +50 -1
  242. package/src/App.test.ts +33 -86718
  243. package/src/App.ts +26 -8
  244. package/src/Client.test-d.ts +353 -2
  245. package/src/Scope.ts +16 -3
  246. package/src/admin/apps/scopes.test.ts +6 -0
  247. package/src/admin/apps/scopes.ts +3 -0
  248. package/src/admin/ui/src/components/Page.tsx +2 -3
  249. package/src/admin/ui/src/routes/__root.tsx +2 -2
  250. package/src/admin/ui/src/routes/api-keys.tsx +2 -2
  251. package/src/admin/ui.generated.ts +13 -13
  252. package/src/analytics/Analytics.test.ts +527 -0
  253. package/src/analytics/Analytics.ts +318 -0
  254. package/src/analytics/tables/requestEvents.ts +523 -0
  255. package/src/apps/composition.test.ts +26 -13
  256. package/src/apps/data/App.test.ts +72 -0
  257. package/src/apps/data/App.ts +37 -0
  258. package/src/apps/data/FundingRouteProviders.test.ts +281 -0
  259. package/src/apps/data/FundingRouteProviders.ts +459 -0
  260. package/src/apps/data/index.ts +1 -0
  261. package/src/apps/data/routes/funding.test.ts +314 -0
  262. package/src/apps/data/routes/funding.ts +698 -0
  263. package/src/apps/data/routes/receipts.ts +2 -9
  264. package/src/apps/data/routes/rpc.test.ts +78 -2
  265. package/src/apps/data/routes/rpc.ts +31 -1
  266. package/src/apps/data/routes/webhooks.test.ts +1 -1
  267. package/src/apps/data/routes/webhooks.ts +11 -8
  268. package/src/apps/docs/App.ts +30 -101
  269. package/src/apps/docs/reference.ts +132 -0
  270. package/src/apps/index.ts +3 -2
  271. package/src/apps/{platform → management}/App.ts +56 -17
  272. package/src/apps/management/Billing.test.ts +530 -0
  273. package/src/apps/management/Billing.ts +682 -0
  274. package/src/apps/management/index.ts +2 -0
  275. package/src/apps/{platform → management}/routes/api-keys.test.ts +172 -9
  276. package/src/apps/{platform → management}/routes/api-keys.ts +137 -21
  277. package/src/apps/management/routes/billing.test.ts +1100 -0
  278. package/src/apps/management/routes/billing.ts +966 -0
  279. package/src/apps/{platform → management}/routes/invitations.test.ts +55 -7
  280. package/src/apps/{platform → management}/routes/invitations.ts +69 -1
  281. package/src/apps/management/routes/me.test.ts +351 -0
  282. package/src/apps/{platform → management}/routes/orgs.ts +26 -4
  283. package/src/apps/management/routes/scopes.test.ts +29 -0
  284. package/src/apps/management/routes/scopes.ts +85 -0
  285. package/src/apps/management/routes/usage.test.ts +422 -0
  286. package/src/apps/management/routes/usage.ts +527 -0
  287. package/src/apps/mcp.test.ts +206 -0
  288. package/src/apps/mcp.ts +250 -0
  289. package/src/apps/relay/App.test.ts +457 -8
  290. package/src/apps/relay/App.ts +120 -12
  291. package/src/apps/relay/Sponsorships.test.ts +1 -1
  292. package/src/apps/relay/Sponsorships.ts +2 -1
  293. package/src/cli/Cli.test.ts +25 -2
  294. package/src/cli/Cli.ts +17 -2
  295. package/src/cli/commands/admin.test.ts +83 -0
  296. package/src/cli/commands/admin.ts +89 -1
  297. package/src/db/Db.ts +137 -0
  298. package/src/db/Schema.ts +104 -2
  299. package/src/db/tables/billingSettings.test.ts +87 -0
  300. package/src/db/tables/billingSettings.ts +108 -0
  301. package/src/db/tables/invitations.ts +2 -2
  302. package/src/db/tables/organizations.test.ts +1 -1
  303. package/src/db/tables/organizations.ts +15 -5
  304. package/src/db/tables/projects.ts +2 -2
  305. package/src/db/tables/requestUsage.ts +231 -0
  306. package/src/db/tables/sponsoredTransactions.test.ts +108 -1
  307. package/src/db/tables/sponsoredTransactions.ts +230 -2
  308. package/src/db/tables/stripeCustomers.test.ts +109 -0
  309. package/src/db/tables/stripeCustomers.ts +162 -0
  310. package/src/db/tables/users.ts +2 -2
  311. package/src/handlers/internal/sponsorship.ts +34 -7
  312. package/src/handlers/internal/utils.ts +19 -7
  313. package/src/index.ts +1 -0
  314. package/src/internal/Auth.test.ts +175 -25
  315. package/src/internal/Auth.ts +176 -87
  316. package/src/internal/Cache.ts +5 -1
  317. package/src/internal/EdgeCache.test.ts +27 -4
  318. package/src/internal/EdgeCache.ts +47 -9
  319. package/src/internal/Fees.test.ts +32 -0
  320. package/src/internal/Fees.ts +51 -0
  321. package/src/internal/FundingRoutes.test.ts +213 -0
  322. package/src/internal/FundingRoutes.ts +898 -0
  323. package/src/internal/Id.test.ts +17 -0
  324. package/src/internal/Id.ts +24 -0
  325. package/src/internal/Log.test.ts +1 -0
  326. package/src/internal/Log.ts +5 -0
  327. package/src/internal/OpenApi.ts +12 -1
  328. package/src/internal/RateLimit.test.ts +84 -0
  329. package/src/internal/RateLimit.ts +70 -0
  330. package/src/internal/Response.ts +1 -1
  331. package/src/internal/Schema.ts +8 -0
  332. package/src/internal/Webhooks.test.ts +3 -3
  333. package/src/internal/Webhooks.ts +3 -3
  334. package/dist/apps/platform/App.d.ts.map +0 -1
  335. package/dist/apps/platform/App.js.map +0 -1
  336. package/dist/apps/platform/index.d.ts +0 -2
  337. package/dist/apps/platform/index.d.ts.map +0 -1
  338. package/dist/apps/platform/index.js +0 -2
  339. package/dist/apps/platform/index.js.map +0 -1
  340. package/dist/apps/platform/routes/api-keys.d.ts.map +0 -1
  341. package/dist/apps/platform/routes/api-keys.js.map +0 -1
  342. package/dist/apps/platform/routes/invitations.d.ts.map +0 -1
  343. package/dist/apps/platform/routes/invitations.js.map +0 -1
  344. package/dist/apps/platform/routes/me.d.ts.map +0 -1
  345. package/dist/apps/platform/routes/me.js.map +0 -1
  346. package/dist/apps/platform/routes/members.d.ts.map +0 -1
  347. package/dist/apps/platform/routes/members.js.map +0 -1
  348. package/dist/apps/platform/routes/orgs.d.ts.map +0 -1
  349. package/dist/apps/platform/routes/orgs.js.map +0 -1
  350. package/dist/apps/platform/routes/projects.js.map +0 -1
  351. package/src/apps/platform/index.ts +0 -1
  352. package/src/apps/platform/routes/me.test.ts +0 -121
  353. /package/dist/apps/{platform → management}/routes/me.js +0 -0
  354. /package/dist/apps/{platform → management}/routes/members.d.ts +0 -0
  355. /package/dist/apps/{platform → management}/routes/members.js +0 -0
  356. /package/dist/apps/{platform → management}/routes/projects.js +0 -0
  357. /package/src/apps/{platform → management}/routes/me.ts +0 -0
  358. /package/src/apps/{platform → management}/routes/members.test.ts +0 -0
  359. /package/src/apps/{platform → management}/routes/members.ts +0 -0
  360. /package/src/apps/{platform → management}/routes/orgs.test.ts +0 -0
  361. /package/src/apps/{platform → management}/routes/projects.test.ts +0 -0
  362. /package/src/apps/{platform → management}/routes/projects.ts +0 -0
@@ -0,0 +1,314 @@
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('enriches route candidates with configured provider adapters', async () => {
41
+ const app = TestApp.create({
42
+ fundingRoutes: {
43
+ adapters: {
44
+ across: {
45
+ async probeQuote(input, signal) {
46
+ expect(signal.aborted).toBe(false)
47
+ expect(input.cache.bypass).toBe(true)
48
+ expect(input.include).toEqual(['quotes'])
49
+ expect(input.route.id).toBe('base-usdc-tempo-usdce-across')
50
+ expect(input.sourceAmount.amount).toBe('1000000')
51
+ expect(input.sourceChain.id).toBe('eip155:8453')
52
+ expect(input.sourceToken.symbol).toBe('USDC')
53
+ return {
54
+ expiresAt: '2026-01-01T00:00:30Z',
55
+ limits: {
56
+ instantSourceAmount: '1000000000',
57
+ maxSourceAmount: '100000000000',
58
+ minSourceAmount: '500000',
59
+ },
60
+ minimumOutputAmount: '980000',
61
+ outputAmount: '990000',
62
+ outputAmountFormatted: '0.99',
63
+ quality: {
64
+ availableVolumeUsd: '1000.00',
65
+ estimatedSeconds: 4,
66
+ feeBps: 12,
67
+ historicalVolumeUsd24h: '100000.00',
68
+ instantVolumeUsd: '1000.00',
69
+ liquiditySource: 'providerQuote',
70
+ score: 91,
71
+ sourceDetail: 'providerEndpoint',
72
+ tier: 'liquid',
73
+ },
74
+ sampledAt: '2026-01-01T00:00:00Z',
75
+ status: 'available',
76
+ }
77
+ },
78
+ },
79
+ },
80
+ },
81
+ })
82
+
83
+ const response = await app.request(
84
+ '/v1/funding/routes?sourceChain=base&sourceToken=USDC&sourceAmount=1000000&provider=across&include=quotes',
85
+ { headers: { ...TestApp.auth.headers, 'Cache-Control': 'no-cache' } },
86
+ )
87
+ expect(response.status).toBe(200)
88
+ const body = await TestApp.json(response, Funding.schema.listFundingRoutes.Response)
89
+
90
+ expect(body.data).toHaveLength(1)
91
+ expect(body.data[0]).toMatchObject({
92
+ errorCode: null,
93
+ id: 'base-usdc-tempo-usdce-across',
94
+ quality: {
95
+ availableVolumeUsd: '1000.00',
96
+ liquiditySource: 'providerQuote',
97
+ sourceDetail: 'providerEndpoint',
98
+ tier: 'liquid',
99
+ },
100
+ quote: {
101
+ expiresAt: '2026-01-01T00:00:30Z',
102
+ inputAmount: '1000000',
103
+ limits: {
104
+ instantSourceAmount: '1000000000',
105
+ maxSourceAmount: '100000000000',
106
+ minSourceAmount: '500000',
107
+ },
108
+ minimumOutputAmount: '980000',
109
+ outputAmount: '990000',
110
+ outputAmountFormatted: '0.99',
111
+ sampledAt: '2026-01-01T00:00:00Z',
112
+ },
113
+ status: 'available',
114
+ })
115
+ })
116
+
117
+ test('converts decimal source amounts after resolving the source token', async () => {
118
+ const response = await TestApp.client().v1.funding.routes.$get(
119
+ {
120
+ query: {
121
+ provider: 'relay',
122
+ sourceAmount: '1.25',
123
+ sourceAmountUnits: 'decimal',
124
+ sourceChain: 'eip155:8453',
125
+ sourceToken: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
126
+ },
127
+ },
128
+ TestApp.auth,
129
+ )
130
+ expect(response.status).toBe(200)
131
+ const body = await TestApp.json(response, Funding.schema.listFundingRoutes.Response)
132
+
133
+ expect(body.data).toHaveLength(1)
134
+ expect(body.data[0]?.sourceAmount).toMatchObject({
135
+ amount: '1250000',
136
+ formatted: '1.25',
137
+ })
138
+ })
139
+
140
+ test('does not case-fold non-EVM source token identifiers', async () => {
141
+ const solanaMint = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
142
+ const exactResponse = await TestApp.client().v1.funding.routes.$get(
143
+ {
144
+ query: {
145
+ sourceAmount: '1000000',
146
+ sourceChain: 'solana',
147
+ sourceToken: solanaMint,
148
+ },
149
+ },
150
+ TestApp.auth,
151
+ )
152
+ expect(exactResponse.status).toBe(200)
153
+ const exactBody = await TestApp.json(exactResponse, Funding.schema.listFundingRoutes.Response)
154
+ expect(exactBody.data.map((route) => route.provider.id)).toEqual(['bridge'])
155
+
156
+ const lowercasedSolanaResponse = await TestApp.client().v1.funding.routes.$get(
157
+ {
158
+ query: {
159
+ sourceAmount: '1000000',
160
+ sourceChain: 'solana',
161
+ sourceToken: solanaMint.toLowerCase(),
162
+ },
163
+ },
164
+ TestApp.auth,
165
+ )
166
+ expect(lowercasedSolanaResponse.status).toBe(200)
167
+ const lowercasedSolanaBody = await TestApp.json(
168
+ lowercasedSolanaResponse,
169
+ Funding.schema.listFundingRoutes.Response,
170
+ )
171
+ expect(lowercasedSolanaBody.data).toEqual([])
172
+
173
+ const lowercasedTronResponse = await TestApp.client().v1.funding.routes.$get(
174
+ {
175
+ query: {
176
+ sourceAmount: '1000000',
177
+ sourceChain: 'tron',
178
+ sourceToken: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'.toLowerCase(),
179
+ },
180
+ },
181
+ TestApp.auth,
182
+ )
183
+ expect(lowercasedTronResponse.status).toBe(200)
184
+ const lowercasedTronBody = await TestApp.json(
185
+ lowercasedTronResponse,
186
+ Funding.schema.listFundingRoutes.Response,
187
+ )
188
+ expect(lowercasedTronBody.data).toEqual([])
189
+ })
190
+
191
+ test('returns no candidates for an unsupported source token', async () => {
192
+ const response = await TestApp.client().v1.funding.routes.$get(
193
+ {
194
+ query: {
195
+ sourceAmount: '1.234567890',
196
+ sourceAmountUnits: 'decimal',
197
+ sourceChain: 'base',
198
+ sourceToken: 'DAI',
199
+ },
200
+ },
201
+ TestApp.auth,
202
+ )
203
+ expect(response.status).toBe(200)
204
+ const body = await TestApp.json(response, Funding.schema.listFundingRoutes.Response)
205
+ expect(body.data).toEqual([])
206
+ })
207
+
208
+ test('rejects amounts that cannot be represented in source decimals', async () => {
209
+ const response = await TestApp.client().v1.funding.routes.$get(
210
+ {
211
+ query: {
212
+ sourceAmount: '1.0000001',
213
+ sourceAmountUnits: 'decimal',
214
+ sourceChain: 'base',
215
+ sourceToken: 'USDC',
216
+ },
217
+ },
218
+ TestApp.auth,
219
+ )
220
+ expect(response.status).toBe(400)
221
+ const body = await TestApp.json(response, Schema.ErrorResponse)
222
+ expect(body.error.code).toBe('query_invalid')
223
+ })
224
+
225
+ test('rejects unsupported include parameters', async () => {
226
+ const response = await TestApp.create().request(
227
+ '/v1/funding/routes?sourceChain=base&sourceToken=USDC&sourceAmount=1000000&include=debug',
228
+ { headers: TestApp.auth.headers },
229
+ )
230
+ expect(response.status).toBe(400)
231
+ const body = await TestApp.json(response, Schema.ErrorResponse)
232
+ expect(body.error.code).toBe('query_invalid')
233
+ })
234
+ })
235
+
236
+ describe('GET /funding/chains', () => {
237
+ test('lists source chain and stablecoin inventory', async () => {
238
+ const response = await TestApp.client().v1.funding.chains.$get(undefined, TestApp.auth)
239
+ expect(response.status).toBe(200)
240
+ const body = await TestApp.json(response, Funding.schema.listFundingChains.Response)
241
+
242
+ expect(body.data.map((chain) => chain.id)).toEqual([
243
+ 'eip155:1',
244
+ 'eip155:8453',
245
+ 'eip155:56',
246
+ 'solana:mainnet',
247
+ 'tron:mainnet',
248
+ ])
249
+ expect(body.data.find((chain) => chain.id === 'solana:mainnet')?.tokens).toEqual(
250
+ expect.arrayContaining([expect.objectContaining({ symbol: 'USDC', standard: 'SPL' })]),
251
+ )
252
+ })
253
+ })
254
+
255
+ describe('GET /providers', () => {
256
+ test('lists providers filtered by capability', async () => {
257
+ const response = await TestApp.client().v1.providers.$get(
258
+ { query: { capability: 'fundingRoutes' } },
259
+ TestApp.auth,
260
+ )
261
+ expect(response.status).toBe(200)
262
+ const body = await TestApp.json(response, Funding.schema.listProviders.Response)
263
+
264
+ expect(body.data.map((provider) => provider.id)).toEqual([
265
+ 'across',
266
+ 'relay',
267
+ 'bridge',
268
+ 'bungee',
269
+ 'lifi',
270
+ ])
271
+ expect(body.data.every((provider) => provider.capabilities.includes('fundingRoutes'))).toBe(
272
+ true,
273
+ )
274
+ expect(body.data.map((provider) => provider.status)).toEqual([
275
+ 'inventoryOnly',
276
+ 'inventoryOnly',
277
+ 'inventoryOnly',
278
+ 'inventoryOnly',
279
+ 'planned',
280
+ ])
281
+ })
282
+
283
+ test('marks configured live provider adapters', async () => {
284
+ const app = TestApp.create({
285
+ fundingRoutes: {
286
+ adapters: {
287
+ across: {
288
+ async probeQuote() {
289
+ throw new Error('not used')
290
+ },
291
+ },
292
+ },
293
+ },
294
+ })
295
+
296
+ const response = await app.request('/v1/providers?capability=fundingRoutes', {
297
+ headers: TestApp.auth.headers,
298
+ })
299
+ expect(response.status).toBe(200)
300
+ const body = await TestApp.json(response, Funding.schema.listProviders.Response)
301
+
302
+ expect(body.data.find((provider) => provider.id === 'across')?.status).toBe('configured')
303
+ expect(body.data.find((provider) => provider.id === 'relay')?.status).toBe('inventoryOnly')
304
+ })
305
+
306
+ test('rejects unsupported provider capabilities', async () => {
307
+ const response = await TestApp.create().request('/v1/providers?capability=settlement', {
308
+ headers: TestApp.auth.headers,
309
+ })
310
+ expect(response.status).toBe(400)
311
+ const body = await TestApp.json(response, Schema.ErrorResponse)
312
+ expect(body.error.code).toBe('query_invalid')
313
+ })
314
+ })