tapimo 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +99 -43
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +12125 -7913
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1625 -718
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts +108 -108
  78. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  79. package/dist/apps/data/routes/fee-amm.js +59 -8
  80. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  81. package/dist/apps/data/routes/funding.d.ts +4092 -387
  82. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  83. package/dist/apps/data/routes/funding.js +1403 -256
  84. package/dist/apps/data/routes/funding.js.map +1 -1
  85. package/dist/apps/data/routes/indexer.d.ts +30 -30
  86. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  87. package/dist/apps/data/routes/indexer.js +19 -2
  88. package/dist/apps/data/routes/indexer.js.map +1 -1
  89. package/dist/apps/data/routes/receipts.d.ts +263 -263
  90. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  91. package/dist/apps/data/routes/receipts.js +11 -11
  92. package/dist/apps/data/routes/receipts.js.map +1 -1
  93. package/dist/apps/data/routes/rpc.d.ts +5 -5
  94. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  95. package/dist/apps/data/routes/rpc.js +211 -22
  96. package/dist/apps/data/routes/rpc.js.map +1 -1
  97. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  98. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  99. package/dist/apps/data/routes/tokenlist.js +39 -8
  100. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  101. package/dist/apps/data/routes/tokens.d.ts +114 -86
  102. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokens.js +194 -91
  104. package/dist/apps/data/routes/tokens.js.map +1 -1
  105. package/dist/apps/data/routes/transactions.d.ts +53 -53
  106. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  107. package/dist/apps/data/routes/transactions.js +78 -39
  108. package/dist/apps/data/routes/transactions.js.map +1 -1
  109. package/dist/apps/data/routes/transfers.d.ts +76 -27
  110. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transfers.js +165 -67
  112. package/dist/apps/data/routes/transfers.js.map +1 -1
  113. package/dist/apps/data/routes/valuation.d.ts +42 -42
  114. package/dist/apps/data/routes/valuation.js +2 -2
  115. package/dist/apps/data/routes/valuation.js.map +1 -1
  116. package/dist/apps/data/routes/webhooks.d.ts +369 -367
  117. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  118. package/dist/apps/data/routes/webhooks.js +161 -59
  119. package/dist/apps/data/routes/webhooks.js.map +1 -1
  120. package/dist/apps/data/routes/zones.d.ts +281 -0
  121. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  122. package/dist/apps/data/routes/zones.js +252 -0
  123. package/dist/apps/data/routes/zones.js.map +1 -0
  124. package/dist/apps/docs/reference.js +6 -5
  125. package/dist/apps/docs/reference.js.map +1 -1
  126. package/dist/apps/index.d.ts +2 -1
  127. package/dist/apps/index.d.ts.map +1 -1
  128. package/dist/apps/index.js +2 -1
  129. package/dist/apps/index.js.map +1 -1
  130. package/dist/apps/management/App.d.ts +670 -670
  131. package/dist/apps/management/Billing.d.ts +8 -0
  132. package/dist/apps/management/Billing.d.ts.map +1 -1
  133. package/dist/apps/management/Billing.js +12 -0
  134. package/dist/apps/management/Billing.js.map +1 -1
  135. package/dist/apps/management/Error.d.ts +12 -0
  136. package/dist/apps/management/Error.d.ts.map +1 -0
  137. package/dist/apps/management/Error.js +10 -0
  138. package/dist/apps/management/Error.js.map +1 -0
  139. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  140. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  141. package/dist/apps/management/routes/api-keys.js +2 -8
  142. package/dist/apps/management/routes/api-keys.js.map +1 -1
  143. package/dist/apps/management/routes/billing.d.ts +119 -119
  144. package/dist/apps/management/routes/faucet.d.ts +2 -2
  145. package/dist/apps/management/routes/invitations.d.ts +62 -62
  146. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  147. package/dist/apps/management/routes/invitations.js +4 -10
  148. package/dist/apps/management/routes/invitations.js.map +1 -1
  149. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  150. package/dist/apps/management/routes/me.d.ts +6 -6
  151. package/dist/apps/management/routes/members.d.ts +2 -2
  152. package/dist/apps/management/routes/orgs.d.ts +48 -48
  153. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  154. package/dist/apps/management/routes/orgs.js +2 -8
  155. package/dist/apps/management/routes/orgs.js.map +1 -1
  156. package/dist/apps/management/routes/projects.d.ts +9 -9
  157. package/dist/apps/management/routes/scopes.js +2 -2
  158. package/dist/apps/management/routes/scopes.js.map +1 -1
  159. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  160. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  161. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  162. package/dist/apps/management/routes/webhooks.js +15 -3
  163. package/dist/apps/management/routes/webhooks.js.map +1 -1
  164. package/dist/apps/mpp/App.d.ts +55 -56
  165. package/dist/apps/mpp/App.d.ts.map +1 -1
  166. package/dist/apps/mpp/App.js +192 -27
  167. package/dist/apps/mpp/App.js.map +1 -1
  168. package/dist/apps/mpp/Mpp.d.ts +0 -20
  169. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  170. package/dist/apps/mpp/Mpp.js +0 -24
  171. package/dist/apps/mpp/Mpp.js.map +1 -1
  172. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  173. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  174. package/dist/apps/mpp/internal/Adapter.js +66 -0
  175. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  176. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  177. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  178. package/dist/apps/mpp/internal/Error.js +41 -0
  179. package/dist/apps/mpp/internal/Error.js.map +1 -0
  180. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  181. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  182. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  183. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  184. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  185. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  186. package/dist/apps/mpp/internal/Policy.js +57 -0
  187. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  188. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  189. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  190. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  191. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  192. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  193. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  194. package/dist/apps/mpp/internal/Screening.js +20 -0
  195. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  196. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  197. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  198. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  199. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  200. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  201. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  202. package/dist/apps/mpp/internal/Utils.js +24 -0
  203. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  204. package/dist/apps/relay/App.js +183 -23
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  208. package/dist/apps/relay/Sponsorships.js +15 -6
  209. package/dist/apps/relay/Sponsorships.js.map +1 -1
  210. package/dist/db/Db.d.ts +20 -0
  211. package/dist/db/Db.d.ts.map +1 -1
  212. package/dist/db/Db.js +342 -0
  213. package/dist/db/Db.js.map +1 -1
  214. package/dist/db/Schema.d.ts +921 -1
  215. package/dist/db/Schema.d.ts.map +1 -1
  216. package/dist/db/Schema.js +269 -1
  217. package/dist/db/Schema.js.map +1 -1
  218. package/dist/db/tables/earnVaults.d.ts +68 -0
  219. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  220. package/dist/db/tables/earnVaults.js +72 -0
  221. package/dist/db/tables/earnVaults.js.map +1 -0
  222. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  223. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  224. package/dist/db/tables/fundingCatalog.js +85 -0
  225. package/dist/db/tables/fundingCatalog.js.map +1 -0
  226. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  227. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  228. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  229. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  230. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  231. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  232. package/dist/db/tables/fundingDeposits.js +100 -0
  233. package/dist/db/tables/fundingDeposits.js.map +1 -0
  234. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  235. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  236. package/dist/db/tables/fundingIdempotency.js +103 -0
  237. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  238. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  239. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  240. package/dist/db/tables/fundingTransferEvents.js +18 -0
  241. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  242. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  243. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  244. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  245. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  246. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  247. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  248. package/dist/db/tables/fundingTransfers.js +89 -0
  249. package/dist/db/tables/fundingTransfers.js.map +1 -0
  250. package/dist/db/tables/organizations.d.ts +8 -0
  251. package/dist/db/tables/organizations.d.ts.map +1 -1
  252. package/dist/db/tables/organizations.js +16 -0
  253. package/dist/db/tables/organizations.js.map +1 -1
  254. package/dist/db/tables/projects.d.ts +8 -0
  255. package/dist/db/tables/projects.d.ts.map +1 -1
  256. package/dist/db/tables/projects.js +16 -0
  257. package/dist/db/tables/projects.js.map +1 -1
  258. package/dist/db/tables/requestUsage.d.ts +13 -0
  259. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  260. package/dist/db/tables/requestUsage.js +16 -0
  261. package/dist/db/tables/requestUsage.js.map +1 -1
  262. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  263. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  264. package/dist/db/tables/sponsoredTransactions.js +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  266. package/dist/db/tables/users.d.ts +8 -0
  267. package/dist/db/tables/users.d.ts.map +1 -1
  268. package/dist/db/tables/users.js +16 -0
  269. package/dist/db/tables/users.js.map +1 -1
  270. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  271. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  272. package/dist/db/tables/verifiedTokens.js +9 -7
  273. package/dist/db/tables/verifiedTokens.js.map +1 -1
  274. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  275. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  276. package/dist/db/tables/webhookSubscriptions.js +24 -3
  277. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  278. package/dist/handlers/relay.js +108 -108
  279. package/dist/handlers/relay.js.map +1 -1
  280. package/dist/internal/Auth.d.ts +26 -0
  281. package/dist/internal/Auth.d.ts.map +1 -1
  282. package/dist/internal/Auth.js +35 -2
  283. package/dist/internal/Auth.js.map +1 -1
  284. package/dist/internal/Cache.d.ts.map +1 -1
  285. package/dist/internal/Cache.js +16 -10
  286. package/dist/internal/Cache.js.map +1 -1
  287. package/dist/internal/Cursor.js +1 -1
  288. package/dist/internal/Cursor.js.map +1 -1
  289. package/dist/internal/EarnRates.d.ts +89 -0
  290. package/dist/internal/EarnRates.d.ts.map +1 -0
  291. package/dist/internal/EarnRates.js +266 -0
  292. package/dist/internal/EarnRates.js.map +1 -0
  293. package/dist/internal/EarnVaults.d.ts +171 -0
  294. package/dist/internal/EarnVaults.d.ts.map +1 -0
  295. package/dist/internal/EarnVaults.js +547 -0
  296. package/dist/internal/EarnVaults.js.map +1 -0
  297. package/dist/internal/EdgeCache.d.ts +8 -1
  298. package/dist/internal/EdgeCache.d.ts.map +1 -1
  299. package/dist/internal/EdgeCache.js +33 -7
  300. package/dist/internal/EdgeCache.js.map +1 -1
  301. package/dist/internal/Id.d.ts +11 -0
  302. package/dist/internal/Id.d.ts.map +1 -1
  303. package/dist/internal/Id.js +13 -0
  304. package/dist/internal/Id.js.map +1 -1
  305. package/dist/internal/Idempotency.d.ts +83 -0
  306. package/dist/internal/Idempotency.d.ts.map +1 -0
  307. package/dist/internal/Idempotency.js +113 -0
  308. package/dist/internal/Idempotency.js.map +1 -0
  309. package/dist/internal/Log.d.ts +64 -9
  310. package/dist/internal/Log.d.ts.map +1 -1
  311. package/dist/internal/Log.js +29 -7
  312. package/dist/internal/Log.js.map +1 -1
  313. package/dist/internal/MetricSink.d.ts.map +1 -1
  314. package/dist/internal/MetricSink.js +47 -1
  315. package/dist/internal/MetricSink.js.map +1 -1
  316. package/dist/internal/OpenApi.d.ts +1 -1
  317. package/dist/internal/OpenApi.d.ts.map +1 -1
  318. package/dist/internal/OpenApi.js +3 -0
  319. package/dist/internal/OpenApi.js.map +1 -1
  320. package/dist/internal/Provider.d.ts +14 -0
  321. package/dist/internal/Provider.d.ts.map +1 -0
  322. package/dist/internal/Provider.js +5 -0
  323. package/dist/internal/Provider.js.map +1 -0
  324. package/dist/internal/Schema.d.ts +6 -1
  325. package/dist/internal/Schema.d.ts.map +1 -1
  326. package/dist/internal/Schema.js +20 -11
  327. package/dist/internal/Schema.js.map +1 -1
  328. package/dist/internal/Store.d.ts +6 -0
  329. package/dist/internal/Store.d.ts.map +1 -1
  330. package/dist/internal/Store.js +35 -0
  331. package/dist/internal/Store.js.map +1 -1
  332. package/dist/internal/Tidx.d.ts +43 -24
  333. package/dist/internal/Tidx.d.ts.map +1 -1
  334. package/dist/internal/Tidx.js +79 -11
  335. package/dist/internal/Tidx.js.map +1 -1
  336. package/dist/internal/Viem.d.ts +82 -65
  337. package/dist/internal/Viem.d.ts.map +1 -1
  338. package/dist/internal/Viem.js +83 -12
  339. package/dist/internal/Viem.js.map +1 -1
  340. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  341. package/dist/internal/WebhookDestination.js +34 -28
  342. package/dist/internal/WebhookDestination.js.map +1 -1
  343. package/dist/internal/Webhooks.d.ts +9 -0
  344. package/dist/internal/Webhooks.d.ts.map +1 -1
  345. package/dist/internal/Webhooks.js +15 -10
  346. package/dist/internal/Webhooks.js.map +1 -1
  347. package/dist/internal/exchange/Provider.d.ts +219 -0
  348. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  349. package/dist/internal/exchange/Provider.js +117 -0
  350. package/dist/internal/exchange/Provider.js.map +1 -0
  351. package/dist/internal/exchange/index.d.ts +2 -0
  352. package/dist/internal/exchange/index.d.ts.map +1 -0
  353. package/dist/internal/exchange/index.js +2 -0
  354. package/dist/internal/exchange/index.js.map +1 -0
  355. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  356. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  357. package/dist/internal/exchange/providers/uniswap.js +553 -0
  358. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  359. package/dist/internal/funding/Action.d.ts +55 -0
  360. package/dist/internal/funding/Action.d.ts.map +1 -0
  361. package/dist/internal/funding/Action.js +74 -0
  362. package/dist/internal/funding/Action.js.map +1 -0
  363. package/dist/internal/funding/Catalog.d.ts +107 -0
  364. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  365. package/dist/internal/funding/Catalog.js +270 -0
  366. package/dist/internal/funding/Catalog.js.map +1 -0
  367. package/dist/internal/funding/Chain.d.ts +76 -0
  368. package/dist/internal/funding/Chain.d.ts.map +1 -0
  369. package/dist/internal/funding/Chain.js +38 -0
  370. package/dist/internal/funding/Chain.js.map +1 -0
  371. package/dist/internal/funding/Deposit.d.ts +366 -0
  372. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  373. package/dist/internal/funding/Deposit.js +286 -0
  374. package/dist/internal/funding/Deposit.js.map +1 -0
  375. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  376. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  377. package/dist/internal/funding/DepositAddress.js +189 -0
  378. package/dist/internal/funding/DepositAddress.js.map +1 -0
  379. package/dist/internal/funding/Evidence.d.ts +52 -0
  380. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  381. package/dist/internal/funding/Evidence.js +314 -0
  382. package/dist/internal/funding/Evidence.js.map +1 -0
  383. package/dist/internal/funding/Provider.d.ts +1186 -0
  384. package/dist/internal/funding/Provider.d.ts.map +1 -0
  385. package/dist/internal/funding/Provider.js +1081 -0
  386. package/dist/internal/funding/Provider.js.map +1 -0
  387. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  388. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  389. package/dist/internal/funding/Reconciliation.js +676 -0
  390. package/dist/internal/funding/Reconciliation.js.map +1 -0
  391. package/dist/internal/funding/Route.d.ts +21 -0
  392. package/dist/internal/funding/Route.d.ts.map +1 -0
  393. package/dist/internal/funding/Route.js +5 -0
  394. package/dist/internal/funding/Route.js.map +1 -0
  395. package/dist/internal/funding/Subsidy.d.ts +113 -0
  396. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  397. package/dist/internal/funding/Subsidy.js +138 -0
  398. package/dist/internal/funding/Subsidy.js.map +1 -0
  399. package/dist/internal/funding/Token.d.ts +41 -0
  400. package/dist/internal/funding/Token.d.ts.map +1 -0
  401. package/dist/internal/funding/Token.js +22 -0
  402. package/dist/internal/funding/Token.js.map +1 -0
  403. package/dist/internal/funding/Transfer.d.ts +643 -0
  404. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  405. package/dist/internal/funding/Transfer.js +332 -0
  406. package/dist/internal/funding/Transfer.js.map +1 -0
  407. package/dist/internal/funding/index.d.ts +13 -0
  408. package/dist/internal/funding/index.d.ts.map +1 -0
  409. package/dist/internal/funding/index.js +13 -0
  410. package/dist/internal/funding/index.js.map +1 -0
  411. package/dist/internal/funding/providers/across.d.ts +21 -0
  412. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  413. package/dist/internal/funding/providers/across.js +117 -0
  414. package/dist/internal/funding/providers/across.js.map +1 -0
  415. package/dist/internal/funding/providers/relay.d.ts +46 -0
  416. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  417. package/dist/internal/funding/providers/relay.js +464 -0
  418. package/dist/internal/funding/providers/relay.js.map +1 -0
  419. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  420. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  421. package/dist/internal/funding/providers/rhino.js +116 -0
  422. package/dist/internal/funding/providers/rhino.js.map +1 -0
  423. package/dist/internal/funding/providers/squid.d.ts +19 -0
  424. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  425. package/dist/internal/funding/providers/squid.js +120 -0
  426. package/dist/internal/funding/providers/squid.js.map +1 -0
  427. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  428. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  429. package/dist/internal/funding/providers/symbiosis.js +176 -0
  430. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  431. package/dist/internal/index.d.ts +5 -1
  432. package/dist/internal/index.d.ts.map +1 -1
  433. package/dist/internal/index.js +5 -1
  434. package/dist/internal/index.js.map +1 -1
  435. package/dist/internal/webhookDestinations/url.js +61 -57
  436. package/dist/internal/webhookDestinations/url.js.map +1 -1
  437. package/dist/providers/index.d.ts +43 -0
  438. package/dist/providers/index.d.ts.map +1 -0
  439. package/dist/providers/index.js +19 -0
  440. package/dist/providers/index.js.map +1 -0
  441. package/package.json +9 -4
  442. package/src/ApiKeys.test.ts +11 -7
  443. package/src/ApiKeys.ts +37 -9
  444. package/src/App.test.ts +85 -10
  445. package/src/App.ts +224 -137
  446. package/src/Assets.ts +29 -4
  447. package/src/Client.test-d.ts +650 -30
  448. package/src/Scope.test.ts +19 -0
  449. package/src/Scope.ts +28 -11
  450. package/src/Webhooks.test.ts +25 -0
  451. package/src/Webhooks.ts +1 -1
  452. package/src/admin/App.test.ts +9 -2
  453. package/src/admin/App.ts +32 -9
  454. package/src/admin/apps/api-keys.test.ts +167 -23
  455. package/src/admin/apps/api-keys.ts +166 -28
  456. package/src/admin/apps/earn-vaults.test.ts +338 -0
  457. package/src/admin/apps/earn-vaults.ts +572 -0
  458. package/src/admin/apps/scopes.test.ts +16 -1
  459. package/src/admin/ui/plugin.ts +2 -2
  460. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  461. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  462. package/src/admin/ui/src/components/Page.tsx +1 -1
  463. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  464. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  465. package/src/admin/ui/src/lib/client.ts +1 -1
  466. package/src/admin/ui/src/lib/config.ts +1 -1
  467. package/src/admin/ui/src/lib/early-access.ts +8 -9
  468. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  469. package/src/admin/ui/src/lib/format.ts +13 -0
  470. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  471. package/src/admin/ui/src/lib/organizations.ts +7 -1
  472. package/src/admin/ui/src/lib/response.ts +22 -0
  473. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  474. package/src/admin/ui/src/lib/scopes.ts +28 -7
  475. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  476. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  477. package/src/admin/ui/src/router.tsx +2 -2
  478. package/src/admin/ui/src/routes/__root.tsx +9 -8
  479. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  480. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  481. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  482. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  483. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  484. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  485. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  486. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  487. package/src/admin/ui/vite.config.ts +4 -1
  488. package/src/admin/ui.generated.ts +113 -43
  489. package/src/analytics/Analytics.test.ts +69 -10
  490. package/src/analytics/Analytics.ts +20 -1
  491. package/src/analytics/tables/requestEvents.ts +79 -37
  492. package/src/apps/Zones.test.ts +33 -0
  493. package/src/apps/Zones.ts +40 -0
  494. package/src/apps/composition.test.ts +84 -1
  495. package/src/apps/data/App.test.ts +28 -11
  496. package/src/apps/data/App.ts +96 -33
  497. package/src/apps/data/FxOracle.ts +1 -1
  498. package/src/apps/data/index.ts +0 -1
  499. package/src/apps/data/routes/activities.test.ts +82 -6
  500. package/src/apps/data/routes/activities.ts +131 -71
  501. package/src/apps/data/routes/balances.test.ts +50 -37
  502. package/src/apps/data/routes/balances.ts +5 -5
  503. package/src/apps/data/routes/blocks.test.ts +2 -0
  504. package/src/apps/data/routes/coingecko.test.ts +22 -0
  505. package/src/apps/data/routes/coingecko.ts +84 -48
  506. package/src/apps/data/routes/earn.test.ts +1108 -0
  507. package/src/apps/data/routes/earn.ts +1391 -0
  508. package/src/apps/data/routes/exchanges.test.ts +82 -33
  509. package/src/apps/data/routes/exchanges.ts +842 -227
  510. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  511. package/src/apps/data/routes/fee-amm.ts +69 -12
  512. package/src/apps/data/routes/funding.test.ts +2712 -221
  513. package/src/apps/data/routes/funding.ts +1604 -387
  514. package/src/apps/data/routes/indexer.test.ts +43 -34
  515. package/src/apps/data/routes/indexer.ts +19 -2
  516. package/src/apps/data/routes/receipts.test.ts +5 -3
  517. package/src/apps/data/routes/receipts.ts +13 -11
  518. package/src/apps/data/routes/rpc.test.ts +446 -28
  519. package/src/apps/data/routes/rpc.ts +243 -25
  520. package/src/apps/data/routes/tokenlist.ts +72 -19
  521. package/src/apps/data/routes/tokens.ts +258 -86
  522. package/src/apps/data/routes/transactions.test.ts +2 -0
  523. package/src/apps/data/routes/transactions.ts +77 -42
  524. package/src/apps/data/routes/transfers.test.ts +166 -4
  525. package/src/apps/data/routes/transfers.ts +216 -78
  526. package/src/apps/data/routes/valuation.test.ts +62 -9
  527. package/src/apps/data/routes/valuation.ts +2 -2
  528. package/src/apps/data/routes/webhooks.test.ts +386 -43
  529. package/src/apps/data/routes/webhooks.ts +172 -71
  530. package/src/apps/data/routes/zones.test.ts +473 -0
  531. package/src/apps/data/routes/zones.ts +338 -0
  532. package/src/apps/docs/reference.ts +8 -6
  533. package/src/apps/index.ts +2 -1
  534. package/src/apps/management/Billing.test.ts +29 -0
  535. package/src/apps/management/Billing.ts +23 -0
  536. package/src/apps/management/Error.ts +12 -0
  537. package/src/apps/management/routes/api-keys.test.ts +5 -3
  538. package/src/apps/management/routes/api-keys.ts +2 -9
  539. package/src/apps/management/routes/invitations.ts +4 -11
  540. package/src/apps/management/routes/orgs.ts +2 -9
  541. package/src/apps/management/routes/scopes.test.ts +7 -2
  542. package/src/apps/management/routes/scopes.ts +2 -2
  543. package/src/apps/management/routes/webhooks.test.ts +6 -1
  544. package/src/apps/management/routes/webhooks.ts +15 -3
  545. package/src/apps/mpp/App.ts +276 -29
  546. package/src/apps/mpp/Mpp.test.ts +631 -26
  547. package/src/apps/mpp/Mpp.ts +0 -42
  548. package/src/apps/mpp/internal/Adapter.ts +108 -3
  549. package/src/apps/mpp/internal/Error.test.ts +33 -0
  550. package/src/apps/mpp/internal/Error.ts +44 -6
  551. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  552. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  553. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  554. package/src/apps/mpp/internal/Policy.ts +98 -0
  555. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  556. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  557. package/src/apps/mpp/internal/Screening.ts +40 -3
  558. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  559. package/src/apps/mpp/internal/Utils.ts +30 -0
  560. package/src/apps/relay/App.test.ts +493 -62
  561. package/src/apps/relay/App.ts +233 -23
  562. package/src/apps/relay/Sponsorships.test.ts +49 -0
  563. package/src/apps/relay/Sponsorships.ts +18 -6
  564. package/src/db/Db.ts +439 -0
  565. package/src/db/Schema.ts +325 -2
  566. package/src/db/tables/earnVaults.test.ts +185 -0
  567. package/src/db/tables/earnVaults.ts +151 -0
  568. package/src/db/tables/fundingCatalog.test.ts +108 -0
  569. package/src/db/tables/fundingCatalog.ts +157 -0
  570. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  571. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  572. package/src/db/tables/fundingDeposits.test.ts +261 -0
  573. package/src/db/tables/fundingDeposits.ts +229 -0
  574. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  575. package/src/db/tables/fundingIdempotency.ts +180 -0
  576. package/src/db/tables/fundingTransferEvents.ts +28 -0
  577. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  578. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  579. package/src/db/tables/fundingTransfers.test.ts +89 -0
  580. package/src/db/tables/fundingTransfers.ts +153 -0
  581. package/src/db/tables/organizations.ts +16 -0
  582. package/src/db/tables/projects.ts +16 -0
  583. package/src/db/tables/requestUsage.ts +23 -0
  584. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  585. package/src/db/tables/sponsoredTransactions.ts +3 -3
  586. package/src/db/tables/users.ts +16 -0
  587. package/src/db/tables/verifiedTokens.ts +19 -14
  588. package/src/db/tables/webhookSubscriptions.ts +58 -3
  589. package/src/handlers/relay.test.ts +2 -0
  590. package/src/handlers/relay.ts +95 -99
  591. package/src/internal/Auth.test.ts +48 -0
  592. package/src/internal/Auth.ts +61 -2
  593. package/src/internal/Cache.ts +13 -9
  594. package/src/internal/Cursor.test.ts +2 -2
  595. package/src/internal/Cursor.ts +1 -1
  596. package/src/internal/EarnRates.test.ts +125 -0
  597. package/src/internal/EarnRates.ts +409 -0
  598. package/src/internal/EarnVaults.test.ts +195 -0
  599. package/src/internal/EarnVaults.ts +876 -0
  600. package/src/internal/EdgeCache.test.ts +19 -0
  601. package/src/internal/EdgeCache.ts +35 -5
  602. package/src/internal/Id.ts +14 -0
  603. package/src/internal/Idempotency.test.ts +109 -0
  604. package/src/internal/Idempotency.ts +237 -0
  605. package/src/internal/Log.test-d.ts +41 -8
  606. package/src/internal/Log.test.ts +189 -8
  607. package/src/internal/Log.ts +124 -17
  608. package/src/internal/MetricSink.test.ts +244 -4
  609. package/src/internal/MetricSink.ts +51 -1
  610. package/src/internal/OpenApi.ts +3 -0
  611. package/src/internal/Provider.test.ts +17 -0
  612. package/src/internal/Provider.ts +17 -0
  613. package/src/internal/Schema.ts +27 -17
  614. package/src/internal/Store.test.ts +25 -0
  615. package/src/internal/Store.ts +46 -0
  616. package/src/internal/Tidx.local.test.ts +78 -3
  617. package/src/internal/Tidx.test.ts +212 -18
  618. package/src/internal/Tidx.ts +112 -32
  619. package/src/internal/VerifiedTokens.test.ts +15 -0
  620. package/src/internal/Viem.test.ts +170 -17
  621. package/src/internal/Viem.ts +111 -28
  622. package/src/internal/WebhookDestination.ts +25 -23
  623. package/src/internal/Webhooks.test.ts +59 -0
  624. package/src/internal/Webhooks.ts +34 -10
  625. package/src/internal/exchange/Provider.test.ts +216 -0
  626. package/src/internal/exchange/Provider.ts +326 -0
  627. package/src/internal/exchange/index.test.ts +6 -0
  628. package/src/internal/exchange/index.ts +1 -0
  629. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  630. package/src/internal/exchange/providers/uniswap.ts +682 -0
  631. package/src/internal/funding/Action.test.ts +138 -0
  632. package/src/internal/funding/Action.ts +117 -0
  633. package/src/internal/funding/Catalog.test.ts +311 -0
  634. package/src/internal/funding/Catalog.ts +347 -0
  635. package/src/internal/funding/Chain.test.ts +79 -0
  636. package/src/internal/funding/Chain.ts +120 -0
  637. package/src/internal/funding/Deposit.test.ts +26 -0
  638. package/src/internal/funding/Deposit.ts +453 -0
  639. package/src/internal/funding/DepositAddress.test.ts +18 -0
  640. package/src/internal/funding/DepositAddress.ts +312 -0
  641. package/src/internal/funding/Evidence.test.ts +297 -0
  642. package/src/internal/funding/Evidence.ts +430 -0
  643. package/src/internal/funding/Provider.test.ts +1328 -0
  644. package/src/internal/funding/Provider.ts +1796 -0
  645. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  646. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  647. package/src/internal/funding/Reconciliation.ts +930 -0
  648. package/src/internal/funding/Route.test.ts +66 -0
  649. package/src/internal/funding/Route.ts +29 -0
  650. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  651. package/src/internal/funding/Subsidy.test.ts +75 -0
  652. package/src/internal/funding/Subsidy.ts +260 -0
  653. package/src/internal/funding/Token.test.ts +47 -0
  654. package/src/internal/funding/Token.ts +59 -0
  655. package/src/internal/funding/Transfer.test.ts +369 -0
  656. package/src/internal/funding/Transfer.ts +522 -0
  657. package/src/internal/funding/index.test.ts +20 -0
  658. package/src/internal/funding/index.ts +12 -0
  659. package/src/internal/funding/providers/across.ts +149 -0
  660. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  661. package/src/internal/funding/providers/relay.test.ts +474 -0
  662. package/src/internal/funding/providers/relay.ts +559 -0
  663. package/src/internal/funding/providers/rhino.ts +139 -0
  664. package/src/internal/funding/providers/squid.ts +151 -0
  665. package/src/internal/funding/providers/symbiosis.ts +221 -0
  666. package/src/internal/index.test.ts +5 -1
  667. package/src/internal/index.ts +5 -1
  668. package/src/internal/webhookDestinations/url.ts +49 -45
  669. package/src/providers/index.test.ts +14 -0
  670. package/src/providers/index.ts +54 -0
  671. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  672. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  673. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  674. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  675. package/dist/internal/FundingQuotes.d.ts +0 -864
  676. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  677. package/dist/internal/FundingQuotes.js +0 -672
  678. package/dist/internal/FundingQuotes.js.map +0 -1
  679. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  680. package/src/internal/FundingQuotes.test.ts +0 -456
  681. package/src/internal/FundingQuotes.ts +0 -944
@@ -0,0 +1,409 @@
1
+ import type { Address } from 'viem'
2
+ import * as z from 'zod/mini'
3
+
4
+ import * as Schema from './Schema.js'
5
+ import * as Store from './Store.js'
6
+ import type * as Tidx from './Tidx.js'
7
+ import * as Ttl from './Ttl.js'
8
+ import * as Value from './Value.js'
9
+ import type * as Viem from './Viem.js'
10
+
11
+ const migratedSignature =
12
+ 'event EngineMigrated(address indexed oldEngine,address indexed newEngine,uint256 oldEngineShares,uint256 assetsMoved,uint256 newEngineShares,uint256 totalEarnShares,uint256 anchorEngineShares,uint256 anchorEarnShares)'
13
+
14
+ /** Identifier of the rate calculation, versioned so a change is visible to callers. */
15
+ const methodology = 'share-price-growth-annualized:v1' as const
16
+
17
+ /** Width of the UTC bucket every measurement is anchored to. */
18
+ const bucketWidth = Ttl.minutes(15)
19
+
20
+ /** Withheld from the anchor so an unconfirmed head block cannot move a boundary. */
21
+ const confirmationDelay = Ttl.seconds(30)
22
+
23
+ /** Default window, used when the caller does not select one. */
24
+ const defaultWindow = '7d'
25
+
26
+ /**
27
+ * Selectable measurement windows. A closed set bounds both the rate cache and
28
+ * the historical read volume: every distinct window is its own cache entry and
29
+ * its own pair of boundary reads.
30
+ */
31
+ const windows = ['1h', '1d', '7d', '30d'] as const
32
+
33
+ /** Length of every selectable window in whole hours. */
34
+ const windowHours = {
35
+ '1h': 1,
36
+ '1d': 24,
37
+ '7d': 24 * 7,
38
+ '30d': 24 * 30,
39
+ } as const satisfies Record<Window, number>
40
+
41
+ /** Longest selectable window, which also bounds the migration scan. */
42
+ const maxWindowHours = Math.max(...Object.values(windowHours))
43
+
44
+ /**
45
+ * Row cap on the migration scan. Engine migrations are rare, so a scan that
46
+ * fills the cap cannot be trusted to be complete and resets every window.
47
+ */
48
+ const migrationScanLimit = 500
49
+
50
+ /** Decimal places of the returned ratio, matching the API's value precision. */
51
+ const netPrecision = 6
52
+
53
+ /** `Number.toFixed` switches to exponential notation here, which the ratio contract forbids. */
54
+ const netCeiling = 1e21
55
+
56
+ /**
57
+ * Shares quoted at both boundaries. Large so the assets-per-share ratio is not
58
+ * quantized by asset base units; the amount cancels in the ratio.
59
+ */
60
+ const quotedShares = 10n ** 18n
61
+
62
+ const secondsPerYear = 365 * 24 * 60 * 60
63
+
64
+ /** Zod schemas owned by the Earn rate resolver. */
65
+ export namespace schema {
66
+ /** Annualized share-price growth over one measurement window. */
67
+ export const Apy = z
68
+ .strictObject({
69
+ asOf: z.iso
70
+ .datetime()
71
+ .check(
72
+ z.describe('UTC instant the rate was measured to, rounded to a 15-minute bucket.'),
73
+ z.meta({ examples: ['2026-07-21T09:00:00.000Z'] }),
74
+ ),
75
+ methodology: z
76
+ .literal(methodology)
77
+ .check(
78
+ z.describe('Identifier of the calculation that produced this rate.'),
79
+ z.meta({ examples: [methodology] }),
80
+ ),
81
+ net: z
82
+ .string()
83
+ .check(
84
+ z.regex(/^-?\d+(\.\d+)?$/),
85
+ z.describe('Annualized fee-aware share-price growth, as a decimal ratio.'),
86
+ z.meta({ examples: ['0.041200'] }),
87
+ ),
88
+ window: z
89
+ .enum(windows)
90
+ .check(z.describe('Window this rate covers.'), z.meta({ examples: [defaultWindow] })),
91
+ })
92
+ .check(z.describe('Annualized share-price growth over one measurement window.'))
93
+
94
+ /**
95
+ * Measurement window selected by a request. Stays absent when omitted so a
96
+ * caller who never asked for a rate is distinguishable from one who selected
97
+ * the default window.
98
+ */
99
+ export const Window = z
100
+ .optional(z.enum(windows))
101
+ .check(
102
+ z.describe(
103
+ 'Rate measurement window. Selecting a window includes `apy`, which measures `7d` on its own.',
104
+ ),
105
+ z.meta({ examples: [defaultWindow] }),
106
+ )
107
+ }
108
+
109
+ /** Annualized share-price growth over one measurement window. */
110
+ export type Apy = z.output<typeof schema.Apy>
111
+
112
+ /** Selectable rate measurement window. */
113
+ export type Window = (typeof windows)[number]
114
+
115
+ /** Returns the confirmed 15-minute UTC bucket rates are measured to. */
116
+ export function asOf(): string {
117
+ const anchor = Math.floor((Date.now() - confirmationDelay) / bucketWidth) * bucketWidth
118
+ return new Date(anchor).toISOString()
119
+ }
120
+
121
+ /**
122
+ * Resolves the annualized rate of every vault on a page, keyed by lowercase
123
+ * vault address. A vault maps to `null` when its rate cannot be measured.
124
+ */
125
+ export async function resolve(options: resolve.Options): Promise<Map<string, Apy | null>> {
126
+ const { chainId, store } = options
127
+ const window = options.window ?? defaultWindow
128
+ const vaults = [...new Set(options.vaults.map((vault) => Schema.Address.parse(vault)))]
129
+ if (vaults.length === 0) return new Map()
130
+
131
+ const measuredAt = asOf()
132
+ let pending: Promise<Measurement | undefined> | undefined
133
+ // Boundary blocks, the migration scan, and both quote batches load once per
134
+ // page, and only when a vault misses its cached rate. Rate enrichment never
135
+ // fails a page, so an unreadable window leaves every vault unmeasured.
136
+ const measure = () =>
137
+ (pending ??= measurePage({ ...options, measuredAt, vaults, window }).catch(() => undefined))
138
+
139
+ const entries = await Promise.all(
140
+ vaults.map(async (vault) => {
141
+ const apy = await Store.memoize(
142
+ async () => {
143
+ const measured = await measure()
144
+ const net = measured?.rates.get(vault)
145
+ if (net === undefined || measured === undefined) return null
146
+ // Labelled with the boundaries' own instant: cached boundaries can
147
+ // predate this request's bucket, and the label must match the prices.
148
+ return { asOf: measured.measuredAt, methodology, net, window }
149
+ },
150
+ {
151
+ // Keyed without the bucket so the entry is revisited and lazily
152
+ // evicted; `fx:v1:<oracle>` sets the same stable-key precedent. The
153
+ // cached value keeps the `asOf` it was measured at.
154
+ key: `earn-apy:v1:${chainId}:${vault}:${window}`,
155
+ store,
156
+ ttl: bucketWidth,
157
+ },
158
+ )
159
+ return [vault, apy] as const
160
+ }),
161
+ )
162
+ return new Map(entries)
163
+ }
164
+
165
+ export declare namespace resolve {
166
+ /** Options for resolving a page of Earn vault rates. */
167
+ type Options = {
168
+ /** Chain containing the vaults. */
169
+ chainId: number
170
+ /** Resolves the RPC client used for historical share-price quotes. */
171
+ getClient: Viem.GetClient
172
+ /** Resolves the indexer client used for block and migration history. */
173
+ getTidx: Tidx.GetClient
174
+ /** Cache backing measured rates. */
175
+ store: Store.Store
176
+ /** Vault addresses appearing on the page. */
177
+ vaults: readonly Address[]
178
+ /** Canonical measurement window, defaulting to `7d`. */
179
+ window?: Window | undefined
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Annualizes share-price growth between two measured boundaries. Returns `null`
185
+ * for a degenerate window, a zero starting price, or growth too extreme to
186
+ * express as a decimal ratio.
187
+ */
188
+ export function annualize(options: annualize.Options): string | null {
189
+ const { end, start } = options
190
+ const elapsed = end.timestamp - start.timestamp
191
+ if (elapsed <= 0 || start.price <= 0n) return null
192
+ const net = (Number(end.price) / Number(start.price)) ** (secondsPerYear / elapsed) - 1
193
+ if (!Number.isFinite(net) || Math.abs(net) >= netCeiling) return null
194
+ return net.toFixed(netPrecision)
195
+ }
196
+
197
+ export declare namespace annualize {
198
+ /** One measured boundary of the window. */
199
+ type Boundary = {
200
+ /** Assets quoted for the shared share amount, in asset base units. */
201
+ price: bigint
202
+ /** Block timestamp, in seconds. */
203
+ timestamp: number
204
+ }
205
+
206
+ /** Options for annualizing measured share-price growth. */
207
+ type Options = {
208
+ /** Newer boundary of the window. */
209
+ end: Boundary
210
+ /** Older boundary of the window. */
211
+ start: Boundary
212
+ }
213
+ }
214
+
215
+ type Block = {
216
+ number: bigint
217
+ timestamp: number
218
+ }
219
+
220
+ type Boundaries = {
221
+ end: Block
222
+ /** Instant these boundaries were resolved for, which may predate the caller's. */
223
+ measuredAt: string
224
+ start: Block
225
+ }
226
+
227
+ type Migration = {
228
+ blockNumber: bigint
229
+ vault: string
230
+ }
231
+
232
+ async function measurePage(options: measurePage.Options): Promise<Measurement | undefined> {
233
+ const endAt = Date.parse(options.measuredAt)
234
+ const boundaries = await boundaryBlocks({
235
+ ...options,
236
+ endAt,
237
+ startAt: endAt - windowHours[options.window] * Ttl.hour(1),
238
+ })
239
+ if (!boundaries) return undefined
240
+ const { end, measuredAt, start } = boundaries
241
+
242
+ const client = options.getClient(options.chainId)
243
+ const quote = (blockNumber: bigint, vault: Address) =>
244
+ client.earn.getRedeemQuote({ blockNumber, shareAmount: quotedShares, vault }).then(
245
+ (price) => price,
246
+ () => undefined,
247
+ )
248
+
249
+ const rates = new Map<string, string>()
250
+ await Promise.all(
251
+ options.vaults.map(async (vault) => {
252
+ // Concurrent quotes collapse into one deployless multicall per block.
253
+ const [startPrice, endPrice] = await Promise.all([
254
+ quote(start.number, vault),
255
+ quote(end.number, vault),
256
+ ])
257
+ if (startPrice === undefined || endPrice === undefined) return
258
+ const net = annualize({
259
+ end: { price: endPrice, timestamp: end.timestamp },
260
+ start: { price: startPrice, timestamp: start.timestamp },
261
+ })
262
+ if (net !== null) rates.set(vault, net)
263
+ }),
264
+ )
265
+ if (rates.size === 0) return { measuredAt, rates }
266
+
267
+ // A migration inside the window bridges two different yield engines, so the
268
+ // window resets instead of reporting growth across the swap. Scanned only
269
+ // once a rate exists for it to invalidate.
270
+ const migrations = await recentMigrations(options)
271
+ if (!migrations) return undefined
272
+ for (const { blockNumber, vault } of migrations)
273
+ if (blockNumber > start.number && blockNumber <= end.number) rates.delete(vault)
274
+ return { measuredAt, rates }
275
+ }
276
+
277
+ /** Rates for one page, labelled with the instant their prices were read at. */
278
+ type Measurement = {
279
+ measuredAt: string
280
+ rates: ReadonlyMap<string, string>
281
+ }
282
+
283
+ declare namespace measurePage {
284
+ type Options = resolve.Options & {
285
+ /** Anchor instant the window ends at. */
286
+ measuredAt: string
287
+ /** Canonical measurement window, resolved from the request or the default. */
288
+ window: Window
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Resolves the last indexed block at or before each end of the window. Returns
294
+ * undefined when either boundary is missing, both land on one block, or the
295
+ * indexer lags a boundary.
296
+ */
297
+ async function boundaryBlocks(options: boundaryBlocks.Options): Promise<Boundaries | undefined> {
298
+ const { chainId, endAt, startAt, window } = options
299
+ const endInstant = new Date(endAt).toISOString()
300
+ const startInstant = new Date(startAt).toISOString()
301
+ const measured = await Store.memoize(
302
+ async () => {
303
+ // `blocks` indexes every block, empty ones included, so the last row at or
304
+ // before an instant is the exact boundary. Both boundaries share one
305
+ // request because the indexer sheds load by request count, not rows read.
306
+ const result = await options.getTidx(chainId).fetch({
307
+ chainId,
308
+ query: `
309
+ (SELECT num, timestamp FROM blocks WHERE timestamp <= '${endInstant}' ORDER BY num DESC LIMIT 1)
310
+ UNION ALL
311
+ (SELECT num, timestamp FROM blocks WHERE timestamp <= '${startInstant}' ORDER BY num DESC LIMIT 1)
312
+ ` as string,
313
+ })
314
+ const rows = result.rows.flatMap((row) => {
315
+ const number = Value.toIntegerString(row['num'])
316
+ const timestamp = Value.toIsoDateTime(row['timestamp'])
317
+ return number === undefined || timestamp === undefined
318
+ ? []
319
+ : [{ number, timestamp: Math.floor(Date.parse(timestamp) / 1000) }]
320
+ })
321
+ // The instants travel with the rows so a hit from an earlier bucket is
322
+ // judged, and labelled, against the instants it was resolved for.
323
+ return { endAt, rows, startAt }
324
+ },
325
+ {
326
+ key: `earn-apy:v1:${chainId}:blocks:${window}`,
327
+ store: options.store,
328
+ ttl: bucketWidth,
329
+ },
330
+ )
331
+
332
+ // The window start precedes indexed history whenever a boundary is missing;
333
+ // the newer boundary always resolves once the older one does.
334
+ const [end, start] = [...measured.rows].sort((a, b) =>
335
+ BigInt(a.number) < BigInt(b.number) ? 1 : -1,
336
+ )
337
+ if (!end || !start || end.number === start.number) return undefined
338
+ // A boundary further behind its instant than one bucket means the indexer is
339
+ // lagging, and the measured elapsed time would not match the window.
340
+ if (measured.endAt - end.timestamp * 1000 > bucketWidth) return undefined
341
+ if (measured.startAt - start.timestamp * 1000 > bucketWidth) return undefined
342
+ return {
343
+ end: { number: BigInt(end.number), timestamp: end.timestamp },
344
+ measuredAt: new Date(measured.endAt).toISOString(),
345
+ start: { number: BigInt(start.number), timestamp: start.timestamp },
346
+ }
347
+ }
348
+
349
+ declare namespace boundaryBlocks {
350
+ type Options = Pick<resolve.Options, 'chainId' | 'getTidx' | 'store'> & {
351
+ /** Instant the window ends at, in milliseconds. */
352
+ endAt: number
353
+ /** Instant the window starts at, in milliseconds. */
354
+ startAt: number
355
+ /** Window these boundaries span, used as the cache identity. */
356
+ window: Window
357
+ }
358
+ }
359
+
360
+ /**
361
+ * Engine migrations indexed over the longest selectable window, so one scan
362
+ * serves every window and page anchored to the same instant. Returns undefined
363
+ * when the scan filled its row cap and a migration may be missing.
364
+ */
365
+ async function recentMigrations(
366
+ options: recentMigrations.Options,
367
+ ): Promise<readonly Migration[] | undefined> {
368
+ const { chainId, measuredAt } = options
369
+ // One bucket of slack because this scan and the boundaries expire
370
+ // independently; scanning further back only resets more windows.
371
+ const since = new Date(
372
+ Date.parse(measuredAt) - maxWindowHours * Ttl.hour(1) - bucketWidth,
373
+ ).toISOString()
374
+ const migrations = await Store.memoize(
375
+ async () => {
376
+ // The emitting `address` is the vault; page and window filtering happens
377
+ // on the scanned rows so this stays one query per anchor.
378
+ const result = await options.getTidx(chainId).fetch({
379
+ chainId,
380
+ query: `
381
+ SELECT address, block_num
382
+ FROM EngineMigrated
383
+ WHERE block_timestamp > '${since}' AND block_timestamp <= '${measuredAt}'
384
+ ORDER BY block_num DESC
385
+ LIMIT ${migrationScanLimit + 1}
386
+ ` as string,
387
+ signatures: [migratedSignature],
388
+ })
389
+ const rows: readonly Record<string, unknown>[] = result.rows
390
+ if (rows.length > migrationScanLimit) return null
391
+ return rows.flatMap((row) => {
392
+ const blockNumber = Value.toIntegerString(row['block_num'])
393
+ const vault = Value.toText(row['address'])
394
+ return blockNumber && vault ? [{ blockNumber, vault: vault.toLowerCase() }] : []
395
+ })
396
+ },
397
+ {
398
+ key: `earn-apy:v1:${chainId}:migrations`,
399
+ store: options.store,
400
+ ttl: bucketWidth,
401
+ },
402
+ )
403
+ if (!migrations) return undefined
404
+ return migrations.map(({ blockNumber, vault }) => ({ blockNumber: BigInt(blockNumber), vault }))
405
+ }
406
+
407
+ declare namespace recentMigrations {
408
+ type Options = Pick<measurePage.Options, 'chainId' | 'getTidx' | 'measuredAt' | 'store'>
409
+ }
@@ -0,0 +1,195 @@
1
+ import { parseAbi } from 'viem'
2
+ import { tempoTestnet } from 'viem/tempo/chains'
3
+
4
+ import * as Runtime from '../../test/runtime.js'
5
+ import * as TestViem from '../../test/Viem.js'
6
+ import * as Zones from '../apps/Zones.js'
7
+ import * as EarnVaults from './EarnVaults.js'
8
+ import * as Viem from './Viem.js'
9
+
10
+ const vaultAddress = '0xF4ae63687d6753A78e7f551d2EDA1D0d31A5ea3A'
11
+
12
+ describe('schema.ResolveInput', () => {
13
+ test('normalizes the vault address', () => {
14
+ expect(
15
+ EarnVaults.schema.ResolveInput.parse({
16
+ chainId: tempoTestnet.id,
17
+ vaultAddress,
18
+ }),
19
+ ).toMatchInlineSnapshot(`
20
+ {
21
+ "chainId": 42431,
22
+ "vaultAddress": "0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a",
23
+ }
24
+ `)
25
+ })
26
+
27
+ test('rejects obsolete resolver fields', () => {
28
+ const result = EarnVaults.schema.ResolveInput.safeParse({
29
+ chainId: tempoTestnet.id,
30
+ vault: vaultAddress,
31
+ vaultAddress,
32
+ })
33
+ expect(result.error?.issues[0]).toMatchInlineSnapshot(`
34
+ {
35
+ "code": "unrecognized_keys",
36
+ "keys": [
37
+ "vault",
38
+ ],
39
+ "message": "Invalid input",
40
+ "path": [],
41
+ }
42
+ `)
43
+ })
44
+ })
45
+
46
+ describe('classifyEngineType', () => {
47
+ test('classifies supported capability fingerprints', () => {
48
+ expect([
49
+ EarnVaults.classifyEngineType({ asyncRedeem: false, inKindDeposit: true }),
50
+ EarnVaults.classifyEngineType({ asyncRedeem: true, inKindDeposit: false }),
51
+ ]).toMatchInlineSnapshot(`
52
+ [
53
+ "erc4626",
54
+ "veda",
55
+ ]
56
+ `)
57
+ })
58
+
59
+ test('leaves ambiguous capability fingerprints unknown', () => {
60
+ expect([
61
+ EarnVaults.classifyEngineType({ asyncRedeem: false, inKindDeposit: false }),
62
+ EarnVaults.classifyEngineType({ asyncRedeem: true, inKindDeposit: true }),
63
+ ]).toMatchInlineSnapshot(`
64
+ [
65
+ null,
66
+ null,
67
+ ]
68
+ `)
69
+ })
70
+ })
71
+
72
+ describe('resolve', () => {
73
+ test.runIf(Runtime.get().mode === 'testnet')(
74
+ 'reads the current Moderato Earn v1 vault',
75
+ async () => {
76
+ const getClient = Viem.createGetClient({
77
+ defaultChainId: tempoTestnet.id,
78
+ rpc: TestViem.rpc,
79
+ zones: [Zones.zoneE],
80
+ })
81
+ const { instantLiquidity, sharePrice, state, ...discovery } = await EarnVaults.resolve({
82
+ getClient,
83
+ input: {
84
+ chainId: tempoTestnet.id,
85
+ vaultAddress,
86
+ },
87
+ zones: [Zones.zoneE],
88
+ })
89
+ expect({
90
+ depositsPaused: state.depositsPaused,
91
+ feesActive: state.feesActive,
92
+ isAccountingAligned: state.isAccountingAligned,
93
+ openRedeemRequestCount: state.openRedeemRequestCount,
94
+ pricedPerShare: sharePrice !== null && BigInt(sharePrice) > 0n,
95
+ }).toMatchInlineSnapshot(`
96
+ {
97
+ "depositsPaused": false,
98
+ "feesActive": true,
99
+ "isAccountingAligned": true,
100
+ "openRedeemRequestCount": 0,
101
+ "pricedPerShare": true,
102
+ }
103
+ `)
104
+
105
+ expect(discovery).toMatchInlineSnapshot(`
106
+ {
107
+ "access": {
108
+ "status": "allowlisted",
109
+ },
110
+ "assetToken": {
111
+ "address": "0x20c000000000000000000000ff04042ee92fd449",
112
+ "currency": "USD",
113
+ "decimals": 6,
114
+ "name": "Bridge Test PATHUSD",
115
+ "symbol": "btPATHUSD",
116
+ },
117
+ "capabilities": {
118
+ "asyncRedeem": false,
119
+ "boundedRedeem": true,
120
+ "deposit": true,
121
+ "exactWithdraw": true,
122
+ "inKindDeposit": true,
123
+ "privateRouting": false,
124
+ "redeem": true,
125
+ "routerSwaps": false,
126
+ },
127
+ "chainId": 42431,
128
+ "engine": {
129
+ "address": "0xd85fc943333a6cd7c0e3391acd54fc4e572f0baf",
130
+ "type": "erc4626",
131
+ "venue": "0xa8b4f0e69cd4b0e56b676343f02acd8c3b355322",
132
+ },
133
+ "shareToken": {
134
+ "address": "0x20c0000000000000000000006d04bb298da7edb2",
135
+ "currency": "USD",
136
+ "decimals": 6,
137
+ "name": "Tempo Earn Live Vault (Earn)",
138
+ "symbol": "teLIVEE",
139
+ },
140
+ "vaultAddress": "0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a",
141
+ }
142
+ `)
143
+
144
+ // Instant liquidity mirrors the venue's own withdrawal limit capped at the
145
+ // vault's backing, never a restatement of `state.totalAssets`. The pinned
146
+ // venue exposes no limit view, so the field stays null here.
147
+ const venue = discovery.engine.venue
148
+ expect(venue).not.toBeNull()
149
+ if (!venue) return
150
+ const withdrawable = await getClient(tempoTestnet.id)
151
+ .readContract({
152
+ abi: parseAbi(['function maxWithdraw(address owner) view returns (uint256)']),
153
+ address: venue,
154
+ args: [discovery.engine.address],
155
+ functionName: 'maxWithdraw',
156
+ })
157
+ .catch(() => undefined)
158
+ const backing = BigInt(state.totalAssets)
159
+ expect([withdrawable === undefined, instantLiquidity]).toStrictEqual([
160
+ true,
161
+ withdrawable === undefined
162
+ ? null
163
+ : (withdrawable < backing ? withdrawable : backing).toString(),
164
+ ])
165
+ },
166
+ 60_000,
167
+ )
168
+
169
+ test.runIf(Runtime.get().mode === 'testnet')(
170
+ 'resolves the same vault without private routing',
171
+ async () => {
172
+ const discovery = await EarnVaults.resolve({
173
+ getClient: Viem.createGetClient({
174
+ defaultChainId: tempoTestnet.id,
175
+ rpc: TestViem.rpc,
176
+ }),
177
+ input: {
178
+ chainId: tempoTestnet.id,
179
+ vaultAddress,
180
+ },
181
+ zones: [],
182
+ })
183
+ expect({
184
+ privateRouting: discovery.capabilities.privateRouting,
185
+ routerSwaps: discovery.capabilities.routerSwaps,
186
+ }).toMatchInlineSnapshot(`
187
+ {
188
+ "privateRouting": false,
189
+ "routerSwaps": false,
190
+ }
191
+ `)
192
+ },
193
+ 60_000,
194
+ )
195
+ })