tapimo 0.11.0 → 0.12.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 (339) hide show
  1. package/dist/App.d.ts +2296 -1010
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +2 -2
  4. package/dist/App.js.map +1 -1
  5. package/dist/Assets.d.ts +15 -0
  6. package/dist/Assets.d.ts.map +1 -1
  7. package/dist/Assets.js +7 -0
  8. package/dist/Assets.js.map +1 -1
  9. package/dist/admin/App.d.ts +53 -4
  10. package/dist/admin/App.d.ts.map +1 -1
  11. package/dist/admin/apps/api-keys.d.ts +4 -4
  12. package/dist/admin/apps/earn-vaults.d.ts +114 -0
  13. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  14. package/dist/admin/apps/earn-vaults.js +59 -6
  15. package/dist/admin/apps/earn-vaults.js.map +1 -1
  16. package/dist/admin/apps/organizations.d.ts.map +1 -1
  17. package/dist/admin/apps/organizations.js +4 -2
  18. package/dist/admin/apps/organizations.js.map +1 -1
  19. package/dist/admin/apps/verified-tokens.d.ts +9 -9
  20. package/dist/admin/ui.generated.d.ts +1 -1
  21. package/dist/admin/ui.generated.d.ts.map +1 -1
  22. package/dist/admin/ui.generated.js +151 -151
  23. package/dist/admin/ui.generated.js.map +1 -1
  24. package/dist/apps/data/App.d.ts +1699 -749
  25. package/dist/apps/data/App.d.ts.map +1 -1
  26. package/dist/apps/data/App.js +56 -7
  27. package/dist/apps/data/App.js.map +1 -1
  28. package/dist/apps/data/ZoneSelection.d.ts +62 -0
  29. package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
  30. package/dist/apps/data/ZoneSelection.js +44 -0
  31. package/dist/apps/data/ZoneSelection.js.map +1 -0
  32. package/dist/apps/data/routes/activities.d.ts +2367 -4
  33. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  34. package/dist/apps/data/routes/activities.js +368 -87
  35. package/dist/apps/data/routes/activities.js.map +1 -1
  36. package/dist/apps/data/routes/addresses.d.ts +471 -340
  37. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  38. package/dist/apps/data/routes/balances.d.ts +28 -28
  39. package/dist/apps/data/routes/balances.js +1 -1
  40. package/dist/apps/data/routes/balances.js.map +1 -1
  41. package/dist/apps/data/routes/blocks.d.ts +4 -4
  42. package/dist/apps/data/routes/blocks.js +1 -1
  43. package/dist/apps/data/routes/blocks.js.map +1 -1
  44. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  45. package/dist/apps/data/routes/earn.d.ts +131 -6
  46. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  47. package/dist/apps/data/routes/earn.js +157 -25
  48. package/dist/apps/data/routes/earn.js.map +1 -1
  49. package/dist/apps/data/routes/exchanges.d.ts +825 -119
  50. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  51. package/dist/apps/data/routes/exchanges.js +16 -13
  52. package/dist/apps/data/routes/exchanges.js.map +1 -1
  53. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  54. package/dist/apps/data/routes/fee-amm.js +9 -11
  55. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  56. package/dist/apps/data/routes/indexer.d.ts +34 -34
  57. package/dist/apps/data/routes/receipts.d.ts +230 -230
  58. package/dist/apps/data/routes/receipts.js +1 -1
  59. package/dist/apps/data/routes/receipts.js.map +1 -1
  60. package/dist/apps/data/routes/rpc.js +24 -10
  61. package/dist/apps/data/routes/rpc.js.map +1 -1
  62. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  63. package/dist/apps/data/routes/tokenlist.js +16 -15
  64. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  65. package/dist/apps/data/routes/tokens.d.ts +14 -0
  66. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  67. package/dist/apps/data/routes/tokens.js +34 -15
  68. package/dist/apps/data/routes/tokens.js.map +1 -1
  69. package/dist/apps/data/routes/transactions.js +1 -1
  70. package/dist/apps/data/routes/transactions.js.map +1 -1
  71. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  72. package/dist/apps/data/routes/transfers.js +7 -9
  73. package/dist/apps/data/routes/transfers.js.map +1 -1
  74. package/dist/apps/data/routes/webhooks.d.ts +4 -4
  75. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  76. package/dist/apps/data/routes/webhooks.js +2 -2
  77. package/dist/apps/data/routes/webhooks.js.map +1 -1
  78. package/dist/apps/data/routes/zones.d.ts +30 -30
  79. package/dist/apps/funding/App.d.ts +27 -27
  80. package/dist/apps/funding/routes/chains.d.ts.map +1 -1
  81. package/dist/apps/funding/routes/chains.js +5 -4
  82. package/dist/apps/funding/routes/chains.js.map +1 -1
  83. package/dist/apps/funding/routes/deposit-addresses.d.ts +16 -16
  84. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  85. package/dist/apps/funding/routes/deposit-addresses.js +8 -8
  86. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  87. package/dist/apps/funding/routes/providers.d.ts +13 -13
  88. package/dist/apps/funding/routes/providers.d.ts.map +1 -1
  89. package/dist/apps/funding/routes/providers.js +3 -2
  90. package/dist/apps/funding/routes/providers.js.map +1 -1
  91. package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
  92. package/dist/apps/funding/routes/quotes.js +2 -2
  93. package/dist/apps/funding/routes/quotes.js.map +1 -1
  94. package/dist/apps/management/App.d.ts +627 -293
  95. package/dist/apps/management/App.d.ts.map +1 -1
  96. package/dist/apps/management/Billing.d.ts.map +1 -1
  97. package/dist/apps/management/Billing.js +19 -6
  98. package/dist/apps/management/Billing.js.map +1 -1
  99. package/dist/apps/management/routes/api-keys.d.ts +114 -54
  100. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  101. package/dist/apps/management/routes/api-keys.js +76 -30
  102. package/dist/apps/management/routes/api-keys.js.map +1 -1
  103. package/dist/apps/management/routes/billing.d.ts +103 -30
  104. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  105. package/dist/apps/management/routes/billing.js +91 -32
  106. package/dist/apps/management/routes/billing.js.map +1 -1
  107. package/dist/apps/management/routes/faucet.d.ts +33 -33
  108. package/dist/apps/management/routes/faucet.d.ts.map +1 -1
  109. package/dist/apps/management/routes/faucet.js +23 -12
  110. package/dist/apps/management/routes/faucet.js.map +1 -1
  111. package/dist/apps/management/routes/invitations.d.ts +46 -13
  112. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  113. package/dist/apps/management/routes/invitations.js +79 -29
  114. package/dist/apps/management/routes/invitations.js.map +1 -1
  115. package/dist/apps/management/routes/invite-links.d.ts +86 -41
  116. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  117. package/dist/apps/management/routes/invite-links.js +100 -41
  118. package/dist/apps/management/routes/invite-links.js.map +1 -1
  119. package/dist/apps/management/routes/me.d.ts +5 -5
  120. package/dist/apps/management/routes/me.d.ts.map +1 -1
  121. package/dist/apps/management/routes/me.js +14 -10
  122. package/dist/apps/management/routes/me.js.map +1 -1
  123. package/dist/apps/management/routes/members.d.ts +93 -72
  124. package/dist/apps/management/routes/members.d.ts.map +1 -1
  125. package/dist/apps/management/routes/members.js +37 -18
  126. package/dist/apps/management/routes/members.js.map +1 -1
  127. package/dist/apps/management/routes/orgs.d.ts +48 -8
  128. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  129. package/dist/apps/management/routes/orgs.js +48 -19
  130. package/dist/apps/management/routes/orgs.js.map +1 -1
  131. package/dist/apps/management/routes/projects.d.ts +90 -28
  132. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  133. package/dist/apps/management/routes/projects.js +72 -21
  134. package/dist/apps/management/routes/projects.js.map +1 -1
  135. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  136. package/dist/apps/management/routes/scopes.js +8 -5
  137. package/dist/apps/management/routes/scopes.js.map +1 -1
  138. package/dist/apps/management/routes/usage.d.ts +78 -78
  139. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  140. package/dist/apps/management/routes/usage.js +41 -31
  141. package/dist/apps/management/routes/usage.js.map +1 -1
  142. package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
  143. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  144. package/dist/apps/management/routes/verified-token-requests.js +36 -17
  145. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  146. package/dist/apps/management/routes/webhooks.d.ts +147 -130
  147. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  148. package/dist/apps/management/routes/webhooks.js +80 -35
  149. package/dist/apps/management/routes/webhooks.js.map +1 -1
  150. package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
  151. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  152. package/dist/apps/mpp/internal/Adapter.js +12 -0
  153. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  154. package/dist/db/Db.d.ts +2 -0
  155. package/dist/db/Db.d.ts.map +1 -1
  156. package/dist/db/Db.js +40 -0
  157. package/dist/db/Db.js.map +1 -1
  158. package/dist/db/Schema.d.ts +23 -1
  159. package/dist/db/Schema.d.ts.map +1 -1
  160. package/dist/db/Schema.js +19 -3
  161. package/dist/db/Schema.js.map +1 -1
  162. package/dist/db/tables/earnVaults.d.ts +5 -1
  163. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  164. package/dist/db/tables/earnVaults.js +5 -0
  165. package/dist/db/tables/earnVaults.js.map +1 -1
  166. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
  167. package/dist/db/tables/webhookDeliveries.js +10 -0
  168. package/dist/db/tables/webhookDeliveries.js.map +1 -1
  169. package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
  170. package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
  171. package/dist/db/tables/webhookQueueCompletions.js +32 -0
  172. package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
  173. package/dist/db/tables/webhookQueueEvents.d.ts +14 -20
  174. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  175. package/dist/db/tables/webhookQueueEvents.js +68 -47
  176. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  177. package/dist/db/tables/webhookSubscriptions.d.ts +16 -5
  178. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  179. package/dist/db/tables/webhookSubscriptions.js +29 -5
  180. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  181. package/dist/internal/Auth.d.ts +8 -1
  182. package/dist/internal/Auth.d.ts.map +1 -1
  183. package/dist/internal/Auth.js +13 -3
  184. package/dist/internal/Auth.js.map +1 -1
  185. package/dist/internal/Cache.d.ts.map +1 -1
  186. package/dist/internal/Cache.js +11 -7
  187. package/dist/internal/Cache.js.map +1 -1
  188. package/dist/internal/EarnVaults.d.ts +41 -2
  189. package/dist/internal/EarnVaults.d.ts.map +1 -1
  190. package/dist/internal/EarnVaults.js +167 -0
  191. package/dist/internal/EarnVaults.js.map +1 -1
  192. package/dist/internal/OpenApi.d.ts +26 -22
  193. package/dist/internal/OpenApi.d.ts.map +1 -1
  194. package/dist/internal/OpenApi.js +128 -39
  195. package/dist/internal/OpenApi.js.map +1 -1
  196. package/dist/internal/Response.d.ts +13 -8
  197. package/dist/internal/Response.d.ts.map +1 -1
  198. package/dist/internal/Response.js +16 -5
  199. package/dist/internal/Response.js.map +1 -1
  200. package/dist/internal/Schema.d.ts +5 -7
  201. package/dist/internal/Schema.d.ts.map +1 -1
  202. package/dist/internal/Schema.js +6 -7
  203. package/dist/internal/Schema.js.map +1 -1
  204. package/dist/internal/Store.d.ts +15 -6
  205. package/dist/internal/Store.d.ts.map +1 -1
  206. package/dist/internal/Store.js +45 -15
  207. package/dist/internal/Store.js.map +1 -1
  208. package/dist/internal/Tidx.d.ts +2 -0
  209. package/dist/internal/Tidx.d.ts.map +1 -1
  210. package/dist/internal/Tidx.js +16 -4
  211. package/dist/internal/Tidx.js.map +1 -1
  212. package/dist/internal/Webhooks.d.ts +29 -12
  213. package/dist/internal/Webhooks.d.ts.map +1 -1
  214. package/dist/internal/Webhooks.js +37 -20
  215. package/dist/internal/Webhooks.js.map +1 -1
  216. package/dist/internal/funding/Deposit.d.ts +2 -2
  217. package/dist/internal/funding/Deposit.d.ts.map +1 -1
  218. package/dist/internal/funding/Deposit.js +9 -8
  219. package/dist/internal/funding/Deposit.js.map +1 -1
  220. package/dist/internal/funding/DepositAddress.d.ts +4 -4
  221. package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
  222. package/dist/internal/funding/DepositAddress.js +9 -8
  223. package/dist/internal/funding/DepositAddress.js.map +1 -1
  224. package/dist/internal/funding/Provider.d.ts.map +1 -1
  225. package/dist/internal/funding/Provider.js +13 -12
  226. package/dist/internal/funding/Provider.js.map +1 -1
  227. package/dist/internal/funding/providers/stargate.d.ts +19 -0
  228. package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
  229. package/dist/internal/funding/providers/stargate.js +143 -0
  230. package/dist/internal/funding/providers/stargate.js.map +1 -0
  231. package/dist/providers/index.d.ts +7 -0
  232. package/dist/providers/index.d.ts.map +1 -1
  233. package/dist/providers/index.js +3 -0
  234. package/dist/providers/index.js.map +1 -1
  235. package/package.json +2 -2
  236. package/src/App.test.ts +48 -0
  237. package/src/App.ts +4 -2
  238. package/src/Assets.test.ts +18 -0
  239. package/src/Assets.ts +22 -0
  240. package/src/Client.test-d.ts +265 -16
  241. package/src/admin/apps/earn-vaults.test.ts +143 -0
  242. package/src/admin/apps/earn-vaults.ts +83 -6
  243. package/src/admin/apps/organizations.ts +6 -2
  244. package/src/admin/ui/src/routes/api-keys.tsx +36 -0
  245. package/src/admin/ui.generated.ts +151 -189
  246. package/src/apps/data/App.test.ts +31 -0
  247. package/src/apps/data/App.ts +56 -8
  248. package/src/apps/data/ZoneSelection.test.ts +196 -0
  249. package/src/apps/data/ZoneSelection.ts +108 -0
  250. package/src/apps/data/routes/activities.test.ts +328 -1
  251. package/src/apps/data/routes/activities.ts +498 -93
  252. package/src/apps/data/routes/balances.ts +1 -1
  253. package/src/apps/data/routes/blocks.ts +1 -1
  254. package/src/apps/data/routes/earn.test.ts +183 -23
  255. package/src/apps/data/routes/earn.ts +225 -29
  256. package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
  257. package/src/apps/data/routes/exchanges.test.ts +31 -1
  258. package/src/apps/data/routes/exchanges.ts +19 -15
  259. package/src/apps/data/routes/fee-amm.ts +18 -11
  260. package/src/apps/data/routes/receipts.ts +1 -1
  261. package/src/apps/data/routes/rpc.test.ts +75 -0
  262. package/src/apps/data/routes/rpc.ts +23 -9
  263. package/src/apps/data/routes/tokenlist.ts +21 -18
  264. package/src/apps/data/routes/tokens.test.ts +29 -0
  265. package/src/apps/data/routes/tokens.ts +38 -15
  266. package/src/apps/data/routes/transactions.ts +1 -1
  267. package/src/apps/data/routes/transfers.test.ts +3 -3
  268. package/src/apps/data/routes/transfers.ts +12 -9
  269. package/src/apps/data/routes/webhooks.ts +6 -2
  270. package/src/apps/data/routes/zones.test.ts +19 -13
  271. package/src/apps/funding/routes/chains.test.ts +211 -7
  272. package/src/apps/funding/routes/chains.ts +19 -12
  273. package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
  274. package/src/apps/funding/routes/deposit-addresses.ts +84 -72
  275. package/src/apps/funding/routes/providers.ts +9 -5
  276. package/src/apps/funding/routes/quotes.test.ts +46 -0
  277. package/src/apps/funding/routes/quotes.ts +8 -5
  278. package/src/apps/funding/routes/transfers.test.ts +35 -32
  279. package/src/apps/management/Billing.test.ts +26 -0
  280. package/src/apps/management/Billing.ts +24 -7
  281. package/src/apps/management/routes/api-keys.test.ts +178 -0
  282. package/src/apps/management/routes/api-keys.ts +203 -144
  283. package/src/apps/management/routes/billing.test.ts +209 -0
  284. package/src/apps/management/routes/billing.ts +254 -177
  285. package/src/apps/management/routes/faucet.test.ts +39 -0
  286. package/src/apps/management/routes/faucet.ts +75 -41
  287. package/src/apps/management/routes/invitations.test.ts +216 -0
  288. package/src/apps/management/routes/invitations.ts +186 -109
  289. package/src/apps/management/routes/invite-links.test.ts +263 -1
  290. package/src/apps/management/routes/invite-links.ts +295 -214
  291. package/src/apps/management/routes/me.test.ts +49 -0
  292. package/src/apps/management/routes/me.ts +42 -32
  293. package/src/apps/management/routes/members.test.ts +124 -1
  294. package/src/apps/management/routes/members.ts +81 -51
  295. package/src/apps/management/routes/orgs.test.ts +176 -0
  296. package/src/apps/management/routes/orgs.ts +101 -59
  297. package/src/apps/management/routes/projects.test.ts +183 -0
  298. package/src/apps/management/routes/projects.ts +124 -60
  299. package/src/apps/management/routes/scopes.test.ts +44 -0
  300. package/src/apps/management/routes/scopes.ts +37 -28
  301. package/src/apps/management/routes/usage.test.ts +92 -0
  302. package/src/apps/management/routes/usage.ts +186 -151
  303. package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
  304. package/src/apps/management/routes/verified-token-requests.ts +166 -133
  305. package/src/apps/management/routes/webhooks.test.ts +234 -0
  306. package/src/apps/management/routes/webhooks.ts +191 -78
  307. package/src/apps/mpp/internal/Adapter.ts +13 -1
  308. package/src/db/Db.test.ts +41 -0
  309. package/src/db/Db.ts +62 -0
  310. package/src/db/Schema.ts +28 -3
  311. package/src/db/tables/earnVaults.test.ts +22 -0
  312. package/src/db/tables/earnVaults.ts +11 -1
  313. package/src/db/tables/webhookDeliveries.ts +13 -0
  314. package/src/db/tables/webhookQueueCompletions.ts +55 -0
  315. package/src/db/tables/webhookQueueEvents.ts +95 -61
  316. package/src/db/tables/webhookSubscriptions.ts +45 -6
  317. package/src/internal/Auth.ts +23 -5
  318. package/src/internal/Cache.ts +14 -7
  319. package/src/internal/EarnVaults.capabilities.test.ts +33 -0
  320. package/src/internal/EarnVaults.test.ts +79 -0
  321. package/src/internal/EarnVaults.ts +277 -0
  322. package/src/internal/OpenApi.ts +165 -49
  323. package/src/internal/Response.test.ts +95 -0
  324. package/src/internal/Response.ts +40 -2
  325. package/src/internal/Schema.test.ts +16 -0
  326. package/src/internal/Schema.ts +7 -7
  327. package/src/internal/Store.test.ts +186 -0
  328. package/src/internal/Store.ts +57 -17
  329. package/src/internal/Tidx.test.ts +19 -0
  330. package/src/internal/Tidx.ts +16 -4
  331. package/src/internal/Webhooks.test.ts +122 -8
  332. package/src/internal/Webhooks.ts +59 -29
  333. package/src/internal/funding/Deposit.ts +71 -64
  334. package/src/internal/funding/DepositAddress.ts +50 -43
  335. package/src/internal/funding/Provider.ts +164 -142
  336. package/src/internal/funding/providers/index.test.ts +185 -0
  337. package/src/internal/funding/providers/stargate.ts +184 -0
  338. package/src/providers/index.test.ts +1 -0
  339. package/src/providers/index.ts +9 -0
@@ -297,7 +297,7 @@ export function addresses(options: addresses.Options = {}) {
297
297
  } catch (cause) {
298
298
  if (cause instanceof Valuation.UnsupportedDenominationError)
299
299
  return Response.error(c, { code: 'query_invalid', message: cause.message, status: 400 })
300
- return Response.upstream(c, cause)
300
+ return Response.upstream(c, cause, { page: query.page })
301
301
  }
302
302
  },
303
303
  )
@@ -420,7 +420,7 @@ export function blocks() {
420
420
  })
421
421
  return c.json(Response.validated(schema.getBlocks.Response, page), 200)
422
422
  } catch (cause) {
423
- return Response.upstream(c, cause)
423
+ return Response.upstream(c, cause, { page: query.page })
424
424
  }
425
425
  },
426
426
  )
@@ -23,29 +23,46 @@ type EnrichedVault = Pick<
23
23
  'apy' | 'instantLiquidity' | 'sharePrice' | 'state' | 'tvl'
24
24
  >
25
25
 
26
+ type OpenApiSchema = { $ref?: string }
27
+
28
+ type OpenApiOperation = {
29
+ description?: string
30
+ parameters?: readonly {
31
+ description?: string
32
+ name?: string
33
+ schema?: { enum?: readonly unknown[]; examples?: readonly unknown[]; pattern?: string }
34
+ }[]
35
+ responses?: Record<string, { content?: { 'application/json'?: { schema?: OpenApiSchema } } }>
36
+ }
37
+
26
38
  type OpenApiDocument = {
39
+ components?: { schemas?: Record<string, unknown> }
27
40
  paths: Record<
28
41
  string,
29
42
  {
30
- get?: {
31
- description?: string
32
- parameters?: readonly {
33
- description?: string
34
- name?: string
35
- schema?: { enum?: readonly unknown[]; examples?: readonly unknown[]; pattern?: string }
36
- }[]
37
- responses?: Record<string, unknown>
38
- }
43
+ get?: OpenApiOperation
39
44
  }
40
45
  >
41
46
  }
42
47
 
48
+ function errorSchemas(document: OpenApiDocument, operation: OpenApiOperation | undefined) {
49
+ return JSON.stringify(
50
+ Object.entries(operation?.responses ?? {})
51
+ .filter(([status]) => !status.startsWith('2'))
52
+ .map(([, response]) => {
53
+ const schema = response.content?.['application/json']?.schema
54
+ const name = schema?.$ref?.split('/').at(-1)
55
+ return name ? document.components?.schemas?.[name] : schema
56
+ }),
57
+ )
58
+ }
59
+
43
60
  describe('schema.getEarnVaults.Query', () => {
44
61
  test('parses collection filters', () => {
45
62
  const query = Earn.schema.getEarnVaults.Query.parse({
46
63
  capability: 'deposit,exactWithdraw',
47
64
  'engine.type': 'erc4626',
48
- include: 'access,apy,capabilities,zone,token.logoUri,tvl',
65
+ include: 'access,apy,capabilities,zone,zones,token.logoUri,tvl',
49
66
  limit: '10',
50
67
  })
51
68
 
@@ -56,6 +73,7 @@ describe('schema.getEarnVaults.Query', () => {
56
73
  'apy',
57
74
  'capabilities',
58
75
  'zone',
76
+ 'zones',
59
77
  'token.logoUri',
60
78
  'tvl',
61
79
  ])
@@ -365,6 +383,143 @@ describe('GET /v1/earn/vaults/verified', () => {
365
383
  })
366
384
  })
367
385
 
386
+ test.runIf(Runtime.get().mode === 'testnet')(
387
+ 'folds scoped Zone routes into vault capabilities',
388
+ async () => {
389
+ const db = TestApp.database()
390
+ await core_EarnVaults.upsert(db, TestEarn.zoneVerifiedVault)
391
+ const otherZoneId = TestEarn.zone.id + 1
392
+ const scopedKey = {
393
+ ...TestApp.key,
394
+ id: 'key_earn_zones',
395
+ scopes: ['data:read', `zone:${otherZoneId}:read`, `zone:${TestEarn.zone.id}:read`],
396
+ token: 'secret_earn_zones',
397
+ } satisfies TestApp.kvStore.Key
398
+ const unrelatedKey = {
399
+ ...TestApp.key,
400
+ id: 'key_earn_other_zone',
401
+ scopes: ['data:read', `zone:${otherZoneId}:read`],
402
+ token: 'secret_earn_other_zone',
403
+ } satisfies TestApp.kvStore.Key
404
+ const writeOnlyKey = {
405
+ ...TestApp.key,
406
+ id: 'key_earn_write_zone',
407
+ scopes: ['data:read', `zone:${TestEarn.zone.id}:write`],
408
+ token: 'secret_earn_write_zone',
409
+ } satisfies TestApp.kvStore.Key
410
+ const wildcardKey = {
411
+ ...TestApp.key,
412
+ id: 'key_earn_all_zones',
413
+ scopes: ['*'],
414
+ token: 'secret_earn_all_zones',
415
+ } satisfies TestApp.kvStore.Key
416
+ const app = TestApp.create({
417
+ auth: { keys: [scopedKey, unrelatedKey, wildcardKey, writeOnlyKey] },
418
+ cache,
419
+ db,
420
+ zones: [TestEarn.zone],
421
+ })
422
+ const base = `/v1/earn/vaults/verified?chainId=${TestEarn.chain.id}&limit=5`
423
+ const included = `${base}&include=capabilities,zone,zones`
424
+ const filtered = `${included}&capability=privateRouting`
425
+ // Fill the query-credential cache entry before checking callers without its Zone scope.
426
+ const scopedResponse = await app.request(`${filtered}&key=${scopedKey.token}`)
427
+ const [
428
+ defaultResponse,
429
+ unrelatedResponse,
430
+ publicResponse,
431
+ wildcardResponse,
432
+ writeOnlyResponse,
433
+ ] = await Promise.all([
434
+ app.request(base, { headers: { 'tempo-api-key': scopedKey.token } }),
435
+ app.request(included, { headers: { 'tempo-api-key': unrelatedKey.token } }),
436
+ app.request(filtered),
437
+ app.request(filtered, { headers: { 'tempo-api-key': wildcardKey.token } }),
438
+ app.request(filtered, { headers: { 'tempo-api-key': writeOnlyKey.token } }),
439
+ ])
440
+
441
+ expect([
442
+ defaultResponse.status,
443
+ scopedResponse.status,
444
+ unrelatedResponse.status,
445
+ publicResponse.status,
446
+ wildcardResponse.status,
447
+ writeOnlyResponse.status,
448
+ ]).toStrictEqual([200, 200, 200, 200, 200, 200])
449
+ const [defaultBody, scopedBody, unrelatedBody, publicBody, wildcardBody, writeOnlyBody] =
450
+ await Promise.all([
451
+ TestApp.json(defaultResponse, Earn.schema.getVerifiedEarnVaults.Response),
452
+ TestApp.json(scopedResponse, Earn.schema.getVerifiedEarnVaults.Response),
453
+ TestApp.json(unrelatedResponse, Earn.schema.getVerifiedEarnVaults.Response),
454
+ TestApp.json(publicResponse, Earn.schema.getVerifiedEarnVaults.Response),
455
+ TestApp.json(wildcardResponse, Earn.schema.getVerifiedEarnVaults.Response),
456
+ TestApp.json(writeOnlyResponse, Earn.schema.getVerifiedEarnVaults.Response),
457
+ ])
458
+ expect(defaultBody.data[0]).not.toHaveProperty('zone')
459
+ expect(defaultBody.data[0]).not.toHaveProperty('zones')
460
+ expect(unrelatedBody.data[0]).toMatchObject({
461
+ capabilities: { privateRouting: true, routerSwaps: true },
462
+ zone: null,
463
+ zones: [],
464
+ })
465
+ expect(publicBody.data[0]).toMatchObject({
466
+ capabilities: { privateRouting: true, routerSwaps: true },
467
+ zone: null,
468
+ zones: [],
469
+ })
470
+ expect(writeOnlyBody.data[0]).toMatchObject({ zone: null, zones: [] })
471
+ const vault = scopedBody.data[0]
472
+ expect(vault?.capabilities).toMatchObject({ privateRouting: true, routerSwaps: true })
473
+ expect(vault?.zones).toHaveLength(1)
474
+ expect(vault?.zones?.[0]).toMatchObject(TestEarn.zoneRoute)
475
+ expect(vault?.zone).toStrictEqual(
476
+ vault?.zones?.[0]
477
+ ? {
478
+ chainId: vault.zones[0].chainId,
479
+ inputTokens: vault.zones[0].inputTokens,
480
+ name: vault.zones[0].name,
481
+ outputTokens: vault.zones[0].outputTokens,
482
+ }
483
+ : null,
484
+ )
485
+ expect(wildcardBody.data[0]).toStrictEqual(vault)
486
+ },
487
+ 90_000,
488
+ )
489
+
490
+ test.runIf(Runtime.get().mode === 'testnet')(
491
+ 'returns null for an inaccessible legacy Zone route',
492
+ async () => {
493
+ const db = TestApp.database()
494
+ await core_EarnVaults.upsert(db, {
495
+ ...TestEarn.zoneVerifiedVault,
496
+ privateInputTokens: [TestEarn.assetTokenAddress],
497
+ privateOutputTokens: [TestEarn.assetTokenAddress],
498
+ zones: [],
499
+ })
500
+ const zone = {
501
+ ...TestEarn.zone,
502
+ contracts: {
503
+ ...TestEarn.zone.contracts,
504
+ earnRouter: { address: TestEarn.zoneRoute.earnRouter },
505
+ },
506
+ }
507
+ const app = TestApp.create({ auth: false, cache, db, zones: [zone] })
508
+ const query = `chainId=${TestEarn.chain.id}&include=zone`
509
+ const [detail, list] = await Promise.all([
510
+ app.request(`/v1/earn/vaults/${TestEarn.zoneVaultAddress}?${query}`),
511
+ app.request(`/v1/earn/vaults/verified?${query}`),
512
+ ])
513
+
514
+ expect([detail.status, list.status]).toStrictEqual([200, 200])
515
+ expect((await TestApp.json(detail, Earn.schema.getEarnVault.Response)).zone).toBeNull()
516
+ expect(
517
+ (await TestApp.json(list, Earn.schema.getVerifiedEarnVaults.Response)).data[0]?.zone,
518
+ ).toBeNull()
519
+ },
520
+ 90_000,
521
+ )
522
+
368
523
  test.runIf(Runtime.get().mode === 'testnet')(
369
524
  'returns curated fields for a public-only vault',
370
525
  async () => {
@@ -467,14 +622,11 @@ describe('GET /v1/earn/vaults/verified', () => {
467
622
  db,
468
623
  zones: [TestEarn.zone],
469
624
  })
470
- const request = { headers: { 'cache-control': 'no-store' } }
471
625
  const detail = await app.request(
472
626
  `/v1/earn/vaults/${TestEarn.vaultAddress}?chainId=${TestEarn.chain.id}&include=access,capabilities,zone`,
473
- request,
474
627
  )
475
628
  const verified = await app.request(
476
629
  `/v1/earn/vaults/verified?chainId=${TestEarn.chain.id}&include=access,capabilities,zone&limit=5`,
477
- request,
478
630
  )
479
631
 
480
632
  expect([detail.status, verified.status]).toStrictEqual([200, 200])
@@ -552,6 +704,7 @@ describe('GET /v1/earn/vaults/verified', () => {
552
704
  privateInputTokens: [],
553
705
  privateOutputTokens: [],
554
706
  vaultAddress,
707
+ zones: [],
555
708
  })
556
709
  const app = TestApp.create({ auth: false, cache, db, zones: [TestEarn.zone] })
557
710
  const cursor = Cursor.encode([TestEarn.indexedDeployment.vaultAddress])
@@ -1558,6 +1711,9 @@ describe('OpenAPI', () => {
1558
1711
  expect(response).toContain('"type"')
1559
1712
  expect(response).toContain('"vaultAddress"')
1560
1713
  expect(response).toContain('"zone"')
1714
+ expect(response).toContain('"zones"')
1715
+ expect(response).toContain('"deploymentBlock"')
1716
+ expect(response).toContain('"earnRouter"')
1561
1717
  expect(response).toContain('"apy"')
1562
1718
  expect(response).toContain('"instantLiquidity"')
1563
1719
  expect(response).toContain('"sharePrice"')
@@ -1590,6 +1746,7 @@ describe('OpenAPI', () => {
1590
1746
  expect(include?.description).toContain('`apy,tvl`')
1591
1747
  expect(JSON.stringify(include?.schema)).toContain('"apy"')
1592
1748
  expect(JSON.stringify(include?.schema)).toContain('"tvl"')
1749
+ expect(JSON.stringify(include?.schema)).toContain('"zones"')
1593
1750
  })
1594
1751
 
1595
1752
  test('documents vault-position inputs and responses', async () => {
@@ -1597,14 +1754,15 @@ describe('OpenAPI', () => {
1597
1754
  const spec = (await (await app.request('/openapi.json')).json()) as OpenApiDocument
1598
1755
  const operation = spec.paths['/v1/earn/vaults/{vaultId}/positions/{address}']?.get
1599
1756
  const address = operation?.parameters?.find((parameter) => parameter.name === 'address')
1757
+ const errors = errorSchemas(spec, operation)
1600
1758
  const response = JSON.stringify(operation?.responses)
1601
1759
  const vaultId = operation?.parameters?.find((parameter) => parameter.name === 'vaultId')
1602
1760
 
1603
- expect(response).toContain('"chain_id_invalid"')
1604
- expect(response).toContain('"chain_id_unsupported"')
1605
- expect(response).toContain('"position_invalid"')
1606
- expect(response).toContain('"query_invalid"')
1607
- expect(response).toContain('"earn_vault_not_found"')
1761
+ expect(errors).toContain('"chain_id_invalid"')
1762
+ expect(errors).toContain('"chain_id_unsupported"')
1763
+ expect(errors).toContain('"position_invalid"')
1764
+ expect(errors).toContain('"query_invalid"')
1765
+ expect(errors).toContain('"earn_vault_not_found"')
1608
1766
  expect(response).toContain('Stable resource ID for this vault position')
1609
1767
  expect(response).toContain('0x20c000000000000000000000b9537d11c60e8b50')
1610
1768
  expect(response).toContain('0x20c000000000000000000000300e14ab91a10769')
@@ -1621,6 +1779,7 @@ describe('OpenAPI', () => {
1621
1779
  (parameter) => parameter.name === 'valuation.currency',
1622
1780
  )
1623
1781
  const verified = operation?.parameters?.find((parameter) => parameter.name === 'verified')
1782
+ const errors = errorSchemas(spec, operation)
1624
1783
  const response = JSON.stringify(operation?.responses)
1625
1784
 
1626
1785
  expect(operation?.description).toContain('currently holds shares')
@@ -1628,10 +1787,10 @@ describe('OpenAPI', () => {
1628
1787
  expect(denomination?.description).toContain('nominal value')
1629
1788
  expect(verified?.description).toContain('registry-curated')
1630
1789
  expect(verified?.schema?.examples).toStrictEqual([true])
1631
- expect(response).toContain('"chain_id_invalid"')
1632
- expect(response).toContain('"chain_id_unsupported"')
1633
- expect(response).toContain('"positions_invalid"')
1634
- expect(response).toContain('"query_invalid"')
1790
+ expect(errors).toContain('"chain_id_invalid"')
1791
+ expect(errors).toContain('"chain_id_unsupported"')
1792
+ expect(errors).toContain('"positions_invalid"')
1793
+ expect(errors).toContain('"query_invalid"')
1635
1794
  expect(response).toContain('Stable resource ID for this position')
1636
1795
  expect(response).toContain('Current asset value of the held shares')
1637
1796
  expect(response).toContain('"assetAmount"')
@@ -1647,6 +1806,7 @@ describe('OpenAPI', () => {
1647
1806
  const app = TestApp.create({ auth: false, cache })
1648
1807
  const spec = (await (await app.request('/openapi.json')).json()) as OpenApiDocument
1649
1808
  const operation = spec.paths['/v1/earn/vaults/{vaultId}/earnings/{address}']?.get
1809
+ const errors = errorSchemas(spec, operation)
1650
1810
  const period = operation?.parameters?.find((parameter) => parameter.name === 'period')
1651
1811
  const response = JSON.stringify(operation?.responses)
1652
1812
 
@@ -1654,7 +1814,7 @@ describe('OpenAPI', () => {
1654
1814
  expect(period?.description).toContain('trailing 30 days')
1655
1815
  expect(period?.schema?.enum).toStrictEqual(['30d', 'active', 'lifetime'])
1656
1816
  expect(period?.schema?.examples).toStrictEqual(['lifetime'])
1657
- expect(response).toContain('"earn_vault_not_found"')
1817
+ expect(errors).toContain('"earn_vault_not_found"')
1658
1818
  expect(response).toContain('Stable resource ID for these vault earnings')
1659
1819
  expect(response).toContain('Current share value plus completed redemptions')
1660
1820
  expect(response).toContain('weighted-average asset cost basis')