tapimo 0.7.0 → 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 (689) 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 +151 -95
  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 +14377 -10165
  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 +1231 -324
  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.map +1 -1
  78. package/dist/apps/data/routes/fee-amm.js +59 -8
  79. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  80. package/dist/apps/data/routes/funding.d.ts +4092 -387
  81. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  82. package/dist/apps/data/routes/funding.js +1403 -256
  83. package/dist/apps/data/routes/funding.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +5 -5
  85. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  86. package/dist/apps/data/routes/indexer.js +19 -2
  87. package/dist/apps/data/routes/indexer.js.map +1 -1
  88. package/dist/apps/data/routes/receipts.d.ts +265 -265
  89. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  90. package/dist/apps/data/routes/receipts.js +11 -11
  91. package/dist/apps/data/routes/receipts.js.map +1 -1
  92. package/dist/apps/data/routes/rpc.d.ts +5 -5
  93. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  94. package/dist/apps/data/routes/rpc.js +211 -22
  95. package/dist/apps/data/routes/rpc.js.map +1 -1
  96. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  97. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  98. package/dist/apps/data/routes/tokenlist.js +49 -9
  99. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  100. package/dist/apps/data/routes/tokens.d.ts +116 -88
  101. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/tokens.js +198 -91
  103. package/dist/apps/data/routes/tokens.js.map +1 -1
  104. package/dist/apps/data/routes/transactions.d.ts +55 -55
  105. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  106. package/dist/apps/data/routes/transactions.js +78 -39
  107. package/dist/apps/data/routes/transactions.js.map +1 -1
  108. package/dist/apps/data/routes/transfers.d.ts +78 -29
  109. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  110. package/dist/apps/data/routes/transfers.js +165 -67
  111. package/dist/apps/data/routes/transfers.js.map +1 -1
  112. package/dist/apps/data/routes/valuation.d.ts +10 -10
  113. package/dist/apps/data/routes/valuation.js +2 -2
  114. package/dist/apps/data/routes/valuation.js.map +1 -1
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  116. package/dist/apps/data/routes/verified-tokens.js +34 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  118. package/dist/apps/data/routes/webhooks.d.ts +5 -3
  119. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  120. package/dist/apps/data/routes/webhooks.js +175 -65
  121. package/dist/apps/data/routes/webhooks.js.map +1 -1
  122. package/dist/apps/data/routes/zones.d.ts +281 -0
  123. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  124. package/dist/apps/data/routes/zones.js +252 -0
  125. package/dist/apps/data/routes/zones.js.map +1 -0
  126. package/dist/apps/docs/reference.js +6 -5
  127. package/dist/apps/docs/reference.js.map +1 -1
  128. package/dist/apps/index.d.ts +2 -1
  129. package/dist/apps/index.d.ts.map +1 -1
  130. package/dist/apps/index.js +2 -1
  131. package/dist/apps/index.js.map +1 -1
  132. package/dist/apps/management/App.d.ts +670 -670
  133. package/dist/apps/management/Billing.d.ts +8 -0
  134. package/dist/apps/management/Billing.d.ts.map +1 -1
  135. package/dist/apps/management/Billing.js +12 -0
  136. package/dist/apps/management/Billing.js.map +1 -1
  137. package/dist/apps/management/Error.d.ts +12 -0
  138. package/dist/apps/management/Error.d.ts.map +1 -0
  139. package/dist/apps/management/Error.js +10 -0
  140. package/dist/apps/management/Error.js.map +1 -0
  141. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  142. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  143. package/dist/apps/management/routes/api-keys.js +2 -8
  144. package/dist/apps/management/routes/api-keys.js.map +1 -1
  145. package/dist/apps/management/routes/billing.d.ts +119 -119
  146. package/dist/apps/management/routes/faucet.d.ts +35 -35
  147. package/dist/apps/management/routes/invitations.d.ts +62 -62
  148. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  149. package/dist/apps/management/routes/invitations.js +4 -10
  150. package/dist/apps/management/routes/invitations.js.map +1 -1
  151. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  152. package/dist/apps/management/routes/me.d.ts +6 -6
  153. package/dist/apps/management/routes/members.d.ts +78 -78
  154. package/dist/apps/management/routes/orgs.d.ts +48 -48
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +2 -8
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +9 -9
  159. package/dist/apps/management/routes/scopes.js +2 -2
  160. package/dist/apps/management/routes/scopes.js.map +1 -1
  161. package/dist/apps/management/routes/usage.d.ts +80 -80
  162. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  163. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  164. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  165. package/dist/apps/management/routes/webhooks.js +15 -3
  166. package/dist/apps/management/routes/webhooks.js.map +1 -1
  167. package/dist/apps/mpp/App.d.ts +55 -56
  168. package/dist/apps/mpp/App.d.ts.map +1 -1
  169. package/dist/apps/mpp/App.js +192 -27
  170. package/dist/apps/mpp/App.js.map +1 -1
  171. package/dist/apps/mpp/Mpp.d.ts +0 -20
  172. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  173. package/dist/apps/mpp/Mpp.js +0 -24
  174. package/dist/apps/mpp/Mpp.js.map +1 -1
  175. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  176. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  177. package/dist/apps/mpp/internal/Adapter.js +66 -0
  178. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  179. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  180. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  181. package/dist/apps/mpp/internal/Error.js +41 -0
  182. package/dist/apps/mpp/internal/Error.js.map +1 -0
  183. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  184. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  185. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  186. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  187. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  188. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  189. package/dist/apps/mpp/internal/Policy.js +57 -0
  190. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  191. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  192. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  193. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  194. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  195. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  196. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  197. package/dist/apps/mpp/internal/Screening.js +20 -0
  198. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  200. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  201. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  202. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  203. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  204. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  205. package/dist/apps/mpp/internal/Utils.js +24 -0
  206. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  207. package/dist/apps/relay/App.js +184 -24
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +16 -7
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/db/Db.d.ts +20 -0
  214. package/dist/db/Db.d.ts.map +1 -1
  215. package/dist/db/Db.js +342 -0
  216. package/dist/db/Db.js.map +1 -1
  217. package/dist/db/Schema.d.ts +921 -1
  218. package/dist/db/Schema.d.ts.map +1 -1
  219. package/dist/db/Schema.js +269 -1
  220. package/dist/db/Schema.js.map +1 -1
  221. package/dist/db/tables/earnVaults.d.ts +68 -0
  222. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  223. package/dist/db/tables/earnVaults.js +72 -0
  224. package/dist/db/tables/earnVaults.js.map +1 -0
  225. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  226. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  227. package/dist/db/tables/fundingCatalog.js +85 -0
  228. package/dist/db/tables/fundingCatalog.js.map +1 -0
  229. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  230. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  231. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  232. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  233. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  234. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  235. package/dist/db/tables/fundingDeposits.js +100 -0
  236. package/dist/db/tables/fundingDeposits.js.map +1 -0
  237. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  238. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  239. package/dist/db/tables/fundingIdempotency.js +103 -0
  240. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  241. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  242. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  243. package/dist/db/tables/fundingTransferEvents.js +18 -0
  244. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  245. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  246. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  247. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  248. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  249. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  250. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  251. package/dist/db/tables/fundingTransfers.js +89 -0
  252. package/dist/db/tables/fundingTransfers.js.map +1 -0
  253. package/dist/db/tables/organizations.d.ts +8 -0
  254. package/dist/db/tables/organizations.d.ts.map +1 -1
  255. package/dist/db/tables/organizations.js +35 -0
  256. package/dist/db/tables/organizations.js.map +1 -1
  257. package/dist/db/tables/projects.d.ts +8 -0
  258. package/dist/db/tables/projects.d.ts.map +1 -1
  259. package/dist/db/tables/projects.js +16 -0
  260. package/dist/db/tables/projects.js.map +1 -1
  261. package/dist/db/tables/requestUsage.d.ts +13 -0
  262. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  263. package/dist/db/tables/requestUsage.js +16 -0
  264. package/dist/db/tables/requestUsage.js.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
  266. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  267. package/dist/db/tables/sponsoredTransactions.js +14 -4
  268. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  269. package/dist/db/tables/users.d.ts +8 -0
  270. package/dist/db/tables/users.d.ts.map +1 -1
  271. package/dist/db/tables/users.js +16 -0
  272. package/dist/db/tables/users.js.map +1 -1
  273. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  274. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  275. package/dist/db/tables/verifiedTokens.js +9 -7
  276. package/dist/db/tables/verifiedTokens.js.map +1 -1
  277. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  278. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  279. package/dist/db/tables/webhookSubscriptions.js +24 -3
  280. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  281. package/dist/handlers/relay.js +108 -108
  282. package/dist/handlers/relay.js.map +1 -1
  283. package/dist/internal/Auth.d.ts +26 -0
  284. package/dist/internal/Auth.d.ts.map +1 -1
  285. package/dist/internal/Auth.js +35 -2
  286. package/dist/internal/Auth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts.map +1 -1
  288. package/dist/internal/Cache.js +16 -10
  289. package/dist/internal/Cache.js.map +1 -1
  290. package/dist/internal/Cursor.js +1 -1
  291. package/dist/internal/Cursor.js.map +1 -1
  292. package/dist/internal/EarnRates.d.ts +89 -0
  293. package/dist/internal/EarnRates.d.ts.map +1 -0
  294. package/dist/internal/EarnRates.js +266 -0
  295. package/dist/internal/EarnRates.js.map +1 -0
  296. package/dist/internal/EarnVaults.d.ts +171 -0
  297. package/dist/internal/EarnVaults.d.ts.map +1 -0
  298. package/dist/internal/EarnVaults.js +547 -0
  299. package/dist/internal/EarnVaults.js.map +1 -0
  300. package/dist/internal/EdgeCache.d.ts +9 -2
  301. package/dist/internal/EdgeCache.d.ts.map +1 -1
  302. package/dist/internal/EdgeCache.js +36 -9
  303. package/dist/internal/EdgeCache.js.map +1 -1
  304. package/dist/internal/Id.d.ts +11 -0
  305. package/dist/internal/Id.d.ts.map +1 -1
  306. package/dist/internal/Id.js +13 -0
  307. package/dist/internal/Id.js.map +1 -1
  308. package/dist/internal/Idempotency.d.ts +83 -0
  309. package/dist/internal/Idempotency.d.ts.map +1 -0
  310. package/dist/internal/Idempotency.js +113 -0
  311. package/dist/internal/Idempotency.js.map +1 -0
  312. package/dist/internal/Log.d.ts +64 -9
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +29 -7
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/MetricSink.d.ts.map +1 -1
  317. package/dist/internal/MetricSink.js +47 -1
  318. package/dist/internal/MetricSink.js.map +1 -1
  319. package/dist/internal/OpenApi.d.ts +1 -1
  320. package/dist/internal/OpenApi.d.ts.map +1 -1
  321. package/dist/internal/OpenApi.js +3 -0
  322. package/dist/internal/OpenApi.js.map +1 -1
  323. package/dist/internal/Provider.d.ts +14 -0
  324. package/dist/internal/Provider.d.ts.map +1 -0
  325. package/dist/internal/Provider.js +5 -0
  326. package/dist/internal/Provider.js.map +1 -0
  327. package/dist/internal/Schema.d.ts +8 -3
  328. package/dist/internal/Schema.d.ts.map +1 -1
  329. package/dist/internal/Schema.js +24 -13
  330. package/dist/internal/Schema.js.map +1 -1
  331. package/dist/internal/Store.d.ts +6 -0
  332. package/dist/internal/Store.d.ts.map +1 -1
  333. package/dist/internal/Store.js +35 -0
  334. package/dist/internal/Store.js.map +1 -1
  335. package/dist/internal/Tidx.d.ts +43 -24
  336. package/dist/internal/Tidx.d.ts.map +1 -1
  337. package/dist/internal/Tidx.js +79 -11
  338. package/dist/internal/Tidx.js.map +1 -1
  339. package/dist/internal/Viem.d.ts +82 -65
  340. package/dist/internal/Viem.d.ts.map +1 -1
  341. package/dist/internal/Viem.js +83 -12
  342. package/dist/internal/Viem.js.map +1 -1
  343. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  344. package/dist/internal/WebhookDestination.js +34 -28
  345. package/dist/internal/WebhookDestination.js.map +1 -1
  346. package/dist/internal/Webhooks.d.ts +9 -0
  347. package/dist/internal/Webhooks.d.ts.map +1 -1
  348. package/dist/internal/Webhooks.js +15 -10
  349. package/dist/internal/Webhooks.js.map +1 -1
  350. package/dist/internal/exchange/Provider.d.ts +219 -0
  351. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  352. package/dist/internal/exchange/Provider.js +117 -0
  353. package/dist/internal/exchange/Provider.js.map +1 -0
  354. package/dist/internal/exchange/index.d.ts +2 -0
  355. package/dist/internal/exchange/index.d.ts.map +1 -0
  356. package/dist/internal/exchange/index.js +2 -0
  357. package/dist/internal/exchange/index.js.map +1 -0
  358. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  359. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  360. package/dist/internal/exchange/providers/uniswap.js +553 -0
  361. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  362. package/dist/internal/funding/Action.d.ts +55 -0
  363. package/dist/internal/funding/Action.d.ts.map +1 -0
  364. package/dist/internal/funding/Action.js +74 -0
  365. package/dist/internal/funding/Action.js.map +1 -0
  366. package/dist/internal/funding/Catalog.d.ts +107 -0
  367. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  368. package/dist/internal/funding/Catalog.js +270 -0
  369. package/dist/internal/funding/Catalog.js.map +1 -0
  370. package/dist/internal/funding/Chain.d.ts +76 -0
  371. package/dist/internal/funding/Chain.d.ts.map +1 -0
  372. package/dist/internal/funding/Chain.js +38 -0
  373. package/dist/internal/funding/Chain.js.map +1 -0
  374. package/dist/internal/funding/Deposit.d.ts +366 -0
  375. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  376. package/dist/internal/funding/Deposit.js +286 -0
  377. package/dist/internal/funding/Deposit.js.map +1 -0
  378. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  379. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  380. package/dist/internal/funding/DepositAddress.js +189 -0
  381. package/dist/internal/funding/DepositAddress.js.map +1 -0
  382. package/dist/internal/funding/Evidence.d.ts +52 -0
  383. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  384. package/dist/internal/funding/Evidence.js +314 -0
  385. package/dist/internal/funding/Evidence.js.map +1 -0
  386. package/dist/internal/funding/Provider.d.ts +1186 -0
  387. package/dist/internal/funding/Provider.d.ts.map +1 -0
  388. package/dist/internal/funding/Provider.js +1081 -0
  389. package/dist/internal/funding/Provider.js.map +1 -0
  390. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  391. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  392. package/dist/internal/funding/Reconciliation.js +676 -0
  393. package/dist/internal/funding/Reconciliation.js.map +1 -0
  394. package/dist/internal/funding/Route.d.ts +21 -0
  395. package/dist/internal/funding/Route.d.ts.map +1 -0
  396. package/dist/internal/funding/Route.js +5 -0
  397. package/dist/internal/funding/Route.js.map +1 -0
  398. package/dist/internal/funding/Subsidy.d.ts +113 -0
  399. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  400. package/dist/internal/funding/Subsidy.js +138 -0
  401. package/dist/internal/funding/Subsidy.js.map +1 -0
  402. package/dist/internal/funding/Token.d.ts +41 -0
  403. package/dist/internal/funding/Token.d.ts.map +1 -0
  404. package/dist/internal/funding/Token.js +22 -0
  405. package/dist/internal/funding/Token.js.map +1 -0
  406. package/dist/internal/funding/Transfer.d.ts +643 -0
  407. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  408. package/dist/internal/funding/Transfer.js +332 -0
  409. package/dist/internal/funding/Transfer.js.map +1 -0
  410. package/dist/internal/funding/index.d.ts +13 -0
  411. package/dist/internal/funding/index.d.ts.map +1 -0
  412. package/dist/internal/funding/index.js +13 -0
  413. package/dist/internal/funding/index.js.map +1 -0
  414. package/dist/internal/funding/providers/across.d.ts +21 -0
  415. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  416. package/dist/internal/funding/providers/across.js +117 -0
  417. package/dist/internal/funding/providers/across.js.map +1 -0
  418. package/dist/internal/funding/providers/relay.d.ts +46 -0
  419. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  420. package/dist/internal/funding/providers/relay.js +464 -0
  421. package/dist/internal/funding/providers/relay.js.map +1 -0
  422. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  423. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  424. package/dist/internal/funding/providers/rhino.js +116 -0
  425. package/dist/internal/funding/providers/rhino.js.map +1 -0
  426. package/dist/internal/funding/providers/squid.d.ts +19 -0
  427. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  428. package/dist/internal/funding/providers/squid.js +120 -0
  429. package/dist/internal/funding/providers/squid.js.map +1 -0
  430. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  431. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  432. package/dist/internal/funding/providers/symbiosis.js +176 -0
  433. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  434. package/dist/internal/index.d.ts +5 -1
  435. package/dist/internal/index.d.ts.map +1 -1
  436. package/dist/internal/index.js +5 -1
  437. package/dist/internal/index.js.map +1 -1
  438. package/dist/internal/webhookDestinations/url.js +61 -57
  439. package/dist/internal/webhookDestinations/url.js.map +1 -1
  440. package/dist/providers/index.d.ts +43 -0
  441. package/dist/providers/index.d.ts.map +1 -0
  442. package/dist/providers/index.js +19 -0
  443. package/dist/providers/index.js.map +1 -0
  444. package/package.json +9 -4
  445. package/src/ApiKeys.test.ts +11 -7
  446. package/src/ApiKeys.ts +37 -9
  447. package/src/App.test.ts +85 -10
  448. package/src/App.ts +224 -137
  449. package/src/Assets.ts +29 -4
  450. package/src/Client.test-d.ts +650 -30
  451. package/src/Scope.test.ts +19 -0
  452. package/src/Scope.ts +28 -11
  453. package/src/Webhooks.test.ts +25 -0
  454. package/src/Webhooks.ts +1 -1
  455. package/src/admin/App.test.ts +9 -2
  456. package/src/admin/App.ts +32 -9
  457. package/src/admin/apps/api-keys.test.ts +167 -23
  458. package/src/admin/apps/api-keys.ts +166 -28
  459. package/src/admin/apps/earn-vaults.test.ts +338 -0
  460. package/src/admin/apps/earn-vaults.ts +572 -0
  461. package/src/admin/apps/scopes.test.ts +16 -1
  462. package/src/admin/ui/plugin.ts +2 -2
  463. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  464. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  465. package/src/admin/ui/src/components/Page.tsx +1 -1
  466. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  467. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  468. package/src/admin/ui/src/lib/client.ts +1 -1
  469. package/src/admin/ui/src/lib/config.ts +1 -1
  470. package/src/admin/ui/src/lib/early-access.ts +8 -9
  471. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  472. package/src/admin/ui/src/lib/format.ts +13 -0
  473. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  474. package/src/admin/ui/src/lib/organizations.ts +7 -1
  475. package/src/admin/ui/src/lib/response.ts +22 -0
  476. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  477. package/src/admin/ui/src/lib/scopes.ts +28 -7
  478. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  479. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  480. package/src/admin/ui/src/router.tsx +2 -2
  481. package/src/admin/ui/src/routes/__root.tsx +9 -8
  482. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  483. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  484. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  485. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  486. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  487. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  488. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  489. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  490. package/src/admin/ui/vite.config.ts +4 -1
  491. package/src/admin/ui.generated.ts +189 -95
  492. package/src/analytics/Analytics.test.ts +69 -10
  493. package/src/analytics/Analytics.ts +20 -1
  494. package/src/analytics/tables/requestEvents.ts +79 -37
  495. package/src/apps/Zones.test.ts +33 -0
  496. package/src/apps/Zones.ts +40 -0
  497. package/src/apps/composition.test.ts +84 -1
  498. package/src/apps/data/App.test.ts +38 -9
  499. package/src/apps/data/App.ts +96 -33
  500. package/src/apps/data/FxOracle.ts +1 -1
  501. package/src/apps/data/index.ts +0 -1
  502. package/src/apps/data/routes/activities.test.ts +82 -6
  503. package/src/apps/data/routes/activities.ts +131 -71
  504. package/src/apps/data/routes/balances.test.ts +50 -37
  505. package/src/apps/data/routes/balances.ts +5 -5
  506. package/src/apps/data/routes/blocks.test.ts +2 -0
  507. package/src/apps/data/routes/coingecko.test.ts +22 -0
  508. package/src/apps/data/routes/coingecko.ts +84 -48
  509. package/src/apps/data/routes/earn.test.ts +1108 -0
  510. package/src/apps/data/routes/earn.ts +1391 -0
  511. package/src/apps/data/routes/exchanges.test.ts +82 -33
  512. package/src/apps/data/routes/exchanges.ts +842 -227
  513. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  514. package/src/apps/data/routes/fee-amm.ts +69 -12
  515. package/src/apps/data/routes/funding.test.ts +2712 -221
  516. package/src/apps/data/routes/funding.ts +1604 -387
  517. package/src/apps/data/routes/indexer.test.ts +43 -34
  518. package/src/apps/data/routes/indexer.ts +19 -2
  519. package/src/apps/data/routes/receipts.test.ts +5 -3
  520. package/src/apps/data/routes/receipts.ts +13 -11
  521. package/src/apps/data/routes/rpc.test.ts +446 -28
  522. package/src/apps/data/routes/rpc.ts +243 -25
  523. package/src/apps/data/routes/tokenlist.test.ts +15 -0
  524. package/src/apps/data/routes/tokenlist.ts +88 -22
  525. package/src/apps/data/routes/tokens.ts +262 -86
  526. package/src/apps/data/routes/transactions.test.ts +2 -0
  527. package/src/apps/data/routes/transactions.ts +77 -42
  528. package/src/apps/data/routes/transfers.test.ts +166 -4
  529. package/src/apps/data/routes/transfers.ts +216 -78
  530. package/src/apps/data/routes/valuation.test.ts +62 -9
  531. package/src/apps/data/routes/valuation.ts +2 -2
  532. package/src/apps/data/routes/verified-tokens.test.ts +51 -0
  533. package/src/apps/data/routes/verified-tokens.ts +52 -15
  534. package/src/apps/data/routes/webhooks.test.ts +432 -33
  535. package/src/apps/data/routes/webhooks.ts +189 -79
  536. package/src/apps/data/routes/zones.test.ts +473 -0
  537. package/src/apps/data/routes/zones.ts +338 -0
  538. package/src/apps/docs/reference.ts +8 -6
  539. package/src/apps/index.ts +2 -1
  540. package/src/apps/management/Billing.test.ts +29 -0
  541. package/src/apps/management/Billing.ts +23 -0
  542. package/src/apps/management/Error.ts +12 -0
  543. package/src/apps/management/routes/api-keys.test.ts +5 -3
  544. package/src/apps/management/routes/api-keys.ts +2 -9
  545. package/src/apps/management/routes/invitations.ts +4 -11
  546. package/src/apps/management/routes/orgs.ts +2 -9
  547. package/src/apps/management/routes/scopes.test.ts +7 -2
  548. package/src/apps/management/routes/scopes.ts +2 -2
  549. package/src/apps/management/routes/webhooks.test.ts +6 -1
  550. package/src/apps/management/routes/webhooks.ts +15 -3
  551. package/src/apps/mpp/App.ts +276 -29
  552. package/src/apps/mpp/Mpp.test.ts +631 -26
  553. package/src/apps/mpp/Mpp.ts +0 -42
  554. package/src/apps/mpp/internal/Adapter.ts +108 -3
  555. package/src/apps/mpp/internal/Error.test.ts +33 -0
  556. package/src/apps/mpp/internal/Error.ts +44 -6
  557. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  558. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  559. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  560. package/src/apps/mpp/internal/Policy.ts +98 -0
  561. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  562. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  563. package/src/apps/mpp/internal/Screening.ts +40 -3
  564. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  565. package/src/apps/mpp/internal/Utils.ts +30 -0
  566. package/src/apps/relay/App.test.ts +495 -64
  567. package/src/apps/relay/App.ts +234 -24
  568. package/src/apps/relay/Sponsorships.test.ts +51 -0
  569. package/src/apps/relay/Sponsorships.ts +19 -7
  570. package/src/db/Db.ts +439 -0
  571. package/src/db/Schema.ts +325 -2
  572. package/src/db/tables/earnVaults.test.ts +185 -0
  573. package/src/db/tables/earnVaults.ts +151 -0
  574. package/src/db/tables/fundingCatalog.test.ts +108 -0
  575. package/src/db/tables/fundingCatalog.ts +157 -0
  576. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  577. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  578. package/src/db/tables/fundingDeposits.test.ts +261 -0
  579. package/src/db/tables/fundingDeposits.ts +229 -0
  580. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  581. package/src/db/tables/fundingIdempotency.ts +180 -0
  582. package/src/db/tables/fundingTransferEvents.ts +28 -0
  583. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  584. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  585. package/src/db/tables/fundingTransfers.test.ts +89 -0
  586. package/src/db/tables/fundingTransfers.ts +153 -0
  587. package/src/db/tables/organizations.test.ts +88 -0
  588. package/src/db/tables/organizations.ts +42 -1
  589. package/src/db/tables/projects.ts +16 -0
  590. package/src/db/tables/requestUsage.ts +23 -0
  591. package/src/db/tables/sponsoredTransactions.test.ts +52 -2
  592. package/src/db/tables/sponsoredTransactions.ts +18 -6
  593. package/src/db/tables/users.ts +16 -0
  594. package/src/db/tables/verifiedTokens.ts +19 -14
  595. package/src/db/tables/webhookSubscriptions.ts +58 -3
  596. package/src/handlers/relay.test.ts +2 -0
  597. package/src/handlers/relay.ts +95 -99
  598. package/src/internal/Auth.test.ts +48 -0
  599. package/src/internal/Auth.ts +61 -2
  600. package/src/internal/Cache.ts +13 -9
  601. package/src/internal/Cursor.test.ts +2 -2
  602. package/src/internal/Cursor.ts +1 -1
  603. package/src/internal/EarnRates.test.ts +125 -0
  604. package/src/internal/EarnRates.ts +409 -0
  605. package/src/internal/EarnVaults.test.ts +195 -0
  606. package/src/internal/EarnVaults.ts +876 -0
  607. package/src/internal/EdgeCache.test.ts +37 -5
  608. package/src/internal/EdgeCache.ts +39 -7
  609. package/src/internal/Id.ts +14 -0
  610. package/src/internal/Idempotency.test.ts +109 -0
  611. package/src/internal/Idempotency.ts +237 -0
  612. package/src/internal/Log.test-d.ts +41 -8
  613. package/src/internal/Log.test.ts +189 -8
  614. package/src/internal/Log.ts +124 -17
  615. package/src/internal/MetricSink.test.ts +244 -4
  616. package/src/internal/MetricSink.ts +51 -1
  617. package/src/internal/OpenApi.ts +3 -0
  618. package/src/internal/Provider.test.ts +17 -0
  619. package/src/internal/Provider.ts +17 -0
  620. package/src/internal/Schema.test.ts +13 -0
  621. package/src/internal/Schema.ts +41 -24
  622. package/src/internal/Store.test.ts +25 -0
  623. package/src/internal/Store.ts +46 -0
  624. package/src/internal/Tidx.local.test.ts +78 -3
  625. package/src/internal/Tidx.test.ts +212 -18
  626. package/src/internal/Tidx.ts +112 -32
  627. package/src/internal/VerifiedTokens.test.ts +15 -0
  628. package/src/internal/Viem.test.ts +170 -17
  629. package/src/internal/Viem.ts +111 -28
  630. package/src/internal/WebhookDestination.ts +25 -23
  631. package/src/internal/Webhooks.test.ts +59 -0
  632. package/src/internal/Webhooks.ts +34 -10
  633. package/src/internal/exchange/Provider.test.ts +216 -0
  634. package/src/internal/exchange/Provider.ts +326 -0
  635. package/src/internal/exchange/index.test.ts +6 -0
  636. package/src/internal/exchange/index.ts +1 -0
  637. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  638. package/src/internal/exchange/providers/uniswap.ts +682 -0
  639. package/src/internal/funding/Action.test.ts +138 -0
  640. package/src/internal/funding/Action.ts +117 -0
  641. package/src/internal/funding/Catalog.test.ts +311 -0
  642. package/src/internal/funding/Catalog.ts +347 -0
  643. package/src/internal/funding/Chain.test.ts +79 -0
  644. package/src/internal/funding/Chain.ts +120 -0
  645. package/src/internal/funding/Deposit.test.ts +26 -0
  646. package/src/internal/funding/Deposit.ts +453 -0
  647. package/src/internal/funding/DepositAddress.test.ts +18 -0
  648. package/src/internal/funding/DepositAddress.ts +312 -0
  649. package/src/internal/funding/Evidence.test.ts +297 -0
  650. package/src/internal/funding/Evidence.ts +430 -0
  651. package/src/internal/funding/Provider.test.ts +1328 -0
  652. package/src/internal/funding/Provider.ts +1796 -0
  653. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  654. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  655. package/src/internal/funding/Reconciliation.ts +930 -0
  656. package/src/internal/funding/Route.test.ts +66 -0
  657. package/src/internal/funding/Route.ts +29 -0
  658. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  659. package/src/internal/funding/Subsidy.test.ts +75 -0
  660. package/src/internal/funding/Subsidy.ts +260 -0
  661. package/src/internal/funding/Token.test.ts +47 -0
  662. package/src/internal/funding/Token.ts +59 -0
  663. package/src/internal/funding/Transfer.test.ts +369 -0
  664. package/src/internal/funding/Transfer.ts +522 -0
  665. package/src/internal/funding/index.test.ts +20 -0
  666. package/src/internal/funding/index.ts +12 -0
  667. package/src/internal/funding/providers/across.ts +149 -0
  668. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  669. package/src/internal/funding/providers/relay.test.ts +474 -0
  670. package/src/internal/funding/providers/relay.ts +559 -0
  671. package/src/internal/funding/providers/rhino.ts +139 -0
  672. package/src/internal/funding/providers/squid.ts +151 -0
  673. package/src/internal/funding/providers/symbiosis.ts +221 -0
  674. package/src/internal/index.test.ts +5 -1
  675. package/src/internal/index.ts +5 -1
  676. package/src/internal/webhookDestinations/url.ts +49 -45
  677. package/src/providers/index.test.ts +14 -0
  678. package/src/providers/index.ts +54 -0
  679. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  680. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  681. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  682. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  683. package/dist/internal/FundingQuotes.d.ts +0 -864
  684. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  685. package/dist/internal/FundingQuotes.js +0 -672
  686. package/dist/internal/FundingQuotes.js.map +0 -1
  687. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  688. package/src/internal/FundingQuotes.test.ts +0 -456
  689. package/src/internal/FundingQuotes.ts +0 -944
@@ -0,0 +1,947 @@
1
+ import { Hono } from 'hono';
2
+ import { Value as core_Value } from 'ox';
3
+ import { ContractFunctionExecutionError, ContractFunctionRevertedError, ContractFunctionZeroDataError, } from 'viem';
4
+ import * as z from 'zod/mini';
5
+ import * as Db from '../../../db/Db.js';
6
+ import * as core_EarnVaults from '../../../db/tables/earnVaults.js';
7
+ import * as Auth from '../../../internal/Auth.js';
8
+ import * as Cache from '../../../internal/Cache.js';
9
+ import * as Cursor from '../../../internal/Cursor.js';
10
+ import * as EarnRates from '../../../internal/EarnRates.js';
11
+ import * as EarnVaults from '../../../internal/EarnVaults.js';
12
+ import * as OpenApi from '../../../internal/OpenApi.js';
13
+ import * as Response from '../../../internal/Response.js';
14
+ import * as Schema from '../../../internal/Schema.js';
15
+ import * as Store from '../../../internal/Store.js';
16
+ import * as Timing from '../../../internal/Timing.js';
17
+ import * as Ttl from '../../../internal/Ttl.js';
18
+ import * as Value from '../../../internal/Value.js';
19
+ import * as VerifiedTokens from '../../../internal/VerifiedTokens.js';
20
+ import * as FxOracle from '../FxOracle.js';
21
+ import * as Tokens from './tokens.js';
22
+ import * as Valuation from './valuation.js';
23
+ const deployedSignature = 'event EarnStackDeployed(address indexed earnVault,address indexed earnShare,address indexed earnFees,address engine,address asset,address owner,bytes32 deploymentId,address emergencyGuardian,address asyncJanitor,uint8 migrationMode,bytes32 earnShareSalt,bytes32 controlConfigHash,bytes32 feeConfigHash,bytes32 earnFeesSalt)';
24
+ const maxScannedDeployments = 250;
25
+ const scanLimit = 50;
26
+ /** Vault TVL is reported in USD only; the API exposes no denomination parameter. */
27
+ const tvlDenomination = 'USD';
28
+ /** `Valuation.valuationFor` floors to 6 dp, so 6 is the precision a valued amount carries. */
29
+ const tvlDecimals = 6;
30
+ /** Returns the smallest useful live-discovery batch. */
31
+ export function discoveryBatchLimit(options) {
32
+ const needed = options.limit + 1 - options.matches;
33
+ return Math.min(options.filtered ? needed * 2 : needed, options.remaining, scanLimit);
34
+ }
35
+ /** Zod schemas owned by the public Earn-vault resource. */
36
+ export var schema;
37
+ (function (schema) {
38
+ const capability = z
39
+ .enum([
40
+ 'asyncRedeem',
41
+ 'boundedRedeem',
42
+ 'deposit',
43
+ 'exactWithdraw',
44
+ 'inKindDeposit',
45
+ 'privateRouting',
46
+ 'redeem',
47
+ 'routerSwaps',
48
+ ])
49
+ .check(z.describe('Vault capability required by the request.'));
50
+ const engineType = z
51
+ .enum(['erc4626', 'veda'])
52
+ .check(z.describe('Inferred vault engine type.'), z.meta({ examples: ['erc4626'] }));
53
+ const engine = Schema.describe(z.strictObject({
54
+ address: Schema.Address.check(z.describe('Current vault engine contract address.'), z.meta({ examples: ['0xd85fc943333a6cd7c0e3391acd54fc4e572f0baf'] })),
55
+ type: z
56
+ .nullable(engineType)
57
+ .check(z.describe('Inferred engine type, or null when it is unknown.')),
58
+ venue: z
59
+ .nullable(Schema.Address.check(z.describe('Yield venue contract bound to the engine.'), z.meta({ examples: ['0xa8b4f0e69cd4b0e56b676343f02acd8c3b355322'] })))
60
+ .check(z.describe('Yield venue, or null when the engine does not expose one.')),
61
+ }), 'Current vault engine.');
62
+ const include = z
63
+ .enum(['access', 'apy', 'capabilities', 'token.logoUri', 'tvl', 'zone'])
64
+ .check(z.describe('Optional vault fields to embed via `include`.'));
65
+ const includeQuery = Schema.includeQuery(include, 'Comma-separated vault fields to include, such as `apy,tvl`.');
66
+ // `apy` and `tvl` need indexer and FX access, so surfaces lacking either
67
+ // select from this reduced set instead.
68
+ const baseInclude = z
69
+ .enum(['access', 'capabilities', 'token.logoUri', 'zone'])
70
+ .check(z.describe('Optional vault fields to embed via `include`.'));
71
+ const baseIncludeQuery = Schema.includeQuery(baseInclude, 'Comma-separated vault fields to include, such as `access,zone`.');
72
+ const zone = z
73
+ .strictObject({
74
+ chainId: Schema.ChainId.check(z.describe('Private Zone chain id.'), z.meta({ examples: [421700001] })),
75
+ inputTokens: z
76
+ .array(Schema.Address)
77
+ .check(z.describe('Tokens accepted by private deposits.'), z.meta({ examples: [['0x20c000000000000000000000ff04042ee92fd449']] })),
78
+ name: z.string().check(z.describe('Private Zone name.'), z.meta({ examples: ['zone-e'] })),
79
+ outputTokens: z
80
+ .array(Schema.Address)
81
+ .check(z.describe('Tokens supported by private redemptions.'), z.meta({ examples: [['0x20c000000000000000000000ff04042ee92fd449']] })),
82
+ })
83
+ .check(z.describe('Private Zone route configured for a verified vault.'));
84
+ const value = z.strictObject({
85
+ amount: Schema.DecimalString.check(z.describe('Value in base units at `decimals` precision.'), z.meta({ examples: ['125288750000'] })),
86
+ currency: z
87
+ .string()
88
+ .check(z.describe('Display currency of this value.'), z.meta({ examples: ['USD'] })),
89
+ decimals: z
90
+ .number()
91
+ .check(z.int(), z.nonnegative(), z.describe('Decimal places used to convert `amount` into `formatted`.'), z.meta({ examples: [6] })),
92
+ formatted: z
93
+ .string()
94
+ .check(z.regex(/^\d+(\.\d+)?$/), z.describe('Value rendered in whole units.'), z.meta({ examples: ['125288.75'] })),
95
+ });
96
+ const vault = z.strictObject({
97
+ access: z
98
+ .optional(EarnVaults.schema.Discovery.shape.access)
99
+ .check(z.describe('Vault share-token access, when requested.')),
100
+ apy: z
101
+ .optional(z.nullable(EarnRates.schema.Apy))
102
+ .check(z.describe('Annualized share-price growth over the selected window, when requested via `include=apy` or by selecting `apy.window`. Null when the rate could not be measured: the vault predates the window, a boundary or historical quote is unavailable, the engine changed inside the window, or the growth is too extreme to annualize as a ratio.')),
103
+ assetToken: Tokens.schema.Token.check(z.describe('Asset accepted by the vault.')),
104
+ capabilities: z
105
+ .optional(EarnVaults.schema.Discovery.shape.capabilities)
106
+ .check(z.describe('Vault capabilities, when requested.')),
107
+ description: z
108
+ .nullable(z.string())
109
+ .check(z.describe('Curated vault description, or null when the vault is not verified.'), z.meta({ examples: ['Bridge test PATHUSD deposited into Tempo Earn.'] })),
110
+ engine,
111
+ id: Schema.Address.check(z.describe('Stable vault id, equal to the lowercase vault address.'), z.meta({ examples: ['0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a'] })),
112
+ instantLiquidity: EarnVaults.schema.Discovery.shape.instantLiquidity.check(z.describe('Assets the venue would release right now, capped at the vault backing, in asset base units. Null when the engine interface cannot report a reliable number.')),
113
+ label: z
114
+ .string()
115
+ .check(z.describe('Vault display label.'), z.meta({ examples: ['btPATHUSD Earn'] })),
116
+ sharePrice: z
117
+ .nullable(value)
118
+ .check(z.describe('Assets returned for one whole Earn share, in the asset display currency, or null when the engine cannot quote an exit.')),
119
+ shareToken: Tokens.schema.Token.check(z.describe('Token representing vault shares.')),
120
+ slug: z
121
+ .nullable(z.string())
122
+ .check(z.describe('Curated URL slug, or null when the vault is not verified.'), z.meta({ examples: ['btpathusd-earn-h8k2m4n6'] })),
123
+ state: EarnVaults.schema.Discovery.shape.state,
124
+ tvl: z
125
+ .optional(z.nullable(value))
126
+ .check(z.describe('Total assets valued in USD, when requested via `include=tvl`, or null when the asset has no priced display currency.')),
127
+ vaultAddress: Schema.Address.check(z.describe('Earn vault contract address.'), z.meta({ examples: ['0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a'] })),
128
+ verified: z
129
+ .boolean()
130
+ .check(z.describe('Whether this vault is in the curated Earn registry.'), z.meta({ examples: [true] })),
131
+ zone: z
132
+ .optional(z.nullable(zone))
133
+ .check(z.describe('Curated private Zone route, when requested, or null when absent.')),
134
+ });
135
+ /** One compatible Earn vault resolved from current chain state. */
136
+ schema.Vault = Schema.describe(vault, 'A compatible Earn vault resolved from chain state.');
137
+ /** One registry-curated Earn vault. */
138
+ schema.VerifiedVault = Schema.describe(z.extend(vault, {
139
+ engine: z.extend(engine, { type: engineType }),
140
+ slug: z
141
+ .string()
142
+ .check(z.describe('Stable curated vault slug.'), z.meta({ examples: ['btpathusd-earn-h8k2m4n6'] })),
143
+ verified: z
144
+ .literal(true)
145
+ .check(z.describe('This vault is in the curated Earn registry.'), z.meta({ examples: [true] })),
146
+ }), 'A registry-curated Earn vault resolved from chain state.');
147
+ const position = z.strictObject({
148
+ account: Schema.Address.check(z.describe('Account whose Earn position was read.'), z.meta({ examples: ['0xbe058e1c4df8a4366a387bf595b284246a93039e'] })),
149
+ assetAllowance: Schema.DecimalString.check(z.describe('Assets the vault may spend from this account, in asset base units.'), z.meta({ examples: ['0'] })),
150
+ assetBalance: Schema.DecimalString.check(z.describe('Assets this account currently holds, in asset base units.'), z.meta({ examples: ['250000000'] })),
151
+ assetToken: Schema.tokenAddress('0x20c000000000000000000000b9537d11c60e8b50').check(z.describe('TIP-20 asset token accepted by the vault.')),
152
+ id: Schema.Address.check(z.describe('Stable resource ID for this vault position, equal to the account address.'), z.meta({ examples: ['0xbe058e1c4df8a4366a387bf595b284246a93039e'] })),
153
+ shareAllowance: Schema.DecimalString.check(z.describe('Earn shares the vault may spend from this account, in share base units.'), z.meta({ examples: ['0'] })),
154
+ shareBalance: Schema.DecimalString.check(z.describe('Earn shares this account currently holds, in share base units.'), z.meta({ examples: ['99500000'] })),
155
+ shareToken: Schema.tokenAddress('0x20c000000000000000000000300e14ab91a10769').check(z.describe('TIP-20 token representing Earn shares.')),
156
+ value: Schema.DecimalString.check(z.describe('Current asset value of this account’s Earn shares, including fees, in asset base units.'), z.meta({ examples: ['100000000'] })),
157
+ });
158
+ const meta = z
159
+ .object({
160
+ valuation: z
161
+ .optional(Valuation.schema.Pricing)
162
+ .check(z.describe('Rate provenance for valued fields. Present when `include=tvl` consulted conversion rates; absent when TVL was not requested, every value was identity-valued, or rates were unavailable.')),
163
+ })
164
+ .check(z.describe('Rate provenance for valued fields.'));
165
+ const collectionFilters = z.strictObject({
166
+ asset: z
167
+ .optional(Schema.Address)
168
+ .check(z.describe('Only include vaults accepting this asset address.')),
169
+ capability: Schema.includeQuery(capability, 'Comma-separated capabilities that every returned vault must support.'),
170
+ chainId: Schema.ChainIdQuery,
171
+ cursor: Schema.Cursor,
172
+ 'engine.type': z
173
+ .optional(engineType)
174
+ .check(z.describe('Only include vaults with this inferred engine type.')),
175
+ include: includeQuery,
176
+ limit: Schema.Limit,
177
+ });
178
+ const collectionQuery = z
179
+ .extend(collectionFilters, { 'apy.window': EarnRates.schema.Window })
180
+ .check(z.describe('Query parameters for listing Earn vaults.'));
181
+ const vaultSelector = z.strictObject({
182
+ chainId: Schema.ChainIdQuery,
183
+ include: includeQuery,
184
+ });
185
+ /** Schemas for the getEarnVaults operation. */
186
+ let getEarnVaults;
187
+ (function (getEarnVaults) {
188
+ /** Query parameters for all compatible deployed Earn vaults. */
189
+ getEarnVaults.Query = collectionQuery;
190
+ /** Paginated list of compatible deployed Earn vaults. */
191
+ getEarnVaults.Response = z
192
+ .strictObject({
193
+ data: z
194
+ .array(schema.Vault)
195
+ .check(z.describe('Compatible deployed Earn vaults in deployment order.')),
196
+ meta: z.optional(meta),
197
+ nextCursor: Schema.NextCursor,
198
+ })
199
+ .check(z.describe('A page of compatible deployed Earn vaults.'));
200
+ })(getEarnVaults = schema.getEarnVaults || (schema.getEarnVaults = {}));
201
+ /** Schemas for the getVerifiedEarnVaults operation. */
202
+ let getVerifiedEarnVaults;
203
+ (function (getVerifiedEarnVaults) {
204
+ /** Collection query without rates or valuation, for surfaces that cannot measure them. */
205
+ getVerifiedEarnVaults.BaseQuery = Schema.describe(z.extend(collectionFilters, { include: baseIncludeQuery }), 'Query parameters for listing Earn vaults.');
206
+ /** Query parameters for registry-curated Earn vaults. */
207
+ getVerifiedEarnVaults.Query = collectionQuery;
208
+ /** Paginated list of registry-curated Earn vaults. */
209
+ getVerifiedEarnVaults.Response = z
210
+ .strictObject({
211
+ data: z
212
+ .array(schema.VerifiedVault)
213
+ .check(z.describe('Registry-curated Earn vaults ordered by vault address.')),
214
+ meta: z.optional(meta),
215
+ nextCursor: Schema.NextCursor,
216
+ })
217
+ .check(z.describe('A page of registry-curated Earn vaults.'));
218
+ })(getVerifiedEarnVaults = schema.getVerifiedEarnVaults || (schema.getVerifiedEarnVaults = {}));
219
+ /** Schemas for the getEarnVault operation. */
220
+ let getEarnVault;
221
+ (function (getEarnVault) {
222
+ /** Path parameters identifying one Earn vault. */
223
+ getEarnVault.Params = z
224
+ .strictObject({
225
+ vaultId: Schema.Address.check(z.describe('Earn vault contract address.')),
226
+ })
227
+ .check(z.describe('Path parameters identifying one Earn vault.'));
228
+ /** Detail query without rates or valuation, for surfaces that cannot measure them. */
229
+ getEarnVault.BaseQuery = Schema.describe(z.extend(vaultSelector, { include: baseIncludeQuery }), 'Query parameters selecting one Earn vault.');
230
+ /** Query parameters selecting the chain containing the vault. */
231
+ getEarnVault.Query = z
232
+ .extend(vaultSelector, { 'apy.window': EarnRates.schema.Window })
233
+ .check(z.describe('Query parameters selecting one Earn vault.'));
234
+ /** One compatible Earn vault resolved directly from current chain state. */
235
+ getEarnVault.Response = Schema.describe(z.extend(vault, { meta: z.optional(meta) }), 'A compatible Earn vault resolved from chain state, with rate provenance for its valued fields.');
236
+ })(getEarnVault = schema.getEarnVault || (schema.getEarnVault = {}));
237
+ /** Schemas for the getEarnVaultPosition operation. */
238
+ let getEarnVaultPosition;
239
+ (function (getEarnVaultPosition) {
240
+ /** Path parameters identifying the Earn vault and account. */
241
+ getEarnVaultPosition.Params = z
242
+ .strictObject({
243
+ address: Schema.Address.check(z.describe('Account whose Earn position to read.')),
244
+ vaultId: Schema.address('0xdb48b00fb28d9a8db881fcd671c3fb1bf8c486b6').check(z.describe('Earn vault contract address.')),
245
+ })
246
+ .check(z.describe('Path parameters identifying an Earn vault position.'));
247
+ /** Query parameters selecting the chain containing the vault. */
248
+ getEarnVaultPosition.Query = z
249
+ .strictObject({ chainId: Schema.ChainIdQuery })
250
+ .check(z.describe('Query parameters selecting an Earn vault position.'));
251
+ /** Current asset and Earn-share state for one account in one vault. */
252
+ getEarnVaultPosition.Response = Schema.describe(position, 'Current asset and Earn-share balances, allowances, and asset value for an account in one Earn vault.');
253
+ })(getEarnVaultPosition = schema.getEarnVaultPosition || (schema.getEarnVaultPosition = {}));
254
+ })(schema || (schema = {}));
255
+ /** Creates the public Earn-vault handlers. */
256
+ export function earn(options = {}) {
257
+ const oracle = options.fx?.oracle ?? FxOracle.ecb();
258
+ return new Hono()
259
+ .get('/v1/earn/vaults', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('query', schema.getEarnVaults.Query, {
260
+ code: 'query_invalid',
261
+ message: 'Invalid query parameters',
262
+ }), OpenApi.describeRoute({
263
+ description: 'Lists compatible Earn vaults discovered from deployment events and resolved from current chain state.',
264
+ operationId: 'getEarnVaults',
265
+ responses: OpenApi.responses({
266
+ errors: { 502: 'Could not read Earn deployment or vault data.' },
267
+ success: {
268
+ description: 'A page of compatible deployed Earn vaults.',
269
+ schema: schema.getEarnVaults.Response,
270
+ },
271
+ }),
272
+ summary: 'List Earn vaults',
273
+ tags: ['Earn'],
274
+ }),
275
+ // Live state and rate enrichment are embedded, so every vault read caches
276
+ // as current-state rather than slow-changing metadata.
277
+ Cache.response({
278
+ cacheControl: Cache.policies.state,
279
+ key: (c) => Cache.urlKey(c, schema.getEarnVaults.Query),
280
+ name: 'tempo-api:earn-vaults:v2',
281
+ }), async (c) => {
282
+ if (Auth.narrowAccess)
283
+ return Auth.paidAccessError(c);
284
+ if (OpenApi.narrowValidation)
285
+ return OpenApi.validationError(c, {
286
+ code: 'query_invalid',
287
+ message: 'Invalid query parameters',
288
+ });
289
+ const query = c.req.valid('query');
290
+ try {
291
+ const chainId = query.chainId ?? c.get('chainId');
292
+ const data = await listVaults(c, { ...query, chainId, oracle });
293
+ return c.json(Response.validated(schema.getEarnVaults.Response, data), 200);
294
+ }
295
+ catch (cause) {
296
+ return Response.upstream(c, cause);
297
+ }
298
+ })
299
+ .get('/v1/earn/vaults/verified', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('query', schema.getVerifiedEarnVaults.Query, {
300
+ code: 'query_invalid',
301
+ message: 'Invalid query parameters',
302
+ }), OpenApi.describeRoute({
303
+ description: 'Lists registry-curated Earn vaults after resolving their current onchain configuration.',
304
+ operationId: 'getVerifiedEarnVaults',
305
+ responses: OpenApi.responses({
306
+ errors: { 502: 'Could not read curated Earn registry or vault data.' },
307
+ success: {
308
+ description: 'A page of registry-curated Earn vaults.',
309
+ schema: schema.getVerifiedEarnVaults.Response,
310
+ },
311
+ }),
312
+ summary: 'List verified vaults',
313
+ tags: ['Earn'],
314
+ }), Cache.response({
315
+ cacheControl: Cache.policies.state,
316
+ key: (c) => Cache.urlKey(c, schema.getVerifiedEarnVaults.Query),
317
+ name: 'tempo-api:earn-vaults:v2',
318
+ }), async (c) => {
319
+ if (Auth.narrowAccess)
320
+ return Auth.paidAccessError(c);
321
+ if (OpenApi.narrowValidation)
322
+ return OpenApi.validationError(c, {
323
+ code: 'query_invalid',
324
+ message: 'Invalid query parameters',
325
+ });
326
+ const query = c.req.valid('query');
327
+ try {
328
+ const chainId = query.chainId ?? c.get('chainId');
329
+ const data = await listVerifiedVaults(c, { ...query, chainId, oracle });
330
+ return c.json(Response.validated(schema.getVerifiedEarnVaults.Response, data), 200);
331
+ }
332
+ catch (cause) {
333
+ return Response.upstream(c, cause);
334
+ }
335
+ })
336
+ .get('/v1/earn/vaults/:vaultId/positions/:address', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('param', schema.getEarnVaultPosition.Params, {
337
+ code: 'position_invalid',
338
+ message: 'Invalid vault position',
339
+ }), OpenApi.validate('query', schema.getEarnVaultPosition.Query, {
340
+ code: 'query_invalid',
341
+ message: 'Invalid query parameters',
342
+ }), OpenApi.describeRoute({
343
+ description: 'Gets an account’s asset and Earn-share balances, allowances, and current asset value for one Earn vault.',
344
+ operationId: 'getEarnVaultPosition',
345
+ responses: OpenApi.responses({
346
+ errors: {
347
+ 400: {
348
+ codes: [
349
+ 'chain_id_invalid',
350
+ 'chain_id_unsupported',
351
+ 'position_invalid',
352
+ 'query_invalid',
353
+ ],
354
+ },
355
+ 404: {
356
+ codes: ['earn_vault_not_found'],
357
+ description: 'No compatible Earn vault was found at the supplied vault address.',
358
+ },
359
+ 502: 'Could not read the Earn vault position.',
360
+ },
361
+ success: {
362
+ description: 'Current Earn position for one account in one vault.',
363
+ schema: schema.getEarnVaultPosition.Response,
364
+ },
365
+ }),
366
+ summary: 'Get vault position',
367
+ tags: ['Earn'],
368
+ }), Cache.response({
369
+ cacheControl: Cache.policies.state,
370
+ key: (c) => Cache.urlKey(c, schema.getEarnVaultPosition.Query),
371
+ name: 'tempo-api:earn-vault-positions:v1',
372
+ }), async (c) => {
373
+ if (Auth.narrowAccess)
374
+ return Auth.paidAccessError(c);
375
+ if (OpenApi.narrowValidation)
376
+ return Response.error(c, {
377
+ code: 'chain_id_invalid',
378
+ message: 'Invalid chain id',
379
+ status: 400,
380
+ });
381
+ if (OpenApi.narrowValidation)
382
+ return Response.error(c, {
383
+ code: 'chain_id_unsupported',
384
+ message: 'Unsupported chain id',
385
+ status: 400,
386
+ });
387
+ if (OpenApi.narrowValidation)
388
+ return OpenApi.validationError(c, {
389
+ code: 'position_invalid',
390
+ message: 'Invalid request parameters',
391
+ });
392
+ if (OpenApi.narrowValidation)
393
+ return OpenApi.validationError(c, {
394
+ code: 'query_invalid',
395
+ message: 'Invalid query parameters',
396
+ });
397
+ const { address, vaultId } = c.req.valid('param');
398
+ const query = c.req.valid('query');
399
+ const chainId = query.chainId ?? c.get('chainId');
400
+ try {
401
+ const position = await c
402
+ .get('getClient')(chainId)
403
+ .earn.getPosition({ account: address, vault: vaultId });
404
+ return c.json(Response.validated(schema.getEarnVaultPosition.Response, {
405
+ account: address,
406
+ assetAllowance: position.assetAllowance.toString(),
407
+ assetBalance: position.assetBalance.toString(),
408
+ assetToken: position.assetToken,
409
+ id: address,
410
+ shareAllowance: position.shareAllowance.toString(),
411
+ shareBalance: position.shareBalance.toString(),
412
+ shareToken: position.shareToken,
413
+ value: position.value.toString(),
414
+ }), 200);
415
+ }
416
+ catch (cause) {
417
+ try {
418
+ await resolveVaultDiscovery(c, { chainId, include: [], vaultAddress: vaultId });
419
+ }
420
+ catch (vaultCause) {
421
+ if (isIncompatible(vaultCause))
422
+ return Response.error(c, {
423
+ code: 'earn_vault_not_found',
424
+ message: 'Earn vault not found',
425
+ status: 404,
426
+ });
427
+ }
428
+ return Response.upstream(c, cause);
429
+ }
430
+ })
431
+ .get('/v1/earn/vaults/:vaultId', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('param', schema.getEarnVault.Params, {
432
+ code: 'vault_id_invalid',
433
+ message: 'Invalid vault id',
434
+ }), OpenApi.validate('query', schema.getEarnVault.Query, {
435
+ code: 'query_invalid',
436
+ message: 'Invalid query parameters',
437
+ }), OpenApi.describeRoute({
438
+ description: 'Resolves any compatible Earn vault directly from current chain state and enriches it when curated.',
439
+ operationId: 'getEarnVault',
440
+ responses: OpenApi.responses({
441
+ errors: {
442
+ 404: {
443
+ codes: ['earn_vault_not_found'],
444
+ description: 'No compatible Earn vault was found at this address.',
445
+ },
446
+ 502: 'Could not read Earn vault data.',
447
+ },
448
+ success: {
449
+ description: 'One compatible Earn vault.',
450
+ schema: schema.getEarnVault.Response,
451
+ },
452
+ }),
453
+ summary: 'Get Earn vault',
454
+ tags: ['Earn'],
455
+ }), Cache.response({
456
+ cacheControl: Cache.policies.state,
457
+ key: (c) => Cache.urlKey(c, schema.getEarnVault.Query),
458
+ name: 'tempo-api:earn-vaults:v2',
459
+ }), async (c) => {
460
+ if (Auth.narrowAccess)
461
+ return Auth.paidAccessError(c);
462
+ if (OpenApi.narrowValidation)
463
+ return OpenApi.validationError(c, {
464
+ code: 'vault_id_invalid',
465
+ message: 'Invalid request parameters',
466
+ });
467
+ if (OpenApi.narrowValidation)
468
+ return OpenApi.validationError(c, {
469
+ code: 'query_invalid',
470
+ message: 'Invalid request parameters',
471
+ });
472
+ const { vaultId } = c.req.valid('param');
473
+ const query = c.req.valid('query');
474
+ try {
475
+ const chainId = query.chainId ?? c.get('chainId');
476
+ const data = await getVault(c, {
477
+ 'apy.window': query['apy.window'],
478
+ chainId,
479
+ include: query.include,
480
+ oracle,
481
+ vaultAddress: vaultId,
482
+ });
483
+ return c.json(Response.validated(schema.getEarnVault.Response, data), 200);
484
+ }
485
+ catch (cause) {
486
+ if (cause instanceof NotFoundError)
487
+ return Response.error(c, {
488
+ code: 'earn_vault_not_found',
489
+ message: 'Earn vault not found',
490
+ status: 404,
491
+ });
492
+ return Response.upstream(c, cause);
493
+ }
494
+ });
495
+ }
496
+ /** Lists compatible deployed Earn vaults. */
497
+ export async function listVaults(c, options) {
498
+ const db = Db.get(c.get('dbCached'));
499
+ const [records, snapshot] = await Promise.all([
500
+ core_EarnVaults.list(db, { chainId: options.chainId }),
501
+ VerifiedTokens.snapshot(c, options.chainId),
502
+ ]);
503
+ const registry = new Map(records.map((record) => [record.vaultAddress.toLowerCase(), record]));
504
+ const decoded = options.cursor ? Cursor.decode(options.cursor, ['int', 'int']) : undefined;
505
+ let position = decoded
506
+ ? [Number(decoded[0]), Number(decoded[1])]
507
+ : undefined;
508
+ let hasMore = false;
509
+ let scanned = 0;
510
+ const matches = [];
511
+ while (matches.length <= options.limit && scanned < maxScannedDeployments) {
512
+ const page = await queryDeployments(c, {
513
+ asset: options.asset,
514
+ chainId: options.chainId,
515
+ cursor: position,
516
+ limit: discoveryBatchLimit({
517
+ filtered: options.capability.length > 0 || options['engine.type'] !== undefined,
518
+ limit: options.limit,
519
+ matches: matches.length,
520
+ remaining: maxScannedDeployments - scanned,
521
+ }),
522
+ });
523
+ hasMore = page.hasMore;
524
+ if (page.items.length === 0) {
525
+ hasMore = false;
526
+ break;
527
+ }
528
+ scanned += page.items.length;
529
+ const discovered = await Promise.all(page.items.map(async (item) => {
530
+ const record = registry.get(item.vaultAddress.toLowerCase());
531
+ try {
532
+ const discovery = await resolveVaultDiscovery(c, {
533
+ chainId: options.chainId,
534
+ include: discoveryInclude(options),
535
+ vaultAddress: item.vaultAddress,
536
+ });
537
+ return { discovery, position: item.position, record };
538
+ }
539
+ catch (cause) {
540
+ if (!record && isIncompatible(cause))
541
+ return undefined;
542
+ throw cause;
543
+ }
544
+ }));
545
+ for (const match of discovered) {
546
+ if (!match || !matchesVaultFilters(match.discovery, options))
547
+ continue;
548
+ matches.push(match);
549
+ }
550
+ position = page.items.at(-1).position;
551
+ if (!hasMore)
552
+ break;
553
+ }
554
+ const page = matches.slice(0, options.limit);
555
+ const discoveries = page.map(({ discovery }) => discovery);
556
+ const include = vaultInclude(options);
557
+ const [apy, rates, tokens] = await Promise.all([
558
+ resolvePageApy(c, {
559
+ chainId: options.chainId,
560
+ discoveries,
561
+ include,
562
+ window: options['apy.window'],
563
+ }),
564
+ resolvePageRates(c, { discoveries, include, oracle: options.oracle, snapshot }),
565
+ resolvePageTokens(c, { chainId: options.chainId, discoveries, include, snapshot }),
566
+ ]);
567
+ const data = page.map((match) => resolveVault(c, { ...match, apy, include, rates, snapshot, tokens }));
568
+ const last = matches[options.limit - 1];
569
+ const nextPosition = matches.length > options.limit ? last?.position : hasMore ? position : undefined;
570
+ return {
571
+ data,
572
+ ...(rates ? { meta: { valuation: Valuation.pricing(rates, options.oracle) } } : {}),
573
+ nextCursor: nextPosition ? Cursor.encode(nextPosition) : null,
574
+ };
575
+ }
576
+ /** Lists registry-curated Earn vaults. */
577
+ export async function listVerifiedVaults(c, options) {
578
+ const db = Db.get(c.get('dbCached'));
579
+ const [records, snapshot] = await Promise.all([
580
+ core_EarnVaults.list(db, { chainId: options.chainId }),
581
+ VerifiedTokens.snapshot(c, options.chainId),
582
+ ]);
583
+ const decoded = options.cursor ? Cursor.decode(options.cursor, ['address']) : undefined;
584
+ const cursor = decoded?.[0]?.toString().toLowerCase();
585
+ const candidates = records.filter((record) => !cursor || record.vaultAddress.toLowerCase() > cursor);
586
+ const matches = [];
587
+ let offset = 0;
588
+ while (offset < candidates.length && matches.length <= options.limit) {
589
+ const batchSize = discoveryBatchLimit({
590
+ filtered: options.capability.length > 0 || options['engine.type'] !== undefined,
591
+ limit: options.limit,
592
+ matches: matches.length,
593
+ remaining: candidates.length - offset,
594
+ });
595
+ const batch = candidates.slice(offset, offset + batchSize);
596
+ offset += batch.length;
597
+ const discovered = await Promise.all(batch.map(async (record) => ({
598
+ discovery: await resolveVaultDiscovery(c, {
599
+ chainId: options.chainId,
600
+ include: discoveryInclude(options),
601
+ vaultAddress: Schema.Address.parse(record.vaultAddress.toLowerCase()),
602
+ }),
603
+ record,
604
+ })));
605
+ for (const match of discovered) {
606
+ if (!matchesVaultFilters(match.discovery, options))
607
+ continue;
608
+ matches.push(match);
609
+ }
610
+ }
611
+ const page = matches.slice(0, options.limit);
612
+ const discoveries = page.map(({ discovery }) => discovery);
613
+ const include = vaultInclude(options);
614
+ const [apy, rates, tokens] = await Promise.all([
615
+ resolvePageApy(c, {
616
+ chainId: options.chainId,
617
+ discoveries,
618
+ include,
619
+ window: options['apy.window'],
620
+ }),
621
+ resolvePageRates(c, { discoveries, include, oracle: options.oracle, snapshot }),
622
+ resolvePageTokens(c, { chainId: options.chainId, discoveries, include, snapshot }),
623
+ ]);
624
+ const data = page.map((match) => Response.validated(schema.VerifiedVault, resolveVault(c, { ...match, apy, include, rates, snapshot, tokens })));
625
+ const last = matches[options.limit - 1];
626
+ return {
627
+ data,
628
+ ...(rates ? { meta: { valuation: Valuation.pricing(rates, options.oracle) } } : {}),
629
+ nextCursor: matches.length > options.limit && last ? Cursor.encode([last.record.vaultAddress]) : null,
630
+ };
631
+ }
632
+ /** Gets one compatible Earn vault. */
633
+ export async function getVault(c, options) {
634
+ const db = Db.get(c.get('dbCached'));
635
+ const [record, snapshot] = await Promise.all([
636
+ core_EarnVaults.get(db, {
637
+ chainId: options.chainId,
638
+ vaultAddress: options.vaultAddress,
639
+ }),
640
+ VerifiedTokens.snapshot(c, options.chainId),
641
+ ]);
642
+ try {
643
+ const discovery = await resolveVaultDiscovery(c, {
644
+ chainId: options.chainId,
645
+ include: discoveryInclude({ capability: [], include: options.include }),
646
+ vaultAddress: options.vaultAddress,
647
+ });
648
+ const discoveries = [discovery];
649
+ const include = vaultInclude(options);
650
+ const [apy, rates, tokens] = await Promise.all([
651
+ resolvePageApy(c, {
652
+ chainId: options.chainId,
653
+ discoveries,
654
+ include,
655
+ window: options['apy.window'],
656
+ }),
657
+ resolvePageRates(c, { discoveries, include, oracle: options.oracle, snapshot }),
658
+ resolvePageTokens(c, { chainId: options.chainId, discoveries, include, snapshot }),
659
+ ]);
660
+ return {
661
+ ...resolveVault(c, {
662
+ apy,
663
+ discovery,
664
+ include,
665
+ rates,
666
+ record,
667
+ snapshot,
668
+ tokens,
669
+ }),
670
+ ...(rates ? { meta: { valuation: Valuation.pricing(rates, options.oracle) } } : {}),
671
+ };
672
+ }
673
+ catch (cause) {
674
+ if (cause instanceof EarnVaults.NotFoundError || (!record && isIncompatible(cause)))
675
+ throw new NotFoundError();
676
+ throw cause;
677
+ }
678
+ }
679
+ // Selecting a rate window is a request for the rate it measures, mirroring how
680
+ // a capability filter promotes `capabilities`.
681
+ function vaultInclude(options) {
682
+ const { include } = options;
683
+ if (options['apy.window'] === undefined || include.includes('apy'))
684
+ return include;
685
+ return [...include, 'apy'];
686
+ }
687
+ function discoveryInclude(options) {
688
+ const includeCapabilities = options.include.includes('capabilities') ||
689
+ options.include.includes('zone') ||
690
+ options.capability.length > 0;
691
+ return [
692
+ ...(options.include.includes('access') ? ['access'] : []),
693
+ ...(includeCapabilities ? ['capabilities'] : []),
694
+ ];
695
+ }
696
+ async function resolveVaultDiscovery(c, options) {
697
+ return Store.memoize(() => Timing.time(c, 'earn_vault_discovery', () => EarnVaults.resolve({
698
+ getClient: c.get('getClient'),
699
+ include: options.include,
700
+ input: {
701
+ chainId: options.chainId,
702
+ vaultAddress: options.vaultAddress,
703
+ },
704
+ zones: [...c.get('zones').values()],
705
+ })), {
706
+ key: `earn-vault:v3:${options.chainId}:${options.vaultAddress.toLowerCase()}:include:${options.include.join(',') || 'base'}`,
707
+ store: c.get('store'),
708
+ // Matches the routes' `state` policy `max-age` so the two cache layers do
709
+ // not compound staleness on live vault state.
710
+ ttl: Ttl.seconds(30),
711
+ });
712
+ }
713
+ // Measuring a rate costs indexer boundary queries plus historical quotes against
714
+ // an archive node, so an unrequested rate reaches neither.
715
+ function resolvePageApy(c, options) {
716
+ if (!options.include.includes('apy'))
717
+ return undefined;
718
+ return Timing.time(c, 'earn_apy', () => EarnRates.resolve({
719
+ chainId: options.chainId,
720
+ getClient: c.get('getClient'),
721
+ getTidx: c.get('getTidx'),
722
+ store: c.get('store'),
723
+ vaults: options.discoveries.map(({ vaultAddress }) => vaultAddress),
724
+ window: options.window,
725
+ }));
726
+ }
727
+ // The TVL denomination is a fixed constant, not caller input, so a rate set
728
+ // lacking it leaves `tvl` unpriced instead of failing the whole vault read.
729
+ function resolvePageRates(c, options) {
730
+ // Valuing total assets is the only reason this read consults the oracle.
731
+ if (!options.include.includes('tvl'))
732
+ return undefined;
733
+ return Valuation.ratesFor(c, {
734
+ currencies: options.discoveries.flatMap((discovery) => {
735
+ const currency = options.snapshot.byAddress.get(discovery.assetToken.address)?.currency;
736
+ return currency === undefined ? [] : [currency];
737
+ }),
738
+ denomination: tvlDenomination,
739
+ oracle: options.oracle,
740
+ }).catch((cause) => {
741
+ if (cause instanceof Valuation.UnsupportedDenominationError)
742
+ return undefined;
743
+ throw cause;
744
+ });
745
+ }
746
+ async function resolvePageTokens(c, options) {
747
+ const metadata = new Map(options.discoveries.flatMap(({ assetToken, shareToken }) => [
748
+ [Schema.Address.parse(assetToken.address.toLowerCase()), assetToken],
749
+ [Schema.Address.parse(shareToken.address.toLowerCase()), shareToken],
750
+ ]));
751
+ return Tokens.resolveTokens(c, {
752
+ addresses: [...metadata.keys()],
753
+ chainId: options.chainId,
754
+ include: [
755
+ 'token.verified',
756
+ ...(options.include.includes('token.logoUri') ? ['token.logoUri'] : []),
757
+ ],
758
+ metadata,
759
+ snapshot: options.snapshot,
760
+ });
761
+ }
762
+ function resolveVault(c, options) {
763
+ const { discovery, record } = options;
764
+ const valued = options.include.includes('tvl')
765
+ ? Valuation.valuationFor({
766
+ amount: BigInt(discovery.state.totalAssets),
767
+ denomination: tvlDenomination,
768
+ rates: options.rates,
769
+ token: options.snapshot.byAddress.get(discovery.assetToken.address),
770
+ })
771
+ : undefined;
772
+ return serializeVault({
773
+ apy: options.apy?.get(discovery.vaultAddress) ?? null,
774
+ assetToken: getToken(options.tokens, discovery.assetToken.address),
775
+ discovery,
776
+ include: options.include,
777
+ record,
778
+ shareToken: getToken(options.tokens, discovery.shareToken.address),
779
+ tvl: valued
780
+ ? {
781
+ amount: core_Value.from(valued.amount, tvlDecimals).toString(),
782
+ currency: valued.currency,
783
+ decimals: tvlDecimals,
784
+ formatted: valued.amount,
785
+ }
786
+ : null,
787
+ zones: [...c.get('zones').values()],
788
+ });
789
+ }
790
+ /** Serializes resolved onchain and curated fields into the shared vault contract. */
791
+ export function serializeVault(options) {
792
+ const { discovery, record } = options;
793
+ if (options.include.includes('access') && !discovery.access)
794
+ throw new Error('Earn vault access was not resolved.');
795
+ if (options.include.includes('capabilities') && !discovery.capabilities)
796
+ throw new Error('Earn vault capabilities were not resolved.');
797
+ const vaultAddress = Schema.Address.parse(discovery.vaultAddress.toLowerCase());
798
+ return Response.validated(schema.Vault, {
799
+ ...(options.include.includes('access') ? { access: discovery.access } : {}),
800
+ ...(options.include.includes('apy') ? { apy: options.apy } : {}),
801
+ assetToken: options.assetToken,
802
+ ...(options.include.includes('capabilities') ? { capabilities: discovery.capabilities } : {}),
803
+ description: record?.description ?? null,
804
+ engine: {
805
+ address: discovery.engine.address.toLowerCase(),
806
+ type: discovery.engine.type,
807
+ venue: discovery.engine.venue?.toLowerCase() ?? null,
808
+ },
809
+ id: vaultAddress,
810
+ instantLiquidity: discovery.instantLiquidity,
811
+ label: record?.label ?? options.shareToken.name,
812
+ sharePrice: discovery.sharePrice === null
813
+ ? null
814
+ : {
815
+ amount: discovery.sharePrice,
816
+ currency: options.assetToken.currency,
817
+ decimals: options.assetToken.decimals,
818
+ formatted: core_Value.format(BigInt(discovery.sharePrice), options.assetToken.decimals),
819
+ },
820
+ shareToken: options.shareToken,
821
+ slug: record?.slug ?? null,
822
+ state: discovery.state,
823
+ ...(options.include.includes('tvl') ? { tvl: options.tvl } : {}),
824
+ vaultAddress,
825
+ verified: record !== undefined,
826
+ ...(options.include.includes('zone')
827
+ ? { zone: record ? resolveZone({ discovery, record, zones: options.zones }) : null }
828
+ : {}),
829
+ });
830
+ }
831
+ function resolveZone(options) {
832
+ if (!options.discovery.capabilities?.privateRouting)
833
+ return null;
834
+ const hasInputs = options.record.privateInputTokens.length > 0;
835
+ const hasOutputs = options.record.privateOutputTokens.length > 0;
836
+ if (!hasInputs && !hasOutputs)
837
+ return null;
838
+ if (hasInputs !== hasOutputs)
839
+ throw new Error('Private input and output tokens must both be configured.');
840
+ const configured = options.zones.filter((zone) => zone.sourceId === options.record.chainId);
841
+ if (configured.length !== 1)
842
+ throw new Error(`Expected one Earn Zone for chain ${options.record.chainId}.`);
843
+ const zone = configured[0];
844
+ return {
845
+ chainId: zone.id,
846
+ inputTokens: options.record.privateInputTokens.map((token) => Schema.Address.parse(token.toLowerCase())),
847
+ name: zone.name,
848
+ outputTokens: options.record.privateOutputTokens.map((token) => Schema.Address.parse(token.toLowerCase())),
849
+ };
850
+ }
851
+ function getToken(tokens, address) {
852
+ const token = tokens.get(Schema.Address.parse(address.toLowerCase()));
853
+ if (!token)
854
+ throw new Error(`Token metadata was not resolved for ${address}.`);
855
+ return Response.validated(Tokens.schema.Token, token);
856
+ }
857
+ async function queryDeployments(c, options) {
858
+ const filters = ['deployment_rank = 1'];
859
+ if (options.asset)
860
+ filters.push(`lower(asset) = '${options.asset.toLowerCase()}'`);
861
+ if (options.cursor)
862
+ filters.push(Cursor.keyset([
863
+ {
864
+ literal: Cursor.literal(options.cursor[0], 'int'),
865
+ name: 'block_num',
866
+ order: 'desc',
867
+ },
868
+ {
869
+ literal: Cursor.literal(options.cursor[1], 'int'),
870
+ name: 'log_idx',
871
+ order: 'desc',
872
+ },
873
+ ]));
874
+ // ClickHouse supports ordering and windowing over decoded event CTEs.
875
+ const result = await c
876
+ .get('getTidx')(options.chainId)
877
+ .fetch({
878
+ chainId: options.chainId,
879
+ engine: 'clickhouse',
880
+ query: `
881
+ SELECT "earnVault", asset, block_num, log_idx
882
+ FROM (
883
+ SELECT
884
+ "earnVault",
885
+ asset,
886
+ block_num,
887
+ log_idx,
888
+ row_number() OVER (
889
+ PARTITION BY lower("earnVault")
890
+ ORDER BY block_num DESC, log_idx DESC
891
+ ) AS deployment_rank
892
+ FROM EarnStackDeployed
893
+ )
894
+ WHERE ${filters.join(' AND ')}
895
+ ORDER BY block_num DESC, log_idx DESC
896
+ LIMIT ${options.limit + 1}
897
+ `,
898
+ signatures: [deployedSignature],
899
+ });
900
+ const rows = result.rows;
901
+ const items = rows.slice(0, options.limit).map((row) => {
902
+ const vaultAddress = Schema.Address.safeParse(Value.toText(row['earnVault']));
903
+ const asset = Schema.Address.safeParse(Value.toText(row['asset']));
904
+ const blockNumber = Value.toNumber(row['block_num']);
905
+ const logIndex = Value.toNumber(row['log_idx']);
906
+ if (!vaultAddress.success ||
907
+ !asset.success ||
908
+ blockNumber === undefined ||
909
+ logIndex === undefined)
910
+ throw new Error('TIDX returned an invalid Earn deployment row.');
911
+ return {
912
+ asset: asset.data,
913
+ position: [blockNumber, logIndex],
914
+ vaultAddress: vaultAddress.data,
915
+ };
916
+ });
917
+ return { hasMore: rows.length > options.limit, items };
918
+ }
919
+ /** Tests live vault state against the shared collection filters. */
920
+ export function matchesVaultFilters(discovery, options) {
921
+ if (options.asset && discovery.assetToken.address.toLowerCase() !== options.asset.toLowerCase())
922
+ return false;
923
+ const capabilities = discovery.capabilities;
924
+ if (options.capability.length > 0 && !capabilities)
925
+ throw new Error('Earn vault capabilities were not resolved.');
926
+ if (capabilities && !options.capability.every((name) => capabilities[name]))
927
+ return false;
928
+ if (options['engine.type'] && discovery.engine.type !== options['engine.type'])
929
+ return false;
930
+ return true;
931
+ }
932
+ /** Returns whether a failed read proves the address is not a compatible Earn vault. */
933
+ export function isIncompatible(cause) {
934
+ if (cause instanceof EarnVaults.NotFoundError)
935
+ return true;
936
+ if (cause instanceof EarnVaults.VerificationError)
937
+ return cause.result.status === 'mismatch';
938
+ if (!(cause instanceof ContractFunctionExecutionError))
939
+ return false;
940
+ return Boolean(cause.walk((error) => error instanceof ContractFunctionRevertedError ||
941
+ error instanceof ContractFunctionZeroDataError));
942
+ }
943
+ /** Thrown when no compatible Earn vault exists at the requested address. */
944
+ export class NotFoundError extends Error {
945
+ name = 'Earn.NotFoundError';
946
+ }
947
+ //# sourceMappingURL=earn.js.map