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
@@ -0,0 +1,452 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import * as Policies from './route-policies.js'
4
+
5
+ const route = {
6
+ sourceChainId: 'eip155:1',
7
+ sourceTokenId: 'usdc-ethereum',
8
+ destinationChainId: 'eip155:42161',
9
+ destinationTokenId: 'usdc-arbitrum',
10
+ providerId: 'stargate',
11
+ }
12
+
13
+ describe('serializeScope', () => {
14
+ it('serializes the full scope without undefined fields', () => {
15
+ expect(
16
+ Policies.serializeScope({
17
+ orgId: 'org with spaces',
18
+ projectId: 'project/one',
19
+ apiKeyId: 'key+one',
20
+ environment: 'sandbox',
21
+ }),
22
+ ).toMatchInlineSnapshot(
23
+ `"orgId=org+with+spaces&environment=sandbox&projectId=project%2Fone&apiKeyId=key%2Bone"`,
24
+ )
25
+ })
26
+ })
27
+
28
+ describe('effective', () => {
29
+ it('resolves asymmetric inherited defaults and provider terms through shared Policy.resolve', () => {
30
+ const payload: Policies.Payload = {
31
+ name: 'Project one',
32
+ scope: { orgId: 'org_1', projectId: 'project_1', environment: 'production' },
33
+ version: 7,
34
+ policy: { subsidyEnabled: false },
35
+ layers: [
36
+ {
37
+ scope: { orgId: 'org_1', environment: 'production' },
38
+ version: 3,
39
+ policy: { access: [], subsidyEnabled: true, subsidyPayer: 'enterprise', maxAmount: '91' },
40
+ },
41
+ {
42
+ scope: { orgId: 'org_1', projectId: 'project_1', environment: 'production' },
43
+ version: 7,
44
+ policy: { subsidyEnabled: false },
45
+ },
46
+ ],
47
+ legacy: { subsidyEnabled: false, subsidyPayer: 'enterprise', maxAmount: '2' },
48
+ routes: [
49
+ {
50
+ ...route,
51
+ label: 'USDC Ethereum → USDC Arbitrum',
52
+ sourceChainName: 'Ethereum',
53
+ sourceTokenSymbol: 'USDC',
54
+ destinationChainName: 'Arbitrum',
55
+ destinationTokenSymbol: 'USDC',
56
+ },
57
+ ],
58
+ }
59
+ expect(
60
+ Policies.effective(
61
+ payload,
62
+ {
63
+ access: null,
64
+ subsidyEnabled: true,
65
+ terms: [{ ...route, subsidyPayer: 'tempo', maxAmount: '17.25' }],
66
+ },
67
+ route,
68
+ ),
69
+ ).toMatchInlineSnapshot(`
70
+ {
71
+ "access": null,
72
+ "maxAmount": "17.25",
73
+ "subsidyEligible": true,
74
+ "subsidyEnabled": true,
75
+ "subsidyPayer": "tempo",
76
+ "subsidyRoutes": null,
77
+ "suspended": false,
78
+ }
79
+ `)
80
+ })
81
+ })
82
+
83
+ describe('review', () => {
84
+ it('keeps legacy access for child scopes until the organization opts in, while previewing an explicit organization draft', () => {
85
+ const scope = { orgId: 'org_legacy', environment: 'production' } as const
86
+ const payload: Policies.Payload = {
87
+ name: 'Legacy organization',
88
+ scope,
89
+ version: 0,
90
+ policy: {},
91
+ layers: [{ scope, policy: {}, version: 0 }],
92
+ routes: catalog,
93
+ legacy: { subsidyEnabled: false, maxAmount: '0', subsidyPayer: 'enterprise' },
94
+ }
95
+ expect(Policies.review(payload, {}).routes).toEqual([])
96
+ for (const child of [
97
+ { ...scope, projectId: 'project_1' },
98
+ { ...scope, apiKeyId: 'key_1' },
99
+ ]) {
100
+ const inherited = { ...payload, scope: child }
101
+ expect(Policies.review(inherited, {}).routes.map(({ route }) => route)).toEqual(catalog)
102
+ expect(Policies.review(inherited, { access: [] }).routes).toEqual([])
103
+ expect(
104
+ Policies.review(inherited, { access: [Policies.selectedRoute(catalog[0]!)!] }).routes.map(
105
+ ({ route }) => route,
106
+ ),
107
+ ).toEqual([catalog[0]])
108
+ expect(
109
+ Policies.review({ ...inherited, layers: [{ scope, policy: {}, version: 1 }] }, {}).routes,
110
+ ).toEqual([])
111
+ }
112
+ })
113
+
114
+ it('lists only effective routes and explains per-field inheritance, including equal-valued overrides', () => {
115
+ const relay = Policies.selectedRoute(catalog[0]!)!
116
+ const stargate = Policies.selectedRoute(catalog[1]!)!
117
+ const { providerId: _, ...any } = relay
118
+ const org = { orgId: 'org_review', environment: 'production' } as const
119
+ const project = { ...org, projectId: 'project_review' }
120
+ const scope = { ...project, apiKeyId: 'key_review' }
121
+ const payload: Policies.Payload = {
122
+ name: 'Review key',
123
+ scope,
124
+ version: 1,
125
+ policy: { access: [] },
126
+ routes: catalog,
127
+ legacy: { subsidyEnabled: false, maxAmount: '1', subsidyPayer: 'enterprise' },
128
+ layers: [
129
+ {
130
+ scope: org,
131
+ version: 1,
132
+ policy: {
133
+ access: [any],
134
+ terms: [
135
+ { ...any, subsidyEligible: false, subsidyPayer: 'tempo', maxAmount: '20' },
136
+ { ...relay, subsidyPayer: 'enterprise', maxAmount: '50' },
137
+ ],
138
+ },
139
+ },
140
+ {
141
+ scope: project,
142
+ version: 1,
143
+ policy: {
144
+ maxAmount: '9',
145
+ subsidyEnabled: true,
146
+ terms: [
147
+ { ...any, subsidyEligible: true },
148
+ { ...stargate, subsidyPayer: 'enterprise' },
149
+ ],
150
+ },
151
+ },
152
+ { scope, version: 1, policy: { access: [] } },
153
+ ],
154
+ }
155
+ const result = Policies.review(payload, { terms: [{ ...relay, maxAmount: '4' }] })
156
+ expect(result.accessSource).toBe('Organization')
157
+ expect(result.defaults).toEqual([{ scope: 'Project', policy: payload.layers[1]!.policy }])
158
+ expect(
159
+ result.routes.map(({ route, effective, sources }) => ({
160
+ provider: route.providerId,
161
+ cap: effective.maxAmount,
162
+ payer: effective.subsidyPayer,
163
+ eligible: effective.subsidyEligible,
164
+ sources,
165
+ })),
166
+ ).toEqual([
167
+ {
168
+ provider: 'relay',
169
+ cap: '4',
170
+ payer: 'enterprise',
171
+ eligible: true,
172
+ sources: {
173
+ maxAmount: undefined,
174
+ subsidyEnabled: 'Project · default',
175
+ subsidyEligible: 'Project · any-provider rule',
176
+ subsidyPayer: 'Organization · route rule',
177
+ },
178
+ },
179
+ {
180
+ provider: 'stargate',
181
+ cap: '9',
182
+ payer: 'enterprise',
183
+ eligible: true,
184
+ sources: {
185
+ maxAmount: 'Project · default',
186
+ subsidyEnabled: 'Project · default',
187
+ subsidyEligible: 'Project · any-provider rule',
188
+ subsidyPayer: 'Project · route rule',
189
+ },
190
+ },
191
+ ])
192
+ const override = Policies.review(payload, { access: [stargate], subsidyRoutes: [] })
193
+ expect(override.accessSource).toBe('API key')
194
+ expect(
195
+ override.routes.map(({ route, effective, sources }) => ({
196
+ provider: route.providerId,
197
+ eligible: effective.subsidyEligible,
198
+ source: sources.subsidyEligible,
199
+ })),
200
+ ).toEqual([{ provider: 'stargate', eligible: false, source: undefined }])
201
+ expect(payload.policy).toEqual({ access: [] })
202
+ })
203
+
204
+ it('handles missing policies, legacy wildcards, disabled subsidies, and suspension without inventing allowed routes', () => {
205
+ const payload: Policies.Payload = {
206
+ name: 'Review organization',
207
+ scope: { orgId: 'org_review', environment: 'production' },
208
+ version: 0,
209
+ policy: {},
210
+ layers: [],
211
+ routes: catalog,
212
+ legacy: { subsidyEnabled: false, maxAmount: '1', subsidyPayer: 'enterprise' },
213
+ }
214
+ expect(Policies.review(payload, {}).routes).toEqual([])
215
+ const all = Policies.review(payload, { access: null })
216
+ expect(all.routes.map(({ route }) => route.label)).toEqual([
217
+ 'Base USDC → Tempo USDC.e (relay)',
218
+ 'Base USDC → Tempo USDC.e (stargate)',
219
+ 'Ethereum USDT → Tempo USDT0 (relay)',
220
+ 'Base USDC → Arbitrum USDC (across)',
221
+ ])
222
+ expect(all.effective.subsidyEnabled).toBe(false)
223
+ expect(all.routes[0]?.sources.subsidyEnabled).toBeUndefined()
224
+ expect(all.routes[0]?.sources.subsidyPayer).toBeUndefined()
225
+ const child = Policies.review(
226
+ { ...payload, scope: { ...payload.scope, projectId: 'project_1' } },
227
+ { access: null },
228
+ )
229
+ expect(child.routes[0]?.sources.subsidyPayer).toBe('Organization · legacy default')
230
+ expect(Policies.review(payload, { access: null, suspended: true }).routes).toEqual([])
231
+ })
232
+
233
+ it('attributes explicit route enablement before legacy eligibility and defaults without changing saved values', () => {
234
+ const relay = Policies.selectedRoute(catalog[0]!)!
235
+ const { providerId: _, ...any } = relay
236
+ const scope = { orgId: 'org_review', environment: 'production' } as const
237
+ const policy: Policies.Overrides = {
238
+ access: [any],
239
+ subsidyEnabled: false,
240
+ subsidyRoutes: [],
241
+ maxAmount: '7',
242
+ terms: [
243
+ { ...any, subsidyEnabled: false },
244
+ {
245
+ ...relay,
246
+ subsidyEligible: false,
247
+ subsidyEnabled: true,
248
+ maxAmount: '0',
249
+ subsidyPayer: 'tempo',
250
+ },
251
+ ],
252
+ }
253
+ const payload: Policies.Payload = {
254
+ name: 'Review organization',
255
+ scope,
256
+ version: 1,
257
+ policy,
258
+ layers: [{ scope, version: 1, policy }],
259
+ routes: catalog,
260
+ legacy: { subsidyEnabled: false, maxAmount: '1', subsidyPayer: 'enterprise' },
261
+ }
262
+ const result = Policies.review(payload, policy)
263
+ expect(
264
+ result.routes.map(({ effective, sources }) => ({
265
+ enabled: effective.subsidyEnabled,
266
+ eligible: effective.subsidyEligible,
267
+ cap: effective.maxAmount,
268
+ sources,
269
+ })),
270
+ ).toEqual([
271
+ {
272
+ enabled: true,
273
+ eligible: true,
274
+ cap: '0',
275
+ sources: {
276
+ subsidyEnabled: undefined,
277
+ subsidyEligible: undefined,
278
+ maxAmount: undefined,
279
+ subsidyPayer: undefined,
280
+ },
281
+ },
282
+ {
283
+ enabled: false,
284
+ eligible: false,
285
+ cap: '7',
286
+ sources: {
287
+ subsidyEnabled: undefined,
288
+ subsidyEligible: undefined,
289
+ maxAmount: undefined,
290
+ subsidyPayer: undefined,
291
+ },
292
+ },
293
+ ])
294
+ expect(payload.policy.subsidyEnabled).toBe(false)
295
+ expect(payload.policy.terms?.[1]?.subsidyEligible).toBe(false)
296
+ })
297
+ })
298
+
299
+ describe('createSession', () => {
300
+ it('freezes the opened version and clones its draft across refreshed payloads', () => {
301
+ const opened = { version: 4, policy: { maxAmount: '11' } }
302
+ const session = Policies.createSession(opened)
303
+ opened.policy.maxAmount = '99'
304
+ expect({ session, changed: Policies.changed(session, opened.policy) }).toMatchInlineSnapshot(`
305
+ {
306
+ "changed": true,
307
+ "session": {
308
+ "baseVersion": 4,
309
+ "draft": {
310
+ "maxAmount": "11",
311
+ },
312
+ },
313
+ }
314
+ `)
315
+ })
316
+ })
317
+
318
+ describe('routeOptions', () => {
319
+ it('filters in both directions and deduplicates network/token choices across providers', () => {
320
+ expect(Policies.routeOptions(catalog, {}, 'sourceChainId')).toEqual([
321
+ { label: 'Base', value: 'eip155:8453' },
322
+ { label: 'Ethereum', value: 'eip155:1' },
323
+ ])
324
+ expect(
325
+ Policies.routeOptions(catalog, { destinationTokenId: 'usdt0' }, 'sourceChainId'),
326
+ ).toEqual([{ label: 'Ethereum', value: 'eip155:1' }])
327
+ expect(Policies.routeOptions(catalog, { providerId: 'across' }, 'destinationChainId')).toEqual([
328
+ { label: 'Arbitrum', value: 'eip155:42161' },
329
+ ])
330
+ expect(Policies.routeOptions(catalog, { sourceTokenId: 'usdt' }, 'destinationTokenId')).toEqual(
331
+ [{ label: 'USDT0', value: 'usdt0' }],
332
+ )
333
+ expect(
334
+ Policies.routeOptions(
335
+ catalog,
336
+ { sourceChainId: 'eip155:8453', destinationChainId: 'eip155:4217' },
337
+ 'providerId',
338
+ ),
339
+ ).toEqual([
340
+ { label: 'relay', value: 'relay' },
341
+ { label: 'stargate', value: 'stargate' },
342
+ ])
343
+ })
344
+
345
+ it('ignores its own filter and broadens other choices when a filter is cleared', () => {
346
+ expect(
347
+ Policies.routeOptions(
348
+ catalog,
349
+ { sourceChainId: 'eip155:8453', providerId: 'relay' },
350
+ 'providerId',
351
+ ),
352
+ ).toEqual([
353
+ { label: 'across', value: 'across' },
354
+ { label: 'relay', value: 'relay' },
355
+ { label: 'stargate', value: 'stargate' },
356
+ ])
357
+ expect(
358
+ Policies.routeOptions(
359
+ catalog,
360
+ { destinationTokenId: undefined, providerId: 'relay' },
361
+ 'sourceTokenId',
362
+ ),
363
+ ).toEqual([
364
+ { label: 'USDC', value: 'usdc' },
365
+ { label: 'USDT', value: 'usdt' },
366
+ ])
367
+ expect(
368
+ Policies.routeOptions(
369
+ catalog,
370
+ { sourceTokenId: 'usdt', providerId: 'stargate' },
371
+ 'destinationChainId',
372
+ ),
373
+ ).toEqual([])
374
+ expect(Policies.routeOptions([], {}, 'sourceChainId')).toEqual([])
375
+ })
376
+ })
377
+
378
+ describe('selectedRoute', () => {
379
+ it('requires both networks and tokens and preserves only policy identifiers', () => {
380
+ expect(
381
+ Policies.selectedRoute({
382
+ sourceChainId: 'eip155:8453',
383
+ sourceTokenId: 'usdc',
384
+ destinationChainId: 'eip155:4217',
385
+ }),
386
+ ).toBeUndefined()
387
+ expect(Policies.selectedRoute({ ...catalog[0]!, providerId: '' })).toEqual({
388
+ sourceChainId: 'eip155:8453',
389
+ sourceTokenId: 'usdc',
390
+ destinationChainId: 'eip155:4217',
391
+ destinationTokenId: 'usdce',
392
+ })
393
+ expect(Policies.selectedRoute(catalog[1]!)).toEqual({
394
+ sourceChainId: 'eip155:8453',
395
+ sourceTokenId: 'usdc',
396
+ destinationChainId: 'eip155:4217',
397
+ destinationTokenId: 'usdce',
398
+ providerId: 'stargate',
399
+ })
400
+ })
401
+ })
402
+
403
+ const catalog: Policies.Payload['routes'] = [
404
+ {
405
+ sourceChainId: 'eip155:8453',
406
+ sourceChainName: 'Base',
407
+ sourceTokenId: 'usdc',
408
+ sourceTokenSymbol: 'USDC',
409
+ destinationChainId: 'eip155:4217',
410
+ destinationChainName: 'Tempo',
411
+ destinationTokenId: 'usdce',
412
+ destinationTokenSymbol: 'USDC.e',
413
+ providerId: 'relay',
414
+ label: 'Base USDC → Tempo USDC.e (relay)',
415
+ },
416
+ {
417
+ sourceChainId: 'eip155:8453',
418
+ sourceChainName: 'Base',
419
+ sourceTokenId: 'usdc',
420
+ sourceTokenSymbol: 'USDC',
421
+ destinationChainId: 'eip155:4217',
422
+ destinationChainName: 'Tempo',
423
+ destinationTokenId: 'usdce',
424
+ destinationTokenSymbol: 'USDC.e',
425
+ providerId: 'stargate',
426
+ label: 'Base USDC → Tempo USDC.e (stargate)',
427
+ },
428
+ {
429
+ sourceChainId: 'eip155:1',
430
+ sourceChainName: 'Ethereum',
431
+ sourceTokenId: 'usdt',
432
+ sourceTokenSymbol: 'USDT',
433
+ destinationChainId: 'eip155:4217',
434
+ destinationChainName: 'Tempo',
435
+ destinationTokenId: 'usdt0',
436
+ destinationTokenSymbol: 'USDT0',
437
+ providerId: 'relay',
438
+ label: 'Ethereum USDT → Tempo USDT0 (relay)',
439
+ },
440
+ {
441
+ sourceChainId: 'eip155:8453',
442
+ sourceChainName: 'Base',
443
+ sourceTokenId: 'usdc',
444
+ sourceTokenSymbol: 'USDC',
445
+ destinationChainId: 'eip155:42161',
446
+ destinationChainName: 'Arbitrum',
447
+ destinationTokenId: 'usdc',
448
+ destinationTokenSymbol: 'USDC',
449
+ providerId: 'across',
450
+ label: 'Base USDC → Arbitrum USDC (across)',
451
+ },
452
+ ]
@@ -0,0 +1,232 @@
1
+ import * as ReactQuery from '@tanstack/react-query'
2
+ import * as z from 'zod/mini'
3
+
4
+ import type * as AdminPolicies from '../../../apps/route-policies.js'
5
+ import * as Policy from '../../../../internal/routes/Policy.js'
6
+ import * as Response from './response.js'
7
+
8
+ export type Environment = Policy.Scope['environment']
9
+ export type Payer = Policy.Payer
10
+ export type Rule = Policy.Rule
11
+ export type Overrides = Policy.Overrides
12
+ export type Scope = Policy.Scope
13
+ export type Payload = {
14
+ name: string | null
15
+ scope: Scope
16
+ version: number
17
+ policy: Overrides
18
+ layers: Array<{ scope: Scope; version: number; policy: Overrides }>
19
+ legacy: Policy.Legacy
20
+ routes: Array<z.output<typeof AdminPolicies.schema.Route>>
21
+ }
22
+
23
+ /** Partial catalog filters, not policy wildcards. */
24
+ export type RouteSelection = { [field in keyof Rule]?: Rule[field] | undefined }
25
+
26
+ /** Options matching every active filter except the field being edited. */
27
+ export function routeOptions(
28
+ routes: Payload['routes'],
29
+ selection: RouteSelection,
30
+ field: keyof Rule,
31
+ ) {
32
+ const labels = {
33
+ destinationChainId: 'destinationChainName',
34
+ destinationTokenId: 'destinationTokenSymbol',
35
+ providerId: 'providerId',
36
+ sourceChainId: 'sourceChainName',
37
+ sourceTokenId: 'sourceTokenSymbol',
38
+ } as const
39
+ const options = new Map<string, string>()
40
+ for (const route of routes) {
41
+ if (
42
+ !Object.entries(selection).every(
43
+ ([key, value]) => key === field || !value || route[key as keyof Rule] === value,
44
+ )
45
+ )
46
+ continue
47
+ const value = route[field]
48
+ if (value) options.set(value, route[labels[field]] ?? value)
49
+ }
50
+ return [...options]
51
+ .map(([value, label]) => ({ label, value }))
52
+ .sort((a, b) => a.label.localeCompare(b.label))
53
+ }
54
+
55
+ /** Converts a complete selection to a rule, excluding display metadata and unset provider. */
56
+ export function selectedRoute(selection: RouteSelection): Rule | undefined {
57
+ const { sourceChainId, sourceTokenId, destinationChainId, destinationTokenId, providerId } =
58
+ selection
59
+ if (!sourceChainId || !sourceTokenId || !destinationChainId || !destinationTokenId)
60
+ return undefined
61
+ return {
62
+ destinationChainId,
63
+ destinationTokenId,
64
+ ...(providerId ? { providerId } : {}),
65
+ sourceChainId,
66
+ sourceTokenId,
67
+ }
68
+ }
69
+
70
+ export const search = z.object({
71
+ orgId: z.string().check(z.minLength(1)),
72
+ environment: z.catch(z.optional(z.enum(['sandbox', 'production'])), undefined),
73
+ projectId: z.catch(z.optional(z.string()), undefined),
74
+ apiKeyId: z.catch(z.optional(z.string()), undefined),
75
+ })
76
+
77
+ export type EditSession = { baseVersion: number; draft: Overrides }
78
+
79
+ export function createSession(payload: Pick<Payload, 'version' | 'policy'>): EditSession {
80
+ return { baseVersion: payload.version, draft: structuredClone(payload.policy) }
81
+ }
82
+
83
+ export function serializeScope(scope: Scope) {
84
+ const query = new URLSearchParams()
85
+ query.set('orgId', scope.orgId)
86
+ query.set('environment', scope.environment)
87
+ if (scope.projectId) query.set('projectId', scope.projectId)
88
+ if (scope.apiKeyId) query.set('apiKeyId', scope.apiKeyId)
89
+ return query.toString()
90
+ }
91
+
92
+ export function effective(
93
+ payload: Pick<Payload, 'layers' | 'legacy' | 'scope'>,
94
+ draft: Overrides,
95
+ route?: Rule,
96
+ ) {
97
+ const organization = payload.layers.find(({ scope }) => !scope.projectId && !scope.apiKeyId)
98
+ return Policy.resolve({
99
+ ...((payload.scope.projectId || payload.scope.apiKeyId) && !organization?.version
100
+ ? { defaultAccess: null }
101
+ : {}),
102
+ layers: policyLayers(payload, draft).map((layer) => layer.policy),
103
+ legacy: payload.legacy,
104
+ ...(route ? { route } : {}),
105
+ })
106
+ }
107
+
108
+ /** Summarizes currently allowed catalog routes and the winning scope for each field. */
109
+ export function review(payload: Payload, draft: Overrides) {
110
+ const layers = policyLayers(payload, draft).toReversed()
111
+ const resolved = effective(payload, draft)
112
+ const access = layers.find((layer) => layer.policy.access !== undefined)
113
+ function source(
114
+ route: Rule,
115
+ field: 'subsidyEnabled' | 'subsidyEligible' | 'subsidyPayer' | 'maxAmount',
116
+ ) {
117
+ for (const layer of layers) {
118
+ const terms = layer.policy.terms?.filter((term) => Policy.allows([term], route))
119
+ const hasValue = (term: NonNullable<Overrides['terms']>[number]) =>
120
+ term[field] !== undefined ||
121
+ (field === 'subsidyEligible' && term.subsidyEnabled !== undefined)
122
+ const term =
123
+ terms?.find((term) => term.providerId !== undefined && hasValue(term)) ??
124
+ terms?.find((term) => term.providerId === undefined && hasValue(term))
125
+ const current = serializeScope(layer.scope) === serializeScope(payload.scope)
126
+ if (term)
127
+ return current
128
+ ? undefined
129
+ : `${scopeLabel(layer.scope)} · ${term.providerId ? 'route rule' : 'any-provider rule'}`
130
+ const key = field === 'subsidyEligible' ? 'subsidyRoutes' : field
131
+ if (layer.policy[key] !== undefined)
132
+ return current
133
+ ? undefined
134
+ : `${scopeLabel(layer.scope)} · ${field === 'subsidyEligible' ? 'eligibility list' : 'default'}`
135
+ }
136
+ // Legacy financial defaults belong to the organization, not the viewed child.
137
+ return field !== 'subsidyEligible' && (payload.scope.projectId || payload.scope.apiKeyId)
138
+ ? 'Organization · legacy default'
139
+ : undefined
140
+ }
141
+ return {
142
+ accessSource: access
143
+ ? scopeLabel(access.scope)
144
+ : resolved.access === null
145
+ ? 'Organization · legacy access'
146
+ : 'Default (no routes)',
147
+ defaults: layers
148
+ .filter(
149
+ ({ policy }) =>
150
+ policy.subsidyEnabled !== undefined ||
151
+ policy.subsidyPayer !== undefined ||
152
+ policy.maxAmount !== undefined ||
153
+ policy.subsidyRoutes !== undefined,
154
+ )
155
+ .map(({ scope, policy }) => ({ scope: scopeLabel(scope), policy })),
156
+ effective: resolved,
157
+ routes: payload.routes
158
+ .filter((route) => !resolved.suspended && Policy.allows(resolved.access, route))
159
+ .map((route) => ({
160
+ route,
161
+ effective: effective(payload, draft, route),
162
+ sources: {
163
+ maxAmount: source(route, 'maxAmount'),
164
+ subsidyEnabled: source(route, 'subsidyEnabled'),
165
+ subsidyEligible: source(route, 'subsidyEligible'),
166
+ subsidyPayer: source(route, 'subsidyPayer'),
167
+ },
168
+ })),
169
+ }
170
+ }
171
+
172
+ function scopeLabel(scope: Scope) {
173
+ return scope.apiKeyId ? 'API key' : scope.projectId ? 'Project' : 'Organization'
174
+ }
175
+
176
+ function policyLayers(payload: Pick<Payload, 'layers' | 'scope'>, draft: Overrides) {
177
+ const layers = payload.layers.map((layer) => ({
178
+ ...layer,
179
+ policy: serializeScope(layer.scope) === serializeScope(payload.scope) ? draft : layer.policy,
180
+ }))
181
+ if (
182
+ !payload.layers.some((layer) => serializeScope(layer.scope) === serializeScope(payload.scope))
183
+ )
184
+ layers.push({ scope: payload.scope, policy: draft, version: 0 })
185
+ return layers
186
+ }
187
+
188
+ export function changed(session: EditSession, original: Overrides) {
189
+ return JSON.stringify(session.draft) !== JSON.stringify(original)
190
+ }
191
+
192
+ function url(scope: Scope) {
193
+ const query = serializeScope(scope)
194
+ return `route-policies?${query}`
195
+ }
196
+
197
+ export namespace get {
198
+ export const key = (scope: Scope) => ['route-policies', scope] as const
199
+ export async function fn(scope: Scope) {
200
+ const response = await fetch(url(scope))
201
+ if (!response.ok)
202
+ throw new Error(
203
+ await Response.errorMessage(response, { fallback: 'Failed to load route policy.' }),
204
+ )
205
+ return (await response.json()) as Payload
206
+ }
207
+ export const options = (scope: Scope) =>
208
+ ReactQuery.queryOptions({ queryKey: key(scope), queryFn: () => fn(scope) })
209
+ }
210
+
211
+ export namespace put {
212
+ export async function fn(input: Pick<Payload, 'scope' | 'version' | 'policy'>) {
213
+ const response = await fetch(url(input.scope), {
214
+ method: 'PUT',
215
+ headers: { 'content-type': 'application/json' },
216
+ body: JSON.stringify(input),
217
+ })
218
+ if (response.status === 409) throw new StalePolicyError()
219
+ if (!response.ok)
220
+ throw new Error(
221
+ await Response.errorMessage(response, { fallback: 'Failed to save route policy.' }),
222
+ )
223
+ return (await response.json()) as Payload
224
+ }
225
+ }
226
+
227
+ export class StalePolicyError extends Error {
228
+ constructor() {
229
+ super('This policy changed after you opened it. Reload the latest version before saving.')
230
+ this.name = 'StalePolicyError'
231
+ }
232
+ }