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,876 @@
1
+ import {
2
+ ContractFunctionExecutionError,
3
+ ContractFunctionRevertedError,
4
+ ContractFunctionZeroDataError,
5
+ isAddressEqual,
6
+ parseAbi,
7
+ } from 'viem'
8
+ import type { Address, Chain } from 'viem'
9
+ import { Abis, Addresses } from 'viem/tempo'
10
+ import * as z from 'zod/mini'
11
+
12
+ import * as Schema from './Schema.js'
13
+ import * as Viem from './Viem.js'
14
+
15
+ /** Zod schemas owned by the Earn vault resolver. */
16
+ export namespace schema {
17
+ const access = z
18
+ .strictObject({
19
+ status: z
20
+ .enum(['allowlisted', 'open'])
21
+ .check(z.describe('Vault share-token access status.'), z.meta({ examples: ['open'] })),
22
+ })
23
+ .check(z.describe('Vault share-token access.'))
24
+
25
+ const capabilities = z
26
+ .strictObject({
27
+ asyncRedeem: z
28
+ .boolean()
29
+ .check(
30
+ z.describe('Whether queued redemptions are supported.'),
31
+ z.meta({ examples: [false] }),
32
+ ),
33
+ boundedRedeem: z
34
+ .boolean()
35
+ .check(
36
+ z.describe('Whether redemption accepts a minimum asset bound.'),
37
+ z.meta({ examples: [true] }),
38
+ ),
39
+ deposit: z
40
+ .boolean()
41
+ .check(z.describe('Whether asset deposits are supported.'), z.meta({ examples: [true] })),
42
+ exactWithdraw: z
43
+ .boolean()
44
+ .check(
45
+ z.describe('Whether exact asset withdrawals are supported.'),
46
+ z.meta({ examples: [true] }),
47
+ ),
48
+ inKindDeposit: z
49
+ .boolean()
50
+ .check(
51
+ z.describe('Whether venue-share deposits are supported.'),
52
+ z.meta({ examples: [true] }),
53
+ ),
54
+ privateRouting: z
55
+ .boolean()
56
+ .check(z.describe('Whether private routing is supported.'), z.meta({ examples: [false] })),
57
+ redeem: z
58
+ .boolean()
59
+ .check(
60
+ z.describe('Whether immediate redemptions are supported.'),
61
+ z.meta({ examples: [true] }),
62
+ ),
63
+ routerSwaps: z
64
+ .boolean()
65
+ .check(
66
+ z.describe('Whether router token swaps are supported.'),
67
+ z.meta({ examples: [false] }),
68
+ ),
69
+ })
70
+ .check(z.describe('Actions supported by an Earn vault.'))
71
+
72
+ const engineType = z
73
+ .nullable(z.enum(['erc4626', 'veda']))
74
+ .check(
75
+ z.describe('Engine type inferred from supported actions.'),
76
+ z.meta({ examples: ['erc4626'] }),
77
+ )
78
+
79
+ const state = z
80
+ .strictObject({
81
+ depositsPaused: z
82
+ .boolean()
83
+ .check(z.describe('Whether new deposits are paused.'), z.meta({ examples: [false] })),
84
+ engineShares: Schema.DecimalString.check(
85
+ z.describe('Venue shares held for the vault.'),
86
+ z.meta({ examples: ['1000000'] }),
87
+ ),
88
+ feesActive: z
89
+ .boolean()
90
+ .check(
91
+ z.describe('Whether fees are configured and not emergency-disabled.'),
92
+ z.meta({ examples: [true] }),
93
+ ),
94
+ isAccountingAligned: z
95
+ .boolean()
96
+ .check(
97
+ z.describe('Whether Earn share supply matches its asset backing.'),
98
+ z.meta({ examples: [true] }),
99
+ ),
100
+ openRedeemRequestCount: z
101
+ .number()
102
+ .check(
103
+ z.int(),
104
+ z.nonnegative(),
105
+ z.describe('Queued redemptions still awaiting settlement.'),
106
+ z.meta({ examples: [0] }),
107
+ ),
108
+ totalAssets: Schema.DecimalString.check(
109
+ z.describe('Asset value of the active backing.'),
110
+ z.meta({ examples: ['1000000'] }),
111
+ ),
112
+ totalEarnShares: Schema.DecimalString.check(
113
+ z.describe('Active Earn share supply.'),
114
+ z.meta({ examples: ['1000000'] }),
115
+ ),
116
+ })
117
+ .check(z.describe('Live vault accounting state.'))
118
+
119
+ const metadata = z
120
+ .strictObject({
121
+ address: Schema.Address.check(
122
+ z.describe('Token contract address.'),
123
+ z.meta({ examples: ['0x20c000000000000000000000ff04042ee92fd449'] }),
124
+ ),
125
+ currency: z
126
+ .string()
127
+ .check(z.describe('Token display currency.'), z.meta({ examples: ['USD'] })),
128
+ decimals: z
129
+ .number()
130
+ .check(
131
+ z.int(),
132
+ z.nonnegative(),
133
+ z.maximum(255),
134
+ z.describe('Token decimal precision.'),
135
+ z.meta({ examples: [6] }),
136
+ ),
137
+ name: z
138
+ .string()
139
+ .check(
140
+ z.minLength(1),
141
+ z.describe('Token name.'),
142
+ z.meta({ examples: ['Bridge Test PATHUSD'] }),
143
+ ),
144
+ symbol: z
145
+ .string()
146
+ .check(z.minLength(1), z.describe('Token symbol.'), z.meta({ examples: ['btPATHUSD'] })),
147
+ })
148
+ .check(z.describe('Token address and metadata resolved onchain.'))
149
+
150
+ /** Schema selecting one onchain Earn vault. */
151
+ export const ResolveInput = z
152
+ .strictObject({
153
+ chainId: Schema.ChainId.check(
154
+ z.describe('Tempo chain id containing the vault.'),
155
+ z.meta({ examples: [42431] }),
156
+ ),
157
+ vaultAddress: Schema.Address.check(
158
+ z.describe('Earn vault contract address.'),
159
+ z.meta({ examples: ['0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a'] }),
160
+ ),
161
+ })
162
+ .check(z.describe('Onchain identity of an Earn vault.'))
163
+
164
+ /** Schema for live state resolved from one Earn vault. */
165
+ export const Discovery = z
166
+ .strictObject({
167
+ access: z.optional(access).check(z.describe('Vault share-token access, when requested.')),
168
+ assetToken: metadata,
169
+ capabilities: z
170
+ .optional(capabilities)
171
+ .check(z.describe('Actions supported by the vault, when requested.')),
172
+ chainId: Schema.ChainId.check(
173
+ z.describe('Tempo chain id containing the vault.'),
174
+ z.meta({ examples: [42431] }),
175
+ ),
176
+ engine: z
177
+ .strictObject({
178
+ address: Schema.Address.check(
179
+ z.describe('Current vault engine address.'),
180
+ z.meta({ examples: ['0xd85fc943333a6cd7c0e3391acd54fc4e572f0baf'] }),
181
+ ),
182
+ type: engineType,
183
+ venue: z
184
+ .nullable(
185
+ Schema.Address.check(
186
+ z.describe('Yield venue bound to the engine.'),
187
+ z.meta({ examples: ['0xa8b4f0e69cd4b0e56b676343f02acd8c3b355322'] }),
188
+ ),
189
+ )
190
+ .check(z.describe('Yield venue, or null when the engine does not expose one.')),
191
+ })
192
+ .check(z.describe('Current vault engine.')),
193
+ instantLiquidity: z
194
+ .nullable(
195
+ Schema.DecimalString.check(
196
+ z.describe('Assets the venue would release right now, in asset base units.'),
197
+ z.meta({ examples: ['1000000'] }),
198
+ ),
199
+ )
200
+ .check(
201
+ z.describe(
202
+ 'Synchronously redeemable assets, or null when the engine cannot report a reliable number.',
203
+ ),
204
+ ),
205
+ sharePrice: z
206
+ .nullable(
207
+ Schema.DecimalString.check(
208
+ z.describe('Assets returned for one whole Earn share, in asset base units.'),
209
+ z.meta({ examples: ['1000000'] }),
210
+ ),
211
+ )
212
+ .check(
213
+ z.describe('Assets per whole Earn share, or null when the engine cannot quote an exit.'),
214
+ ),
215
+ shareToken: metadata,
216
+ state,
217
+ vaultAddress: Schema.Address.check(
218
+ z.describe('Earn vault contract address.'),
219
+ z.meta({ examples: ['0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a'] }),
220
+ ),
221
+ })
222
+ .check(z.describe('Live state resolved from an Earn vault.'))
223
+ }
224
+
225
+ /** Live state resolved from an Earn vault. */
226
+ export type Discovery = z.output<typeof schema.Discovery>
227
+
228
+ /** Onchain identity of an Earn vault. */
229
+ export type ResolveInput = z.output<typeof schema.ResolveInput>
230
+
231
+ /** Stable code describing an onchain verification issue. */
232
+ export type VerificationIssueCode =
233
+ | 'chain-mismatch'
234
+ | 'engine-asset-mismatch'
235
+ | 'policy-unsupported'
236
+ | 'read-failed'
237
+
238
+ /** One onchain verification issue. */
239
+ export type VerificationIssue = {
240
+ /** Observed value, when available. */
241
+ actual?: string | undefined
242
+ /** Stable machine-readable issue code. */
243
+ code: VerificationIssueCode
244
+ /** Expected value, when available. */
245
+ expected?: string | undefined
246
+ /** Human-readable issue detail. */
247
+ message: string
248
+ }
249
+
250
+ /** Token and vault state observed during verification. */
251
+ export type VerificationSnapshot = {
252
+ /** Asset token observed onchain. */
253
+ assetToken?: Discovery['assetToken'] | undefined
254
+ /** Whether vault supply matches its engine backing. */
255
+ isSynced?: boolean | undefined
256
+ /** Share token observed onchain. */
257
+ shareToken?: Discovery['shareToken'] | undefined
258
+ }
259
+
260
+ type VerificationMismatch = {
261
+ /** Issues found while reading the deployment. */
262
+ issues: readonly VerificationIssue[]
263
+ /** Token and vault state observed during verification. */
264
+ snapshot: VerificationSnapshot
265
+ /** Indicates that onchain state is incompatible. */
266
+ status: 'mismatch'
267
+ }
268
+
269
+ type VerificationUnavailable = {
270
+ /** Issue that prevented verification. */
271
+ issues: readonly VerificationIssue[]
272
+ /** Indicates that verification could not complete. */
273
+ status: 'unavailable'
274
+ }
275
+
276
+ type VerificationFailure = VerificationMismatch | VerificationUnavailable
277
+
278
+ type Client = Pick<Viem.getClient.ReturnType, 'earn' | 'getChainId' | 'getCode' | 'readContract'>
279
+
280
+ type EngineCapabilities = {
281
+ asyncRedeem: boolean
282
+ exactWithdraw: boolean
283
+ inKindDeposit: boolean
284
+ syncRedeem: boolean
285
+ }
286
+
287
+ type VaultBindings = {
288
+ asset: Address
289
+ capabilities: EngineCapabilities
290
+ depositsPaused: boolean
291
+ engine: Address
292
+ engineShares: bigint
293
+ feesActive: boolean
294
+ isSynced: boolean
295
+ openRedeemRequestCount: bigint
296
+ shareSupply: bigint
297
+ shareToken: Address
298
+ totalAssets: bigint
299
+ }
300
+
301
+ type RouterCapabilities = {
302
+ deposit: boolean
303
+ redeem: boolean
304
+ }
305
+
306
+ type TokenMetadata = Omit<Discovery['assetToken'], 'address'>
307
+
308
+ const engineBindingsAbi = parseAbi(['function vault() view returns (address)'])
309
+
310
+ const venueLiquidityAbi = parseAbi(['function maxWithdraw(address owner) view returns (uint256)'])
311
+
312
+ /**
313
+ * Shares quoted to derive a share price. `previewRedeem` is linear in shares, so
314
+ * a large quote rescales to one whole share without base-unit quantization.
315
+ */
316
+ const quotedShares = 10n ** 18n
317
+
318
+ const accessFlights = new WeakMap<Client, Map<bigint, Promise<NonNullable<Discovery['access']>>>>()
319
+ const chainIds = new WeakMap<Client, Promise<number | undefined>>()
320
+ const fullInclude = ['access', 'capabilities'] as const
321
+ const tokenMetadataFlights = new WeakMap<Client, Map<Address, Promise<TokenMetadata>>>()
322
+ const transferPolicyIdFlights = new WeakMap<Client, Map<Address, Promise<bigint>>>()
323
+
324
+ /** Resolves one Earn vault from its onchain identity. */
325
+ export function resolve(options: resolve.ProjectedOptions): Promise<Discovery>
326
+ /** Resolves every optional Earn vault field. */
327
+ export function resolve(options: resolve.Options): Promise<resolve.CompleteDiscovery>
328
+ export async function resolve(
329
+ options: resolve.Options | resolve.ProjectedOptions,
330
+ ): Promise<Discovery> {
331
+ const input = parseInput(options.input)
332
+ const include = 'include' in options ? options.include : fullInclude
333
+ const zones = options.zones.filter((zone) => zone.sourceId === input.chainId)
334
+ return resolveOnchain(options.getClient(input.chainId), { include, input, zones })
335
+ }
336
+
337
+ export declare namespace resolve {
338
+ /** Fully resolved Earn vault state. */
339
+ type CompleteDiscovery = Discovery & {
340
+ /** Vault share-token access. */
341
+ access: NonNullable<Discovery['access']>
342
+ /** Actions supported by the vault. */
343
+ capabilities: NonNullable<Discovery['capabilities']>
344
+ }
345
+
346
+ /** Optional onchain fields to resolve. */
347
+ type Include = 'access' | 'capabilities'
348
+
349
+ /** Options for resolving one Earn vault. */
350
+ type Options = {
351
+ /** Resolves the onchain client used to read the vault. */
352
+ getClient: Viem.GetClient
353
+ /** Chain and vault identity to resolve. */
354
+ input: unknown
355
+ /** Private zones available to Earn routers. */
356
+ zones: readonly Chain[]
357
+ }
358
+
359
+ /** Options for resolving selected optional fields. */
360
+ type ProjectedOptions = Options & {
361
+ /** Optional onchain fields to resolve. */
362
+ include: readonly Include[]
363
+ }
364
+ }
365
+
366
+ /** Infers the supported engine type from its capability fingerprint. */
367
+ export function classifyEngineType(
368
+ options: classifyEngineType.Options,
369
+ ): classifyEngineType.ReturnType {
370
+ if (options.inKindDeposit && !options.asyncRedeem) return 'erc4626'
371
+ if (options.asyncRedeem && !options.inKindDeposit) return 'veda'
372
+ return null
373
+ }
374
+
375
+ export declare namespace classifyEngineType {
376
+ /** Capability fingerprint used to classify an engine. */
377
+ type Options = {
378
+ /** Whether queued redemptions are supported. */
379
+ asyncRedeem: boolean
380
+ /** Whether venue-share deposits are supported. */
381
+ inKindDeposit: boolean
382
+ }
383
+
384
+ /** Supported engine type, or null for an unknown fingerprint. */
385
+ type ReturnType = 'erc4626' | 'veda' | null
386
+ }
387
+
388
+ async function resolveOnchain(client: Client, options: resolveOnchain.Options): Promise<Discovery> {
389
+ const { include, input, zones } = options
390
+ const includeAccess = include.includes('access')
391
+ const includeCapabilities = include.includes('capabilities')
392
+ const actualChainId = await getChainId(client)
393
+ if (actualChainId === undefined) throw new VerificationError(unavailable())
394
+ if (actualChainId !== input.chainId)
395
+ throw new VerificationError({
396
+ issues: [
397
+ {
398
+ actual: String(actualChainId),
399
+ code: 'chain-mismatch',
400
+ expected: String(input.chainId),
401
+ message: `Expected chain ${input.chainId}, received ${actualChainId}.`,
402
+ },
403
+ ],
404
+ status: 'unavailable',
405
+ })
406
+
407
+ const vault = await readVaultBindings(client, input.vaultAddress).catch(async (error) => {
408
+ if (isMissingContractError(error) && !(await client.getCode({ address: input.vaultAddress })))
409
+ throw new NotFoundError(
410
+ `Earn vault ${input.vaultAddress} was not found on chain ${input.chainId}.`,
411
+ )
412
+ throw error
413
+ })
414
+ const engineType = classifyEngineType(vault.capabilities)
415
+ const engineBindings = readEngineBindings(client, { engine: vault.engine })
416
+ const [access, asset, bindings, withdrawable, routerCapabilities, shareQuote, shareToken] =
417
+ await Promise.all([
418
+ includeAccess
419
+ ? readTransferPolicyId(client, vault.shareToken).then((transferPolicyId) =>
420
+ readAccess(client, transferPolicyId),
421
+ )
422
+ : undefined,
423
+ readTokenMetadata(client, vault.asset),
424
+ engineBindings,
425
+ // Instant liquidity is the venue's own withdrawal limit, so it waits on the
426
+ // engine's venue binding. Only an ERC-4626 venue can expose one.
427
+ engineBindings.then(({ venue }) =>
428
+ engineType === 'erc4626' && venue
429
+ ? readVenueLiquidity(client, { owner: vault.engine, venue })
430
+ : undefined,
431
+ ),
432
+ includeCapabilities
433
+ ? readRouterCapabilities(client, { chainId: input.chainId, zones })
434
+ : Promise.resolve({ deposit: false, redeem: false }),
435
+ readShareQuote(client, {
436
+ syncRedeem: vault.capabilities.syncRedeem,
437
+ vaultAddress: input.vaultAddress,
438
+ }),
439
+ readTokenMetadata(client, vault.shareToken),
440
+ ])
441
+ const { asset: engineAsset, venue } = bindings
442
+ const assetToken = {
443
+ address: vault.asset,
444
+ currency: asset.currency,
445
+ decimals: asset.decimals,
446
+ name: asset.name,
447
+ symbol: asset.symbol,
448
+ }
449
+ const shareToken_ = {
450
+ address: vault.shareToken,
451
+ currency: shareToken.currency,
452
+ decimals: shareToken.decimals,
453
+ name: shareToken.name,
454
+ symbol: shareToken.symbol,
455
+ }
456
+
457
+ const issues: VerificationIssue[] = []
458
+ compareAddress(
459
+ issues,
460
+ 'engine-asset-mismatch',
461
+ 'Engine asset does not match the vault asset.',
462
+ vault.asset,
463
+ engineAsset,
464
+ )
465
+ if (issues.length > 0)
466
+ throw new VerificationError({
467
+ issues,
468
+ snapshot: {
469
+ assetToken: parseTokenMetadata(assetToken),
470
+ isSynced: vault.isSynced,
471
+ shareToken: parseTokenMetadata(shareToken_),
472
+ },
473
+ status: 'mismatch',
474
+ })
475
+
476
+ const capabilities = (() => {
477
+ if (!includeCapabilities) return undefined
478
+ const privateRouting = routerCapabilities.deposit && routerCapabilities.redeem
479
+ return {
480
+ asyncRedeem: vault.capabilities.asyncRedeem,
481
+ boundedRedeem: vault.capabilities.syncRedeem,
482
+ deposit: true,
483
+ exactWithdraw: vault.capabilities.exactWithdraw,
484
+ inKindDeposit: vault.capabilities.inKindDeposit,
485
+ privateRouting,
486
+ redeem: vault.capabilities.syncRedeem,
487
+ routerSwaps: privateRouting,
488
+ }
489
+ })()
490
+ return parseDiscovery({
491
+ ...(access ? { access } : {}),
492
+ assetToken,
493
+ ...(capabilities ? { capabilities } : {}),
494
+ chainId: input.chainId,
495
+ engine: {
496
+ address: vault.engine,
497
+ type: engineType,
498
+ venue,
499
+ },
500
+ // The vault can never hand out more than its active backing, whatever the
501
+ // venue would release.
502
+ instantLiquidity:
503
+ withdrawable === undefined
504
+ ? null
505
+ : (withdrawable < vault.totalAssets ? withdrawable : vault.totalAssets).toString(),
506
+ sharePrice:
507
+ shareQuote === undefined
508
+ ? null
509
+ : ((shareQuote * 10n ** BigInt(shareToken.decimals)) / quotedShares).toString(),
510
+ shareToken: shareToken_,
511
+ state: {
512
+ depositsPaused: vault.depositsPaused,
513
+ engineShares: vault.engineShares.toString(),
514
+ feesActive: vault.feesActive,
515
+ isAccountingAligned: vault.isSynced,
516
+ openRedeemRequestCount: Number(vault.openRedeemRequestCount),
517
+ totalAssets: vault.totalAssets.toString(),
518
+ totalEarnShares: vault.shareSupply.toString(),
519
+ },
520
+ vaultAddress: input.vaultAddress,
521
+ })
522
+ }
523
+
524
+ declare namespace resolveOnchain {
525
+ type Options = {
526
+ include: readonly resolve.Include[]
527
+ input: ResolveInput
528
+ zones: readonly Chain[]
529
+ }
530
+ }
531
+
532
+ function parseInput(value: unknown): ResolveInput {
533
+ const result = schema.ResolveInput.safeParse(value)
534
+ if (!result.success) throw invalid(result.error)
535
+ return result.data
536
+ }
537
+
538
+ function parseDiscovery(value: unknown): Discovery {
539
+ const result = schema.Discovery.safeParse(value)
540
+ if (!result.success) throw invalid(result.error)
541
+ return result.data
542
+ }
543
+
544
+ function parseTokenMetadata(
545
+ value: Pick<Discovery['assetToken'], 'address' | 'currency' | 'decimals' | 'name' | 'symbol'>,
546
+ ): Discovery['assetToken'] {
547
+ const result = schema.Discovery.shape.assetToken.safeParse(value)
548
+ if (!result.success) throw invalid(result.error)
549
+ return result.data
550
+ }
551
+
552
+ function invalid(error: z.core.$ZodError): InvalidRegistryError {
553
+ const issue = error.issues[0]
554
+ const path = issue?.path.length ? `${issue.path.join('.')}: ` : ''
555
+ return new InvalidRegistryError(`${path}${issue?.message ?? 'invalid input'}`)
556
+ }
557
+
558
+ async function getChainId(client: Client): Promise<number | undefined> {
559
+ const existing = chainIds.get(client)
560
+ if (existing) return existing
561
+
562
+ const pending = client.getChainId().catch(() => {
563
+ chainIds.delete(client)
564
+ return undefined
565
+ })
566
+ chainIds.set(client, pending)
567
+ return pending
568
+ }
569
+
570
+ async function readAccess(
571
+ client: Client,
572
+ transferPolicyId: bigint | undefined,
573
+ ): Promise<NonNullable<Discovery['access']>> {
574
+ if (transferPolicyId === 1n) return { status: 'open' }
575
+ if (transferPolicyId === undefined || transferPolicyId <= 2n)
576
+ throw new VerificationError({
577
+ issues: [
578
+ {
579
+ actual: transferPolicyId?.toString(),
580
+ code: 'policy-unsupported',
581
+ message: 'Share token does not use an open or compound transfer policy.',
582
+ },
583
+ ],
584
+ snapshot: {},
585
+ status: 'mismatch',
586
+ })
587
+
588
+ const flights = flightsFor(accessFlights, client)
589
+ const existing = flights.get(transferPolicyId)
590
+ if (existing) return existing
591
+ const pending = (async () => {
592
+ const [senderPolicyId, recipientPolicyId, mintRecipientPolicyId] = await client.readContract({
593
+ abi: Abis.tip403Registry,
594
+ address: Addresses.tip403Registry,
595
+ args: [transferPolicyId],
596
+ functionName: 'compoundPolicyData',
597
+ })
598
+ if (
599
+ senderPolicyId === 0n ||
600
+ recipientPolicyId === 0n ||
601
+ mintRecipientPolicyId === 0n ||
602
+ senderPolicyId !== 1n ||
603
+ recipientPolicyId !== mintRecipientPolicyId
604
+ )
605
+ throw new VerificationError({
606
+ issues: [
607
+ {
608
+ actual: transferPolicyId.toString(),
609
+ code: 'policy-unsupported',
610
+ message: 'Share token does not use a supported exit-safe compound policy.',
611
+ },
612
+ ],
613
+ snapshot: {},
614
+ status: 'mismatch',
615
+ })
616
+
617
+ return { status: 'allowlisted' as const }
618
+ })()
619
+ flights.set(transferPolicyId, pending)
620
+ try {
621
+ return await pending
622
+ } finally {
623
+ flights.delete(transferPolicyId)
624
+ }
625
+ }
626
+
627
+ async function readVaultBindings(client: Client, vaultAddress: Address): Promise<VaultBindings> {
628
+ const vault = await client.earn.getVault({ vault: vaultAddress })
629
+ return {
630
+ asset: vault.assetToken,
631
+ capabilities: vault.capabilities,
632
+ depositsPaused: vault.depositsPaused,
633
+ engine: vault.engine.address,
634
+ engineShares: vault.engineShares,
635
+ feesActive: vault.feesActive,
636
+ isSynced: vault.isSynced,
637
+ openRedeemRequestCount: vault.pendingRedeemCount,
638
+ shareSupply: vault.shareSupply,
639
+ shareToken: vault.shareToken,
640
+ totalAssets: vault.engine.totalAssets,
641
+ }
642
+ }
643
+
644
+ /**
645
+ * Assets the venue would let the engine withdraw right now, so an illiquid,
646
+ * paused, or gated venue reports less than the engine's position is worth. There
647
+ * is no fallback: valuing the position instead would restate `totalAssets` and
648
+ * claim liquidity the venue never offered.
649
+ */
650
+ function readVenueLiquidity(
651
+ client: Client,
652
+ options: readVenueLiquidity.Options,
653
+ ): Promise<bigint | undefined> {
654
+ return client
655
+ .readContract({
656
+ abi: venueLiquidityAbi,
657
+ address: options.venue,
658
+ args: [options.owner],
659
+ functionName: 'maxWithdraw',
660
+ })
661
+ .catch((error) => {
662
+ // A venue that reports no withdrawal limit reports no instant liquidity.
663
+ if (error instanceof ContractFunctionExecutionError) return undefined
664
+ throw error
665
+ })
666
+ }
667
+
668
+ declare namespace readVenueLiquidity {
669
+ type Options = {
670
+ /** Account whose withdrawal limit is read, always the engine. */
671
+ owner: Address
672
+ /** Venue the engine holds its position in. */
673
+ venue: Address
674
+ }
675
+ }
676
+
677
+ /**
678
+ * Assets returned for {@link quotedShares} Earn shares. The vault's
679
+ * `previewRedeem` reverts unless the engine advertises synchronous redemption,
680
+ * and the venue may refuse to value an exit at all.
681
+ */
682
+ function readShareQuote(
683
+ client: Client,
684
+ options: readShareQuote.Options,
685
+ ): Promise<bigint | undefined> {
686
+ if (!options.syncRedeem) return Promise.resolve(undefined)
687
+ return client.earn
688
+ .getRedeemQuote({ shareAmount: quotedShares, vault: options.vaultAddress })
689
+ .catch((error) => {
690
+ if (error instanceof ContractFunctionExecutionError) return undefined
691
+ throw error
692
+ })
693
+ }
694
+
695
+ declare namespace readShareQuote {
696
+ type Options = {
697
+ /** Whether the engine advertises synchronous redemption. */
698
+ syncRedeem: boolean
699
+ /** Earn vault quoted against. */
700
+ vaultAddress: Address
701
+ }
702
+ }
703
+
704
+ async function readEngineBindings(client: Client, options: readEngineBindings.Options) {
705
+ const [asset, venue] = await Promise.all([
706
+ client.readContract({
707
+ abi: Abis.earnEngine,
708
+ address: options.engine,
709
+ functionName: 'asset',
710
+ }),
711
+ client
712
+ .readContract({
713
+ abi: engineBindingsAbi,
714
+ address: options.engine,
715
+ functionName: 'vault',
716
+ })
717
+ .catch((error) => {
718
+ // Venue is concrete-engine metadata, not part of IEarnEngine.
719
+ if (isMissingOptionalFunctionError(error)) return null
720
+ throw error
721
+ }),
722
+ ])
723
+ return { asset, venue }
724
+ }
725
+
726
+ declare namespace readEngineBindings {
727
+ type Options = {
728
+ engine: Address
729
+ }
730
+ }
731
+
732
+ async function readRouterCapabilities(
733
+ client: Client,
734
+ options: readRouterCapabilities.Options,
735
+ ): Promise<RouterCapabilities> {
736
+ const routers = new Map<string, Address>()
737
+ for (const zone of options.zones) {
738
+ if (zone.sourceId !== options.chainId) continue
739
+ const router = zone.contracts?.['earnRouter']
740
+ if (router && 'address' in router) routers.set(router.address.toLowerCase(), router.address)
741
+ }
742
+ if (routers.size === 0) return { deposit: false, redeem: false }
743
+ if (routers.size > 1)
744
+ throw new InvalidRegistryError('Multiple Earn routers are configured for this chain.')
745
+ const router = routers.values().next().value!
746
+ const [deposit, redeem] = await Promise.all([
747
+ client.readContract({
748
+ abi: Abis.earnRouter,
749
+ address: router,
750
+ args: [0],
751
+ functionName: 'supportsFlow',
752
+ }),
753
+ client.readContract({
754
+ abi: Abis.earnRouter,
755
+ address: router,
756
+ args: [1],
757
+ functionName: 'supportsFlow',
758
+ }),
759
+ ])
760
+ return { deposit, redeem }
761
+ }
762
+
763
+ declare namespace readRouterCapabilities {
764
+ type Options = {
765
+ chainId: number
766
+ zones: readonly Chain[]
767
+ }
768
+ }
769
+
770
+ async function readTransferPolicyId(client: Client, address: Address): Promise<bigint> {
771
+ const flights = flightsFor(transferPolicyIdFlights, client)
772
+ const existing = flights.get(address)
773
+ if (existing) return existing
774
+ const pending = client.readContract({
775
+ abi: Abis.tip20,
776
+ address,
777
+ functionName: 'transferPolicyId',
778
+ })
779
+ flights.set(address, pending)
780
+ try {
781
+ return await pending
782
+ } finally {
783
+ flights.delete(address)
784
+ }
785
+ }
786
+
787
+ async function readTokenMetadata(client: Client, address: Address): Promise<TokenMetadata> {
788
+ const flights = flightsFor(tokenMetadataFlights, client)
789
+ const existing = flights.get(address)
790
+ if (existing) return existing
791
+ const pending = Promise.all([
792
+ client.readContract({ abi: Abis.tip20, address, functionName: 'currency' }),
793
+ client.readContract({ abi: Abis.tip20, address, functionName: 'decimals' }),
794
+ client.readContract({ abi: Abis.tip20, address, functionName: 'name' }),
795
+ client.readContract({ abi: Abis.tip20, address, functionName: 'symbol' }),
796
+ ]).then(([currency, decimals, name, symbol]) => ({ currency, decimals, name, symbol }))
797
+ flights.set(address, pending)
798
+ try {
799
+ return await pending
800
+ } finally {
801
+ flights.delete(address)
802
+ }
803
+ }
804
+
805
+ function isMissingContractError(error: unknown): boolean {
806
+ return (
807
+ error instanceof ContractFunctionExecutionError &&
808
+ error.cause instanceof ContractFunctionZeroDataError
809
+ )
810
+ }
811
+
812
+ function isMissingOptionalFunctionError(error: unknown): boolean {
813
+ if (!(error instanceof ContractFunctionExecutionError)) return false
814
+ if (error.cause instanceof ContractFunctionZeroDataError) return true
815
+ return (
816
+ error.cause instanceof ContractFunctionRevertedError &&
817
+ (!error.cause.raw || error.cause.raw === '0x') &&
818
+ (!error.cause.reason || error.cause.reason === 'execution reverted')
819
+ )
820
+ }
821
+
822
+ function flightsFor<key, value>(
823
+ registry: WeakMap<Client, Map<key, Promise<value>>>,
824
+ client: Client,
825
+ ): Map<key, Promise<value>> {
826
+ const existing = registry.get(client)
827
+ if (existing) return existing
828
+ const flights = new Map<key, Promise<value>>()
829
+ registry.set(client, flights)
830
+ return flights
831
+ }
832
+
833
+ function compareAddress(
834
+ issues: VerificationIssue[],
835
+ code: VerificationIssueCode,
836
+ message: string,
837
+ expected: Address,
838
+ actual: Address,
839
+ ): void {
840
+ if (!isAddressEqual(actual, expected)) issues.push({ actual, code, expected, message })
841
+ }
842
+
843
+ function unavailable(): VerificationUnavailable {
844
+ return {
845
+ issues: [
846
+ {
847
+ code: 'read-failed',
848
+ message: 'Onchain verification reads are temporarily unavailable.',
849
+ },
850
+ ],
851
+ status: 'unavailable',
852
+ }
853
+ }
854
+
855
+ /** Thrown when an Earn resolver value fails schema validation. */
856
+ export class InvalidRegistryError extends Error {
857
+ override name = 'EarnVaults.InvalidRegistryError'
858
+ }
859
+
860
+ /** Thrown when a requested Earn vault does not exist. */
861
+ export class NotFoundError extends Error {
862
+ override name = 'EarnVaults.NotFoundError'
863
+ }
864
+
865
+ /** Thrown when onchain verification rejects an Earn vault. */
866
+ export class VerificationError extends Error {
867
+ /** Failed verification result. */
868
+ result: VerificationFailure
869
+
870
+ constructor(result: VerificationFailure) {
871
+ super(`Earn vault verification failed: ${result.issues.map((issue) => issue.code).join(', ')}.`)
872
+ this.result = result
873
+ }
874
+
875
+ override name = 'EarnVaults.VerificationError'
876
+ }