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
@@ -190,6 +190,18 @@ export namespace schema {
190
190
  ),
191
191
  z.meta({ examples: ['relay', 'stargate'] }),
192
192
  ),
193
+ recipient: z
194
+ .optional(z.string().check(z.minLength(1), z.maxLength(128)))
195
+ .check(
196
+ z.describe('Destination account.'),
197
+ z.meta({ examples: ['0x1111111111111111111111111111111111111111'] }),
198
+ ),
199
+ sender: z
200
+ .optional(z.string().check(z.minLength(1), z.maxLength(128)))
201
+ .check(
202
+ z.describe('Source account that will execute the swap.'),
203
+ z.meta({ examples: ['0x2222222222222222222222222222222222222222'] }),
204
+ ),
193
205
  sourceAmount: PositiveDecimal.check(
194
206
  z.describe('Positive source token amount. Base units by default, so 1 USDC is `1000000`.'),
195
207
  z.meta({ examples: ['1000000'] }),
@@ -207,7 +219,7 @@ export namespace schema {
207
219
  sourceToken: z.string().check(
208
220
  z.minLength(1),
209
221
  z.describe(
210
- 'Source token symbol, contract address, or Tempo token key. Lookup is scoped to `sourceChain`; non-EVM addresses are case-sensitive. An unknown token returns an empty list.',
222
+ 'Source token symbol, address, or token key, scoped to `sourceChain`. Non-EVM addresses are case-sensitive. Unknown tokens return HTTP 400 with `route_unavailable`.',
211
223
  ),
212
224
  z.meta({
213
225
  examples: ['usdc', 'usdce', '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'],
@@ -222,6 +234,23 @@ export namespace schema {
222
234
  /** Machine-readable provider quote quality tier. */
223
235
  export const QualityTier = z.enum(['liquid', 'thin', 'unknown', 'unavailable'])
224
236
 
237
+ /** Public reasons a matching route cannot return a quote. */
238
+ export const UnavailableReason = z
239
+ .enum([
240
+ 'identity_required',
241
+ 'insufficient_liquidity',
242
+ 'invalid_identity',
243
+ 'price_unavailable',
244
+ 'recipient_not_allowed',
245
+ 'recipient_unsupported',
246
+ 'route_unavailable',
247
+ 'sender_not_allowed',
248
+ ])
249
+ .check(
250
+ z.describe('Reason the matching route could not return a quote.'),
251
+ z.meta({ examples: ['sender_not_allowed'] }),
252
+ )
253
+
225
254
  /** Quote data returned by a route provider. */
226
255
  export const GetQuoteResult = Schema.describe(
227
256
  z.object({
@@ -236,6 +265,7 @@ export namespace schema {
236
265
  tier: z.optional(QualityTier),
237
266
  }),
238
267
  ),
268
+ reason: z.optional(UnavailableReason),
239
269
  sampledAt: z.iso.datetime(),
240
270
  status: QuoteStatus,
241
271
  }),
@@ -277,6 +307,9 @@ export namespace schema {
277
307
  checkEndpoint: z
278
308
  .optional(z.string())
279
309
  .check(z.describe('Provider status endpoint for the original address request.')),
310
+ fixedRate: z
311
+ .optional(z.literal('1:1'))
312
+ .check(z.describe('Provider-guaranteed normalized delivery rate.')),
280
313
  requestId: z
281
314
  .string()
282
315
  .check(z.minLength(1), z.describe('Provider-issued address request identifier.')),
@@ -559,9 +592,21 @@ export declare namespace verifyDestinationDelivery {
559
592
 
560
593
  /** Destination delivery verification outcome. */
561
594
  type ReturnType =
595
+ | {
596
+ /** Recovery information for an operator when automatic delivery cannot continue. */
597
+ statusReason: Transfer.StatusReason
598
+ /** Delivery requires manual recovery. */
599
+ type: 'action-required'
600
+ }
562
601
  | { type: 'invalid' }
563
- | { type: 'pending' }
564
602
  | {
603
+ /** Updated private index cursor to persist before the next delivery check. */
604
+ providerState?: Transfer.ProviderState | undefined
605
+ type: 'pending'
606
+ }
607
+ | {
608
+ /** Exact destination amount proven by the provider delivery, when it differs from the quote. */
609
+ destinationAmount?: string | undefined
565
610
  /** Verified destination transaction reference. */
566
611
  transactionHash: string
567
612
  /** The destination delivery matches the stored transfer terms. */
@@ -625,6 +670,8 @@ export declare namespace createDepositAddress {
625
670
  refundAddress: string
626
671
  /** Whether Tempo guarantees normalized 1:1 delivery. */
627
672
  subsidize: boolean
673
+ /** Maximum provider fee sponsorship in decimal USD. */
674
+ subsidyMaxAmount?: string | undefined
628
675
  }
629
676
 
630
677
  /** Reusable address and private provider correlation. */
@@ -964,6 +1011,8 @@ export type ProviderAttempt =
964
1011
 
965
1012
  /** Bounded result for one provider attempt. */
966
1013
  export type ProviderAttemptResult = {
1014
+ /** Shared cooldown applied after an upstream rate-limit response. */
1015
+ cooldownMs?: number | undefined
967
1016
  /** Wall-clock duration of the provider attempt in milliseconds. */
968
1017
  durationMs: number
969
1018
  /** Failure class, present only when the provider attempt failed. */
@@ -974,6 +1023,8 @@ export type ProviderAttemptResult = {
974
1023
  operation: ProviderOperation
975
1024
  /** Provider attempt outcome. */
976
1025
  outcome: ProviderAttempt['outcome']
1026
+ /** Whether a rate-limit failure originated locally or upstream. */
1027
+ rateLimitSource?: 'local' | 'upstream' | undefined
977
1028
  }
978
1029
 
979
1030
  /** A provider failure retained for bounded request diagnostics. */
@@ -1104,6 +1155,8 @@ export async function getQuotes(options: getQuotes.Options) {
1104
1155
  destinationChain: options.destinationChain,
1105
1156
  destinationToken: options.destinationToken,
1106
1157
  provider: options.provider,
1158
+ recipient: options.recipient,
1159
+ sender: options.sender,
1107
1160
  sourceAmount: options.sourceAmount,
1108
1161
  sourceAmountUnits: options.sourceAmountUnits,
1109
1162
  sourceChain: options.sourceChain,
@@ -1117,7 +1170,7 @@ export async function getQuotes(options: getQuotes.Options) {
1117
1170
  outcome: result.outcome,
1118
1171
  provider,
1119
1172
  })
1120
- return 'quote' in result ? result.quote : undefined
1173
+ return result
1121
1174
  } catch (cause) {
1122
1175
  attempts.set(index, {
1123
1176
  cause,
@@ -1142,8 +1195,16 @@ export async function getQuotes(options: getQuotes.Options) {
1142
1195
  }
1143
1196
  }
1144
1197
  const quotes = results.flatMap((result) =>
1145
- result.status === 'fulfilled' && result.value ? [result.value] : [],
1198
+ result.status === 'fulfilled' && result.value.quote ? [result.value.quote] : [],
1146
1199
  )
1200
+ for (const result of results)
1201
+ if (result.status === 'fulfilled' && result.value.unavailable) {
1202
+ try {
1203
+ options.onUnavailable?.(result.value.unavailable)
1204
+ } catch {
1205
+ // Observer failures must not discard completed quotes or skip outcome reporting.
1206
+ }
1207
+ }
1147
1208
  const failures = results.flatMap((result, index) =>
1148
1209
  result.status === 'rejected'
1149
1210
  ? [
@@ -1249,6 +1310,8 @@ export declare namespace getQuotes {
1249
1310
  onAttempt?: ((attempt: ProviderAttempt) => void) | undefined
1250
1311
  /** Receives the bounded request-level quote result. */
1251
1312
  onResult?: ((result: QuoteRequestResult) => void) | undefined
1313
+ /** Receives a provider-neutral reason for each unavailable quote. */
1314
+ onUnavailable?: ((reason: z.output<typeof schema.UnavailableReason>) => void) | undefined
1252
1315
  /** Stable non-secret tenant identity for provider-local fairness. */
1253
1316
  quotaKey?: string | undefined
1254
1317
  /** Per-provider quote timeout in milliseconds. */
@@ -1262,8 +1325,7 @@ const defaultPrepareTimeoutMs = 10_000
1262
1325
  const defaultQuoteTtlMs = 60_000
1263
1326
 
1264
1327
  /**
1265
- * Provisions one reusable deposit address through the first deterministic
1266
- * capability-enabled provider. Returns `undefined` when no route is enabled.
1328
+ * Provisions a reusable address through the first eligible provider. Returns `undefined` without an eligible route; throws `ProviderUnavailableError` when the current quote is unavailable.
1267
1329
  */
1268
1330
  export async function createDepositAddress(
1269
1331
  options: createDepositAddress.Options,
@@ -1285,6 +1347,7 @@ export async function createDepositAddress(
1285
1347
  recipient: selected.recipient,
1286
1348
  refundAddress: selected.refundAddress,
1287
1349
  subsidize: options.subsidize,
1350
+ subsidyMaxAmount: options.subsidyMaxAmount,
1288
1351
  },
1289
1352
  signal,
1290
1353
  ),
@@ -1332,7 +1395,7 @@ export async function createDepositAddress(
1332
1395
  } catch {
1333
1396
  // Observability hooks never alter provisioning behavior.
1334
1397
  }
1335
- if (cause instanceof ProviderUnavailableError) return undefined
1398
+ if (cause instanceof ProviderUnavailableError) throw cause
1336
1399
  throw new ProviderQuoteError([{ cause, operation, provider: selected.provider }], [attempt])
1337
1400
  }
1338
1401
  }
@@ -1393,6 +1456,8 @@ export declare namespace createDepositAddress {
1393
1456
  refundAddress: string
1394
1457
  /** Whether Tempo guarantees normalized 1:1 delivery. */
1395
1458
  subsidize: boolean
1459
+ /** Maximum provider fee sponsorship in decimal USD. */
1460
+ subsidyMaxAmount?: string | undefined
1396
1461
  }
1397
1462
 
1398
1463
  /** Selected provider route and its reusable address. */
@@ -1464,20 +1529,27 @@ export async function prepareTransfer(
1464
1529
  basisPointScale
1465
1530
  if (BigInt(result.destinationAmountMin) < minimumAllowed) throw new ProviderPayloadError()
1466
1531
  }
1467
- if (result.action.type === 'evm:calls')
1532
+ if (result.action.type === 'evm:calls' || result.action.type === 'tron:calls')
1468
1533
  try {
1534
+ if (
1535
+ result.action.type === 'tron:calls' &&
1536
+ (candidate.sourceChain.kind !== 'tron' || !provider.validateTransferAction)
1537
+ )
1538
+ throw new ProviderPayloadError()
1469
1539
  const constraints = provider.validateTransferAction?.({
1470
1540
  ...parameters,
1471
1541
  action: result.action,
1472
1542
  destinationAmountMin: result.destinationAmountMin,
1473
1543
  })
1474
- Action.validateEvmCalls({
1475
- action: result.action,
1544
+ const bounds = {
1476
1545
  nativeValues: constraints?.nativeValues,
1477
1546
  sourceAmount: candidate.sourceAmount.amount,
1478
1547
  sourceTokenAddress: candidate.sourceToken.address,
1479
1548
  tokenApprovals: constraints?.tokenApprovals,
1480
- })
1549
+ }
1550
+ if (result.action.type === 'tron:calls')
1551
+ Action.validateTronCalls({ ...bounds, action: result.action })
1552
+ else Action.validateEvmCalls({ ...bounds, action: result.action })
1481
1553
  } catch (cause) {
1482
1554
  if (cause instanceof Action.InvalidActionError) throw new ProviderPayloadError()
1483
1555
  throw cause
@@ -1536,14 +1608,19 @@ export async function prepareTransfer(
1536
1608
  throw new ProviderQuoteError(failures, attempts)
1537
1609
  }
1538
1610
 
1611
+ const eligible = options.accept
1612
+ ? prepared.filter(({ candidate, result }) => options.accept!(candidate, result))
1613
+ : prepared
1614
+ if (eligible.length === 0) return undefined
1615
+
1539
1616
  // Deterministic selection: highest guaranteed minimum, then provider id.
1540
- prepared.sort((a, b) => {
1617
+ eligible.sort((a, b) => {
1541
1618
  const delta = BigInt(b.result.destinationAmountMin) - BigInt(a.result.destinationAmountMin)
1542
1619
  if (delta !== 0n) return delta > 0n ? 1 : -1
1543
1620
  return a.provider.id < b.provider.id ? -1 : 1
1544
1621
  })
1545
- const selected = prepared[0]!
1546
- const bestDestinationAmount = prepared.reduce(
1622
+ const selected = eligible[0]!
1623
+ const bestDestinationAmount = eligible.reduce(
1547
1624
  (best, entry) =>
1548
1625
  BigInt(entry.result.destinationAmount) > BigInt(best) ? entry.result.destinationAmount : best,
1549
1626
  selected.result.destinationAmount,
@@ -1551,7 +1628,7 @@ export async function prepareTransfer(
1551
1628
  return {
1552
1629
  ...selected,
1553
1630
  bestDestinationAmount,
1554
- preparedCount: prepared.length,
1631
+ preparedCount: eligible.length,
1555
1632
  recipient,
1556
1633
  sender,
1557
1634
  }
@@ -1560,6 +1637,8 @@ export async function prepareTransfer(
1560
1637
  export declare namespace prepareTransfer {
1561
1638
  /** Options for preparing one executable transfer. */
1562
1639
  type Options = getPrepareCandidates.Options & {
1640
+ /** Tests request-specific eligibility after provider validation, before ranking. */
1641
+ accept?: ((candidate: QuoteCandidate, result: ReturnType) => boolean) | undefined
1563
1642
  /** Receives one bounded observation for every provider attempt. */
1564
1643
  onAttempt?: ((attempt: ProviderAttempt) => void) | undefined
1565
1644
  /** Per-provider preparation timeout in milliseconds. */
@@ -1727,7 +1806,7 @@ export function failure(options: ProviderFailure): failure.Result {
1727
1806
  const code = errorCode(cause.body)
1728
1807
  return {
1729
1808
  ...(code === undefined ? {} : { code }),
1730
- failure: 'http',
1809
+ failure: cause.status === 429 ? 'rate_limit' : 'http',
1731
1810
  id: provider.id,
1732
1811
  operation,
1733
1812
  status: cause.status,
@@ -1794,10 +1873,28 @@ export async function requestJson(url: URL, options: requestJson.Options) {
1794
1873
  return text
1795
1874
  }
1796
1875
  })()
1797
- if (!response.ok) throw new ProviderResponseError(response.status, body)
1876
+ if (!response.ok)
1877
+ throw new ProviderResponseError(
1878
+ response.status,
1879
+ body,
1880
+ retryAfterMilliseconds(response.headers.get('retry-after')),
1881
+ )
1798
1882
  return body
1799
1883
  }
1800
1884
 
1885
+ function retryAfterMilliseconds(value: string | null) {
1886
+ if (value === null) return undefined
1887
+ const normalized = value.trim()
1888
+ if (/^\d+$/.test(normalized)) {
1889
+ const seconds = Number(normalized)
1890
+ const milliseconds = seconds * 1_000
1891
+ return Number.isSafeInteger(milliseconds) ? milliseconds : undefined
1892
+ }
1893
+ const date = Date.parse(normalized)
1894
+ if (Number.isNaN(date)) return undefined
1895
+ return Math.max(0, date - Date.now())
1896
+ }
1897
+
1801
1898
  export declare namespace requestJson {
1802
1899
  /** Provider request options. */
1803
1900
  type Options = {
@@ -1822,6 +1919,7 @@ export function unavailableResult(options: unavailableResult.Options): getQuote.
1822
1919
  sourceDetail: `${options.detail}:${options.message}`,
1823
1920
  tier: 'unavailable',
1824
1921
  },
1922
+ ...(options.reason ? { reason: options.reason } : {}),
1825
1923
  sampledAt: options.now.toISOString(),
1826
1924
  status: 'unavailable',
1827
1925
  }
@@ -1836,6 +1934,8 @@ export declare namespace unavailableResult {
1836
1934
  message: string
1837
1935
  /** Quote sample time. */
1838
1936
  now: Date
1937
+ /** Provider-neutral reason safe to explain to the caller. */
1938
+ reason?: z.output<typeof schema.UnavailableReason> | undefined
1839
1939
  /** Liquidity signal source. */
1840
1940
  source: string
1841
1941
  }
@@ -1883,7 +1983,11 @@ async function quoteCandidate(
1883
1983
  )
1884
1984
  if (!result.success) throw new ProviderPayloadError()
1885
1985
  const quote = result.data
1886
- if (quote.status === 'unavailable') return { outcome: quote.status }
1986
+ if (quote.status === 'unavailable')
1987
+ return {
1988
+ outcome: quote.status,
1989
+ unavailable: quote.reason ?? 'route_unavailable',
1990
+ }
1887
1991
  if (
1888
1992
  (quote.status !== 'available' && quote.status !== 'thin') ||
1889
1993
  quote.destinationAmount === undefined ||
@@ -2084,20 +2188,28 @@ function errorCode(input: unknown) {
2084
2188
 
2085
2189
  /** Formats one provider attempt for logs and aggregate metrics. */
2086
2190
  export function formatAttempt(attempt: ProviderAttempt): ProviderAttemptResult {
2191
+ const details =
2192
+ attempt.outcome === 'failed'
2193
+ ? failure({
2194
+ cause: attempt.cause,
2195
+ operation: attempt.operation,
2196
+ provider: attempt.provider,
2197
+ })
2198
+ : undefined
2199
+ const responseError =
2200
+ attempt.outcome === 'failed' && attempt.cause instanceof ProviderResponseError
2201
+ ? attempt.cause
2202
+ : undefined
2087
2203
  return {
2204
+ ...(responseError?.cooldownMs === undefined ? {} : { cooldownMs: responseError.cooldownMs }),
2088
2205
  durationMs: attempt.durationMs,
2089
- ...(attempt.outcome === 'failed'
2090
- ? {
2091
- failure: failure({
2092
- cause: attempt.cause,
2093
- operation: attempt.operation,
2094
- provider: attempt.provider,
2095
- }).failure,
2096
- }
2097
- : {}),
2206
+ ...(details === undefined ? {} : { failure: details.failure }),
2098
2207
  id: attempt.provider.id,
2099
2208
  operation: attempt.operation,
2100
2209
  outcome: attempt.outcome,
2210
+ ...(details?.failure === 'rate_limit'
2211
+ ? { rateLimitSource: responseError?.status === 429 ? 'upstream' : 'local' }
2212
+ : {}),
2101
2213
  }
2102
2214
  }
2103
2215
 
@@ -2276,6 +2388,11 @@ export class ProviderUnavailableError extends Error {
2276
2388
  override name = 'RoutesProvider.ProviderUnavailableError'
2277
2389
  }
2278
2390
 
2391
+ /** Error thrown when the requested deposit amount cannot cover route fees. */
2392
+ export class AmountTooLowError extends ProviderUnavailableError {
2393
+ override name = 'RoutesProvider.AmountTooLowError'
2394
+ }
2395
+
2279
2396
  /** Error thrown internally when a provider exceeds its quote timeout. */
2280
2397
  export class ProviderTimeoutError extends Error {
2281
2398
  override name = 'RoutesProvider.ProviderTimeoutError'
@@ -2290,11 +2407,16 @@ export class ProviderRateLimitError extends Error {
2290
2407
  export class ProviderResponseError extends Error {
2291
2408
  override name = 'RoutesProvider.ProviderResponseError'
2292
2409
 
2410
+ /** Effective shared cooldown applied after this response. */
2411
+ cooldownMs?: number
2412
+
2293
2413
  constructor(
2294
2414
  /** Provider response status. */
2295
2415
  readonly status: number,
2296
2416
  /** Parsed provider response body. */
2297
2417
  readonly body: unknown,
2418
+ /** Upstream retry delay parsed from `Retry-After`, when supplied. */
2419
+ readonly retryAfterMs?: number,
2298
2420
  ) {
2299
2421
  super(`Provider request failed with status ${status}`)
2300
2422
  }
@@ -0,0 +1,149 @@
1
+ import * as Store from '../Store.js'
2
+ import * as RoutesProvider from './Provider.js'
3
+ import * as ProviderQuota from './Quota.js'
4
+
5
+ describe('check', () => {
6
+ test('preserves a cooldown installed while a successful check is pending', async () => {
7
+ const store = Store.memory()
8
+ const now = new Date('2026-09-24T12:00:00.000Z')
9
+ const options = { key: 'quota', now }
10
+
11
+ await Promise.all([
12
+ ProviderQuota.check(store, options),
13
+ ProviderQuota.block(store, { ...options, durationMs: 60_000, windowMs: 1_000 }),
14
+ ])
15
+
16
+ await expect(
17
+ ProviderQuota.check(store, { ...options, now: new Date(now.getTime() + 1) }),
18
+ ).rejects.toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
19
+ await expect(
20
+ ProviderQuota.check(store, { ...options, now: new Date(now.getTime() + 60_000) }),
21
+ ).resolves.toBeUndefined()
22
+ })
23
+ })
24
+
25
+ describe('consume', () => {
26
+ test.each([10, 20])('accepts the full quota of %i under contention', async (limit) => {
27
+ const store = Store.memory()
28
+ const options = {
29
+ key: 'quota',
30
+ limit,
31
+ now: new Date('2026-09-24T12:00:00.000Z'),
32
+ windowMs: 1_000,
33
+ }
34
+ const results = await Promise.allSettled(
35
+ Array.from({ length: limit + 5 }, () => ProviderQuota.consume(store, options)),
36
+ )
37
+
38
+ expect(results.filter((result) => result.status === 'fulfilled')).toHaveLength(limit)
39
+ const rejected = results.filter((result) => result.status === 'rejected')
40
+ expect(rejected).toHaveLength(5)
41
+ for (const result of rejected)
42
+ expect(result.reason).toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
43
+ expect(JSON.parse((await store.get(options.key))!).count).toBe(limit)
44
+
45
+ // A rejected reservation must not prevent the next window from proceeding.
46
+ await ProviderQuota.consume(store, {
47
+ ...options,
48
+ now: new Date(options.now.getTime() + options.windowMs),
49
+ })
50
+ expect(JSON.parse((await store.get(options.key))!).count).toBe(1)
51
+ })
52
+ })
53
+
54
+ describe('block', () => {
55
+ test('persists the longest cooldown under contention', async () => {
56
+ const store = Store.memory()
57
+ const options = {
58
+ key: 'quota',
59
+ now: new Date('2026-09-24T12:00:00.000Z'),
60
+ windowMs: 1_000,
61
+ }
62
+ const results = await Promise.allSettled(
63
+ Array.from({ length: 20 }, (_, index) =>
64
+ ProviderQuota.block(store, { ...options, durationMs: (index + 1) * 1_000 }),
65
+ ),
66
+ )
67
+
68
+ expect(results.filter((result) => result.status === 'fulfilled')).toHaveLength(20)
69
+ expect(JSON.parse((await store.get(options.key))!).blockedUntil).toBe(
70
+ options.now.getTime() + 20_000,
71
+ )
72
+ await expect(
73
+ ProviderQuota.consume(store, {
74
+ ...options,
75
+ limit: 10,
76
+ now: new Date(options.now.getTime() + 19_999),
77
+ }),
78
+ ).rejects.toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
79
+ await expect(
80
+ ProviderQuota.consume(store, {
81
+ ...options,
82
+ limit: 10,
83
+ now: new Date(options.now.getTime() + 20_000),
84
+ }),
85
+ ).resolves.toBeUndefined()
86
+ })
87
+ })
88
+
89
+ describe('durableObject', () => {
90
+ test('uses one native RPC for quota state transitions', async () => {
91
+ const calls: string[] = []
92
+ let consumeAllowed = true
93
+ const namespace = {
94
+ getByName(name: string) {
95
+ expect(name).toBe('routes:relay:quota')
96
+ return {
97
+ async routesQuotaBlock() {
98
+ calls.push('block')
99
+ },
100
+ async routesQuotaCheck() {
101
+ calls.push('check')
102
+ return true
103
+ },
104
+ async routesQuotaConsume() {
105
+ calls.push('consume')
106
+ return consumeAllowed
107
+ },
108
+ }
109
+ },
110
+ } as unknown as Store.durableObject.Namespace
111
+ const store = ProviderQuota.durableObject(namespace, { name: 'routes:relay:quota' })
112
+ const now = new Date('2026-09-24T12:00:00.000Z')
113
+
114
+ await ProviderQuota.consume(store, {
115
+ key: 'routes:relay:quote-v2',
116
+ limit: 10,
117
+ now,
118
+ windowMs: 1_000,
119
+ })
120
+ await ProviderQuota.check(store, { key: 'routes:relay:adaptive', now })
121
+ await ProviderQuota.check(store, { key: 'routes:relay:adaptive', now })
122
+ await ProviderQuota.block(store, {
123
+ durationMs: 2_000,
124
+ key: 'routes:relay:adaptive',
125
+ now,
126
+ windowMs: 1_000,
127
+ })
128
+
129
+ expect(calls).toEqual(['consume', 'check', 'block'])
130
+ await expect(
131
+ ProviderQuota.check(store, {
132
+ key: 'routes:relay:adaptive',
133
+ now: new Date(now.getTime() + 1_000),
134
+ }),
135
+ ).rejects.toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
136
+ expect(calls).toEqual(['consume', 'check', 'block'])
137
+
138
+ consumeAllowed = false
139
+ await expect(
140
+ ProviderQuota.consume(store, {
141
+ key: 'routes:relay:quote-v2',
142
+ limit: 10,
143
+ now,
144
+ windowMs: 1_000,
145
+ }),
146
+ ).rejects.toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
147
+ expect(calls).toEqual(['consume', 'check', 'block', 'consume'])
148
+ })
149
+ })