tapimo 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +99 -43
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +12125 -7913
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1625 -718
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts +108 -108
  78. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  79. package/dist/apps/data/routes/fee-amm.js +59 -8
  80. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  81. package/dist/apps/data/routes/funding.d.ts +4092 -387
  82. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  83. package/dist/apps/data/routes/funding.js +1403 -256
  84. package/dist/apps/data/routes/funding.js.map +1 -1
  85. package/dist/apps/data/routes/indexer.d.ts +30 -30
  86. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  87. package/dist/apps/data/routes/indexer.js +19 -2
  88. package/dist/apps/data/routes/indexer.js.map +1 -1
  89. package/dist/apps/data/routes/receipts.d.ts +263 -263
  90. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  91. package/dist/apps/data/routes/receipts.js +11 -11
  92. package/dist/apps/data/routes/receipts.js.map +1 -1
  93. package/dist/apps/data/routes/rpc.d.ts +5 -5
  94. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  95. package/dist/apps/data/routes/rpc.js +211 -22
  96. package/dist/apps/data/routes/rpc.js.map +1 -1
  97. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  98. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  99. package/dist/apps/data/routes/tokenlist.js +39 -8
  100. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  101. package/dist/apps/data/routes/tokens.d.ts +114 -86
  102. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokens.js +194 -91
  104. package/dist/apps/data/routes/tokens.js.map +1 -1
  105. package/dist/apps/data/routes/transactions.d.ts +53 -53
  106. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  107. package/dist/apps/data/routes/transactions.js +78 -39
  108. package/dist/apps/data/routes/transactions.js.map +1 -1
  109. package/dist/apps/data/routes/transfers.d.ts +76 -27
  110. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transfers.js +165 -67
  112. package/dist/apps/data/routes/transfers.js.map +1 -1
  113. package/dist/apps/data/routes/valuation.d.ts +42 -42
  114. package/dist/apps/data/routes/valuation.js +2 -2
  115. package/dist/apps/data/routes/valuation.js.map +1 -1
  116. package/dist/apps/data/routes/webhooks.d.ts +369 -367
  117. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  118. package/dist/apps/data/routes/webhooks.js +161 -59
  119. package/dist/apps/data/routes/webhooks.js.map +1 -1
  120. package/dist/apps/data/routes/zones.d.ts +281 -0
  121. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  122. package/dist/apps/data/routes/zones.js +252 -0
  123. package/dist/apps/data/routes/zones.js.map +1 -0
  124. package/dist/apps/docs/reference.js +6 -5
  125. package/dist/apps/docs/reference.js.map +1 -1
  126. package/dist/apps/index.d.ts +2 -1
  127. package/dist/apps/index.d.ts.map +1 -1
  128. package/dist/apps/index.js +2 -1
  129. package/dist/apps/index.js.map +1 -1
  130. package/dist/apps/management/App.d.ts +670 -670
  131. package/dist/apps/management/Billing.d.ts +8 -0
  132. package/dist/apps/management/Billing.d.ts.map +1 -1
  133. package/dist/apps/management/Billing.js +12 -0
  134. package/dist/apps/management/Billing.js.map +1 -1
  135. package/dist/apps/management/Error.d.ts +12 -0
  136. package/dist/apps/management/Error.d.ts.map +1 -0
  137. package/dist/apps/management/Error.js +10 -0
  138. package/dist/apps/management/Error.js.map +1 -0
  139. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  140. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  141. package/dist/apps/management/routes/api-keys.js +2 -8
  142. package/dist/apps/management/routes/api-keys.js.map +1 -1
  143. package/dist/apps/management/routes/billing.d.ts +119 -119
  144. package/dist/apps/management/routes/faucet.d.ts +2 -2
  145. package/dist/apps/management/routes/invitations.d.ts +62 -62
  146. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  147. package/dist/apps/management/routes/invitations.js +4 -10
  148. package/dist/apps/management/routes/invitations.js.map +1 -1
  149. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  150. package/dist/apps/management/routes/me.d.ts +6 -6
  151. package/dist/apps/management/routes/members.d.ts +2 -2
  152. package/dist/apps/management/routes/orgs.d.ts +48 -48
  153. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  154. package/dist/apps/management/routes/orgs.js +2 -8
  155. package/dist/apps/management/routes/orgs.js.map +1 -1
  156. package/dist/apps/management/routes/projects.d.ts +9 -9
  157. package/dist/apps/management/routes/scopes.js +2 -2
  158. package/dist/apps/management/routes/scopes.js.map +1 -1
  159. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  160. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  161. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  162. package/dist/apps/management/routes/webhooks.js +15 -3
  163. package/dist/apps/management/routes/webhooks.js.map +1 -1
  164. package/dist/apps/mpp/App.d.ts +55 -56
  165. package/dist/apps/mpp/App.d.ts.map +1 -1
  166. package/dist/apps/mpp/App.js +192 -27
  167. package/dist/apps/mpp/App.js.map +1 -1
  168. package/dist/apps/mpp/Mpp.d.ts +0 -20
  169. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  170. package/dist/apps/mpp/Mpp.js +0 -24
  171. package/dist/apps/mpp/Mpp.js.map +1 -1
  172. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  173. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  174. package/dist/apps/mpp/internal/Adapter.js +66 -0
  175. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  176. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  177. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  178. package/dist/apps/mpp/internal/Error.js +41 -0
  179. package/dist/apps/mpp/internal/Error.js.map +1 -0
  180. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  181. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  182. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  183. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  184. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  185. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  186. package/dist/apps/mpp/internal/Policy.js +57 -0
  187. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  188. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  189. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  190. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  191. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  192. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  193. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  194. package/dist/apps/mpp/internal/Screening.js +20 -0
  195. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  196. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  197. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  198. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  199. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  200. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  201. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  202. package/dist/apps/mpp/internal/Utils.js +24 -0
  203. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  204. package/dist/apps/relay/App.js +183 -23
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  208. package/dist/apps/relay/Sponsorships.js +15 -6
  209. package/dist/apps/relay/Sponsorships.js.map +1 -1
  210. package/dist/db/Db.d.ts +20 -0
  211. package/dist/db/Db.d.ts.map +1 -1
  212. package/dist/db/Db.js +342 -0
  213. package/dist/db/Db.js.map +1 -1
  214. package/dist/db/Schema.d.ts +921 -1
  215. package/dist/db/Schema.d.ts.map +1 -1
  216. package/dist/db/Schema.js +269 -1
  217. package/dist/db/Schema.js.map +1 -1
  218. package/dist/db/tables/earnVaults.d.ts +68 -0
  219. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  220. package/dist/db/tables/earnVaults.js +72 -0
  221. package/dist/db/tables/earnVaults.js.map +1 -0
  222. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  223. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  224. package/dist/db/tables/fundingCatalog.js +85 -0
  225. package/dist/db/tables/fundingCatalog.js.map +1 -0
  226. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  227. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  228. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  229. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  230. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  231. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  232. package/dist/db/tables/fundingDeposits.js +100 -0
  233. package/dist/db/tables/fundingDeposits.js.map +1 -0
  234. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  235. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  236. package/dist/db/tables/fundingIdempotency.js +103 -0
  237. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  238. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  239. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  240. package/dist/db/tables/fundingTransferEvents.js +18 -0
  241. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  242. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  243. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  244. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  245. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  246. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  247. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  248. package/dist/db/tables/fundingTransfers.js +89 -0
  249. package/dist/db/tables/fundingTransfers.js.map +1 -0
  250. package/dist/db/tables/organizations.d.ts +8 -0
  251. package/dist/db/tables/organizations.d.ts.map +1 -1
  252. package/dist/db/tables/organizations.js +16 -0
  253. package/dist/db/tables/organizations.js.map +1 -1
  254. package/dist/db/tables/projects.d.ts +8 -0
  255. package/dist/db/tables/projects.d.ts.map +1 -1
  256. package/dist/db/tables/projects.js +16 -0
  257. package/dist/db/tables/projects.js.map +1 -1
  258. package/dist/db/tables/requestUsage.d.ts +13 -0
  259. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  260. package/dist/db/tables/requestUsage.js +16 -0
  261. package/dist/db/tables/requestUsage.js.map +1 -1
  262. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  263. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  264. package/dist/db/tables/sponsoredTransactions.js +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  266. package/dist/db/tables/users.d.ts +8 -0
  267. package/dist/db/tables/users.d.ts.map +1 -1
  268. package/dist/db/tables/users.js +16 -0
  269. package/dist/db/tables/users.js.map +1 -1
  270. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  271. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  272. package/dist/db/tables/verifiedTokens.js +9 -7
  273. package/dist/db/tables/verifiedTokens.js.map +1 -1
  274. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  275. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  276. package/dist/db/tables/webhookSubscriptions.js +24 -3
  277. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  278. package/dist/handlers/relay.js +108 -108
  279. package/dist/handlers/relay.js.map +1 -1
  280. package/dist/internal/Auth.d.ts +26 -0
  281. package/dist/internal/Auth.d.ts.map +1 -1
  282. package/dist/internal/Auth.js +35 -2
  283. package/dist/internal/Auth.js.map +1 -1
  284. package/dist/internal/Cache.d.ts.map +1 -1
  285. package/dist/internal/Cache.js +16 -10
  286. package/dist/internal/Cache.js.map +1 -1
  287. package/dist/internal/Cursor.js +1 -1
  288. package/dist/internal/Cursor.js.map +1 -1
  289. package/dist/internal/EarnRates.d.ts +89 -0
  290. package/dist/internal/EarnRates.d.ts.map +1 -0
  291. package/dist/internal/EarnRates.js +266 -0
  292. package/dist/internal/EarnRates.js.map +1 -0
  293. package/dist/internal/EarnVaults.d.ts +171 -0
  294. package/dist/internal/EarnVaults.d.ts.map +1 -0
  295. package/dist/internal/EarnVaults.js +547 -0
  296. package/dist/internal/EarnVaults.js.map +1 -0
  297. package/dist/internal/EdgeCache.d.ts +8 -1
  298. package/dist/internal/EdgeCache.d.ts.map +1 -1
  299. package/dist/internal/EdgeCache.js +33 -7
  300. package/dist/internal/EdgeCache.js.map +1 -1
  301. package/dist/internal/Id.d.ts +11 -0
  302. package/dist/internal/Id.d.ts.map +1 -1
  303. package/dist/internal/Id.js +13 -0
  304. package/dist/internal/Id.js.map +1 -1
  305. package/dist/internal/Idempotency.d.ts +83 -0
  306. package/dist/internal/Idempotency.d.ts.map +1 -0
  307. package/dist/internal/Idempotency.js +113 -0
  308. package/dist/internal/Idempotency.js.map +1 -0
  309. package/dist/internal/Log.d.ts +64 -9
  310. package/dist/internal/Log.d.ts.map +1 -1
  311. package/dist/internal/Log.js +29 -7
  312. package/dist/internal/Log.js.map +1 -1
  313. package/dist/internal/MetricSink.d.ts.map +1 -1
  314. package/dist/internal/MetricSink.js +47 -1
  315. package/dist/internal/MetricSink.js.map +1 -1
  316. package/dist/internal/OpenApi.d.ts +1 -1
  317. package/dist/internal/OpenApi.d.ts.map +1 -1
  318. package/dist/internal/OpenApi.js +3 -0
  319. package/dist/internal/OpenApi.js.map +1 -1
  320. package/dist/internal/Provider.d.ts +14 -0
  321. package/dist/internal/Provider.d.ts.map +1 -0
  322. package/dist/internal/Provider.js +5 -0
  323. package/dist/internal/Provider.js.map +1 -0
  324. package/dist/internal/Schema.d.ts +6 -1
  325. package/dist/internal/Schema.d.ts.map +1 -1
  326. package/dist/internal/Schema.js +20 -11
  327. package/dist/internal/Schema.js.map +1 -1
  328. package/dist/internal/Store.d.ts +6 -0
  329. package/dist/internal/Store.d.ts.map +1 -1
  330. package/dist/internal/Store.js +35 -0
  331. package/dist/internal/Store.js.map +1 -1
  332. package/dist/internal/Tidx.d.ts +43 -24
  333. package/dist/internal/Tidx.d.ts.map +1 -1
  334. package/dist/internal/Tidx.js +79 -11
  335. package/dist/internal/Tidx.js.map +1 -1
  336. package/dist/internal/Viem.d.ts +82 -65
  337. package/dist/internal/Viem.d.ts.map +1 -1
  338. package/dist/internal/Viem.js +83 -12
  339. package/dist/internal/Viem.js.map +1 -1
  340. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  341. package/dist/internal/WebhookDestination.js +34 -28
  342. package/dist/internal/WebhookDestination.js.map +1 -1
  343. package/dist/internal/Webhooks.d.ts +9 -0
  344. package/dist/internal/Webhooks.d.ts.map +1 -1
  345. package/dist/internal/Webhooks.js +15 -10
  346. package/dist/internal/Webhooks.js.map +1 -1
  347. package/dist/internal/exchange/Provider.d.ts +219 -0
  348. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  349. package/dist/internal/exchange/Provider.js +117 -0
  350. package/dist/internal/exchange/Provider.js.map +1 -0
  351. package/dist/internal/exchange/index.d.ts +2 -0
  352. package/dist/internal/exchange/index.d.ts.map +1 -0
  353. package/dist/internal/exchange/index.js +2 -0
  354. package/dist/internal/exchange/index.js.map +1 -0
  355. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  356. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  357. package/dist/internal/exchange/providers/uniswap.js +553 -0
  358. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  359. package/dist/internal/funding/Action.d.ts +55 -0
  360. package/dist/internal/funding/Action.d.ts.map +1 -0
  361. package/dist/internal/funding/Action.js +74 -0
  362. package/dist/internal/funding/Action.js.map +1 -0
  363. package/dist/internal/funding/Catalog.d.ts +107 -0
  364. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  365. package/dist/internal/funding/Catalog.js +270 -0
  366. package/dist/internal/funding/Catalog.js.map +1 -0
  367. package/dist/internal/funding/Chain.d.ts +76 -0
  368. package/dist/internal/funding/Chain.d.ts.map +1 -0
  369. package/dist/internal/funding/Chain.js +38 -0
  370. package/dist/internal/funding/Chain.js.map +1 -0
  371. package/dist/internal/funding/Deposit.d.ts +366 -0
  372. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  373. package/dist/internal/funding/Deposit.js +286 -0
  374. package/dist/internal/funding/Deposit.js.map +1 -0
  375. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  376. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  377. package/dist/internal/funding/DepositAddress.js +189 -0
  378. package/dist/internal/funding/DepositAddress.js.map +1 -0
  379. package/dist/internal/funding/Evidence.d.ts +52 -0
  380. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  381. package/dist/internal/funding/Evidence.js +314 -0
  382. package/dist/internal/funding/Evidence.js.map +1 -0
  383. package/dist/internal/funding/Provider.d.ts +1186 -0
  384. package/dist/internal/funding/Provider.d.ts.map +1 -0
  385. package/dist/internal/funding/Provider.js +1081 -0
  386. package/dist/internal/funding/Provider.js.map +1 -0
  387. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  388. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  389. package/dist/internal/funding/Reconciliation.js +676 -0
  390. package/dist/internal/funding/Reconciliation.js.map +1 -0
  391. package/dist/internal/funding/Route.d.ts +21 -0
  392. package/dist/internal/funding/Route.d.ts.map +1 -0
  393. package/dist/internal/funding/Route.js +5 -0
  394. package/dist/internal/funding/Route.js.map +1 -0
  395. package/dist/internal/funding/Subsidy.d.ts +113 -0
  396. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  397. package/dist/internal/funding/Subsidy.js +138 -0
  398. package/dist/internal/funding/Subsidy.js.map +1 -0
  399. package/dist/internal/funding/Token.d.ts +41 -0
  400. package/dist/internal/funding/Token.d.ts.map +1 -0
  401. package/dist/internal/funding/Token.js +22 -0
  402. package/dist/internal/funding/Token.js.map +1 -0
  403. package/dist/internal/funding/Transfer.d.ts +643 -0
  404. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  405. package/dist/internal/funding/Transfer.js +332 -0
  406. package/dist/internal/funding/Transfer.js.map +1 -0
  407. package/dist/internal/funding/index.d.ts +13 -0
  408. package/dist/internal/funding/index.d.ts.map +1 -0
  409. package/dist/internal/funding/index.js +13 -0
  410. package/dist/internal/funding/index.js.map +1 -0
  411. package/dist/internal/funding/providers/across.d.ts +21 -0
  412. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  413. package/dist/internal/funding/providers/across.js +117 -0
  414. package/dist/internal/funding/providers/across.js.map +1 -0
  415. package/dist/internal/funding/providers/relay.d.ts +46 -0
  416. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  417. package/dist/internal/funding/providers/relay.js +464 -0
  418. package/dist/internal/funding/providers/relay.js.map +1 -0
  419. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  420. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  421. package/dist/internal/funding/providers/rhino.js +116 -0
  422. package/dist/internal/funding/providers/rhino.js.map +1 -0
  423. package/dist/internal/funding/providers/squid.d.ts +19 -0
  424. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  425. package/dist/internal/funding/providers/squid.js +120 -0
  426. package/dist/internal/funding/providers/squid.js.map +1 -0
  427. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  428. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  429. package/dist/internal/funding/providers/symbiosis.js +176 -0
  430. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  431. package/dist/internal/index.d.ts +5 -1
  432. package/dist/internal/index.d.ts.map +1 -1
  433. package/dist/internal/index.js +5 -1
  434. package/dist/internal/index.js.map +1 -1
  435. package/dist/internal/webhookDestinations/url.js +61 -57
  436. package/dist/internal/webhookDestinations/url.js.map +1 -1
  437. package/dist/providers/index.d.ts +43 -0
  438. package/dist/providers/index.d.ts.map +1 -0
  439. package/dist/providers/index.js +19 -0
  440. package/dist/providers/index.js.map +1 -0
  441. package/package.json +9 -4
  442. package/src/ApiKeys.test.ts +11 -7
  443. package/src/ApiKeys.ts +37 -9
  444. package/src/App.test.ts +85 -10
  445. package/src/App.ts +224 -137
  446. package/src/Assets.ts +29 -4
  447. package/src/Client.test-d.ts +650 -30
  448. package/src/Scope.test.ts +19 -0
  449. package/src/Scope.ts +28 -11
  450. package/src/Webhooks.test.ts +25 -0
  451. package/src/Webhooks.ts +1 -1
  452. package/src/admin/App.test.ts +9 -2
  453. package/src/admin/App.ts +32 -9
  454. package/src/admin/apps/api-keys.test.ts +167 -23
  455. package/src/admin/apps/api-keys.ts +166 -28
  456. package/src/admin/apps/earn-vaults.test.ts +338 -0
  457. package/src/admin/apps/earn-vaults.ts +572 -0
  458. package/src/admin/apps/scopes.test.ts +16 -1
  459. package/src/admin/ui/plugin.ts +2 -2
  460. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  461. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  462. package/src/admin/ui/src/components/Page.tsx +1 -1
  463. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  464. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  465. package/src/admin/ui/src/lib/client.ts +1 -1
  466. package/src/admin/ui/src/lib/config.ts +1 -1
  467. package/src/admin/ui/src/lib/early-access.ts +8 -9
  468. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  469. package/src/admin/ui/src/lib/format.ts +13 -0
  470. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  471. package/src/admin/ui/src/lib/organizations.ts +7 -1
  472. package/src/admin/ui/src/lib/response.ts +22 -0
  473. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  474. package/src/admin/ui/src/lib/scopes.ts +28 -7
  475. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  476. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  477. package/src/admin/ui/src/router.tsx +2 -2
  478. package/src/admin/ui/src/routes/__root.tsx +9 -8
  479. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  480. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  481. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  482. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  483. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  484. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  485. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  486. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  487. package/src/admin/ui/vite.config.ts +4 -1
  488. package/src/admin/ui.generated.ts +113 -43
  489. package/src/analytics/Analytics.test.ts +69 -10
  490. package/src/analytics/Analytics.ts +20 -1
  491. package/src/analytics/tables/requestEvents.ts +79 -37
  492. package/src/apps/Zones.test.ts +33 -0
  493. package/src/apps/Zones.ts +40 -0
  494. package/src/apps/composition.test.ts +84 -1
  495. package/src/apps/data/App.test.ts +28 -11
  496. package/src/apps/data/App.ts +96 -33
  497. package/src/apps/data/FxOracle.ts +1 -1
  498. package/src/apps/data/index.ts +0 -1
  499. package/src/apps/data/routes/activities.test.ts +82 -6
  500. package/src/apps/data/routes/activities.ts +131 -71
  501. package/src/apps/data/routes/balances.test.ts +50 -37
  502. package/src/apps/data/routes/balances.ts +5 -5
  503. package/src/apps/data/routes/blocks.test.ts +2 -0
  504. package/src/apps/data/routes/coingecko.test.ts +22 -0
  505. package/src/apps/data/routes/coingecko.ts +84 -48
  506. package/src/apps/data/routes/earn.test.ts +1108 -0
  507. package/src/apps/data/routes/earn.ts +1391 -0
  508. package/src/apps/data/routes/exchanges.test.ts +82 -33
  509. package/src/apps/data/routes/exchanges.ts +842 -227
  510. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  511. package/src/apps/data/routes/fee-amm.ts +69 -12
  512. package/src/apps/data/routes/funding.test.ts +2712 -221
  513. package/src/apps/data/routes/funding.ts +1604 -387
  514. package/src/apps/data/routes/indexer.test.ts +43 -34
  515. package/src/apps/data/routes/indexer.ts +19 -2
  516. package/src/apps/data/routes/receipts.test.ts +5 -3
  517. package/src/apps/data/routes/receipts.ts +13 -11
  518. package/src/apps/data/routes/rpc.test.ts +446 -28
  519. package/src/apps/data/routes/rpc.ts +243 -25
  520. package/src/apps/data/routes/tokenlist.ts +72 -19
  521. package/src/apps/data/routes/tokens.ts +258 -86
  522. package/src/apps/data/routes/transactions.test.ts +2 -0
  523. package/src/apps/data/routes/transactions.ts +77 -42
  524. package/src/apps/data/routes/transfers.test.ts +166 -4
  525. package/src/apps/data/routes/transfers.ts +216 -78
  526. package/src/apps/data/routes/valuation.test.ts +62 -9
  527. package/src/apps/data/routes/valuation.ts +2 -2
  528. package/src/apps/data/routes/webhooks.test.ts +386 -43
  529. package/src/apps/data/routes/webhooks.ts +172 -71
  530. package/src/apps/data/routes/zones.test.ts +473 -0
  531. package/src/apps/data/routes/zones.ts +338 -0
  532. package/src/apps/docs/reference.ts +8 -6
  533. package/src/apps/index.ts +2 -1
  534. package/src/apps/management/Billing.test.ts +29 -0
  535. package/src/apps/management/Billing.ts +23 -0
  536. package/src/apps/management/Error.ts +12 -0
  537. package/src/apps/management/routes/api-keys.test.ts +5 -3
  538. package/src/apps/management/routes/api-keys.ts +2 -9
  539. package/src/apps/management/routes/invitations.ts +4 -11
  540. package/src/apps/management/routes/orgs.ts +2 -9
  541. package/src/apps/management/routes/scopes.test.ts +7 -2
  542. package/src/apps/management/routes/scopes.ts +2 -2
  543. package/src/apps/management/routes/webhooks.test.ts +6 -1
  544. package/src/apps/management/routes/webhooks.ts +15 -3
  545. package/src/apps/mpp/App.ts +276 -29
  546. package/src/apps/mpp/Mpp.test.ts +631 -26
  547. package/src/apps/mpp/Mpp.ts +0 -42
  548. package/src/apps/mpp/internal/Adapter.ts +108 -3
  549. package/src/apps/mpp/internal/Error.test.ts +33 -0
  550. package/src/apps/mpp/internal/Error.ts +44 -6
  551. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  552. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  553. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  554. package/src/apps/mpp/internal/Policy.ts +98 -0
  555. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  556. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  557. package/src/apps/mpp/internal/Screening.ts +40 -3
  558. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  559. package/src/apps/mpp/internal/Utils.ts +30 -0
  560. package/src/apps/relay/App.test.ts +493 -62
  561. package/src/apps/relay/App.ts +233 -23
  562. package/src/apps/relay/Sponsorships.test.ts +49 -0
  563. package/src/apps/relay/Sponsorships.ts +18 -6
  564. package/src/db/Db.ts +439 -0
  565. package/src/db/Schema.ts +325 -2
  566. package/src/db/tables/earnVaults.test.ts +185 -0
  567. package/src/db/tables/earnVaults.ts +151 -0
  568. package/src/db/tables/fundingCatalog.test.ts +108 -0
  569. package/src/db/tables/fundingCatalog.ts +157 -0
  570. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  571. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  572. package/src/db/tables/fundingDeposits.test.ts +261 -0
  573. package/src/db/tables/fundingDeposits.ts +229 -0
  574. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  575. package/src/db/tables/fundingIdempotency.ts +180 -0
  576. package/src/db/tables/fundingTransferEvents.ts +28 -0
  577. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  578. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  579. package/src/db/tables/fundingTransfers.test.ts +89 -0
  580. package/src/db/tables/fundingTransfers.ts +153 -0
  581. package/src/db/tables/organizations.ts +16 -0
  582. package/src/db/tables/projects.ts +16 -0
  583. package/src/db/tables/requestUsage.ts +23 -0
  584. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  585. package/src/db/tables/sponsoredTransactions.ts +3 -3
  586. package/src/db/tables/users.ts +16 -0
  587. package/src/db/tables/verifiedTokens.ts +19 -14
  588. package/src/db/tables/webhookSubscriptions.ts +58 -3
  589. package/src/handlers/relay.test.ts +2 -0
  590. package/src/handlers/relay.ts +95 -99
  591. package/src/internal/Auth.test.ts +48 -0
  592. package/src/internal/Auth.ts +61 -2
  593. package/src/internal/Cache.ts +13 -9
  594. package/src/internal/Cursor.test.ts +2 -2
  595. package/src/internal/Cursor.ts +1 -1
  596. package/src/internal/EarnRates.test.ts +125 -0
  597. package/src/internal/EarnRates.ts +409 -0
  598. package/src/internal/EarnVaults.test.ts +195 -0
  599. package/src/internal/EarnVaults.ts +876 -0
  600. package/src/internal/EdgeCache.test.ts +19 -0
  601. package/src/internal/EdgeCache.ts +35 -5
  602. package/src/internal/Id.ts +14 -0
  603. package/src/internal/Idempotency.test.ts +109 -0
  604. package/src/internal/Idempotency.ts +237 -0
  605. package/src/internal/Log.test-d.ts +41 -8
  606. package/src/internal/Log.test.ts +189 -8
  607. package/src/internal/Log.ts +124 -17
  608. package/src/internal/MetricSink.test.ts +244 -4
  609. package/src/internal/MetricSink.ts +51 -1
  610. package/src/internal/OpenApi.ts +3 -0
  611. package/src/internal/Provider.test.ts +17 -0
  612. package/src/internal/Provider.ts +17 -0
  613. package/src/internal/Schema.ts +27 -17
  614. package/src/internal/Store.test.ts +25 -0
  615. package/src/internal/Store.ts +46 -0
  616. package/src/internal/Tidx.local.test.ts +78 -3
  617. package/src/internal/Tidx.test.ts +212 -18
  618. package/src/internal/Tidx.ts +112 -32
  619. package/src/internal/VerifiedTokens.test.ts +15 -0
  620. package/src/internal/Viem.test.ts +170 -17
  621. package/src/internal/Viem.ts +111 -28
  622. package/src/internal/WebhookDestination.ts +25 -23
  623. package/src/internal/Webhooks.test.ts +59 -0
  624. package/src/internal/Webhooks.ts +34 -10
  625. package/src/internal/exchange/Provider.test.ts +216 -0
  626. package/src/internal/exchange/Provider.ts +326 -0
  627. package/src/internal/exchange/index.test.ts +6 -0
  628. package/src/internal/exchange/index.ts +1 -0
  629. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  630. package/src/internal/exchange/providers/uniswap.ts +682 -0
  631. package/src/internal/funding/Action.test.ts +138 -0
  632. package/src/internal/funding/Action.ts +117 -0
  633. package/src/internal/funding/Catalog.test.ts +311 -0
  634. package/src/internal/funding/Catalog.ts +347 -0
  635. package/src/internal/funding/Chain.test.ts +79 -0
  636. package/src/internal/funding/Chain.ts +120 -0
  637. package/src/internal/funding/Deposit.test.ts +26 -0
  638. package/src/internal/funding/Deposit.ts +453 -0
  639. package/src/internal/funding/DepositAddress.test.ts +18 -0
  640. package/src/internal/funding/DepositAddress.ts +312 -0
  641. package/src/internal/funding/Evidence.test.ts +297 -0
  642. package/src/internal/funding/Evidence.ts +430 -0
  643. package/src/internal/funding/Provider.test.ts +1328 -0
  644. package/src/internal/funding/Provider.ts +1796 -0
  645. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  646. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  647. package/src/internal/funding/Reconciliation.ts +930 -0
  648. package/src/internal/funding/Route.test.ts +66 -0
  649. package/src/internal/funding/Route.ts +29 -0
  650. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  651. package/src/internal/funding/Subsidy.test.ts +75 -0
  652. package/src/internal/funding/Subsidy.ts +260 -0
  653. package/src/internal/funding/Token.test.ts +47 -0
  654. package/src/internal/funding/Token.ts +59 -0
  655. package/src/internal/funding/Transfer.test.ts +369 -0
  656. package/src/internal/funding/Transfer.ts +522 -0
  657. package/src/internal/funding/index.test.ts +20 -0
  658. package/src/internal/funding/index.ts +12 -0
  659. package/src/internal/funding/providers/across.ts +149 -0
  660. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  661. package/src/internal/funding/providers/relay.test.ts +474 -0
  662. package/src/internal/funding/providers/relay.ts +559 -0
  663. package/src/internal/funding/providers/rhino.ts +139 -0
  664. package/src/internal/funding/providers/squid.ts +151 -0
  665. package/src/internal/funding/providers/symbiosis.ts +221 -0
  666. package/src/internal/index.test.ts +5 -1
  667. package/src/internal/index.ts +5 -1
  668. package/src/internal/webhookDestinations/url.ts +49 -45
  669. package/src/providers/index.test.ts +14 -0
  670. package/src/providers/index.ts +54 -0
  671. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  672. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  673. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  674. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  675. package/dist/internal/FundingQuotes.d.ts +0 -864
  676. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  677. package/dist/internal/FundingQuotes.js +0 -672
  678. package/dist/internal/FundingQuotes.js.map +0 -1
  679. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  680. package/src/internal/FundingQuotes.test.ts +0 -456
  681. package/src/internal/FundingQuotes.ts +0 -944
@@ -2,6 +2,10 @@ import { Hono } from 'hono'
2
2
  import * as z from 'zod/mini'
3
3
 
4
4
  import * as ApiKeys from '../../ApiKeys.js'
5
+ import * as Db from '../../db/Db.js'
6
+ import * as Organizations from '../../db/tables/organizations.js'
7
+ import * as Projects from '../../db/tables/projects.js'
8
+ import * as Users from '../../db/tables/users.js'
5
9
  import * as OpenApi from '../../internal/OpenApi.js'
6
10
  import * as Response from '../../internal/Response.js'
7
11
  import * as Schema from '../../internal/Schema.js'
@@ -10,14 +14,51 @@ import type * as App from '../App.js'
10
14
 
11
15
  /** Zod schemas owned by the admin API-keys handler. */
12
16
  export namespace schema {
17
+ const Name = z
18
+ .pipe(
19
+ z.string(),
20
+ z.transform((value) => value.trim()),
21
+ )
22
+ .check(
23
+ z.minLength(1),
24
+ z.maxLength(100),
25
+ z.describe('Human-readable purpose of the key.'),
26
+ z.meta({ examples: ['Explorer testnet'] }),
27
+ )
28
+
29
+ const ApiKey = Schema.describe(
30
+ z.extend(ApiKeys.schema.Record, {
31
+ createdByLabel: z
32
+ .nullable(z.string())
33
+ .check(
34
+ z.describe('Resolved creator identity, or null when unavailable.'),
35
+ z.meta({ examples: ['alex@tempo.xyz'] }),
36
+ ),
37
+ organizationName: z
38
+ .nullable(z.string())
39
+ .check(
40
+ z.describe('Resolved organization name, or null when unattributed or unavailable.'),
41
+ z.meta({ examples: ['Tempo'] }),
42
+ ),
43
+ projectName: z
44
+ .nullable(z.string())
45
+ .check(
46
+ z.describe('Resolved project name, or null when unattributed or unavailable.'),
47
+ z.meta({ examples: ['Explorer'] }),
48
+ ),
49
+ }),
50
+ 'An API key with resolved operational attribution.',
51
+ )
52
+
13
53
  /** Schemas for the createApiKey operation. */
14
54
  export namespace createApiKey {
15
55
  /**
16
- * Request body for minting a key (`MintInput` minus `createdBy`, which the
17
- * server sets from the verified identity so it can't be spoofed).
56
+ * Request body for minting a named key. The server sets `createdBy` from
57
+ * the verified identity so it cannot be spoofed.
18
58
  */
19
59
  export const Body = Schema.describe(
20
- z.extend(z.omit(ApiKeys.schema.MintInput, { createdBy: true }), {
60
+ z.extend(z.omit(ApiKeys.schema.MintInput, { createdBy: true, name: true }), {
61
+ name: Name,
21
62
  scopes: z
22
63
  .readonly(
23
64
  z.array(
@@ -58,30 +99,33 @@ export namespace schema {
58
99
  export const Response = Schema.describe(
59
100
  z.object({
60
101
  data: z
61
- .array(ApiKeys.schema.Record)
102
+ .array(ApiKey)
62
103
  .check(z.describe('API-key records, newest first (metadata only — never tokens).')),
63
104
  }),
64
105
  'A list of API-key records.',
65
106
  )
66
107
  }
67
108
 
68
- /** Schemas for the attributeApiKey operation. */
69
- export namespace attributeApiKey {
70
- /** Request body re-attributing a key; omitted fields keep their value. */
109
+ /** Schemas for the updateApiKey operation. */
110
+ export namespace updateApiKey {
111
+ /** Request body updating a key; omitted fields keep their value. */
71
112
  export const Body = Schema.describe(
72
113
  z.object({
73
- orgId: z.optional(z.string()).check(z.describe('New owning organization id (`org_…`).')),
114
+ name: z.optional(Name).check(z.describe('New human-readable key name.')),
115
+ orgId: z
116
+ .optional(z.string())
117
+ .check(z.describe('Owning organization id to assign to an unattributed key (`org_…`).')),
74
118
  projectId: z.optional(z.string()).check(z.describe('New attributed project id (`prj_…`).')),
75
119
  }),
76
- 'Attribution to apply to an API key.',
120
+ 'Metadata to apply to an API key.',
77
121
  )
78
122
 
79
- /** Path parameters for attributing a key. */
123
+ /** Path parameters for updating a key. */
80
124
  export const Params = z
81
125
  .object({
82
- id: z.string().check(z.describe('Stable id of the key to attribute.')),
126
+ id: z.string().check(z.describe('Stable id of the key to update.')),
83
127
  })
84
- .check(z.describe('Path parameters for attributing an API key.'))
128
+ .check(z.describe('Path parameters for updating an API key.'))
85
129
  }
86
130
 
87
131
  /** Schemas for the backfillApiKeys operation. */
@@ -119,7 +163,7 @@ export namespace schema {
119
163
  * returning the one-time token.
120
164
  * - `GET /` lists key records (metadata only), optionally filtered by `orgId`.
121
165
  * - `DELETE /:id` revokes a key by id (`404` if absent).
122
- * - `PATCH /:id` re-attributes a key to an org/project (the legacy backfill path).
166
+ * - `PATCH /:id` updates a key's name or project, or assigns its first organization.
123
167
  * - `POST /backfill` rebuilds the id and org index entries for every record.
124
168
  */
125
169
  export function apiKeys() {
@@ -152,6 +196,7 @@ export function apiKeys() {
152
196
  OpenApi.describeRoute({
153
197
  operationId: 'createApiKey',
154
198
  responses: OpenApi.responses({
199
+ errors: { 404: 'Organization or project not found.' },
155
200
  success: {
156
201
  description: 'Minted key (includes the one-time token).',
157
202
  schema: schema.createApiKey.Response,
@@ -161,13 +206,44 @@ export function apiKeys() {
161
206
  tags: ['API keys'],
162
207
  }),
163
208
  async (c) => {
164
- // `createdBy` is the verified admin email, never client-supplied.
165
- // `requireAuth` guarantees identity on this gated route.
166
- const { record, token } = await ApiKeys.mint(c.get('kv').store, {
167
- ...c.req.valid('json'),
168
- createdBy: c.get('identity')!.email,
169
- })
170
- return c.json(Response.validated(schema.createApiKey.Response, { ...record, token }))
209
+ const input = c.req.valid('json')
210
+ const db = Db.get(c.get('db'))
211
+ try {
212
+ const [organization, project] = await Promise.all([
213
+ input.orgId === undefined ? undefined : Organizations.get(db, input.orgId),
214
+ input.projectId === undefined ? undefined : Projects.get(db, input.projectId),
215
+ ])
216
+ if (input.orgId !== undefined && !organization)
217
+ return Response.error(c, {
218
+ code: 'not_found',
219
+ message: 'Organization not found.',
220
+ status: 404,
221
+ })
222
+ if (input.projectId !== undefined && !project)
223
+ return Response.error(c, {
224
+ code: 'not_found',
225
+ message: 'Project not found.',
226
+ status: 404,
227
+ })
228
+ if (project && input.orgId !== undefined && project.orgId !== input.orgId)
229
+ return Response.error(c, {
230
+ code: 'not_found',
231
+ message: 'Project not found in this organization.',
232
+ status: 404,
233
+ })
234
+ const orgId = input.orgId ?? project?.orgId
235
+
236
+ // `createdBy` is the verified admin email, never client-supplied.
237
+ // `requireAuth` guarantees identity on this gated route.
238
+ const { record, token } = await ApiKeys.mint(c.get('kv').store, {
239
+ ...input,
240
+ createdBy: c.get('identity')!.email,
241
+ ...(orgId === undefined ? {} : { orgId }),
242
+ })
243
+ return c.json(Response.validated(schema.createApiKey.Response, { ...record, token }))
244
+ } catch (cause) {
245
+ return Response.upstream(c, cause)
246
+ }
171
247
  },
172
248
  )
173
249
  .get(
@@ -186,9 +262,10 @@ export function apiKeys() {
186
262
  }),
187
263
  async (c) => {
188
264
  const { orgId } = c.req.valid('query')
189
- const data = orgId
265
+ const records = orgId
190
266
  ? await ApiKeys.listByOrg(c.get('kv').store, orgId)
191
267
  : await ApiKeys.list(c.get('kv').store)
268
+ const data = await enrichKeys(Db.get(c.get('db')), records)
192
269
  return c.json(Response.validated(schema.listApiKeys.Response, { data }))
193
270
  },
194
271
  )
@@ -221,27 +298,57 @@ export function apiKeys() {
221
298
  )
222
299
  .patch(
223
300
  '/:id',
224
- OpenApi.validate('param', schema.attributeApiKey.Params, {
301
+ OpenApi.validate('param', schema.updateApiKey.Params, {
225
302
  code: 'param_invalid',
226
303
  message: 'Invalid path parameters',
227
304
  }),
228
- OpenApi.validate('json', schema.attributeApiKey.Body, {
305
+ OpenApi.validate('json', schema.updateApiKey.Body, {
229
306
  code: 'body_invalid',
230
307
  message: 'Invalid request body',
231
308
  }),
232
309
  OpenApi.describeRoute({
233
- description: 'Re-attribute a key to an organization and/or project. The token is unchanged.', // prettier-ignore
234
- operationId: 'attributeApiKey',
310
+ description: 'Update a key name or project, or assign its first organization. The token is unchanged.', // prettier-ignore
311
+ operationId: 'updateApiKey',
235
312
  responses: OpenApi.responses({
236
- errors: { 404: 'API key not found.' },
313
+ errors: {
314
+ 404: 'API key or organization not found.',
315
+ 409: 'API key already belongs to another organization.',
316
+ },
237
317
  success: { description: 'The updated key record.', schema: ApiKeys.schema.Record },
238
318
  }),
239
- summary: 'Attribute API key',
319
+ summary: 'Update API key',
240
320
  tags: ['API keys'],
241
321
  }),
242
322
  async (c) => {
243
323
  const { id } = c.req.valid('param')
244
- const updated = await ApiKeys.attribute(c.get('kv').store, id, c.req.valid('json'))
324
+ const input = c.req.valid('json')
325
+ const store = c.get('kv').store
326
+ const record = await ApiKeys.get(store, id)
327
+ if (!record)
328
+ return Response.error(c, {
329
+ code: 'not_found',
330
+ message: 'API key not found.',
331
+ status: 404,
332
+ })
333
+
334
+ // One-off keys use their key id as `orgId`.
335
+ if (input.orgId !== undefined && record.orgId !== record.id && input.orgId !== record.orgId)
336
+ return Response.error(c, {
337
+ code: 'organization_already_assigned',
338
+ message: 'API key already belongs to an organization.',
339
+ status: 409,
340
+ })
341
+ if (
342
+ input.orgId !== undefined &&
343
+ !(await Organizations.get(Db.get(c.get('db')), input.orgId))
344
+ )
345
+ return Response.error(c, {
346
+ code: 'not_found',
347
+ message: 'Organization not found.',
348
+ status: 404,
349
+ })
350
+
351
+ const updated = await ApiKeys.update(store, id, input)
245
352
  if (!updated)
246
353
  return Response.error(c, {
247
354
  code: 'not_found',
@@ -252,3 +359,34 @@ export function apiKeys() {
252
359
  },
253
360
  )
254
361
  }
362
+
363
+ /** Resolves display labels without changing the authoritative key record. */
364
+ async function enrichKeys(db: Db.Db, records: readonly ApiKeys.Record[]) {
365
+ const organizationIds = [
366
+ ...new Set(records.map(({ orgId }) => orgId).filter((id) => id.startsWith('org_'))),
367
+ ]
368
+ const projectIds = [
369
+ ...new Set(records.flatMap(({ projectId }) => (projectId ? [projectId] : []))),
370
+ ]
371
+ const userIds = [
372
+ ...new Set(
373
+ records.flatMap(({ createdBy }) => (createdBy?.startsWith('usr_') ? [createdBy] : [])),
374
+ ),
375
+ ]
376
+ const [organizations, projects, users] = await Promise.all([
377
+ Organizations.listByIds(db, organizationIds),
378
+ Projects.listByIds(db, projectIds),
379
+ Users.listByIds(db, userIds),
380
+ ])
381
+ const organizationNames = new Map(organizations.map(({ id, name }) => [id, name]))
382
+ const projectNames = new Map(projects.map(({ id, name }) => [id, name]))
383
+ const userLabels = new Map(users.map(({ address, email, id }) => [id, email ?? address ?? id]))
384
+ return records.map((record) => ({
385
+ ...record,
386
+ createdByLabel: record.createdBy
387
+ ? (userLabels.get(record.createdBy) ?? record.createdBy)
388
+ : null,
389
+ organizationName: organizationNames.get(record.orgId) ?? null,
390
+ projectName: record.projectId ? (projectNames.get(record.projectId) ?? null) : null,
391
+ }))
392
+ }
@@ -0,0 +1,338 @@
1
+ import { Hono } from 'hono'
2
+ import { tempoTestnet } from 'viem/tempo/chains'
3
+
4
+ import * as TestAdmin from '../../../test/Admin.js'
5
+ import * as TestApp from '../../../test/App.js'
6
+ import * as TestEarn from '../../../test/Earn.js'
7
+ import * as Runtime from '../../../test/runtime.js'
8
+ import * as Earn from '../../apps/data/routes/earn.js'
9
+ import * as core_EarnVaults from '../../db/tables/earnVaults.js'
10
+ import * as App from './earn-vaults.js'
11
+
12
+ const asset = TestEarn.assetTokenAddress
13
+ const vaultAddress = TestEarn.vaultAddress
14
+
15
+ const input = {
16
+ chainId: tempoTestnet.id,
17
+ description: 'Bridge test PATHUSD deposited into the canonical Earn v1 stack.',
18
+ label: 'btPATHUSD Earn',
19
+ privateInputTokens: [],
20
+ privateOutputTokens: [],
21
+ slug: 'btpathusd-earn',
22
+ vaultAddress,
23
+ } as const
24
+
25
+ describe('authentication', () => {
26
+ test('denied identity returns 401', async () => {
27
+ const { app } = TestAdmin.setup({ identify: () => null })
28
+ const [detail, list, put, remove] = await Promise.all([
29
+ app.request(`/earn/verified-vaults/${vaultAddress}?chainId=${tempoTestnet.id}`),
30
+ app.request(`/earn/verified-vaults?chainId=${tempoTestnet.id}`),
31
+ app.request('/earn/verified-vaults', {
32
+ body: JSON.stringify(input),
33
+ headers: { 'content-type': 'application/json' },
34
+ method: 'PUT',
35
+ }),
36
+ app.request(`/earn/verified-vaults/${vaultAddress}?chainId=${tempoTestnet.id}`, {
37
+ method: 'DELETE',
38
+ }),
39
+ ])
40
+ expect([detail.status, list.status, put.status, remove.status]).toEqual([401, 401, 401, 401])
41
+ })
42
+ })
43
+
44
+ describe('getVerifiedEarnVault', () => {
45
+ test('rejects malformed vault addresses', async () => {
46
+ const { app } = TestAdmin.setup()
47
+ const response = await app.request(`/earn/verified-vaults/invalid?chainId=${tempoTestnet.id}`)
48
+ expect(response.status).toBe(400)
49
+ expect(await response.json()).toMatchObject({ error: { code: 'vault_id_invalid' } })
50
+ })
51
+
52
+ // This surface cannot measure rates or value assets, so it rejects both
53
+ // fields instead of answering with a null that reads as unmeasurable.
54
+ test('rejects rate and valuation includes', async () => {
55
+ const { app } = TestAdmin.setup()
56
+ const response = await app.request(
57
+ `/earn/verified-vaults/${vaultAddress}?chainId=${tempoTestnet.id}&include=apy,tvl`,
58
+ )
59
+ expect(response.status).toBe(400)
60
+ expect(await response.json()).toMatchObject({ error: { code: 'query_invalid' } })
61
+ })
62
+
63
+ test.runIf(Runtime.get().mode === 'testnet')(
64
+ 'resolves an unverified vault for registry entry',
65
+ async () => {
66
+ const db = TestApp.database()
67
+ const { app } = TestAdmin.setup({ db, zones: [TestEarn.zone] })
68
+ const publicApp = TestApp.create({ auth: false, db, zones: [TestEarn.zone] })
69
+ const query = `?chainId=${tempoTestnet.id}&include=access,capabilities,zone`
70
+ const [response, publicResponse] = await Promise.all([
71
+ app.request(`/earn/verified-vaults/${vaultAddress}${query}`),
72
+ publicApp.request(`/v1/earn/vaults/${vaultAddress}${query}`),
73
+ ])
74
+ expect([response.status, publicResponse.status]).toEqual([200, 200])
75
+ const [vault, publicVault] = await Promise.all([
76
+ TestApp.json(response, App.schema.getVerifiedEarnVault.Response),
77
+ TestApp.json(publicResponse, Earn.schema.getEarnVault.Response),
78
+ ])
79
+ // Every field the admin include set can select is resolved identically to
80
+ // the public surface.
81
+ expect(publicVault.meta).toBeUndefined()
82
+ expect(vault).toStrictEqual(publicVault)
83
+ expect({
84
+ description: vault.description,
85
+ slug: vault.slug,
86
+ vaultAddress: vault.vaultAddress,
87
+ verified: vault.verified,
88
+ }).toMatchInlineSnapshot(`
89
+ {
90
+ "description": null,
91
+ "slug": null,
92
+ "vaultAddress": "0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a",
93
+ "verified": false,
94
+ }
95
+ `)
96
+ },
97
+ 90_000,
98
+ )
99
+
100
+ test.runIf(Runtime.get().mode === 'testnet')(
101
+ 'returns token logo URLs under the app mount',
102
+ async () => {
103
+ const { app } = TestAdmin.setup({
104
+ assets: {
105
+ get: async (key) =>
106
+ key === `${tempoTestnet.id}/icons/${asset}`
107
+ ? { body: new ArrayBuffer(0), contentType: 'image/svg+xml' }
108
+ : undefined,
109
+ },
110
+ zones: [TestEarn.zone],
111
+ })
112
+ const mounted = new Hono().route('/admin', app)
113
+ const response = await mounted.request(
114
+ `http://host/admin/earn/verified-vaults/${vaultAddress}?chainId=${tempoTestnet.id}&include=token.logoUri`,
115
+ )
116
+ const vault = await TestApp.json(response, App.schema.getVerifiedEarnVault.Response)
117
+ expect(vault.assetToken.logoUri).toBe(
118
+ `http://host/admin/verified-tokens/${asset}/logo?chainId=${tempoTestnet.id}`,
119
+ )
120
+ expect((await mounted.request(vault.assetToken.logoUri!)).status).toBe(200)
121
+ },
122
+ 90_000,
123
+ )
124
+ })
125
+
126
+ describe('listVerifiedEarnVaults', () => {
127
+ test('rejects rate and valuation includes', async () => {
128
+ const { app } = TestAdmin.setup()
129
+ const response = await app.request(
130
+ `/earn/verified-vaults?chainId=${tempoTestnet.id}&include=apy,tvl`,
131
+ )
132
+ expect(response.status).toBe(400)
133
+ expect(await response.json()).toMatchObject({ error: { code: 'query_invalid' } })
134
+ })
135
+
136
+ test.runIf(Runtime.get().mode === 'testnet')(
137
+ 'matches the public verified collection',
138
+ async () => {
139
+ const db = TestApp.database()
140
+ await core_EarnVaults.upsert(db, TestEarn.verifiedVault)
141
+ const { app } = TestAdmin.setup({ db, zones: [TestEarn.zone] })
142
+ const publicApp = TestApp.create({ auth: false, db, zones: [TestEarn.zone] })
143
+ const query = `?chainId=${tempoTestnet.id}&include=access,capabilities,zone&limit=5`
144
+ const [response, publicResponse] = await Promise.all([
145
+ app.request(`/earn/verified-vaults${query}`),
146
+ publicApp.request(`/v1/earn/vaults/verified${query}`),
147
+ ])
148
+ expect([response.status, publicResponse.status]).toEqual([200, 200])
149
+ const [body, publicBody] = await Promise.all([
150
+ TestApp.json(response, App.schema.listVerifiedEarnVaults.Response),
151
+ TestApp.json(publicResponse, App.schema.listVerifiedEarnVaults.Response),
152
+ ])
153
+ expect(body).toStrictEqual(publicBody)
154
+ },
155
+ 90_000,
156
+ )
157
+ })
158
+
159
+ describe('putVerifiedEarnVault', () => {
160
+ test('rejects invalid slugs', async () => {
161
+ const { app } = TestAdmin.setup()
162
+ const response = await app.request('/earn/verified-vaults', {
163
+ body: JSON.stringify({ ...input, slug: 'Not a slug' }),
164
+ headers: { 'content-type': 'application/json' },
165
+ method: 'PUT',
166
+ })
167
+ expect(response.status).toBe(400)
168
+ expect(await response.json()).toMatchObject({ error: { code: 'body_invalid' } })
169
+ })
170
+
171
+ test('rejects derived fields', async () => {
172
+ const { app } = TestAdmin.setup()
173
+ const response = await app.request('/earn/verified-vaults', {
174
+ body: JSON.stringify({ ...input, engine: { type: 'erc4626' } }),
175
+ headers: { 'content-type': 'application/json' },
176
+ method: 'PUT',
177
+ })
178
+ expect(response.status).toBe(400)
179
+ expect(await response.json()).toMatchObject({ error: { code: 'body_invalid' } })
180
+ })
181
+
182
+ test.runIf(Runtime.get().mode === 'testnet')(
183
+ 'rejects private tokens without a configured router',
184
+ async () => {
185
+ const { app } = TestAdmin.setup({ zones: [TestEarn.zone] })
186
+ const response = await app.request('/earn/verified-vaults', {
187
+ body: JSON.stringify({
188
+ ...input,
189
+ privateInputTokens: [asset],
190
+ privateOutputTokens: [asset],
191
+ }),
192
+ headers: { 'content-type': 'application/json' },
193
+ method: 'PUT',
194
+ })
195
+ expect(response.status).toBe(409)
196
+ expect(await response.json()).toMatchObject({
197
+ error: { code: 'earn_vault_verification_failed' },
198
+ })
199
+ },
200
+ 90_000,
201
+ )
202
+
203
+ test.runIf(Runtime.get().mode === 'testnet')(
204
+ 'verifies, stores, and updates curated fields',
205
+ async () => {
206
+ const { app, db } = TestAdmin.setup({ zones: [TestEarn.zone] })
207
+ const response = await app.request('/earn/verified-vaults', {
208
+ body: JSON.stringify(input),
209
+ headers: { 'content-type': 'application/json' },
210
+ method: 'PUT',
211
+ })
212
+ expect(response.status).toBe(200)
213
+ const body = await TestApp.json(response, App.schema.putVerifiedEarnVault.Response)
214
+ expect({
215
+ description: body.description,
216
+ engineType: body.engine.type,
217
+ gatewayExposed: 'gateway' in body,
218
+ id: body.id,
219
+ label: body.label,
220
+ slug: body.slug,
221
+ vaultAddress: body.vaultAddress,
222
+ verified: body.verified,
223
+ zone: body.zone,
224
+ }).toMatchInlineSnapshot(`
225
+ {
226
+ "description": "Bridge test PATHUSD deposited into the canonical Earn v1 stack.",
227
+ "engineType": "erc4626",
228
+ "gatewayExposed": false,
229
+ "id": "0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a",
230
+ "label": "btPATHUSD Earn",
231
+ "slug": "btpathusd-earn",
232
+ "vaultAddress": "0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a",
233
+ "verified": true,
234
+ "zone": null,
235
+ }
236
+ `)
237
+
238
+ const created = await core_EarnVaults.get(db, {
239
+ chainId: tempoTestnet.id,
240
+ vaultAddress,
241
+ })
242
+ const updatedResponse = await app.request('/earn/verified-vaults', {
243
+ body: JSON.stringify({
244
+ chainId: tempoTestnet.id,
245
+ description: null,
246
+ label: 'Updated btPATHUSD Earn',
247
+ slug: 'updated-btpathusd-earn',
248
+ vaultAddress,
249
+ }),
250
+ headers: { 'content-type': 'application/json' },
251
+ method: 'PUT',
252
+ })
253
+ expect(updatedResponse.status).toBe(200)
254
+ const updated = await TestApp.json(updatedResponse, App.schema.putVerifiedEarnVault.Response)
255
+ expect({
256
+ description: updated.description,
257
+ label: updated.label,
258
+ slug: updated.slug,
259
+ zone: updated.zone,
260
+ }).toMatchInlineSnapshot(`
261
+ {
262
+ "description": null,
263
+ "label": "Updated btPATHUSD Earn",
264
+ "slug": "updated-btpathusd-earn",
265
+ "zone": null,
266
+ }
267
+ `)
268
+
269
+ const stored = await core_EarnVaults.get(db, {
270
+ chainId: tempoTestnet.id,
271
+ vaultAddress,
272
+ })
273
+ expect(stored).toMatchObject({
274
+ privateInputTokens: [],
275
+ privateOutputTokens: [],
276
+ slug: 'updated-btpathusd-earn',
277
+ })
278
+ expect(stored?.createdAt).toBe(created?.createdAt)
279
+ },
280
+ 90_000,
281
+ )
282
+ })
283
+
284
+ describe('deleteVerifiedEarnVault', () => {
285
+ test('physically removes the row without reading contracts', async () => {
286
+ const { app, db } = TestAdmin.setup({ rpc: { url: () => 'http://127.0.0.1:1' } })
287
+ await core_EarnVaults.upsert(db, input)
288
+
289
+ const response = await app.request(
290
+ `/earn/verified-vaults/${vaultAddress}?chainId=${tempoTestnet.id}`,
291
+ { method: 'DELETE' },
292
+ )
293
+ expect(response.status).toBe(204)
294
+ expect(
295
+ await core_EarnVaults.get(db, { chainId: tempoTestnet.id, vaultAddress }),
296
+ ).toBeUndefined()
297
+
298
+ const missing = await app.request(
299
+ `/earn/verified-vaults/${vaultAddress}?chainId=${tempoTestnet.id}`,
300
+ { method: 'DELETE' },
301
+ )
302
+ expect(missing.status).toBe(404)
303
+ })
304
+
305
+ test.runIf(Runtime.get().mode === 'testnet')(
306
+ 'leaves the public vault available as unverified',
307
+ async () => {
308
+ const db = TestApp.database()
309
+ await core_EarnVaults.upsert(db, TestEarn.verifiedVault)
310
+ const { app } = TestAdmin.setup({ db, zones: [TestEarn.zone] })
311
+ const publicApp = TestApp.create({ auth: false, db, zones: [TestEarn.zone] })
312
+
313
+ const response = await app.request(
314
+ `/earn/verified-vaults/${vaultAddress}?chainId=${tempoTestnet.id}`,
315
+ { method: 'DELETE' },
316
+ )
317
+ expect(response.status).toBe(204)
318
+
319
+ const publicResponse = await publicApp.request(
320
+ `/v1/earn/vaults/${vaultAddress}?chainId=${tempoTestnet.id}&include=zone`,
321
+ )
322
+ expect(publicResponse.status).toBe(200)
323
+ const vault = await TestApp.json(publicResponse, App.schema.getVerifiedEarnVault.Response)
324
+ expect({
325
+ description: vault.description,
326
+ slug: vault.slug,
327
+ verified: vault.verified,
328
+ zone: vault.zone,
329
+ }).toStrictEqual({
330
+ description: null,
331
+ slug: null,
332
+ verified: false,
333
+ zone: null,
334
+ })
335
+ },
336
+ 90_000,
337
+ )
338
+ })