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
@@ -1,12 +1,15 @@
1
1
  import { Client } from 'tapimo'
2
2
  import { Mpp as PublicMpp } from 'tapimo/mpp'
3
+ import { hc } from 'hono/client'
3
4
  import type * as z from 'zod/mini'
4
5
 
6
+ import type * as Admin from './admin/App.js'
5
7
  import * as Activities from './apps/data/routes/activities.js'
6
8
  import * as ApiKeys from './apps/management/routes/api-keys.js'
7
9
  import * as Balances from './apps/data/routes/balances.js'
8
10
  import * as Billing from './apps/management/routes/billing.js'
9
11
  import * as Blocks from './apps/data/routes/blocks.js'
12
+ import * as Cli from './apps/management/routes/cli.js'
10
13
  import * as Earn from './apps/data/routes/earn.js'
11
14
  import * as Exchanges from './apps/data/routes/exchanges.js'
12
15
  import * as Faucet from './apps/management/routes/faucet.js'
@@ -83,6 +86,23 @@ test('returns typed client', async () => {
83
86
  })
84
87
 
85
88
  describe('narrows responses by status', () => {
89
+ test('PUT /earn/verified-vaults preserves per-vault earnings configuration', async () => {
90
+ const client = hc<ReturnType<typeof Admin.create>>('https://admin.example')
91
+ const res = await client.earn['verified-vaults'].$put({
92
+ json: {
93
+ chainId: 4217,
94
+ earnings: { rewardDistributors: [] },
95
+ vaultAddress: `0x${'11'.repeat(20)}`,
96
+ },
97
+ })
98
+ if (res.status === 200) {
99
+ const json = await res.json()
100
+ expectTypeOf(json.earnings).toEqualTypeOf<{
101
+ rewardDistributors: `0x${string}`[]
102
+ } | null>()
103
+ }
104
+ })
105
+
86
106
  test('POST /v1/earn/rewards/eligibility', async () => {
87
107
  const client = Client.create()
88
108
  const res = await client.v1.earn.rewards.eligibility.$post({
@@ -576,6 +596,8 @@ describe('narrows responses by status', () => {
576
596
  expectTypeOf(json.block?.timestamp).toEqualTypeOf<string | undefined>()
577
597
  expectTypeOf(json.chainId).toEqualTypeOf<number>()
578
598
  expectTypeOf(json.id).toEqualTypeOf<`0x${string}`>()
599
+ expectTypeOf(json.privateAssetBalance).toEqualTypeOf<string | undefined>()
600
+ expectTypeOf(json.privateAssetToken).toEqualTypeOf<`0x${string}` | undefined>()
579
601
  expectTypeOf(json.shareAllowance).toEqualTypeOf<string>()
580
602
  expectTypeOf(json.shareBalance).toEqualTypeOf<string>()
581
603
  expectTypeOf(json.shareToken).toEqualTypeOf<`0x${string}`>()
@@ -666,6 +688,11 @@ describe('narrows responses by status', () => {
666
688
  address: `0x${'bb'.repeat(20)}`,
667
689
  vaultId: `0x${'aa'.repeat(20)}`,
668
690
  },
691
+ query: {
692
+ end: '2026-09-18T00:00:00.000Z',
693
+ period: 'custom',
694
+ start: '2026-09-11T00:00:00.000Z',
695
+ },
669
696
  })
670
697
 
671
698
  expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 404 | 502 | PaidAccessStatus>()
@@ -677,7 +704,7 @@ describe('narrows responses by status', () => {
677
704
  expectTypeOf(json.assetToken).toEqualTypeOf<`0x${string}`>()
678
705
  expectTypeOf(json.currentValue).toEqualTypeOf<string>()
679
706
  expectTypeOf(json.id).toEqualTypeOf<`0x${string}`>()
680
- expectTypeOf(json.period).toEqualTypeOf<'30d' | 'active' | 'lifetime'>()
707
+ expectTypeOf(json.period).toEqualTypeOf<'7d' | '30d' | 'active' | 'custom' | 'lifetime'>()
681
708
  expectTypeOf(json.status).toEqualTypeOf<
682
709
  'complete' | 'incomplete_cost_basis' | 'pending_redemption'
683
710
  >()
@@ -701,8 +728,11 @@ describe('narrows responses by status', () => {
701
728
  totalDeposited: string
702
729
  totalWithdrawn: string
703
730
  }>()
704
- if (json.status === 'complete' && json.period === '30d')
705
- expectTypeOf(json.windowEarnings).toEqualTypeOf<string>()
731
+ if (json.period === '7d' || json.period === '30d' || json.period === 'custom') {
732
+ expectTypeOf(json.start).toEqualTypeOf<string>()
733
+ expectTypeOf(json.end).toEqualTypeOf<string>()
734
+ if (json.status === 'complete') expectTypeOf(json.windowEarnings).toEqualTypeOf<string>()
735
+ }
706
736
  void json
707
737
  return
708
738
  }
@@ -1694,6 +1724,94 @@ describe('narrows responses by status', () => {
1694
1724
  }
1695
1725
  })
1696
1726
 
1727
+ test('POST /v1/cli/authorizations', async () => {
1728
+ const client = Client.create()
1729
+ const res = await client.v1.cli.authorizations.$post({
1730
+ json: { codeChallenge: 'E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM' },
1731
+ })
1732
+
1733
+ expectTypeOf(res.status).toEqualTypeOf<200 | 404 | 502 | PublicAccessStatus>()
1734
+
1735
+ switch (res.status) {
1736
+ case 200: {
1737
+ const json = await res.json()
1738
+ expectTypeOf(json).toEqualTypeOf<z.output<typeof Cli.schema.CreateResponse>>()
1739
+ return
1740
+ }
1741
+ case 404: {
1742
+ const json = await res.json()
1743
+ expectTypeOf(json.error.code).toEqualTypeOf<'cli_auth_not_enabled'>()
1744
+ return
1745
+ }
1746
+ }
1747
+ })
1748
+
1749
+ test('GET /v1/cli/authorizations/:code', async () => {
1750
+ const client = Client.create()
1751
+ const res = await client.v1.cli.authorizations[':code{[A-Za-z -]+}'].$get({
1752
+ param: { code: 'BCDF-GHJK' },
1753
+ })
1754
+
1755
+ expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 401 | 403 | 404 | 502>()
1756
+
1757
+ switch (res.status) {
1758
+ case 200: {
1759
+ const json = await res.json()
1760
+ expectTypeOf(json.status).toEqualTypeOf<'approved' | 'denied' | 'pending'>()
1761
+ return
1762
+ }
1763
+ case 404: {
1764
+ const json = await res.json()
1765
+ expectTypeOf(json.error.code).toEqualTypeOf<
1766
+ 'cli_auth_not_enabled' | 'cli_authorization_not_found'
1767
+ >()
1768
+ return
1769
+ }
1770
+ }
1771
+ })
1772
+
1773
+ test('POST /v1/cli/authorizations/:code/approve', async () => {
1774
+ const client = Client.create()
1775
+ const res = await client.v1.cli.authorizations[':code{[A-Za-z -]+}'].approve.$post({
1776
+ json: {},
1777
+ param: { code: 'BCDF-GHJK' },
1778
+ })
1779
+
1780
+ expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 401 | 403 | 404 | 409 | 502>()
1781
+
1782
+ switch (res.status) {
1783
+ case 200: {
1784
+ const json = await res.json()
1785
+ expectTypeOf(json.status).toEqualTypeOf<'approved' | 'denied'>()
1786
+ return
1787
+ }
1788
+ case 409: {
1789
+ const json = await res.json()
1790
+ expectTypeOf(json.error.code).toEqualTypeOf<'cli_authorization_decided'>()
1791
+ return
1792
+ }
1793
+ }
1794
+ })
1795
+
1796
+ test('POST /v1/cli/authorizations/:code/token', async () => {
1797
+ const client = Client.create()
1798
+ const res = await client.v1.cli.authorizations[':code{[A-Za-z -]+}'].token.$post({
1799
+ json: { codeVerifier: 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk' },
1800
+ param: { code: 'BCDF-GHJK' },
1801
+ })
1802
+
1803
+ expectTypeOf(res.status).toEqualTypeOf<200 | 404 | 502 | PublicAccessStatus>()
1804
+
1805
+ if (res.status === 200) {
1806
+ const json = await res.json()
1807
+ if (json.status === 'approved') expectTypeOf(json.token).toEqualTypeOf<string>()
1808
+ }
1809
+ if (res.status === 400) {
1810
+ const json = await res.json()
1811
+ expectTypeOf(json.error.code).toEqualTypeOf<Access400<'body_invalid' | 'param_invalid'>>()
1812
+ }
1813
+ })
1814
+
1697
1815
  test('POST /v1/invitations/:invitationId/accept', async () => {
1698
1816
  const client = Client.create()
1699
1817
  const res = await client.v1.invitations[':invitationId{inv_[A-Za-z0-9_-]+}'].accept.$post({
@@ -2499,7 +2617,7 @@ describe('narrows responses by status', () => {
2499
2617
  },
2500
2618
  })
2501
2619
 
2502
- expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 502 | PaidAccessStatus>()
2620
+ expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 409 | 502 | PaidAccessStatus>()
2503
2621
 
2504
2622
  switch (res.status) {
2505
2623
  case 200: {
@@ -2543,7 +2661,13 @@ describe('narrows responses by status', () => {
2543
2661
  }
2544
2662
  case 400: {
2545
2663
  const json = await res.json()
2546
- expectTypeOf(json.error.code).toEqualTypeOf<Access400<'query_invalid'>>()
2664
+ expectTypeOf(json.error.code).toEqualTypeOf<
2665
+ Access400<'query_invalid' | 'route_unavailable'>
2666
+ >()
2667
+ expectTypeOf(json.error.details).toEqualTypeOf<
2668
+ | readonly { message: string; path?: readonly (number | string)[] | undefined }[]
2669
+ | undefined
2670
+ >()
2547
2671
  expectTypeOf(json.error.message).toEqualTypeOf<string>()
2548
2672
  void json
2549
2673
  return
@@ -2651,6 +2775,14 @@ describe('narrows responses by status', () => {
2651
2775
  void json
2652
2776
  return
2653
2777
  }
2778
+ case 400: {
2779
+ const json = await res.json()
2780
+ expectTypeOf(json.error.code).toEqualTypeOf<
2781
+ 'amount_too_low' | 'api_key_malformed' | 'body_invalid'
2782
+ >()
2783
+ void json
2784
+ return
2785
+ }
2654
2786
  case 403: {
2655
2787
  const json = await res.json()
2656
2788
  expectTypeOf(json.error.code).toEqualTypeOf<
@@ -2659,21 +2791,29 @@ describe('narrows responses by status', () => {
2659
2791
  | 'billing_past_due'
2660
2792
  | 'billing_required'
2661
2793
  | 'routes_deposit_address_limit_exceeded'
2794
+ | 'routes_not_allowed'
2795
+ | 'routes_subsidy_not_allowed'
2662
2796
  | 'routes_subsidy_not_enabled'
2797
+ | 'routes_suspended'
2663
2798
  >()
2664
2799
  void json
2665
2800
  return
2666
2801
  }
2667
2802
  case 404: {
2668
2803
  const json = await res.json()
2669
- expectTypeOf(json.error.code).toEqualTypeOf<'deposit_address_not_available'>()
2804
+ expectTypeOf(json.error.code).toEqualTypeOf<
2805
+ 'deposit_address_not_available' | 'quote_not_available'
2806
+ >()
2670
2807
  void json
2671
2808
  return
2672
2809
  }
2673
2810
  case 409: {
2674
2811
  const json = await res.json()
2675
2812
  expectTypeOf(json.error.code).toEqualTypeOf<
2676
- 'idempotency_conflict' | 'idempotency_in_progress'
2813
+ | 'idempotency_conflict'
2814
+ | 'idempotency_in_progress'
2815
+ | 'route_policy_changed'
2816
+ | 'route_policy_identity_conflict'
2677
2817
  >()
2678
2818
  void json
2679
2819
  return
@@ -2888,7 +3028,6 @@ describe('narrows responses by status', () => {
2888
3028
  provider: 'stargate',
2889
3029
  recipient: `0x${'11'.repeat(20)}`,
2890
3030
  sender: `0x${'22'.repeat(20)}`,
2891
- sourceChain: 'eip155:8453',
2892
3031
  sourceToken: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
2893
3032
  } as const
2894
3033
  // @ts-expect-error `Idempotency-Key` is required for route transfer creation.
@@ -2897,6 +3036,10 @@ describe('narrows responses by status', () => {
2897
3036
  header: { 'idempotency-key': 'routes_01k1c5j8q8p0be6j5v9m6d1e4r' },
2898
3037
  json,
2899
3038
  })
3039
+ void client.v1.routes.transfers.$post({
3040
+ header: { 'idempotency-key': 'routes_explicit_source' },
3041
+ json: { ...json, sourceChain: 'eip155:4217' },
3042
+ })
2900
3043
 
2901
3044
  expectTypeOf(res.status).toEqualTypeOf<
2902
3045
  200 | 400 | 403 | 404 | 409 | 501 | 502 | 503 | PublicAccessStatus
@@ -2905,7 +3048,11 @@ describe('narrows responses by status', () => {
2905
3048
  switch (res.status) {
2906
3049
  case 200: {
2907
3050
  const json = await res.json()
2908
- expectTypeOf(json.action.type).toEqualTypeOf<'evm:calls'>()
3051
+ expectTypeOf(json.action.type).toEqualTypeOf<'evm:calls' | 'tron:calls'>()
3052
+ if (json.action.type === 'tron:calls') {
3053
+ expectTypeOf(json.action.calls[0]!.to).toEqualTypeOf<string>()
3054
+ expectTypeOf(json.action.calls[0]!.value).toEqualTypeOf<string>()
3055
+ }
2909
3056
  expectTypeOf(json.id).toEqualTypeOf<string>()
2910
3057
  expectTypeOf(json.status).toEqualTypeOf<
2911
3058
  z.output<typeof RoutesTransfers.schema.createRoutesTransfer.Response>['status']
@@ -2922,7 +3069,7 @@ describe('narrows responses by status', () => {
2922
3069
  case 409: {
2923
3070
  const json = await res.json()
2924
3071
  expectTypeOf(json.error.code).toEqualTypeOf<
2925
- 'idempotency_conflict' | 'idempotency_in_progress'
3072
+ 'idempotency_conflict' | 'idempotency_in_progress' | 'route_policy_changed'
2926
3073
  >()
2927
3074
  void json
2928
3075
  return
@@ -50,7 +50,7 @@ test('applies `apiKey` to canonical header over base headers', async () => {
50
50
  "tempo-api-key": "key_option",
51
51
  "user-agent": "tempo-api-test",
52
52
  },
53
- "url": "https://api.test/v1/blocks/latest?",
53
+ "url": "https://api.test/v1/blocks/latest",
54
54
  },
55
55
  ]
56
56
  `)
@@ -74,7 +74,7 @@ test('merges `apiKey` with dynamic base headers', async () => {
74
74
  "authorization": "Payment proof",
75
75
  "tempo-api-key": "key_option",
76
76
  },
77
- "url": "https://api.test/v1/blocks/latest?",
77
+ "url": "https://api.test/v1/blocks/latest",
78
78
  },
79
79
  ]
80
80
  `)
@@ -95,7 +95,7 @@ test('lets per-request headers override base `apiKey`', async () => {
95
95
  "headers": {
96
96
  "tempo-api-key": "key_request",
97
97
  },
98
- "url": "https://api.test/v1/blocks/latest?",
98
+ "url": "https://api.test/v1/blocks/latest",
99
99
  },
100
100
  ]
101
101
  `)
@@ -111,7 +111,7 @@ test('omits empty API keys', async () => {
111
111
  [
112
112
  {
113
113
  "headers": {},
114
- "url": "https://api.test/v1/blocks/latest?",
114
+ "url": "https://api.test/v1/blocks/latest",
115
115
  },
116
116
  ]
117
117
  `)
package/src/Scope.ts CHANGED
@@ -73,8 +73,7 @@ export const catalog = [
73
73
  selfServe: false,
74
74
  },
75
75
  {
76
- description:
77
- 'Legacy reward eligibility write scope retained for existing keys; registration requires wildcard access.',
76
+ description: 'Register wallet and Earn vault reward eligibility associations.',
78
77
  scope: 'rewards:write',
79
78
  selfServe: false,
80
79
  },
package/src/admin/App.ts CHANGED
@@ -20,6 +20,7 @@ import { apiKeys } from './apps/api-keys.js'
20
20
  import { earlyAccess } from './apps/early-access.js'
21
21
  import { earnVaults } from './apps/earn-vaults.js'
22
22
  import { routes } from './apps/routes.js'
23
+ import { routePolicies } from './apps/route-policies.js'
23
24
  import { routesSupport } from './apps/routes-support.js'
24
25
  import { organizations } from './apps/organizations.js'
25
26
  import { scopes } from './apps/scopes.js'
@@ -97,7 +98,7 @@ export function create(options: create.Options) {
97
98
  c.set('metrics', options.metrics)
98
99
  c.set('rateLimit', rateLimit)
99
100
  c.set('zones', zones)
100
- c.set('identity', await identify(c.req.raw))
101
+ c.set('identity', await identify(c.req.raw, c))
101
102
  try {
102
103
  return await next()
103
104
  } finally {
@@ -161,6 +162,8 @@ export function create(options: create.Options) {
161
162
  '/earn/verified-vaults/*',
162
163
  '/routes',
163
164
  '/routes/*',
165
+ '/route-policies',
166
+ '/route-policies/*',
164
167
  '/organizations',
165
168
  '/organizations/*',
166
169
  '/scopes',
@@ -202,6 +205,7 @@ export function create(options: create.Options) {
202
205
  .route('/earn/verified-vaults', earnVaults())
203
206
  .route('/routes/support', routesSupport())
204
207
  .route('/routes', routes())
208
+ .route('/route-policies', routePolicies())
205
209
  .route('/organizations', organizations())
206
210
  .route('/scopes', scopes())
207
211
  .route('/subsidies', subsidies())
@@ -272,11 +276,13 @@ export declare namespace create {
272
276
  /** Transactional email sender used for organization invitations. */
273
277
  email?: Email.Sender | undefined
274
278
  /**
275
- * Extracts the verified admin identity from a request, or `null` to deny.
276
- * Must only return an identity for an already-authenticated request (a
277
- * verified Access JWT, or a header set by a trusted proxy).
279
+ * Extracts an already-verified admin identity from the request or middleware
280
+ * context, or `null` to deny. Authentication middleware must run before this app.
278
281
  */
279
- identify: (request: Request) => Identity | null | Promise<Identity | null>
282
+ identify: (
283
+ request: Request,
284
+ context: Context<Environment>,
285
+ ) => Identity | null | Promise<Identity | null>
280
286
  /**
281
287
  * KV state store backing API-key records (shared with the main API's
282
288
  * `kv` option), provisioned against by the `/api-keys` routes.
@@ -2,7 +2,10 @@ import * as ApiKey from '../../ApiKey.js'
2
2
  import * as core_ApiKeys from '../../ApiKeys.js'
3
3
  import * as Organizations from '../../db/tables/organizations.js'
4
4
  import * as Projects from '../../db/tables/projects.js'
5
+ import * as RoutesDepositAddresses from '../../db/tables/routesDepositAddresses.js'
6
+ import * as RoutesPolicies from '../../db/tables/routesPolicies.js'
5
7
  import * as Users from '../../db/tables/users.js'
8
+ import * as Policy from '../../internal/routes/Policy.js'
6
9
 
7
10
  import * as TestAdmin from '../../../test/Admin.js'
8
11
  import * as TestApp from '../../../test/App.js'
@@ -342,8 +345,69 @@ describe('DELETE /api-keys/:id', () => {
342
345
  })
343
346
 
344
347
  describe('POST /api-keys/:id/rotate', () => {
348
+ test('allows the replacement of an unused one-off key to claim a deposit address', async () => {
349
+ const { client, db, store } = await setup()
350
+ const { record: source } = await core_ApiKeys.mint(store, {
351
+ scopes: ['routes:read', 'routes:write'],
352
+ })
353
+ expect(await Organizations.get(db, source.orgId)).toBeUndefined()
354
+ const response = await client['api-keys'][':id'].rotate.$post({ param: { id: source.id } })
355
+ expect(response.status).toBe(200)
356
+ const replacement = await TestApp.json(response, ApiKeys.schema.rotateApiKey.Response)
357
+ expect(replacement.orgId).toBe(source.orgId)
358
+ // Exercise the same owner/capacity boundary as POST /v1/routes/deposit-addresses.
359
+ await expect(
360
+ RoutesDepositAddresses.claimCreation(db, {
361
+ orgId: replacement.orgId,
362
+ claim: {
363
+ apiKeyId: replacement.id,
364
+ irrevocable: false,
365
+ keyHash: 'ab'.repeat(32),
366
+ requestHash: 'cd'.repeat(32),
367
+ ttlMs: 60_000,
368
+ },
369
+ }),
370
+ ).resolves.toMatchObject({ type: 'claimed' })
371
+ })
372
+
373
+ test('security: rotating a one-off key does not discard its route restrictions', async () => {
374
+ const { client, db, store } = await setup()
375
+ const { record: source } = await core_ApiKeys.mint(store, {
376
+ name: 'Restricted one-off',
377
+ scopes: ['routes:read', 'routes:write'],
378
+ })
379
+ // Deposit-address creation materializes the synthetic owner for one-off keys.
380
+ await Organizations.create(db, { id: source.orgId, name: 'One-off route owner' })
381
+ const scope = {
382
+ apiKeyId: source.id,
383
+ environment: source.environment,
384
+ orgId: source.orgId,
385
+ }
386
+ await RoutesPolicies.save(db, { scope, version: 0, policy: { access: [] } })
387
+
388
+ const response = await client['api-keys'][':id'].rotate.$post({ param: { id: source.id } })
389
+ expect(response.status).toBe(200)
390
+ const replacement = await TestApp.json(response, ApiKeys.schema.rotateApiKey.Response)
391
+ expect(replacement.orgId).toBe(source.orgId)
392
+ expect((await core_ApiKeys.resolve(store, replacement.token))?.scopes).toEqual(source.scopes)
393
+ const loaded = await RoutesPolicies.load(db, {
394
+ apiKeyId: replacement.id,
395
+ environment: replacement.environment,
396
+ orgId: replacement.orgId,
397
+ })
398
+ // Reproduce the runtime's default access for an owner with no org policy.
399
+ const effective = Policy.resolve({
400
+ layers: loaded.layers.map((layer) => layer.policy),
401
+ legacy: loaded.legacy,
402
+ ...(loaded.layers[0]?.version === 0 ? { defaultAccess: null } : {}),
403
+ })
404
+ expect(effective.access).toMatchInlineSnapshot(`[]`)
405
+ })
406
+
345
407
  test('mints a replacement with the source access and attribution', async () => {
346
- const { client, store } = await setup()
408
+ const { client, db, store } = await setup()
409
+ await Organizations.create(db, { id: 'org_privy', name: 'Privy' })
410
+ await Projects.create(db, { id: 'prj_privy', name: 'Zones', orgId: 'org_privy' })
347
411
  const { record: source, token: sourceToken } = await core_ApiKeys.mint(store, {
348
412
  allowedIps: ['203.0.113.0/24'],
349
413
  billingActive: true,
@@ -356,6 +420,16 @@ describe('POST /api-keys/:id/rotate', () => {
356
420
  rateLimits: { '*': { limit: 10_000, period: 'minute' } },
357
421
  scopes: ['zone:421700001:read', 'zone:421700001:write'],
358
422
  })
423
+ await RoutesPolicies.save(db, {
424
+ policy: { maxAmount: '12' },
425
+ scope: {
426
+ apiKeyId: source.id,
427
+ environment: 'sandbox',
428
+ orgId: source.orgId,
429
+ projectId: source.projectId,
430
+ },
431
+ version: 0,
432
+ })
359
433
 
360
434
  const response = await client['api-keys'][':id'].rotate.$post({
361
435
  param: { id: source.id },
@@ -382,6 +456,14 @@ describe('POST /api-keys/:id/rotate', () => {
382
456
  id: body.id,
383
457
  scopes: source.scopes,
384
458
  })
459
+ expect(
460
+ await RoutesPolicies.get(db, {
461
+ apiKeyId: body.id,
462
+ environment: 'sandbox',
463
+ orgId: source.orgId,
464
+ projectId: source.projectId,
465
+ }),
466
+ ).toMatchObject({ policy: { maxAmount: '12' }, version: 1 })
385
467
  })
386
468
 
387
469
  test('unknown id → 404', async () => {
@@ -441,7 +523,7 @@ describe('POST /api-keys/:id/rotate', () => {
441
523
  param: { id: source.id },
442
524
  })
443
525
  const replacement = await TestApp.json(rotateResponse, ApiKeys.schema.rotateApiKey.Response)
444
- expect(replacement.orgId).toBe(replacement.id)
526
+ expect(replacement.orgId).toBe(source.orgId)
445
527
 
446
528
  const updateResponse = await client['api-keys'][':id'].$patch({
447
529
  json: { orgId: organization.id },
@@ -599,6 +681,16 @@ describe('PATCH /api-keys/:id', () => {
599
681
  orgId: organization.id,
600
682
  scopes: ['data:read'],
601
683
  })
684
+ const originalScope = {
685
+ apiKeyId: record.id,
686
+ environment: record.environment,
687
+ orgId: organization.id,
688
+ } as const
689
+ await RoutesPolicies.save(db, {
690
+ policy: { maxAmount: '5' },
691
+ scope: originalScope,
692
+ version: 0,
693
+ })
602
694
  const response = await client['api-keys'][':id'].$patch({
603
695
  json: { orgId: other.id },
604
696
  param: { id: record.id },
@@ -607,6 +699,10 @@ describe('PATCH /api-keys/:id', () => {
607
699
  expect((await core_ApiKeys.resolve(store, token))?.orgId).toBe(other.id)
608
700
  expect(await core_ApiKeys.listByOrg(store, organization.id)).toEqual([])
609
701
  expect((await core_ApiKeys.listByOrg(store, other.id)).map(({ id }) => id)).toEqual([record.id])
702
+ expect(await RoutesPolicies.get(db, originalScope)).toMatchObject({ policy: {}, version: 2 })
703
+
704
+ await core_ApiKeys.updateBounded(db, store, record.id, { orgId: organization.id })
705
+ expect(await RoutesPolicies.get(db, originalScope)).toMatchObject({ policy: {}, version: 3 })
610
706
  })
611
707
 
612
708
  test('enforces the destination organization limit when changing attribution', async () => {
@@ -6,6 +6,7 @@ import * as ApiKeys from '../../ApiKeys.js'
6
6
  import * as Db from '../../db/Db.js'
7
7
  import * as Organizations from '../../db/tables/organizations.js'
8
8
  import * as Projects from '../../db/tables/projects.js'
9
+ import * as RoutesPolicies from '../../db/tables/routesPolicies.js'
9
10
  import * as Users from '../../db/tables/users.js'
10
11
  import * as OpenApi from '../../internal/OpenApi.js'
11
12
  import * as Response from '../../internal/Response.js'
@@ -377,20 +378,28 @@ export function apiKeys() {
377
378
  })
378
379
 
379
380
  try {
380
- const { record, token } = await ApiKeys.mintBounded(Db.get(c.get('db')), store, {
381
- allowedIps: source.allowedIps,
382
- createdBy: c.get('identity')!.email,
383
- environment: source.environment,
384
- scopes: [...new Set(source.scopes)],
385
- ...(source.billingActive === undefined ? {} : { billingActive: source.billingActive }),
386
- ...(source.expiresAt === undefined ? {} : { expiresAt: source.expiresAt }),
387
- ...(source.name === undefined ? {} : { name: source.name }),
388
- ...(source.orgId === source.id ? {} : { orgId: source.orgId }),
389
- ...(source.projectId === undefined ? {} : { projectId: source.projectId }),
390
- ...(source.rateLimits === undefined ? {} : { rateLimits: source.rateLimits }),
391
- })
381
+ const { record, token } = await ApiKeys.mintBounded(
382
+ Db.get(c.get('db')),
383
+ store,
384
+ {
385
+ allowedIps: source.allowedIps,
386
+ createdBy: c.get('identity')!.email,
387
+ environment: source.environment,
388
+ scopes: [...new Set(source.scopes)],
389
+ ...(source.billingActive === undefined
390
+ ? {}
391
+ : { billingActive: source.billingActive }),
392
+ ...(source.expiresAt === undefined ? {} : { expiresAt: source.expiresAt }),
393
+ ...(source.name === undefined ? {} : { name: source.name }),
394
+ orgId: source.orgId,
395
+ ...(source.projectId === undefined ? {} : { projectId: source.projectId }),
396
+ ...(source.rateLimits === undefined ? {} : { rateLimits: source.rateLimits }),
397
+ },
398
+ { policySourceApiKeyId: source.id },
399
+ )
392
400
  return c.json(Response.validated(schema.rotateApiKey.Response, { ...record, token }), 200)
393
401
  } catch (cause) {
402
+ if (cause instanceof RoutesPolicies.InvalidScopeError) return ownerNotFound(c)
394
403
  if (cause instanceof ApiKeys.OwnerDeletedError) return ownerNotFound(c)
395
404
  if (cause instanceof ApiKeys.LiveKeyLimitError) return keyLimitReached(c)
396
405
  return Response.upstream(c, cause)