tapimo 0.7.1 → 0.8.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 (786) hide show
  1. package/README.md +10 -7
  2. package/dist/ApiKey.d.ts +3 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +10 -0
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +29 -8
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +24 -5
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +20680 -15487
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +250 -129
  13. package/dist/App.js.map +1 -1
  14. package/dist/Assets.d.ts +10 -0
  15. package/dist/Assets.d.ts.map +1 -1
  16. package/dist/Assets.js +17 -4
  17. package/dist/Assets.js.map +1 -1
  18. package/dist/Scope.d.ts +19 -8
  19. package/dist/Scope.d.ts.map +1 -1
  20. package/dist/Scope.js +25 -9
  21. package/dist/Scope.js.map +1 -1
  22. package/dist/Webhooks.d.ts +1 -1
  23. package/dist/admin/App.d.ts +667 -76
  24. package/dist/admin/App.d.ts.map +1 -1
  25. package/dist/admin/App.js +12 -2
  26. package/dist/admin/App.js.map +1 -1
  27. package/dist/admin/apps/api-keys.d.ts +107 -11
  28. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  29. package/dist/admin/apps/api-keys.js +145 -32
  30. package/dist/admin/apps/api-keys.js.map +1 -1
  31. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  32. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  33. package/dist/admin/apps/earn-vaults.js +409 -0
  34. package/dist/admin/apps/earn-vaults.js.map +1 -0
  35. package/dist/admin/apps/organizations.d.ts +2 -0
  36. package/dist/admin/apps/organizations.d.ts.map +1 -1
  37. package/dist/admin/apps/verified-tokens.d.ts +74 -74
  38. package/dist/admin/ui.generated.d.ts +1 -1
  39. package/dist/admin/ui.generated.d.ts.map +1 -1
  40. package/dist/admin/ui.generated.js +99 -43
  41. package/dist/admin/ui.generated.js.map +1 -1
  42. package/dist/analytics/Analytics.d.ts +4 -0
  43. package/dist/analytics/Analytics.d.ts.map +1 -1
  44. package/dist/analytics/Analytics.js +21 -2
  45. package/dist/analytics/Analytics.js.map +1 -1
  46. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  47. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  48. package/dist/analytics/tables/requestEvents.js +59 -39
  49. package/dist/analytics/tables/requestEvents.js.map +1 -1
  50. package/dist/apps/Zones.d.ts +8335 -0
  51. package/dist/apps/Zones.d.ts.map +1 -0
  52. package/dist/apps/Zones.js +38 -0
  53. package/dist/apps/Zones.js.map +1 -0
  54. package/dist/apps/data/App.d.ts +5666 -3934
  55. package/dist/apps/data/App.d.ts.map +1 -1
  56. package/dist/apps/data/App.js +90 -22
  57. package/dist/apps/data/App.js.map +1 -1
  58. package/dist/apps/data/FxOracle.d.ts +1 -1
  59. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  60. package/dist/apps/data/index.d.ts +0 -1
  61. package/dist/apps/data/index.d.ts.map +1 -1
  62. package/dist/apps/data/index.js +0 -1
  63. package/dist/apps/data/index.js.map +1 -1
  64. package/dist/apps/data/routes/activities.d.ts +56 -56
  65. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  66. package/dist/apps/data/routes/activities.js +130 -65
  67. package/dist/apps/data/routes/activities.js.map +1 -1
  68. package/dist/apps/data/routes/addresses.d.ts +65 -65
  69. package/dist/apps/data/routes/balances.d.ts +14 -14
  70. package/dist/apps/data/routes/balances.js +5 -5
  71. package/dist/apps/data/routes/balances.js.map +1 -1
  72. package/dist/apps/data/routes/blocks.d.ts +39 -39
  73. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  74. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  75. package/dist/apps/data/routes/coingecko.js +62 -35
  76. package/dist/apps/data/routes/coingecko.js.map +1 -1
  77. package/dist/apps/data/routes/earn.d.ts +2574 -0
  78. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  79. package/dist/apps/data/routes/earn.js +1574 -0
  80. package/dist/apps/data/routes/earn.js.map +1 -0
  81. package/dist/apps/data/routes/exchanges.d.ts +1626 -719
  82. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  83. package/dist/apps/data/routes/exchanges.js +656 -193
  84. package/dist/apps/data/routes/exchanges.js.map +1 -1
  85. package/dist/apps/data/routes/fee-amm.d.ts +108 -108
  86. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  87. package/dist/apps/data/routes/fee-amm.js +59 -8
  88. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  89. package/dist/apps/data/routes/indexer.d.ts +35 -35
  90. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  91. package/dist/apps/data/routes/indexer.js +23 -3
  92. package/dist/apps/data/routes/indexer.js.map +1 -1
  93. package/dist/apps/data/routes/receipts.d.ts +33 -33
  94. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  95. package/dist/apps/data/routes/receipts.js +11 -11
  96. package/dist/apps/data/routes/receipts.js.map +1 -1
  97. package/dist/apps/data/routes/rpc.d.ts +6 -6
  98. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  99. package/dist/apps/data/routes/rpc.js +214 -22
  100. package/dist/apps/data/routes/rpc.js.map +1 -1
  101. package/dist/apps/data/routes/tokenlist.d.ts +1 -1
  102. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokenlist.js +39 -8
  104. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  105. package/dist/apps/data/routes/tokens.d.ts +115 -87
  106. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  107. package/dist/apps/data/routes/tokens.js +194 -91
  108. package/dist/apps/data/routes/tokens.js.map +1 -1
  109. package/dist/apps/data/routes/transactions.d.ts +54 -54
  110. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transactions.js +78 -39
  112. package/dist/apps/data/routes/transactions.js.map +1 -1
  113. package/dist/apps/data/routes/transfers.d.ts +76 -27
  114. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  115. package/dist/apps/data/routes/transfers.js +165 -67
  116. package/dist/apps/data/routes/transfers.js.map +1 -1
  117. package/dist/apps/data/routes/valuation.d.ts +42 -42
  118. package/dist/apps/data/routes/valuation.js +2 -2
  119. package/dist/apps/data/routes/valuation.js.map +1 -1
  120. package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
  121. package/dist/apps/data/routes/webhooks.d.ts +370 -368
  122. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  123. package/dist/apps/data/routes/webhooks.js +161 -59
  124. package/dist/apps/data/routes/webhooks.js.map +1 -1
  125. package/dist/apps/data/routes/zones.d.ts +281 -0
  126. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  127. package/dist/apps/data/routes/zones.js +252 -0
  128. package/dist/apps/data/routes/zones.js.map +1 -0
  129. package/dist/apps/docs/reference.js +6 -5
  130. package/dist/apps/docs/reference.js.map +1 -1
  131. package/dist/apps/funding/Access.d.ts +16 -0
  132. package/dist/apps/funding/Access.d.ts.map +1 -0
  133. package/dist/apps/funding/Access.js +22 -0
  134. package/dist/apps/funding/Access.js.map +1 -0
  135. package/dist/apps/funding/App.d.ts +3183 -0
  136. package/dist/apps/funding/App.d.ts.map +1 -0
  137. package/dist/apps/funding/App.js +46 -0
  138. package/dist/apps/funding/App.js.map +1 -0
  139. package/dist/apps/funding/Inventory.d.ts +5 -0
  140. package/dist/apps/funding/Inventory.d.ts.map +1 -0
  141. package/dist/apps/funding/Inventory.js +25 -0
  142. package/dist/apps/funding/Inventory.js.map +1 -0
  143. package/dist/apps/funding/ProviderAttempts.d.ts +5 -0
  144. package/dist/apps/funding/ProviderAttempts.d.ts.map +1 -0
  145. package/dist/apps/funding/ProviderAttempts.js +24 -0
  146. package/dist/apps/funding/ProviderAttempts.js.map +1 -0
  147. package/dist/apps/funding/index.d.ts +2 -0
  148. package/dist/apps/funding/index.d.ts.map +1 -0
  149. package/dist/apps/funding/index.js +2 -0
  150. package/dist/apps/funding/index.js.map +1 -0
  151. package/dist/apps/funding/routes/chains.d.ts +169 -0
  152. package/dist/apps/funding/routes/chains.d.ts.map +1 -0
  153. package/dist/apps/funding/routes/chains.js +80 -0
  154. package/dist/apps/funding/routes/chains.js.map +1 -0
  155. package/dist/apps/funding/routes/deposit-addresses.d.ts +2388 -0
  156. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -0
  157. package/dist/apps/funding/routes/deposit-addresses.js +860 -0
  158. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -0
  159. package/dist/apps/funding/routes/providers.d.ts +91 -0
  160. package/dist/apps/funding/routes/providers.d.ts.map +1 -0
  161. package/dist/apps/funding/routes/providers.js +56 -0
  162. package/dist/apps/funding/routes/providers.js.map +1 -0
  163. package/dist/apps/{data/routes/funding.d.ts → funding/routes/quotes.d.ts} +26 -396
  164. package/dist/apps/funding/routes/quotes.d.ts.map +1 -0
  165. package/dist/apps/funding/routes/quotes.js +188 -0
  166. package/dist/apps/funding/routes/quotes.js.map +1 -0
  167. package/dist/apps/funding/routes/transfers.d.ts +1999 -0
  168. package/dist/apps/funding/routes/transfers.d.ts.map +1 -0
  169. package/dist/apps/funding/routes/transfers.js +614 -0
  170. package/dist/apps/funding/routes/transfers.js.map +1 -0
  171. package/dist/apps/index.d.ts +3 -1
  172. package/dist/apps/index.d.ts.map +1 -1
  173. package/dist/apps/index.js +3 -1
  174. package/dist/apps/index.js.map +1 -1
  175. package/dist/apps/management/App.d.ts +839 -574
  176. package/dist/apps/management/App.d.ts.map +1 -1
  177. package/dist/apps/management/Billing.d.ts +8 -0
  178. package/dist/apps/management/Billing.d.ts.map +1 -1
  179. package/dist/apps/management/Billing.js +12 -0
  180. package/dist/apps/management/Billing.js.map +1 -1
  181. package/dist/apps/management/Error.d.ts +12 -0
  182. package/dist/apps/management/Error.d.ts.map +1 -0
  183. package/dist/apps/management/Error.js +10 -0
  184. package/dist/apps/management/Error.js.map +1 -0
  185. package/dist/apps/management/routes/api-keys.d.ts +296 -19
  186. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  187. package/dist/apps/management/routes/api-keys.js +77 -9
  188. package/dist/apps/management/routes/api-keys.js.map +1 -1
  189. package/dist/apps/management/routes/billing.d.ts +119 -119
  190. package/dist/apps/management/routes/faucet.d.ts +35 -35
  191. package/dist/apps/management/routes/invitations.d.ts +17 -17
  192. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  193. package/dist/apps/management/routes/invitations.js +4 -10
  194. package/dist/apps/management/routes/invitations.js.map +1 -1
  195. package/dist/apps/management/routes/invite-links.d.ts +38 -38
  196. package/dist/apps/management/routes/me.d.ts +6 -6
  197. package/dist/apps/management/routes/members.d.ts +69 -69
  198. package/dist/apps/management/routes/orgs.d.ts +16 -16
  199. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  200. package/dist/apps/management/routes/orgs.js +2 -8
  201. package/dist/apps/management/routes/orgs.js.map +1 -1
  202. package/dist/apps/management/routes/projects.d.ts +19 -19
  203. package/dist/apps/management/routes/scopes.d.ts +1 -1
  204. package/dist/apps/management/routes/scopes.js +2 -2
  205. package/dist/apps/management/routes/scopes.js.map +1 -1
  206. package/dist/apps/management/routes/usage.d.ts +72 -72
  207. package/dist/apps/management/routes/verified-token-requests.d.ts +18 -18
  208. package/dist/apps/management/routes/webhooks.d.ts +122 -122
  209. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  210. package/dist/apps/management/routes/webhooks.js +15 -3
  211. package/dist/apps/management/routes/webhooks.js.map +1 -1
  212. package/dist/apps/mcp.d.ts +2 -3
  213. package/dist/apps/mcp.d.ts.map +1 -1
  214. package/dist/apps/mcp.js +16 -14
  215. package/dist/apps/mcp.js.map +1 -1
  216. package/dist/apps/metadata.d.ts +4 -0
  217. package/dist/apps/metadata.d.ts.map +1 -1
  218. package/dist/apps/metadata.js +10 -0
  219. package/dist/apps/metadata.js.map +1 -1
  220. package/dist/apps/mpp/App.d.ts +57 -58
  221. package/dist/apps/mpp/App.d.ts.map +1 -1
  222. package/dist/apps/mpp/App.js +192 -27
  223. package/dist/apps/mpp/App.js.map +1 -1
  224. package/dist/apps/mpp/Mpp.d.ts +0 -20
  225. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  226. package/dist/apps/mpp/Mpp.js +0 -24
  227. package/dist/apps/mpp/Mpp.js.map +1 -1
  228. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  229. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  230. package/dist/apps/mpp/internal/Adapter.js +66 -0
  231. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  232. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  233. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  234. package/dist/apps/mpp/internal/Error.js +41 -0
  235. package/dist/apps/mpp/internal/Error.js.map +1 -0
  236. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  237. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  238. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  239. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  240. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  241. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  242. package/dist/apps/mpp/internal/Policy.js +57 -0
  243. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  244. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  245. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  246. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  247. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  248. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  249. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  250. package/dist/apps/mpp/internal/Screening.js +20 -0
  251. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  252. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  253. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  254. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  255. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  256. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  257. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  258. package/dist/apps/mpp/internal/Utils.js +24 -0
  259. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  260. package/dist/apps/relay/App.js +183 -23
  261. package/dist/apps/relay/App.js.map +1 -1
  262. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  263. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  264. package/dist/apps/relay/Sponsorships.js +15 -6
  265. package/dist/apps/relay/Sponsorships.js.map +1 -1
  266. package/dist/cloudflare.d.ts +50 -0
  267. package/dist/cloudflare.d.ts.map +1 -1
  268. package/dist/cloudflare.js +178 -0
  269. package/dist/cloudflare.js.map +1 -1
  270. package/dist/db/Db.d.ts +22 -0
  271. package/dist/db/Db.d.ts.map +1 -1
  272. package/dist/db/Db.js +379 -0
  273. package/dist/db/Db.js.map +1 -1
  274. package/dist/db/Schema.d.ts +933 -1
  275. package/dist/db/Schema.d.ts.map +1 -1
  276. package/dist/db/Schema.js +289 -1
  277. package/dist/db/Schema.js.map +1 -1
  278. package/dist/db/tables/earnVaults.d.ts +68 -0
  279. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  280. package/dist/db/tables/earnVaults.js +72 -0
  281. package/dist/db/tables/earnVaults.js.map +1 -0
  282. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  283. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  284. package/dist/db/tables/fundingCatalog.js +85 -0
  285. package/dist/db/tables/fundingCatalog.js.map +1 -0
  286. package/dist/db/tables/fundingDepositAddresses.d.ts +172 -0
  287. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  288. package/dist/db/tables/fundingDepositAddresses.js +218 -0
  289. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  290. package/dist/db/tables/fundingDepositRequestObservations.d.ts +45 -0
  291. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +1 -0
  292. package/dist/db/tables/fundingDepositRequestObservations.js +46 -0
  293. package/dist/db/tables/fundingDepositRequestObservations.js.map +1 -0
  294. package/dist/db/tables/fundingDeposits.d.ts +171 -0
  295. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  296. package/dist/db/tables/fundingDeposits.js +182 -0
  297. package/dist/db/tables/fundingDeposits.js.map +1 -0
  298. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  299. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  300. package/dist/db/tables/fundingIdempotency.js +103 -0
  301. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  302. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  303. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  304. package/dist/db/tables/fundingTransferEvents.js +18 -0
  305. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  306. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  307. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  308. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  309. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  310. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  311. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  312. package/dist/db/tables/fundingTransfers.js +89 -0
  313. package/dist/db/tables/fundingTransfers.js.map +1 -0
  314. package/dist/db/tables/organizations.d.ts +8 -0
  315. package/dist/db/tables/organizations.d.ts.map +1 -1
  316. package/dist/db/tables/organizations.js +16 -0
  317. package/dist/db/tables/organizations.js.map +1 -1
  318. package/dist/db/tables/projects.d.ts +8 -0
  319. package/dist/db/tables/projects.d.ts.map +1 -1
  320. package/dist/db/tables/projects.js +16 -0
  321. package/dist/db/tables/projects.js.map +1 -1
  322. package/dist/db/tables/requestUsage.d.ts +13 -0
  323. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  324. package/dist/db/tables/requestUsage.js +16 -0
  325. package/dist/db/tables/requestUsage.js.map +1 -1
  326. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  327. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  328. package/dist/db/tables/sponsoredTransactions.js +1 -1
  329. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  330. package/dist/db/tables/users.d.ts +8 -0
  331. package/dist/db/tables/users.d.ts.map +1 -1
  332. package/dist/db/tables/users.js +16 -0
  333. package/dist/db/tables/users.js.map +1 -1
  334. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  335. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  336. package/dist/db/tables/verifiedTokens.js +9 -7
  337. package/dist/db/tables/verifiedTokens.js.map +1 -1
  338. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  339. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  340. package/dist/db/tables/webhookSubscriptions.js +24 -3
  341. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  342. package/dist/handlers/relay.js +108 -108
  343. package/dist/handlers/relay.js.map +1 -1
  344. package/dist/internal/Auth.d.ts +37 -11
  345. package/dist/internal/Auth.d.ts.map +1 -1
  346. package/dist/internal/Auth.js +75 -16
  347. package/dist/internal/Auth.js.map +1 -1
  348. package/dist/internal/Cache.d.ts.map +1 -1
  349. package/dist/internal/Cache.js +17 -11
  350. package/dist/internal/Cache.js.map +1 -1
  351. package/dist/internal/Cursor.js +1 -1
  352. package/dist/internal/Cursor.js.map +1 -1
  353. package/dist/internal/EarnRates.d.ts +89 -0
  354. package/dist/internal/EarnRates.d.ts.map +1 -0
  355. package/dist/internal/EarnRates.js +266 -0
  356. package/dist/internal/EarnRates.js.map +1 -0
  357. package/dist/internal/EarnVaults.d.ts +171 -0
  358. package/dist/internal/EarnVaults.d.ts.map +1 -0
  359. package/dist/internal/EarnVaults.js +547 -0
  360. package/dist/internal/EarnVaults.js.map +1 -0
  361. package/dist/internal/EdgeCache.d.ts +10 -3
  362. package/dist/internal/EdgeCache.d.ts.map +1 -1
  363. package/dist/internal/EdgeCache.js +43 -11
  364. package/dist/internal/EdgeCache.js.map +1 -1
  365. package/dist/internal/Id.d.ts +11 -0
  366. package/dist/internal/Id.d.ts.map +1 -1
  367. package/dist/internal/Id.js +13 -0
  368. package/dist/internal/Id.js.map +1 -1
  369. package/dist/internal/Idempotency.d.ts +83 -0
  370. package/dist/internal/Idempotency.d.ts.map +1 -0
  371. package/dist/internal/Idempotency.js +113 -0
  372. package/dist/internal/Idempotency.js.map +1 -0
  373. package/dist/internal/IpAllowlist.d.ts +15 -0
  374. package/dist/internal/IpAllowlist.d.ts.map +1 -0
  375. package/dist/internal/IpAllowlist.js +27 -0
  376. package/dist/internal/IpAllowlist.js.map +1 -0
  377. package/dist/internal/Log.d.ts +64 -9
  378. package/dist/internal/Log.d.ts.map +1 -1
  379. package/dist/internal/Log.js +29 -7
  380. package/dist/internal/Log.js.map +1 -1
  381. package/dist/internal/MetricSink.d.ts.map +1 -1
  382. package/dist/internal/MetricSink.js +47 -1
  383. package/dist/internal/MetricSink.js.map +1 -1
  384. package/dist/internal/OpenApi.d.ts +2 -2
  385. package/dist/internal/OpenApi.d.ts.map +1 -1
  386. package/dist/internal/OpenApi.js +4 -1
  387. package/dist/internal/OpenApi.js.map +1 -1
  388. package/dist/internal/Provider.d.ts +14 -0
  389. package/dist/internal/Provider.d.ts.map +1 -0
  390. package/dist/internal/Provider.js +5 -0
  391. package/dist/internal/Provider.js.map +1 -0
  392. package/dist/internal/Schema.d.ts +6 -1
  393. package/dist/internal/Schema.d.ts.map +1 -1
  394. package/dist/internal/Schema.js +20 -11
  395. package/dist/internal/Schema.js.map +1 -1
  396. package/dist/internal/Store.d.ts +6 -0
  397. package/dist/internal/Store.d.ts.map +1 -1
  398. package/dist/internal/Store.js +35 -0
  399. package/dist/internal/Store.js.map +1 -1
  400. package/dist/internal/Tidx.d.ts +49 -24
  401. package/dist/internal/Tidx.d.ts.map +1 -1
  402. package/dist/internal/Tidx.js +90 -12
  403. package/dist/internal/Tidx.js.map +1 -1
  404. package/dist/internal/Viem.d.ts +90 -65
  405. package/dist/internal/Viem.d.ts.map +1 -1
  406. package/dist/internal/Viem.js +90 -12
  407. package/dist/internal/Viem.js.map +1 -1
  408. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  409. package/dist/internal/WebhookDestination.js +34 -28
  410. package/dist/internal/WebhookDestination.js.map +1 -1
  411. package/dist/internal/Webhooks.d.ts +9 -0
  412. package/dist/internal/Webhooks.d.ts.map +1 -1
  413. package/dist/internal/Webhooks.js +15 -10
  414. package/dist/internal/Webhooks.js.map +1 -1
  415. package/dist/internal/exchange/Provider.d.ts +219 -0
  416. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  417. package/dist/internal/exchange/Provider.js +117 -0
  418. package/dist/internal/exchange/Provider.js.map +1 -0
  419. package/dist/internal/exchange/index.d.ts +2 -0
  420. package/dist/internal/exchange/index.d.ts.map +1 -0
  421. package/dist/internal/exchange/index.js +2 -0
  422. package/dist/internal/exchange/index.js.map +1 -0
  423. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  424. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  425. package/dist/internal/exchange/providers/uniswap.js +553 -0
  426. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  427. package/dist/internal/funding/Action.d.ts +55 -0
  428. package/dist/internal/funding/Action.d.ts.map +1 -0
  429. package/dist/internal/funding/Action.js +74 -0
  430. package/dist/internal/funding/Action.js.map +1 -0
  431. package/dist/internal/funding/Catalog.d.ts +107 -0
  432. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  433. package/dist/internal/funding/Catalog.js +270 -0
  434. package/dist/internal/funding/Catalog.js.map +1 -0
  435. package/dist/internal/funding/Chain.d.ts +76 -0
  436. package/dist/internal/funding/Chain.d.ts.map +1 -0
  437. package/dist/internal/funding/Chain.js +38 -0
  438. package/dist/internal/funding/Chain.js.map +1 -0
  439. package/dist/internal/funding/Deposit.d.ts +408 -0
  440. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  441. package/dist/internal/funding/Deposit.js +318 -0
  442. package/dist/internal/funding/Deposit.js.map +1 -0
  443. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  444. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  445. package/dist/internal/funding/DepositAddress.js +189 -0
  446. package/dist/internal/funding/DepositAddress.js.map +1 -0
  447. package/dist/internal/funding/Evidence.d.ts +48 -0
  448. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  449. package/dist/internal/funding/Evidence.js +315 -0
  450. package/dist/internal/funding/Evidence.js.map +1 -0
  451. package/dist/internal/funding/Provider.d.ts +1288 -0
  452. package/dist/internal/funding/Provider.d.ts.map +1 -0
  453. package/dist/internal/funding/Provider.js +1086 -0
  454. package/dist/internal/funding/Provider.js.map +1 -0
  455. package/dist/internal/funding/Reconciliation.d.ts +127 -0
  456. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  457. package/dist/internal/funding/Reconciliation.js +885 -0
  458. package/dist/internal/funding/Reconciliation.js.map +1 -0
  459. package/dist/internal/funding/Route.d.ts +21 -0
  460. package/dist/internal/funding/Route.d.ts.map +1 -0
  461. package/dist/internal/funding/Route.js +5 -0
  462. package/dist/internal/funding/Route.js.map +1 -0
  463. package/dist/internal/funding/SourceObservation.d.ts +108 -0
  464. package/dist/internal/funding/SourceObservation.d.ts.map +1 -0
  465. package/dist/internal/funding/SourceObservation.js +143 -0
  466. package/dist/internal/funding/SourceObservation.js.map +1 -0
  467. package/dist/internal/funding/Subsidy.d.ts +113 -0
  468. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  469. package/dist/internal/funding/Subsidy.js +138 -0
  470. package/dist/internal/funding/Subsidy.js.map +1 -0
  471. package/dist/internal/funding/Token.d.ts +41 -0
  472. package/dist/internal/funding/Token.d.ts.map +1 -0
  473. package/dist/internal/funding/Token.js +22 -0
  474. package/dist/internal/funding/Token.js.map +1 -0
  475. package/dist/internal/funding/Transfer.d.ts +643 -0
  476. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  477. package/dist/internal/funding/Transfer.js +332 -0
  478. package/dist/internal/funding/Transfer.js.map +1 -0
  479. package/dist/internal/funding/index.d.ts +14 -0
  480. package/dist/internal/funding/index.d.ts.map +1 -0
  481. package/dist/internal/funding/index.js +14 -0
  482. package/dist/internal/funding/index.js.map +1 -0
  483. package/dist/internal/funding/providers/across.d.ts +21 -0
  484. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  485. package/dist/internal/funding/providers/across.js +117 -0
  486. package/dist/internal/funding/providers/across.js.map +1 -0
  487. package/dist/internal/funding/providers/relay.d.ts +88 -0
  488. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  489. package/dist/internal/funding/providers/relay.js +871 -0
  490. package/dist/internal/funding/providers/relay.js.map +1 -0
  491. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  492. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  493. package/dist/internal/funding/providers/rhino.js +116 -0
  494. package/dist/internal/funding/providers/rhino.js.map +1 -0
  495. package/dist/internal/funding/providers/squid.d.ts +19 -0
  496. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  497. package/dist/internal/funding/providers/squid.js +120 -0
  498. package/dist/internal/funding/providers/squid.js.map +1 -0
  499. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  500. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  501. package/dist/internal/funding/providers/symbiosis.js +176 -0
  502. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  503. package/dist/internal/index.d.ts +5 -1
  504. package/dist/internal/index.d.ts.map +1 -1
  505. package/dist/internal/index.js +5 -1
  506. package/dist/internal/index.js.map +1 -1
  507. package/dist/internal/webhookDestinations/url.js +61 -57
  508. package/dist/internal/webhookDestinations/url.js.map +1 -1
  509. package/dist/providers/index.d.ts +43 -0
  510. package/dist/providers/index.d.ts.map +1 -0
  511. package/dist/providers/index.js +19 -0
  512. package/dist/providers/index.js.map +1 -0
  513. package/package.json +10 -5
  514. package/src/ApiKey.test.ts +35 -0
  515. package/src/ApiKey.ts +27 -0
  516. package/src/ApiKeys.test.ts +40 -7
  517. package/src/ApiKeys.ts +46 -10
  518. package/src/App.test.ts +108 -15
  519. package/src/App.ts +296 -138
  520. package/src/Assets.ts +29 -4
  521. package/src/Client.test-d.ts +809 -37
  522. package/src/Scope.test.ts +19 -0
  523. package/src/Scope.ts +28 -11
  524. package/src/Webhooks.test.ts +25 -0
  525. package/src/Webhooks.ts +1 -1
  526. package/src/admin/App.test.ts +9 -2
  527. package/src/admin/App.ts +32 -9
  528. package/src/admin/apps/api-keys.test.ts +190 -22
  529. package/src/admin/apps/api-keys.ts +170 -28
  530. package/src/admin/apps/earn-vaults.test.ts +338 -0
  531. package/src/admin/apps/earn-vaults.ts +572 -0
  532. package/src/admin/apps/scopes.test.ts +16 -1
  533. package/src/admin/ui/plugin.ts +2 -2
  534. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  535. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  536. package/src/admin/ui/src/components/Page.tsx +1 -1
  537. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  538. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  539. package/src/admin/ui/src/lib/client.ts +1 -1
  540. package/src/admin/ui/src/lib/config.ts +1 -1
  541. package/src/admin/ui/src/lib/early-access.ts +8 -9
  542. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  543. package/src/admin/ui/src/lib/format.ts +13 -0
  544. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  545. package/src/admin/ui/src/lib/organizations.ts +7 -1
  546. package/src/admin/ui/src/lib/response.ts +22 -0
  547. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  548. package/src/admin/ui/src/lib/scopes.ts +28 -7
  549. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  550. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  551. package/src/admin/ui/src/router.tsx +2 -2
  552. package/src/admin/ui/src/routes/__root.tsx +9 -8
  553. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  554. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  555. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  556. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  557. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  558. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  559. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  560. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  561. package/src/admin/ui/vite.config.ts +4 -1
  562. package/src/admin/ui.generated.ts +113 -43
  563. package/src/analytics/Analytics.test.ts +69 -10
  564. package/src/analytics/Analytics.ts +24 -1
  565. package/src/analytics/tables/requestEvents.ts +79 -37
  566. package/src/apps/Zones.test.ts +33 -0
  567. package/src/apps/Zones.ts +40 -0
  568. package/src/apps/composition.test.ts +184 -3
  569. package/src/apps/data/App.test.ts +28 -23
  570. package/src/apps/data/App.ts +95 -36
  571. package/src/apps/data/FxOracle.ts +1 -1
  572. package/src/apps/data/index.ts +0 -1
  573. package/src/apps/data/routes/activities.test.ts +82 -6
  574. package/src/apps/data/routes/activities.ts +131 -71
  575. package/src/apps/data/routes/balances.test.ts +50 -37
  576. package/src/apps/data/routes/balances.ts +5 -5
  577. package/src/apps/data/routes/blocks.test.ts +2 -0
  578. package/src/apps/data/routes/coingecko.test.ts +22 -0
  579. package/src/apps/data/routes/coingecko.ts +84 -48
  580. package/src/apps/data/routes/earn.test.ts +1391 -0
  581. package/src/apps/data/routes/earn.ts +2188 -0
  582. package/src/apps/data/routes/exchanges.test.ts +82 -33
  583. package/src/apps/data/routes/exchanges.ts +842 -227
  584. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  585. package/src/apps/data/routes/fee-amm.ts +69 -12
  586. package/src/apps/data/routes/indexer.test.ts +43 -34
  587. package/src/apps/data/routes/indexer.ts +21 -3
  588. package/src/apps/data/routes/receipts.test.ts +5 -3
  589. package/src/apps/data/routes/receipts.ts +13 -11
  590. package/src/apps/data/routes/rpc.test.ts +446 -28
  591. package/src/apps/data/routes/rpc.ts +245 -25
  592. package/src/apps/data/routes/tokenlist.ts +72 -19
  593. package/src/apps/data/routes/tokens.test.ts +6 -8
  594. package/src/apps/data/routes/tokens.ts +258 -86
  595. package/src/apps/data/routes/transactions.test.ts +2 -0
  596. package/src/apps/data/routes/transactions.ts +77 -42
  597. package/src/apps/data/routes/transfers.test.ts +166 -4
  598. package/src/apps/data/routes/transfers.ts +216 -78
  599. package/src/apps/data/routes/valuation.test.ts +62 -9
  600. package/src/apps/data/routes/valuation.ts +2 -2
  601. package/src/apps/data/routes/webhooks.test.ts +386 -43
  602. package/src/apps/data/routes/webhooks.ts +172 -71
  603. package/src/apps/data/routes/zones.test.ts +473 -0
  604. package/src/apps/data/routes/zones.ts +338 -0
  605. package/src/apps/docs/reference.ts +8 -6
  606. package/src/apps/funding/Access.ts +26 -0
  607. package/src/apps/funding/App.test.ts +78 -0
  608. package/src/apps/funding/App.ts +63 -0
  609. package/src/apps/funding/Inventory.ts +30 -0
  610. package/src/apps/funding/ProviderAttempts.ts +26 -0
  611. package/src/apps/funding/index.ts +1 -0
  612. package/src/apps/funding/routes/chains.test.ts +78 -0
  613. package/src/apps/funding/routes/chains.ts +101 -0
  614. package/src/apps/funding/routes/deposit-addresses.test.ts +1628 -0
  615. package/src/apps/funding/routes/deposit-addresses.ts +1015 -0
  616. package/src/apps/funding/routes/providers.test.ts +165 -0
  617. package/src/apps/funding/routes/providers.ts +73 -0
  618. package/src/apps/funding/routes/quotes.test.ts +511 -0
  619. package/src/apps/funding/routes/quotes.ts +205 -0
  620. package/src/apps/funding/routes/transfers.test.ts +1255 -0
  621. package/src/apps/funding/routes/transfers.ts +704 -0
  622. package/src/apps/index.ts +3 -1
  623. package/src/apps/management/Billing.test.ts +29 -0
  624. package/src/apps/management/Billing.ts +23 -0
  625. package/src/apps/management/Error.ts +12 -0
  626. package/src/apps/management/routes/api-keys.test.ts +103 -3
  627. package/src/apps/management/routes/api-keys.ts +98 -10
  628. package/src/apps/management/routes/invitations.ts +4 -11
  629. package/src/apps/management/routes/orgs.ts +2 -9
  630. package/src/apps/management/routes/scopes.test.ts +7 -2
  631. package/src/apps/management/routes/scopes.ts +2 -2
  632. package/src/apps/management/routes/webhooks.test.ts +6 -1
  633. package/src/apps/management/routes/webhooks.ts +15 -3
  634. package/src/apps/mcp.test.ts +17 -2
  635. package/src/apps/mcp.ts +18 -13
  636. package/src/apps/metadata.ts +12 -0
  637. package/src/apps/mpp/App.ts +276 -29
  638. package/src/apps/mpp/Mpp.test.ts +631 -26
  639. package/src/apps/mpp/Mpp.ts +0 -42
  640. package/src/apps/mpp/internal/Adapter.ts +108 -3
  641. package/src/apps/mpp/internal/Error.test.ts +33 -0
  642. package/src/apps/mpp/internal/Error.ts +44 -6
  643. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  644. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  645. package/src/apps/mpp/internal/Policy.test.ts +128 -0
  646. package/src/apps/mpp/internal/Policy.ts +98 -0
  647. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  648. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  649. package/src/apps/mpp/internal/Screening.ts +40 -3
  650. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  651. package/src/apps/mpp/internal/Utils.ts +30 -0
  652. package/src/apps/relay/App.test.ts +493 -62
  653. package/src/apps/relay/App.ts +233 -23
  654. package/src/apps/relay/Sponsorships.test.ts +49 -0
  655. package/src/apps/relay/Sponsorships.ts +18 -6
  656. package/src/cloudflare.ts +279 -0
  657. package/src/db/Db.ts +501 -0
  658. package/src/db/Schema.ts +349 -2
  659. package/src/db/tables/earnVaults.test.ts +185 -0
  660. package/src/db/tables/earnVaults.ts +151 -0
  661. package/src/db/tables/fundingCatalog.test.ts +108 -0
  662. package/src/db/tables/fundingCatalog.ts +157 -0
  663. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  664. package/src/db/tables/fundingDepositAddresses.ts +404 -0
  665. package/src/db/tables/fundingDepositRequestObservations.test.ts +106 -0
  666. package/src/db/tables/fundingDepositRequestObservations.ts +99 -0
  667. package/src/db/tables/fundingDeposits.test.ts +399 -0
  668. package/src/db/tables/fundingDeposits.ts +373 -0
  669. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  670. package/src/db/tables/fundingIdempotency.ts +180 -0
  671. package/src/db/tables/fundingTransferEvents.ts +28 -0
  672. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  673. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  674. package/src/db/tables/fundingTransfers.test.ts +89 -0
  675. package/src/db/tables/fundingTransfers.ts +153 -0
  676. package/src/db/tables/organizations.ts +16 -0
  677. package/src/db/tables/projects.ts +16 -0
  678. package/src/db/tables/requestUsage.ts +23 -0
  679. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  680. package/src/db/tables/sponsoredTransactions.ts +3 -3
  681. package/src/db/tables/users.ts +16 -0
  682. package/src/db/tables/verifiedTokens.ts +19 -14
  683. package/src/db/tables/webhookSubscriptions.ts +58 -3
  684. package/src/handlers/relay.test.ts +2 -0
  685. package/src/handlers/relay.ts +95 -99
  686. package/src/internal/Auth.test.ts +225 -5
  687. package/src/internal/Auth.ts +109 -20
  688. package/src/internal/Cache.test.ts +37 -3
  689. package/src/internal/Cache.ts +14 -10
  690. package/src/internal/Cursor.test.ts +2 -2
  691. package/src/internal/Cursor.ts +1 -1
  692. package/src/internal/EarnRates.test.ts +125 -0
  693. package/src/internal/EarnRates.ts +409 -0
  694. package/src/internal/EarnVaults.test.ts +195 -0
  695. package/src/internal/EarnVaults.ts +876 -0
  696. package/src/internal/EdgeCache.test.ts +26 -7
  697. package/src/internal/EdgeCache.ts +48 -9
  698. package/src/internal/Id.ts +14 -0
  699. package/src/internal/Idempotency.test.ts +109 -0
  700. package/src/internal/Idempotency.ts +237 -0
  701. package/src/internal/IpAllowlist.test.ts +52 -0
  702. package/src/internal/IpAllowlist.ts +39 -0
  703. package/src/internal/Log.test-d.ts +41 -8
  704. package/src/internal/Log.test.ts +196 -9
  705. package/src/internal/Log.ts +124 -17
  706. package/src/internal/MetricSink.test.ts +244 -4
  707. package/src/internal/MetricSink.ts +51 -1
  708. package/src/internal/OpenApi.ts +4 -1
  709. package/src/internal/Provider.test.ts +17 -0
  710. package/src/internal/Provider.ts +17 -0
  711. package/src/internal/Schema.ts +27 -17
  712. package/src/internal/Store.test.ts +25 -0
  713. package/src/internal/Store.ts +46 -0
  714. package/src/internal/Tidx.local.test.ts +78 -3
  715. package/src/internal/Tidx.test.ts +240 -18
  716. package/src/internal/Tidx.ts +129 -33
  717. package/src/internal/VerifiedTokens.test.ts +15 -0
  718. package/src/internal/Viem.test.ts +198 -17
  719. package/src/internal/Viem.ts +127 -28
  720. package/src/internal/WebhookDestination.ts +25 -23
  721. package/src/internal/Webhooks.test.ts +59 -0
  722. package/src/internal/Webhooks.ts +34 -10
  723. package/src/internal/exchange/Provider.test.ts +216 -0
  724. package/src/internal/exchange/Provider.ts +326 -0
  725. package/src/internal/exchange/index.test.ts +6 -0
  726. package/src/internal/exchange/index.ts +1 -0
  727. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  728. package/src/internal/exchange/providers/uniswap.ts +682 -0
  729. package/src/internal/funding/Action.test.ts +138 -0
  730. package/src/internal/funding/Action.ts +117 -0
  731. package/src/internal/funding/Catalog.test.ts +311 -0
  732. package/src/internal/funding/Catalog.ts +347 -0
  733. package/src/internal/funding/Chain.test.ts +79 -0
  734. package/src/internal/funding/Chain.ts +120 -0
  735. package/src/internal/funding/Deposit.test.ts +26 -0
  736. package/src/internal/funding/Deposit.ts +522 -0
  737. package/src/internal/funding/DepositAddress.test.ts +18 -0
  738. package/src/internal/funding/DepositAddress.ts +312 -0
  739. package/src/internal/funding/Evidence.test.ts +297 -0
  740. package/src/internal/funding/Evidence.ts +425 -0
  741. package/src/internal/funding/Provider.test.ts +1328 -0
  742. package/src/internal/funding/Provider.ts +1911 -0
  743. package/src/internal/funding/Reconciliation.local.test.ts +511 -0
  744. package/src/internal/funding/Reconciliation.test.ts +3037 -0
  745. package/src/internal/funding/Reconciliation.ts +1202 -0
  746. package/src/internal/funding/Route.test.ts +66 -0
  747. package/src/internal/funding/Route.ts +29 -0
  748. package/src/internal/funding/SourceObservation.test.ts +301 -0
  749. package/src/internal/funding/SourceObservation.ts +267 -0
  750. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  751. package/src/internal/funding/Subsidy.test.ts +75 -0
  752. package/src/internal/funding/Subsidy.ts +260 -0
  753. package/src/internal/funding/Token.test.ts +47 -0
  754. package/src/internal/funding/Token.ts +59 -0
  755. package/src/internal/funding/Transfer.test.ts +369 -0
  756. package/src/internal/funding/Transfer.ts +522 -0
  757. package/src/internal/funding/index.test.ts +21 -0
  758. package/src/internal/funding/index.ts +13 -0
  759. package/src/internal/funding/providers/across.ts +149 -0
  760. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  761. package/src/internal/funding/providers/relay.test.ts +564 -0
  762. package/src/internal/funding/providers/relay.ts +1060 -0
  763. package/src/internal/funding/providers/rhino.ts +139 -0
  764. package/src/internal/funding/providers/squid.ts +151 -0
  765. package/src/internal/funding/providers/symbiosis.ts +221 -0
  766. package/src/internal/index.test.ts +5 -1
  767. package/src/internal/index.ts +5 -1
  768. package/src/internal/webhookDestinations/url.ts +49 -45
  769. package/src/providers/index.test.ts +14 -0
  770. package/src/providers/index.ts +54 -0
  771. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  772. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  773. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  774. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  775. package/dist/apps/data/routes/funding.d.ts.map +0 -1
  776. package/dist/apps/data/routes/funding.js +0 -410
  777. package/dist/apps/data/routes/funding.js.map +0 -1
  778. package/dist/internal/FundingQuotes.d.ts +0 -864
  779. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  780. package/dist/internal/FundingQuotes.js +0 -672
  781. package/dist/internal/FundingQuotes.js.map +0 -1
  782. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  783. package/src/apps/data/routes/funding.test.ts +0 -503
  784. package/src/apps/data/routes/funding.ts +0 -604
  785. package/src/internal/FundingQuotes.test.ts +0 -456
  786. package/src/internal/FundingQuotes.ts +0 -944
@@ -1,7 +1,12 @@
1
1
  import { Hono } from 'hono'
2
2
  import * as z from 'zod/mini'
3
3
 
4
+ import * as core_ApiKey from '../../ApiKey.js'
4
5
  import * as ApiKeys from '../../ApiKeys.js'
6
+ import * as Db from '../../db/Db.js'
7
+ import * as Organizations from '../../db/tables/organizations.js'
8
+ import * as Projects from '../../db/tables/projects.js'
9
+ import * as Users from '../../db/tables/users.js'
5
10
  import * as OpenApi from '../../internal/OpenApi.js'
6
11
  import * as Response from '../../internal/Response.js'
7
12
  import * as Schema from '../../internal/Schema.js'
@@ -10,14 +15,51 @@ import type * as App from '../App.js'
10
15
 
11
16
  /** Zod schemas owned by the admin API-keys handler. */
12
17
  export namespace schema {
18
+ const Name = z
19
+ .pipe(
20
+ z.string(),
21
+ z.transform((value) => value.trim()),
22
+ )
23
+ .check(
24
+ z.minLength(1),
25
+ z.maxLength(100),
26
+ z.describe('Human-readable purpose of the key.'),
27
+ z.meta({ examples: ['Explorer testnet'] }),
28
+ )
29
+
30
+ const ApiKey = Schema.describe(
31
+ z.extend(ApiKeys.schema.Record, {
32
+ createdByLabel: z
33
+ .nullable(z.string())
34
+ .check(
35
+ z.describe('Resolved creator identity, or null when unavailable.'),
36
+ z.meta({ examples: ['alex@tempo.xyz'] }),
37
+ ),
38
+ organizationName: z
39
+ .nullable(z.string())
40
+ .check(
41
+ z.describe('Resolved organization name, or null when unattributed or unavailable.'),
42
+ z.meta({ examples: ['Tempo'] }),
43
+ ),
44
+ projectName: z
45
+ .nullable(z.string())
46
+ .check(
47
+ z.describe('Resolved project name, or null when unattributed or unavailable.'),
48
+ z.meta({ examples: ['Explorer'] }),
49
+ ),
50
+ }),
51
+ 'An API key with resolved operational attribution.',
52
+ )
53
+
13
54
  /** Schemas for the createApiKey operation. */
14
55
  export namespace createApiKey {
15
56
  /**
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).
57
+ * Request body for minting a named key. The server sets `createdBy` from
58
+ * the verified identity so it cannot be spoofed.
18
59
  */
19
60
  export const Body = Schema.describe(
20
- z.extend(z.omit(ApiKeys.schema.MintInput, { createdBy: true }), {
61
+ z.extend(z.omit(ApiKeys.schema.MintInput, { createdBy: true, name: true }), {
62
+ name: Name,
21
63
  scopes: z
22
64
  .readonly(
23
65
  z.array(
@@ -58,30 +100,36 @@ export namespace schema {
58
100
  export const Response = Schema.describe(
59
101
  z.object({
60
102
  data: z
61
- .array(ApiKeys.schema.Record)
103
+ .array(ApiKey)
62
104
  .check(z.describe('API-key records, newest first (metadata only — never tokens).')),
63
105
  }),
64
106
  'A list of API-key records.',
65
107
  )
66
108
  }
67
109
 
68
- /** Schemas for the attributeApiKey operation. */
69
- export namespace attributeApiKey {
70
- /** Request body re-attributing a key; omitted fields keep their value. */
110
+ /** Schemas for the updateApiKey operation. */
111
+ export namespace updateApiKey {
112
+ /** Request body updating a key; omitted fields keep their value. */
71
113
  export const Body = Schema.describe(
72
114
  z.object({
73
- orgId: z.optional(z.string()).check(z.describe('New owning organization id (`org_…`).')),
115
+ allowedIps: z
116
+ .optional(core_ApiKey.schema.AllowedIps)
117
+ .check(z.describe('Replacement client IP/CIDR allowlist. An empty list clears it.')),
118
+ name: z.optional(Name).check(z.describe('New human-readable key name.')),
119
+ orgId: z
120
+ .optional(z.string())
121
+ .check(z.describe('Owning organization id to assign to an unattributed key (`org_…`).')),
74
122
  projectId: z.optional(z.string()).check(z.describe('New attributed project id (`prj_…`).')),
75
123
  }),
76
- 'Attribution to apply to an API key.',
124
+ 'Metadata to apply to an API key.',
77
125
  )
78
126
 
79
- /** Path parameters for attributing a key. */
127
+ /** Path parameters for updating a key. */
80
128
  export const Params = z
81
129
  .object({
82
- id: z.string().check(z.describe('Stable id of the key to attribute.')),
130
+ id: z.string().check(z.describe('Stable id of the key to update.')),
83
131
  })
84
- .check(z.describe('Path parameters for attributing an API key.'))
132
+ .check(z.describe('Path parameters for updating an API key.'))
85
133
  }
86
134
 
87
135
  /** Schemas for the backfillApiKeys operation. */
@@ -119,7 +167,7 @@ export namespace schema {
119
167
  * returning the one-time token.
120
168
  * - `GET /` lists key records (metadata only), optionally filtered by `orgId`.
121
169
  * - `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).
170
+ * - `PATCH /:id` updates a key's allowlist, name, or project, or assigns its first organization.
123
171
  * - `POST /backfill` rebuilds the id and org index entries for every record.
124
172
  */
125
173
  export function apiKeys() {
@@ -152,6 +200,7 @@ export function apiKeys() {
152
200
  OpenApi.describeRoute({
153
201
  operationId: 'createApiKey',
154
202
  responses: OpenApi.responses({
203
+ errors: { 404: 'Organization or project not found.' },
155
204
  success: {
156
205
  description: 'Minted key (includes the one-time token).',
157
206
  schema: schema.createApiKey.Response,
@@ -161,13 +210,44 @@ export function apiKeys() {
161
210
  tags: ['API keys'],
162
211
  }),
163
212
  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 }))
213
+ const input = c.req.valid('json')
214
+ const db = Db.get(c.get('db'))
215
+ try {
216
+ const [organization, project] = await Promise.all([
217
+ input.orgId === undefined ? undefined : Organizations.get(db, input.orgId),
218
+ input.projectId === undefined ? undefined : Projects.get(db, input.projectId),
219
+ ])
220
+ if (input.orgId !== undefined && !organization)
221
+ return Response.error(c, {
222
+ code: 'not_found',
223
+ message: 'Organization not found.',
224
+ status: 404,
225
+ })
226
+ if (input.projectId !== undefined && !project)
227
+ return Response.error(c, {
228
+ code: 'not_found',
229
+ message: 'Project not found.',
230
+ status: 404,
231
+ })
232
+ if (project && input.orgId !== undefined && project.orgId !== input.orgId)
233
+ return Response.error(c, {
234
+ code: 'not_found',
235
+ message: 'Project not found in this organization.',
236
+ status: 404,
237
+ })
238
+ const orgId = input.orgId ?? project?.orgId
239
+
240
+ // `createdBy` is the verified admin email, never client-supplied.
241
+ // `requireAuth` guarantees identity on this gated route.
242
+ const { record, token } = await ApiKeys.mint(c.get('kv').store, {
243
+ ...input,
244
+ createdBy: c.get('identity')!.email,
245
+ ...(orgId === undefined ? {} : { orgId }),
246
+ })
247
+ return c.json(Response.validated(schema.createApiKey.Response, { ...record, token }))
248
+ } catch (cause) {
249
+ return Response.upstream(c, cause)
250
+ }
171
251
  },
172
252
  )
173
253
  .get(
@@ -186,9 +266,10 @@ export function apiKeys() {
186
266
  }),
187
267
  async (c) => {
188
268
  const { orgId } = c.req.valid('query')
189
- const data = orgId
269
+ const records = orgId
190
270
  ? await ApiKeys.listByOrg(c.get('kv').store, orgId)
191
271
  : await ApiKeys.list(c.get('kv').store)
272
+ const data = await enrichKeys(Db.get(c.get('db')), records)
192
273
  return c.json(Response.validated(schema.listApiKeys.Response, { data }))
193
274
  },
194
275
  )
@@ -221,27 +302,57 @@ export function apiKeys() {
221
302
  )
222
303
  .patch(
223
304
  '/:id',
224
- OpenApi.validate('param', schema.attributeApiKey.Params, {
305
+ OpenApi.validate('param', schema.updateApiKey.Params, {
225
306
  code: 'param_invalid',
226
307
  message: 'Invalid path parameters',
227
308
  }),
228
- OpenApi.validate('json', schema.attributeApiKey.Body, {
309
+ OpenApi.validate('json', schema.updateApiKey.Body, {
229
310
  code: 'body_invalid',
230
311
  message: 'Invalid request body',
231
312
  }),
232
313
  OpenApi.describeRoute({
233
- description: 'Re-attribute a key to an organization and/or project. The token is unchanged.', // prettier-ignore
234
- operationId: 'attributeApiKey',
314
+ description: 'Update a key allowlist, name, or project, or assign its first organization. The token is unchanged.', // prettier-ignore
315
+ operationId: 'updateApiKey',
235
316
  responses: OpenApi.responses({
236
- errors: { 404: 'API key not found.' },
317
+ errors: {
318
+ 404: 'API key or organization not found.',
319
+ 409: 'API key already belongs to another organization.',
320
+ },
237
321
  success: { description: 'The updated key record.', schema: ApiKeys.schema.Record },
238
322
  }),
239
- summary: 'Attribute API key',
323
+ summary: 'Update API key',
240
324
  tags: ['API keys'],
241
325
  }),
242
326
  async (c) => {
243
327
  const { id } = c.req.valid('param')
244
- const updated = await ApiKeys.attribute(c.get('kv').store, id, c.req.valid('json'))
328
+ const input = c.req.valid('json')
329
+ const store = c.get('kv').store
330
+ const record = await ApiKeys.get(store, id)
331
+ if (!record)
332
+ return Response.error(c, {
333
+ code: 'not_found',
334
+ message: 'API key not found.',
335
+ status: 404,
336
+ })
337
+
338
+ // One-off keys use their key id as `orgId`.
339
+ if (input.orgId !== undefined && record.orgId !== record.id && input.orgId !== record.orgId)
340
+ return Response.error(c, {
341
+ code: 'organization_already_assigned',
342
+ message: 'API key already belongs to an organization.',
343
+ status: 409,
344
+ })
345
+ if (
346
+ input.orgId !== undefined &&
347
+ !(await Organizations.get(Db.get(c.get('db')), input.orgId))
348
+ )
349
+ return Response.error(c, {
350
+ code: 'not_found',
351
+ message: 'Organization not found.',
352
+ status: 404,
353
+ })
354
+
355
+ const updated = await ApiKeys.update(store, id, input)
245
356
  if (!updated)
246
357
  return Response.error(c, {
247
358
  code: 'not_found',
@@ -252,3 +363,34 @@ export function apiKeys() {
252
363
  },
253
364
  )
254
365
  }
366
+
367
+ /** Resolves display labels without changing the authoritative key record. */
368
+ async function enrichKeys(db: Db.Db, records: readonly ApiKeys.Record[]) {
369
+ const organizationIds = [
370
+ ...new Set(records.map(({ orgId }) => orgId).filter((id) => id.startsWith('org_'))),
371
+ ]
372
+ const projectIds = [
373
+ ...new Set(records.flatMap(({ projectId }) => (projectId ? [projectId] : []))),
374
+ ]
375
+ const userIds = [
376
+ ...new Set(
377
+ records.flatMap(({ createdBy }) => (createdBy?.startsWith('usr_') ? [createdBy] : [])),
378
+ ),
379
+ ]
380
+ const [organizations, projects, users] = await Promise.all([
381
+ Organizations.listByIds(db, organizationIds),
382
+ Projects.listByIds(db, projectIds),
383
+ Users.listByIds(db, userIds),
384
+ ])
385
+ const organizationNames = new Map(organizations.map(({ id, name }) => [id, name]))
386
+ const projectNames = new Map(projects.map(({ id, name }) => [id, name]))
387
+ const userLabels = new Map(users.map(({ address, email, id }) => [id, email ?? address ?? id]))
388
+ return records.map((record) => ({
389
+ ...record,
390
+ createdByLabel: record.createdBy
391
+ ? (userLabels.get(record.createdBy) ?? record.createdBy)
392
+ : null,
393
+ organizationName: organizationNames.get(record.orgId) ?? null,
394
+ projectName: record.projectId ? (projectNames.get(record.projectId) ?? null) : null,
395
+ }))
396
+ }
@@ -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
+ })