tapimo 0.15.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (734) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +896 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +33 -33
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +454 -1
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +10 -4
  45. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  46. package/dist/admin/apps/verified-tokens.js +24 -4
  47. package/dist/admin/apps/verified-tokens.js.map +1 -1
  48. package/dist/admin/index.d.ts +0 -1
  49. package/dist/admin/index.d.ts.map +1 -1
  50. package/dist/admin/index.js +0 -1
  51. package/dist/admin/index.js.map +1 -1
  52. package/dist/admin/ui.generated.d.ts +1 -1
  53. package/dist/admin/ui.generated.d.ts.map +1 -1
  54. package/dist/admin/ui.generated.js +99 -103
  55. package/dist/admin/ui.generated.js.map +1 -1
  56. package/dist/analytics/Analytics.d.ts.map +1 -1
  57. package/dist/analytics/Analytics.js +65 -1
  58. package/dist/analytics/Analytics.js.map +1 -1
  59. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  60. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  61. package/dist/analytics/tables/requestEvents.js +58 -59
  62. package/dist/analytics/tables/requestEvents.js.map +1 -1
  63. package/dist/apps/data/App.d.ts +2709 -2670
  64. package/dist/apps/data/App.d.ts.map +1 -1
  65. package/dist/apps/data/routes/activities.d.ts +5 -5
  66. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  67. package/dist/apps/data/routes/activities.js +50 -0
  68. package/dist/apps/data/routes/activities.js.map +1 -1
  69. package/dist/apps/data/routes/addresses.d.ts +248 -248
  70. package/dist/apps/data/routes/balances.d.ts +22 -22
  71. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  72. package/dist/apps/data/routes/balances.js +5 -7
  73. package/dist/apps/data/routes/balances.js.map +1 -1
  74. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  75. package/dist/apps/data/routes/earn.d.ts +103 -12
  76. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  77. package/dist/apps/data/routes/earn.js +456 -220
  78. package/dist/apps/data/routes/earn.js.map +1 -1
  79. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  80. package/dist/apps/data/routes/exchanges.js +267 -97
  81. package/dist/apps/data/routes/exchanges.js.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.d.ts +1 -19
  83. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  84. package/dist/apps/data/routes/fee-amm.js +93 -56
  85. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  86. package/dist/apps/data/routes/indexer.d.ts +10 -10
  87. package/dist/apps/data/routes/rpc.d.ts +30 -30
  88. package/dist/apps/data/routes/rpc.js +45 -11
  89. package/dist/apps/data/routes/rpc.js.map +1 -1
  90. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  91. package/dist/apps/data/routes/tokens.js +11 -6
  92. package/dist/apps/data/routes/tokens.js.map +1 -1
  93. package/dist/apps/data/routes/transactions.d.ts +2 -0
  94. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  95. package/dist/apps/data/routes/transactions.js +30 -22
  96. package/dist/apps/data/routes/transactions.js.map +1 -1
  97. package/dist/apps/data/routes/transfers.d.ts +12 -12
  98. package/dist/apps/data/routes/valuation.d.ts +30 -30
  99. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  100. package/dist/apps/data/routes/webhooks.d.ts +1 -1
  101. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  102. package/dist/apps/data/routes/webhooks.js +18 -11
  103. package/dist/apps/data/routes/webhooks.js.map +1 -1
  104. package/dist/apps/data/routes/zones.d.ts +3 -3
  105. package/dist/apps/management/App.d.ts +3043 -2198
  106. package/dist/apps/management/App.d.ts.map +1 -1
  107. package/dist/apps/management/App.js +2 -0
  108. package/dist/apps/management/App.js.map +1 -1
  109. package/dist/apps/management/Billing.d.ts +2 -4
  110. package/dist/apps/management/Billing.d.ts.map +1 -1
  111. package/dist/apps/management/Billing.js +65 -26
  112. package/dist/apps/management/Billing.js.map +1 -1
  113. package/dist/apps/management/routes/api-keys.d.ts +16 -4
  114. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  115. package/dist/apps/management/routes/api-keys.js +70 -11
  116. package/dist/apps/management/routes/api-keys.js.map +1 -1
  117. package/dist/apps/management/routes/billing.d.ts +84 -84
  118. package/dist/apps/management/routes/cli.d.ts +912 -0
  119. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  120. package/dist/apps/management/routes/cli.js +416 -0
  121. package/dist/apps/management/routes/cli.js.map +1 -0
  122. package/dist/apps/management/routes/faucet.d.ts +8 -8
  123. package/dist/apps/management/routes/invitations.d.ts +24 -24
  124. package/dist/apps/management/routes/invite-links.d.ts +66 -66
  125. package/dist/apps/management/routes/members.d.ts +16 -16
  126. package/dist/apps/management/routes/orgs.d.ts +20 -20
  127. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  128. package/dist/apps/management/routes/orgs.js +8 -2
  129. package/dist/apps/management/routes/orgs.js.map +1 -1
  130. package/dist/apps/management/routes/projects.d.ts +76 -76
  131. package/dist/apps/management/routes/usage.d.ts +8 -8
  132. package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
  133. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  134. package/dist/apps/management/routes/verified-token-requests.js +7 -9
  135. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  136. package/dist/apps/management/routes/webhooks.d.ts +119 -119
  137. package/dist/apps/mcp.d.ts.map +1 -1
  138. package/dist/apps/mcp.js +16 -3
  139. package/dist/apps/mcp.js.map +1 -1
  140. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  141. package/dist/apps/mpp/internal/Policy.js +4 -2
  142. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  143. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  144. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  145. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  146. package/dist/apps/relay/App.d.ts +8 -0
  147. package/dist/apps/relay/App.d.ts.map +1 -1
  148. package/dist/apps/relay/App.js +16 -4
  149. package/dist/apps/relay/App.js.map +1 -1
  150. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  151. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  152. package/dist/apps/relay/Sponsorships.js +71 -60
  153. package/dist/apps/relay/Sponsorships.js.map +1 -1
  154. package/dist/apps/routes/Access.d.ts +53 -0
  155. package/dist/apps/routes/Access.d.ts.map +1 -1
  156. package/dist/apps/routes/Access.js +121 -0
  157. package/dist/apps/routes/Access.js.map +1 -1
  158. package/dist/apps/routes/App.d.ts +397 -158
  159. package/dist/apps/routes/App.d.ts.map +1 -1
  160. package/dist/apps/routes/App.js.map +1 -1
  161. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  162. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  164. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  165. package/dist/apps/routes/routes/quotes.d.ts +90 -0
  166. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  167. package/dist/apps/routes/routes/quotes.js +101 -27
  168. package/dist/apps/routes/routes/quotes.js.map +1 -1
  169. package/dist/apps/routes/routes/transfers.d.ts +187 -135
  170. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  171. package/dist/apps/routes/routes/transfers.js +182 -37
  172. package/dist/apps/routes/routes/transfers.js.map +1 -1
  173. package/dist/cli/ApiKeys.d.ts +120 -0
  174. package/dist/cli/ApiKeys.d.ts.map +1 -0
  175. package/dist/cli/ApiKeys.js +138 -0
  176. package/dist/cli/ApiKeys.js.map +1 -0
  177. package/dist/cli/Cli.d.ts +92 -34
  178. package/dist/cli/Cli.d.ts.map +1 -1
  179. package/dist/cli/Cli.js +188 -11
  180. package/dist/cli/Cli.js.map +1 -1
  181. package/dist/cli/Credentials.d.ts +95 -0
  182. package/dist/cli/Credentials.d.ts.map +1 -0
  183. package/dist/cli/Credentials.js +110 -0
  184. package/dist/cli/Credentials.js.map +1 -0
  185. package/dist/cli/Spec.d.ts +59 -0
  186. package/dist/cli/Spec.d.ts.map +1 -0
  187. package/dist/cli/Spec.js +77 -0
  188. package/dist/cli/Spec.js.map +1 -0
  189. package/dist/cli/bin.js +5 -1
  190. package/dist/cli/bin.js.map +1 -1
  191. package/dist/cli/commands/admin.d.ts +5 -5
  192. package/dist/cli/commands/admin.d.ts.map +1 -1
  193. package/dist/cli/commands/auth.d.ts +73 -0
  194. package/dist/cli/commands/auth.d.ts.map +1 -0
  195. package/dist/cli/commands/auth.js +204 -0
  196. package/dist/cli/commands/auth.js.map +1 -0
  197. package/dist/cli/commands/keys.d.ts +17 -0
  198. package/dist/cli/commands/keys.d.ts.map +1 -0
  199. package/dist/cli/commands/keys.js +109 -0
  200. package/dist/cli/commands/keys.js.map +1 -0
  201. package/dist/cloudflare.d.ts +27 -2
  202. package/dist/cloudflare.d.ts.map +1 -1
  203. package/dist/cloudflare.js +144 -17
  204. package/dist/cloudflare.js.map +1 -1
  205. package/dist/db/Db.d.ts +23 -0
  206. package/dist/db/Db.d.ts.map +1 -1
  207. package/dist/db/Db.js +418 -1
  208. package/dist/db/Db.js.map +1 -1
  209. package/dist/db/Schema.d.ts +44 -1
  210. package/dist/db/Schema.d.ts.map +1 -1
  211. package/dist/db/Schema.js +56 -3
  212. package/dist/db/Schema.js.map +1 -1
  213. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  214. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  215. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  216. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  217. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  218. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  219. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  220. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  221. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  222. package/dist/db/tables/authAccounts.js +1 -0
  223. package/dist/db/tables/authAccounts.js.map +1 -1
  224. package/dist/db/tables/earnVaults.d.ts +5 -1
  225. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  226. package/dist/db/tables/earnVaults.js +12 -1
  227. package/dist/db/tables/earnVaults.js.map +1 -1
  228. package/dist/db/tables/organizations.d.ts +4 -2
  229. package/dist/db/tables/organizations.d.ts.map +1 -1
  230. package/dist/db/tables/organizations.js +8 -34
  231. package/dist/db/tables/organizations.js.map +1 -1
  232. package/dist/db/tables/requestUsage.d.ts +5 -1
  233. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  234. package/dist/db/tables/requestUsage.js +10 -2
  235. package/dist/db/tables/requestUsage.js.map +1 -1
  236. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  237. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  238. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  239. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  240. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  241. package/dist/db/tables/rewardRuns.js +4 -0
  242. package/dist/db/tables/rewardRuns.js.map +1 -1
  243. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  244. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  245. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  246. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  247. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  248. package/dist/db/tables/routesDepositAddresses.js +84 -31
  249. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  250. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  251. package/dist/db/tables/routesDeposits.js +31 -21
  252. package/dist/db/tables/routesDeposits.js.map +1 -1
  253. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  254. package/dist/db/tables/routesIdempotency.js +2 -0
  255. package/dist/db/tables/routesIdempotency.js.map +1 -1
  256. package/dist/db/tables/routesPolicies.d.ts +58 -0
  257. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  258. package/dist/db/tables/routesPolicies.js +198 -0
  259. package/dist/db/tables/routesPolicies.js.map +1 -0
  260. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  261. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  262. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  263. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  264. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  265. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  266. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  267. package/dist/db/tables/routesTransfers.d.ts +26 -1
  268. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  269. package/dist/db/tables/routesTransfers.js +36 -6
  270. package/dist/db/tables/routesTransfers.js.map +1 -1
  271. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  272. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  273. package/dist/db/tables/sponsoredTransactions.js +144 -33
  274. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  275. package/dist/db/tables/users.d.ts +2 -0
  276. package/dist/db/tables/users.d.ts.map +1 -1
  277. package/dist/db/tables/users.js +11 -0
  278. package/dist/db/tables/users.js.map +1 -1
  279. package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
  280. package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
  281. package/dist/db/tables/verifiedTokenRequests.js +65 -44
  282. package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
  283. package/dist/handlers/internal/multisig.d.ts +1 -1
  284. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  285. package/dist/handlers/internal/multisig.js +3 -2
  286. package/dist/handlers/internal/multisig.js.map +1 -1
  287. package/dist/handlers/relay.d.ts +2 -0
  288. package/dist/handlers/relay.d.ts.map +1 -1
  289. package/dist/handlers/relay.js +34 -15
  290. package/dist/handlers/relay.js.map +1 -1
  291. package/dist/internal/Auth.d.ts +73 -6
  292. package/dist/internal/Auth.d.ts.map +1 -1
  293. package/dist/internal/Auth.js +212 -85
  294. package/dist/internal/Auth.js.map +1 -1
  295. package/dist/internal/BetterAuth.d.ts +22 -0
  296. package/dist/internal/BetterAuth.d.ts.map +1 -1
  297. package/dist/internal/BetterAuth.js +17 -14
  298. package/dist/internal/BetterAuth.js.map +1 -1
  299. package/dist/internal/Cache.d.ts +5 -0
  300. package/dist/internal/Cache.d.ts.map +1 -1
  301. package/dist/internal/Cache.js +3 -1
  302. package/dist/internal/Cache.js.map +1 -1
  303. package/dist/internal/CliAuth.d.ts +243 -0
  304. package/dist/internal/CliAuth.d.ts.map +1 -0
  305. package/dist/internal/CliAuth.js +249 -0
  306. package/dist/internal/CliAuth.js.map +1 -0
  307. package/dist/internal/EarnSharePrices.d.ts +1 -1
  308. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  309. package/dist/internal/EarnSharePrices.js +7 -3
  310. package/dist/internal/EarnSharePrices.js.map +1 -1
  311. package/dist/internal/EarnVaults.d.ts +47 -0
  312. package/dist/internal/EarnVaults.d.ts.map +1 -1
  313. package/dist/internal/EarnVaults.js +188 -4
  314. package/dist/internal/EarnVaults.js.map +1 -1
  315. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  316. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  317. package/dist/internal/EarnWithdrawals.js +189 -0
  318. package/dist/internal/EarnWithdrawals.js.map +1 -0
  319. package/dist/internal/ExecutionContext.d.ts +21 -0
  320. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  321. package/dist/internal/ExecutionContext.js +16 -0
  322. package/dist/internal/ExecutionContext.js.map +1 -0
  323. package/dist/internal/Log.d.ts +7 -3
  324. package/dist/internal/Log.d.ts.map +1 -1
  325. package/dist/internal/Log.js +163 -130
  326. package/dist/internal/Log.js.map +1 -1
  327. package/dist/internal/MetricSink.d.ts.map +1 -1
  328. package/dist/internal/MetricSink.js +26 -1
  329. package/dist/internal/MetricSink.js.map +1 -1
  330. package/dist/internal/RateLimit.d.ts +67 -0
  331. package/dist/internal/RateLimit.d.ts.map +1 -1
  332. package/dist/internal/RateLimit.js +174 -27
  333. package/dist/internal/RateLimit.js.map +1 -1
  334. package/dist/internal/Store.d.ts +6 -0
  335. package/dist/internal/Store.d.ts.map +1 -1
  336. package/dist/internal/Store.js +4 -5
  337. package/dist/internal/Store.js.map +1 -1
  338. package/dist/internal/Timing.d.ts +6 -0
  339. package/dist/internal/Timing.d.ts.map +1 -1
  340. package/dist/internal/Timing.js +21 -1
  341. package/dist/internal/Timing.js.map +1 -1
  342. package/dist/internal/Tron.d.ts +124 -0
  343. package/dist/internal/Tron.d.ts.map +1 -0
  344. package/dist/internal/Tron.js +202 -0
  345. package/dist/internal/Tron.js.map +1 -0
  346. package/dist/internal/Viem.d.ts +4 -0
  347. package/dist/internal/Viem.d.ts.map +1 -1
  348. package/dist/internal/Viem.js +25 -6
  349. package/dist/internal/Viem.js.map +1 -1
  350. package/dist/internal/rewards/Read.d.ts +2 -2
  351. package/dist/internal/rewards/Read.d.ts.map +1 -1
  352. package/dist/internal/rewards/Read.js +11 -2
  353. package/dist/internal/rewards/Read.js.map +1 -1
  354. package/dist/internal/routes/Action.d.ts +27 -0
  355. package/dist/internal/routes/Action.d.ts.map +1 -1
  356. package/dist/internal/routes/Action.js +49 -1
  357. package/dist/internal/routes/Action.js.map +1 -1
  358. package/dist/internal/routes/Chain.d.ts +2 -0
  359. package/dist/internal/routes/Chain.d.ts.map +1 -1
  360. package/dist/internal/routes/Chain.js +4 -0
  361. package/dist/internal/routes/Chain.js.map +1 -1
  362. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  363. package/dist/internal/routes/DepositAddress.js +5 -0
  364. package/dist/internal/routes/DepositAddress.js.map +1 -1
  365. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  366. package/dist/internal/routes/Evidence.js +6 -2
  367. package/dist/internal/routes/Evidence.js.map +1 -1
  368. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  369. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  370. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  371. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  372. package/dist/internal/routes/Policy.d.ts +161 -0
  373. package/dist/internal/routes/Policy.d.ts.map +1 -0
  374. package/dist/internal/routes/Policy.js +249 -0
  375. package/dist/internal/routes/Policy.js.map +1 -0
  376. package/dist/internal/routes/Provider.d.ts +66 -3
  377. package/dist/internal/routes/Provider.d.ts.map +1 -1
  378. package/dist/internal/routes/Provider.js +106 -27
  379. package/dist/internal/routes/Provider.js.map +1 -1
  380. package/dist/internal/routes/Quota.d.ts +57 -0
  381. package/dist/internal/routes/Quota.d.ts.map +1 -0
  382. package/dist/internal/routes/Quota.js +144 -0
  383. package/dist/internal/routes/Quota.js.map +1 -0
  384. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  385. package/dist/internal/routes/Reconciliation.js +163 -47
  386. package/dist/internal/routes/Reconciliation.js.map +1 -1
  387. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  388. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  389. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  390. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  391. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  392. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  393. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  394. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  395. package/dist/internal/routes/Subsidy.d.ts +2 -2
  396. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  397. package/dist/internal/routes/Subsidy.js +2 -2
  398. package/dist/internal/routes/Subsidy.js.map +1 -1
  399. package/dist/internal/routes/Transfer.d.ts +229 -1
  400. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  401. package/dist/internal/routes/Transfer.js +644 -7
  402. package/dist/internal/routes/Transfer.js.map +1 -1
  403. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  404. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  405. package/dist/internal/routes/TransferReconciliation.js +83 -159
  406. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  407. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  408. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  409. package/dist/internal/routes/TransferSettlement.js +2 -0
  410. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  411. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  412. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  413. package/dist/internal/routes/TransferSubsidy.js +64 -5
  414. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  415. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  416. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  417. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  418. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  419. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  420. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  421. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  422. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  423. package/dist/internal/routes/index.d.ts +3 -0
  424. package/dist/internal/routes/index.d.ts.map +1 -1
  425. package/dist/internal/routes/index.js +3 -0
  426. package/dist/internal/routes/index.js.map +1 -1
  427. package/dist/internal/routes/providers/across.d.ts +3 -0
  428. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  429. package/dist/internal/routes/providers/across.js +11 -0
  430. package/dist/internal/routes/providers/across.js.map +1 -1
  431. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  432. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  434. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  435. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  436. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  438. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  439. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  440. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  441. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  442. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  443. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  444. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  445. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  446. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  447. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  448. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  449. package/dist/internal/routes/providers/propAmm.js +524 -0
  450. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  451. package/dist/internal/routes/providers/relay.d.ts +4 -1
  452. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  453. package/dist/internal/routes/providers/relay.js +353 -42
  454. package/dist/internal/routes/providers/relay.js.map +1 -1
  455. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  456. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  457. package/dist/internal/routes/providers/rhino.js +11 -0
  458. package/dist/internal/routes/providers/rhino.js.map +1 -1
  459. package/dist/internal/routes/providers/squid.d.ts +3 -0
  460. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  461. package/dist/internal/routes/providers/squid.js +19 -0
  462. package/dist/internal/routes/providers/squid.js.map +1 -1
  463. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  464. package/dist/internal/routes/providers/stargate.js +22 -9
  465. package/dist/internal/routes/providers/stargate.js.map +1 -1
  466. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  467. package/dist/internal/routes/providers/symbiosis.js +13 -17
  468. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  469. package/dist/providers/index.d.ts +14 -0
  470. package/dist/providers/index.d.ts.map +1 -1
  471. package/dist/providers/index.js +6 -0
  472. package/dist/providers/index.js.map +1 -1
  473. package/package.json +16 -6
  474. package/src/ApiKey.ts +7 -3
  475. package/src/ApiKeys.test.ts +652 -8
  476. package/src/ApiKeys.ts +191 -11
  477. package/src/App.test.ts +405 -18
  478. package/src/App.ts +51 -15
  479. package/src/Client.test-d.ts +157 -10
  480. package/src/Client.test.ts +4 -4
  481. package/src/Scope.ts +1 -2
  482. package/src/admin/App.ts +11 -5
  483. package/src/admin/apps/api-keys.test.ts +98 -2
  484. package/src/admin/apps/api-keys.ts +21 -12
  485. package/src/admin/apps/earn-vaults.test.ts +76 -7
  486. package/src/admin/apps/earn-vaults.ts +47 -8
  487. package/src/admin/apps/organizations.test.ts +147 -31
  488. package/src/admin/apps/organizations.ts +5 -4
  489. package/src/admin/apps/route-policies.test.ts +220 -0
  490. package/src/admin/apps/route-policies.ts +322 -0
  491. package/src/admin/apps/routes-support.test.ts +107 -2
  492. package/src/admin/apps/routes-support.ts +43 -3
  493. package/src/admin/apps/routes.test.ts +150 -0
  494. package/src/admin/apps/routes.ts +97 -1
  495. package/src/admin/apps/scopes.test.ts +1 -1
  496. package/src/admin/apps/verified-tokens.test.ts +32 -0
  497. package/src/admin/apps/verified-tokens.ts +30 -4
  498. package/src/admin/index.ts +0 -1
  499. package/src/admin/ui/plugin.ts +2 -1
  500. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  501. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  502. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  503. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  504. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  505. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  506. package/src/admin/ui/src/lib/routes.ts +34 -0
  507. package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
  508. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  509. package/src/admin/ui/src/routes/__root.tsx +1 -1
  510. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  511. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  512. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  513. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  514. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  515. package/src/admin/ui/src/routes/organizations.tsx +35 -4
  516. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  517. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  518. package/src/admin/ui/src/routes/routes.tsx +85 -2
  519. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  520. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  521. package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
  522. package/src/admin/ui.generated.ts +99 -104
  523. package/src/analytics/Analytics.test.ts +4 -50
  524. package/src/analytics/Analytics.ts +65 -1
  525. package/src/analytics/tables/requestEvents.test.ts +402 -1
  526. package/src/analytics/tables/requestEvents.ts +62 -93
  527. package/src/apps/data/App.test.ts +26 -0
  528. package/src/apps/data/routes/activities.test.ts +315 -14
  529. package/src/apps/data/routes/activities.ts +60 -0
  530. package/src/apps/data/routes/balances.ts +5 -7
  531. package/src/apps/data/routes/earn.bench.ts +18 -0
  532. package/src/apps/data/routes/earn.local.test.ts +507 -0
  533. package/src/apps/data/routes/earn.test.ts +405 -127
  534. package/src/apps/data/routes/earn.ts +660 -270
  535. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  536. package/src/apps/data/routes/exchanges.test.ts +166 -2
  537. package/src/apps/data/routes/exchanges.ts +308 -101
  538. package/src/apps/data/routes/fee-amm.test.ts +153 -2
  539. package/src/apps/data/routes/fee-amm.ts +132 -62
  540. package/src/apps/data/routes/receipts.test.ts +21 -18
  541. package/src/apps/data/routes/rpc.test.ts +34 -2
  542. package/src/apps/data/routes/rpc.ts +47 -10
  543. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  544. package/src/apps/data/routes/tokens.test.ts +4 -4
  545. package/src/apps/data/routes/tokens.ts +11 -6
  546. package/src/apps/data/routes/transactions.test.ts +29 -0
  547. package/src/apps/data/routes/transactions.ts +33 -22
  548. package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
  549. package/src/apps/data/routes/webhooks.test.ts +18 -3
  550. package/src/apps/data/routes/webhooks.ts +27 -13
  551. package/src/apps/management/App.ts +4 -0
  552. package/src/apps/management/Billing.test.ts +253 -27
  553. package/src/apps/management/Billing.ts +83 -29
  554. package/src/apps/management/routes/api-keys.test.ts +1 -1
  555. package/src/apps/management/routes/api-keys.ts +85 -11
  556. package/src/apps/management/routes/billing.test.ts +68 -4
  557. package/src/apps/management/routes/cli.test.ts +370 -0
  558. package/src/apps/management/routes/cli.ts +533 -0
  559. package/src/apps/management/routes/me.test.ts +14 -4
  560. package/src/apps/management/routes/orgs.test.ts +108 -4
  561. package/src/apps/management/routes/orgs.ts +7 -2
  562. package/src/apps/management/routes/usage.test.ts +2 -2
  563. package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
  564. package/src/apps/management/routes/verified-token-requests.ts +7 -10
  565. package/src/apps/mcp.test.ts +108 -25
  566. package/src/apps/mcp.ts +15 -3
  567. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  568. package/src/apps/mpp/internal/Policy.ts +6 -2
  569. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  570. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  571. package/src/apps/relay/App.test.ts +85 -1
  572. package/src/apps/relay/App.ts +28 -4
  573. package/src/apps/relay/Sponsorships.test.ts +97 -1
  574. package/src/apps/relay/Sponsorships.ts +77 -66
  575. package/src/apps/routes/Access.test.ts +319 -0
  576. package/src/apps/routes/Access.ts +147 -0
  577. package/src/apps/routes/App.ts +10 -0
  578. package/src/apps/routes/routes/chains.test.ts +3 -2
  579. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  580. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  581. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  582. package/src/apps/routes/routes/quotes.test.ts +81 -8
  583. package/src/apps/routes/routes/quotes.ts +109 -27
  584. package/src/apps/routes/routes/transfers.test.ts +252 -15
  585. package/src/apps/routes/routes/transfers.ts +212 -33
  586. package/src/cli/ApiKeys.test.ts +265 -0
  587. package/src/cli/ApiKeys.ts +189 -0
  588. package/src/cli/Cli.test.ts +188 -0
  589. package/src/cli/Cli.ts +280 -12
  590. package/src/cli/Credentials.test.ts +122 -0
  591. package/src/cli/Credentials.ts +144 -0
  592. package/src/cli/Spec.test.ts +133 -0
  593. package/src/cli/Spec.ts +132 -0
  594. package/src/cli/bin.test.ts +49 -0
  595. package/src/cli/bin.ts +5 -1
  596. package/src/cli/commands/auth.test.ts +138 -0
  597. package/src/cli/commands/auth.ts +254 -0
  598. package/src/cli/commands/keys.test.ts +68 -0
  599. package/src/cli/commands/keys.ts +125 -0
  600. package/src/cloudflare.ts +184 -36
  601. package/src/db/Db.test.ts +877 -0
  602. package/src/db/Db.ts +507 -1
  603. package/src/db/Schema.ts +75 -4
  604. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  605. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  606. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  607. package/src/db/tables/authAccounts.test.ts +30 -0
  608. package/src/db/tables/authAccounts.ts +1 -0
  609. package/src/db/tables/earnVaults.test.ts +34 -0
  610. package/src/db/tables/earnVaults.ts +17 -2
  611. package/src/db/tables/organizations.test.ts +148 -84
  612. package/src/db/tables/organizations.ts +11 -43
  613. package/src/db/tables/requestUsage.ts +13 -2
  614. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  615. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  616. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  617. package/src/db/tables/rewardRuns.ts +4 -0
  618. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  619. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  620. package/src/db/tables/routesDepositAddresses.ts +118 -34
  621. package/src/db/tables/routesDeposits.test.ts +133 -0
  622. package/src/db/tables/routesDeposits.ts +47 -26
  623. package/src/db/tables/routesIdempotency.test.ts +80 -0
  624. package/src/db/tables/routesIdempotency.ts +2 -0
  625. package/src/db/tables/routesPolicies.test.ts +143 -0
  626. package/src/db/tables/routesPolicies.ts +251 -0
  627. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  628. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  629. package/src/db/tables/routesTransfers.test.ts +183 -2
  630. package/src/db/tables/routesTransfers.ts +65 -6
  631. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  632. package/src/db/tables/sponsoredTransactions.ts +182 -38
  633. package/src/db/tables/users.test.ts +51 -0
  634. package/src/db/tables/users.ts +12 -0
  635. package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
  636. package/src/db/tables/verifiedTokenRequests.ts +80 -44
  637. package/src/handlers/internal/multisig.store.test.ts +120 -0
  638. package/src/handlers/internal/multisig.test.ts +389 -0
  639. package/src/handlers/internal/multisig.ts +13 -10
  640. package/src/handlers/relay.test.ts +259 -83
  641. package/src/handlers/relay.ts +36 -17
  642. package/src/internal/Auth.test.ts +383 -8
  643. package/src/internal/Auth.ts +272 -99
  644. package/src/internal/BetterAuth.test.ts +58 -22
  645. package/src/internal/BetterAuth.ts +23 -17
  646. package/src/internal/Cache.ts +3 -1
  647. package/src/internal/CliAuth.test.ts +279 -0
  648. package/src/internal/CliAuth.ts +319 -0
  649. package/src/internal/EarnSharePrices.test.ts +25 -0
  650. package/src/internal/EarnSharePrices.ts +9 -2
  651. package/src/internal/EarnVaults.test.ts +67 -0
  652. package/src/internal/EarnVaults.ts +299 -4
  653. package/src/internal/EarnWithdrawals.test.ts +315 -0
  654. package/src/internal/EarnWithdrawals.ts +266 -0
  655. package/src/internal/ExecutionContext.ts +31 -0
  656. package/src/internal/Log.test.ts +210 -0
  657. package/src/internal/Log.ts +180 -142
  658. package/src/internal/MetricSink.test.ts +190 -15
  659. package/src/internal/MetricSink.ts +27 -1
  660. package/src/internal/RateLimit.test.ts +144 -8
  661. package/src/internal/RateLimit.ts +254 -26
  662. package/src/internal/Store.ts +4 -5
  663. package/src/internal/Timing.test.ts +32 -0
  664. package/src/internal/Timing.ts +20 -1
  665. package/src/internal/Tron.test-d.ts +22 -0
  666. package/src/internal/Tron.test.ts +94 -0
  667. package/src/internal/Tron.ts +289 -0
  668. package/src/internal/Viem.rpc.test.ts +76 -0
  669. package/src/internal/Viem.ts +29 -6
  670. package/src/internal/rewards/Read.test.ts +109 -0
  671. package/src/internal/rewards/Read.ts +13 -4
  672. package/src/internal/routes/Action.test.ts +70 -0
  673. package/src/internal/routes/Action.ts +76 -1
  674. package/src/internal/routes/Chain.test.ts +18 -0
  675. package/src/internal/routes/Chain.ts +5 -0
  676. package/src/internal/routes/DepositAddress.ts +5 -0
  677. package/src/internal/routes/Evidence.test.ts +64 -0
  678. package/src/internal/routes/Evidence.ts +11 -3
  679. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  680. package/src/internal/routes/Policy.test.ts +316 -0
  681. package/src/internal/routes/Policy.ts +399 -0
  682. package/src/internal/routes/Provider.test.ts +103 -2
  683. package/src/internal/routes/Provider.ts +149 -27
  684. package/src/internal/routes/Quota.test.ts +149 -0
  685. package/src/internal/routes/Quota.ts +226 -0
  686. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  687. package/src/internal/routes/Reconciliation.test.ts +371 -13
  688. package/src/internal/routes/Reconciliation.ts +193 -42
  689. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  690. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  691. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  692. package/src/internal/routes/SourceObservation.test.ts +221 -0
  693. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  694. package/src/internal/routes/Subsidy.ts +4 -2
  695. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  696. package/src/internal/routes/Transfer.test.ts +130 -1
  697. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  698. package/src/internal/routes/Transfer.ts +866 -8
  699. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  700. package/src/internal/routes/TransferReconciliation.ts +91 -166
  701. package/src/internal/routes/TransferSettlement.ts +48 -0
  702. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  703. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  704. package/src/internal/routes/TransferSubsidy.ts +87 -12
  705. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  706. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  707. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  708. package/src/internal/routes/index.test.ts +3 -0
  709. package/src/internal/routes/index.ts +3 -0
  710. package/src/internal/routes/providers/across.ts +13 -0
  711. package/src/internal/routes/providers/index.test.ts +141 -0
  712. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  713. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  714. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  715. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  716. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  717. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  718. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  719. package/src/internal/routes/providers/propAmm.ts +640 -0
  720. package/src/internal/routes/providers/relay.test.ts +1299 -18
  721. package/src/internal/routes/providers/relay.ts +424 -39
  722. package/src/internal/routes/providers/rhino.ts +14 -1
  723. package/src/internal/routes/providers/squid.ts +21 -0
  724. package/src/internal/routes/providers/stargate.test.ts +105 -1
  725. package/src/internal/routes/providers/stargate.ts +22 -9
  726. package/src/internal/routes/providers/symbiosis.ts +13 -47
  727. package/src/providers/index.test.ts +2 -0
  728. package/src/providers/index.ts +18 -0
  729. package/dist/admin/Access.d.ts +0 -39
  730. package/dist/admin/Access.d.ts.map +0 -1
  731. package/dist/admin/Access.js +0 -73
  732. package/dist/admin/Access.js.map +0 -1
  733. package/src/admin/Access.test.ts +0 -130
  734. package/src/admin/Access.ts +0 -85
@@ -12,10 +12,24 @@ import { Abis, Addresses } from 'viem/tempo'
12
12
  import * as z from 'zod/mini'
13
13
 
14
14
  import * as Schema from './Schema.js'
15
+ import * as Store from './Store.js'
15
16
  import * as Viem from './Viem.js'
16
17
 
17
18
  /** Zod schemas owned by the Earn vault resolver. */
18
19
  export namespace schema {
20
+ /** Per-vault counterparties recognized by earnings accounting. */
21
+ export const Earnings = z.strictObject({
22
+ rewardDistributors: z
23
+ .array(Schema.Address)
24
+ .check(
25
+ z.maxLength(100),
26
+ z.describe(
27
+ 'Additional dedicated reward distributors, combined with recorded campaign history. Incoming shares count as earnings; exclude spenders and refund handlers.',
28
+ ),
29
+ z.meta({ examples: [[]] }),
30
+ ),
31
+ })
32
+
19
33
  const access = z
20
34
  .strictObject({
21
35
  status: z
@@ -244,11 +258,28 @@ export namespace schema {
244
258
  ),
245
259
  })
246
260
  .check(z.describe('Live state resolved from an Earn vault.'))
261
+
262
+ /** Schema for cached vault facts reused by later discovery misses. */
263
+ export const Hint = z
264
+ .strictObject({
265
+ assetToken: metadata,
266
+ engine: Schema.Address.check(z.describe('Engine the facts were read from.')),
267
+ engineAsset: Schema.Address.check(z.describe('Asset the engine accounts in.')),
268
+ engineType,
269
+ shareToken: metadata,
270
+ syncRedeem: z.boolean().check(z.describe('Whether the engine redeems synchronously.')),
271
+ venue: z
272
+ .nullable(Schema.Address)
273
+ .check(z.describe('Yield venue bound to the engine, or null when it exposes none.')),
274
+ })
275
+ .check(z.describe('Cached Earn vault facts, valid while the vault keeps the same engine.'))
247
276
  }
248
277
 
249
278
  /** Live state resolved from an Earn vault. */
250
279
  export type Discovery = z.output<typeof schema.Discovery>
251
280
 
281
+ type Hint = z.output<typeof schema.Hint>
282
+
252
283
  /** Onchain identity of an Earn vault. */
253
284
  export type ResolveInput = z.output<typeof schema.ResolveInput>
254
285
 
@@ -401,7 +432,12 @@ export async function resolve(
401
432
  const input = parseInput(options.input)
402
433
  const include = 'include' in options ? options.include : fullInclude
403
434
  const zones = options.zones.filter((zone) => zone.sourceId === input.chainId)
404
- return resolveOnchain(options.getClient(input.chainId), { include, input, zones })
435
+ return resolveOnchain(options.getClient(input.chainId), {
436
+ hints: options.hints,
437
+ include,
438
+ input,
439
+ zones,
440
+ })
405
441
  }
406
442
 
407
443
  export declare namespace resolve {
@@ -420,6 +456,8 @@ export declare namespace resolve {
420
456
  type Options = {
421
457
  /** Resolves the onchain client used to read the vault. */
422
458
  getClient: Viem.GetClient
459
+ /** Cache for vault facts that cut discovery to two round trips; every use is checked against live reads. */
460
+ hints?: Store.Store | undefined
423
461
  /** Chain and vault identity to resolve. */
424
462
  input: unknown
425
463
  /** Private zones available to Earn routers. */
@@ -566,6 +604,66 @@ export declare namespace resolveZoneRoutes {
566
604
  }
567
605
  }
568
606
 
607
+ /** Discovers a router's configured Zone and first code-bearing parent block. */
608
+ export async function discoverZoneRoute(options: discoverZoneRoute.Options): Promise<ZoneRoute> {
609
+ const client = options.getClient(options.discovery.chainId)
610
+ const bindings = await readZoneRouteBindings(client, { earnRouter: options.earnRouter }).catch(
611
+ (error) => {
612
+ if (!isMissingOptionalFunctionError(error)) throw error
613
+ throw new InvalidRegistryError('Earn router does not expose the required bindings.')
614
+ },
615
+ )
616
+ const zone = options.zones.find(
617
+ (candidate) =>
618
+ candidate.sourceId === options.discovery.chainId &&
619
+ deriveZoneId(candidate.id) === bindings.allowedZoneId,
620
+ )
621
+ if (!zone) throw new InvalidRegistryError(`Zone ${bindings.allowedZoneId} is not configured.`)
622
+
623
+ const tip = await client.getBlockNumber()
624
+ const codeAt = async (blockNumber: bigint) => {
625
+ try {
626
+ return await client.getCode({ address: options.earnRouter, blockNumber })
627
+ } catch {
628
+ throw new InvalidRegistryError(
629
+ 'Parent RPC cannot read historical code; configure an archive RPC to add this router.',
630
+ )
631
+ }
632
+ }
633
+ const tipCode = await codeAt(tip)
634
+ if (!tipCode || tipCode === '0x')
635
+ throw new InvalidRegistryError('Earn router has no code on the parent chain.')
636
+ let lower = 0n
637
+ let upper = tip
638
+ while (lower < upper) {
639
+ const middle = (lower + upper) / 2n
640
+ const code = await codeAt(middle)
641
+ if (code && code !== '0x') upper = middle
642
+ else lower = middle + 1n
643
+ }
644
+ if (lower > BigInt(Number.MAX_SAFE_INTEGER))
645
+ throw new InvalidRegistryError('Earn router deployment block exceeds the supported range.')
646
+ return {
647
+ chainId: zone.id,
648
+ deploymentBlock: Number(lower),
649
+ earnRouter: options.earnRouter,
650
+ }
651
+ }
652
+
653
+ export declare namespace discoverZoneRoute {
654
+ /** Inputs for discovering one parent-chain Earn router. */
655
+ type Options = {
656
+ /** Verified vault bound to the router. */
657
+ discovery: Discovery
658
+ /** Parent-chain client resolver. */
659
+ getClient: Viem.GetClient
660
+ /** Parent-chain router address. */
661
+ earnRouter: Address
662
+ /** Configured private Zones. */
663
+ zones: readonly Chain[]
664
+ }
665
+ }
666
+
569
667
  /** Infers the supported engine type from its capability fingerprint. */
570
668
  export function classifyEngineType(
571
669
  options: classifyEngineType.Options,
@@ -589,9 +687,7 @@ export declare namespace classifyEngineType {
589
687
  }
590
688
 
591
689
  async function resolveOnchain(client: Client, options: resolveOnchain.Options): Promise<Discovery> {
592
- const { include, input, zones } = options
593
- const includeAccess = include.includes('access')
594
- const includeCapabilities = include.includes('capabilities')
690
+ const { hints, include, input, zones } = options
595
691
  const actualChainId = await getChainId(client)
596
692
  if (actualChainId === undefined) throw new VerificationError(unavailable())
597
693
  if (actualChainId !== input.chainId)
@@ -607,6 +703,41 @@ async function resolveOnchain(client: Client, options: resolveOnchain.Options):
607
703
  status: 'unavailable',
608
704
  })
609
705
 
706
+ if (!hints) return (await resolveFully(client, { include, input, zones })).discovery
707
+
708
+ // The hint is memoized with the full read as its fetch, so request cache
709
+ // directives, timeouts, and background persistence apply to it.
710
+ const fresh: Discovery[] = []
711
+ const readHint = () =>
712
+ Store.memoize(
713
+ async () => {
714
+ const result = await resolveFully(client, { include, input, zones })
715
+ fresh.push(result.discovery)
716
+ return result.hint
717
+ },
718
+ { key: hintKey(input), store: hints, ttl: hintTtl },
719
+ )
720
+ const hint = schema.Hint.safeParse(await readHint())
721
+ if (fresh[0]) return fresh[0]
722
+ if (hint.success) {
723
+ const discovery = await resolveWithHint(client, { hint: hint.data, include, input, zones })
724
+ if (discovery) return discovery
725
+ }
726
+ // A stale or malformed hint is dropped and refilled by a full read.
727
+ await hints.delete(hintKey(input)).catch(() => {})
728
+ await readHint()
729
+ if (fresh[0]) return fresh[0]
730
+ return (await resolveFully(client, { include, input, zones })).discovery
731
+ }
732
+
733
+ /** Reads every field from the chain, returning the facts later misses may reuse. */
734
+ async function resolveFully(
735
+ client: Client,
736
+ options: resolveFully.Options,
737
+ ): Promise<resolveFully.ReturnType> {
738
+ const { include, input, zones } = options
739
+ const includeAccess = include.includes('access')
740
+ const includeCapabilities = include.includes('capabilities')
610
741
  const vault = await readVaultBindings(client, input.vaultAddress).catch(async (error) => {
611
742
  if (isMissingContractError(error) && !(await client.getCode({ address: input.vaultAddress })))
612
743
  throw new NotFoundError(
@@ -642,6 +773,139 @@ async function resolveOnchain(client: Client, options: resolveOnchain.Options):
642
773
  readTokenMetadata(client, vault.shareToken),
643
774
  ])
644
775
  const { asset: engineAsset, venue } = bindings
776
+ return {
777
+ discovery: assemble({
778
+ access,
779
+ asset,
780
+ engineAsset,
781
+ engineType,
782
+ includeCapabilities,
783
+ input,
784
+ routerCapabilities,
785
+ shareQuote,
786
+ shareToken,
787
+ vault,
788
+ venue,
789
+ withdrawable,
790
+ }),
791
+ hint: {
792
+ assetToken: { address: vault.asset, ...asset },
793
+ engine: vault.engine,
794
+ engineAsset,
795
+ engineType,
796
+ shareToken: { address: vault.shareToken, ...shareToken },
797
+ syncRedeem: vault.capabilities.syncRedeem,
798
+ venue,
799
+ },
800
+ }
801
+ }
802
+
803
+ declare namespace resolveFully {
804
+ /** Vault identity, requested fields, and Zones, without a hint cache. */
805
+ type Options = Omit<resolveOnchain.Options, 'hints'>
806
+
807
+ /** A complete discovery and the facts later misses may reuse. */
808
+ type ReturnType = {
809
+ /** Discovery resolved entirely from the chain. */
810
+ discovery: Discovery
811
+ /** Vault facts to cache for later misses. */
812
+ hint: Hint
813
+ }
814
+ }
815
+
816
+ /** Resolves from a hint in two round trips, or returns `undefined` when the live vault no longer matches it. */
817
+ async function resolveWithHint(
818
+ client: Client,
819
+ options: resolveWithHint.Options,
820
+ ): Promise<Discovery | undefined> {
821
+ const { hint, include, input, zones } = options
822
+ const includeCapabilities = include.includes('capabilities')
823
+ // Issued in one synchronous block so viem batches them into the vault read's first multicall.
824
+ const reads = {
825
+ access: include.includes('access')
826
+ ? readTransferPolicyId(client, hint.shareToken.address).then((transferPolicyId) =>
827
+ readAccess(client, transferPolicyId),
828
+ )
829
+ : Promise.resolve(undefined),
830
+ routerCapabilities: includeCapabilities
831
+ ? readRouterCapabilities(client, { chainId: input.chainId, zones })
832
+ : Promise.resolve({ deposit: false, redeem: false }),
833
+ shareQuote: readShareQuote(client, {
834
+ syncRedeem: hint.syncRedeem,
835
+ vaultAddress: input.vaultAddress,
836
+ }),
837
+ vault: readVaultBindings(client, input.vaultAddress),
838
+ withdrawable:
839
+ hint.engineType === 'erc4626' && hint.venue
840
+ ? readVenueLiquidity(client, { owner: hint.engine, venue: hint.venue })
841
+ : Promise.resolve(undefined),
842
+ }
843
+ // Mark every speculative read handled now; each is still awaited below when used.
844
+ for (const read of Object.values(reads)) read.catch(() => {})
845
+ const vault = await reads.vault.catch(() => undefined)
846
+ // The engine can be migrated; its asset and venue are immutable, so a matching engine proves them.
847
+ if (
848
+ !vault ||
849
+ !isAddressEqual(vault.engine, hint.engine) ||
850
+ !isAddressEqual(vault.asset, hint.assetToken.address) ||
851
+ !isAddressEqual(vault.shareToken, hint.shareToken.address) ||
852
+ vault.capabilities.syncRedeem !== hint.syncRedeem ||
853
+ classifyEngineType(vault.capabilities) !== hint.engineType
854
+ )
855
+ return undefined
856
+ const [access, routerCapabilities, shareQuote, withdrawable] = await Promise.all([
857
+ reads.access,
858
+ reads.routerCapabilities,
859
+ reads.shareQuote,
860
+ reads.withdrawable,
861
+ ])
862
+ return assemble({
863
+ access,
864
+ asset: hint.assetToken,
865
+ engineAsset: hint.engineAsset,
866
+ engineType: hint.engineType,
867
+ includeCapabilities,
868
+ input,
869
+ routerCapabilities,
870
+ shareQuote,
871
+ shareToken: hint.shareToken,
872
+ vault,
873
+ venue: hint.venue,
874
+ withdrawable,
875
+ })
876
+ }
877
+
878
+ declare namespace resolveWithHint {
879
+ /** Full-read options plus the cached facts to check. */
880
+ type Options = resolveFully.Options & {
881
+ /** Cached vault facts, checked against the live vault before use. */
882
+ hint: Hint
883
+ }
884
+ }
885
+
886
+ /** How long cached vault facts live; every use still checks them against the live vault. */
887
+ const hintTtl = 24 * 60 * 60 * 1_000
888
+
889
+ function hintKey(input: ResolveInput): string {
890
+ return `earn-vault:hint:v1:${input.chainId}:${input.vaultAddress.toLowerCase()}`
891
+ }
892
+
893
+ /** Builds and verifies a discovery from its onchain parts. */
894
+ function assemble(options: assemble.Options): Discovery {
895
+ const {
896
+ access,
897
+ asset,
898
+ engineAsset,
899
+ engineType,
900
+ includeCapabilities,
901
+ input,
902
+ routerCapabilities,
903
+ shareQuote,
904
+ shareToken,
905
+ vault,
906
+ venue,
907
+ withdrawable,
908
+ } = options
645
909
  const assetToken = {
646
910
  address: vault.asset,
647
911
  currency: asset.currency,
@@ -724,8 +988,39 @@ async function resolveOnchain(client: Client, options: resolveOnchain.Options):
724
988
  })
725
989
  }
726
990
 
991
+ declare namespace assemble {
992
+ /** Onchain parts of one discovery. */
993
+ type Options = {
994
+ /** Share-token access, when requested. */
995
+ access: Discovery['access'] | undefined
996
+ /** Asset token metadata. */
997
+ asset: TokenMetadata
998
+ /** Asset the engine accounts in, checked against the vault asset. */
999
+ engineAsset: Address
1000
+ /** Engine type inferred from its capabilities. */
1001
+ engineType: classifyEngineType.ReturnType
1002
+ /** Whether to report vault capabilities. */
1003
+ includeCapabilities: boolean
1004
+ /** Vault identity. */
1005
+ input: ResolveInput
1006
+ /** Private-routing support of the configured Earn router. */
1007
+ routerCapabilities: RouterCapabilities
1008
+ /** Assets returned for the quoted share amount, when the engine can quote. */
1009
+ shareQuote: bigint | undefined
1010
+ /** Share token metadata. */
1011
+ shareToken: TokenMetadata
1012
+ /** Live vault bindings and state. */
1013
+ vault: VaultBindings
1014
+ /** Yield venue bound to the engine, when it exposes one. */
1015
+ venue: Address | null
1016
+ /** Assets the venue would release now, when it reports a limit. */
1017
+ withdrawable: bigint | undefined
1018
+ }
1019
+ }
1020
+
727
1021
  declare namespace resolveOnchain {
728
1022
  type Options = {
1023
+ hints: Store.Store | undefined
729
1024
  include: readonly resolve.Include[]
730
1025
  input: ResolveInput
731
1026
  zones: readonly Chain[]
@@ -0,0 +1,315 @@
1
+ import * as EarnWithdrawals from './EarnWithdrawals.js'
2
+ import * as Tidx from './Tidx.js'
3
+ import * as Viem from './Viem.js'
4
+
5
+ describe('match', () => {
6
+ test('attributes assets, not shares, and preserves the wallet debit identity', () => {
7
+ expect(EarnWithdrawals.match(input())).toMatchInlineSnapshot(`
8
+ [
9
+ {
10
+ "assets": 1000000n,
11
+ "logIndex": 0,
12
+ "transactionHash": "0xe1089b1668337e65bd642dbe0f3e9d37f379d78243a3a766d9954629e8524d8c",
13
+ },
14
+ ]
15
+ `)
16
+ const options = input()
17
+ expect(EarnWithdrawals.match({ ...options, events: [...options.events].reverse() })).toEqual(
18
+ EarnWithdrawals.match(options),
19
+ )
20
+ expect(EarnWithdrawals.match({ ...options, account: options.events[2]!.receiver })).toEqual([])
21
+ })
22
+
23
+ test('rejects missing, mismatched, cross-transaction, or reordered legs', () => {
24
+ const options = input()
25
+ for (let index = 0; index < options.events.length; index++) {
26
+ expect(
27
+ EarnWithdrawals.match({
28
+ ...options,
29
+ events: options.events.filter((_, i) => i !== index),
30
+ }),
31
+ ).toEqual([])
32
+ expect(
33
+ EarnWithdrawals.match({
34
+ ...options,
35
+ events: options.events.map((event, i) =>
36
+ i === index ? { ...event, shares: event.shares + 1n } : event,
37
+ ),
38
+ }),
39
+ ).toEqual([])
40
+ expect(
41
+ EarnWithdrawals.match({
42
+ ...options,
43
+ events: options.events.map((event, i) =>
44
+ i === index ? { ...event, transactionHash: `0x${'bb'.repeat(32)}` as const } : event,
45
+ ),
46
+ }),
47
+ ).toEqual([])
48
+ }
49
+ expect(
50
+ EarnWithdrawals.match({
51
+ ...options,
52
+ events: options.events.map((event) => ({ ...event, logIndex: 10 - event.logIndex })),
53
+ }),
54
+ ).toEqual([])
55
+ expect(EarnWithdrawals.match({ ...options, vault: options.account })).toEqual([])
56
+ })
57
+
58
+ test('does not credit shared-funder, duplicate-exit, or refund batches', () => {
59
+ const options = input()
60
+ for (const extra of [
61
+ { ...options.events[0]!, sender: options.events[2]!.receiver, logIndex: 1 },
62
+ { ...options.events[1]!, receiver: options.account, logIndex: 9 },
63
+ { ...options.events[2]!, logIndex: 12 },
64
+ ])
65
+ expect(EarnWithdrawals.match({ ...options, events: [...options.events, extra] })).toEqual([])
66
+ })
67
+
68
+ test('ignores zero-value share movements without accepting nonzero extra funders', () => {
69
+ const options = input()
70
+ const extra = { ...options.events[0]!, logIndex: 1, sender: options.events[2]!.receiver }
71
+ expect(
72
+ EarnWithdrawals.match({ ...options, events: [...options.events, { ...extra, shares: 0n }] }),
73
+ ).toEqual([
74
+ { assets: 1_000_000n, logIndex: 0, transactionHash: options.events[0]!.transactionHash },
75
+ ])
76
+ expect(
77
+ EarnWithdrawals.match({ ...options, events: [...options.events, { ...extra, shares: 1n }] }),
78
+ ).toEqual([])
79
+ })
80
+ })
81
+
82
+ describe('classify', () => {
83
+ test('counts gifts to arbitrary recipients and ignores self and zero transfers', () => {
84
+ const options = input()
85
+ const transfer = options.events[0]!
86
+ const gift = { ...transfer, receiver: options.events[2]!.receiver }
87
+ expect(
88
+ EarnWithdrawals.classify({
89
+ ...options,
90
+ events: [
91
+ gift,
92
+ { ...transfer, logIndex: 1, receiver: options.account },
93
+ { ...transfer, logIndex: 2, shares: 0n },
94
+ ],
95
+ }),
96
+ ).toEqual([
97
+ {
98
+ assets: undefined,
99
+ blockNumber: 39_097_691,
100
+ logIndex: 0,
101
+ shares: 499_897n,
102
+ transactionHash: gift.transactionHash,
103
+ },
104
+ ])
105
+ })
106
+
107
+ test.each(['withdrawal', 'request'] as const)('excludes a direct %s exactly once', (kind) => {
108
+ const options = input()
109
+ const transfer = { ...options.events[0]!, receiver: options.vault }
110
+ const exit = { ...options.events[2]!, sender: options.account, kind }
111
+ expect(EarnWithdrawals.classify({ ...options, events: [transfer, exit] })).toEqual([])
112
+ const second = { ...transfer, logIndex: 1 }
113
+ expect(EarnWithdrawals.classify({ ...options, events: [transfer, second, exit] })).toEqual([
114
+ {
115
+ assets: undefined,
116
+ blockNumber: transfer.blockNumber,
117
+ logIndex: 0,
118
+ shares: transfer.shares,
119
+ transactionHash: transfer.transactionHash,
120
+ },
121
+ ])
122
+ expect(
123
+ EarnWithdrawals.classify({
124
+ ...options,
125
+ events: [transfer, second, exit, { ...exit, logIndex: 12 }],
126
+ }),
127
+ ).toEqual([])
128
+ const extra = { ...transfer, logIndex: 11 }
129
+ expect(EarnWithdrawals.classify({ ...options, events: [extra, exit, transfer] })).toEqual([
130
+ {
131
+ assets: undefined,
132
+ blockNumber: 39_097_691,
133
+ logIndex: 11,
134
+ shares: 499_897n,
135
+ transactionHash: transfer.transactionHash,
136
+ },
137
+ ])
138
+ for (const unmatched of [
139
+ { ...exit, logIndex: 0 },
140
+ { ...exit, shares: exit.shares + 1n },
141
+ { ...exit, transactionHash: `0x${'bb'.repeat(32)}` as const },
142
+ ])
143
+ expect(EarnWithdrawals.classify({ ...options, events: [transfer, unmatched] })).toHaveLength(
144
+ 1,
145
+ )
146
+ })
147
+
148
+ test('values mediated async and ambiguous batches without crediting another funder’s proceeds', () => {
149
+ const options = input()
150
+ for (const events of [
151
+ options.events.map((event) =>
152
+ event.kind === 'withdrawal' ? { ...event, kind: 'request' as const } : event,
153
+ ),
154
+ [
155
+ ...options.events,
156
+ { ...options.events[0]!, sender: options.events[2]!.receiver, logIndex: 1 },
157
+ ],
158
+ [...options.events, { ...options.events[2]!, logIndex: 12 }],
159
+ ])
160
+ expect(EarnWithdrawals.classify({ ...options, events })).toEqual([
161
+ {
162
+ assets: undefined,
163
+ blockNumber: 39_097_691,
164
+ logIndex: 0,
165
+ shares: 499_897n,
166
+ transactionHash: options.events[0]!.transactionHash,
167
+ },
168
+ ])
169
+ expect(EarnWithdrawals.classify(options)[0]?.assets).toBe(1_000_000n)
170
+ })
171
+ })
172
+
173
+ describe('value', () => {
174
+ test('uses each transfer block’s quote and actual proceeds before quotes', async () => {
175
+ const client = Viem.getClient({ chainId: 4217 })
176
+ const options = input()
177
+ const withdrawal = EarnWithdrawals.classify(options)[0]!
178
+ // Fixed archive observations: 499,897 shares quote to 1,000,001 and 999,963 asset units at these blocks.
179
+ expect(
180
+ await EarnWithdrawals.value(client, {
181
+ vault: options.vault,
182
+ withdrawals: [
183
+ { ...withdrawal, assets: undefined },
184
+ { ...withdrawal, assets: undefined, blockNumber: 39_000_000 },
185
+ withdrawal,
186
+ ],
187
+ }),
188
+ ).toBe(2_999_964n)
189
+ })
190
+
191
+ test('does not turn an unavailable historical quote into a zero withdrawal', async () => {
192
+ const client = Viem.getClient({ chainId: 4217 })
193
+ const options = input()
194
+ const withdrawal = EarnWithdrawals.classify(options)[0]!
195
+ expect(
196
+ await EarnWithdrawals.value(client, {
197
+ vault: options.account,
198
+ withdrawals: [{ ...withdrawal, assets: undefined }],
199
+ }),
200
+ ).toBeUndefined()
201
+ expect(
202
+ await EarnWithdrawals.value(client, { vault: options.account, withdrawals: [withdrawal] }),
203
+ ).toBe(1_000_000n)
204
+ })
205
+ })
206
+
207
+ describe('read', () => {
208
+ test('reads and values a plain multi-recipient transfer batch without any vault exit', async () => {
209
+ const tidx = Tidx.getClient({
210
+ chainId: 4217,
211
+ tidx: {
212
+ auth: process.env.TIDX_AUTH,
213
+ baseUrl: Viem.resolveUrl(process.env.TIDX_URL, 4217) ?? Tidx.url[4217],
214
+ },
215
+ })
216
+ const vault = input().vault
217
+ const withdrawals = await EarnWithdrawals.read(tidx, {
218
+ account: '0xa65c6ed737b52543123817977d8d2c0e554bfc2d',
219
+ blockNumber: 37_539_309,
220
+ shareToken: '0x20c000000000000000000000baac91f6ca72f768',
221
+ startBlockNumber: 37_539_308,
222
+ vault,
223
+ })
224
+ expect(
225
+ withdrawals.map(({ assets, logIndex, shares }) => ({ assets, logIndex, shares })),
226
+ ).toEqual(
227
+ [91n, 92n, 181n, 1813n, 313n, 90n, 86n, 72n].map((shares, index) => ({
228
+ assets: undefined,
229
+ logIndex: 16 + index,
230
+ shares,
231
+ })),
232
+ )
233
+ expect(
234
+ await EarnWithdrawals.value(Viem.getClient({ chainId: 4217 }), { vault, withdrawals }),
235
+ ).toBe(5467n)
236
+ })
237
+
238
+ test('reads card withdrawals without configuration and respects the block window', async () => {
239
+ const tidx = Tidx.getClient({
240
+ chainId: 4217,
241
+ tidx: {
242
+ auth: process.env.TIDX_AUTH,
243
+ baseUrl: Viem.resolveUrl(process.env.TIDX_URL, 4217) ?? Tidx.url[4217],
244
+ },
245
+ })
246
+ const options = {
247
+ ...input(),
248
+ blockNumber: 39_097_691,
249
+ shareToken: '0x20c000000000000000000000baac91f6ca72f768' as const,
250
+ startBlockNumber: 39_097_690,
251
+ }
252
+ expect(await EarnWithdrawals.read(tidx, options)).toEqual([
253
+ {
254
+ assets: 1_000_000n,
255
+ blockNumber: 39_097_691,
256
+ logIndex: 0,
257
+ shares: 499_897n,
258
+ transactionHash: '0xe1089b1668337e65bd642dbe0f3e9d37f379d78243a3a766d9954629e8524d8c',
259
+ },
260
+ ])
261
+ expect(
262
+ (await EarnWithdrawals.read(tidx, { ...options, vault: options.account }))[0]?.assets,
263
+ ).toBeUndefined()
264
+ expect(
265
+ await EarnWithdrawals.read(tidx, { ...options, startBlockNumber: options.blockNumber }),
266
+ ).toEqual([])
267
+ expect(
268
+ await EarnWithdrawals.read(tidx, { ...options, blockNumber: options.startBlockNumber }),
269
+ ).toEqual([])
270
+ })
271
+ })
272
+
273
+ function input(): EarnWithdrawals.match.Options {
274
+ const account = '0x504a128461f2ee15b52a9d33812769e8cc31bc0d'
275
+ const spender = '0x3f58d4356cc5785de7962c274c48a748648fddf1'
276
+ const vault = '0xd730394f3bb85a4828e35fc5e361dcc9f894fa4f'
277
+ const transactionHash = '0xe1089b1668337e65bd642dbe0f3e9d37f379d78243a3a766d9954629e8524d8c'
278
+ // Captured receipt: 499,897 share units redeemed for 1,000,000 asset units, through a distinct receiver.
279
+ return {
280
+ account,
281
+ vault,
282
+ events: [
283
+ {
284
+ assets: 0n,
285
+ blockNumber: 39_097_691,
286
+ kind: 'transfer',
287
+ logIndex: 0,
288
+ receiver: spender,
289
+ sender: account,
290
+ shares: 499_897n,
291
+ transactionHash,
292
+ },
293
+ {
294
+ assets: 0n,
295
+ blockNumber: 39_097_691,
296
+ kind: 'transfer',
297
+ logIndex: 7,
298
+ receiver: vault,
299
+ sender: spender,
300
+ shares: 499_897n,
301
+ transactionHash,
302
+ },
303
+ {
304
+ assets: 1_000_000n,
305
+ blockNumber: 39_097_691,
306
+ kind: 'withdrawal',
307
+ logIndex: 10,
308
+ receiver: '0x39aaffa434a319393c45ba1571bff602086e7808',
309
+ sender: spender,
310
+ shares: 499_897n,
311
+ transactionHash,
312
+ },
313
+ ],
314
+ }
315
+ }