tapimo 0.15.1 → 0.18.1

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 (709) 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 +893 -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 +70 -70
  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 +529 -76
  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 +157 -157
  45. package/dist/admin/index.d.ts +0 -1
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +0 -1
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/ui.generated.d.ts +1 -1
  50. package/dist/admin/ui.generated.d.ts.map +1 -1
  51. package/dist/admin/ui.generated.js +205 -201
  52. package/dist/admin/ui.generated.js.map +1 -1
  53. package/dist/analytics/Analytics.d.ts.map +1 -1
  54. package/dist/analytics/Analytics.js +65 -1
  55. package/dist/analytics/Analytics.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  57. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  58. package/dist/analytics/tables/requestEvents.js +58 -59
  59. package/dist/analytics/tables/requestEvents.js.map +1 -1
  60. package/dist/apps/data/App.d.ts +2709 -2670
  61. package/dist/apps/data/App.d.ts.map +1 -1
  62. package/dist/apps/data/routes/activities.d.ts +357 -357
  63. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  64. package/dist/apps/data/routes/activities.js +50 -0
  65. package/dist/apps/data/routes/activities.js.map +1 -1
  66. package/dist/apps/data/routes/addresses.d.ts +248 -248
  67. package/dist/apps/data/routes/balances.d.ts +22 -22
  68. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  69. package/dist/apps/data/routes/balances.js +5 -7
  70. package/dist/apps/data/routes/balances.js.map +1 -1
  71. package/dist/apps/data/routes/blocks.d.ts +125 -125
  72. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  73. package/dist/apps/data/routes/earn.d.ts +103 -12
  74. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  75. package/dist/apps/data/routes/earn.js +456 -220
  76. package/dist/apps/data/routes/earn.js.map +1 -1
  77. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  78. package/dist/apps/data/routes/exchanges.js +267 -97
  79. package/dist/apps/data/routes/exchanges.js.map +1 -1
  80. package/dist/apps/data/routes/fee-amm.d.ts +109 -127
  81. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.js +83 -54
  83. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +43 -43
  85. package/dist/apps/data/routes/receipts.d.ts +235 -235
  86. package/dist/apps/data/routes/rpc.d.ts +30 -30
  87. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  88. package/dist/apps/data/routes/tokens.js +11 -6
  89. package/dist/apps/data/routes/tokens.js.map +1 -1
  90. package/dist/apps/data/routes/transactions.d.ts +2 -0
  91. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  92. package/dist/apps/data/routes/transactions.js +30 -22
  93. package/dist/apps/data/routes/transactions.js.map +1 -1
  94. package/dist/apps/data/routes/transfers.d.ts +77 -77
  95. package/dist/apps/data/routes/valuation.d.ts +32 -32
  96. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  97. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  98. package/dist/apps/data/routes/webhooks.js +1 -1
  99. package/dist/apps/data/routes/webhooks.js.map +1 -1
  100. package/dist/apps/data/routes/zones.d.ts +31 -31
  101. package/dist/apps/management/App.d.ts +2909 -2064
  102. package/dist/apps/management/App.d.ts.map +1 -1
  103. package/dist/apps/management/App.js +2 -0
  104. package/dist/apps/management/App.js.map +1 -1
  105. package/dist/apps/management/Billing.d.ts +2 -4
  106. package/dist/apps/management/Billing.d.ts.map +1 -1
  107. package/dist/apps/management/Billing.js +65 -26
  108. package/dist/apps/management/Billing.js.map +1 -1
  109. package/dist/apps/management/routes/api-keys.d.ts +257 -245
  110. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  111. package/dist/apps/management/routes/api-keys.js +70 -11
  112. package/dist/apps/management/routes/api-keys.js.map +1 -1
  113. package/dist/apps/management/routes/billing.d.ts +84 -84
  114. package/dist/apps/management/routes/cli.d.ts +912 -0
  115. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  116. package/dist/apps/management/routes/cli.js +416 -0
  117. package/dist/apps/management/routes/cli.js.map +1 -0
  118. package/dist/apps/management/routes/faucet.d.ts +8 -8
  119. package/dist/apps/management/routes/invitations.d.ts +138 -138
  120. package/dist/apps/management/routes/invite-links.d.ts +172 -172
  121. package/dist/apps/management/routes/members.d.ts +16 -16
  122. package/dist/apps/management/routes/orgs.d.ts +104 -104
  123. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  124. package/dist/apps/management/routes/orgs.js +8 -2
  125. package/dist/apps/management/routes/orgs.js.map +1 -1
  126. package/dist/apps/management/routes/projects.d.ts +125 -125
  127. package/dist/apps/management/routes/usage.d.ts +8 -8
  128. package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
  129. package/dist/apps/management/routes/webhooks.d.ts +485 -485
  130. package/dist/apps/mpp/App.d.ts +44 -44
  131. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  132. package/dist/apps/mpp/internal/Policy.js +4 -2
  133. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  134. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  135. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  136. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  137. package/dist/apps/relay/App.d.ts +8 -0
  138. package/dist/apps/relay/App.d.ts.map +1 -1
  139. package/dist/apps/relay/App.js +16 -4
  140. package/dist/apps/relay/App.js.map +1 -1
  141. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  142. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  143. package/dist/apps/relay/Sponsorships.js +71 -60
  144. package/dist/apps/relay/Sponsorships.js.map +1 -1
  145. package/dist/apps/routes/Access.d.ts +53 -0
  146. package/dist/apps/routes/Access.d.ts.map +1 -1
  147. package/dist/apps/routes/Access.js +121 -0
  148. package/dist/apps/routes/Access.js.map +1 -1
  149. package/dist/apps/routes/App.d.ts +397 -158
  150. package/dist/apps/routes/App.d.ts.map +1 -1
  151. package/dist/apps/routes/App.js.map +1 -1
  152. package/dist/apps/routes/routes/chains.d.ts +25 -25
  153. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  154. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  155. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  156. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  157. package/dist/apps/routes/routes/quotes.d.ts +171 -81
  158. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  159. package/dist/apps/routes/routes/quotes.js +101 -27
  160. package/dist/apps/routes/routes/quotes.js.map +1 -1
  161. package/dist/apps/routes/routes/transfers.d.ts +532 -480
  162. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/transfers.js +182 -37
  164. package/dist/apps/routes/routes/transfers.js.map +1 -1
  165. package/dist/cli/ApiKeys.d.ts +120 -0
  166. package/dist/cli/ApiKeys.d.ts.map +1 -0
  167. package/dist/cli/ApiKeys.js +138 -0
  168. package/dist/cli/ApiKeys.js.map +1 -0
  169. package/dist/cli/Cli.d.ts +92 -34
  170. package/dist/cli/Cli.d.ts.map +1 -1
  171. package/dist/cli/Cli.js +188 -11
  172. package/dist/cli/Cli.js.map +1 -1
  173. package/dist/cli/Credentials.d.ts +95 -0
  174. package/dist/cli/Credentials.d.ts.map +1 -0
  175. package/dist/cli/Credentials.js +110 -0
  176. package/dist/cli/Credentials.js.map +1 -0
  177. package/dist/cli/Spec.d.ts +59 -0
  178. package/dist/cli/Spec.d.ts.map +1 -0
  179. package/dist/cli/Spec.js +77 -0
  180. package/dist/cli/Spec.js.map +1 -0
  181. package/dist/cli/bin.js +5 -1
  182. package/dist/cli/bin.js.map +1 -1
  183. package/dist/cli/commands/admin.d.ts +5 -5
  184. package/dist/cli/commands/admin.d.ts.map +1 -1
  185. package/dist/cli/commands/auth.d.ts +73 -0
  186. package/dist/cli/commands/auth.d.ts.map +1 -0
  187. package/dist/cli/commands/auth.js +204 -0
  188. package/dist/cli/commands/auth.js.map +1 -0
  189. package/dist/cli/commands/keys.d.ts +17 -0
  190. package/dist/cli/commands/keys.d.ts.map +1 -0
  191. package/dist/cli/commands/keys.js +109 -0
  192. package/dist/cli/commands/keys.js.map +1 -0
  193. package/dist/cloudflare.d.ts +27 -2
  194. package/dist/cloudflare.d.ts.map +1 -1
  195. package/dist/cloudflare.js +144 -17
  196. package/dist/cloudflare.js.map +1 -1
  197. package/dist/db/Db.d.ts +23 -0
  198. package/dist/db/Db.d.ts.map +1 -1
  199. package/dist/db/Db.js +413 -1
  200. package/dist/db/Db.js.map +1 -1
  201. package/dist/db/Schema.d.ts +44 -1
  202. package/dist/db/Schema.d.ts.map +1 -1
  203. package/dist/db/Schema.js +56 -3
  204. package/dist/db/Schema.js.map +1 -1
  205. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  206. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  207. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  208. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  209. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  210. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  211. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  212. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  213. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  214. package/dist/db/tables/authAccounts.js +1 -0
  215. package/dist/db/tables/authAccounts.js.map +1 -1
  216. package/dist/db/tables/earnVaults.d.ts +5 -1
  217. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  218. package/dist/db/tables/earnVaults.js +12 -1
  219. package/dist/db/tables/earnVaults.js.map +1 -1
  220. package/dist/db/tables/organizations.d.ts +4 -2
  221. package/dist/db/tables/organizations.d.ts.map +1 -1
  222. package/dist/db/tables/organizations.js +8 -34
  223. package/dist/db/tables/organizations.js.map +1 -1
  224. package/dist/db/tables/requestUsage.d.ts +5 -1
  225. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  226. package/dist/db/tables/requestUsage.js +10 -2
  227. package/dist/db/tables/requestUsage.js.map +1 -1
  228. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  229. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  230. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  231. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  232. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  233. package/dist/db/tables/rewardRuns.js +4 -0
  234. package/dist/db/tables/rewardRuns.js.map +1 -1
  235. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  236. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  237. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  238. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  239. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  240. package/dist/db/tables/routesDepositAddresses.js +84 -31
  241. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  242. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  243. package/dist/db/tables/routesDeposits.js +31 -21
  244. package/dist/db/tables/routesDeposits.js.map +1 -1
  245. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  246. package/dist/db/tables/routesIdempotency.js +2 -0
  247. package/dist/db/tables/routesIdempotency.js.map +1 -1
  248. package/dist/db/tables/routesPolicies.d.ts +58 -0
  249. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  250. package/dist/db/tables/routesPolicies.js +198 -0
  251. package/dist/db/tables/routesPolicies.js.map +1 -0
  252. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  253. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  254. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  255. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  256. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  257. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  258. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  259. package/dist/db/tables/routesTransfers.d.ts +26 -1
  260. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  261. package/dist/db/tables/routesTransfers.js +36 -6
  262. package/dist/db/tables/routesTransfers.js.map +1 -1
  263. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  264. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js +144 -33
  266. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  267. package/dist/db/tables/users.d.ts +2 -0
  268. package/dist/db/tables/users.d.ts.map +1 -1
  269. package/dist/db/tables/users.js +11 -0
  270. package/dist/db/tables/users.js.map +1 -1
  271. package/dist/handlers/internal/multisig.d.ts +1 -1
  272. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  273. package/dist/handlers/internal/multisig.js +3 -2
  274. package/dist/handlers/internal/multisig.js.map +1 -1
  275. package/dist/handlers/relay.d.ts +2 -0
  276. package/dist/handlers/relay.d.ts.map +1 -1
  277. package/dist/handlers/relay.js +34 -15
  278. package/dist/handlers/relay.js.map +1 -1
  279. package/dist/internal/Auth.d.ts +57 -6
  280. package/dist/internal/Auth.d.ts.map +1 -1
  281. package/dist/internal/Auth.js +182 -78
  282. package/dist/internal/Auth.js.map +1 -1
  283. package/dist/internal/BetterAuth.d.ts +22 -0
  284. package/dist/internal/BetterAuth.d.ts.map +1 -1
  285. package/dist/internal/BetterAuth.js +17 -14
  286. package/dist/internal/BetterAuth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts +5 -0
  288. package/dist/internal/Cache.d.ts.map +1 -1
  289. package/dist/internal/Cache.js +3 -1
  290. package/dist/internal/Cache.js.map +1 -1
  291. package/dist/internal/CliAuth.d.ts +243 -0
  292. package/dist/internal/CliAuth.d.ts.map +1 -0
  293. package/dist/internal/CliAuth.js +249 -0
  294. package/dist/internal/CliAuth.js.map +1 -0
  295. package/dist/internal/EarnSharePrices.d.ts +1 -1
  296. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  297. package/dist/internal/EarnSharePrices.js +7 -3
  298. package/dist/internal/EarnSharePrices.js.map +1 -1
  299. package/dist/internal/EarnVaults.d.ts +47 -0
  300. package/dist/internal/EarnVaults.d.ts.map +1 -1
  301. package/dist/internal/EarnVaults.js +188 -4
  302. package/dist/internal/EarnVaults.js.map +1 -1
  303. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  304. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  305. package/dist/internal/EarnWithdrawals.js +189 -0
  306. package/dist/internal/EarnWithdrawals.js.map +1 -0
  307. package/dist/internal/ExecutionContext.d.ts +21 -0
  308. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  309. package/dist/internal/ExecutionContext.js +16 -0
  310. package/dist/internal/ExecutionContext.js.map +1 -0
  311. package/dist/internal/Log.d.ts +7 -3
  312. package/dist/internal/Log.d.ts.map +1 -1
  313. package/dist/internal/Log.js +163 -130
  314. package/dist/internal/Log.js.map +1 -1
  315. package/dist/internal/MetricSink.d.ts.map +1 -1
  316. package/dist/internal/MetricSink.js +26 -1
  317. package/dist/internal/MetricSink.js.map +1 -1
  318. package/dist/internal/RateLimit.d.ts +67 -0
  319. package/dist/internal/RateLimit.d.ts.map +1 -1
  320. package/dist/internal/RateLimit.js +174 -27
  321. package/dist/internal/RateLimit.js.map +1 -1
  322. package/dist/internal/Store.d.ts +6 -0
  323. package/dist/internal/Store.d.ts.map +1 -1
  324. package/dist/internal/Store.js +4 -5
  325. package/dist/internal/Store.js.map +1 -1
  326. package/dist/internal/Timing.d.ts +6 -0
  327. package/dist/internal/Timing.d.ts.map +1 -1
  328. package/dist/internal/Timing.js +21 -1
  329. package/dist/internal/Timing.js.map +1 -1
  330. package/dist/internal/Tron.d.ts +124 -0
  331. package/dist/internal/Tron.d.ts.map +1 -0
  332. package/dist/internal/Tron.js +202 -0
  333. package/dist/internal/Tron.js.map +1 -0
  334. package/dist/internal/Viem.d.ts +4 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Viem.js +25 -6
  337. package/dist/internal/Viem.js.map +1 -1
  338. package/dist/internal/rewards/Read.d.ts +2 -2
  339. package/dist/internal/rewards/Read.d.ts.map +1 -1
  340. package/dist/internal/rewards/Read.js +11 -2
  341. package/dist/internal/rewards/Read.js.map +1 -1
  342. package/dist/internal/routes/Action.d.ts +27 -0
  343. package/dist/internal/routes/Action.d.ts.map +1 -1
  344. package/dist/internal/routes/Action.js +49 -1
  345. package/dist/internal/routes/Action.js.map +1 -1
  346. package/dist/internal/routes/Chain.d.ts +2 -0
  347. package/dist/internal/routes/Chain.d.ts.map +1 -1
  348. package/dist/internal/routes/Chain.js +4 -0
  349. package/dist/internal/routes/Chain.js.map +1 -1
  350. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  351. package/dist/internal/routes/DepositAddress.js +5 -0
  352. package/dist/internal/routes/DepositAddress.js.map +1 -1
  353. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  354. package/dist/internal/routes/Evidence.js +6 -2
  355. package/dist/internal/routes/Evidence.js.map +1 -1
  356. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  357. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  358. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  359. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  360. package/dist/internal/routes/Policy.d.ts +161 -0
  361. package/dist/internal/routes/Policy.d.ts.map +1 -0
  362. package/dist/internal/routes/Policy.js +249 -0
  363. package/dist/internal/routes/Policy.js.map +1 -0
  364. package/dist/internal/routes/Provider.d.ts +66 -3
  365. package/dist/internal/routes/Provider.d.ts.map +1 -1
  366. package/dist/internal/routes/Provider.js +106 -27
  367. package/dist/internal/routes/Provider.js.map +1 -1
  368. package/dist/internal/routes/Quota.d.ts +57 -0
  369. package/dist/internal/routes/Quota.d.ts.map +1 -0
  370. package/dist/internal/routes/Quota.js +144 -0
  371. package/dist/internal/routes/Quota.js.map +1 -0
  372. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  373. package/dist/internal/routes/Reconciliation.js +163 -47
  374. package/dist/internal/routes/Reconciliation.js.map +1 -1
  375. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  376. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  377. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  378. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  379. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  380. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  381. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  382. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  383. package/dist/internal/routes/Subsidy.d.ts +2 -2
  384. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  385. package/dist/internal/routes/Subsidy.js +2 -2
  386. package/dist/internal/routes/Subsidy.js.map +1 -1
  387. package/dist/internal/routes/Transfer.d.ts +229 -1
  388. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  389. package/dist/internal/routes/Transfer.js +644 -7
  390. package/dist/internal/routes/Transfer.js.map +1 -1
  391. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  392. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  393. package/dist/internal/routes/TransferReconciliation.js +83 -159
  394. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  395. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  396. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  397. package/dist/internal/routes/TransferSettlement.js +2 -0
  398. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  399. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  400. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  401. package/dist/internal/routes/TransferSubsidy.js +64 -5
  402. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  403. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  404. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  405. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  406. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  407. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  408. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  409. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  410. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  411. package/dist/internal/routes/index.d.ts +3 -0
  412. package/dist/internal/routes/index.d.ts.map +1 -1
  413. package/dist/internal/routes/index.js +3 -0
  414. package/dist/internal/routes/index.js.map +1 -1
  415. package/dist/internal/routes/providers/across.d.ts +3 -0
  416. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  417. package/dist/internal/routes/providers/across.js +11 -0
  418. package/dist/internal/routes/providers/across.js.map +1 -1
  419. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  420. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  421. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  422. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  423. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  424. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  425. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  426. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  427. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  428. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  429. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  430. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  431. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  432. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  434. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  435. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  436. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/propAmm.js +524 -0
  438. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  439. package/dist/internal/routes/providers/relay.d.ts +3 -0
  440. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  441. package/dist/internal/routes/providers/relay.js +352 -41
  442. package/dist/internal/routes/providers/relay.js.map +1 -1
  443. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  444. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  445. package/dist/internal/routes/providers/rhino.js +11 -0
  446. package/dist/internal/routes/providers/rhino.js.map +1 -1
  447. package/dist/internal/routes/providers/squid.d.ts +3 -0
  448. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  449. package/dist/internal/routes/providers/squid.js +19 -0
  450. package/dist/internal/routes/providers/squid.js.map +1 -1
  451. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  452. package/dist/internal/routes/providers/stargate.js +22 -9
  453. package/dist/internal/routes/providers/stargate.js.map +1 -1
  454. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  455. package/dist/internal/routes/providers/symbiosis.js +13 -17
  456. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  457. package/dist/providers/index.d.ts +14 -0
  458. package/dist/providers/index.d.ts.map +1 -1
  459. package/dist/providers/index.js +6 -0
  460. package/dist/providers/index.js.map +1 -1
  461. package/package.json +16 -6
  462. package/src/ApiKey.ts +7 -3
  463. package/src/ApiKeys.test.ts +652 -8
  464. package/src/ApiKeys.ts +191 -11
  465. package/src/App.test.ts +405 -18
  466. package/src/App.ts +51 -15
  467. package/src/Client.test-d.ts +157 -10
  468. package/src/Client.test.ts +4 -4
  469. package/src/Scope.ts +1 -2
  470. package/src/admin/App.ts +11 -5
  471. package/src/admin/apps/api-keys.test.ts +98 -2
  472. package/src/admin/apps/api-keys.ts +21 -12
  473. package/src/admin/apps/earn-vaults.test.ts +76 -7
  474. package/src/admin/apps/earn-vaults.ts +47 -8
  475. package/src/admin/apps/organizations.test.ts +147 -31
  476. package/src/admin/apps/organizations.ts +5 -4
  477. package/src/admin/apps/route-policies.test.ts +220 -0
  478. package/src/admin/apps/route-policies.ts +322 -0
  479. package/src/admin/apps/routes-support.test.ts +107 -2
  480. package/src/admin/apps/routes-support.ts +43 -3
  481. package/src/admin/apps/routes.test.ts +150 -0
  482. package/src/admin/apps/routes.ts +97 -1
  483. package/src/admin/apps/scopes.test.ts +1 -1
  484. package/src/admin/index.ts +0 -1
  485. package/src/admin/ui/plugin.ts +2 -1
  486. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  487. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  488. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  489. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  490. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  491. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  492. package/src/admin/ui/src/lib/routes.ts +34 -0
  493. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  494. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  495. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  496. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  497. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  498. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  499. package/src/admin/ui/src/routes/organizations.tsx +1 -0
  500. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  501. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  502. package/src/admin/ui/src/routes/routes.tsx +85 -2
  503. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  504. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  505. package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
  506. package/src/admin/ui.generated.ts +258 -202
  507. package/src/analytics/Analytics.test.ts +4 -50
  508. package/src/analytics/Analytics.ts +65 -1
  509. package/src/analytics/tables/requestEvents.test.ts +402 -1
  510. package/src/analytics/tables/requestEvents.ts +62 -93
  511. package/src/apps/data/routes/activities.test.ts +315 -14
  512. package/src/apps/data/routes/activities.ts +60 -0
  513. package/src/apps/data/routes/balances.ts +5 -7
  514. package/src/apps/data/routes/earn.bench.ts +18 -0
  515. package/src/apps/data/routes/earn.local.test.ts +507 -0
  516. package/src/apps/data/routes/earn.test.ts +405 -127
  517. package/src/apps/data/routes/earn.ts +660 -270
  518. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  519. package/src/apps/data/routes/exchanges.test.ts +166 -2
  520. package/src/apps/data/routes/exchanges.ts +308 -101
  521. package/src/apps/data/routes/fee-amm.test.ts +134 -2
  522. package/src/apps/data/routes/fee-amm.ts +122 -60
  523. package/src/apps/data/routes/receipts.test.ts +21 -18
  524. package/src/apps/data/routes/rpc.test.ts +2 -2
  525. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  526. package/src/apps/data/routes/tokens.test.ts +4 -4
  527. package/src/apps/data/routes/tokens.ts +11 -6
  528. package/src/apps/data/routes/transactions.test.ts +29 -0
  529. package/src/apps/data/routes/transactions.ts +33 -22
  530. package/src/apps/data/routes/webhooks.test.ts +12 -3
  531. package/src/apps/data/routes/webhooks.ts +2 -1
  532. package/src/apps/management/App.ts +4 -0
  533. package/src/apps/management/Billing.test.ts +253 -27
  534. package/src/apps/management/Billing.ts +83 -29
  535. package/src/apps/management/routes/api-keys.test.ts +1 -1
  536. package/src/apps/management/routes/api-keys.ts +85 -11
  537. package/src/apps/management/routes/billing.test.ts +68 -4
  538. package/src/apps/management/routes/cli.test.ts +370 -0
  539. package/src/apps/management/routes/cli.ts +533 -0
  540. package/src/apps/management/routes/me.test.ts +14 -4
  541. package/src/apps/management/routes/orgs.test.ts +108 -4
  542. package/src/apps/management/routes/orgs.ts +7 -2
  543. package/src/apps/management/routes/usage.test.ts +2 -2
  544. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  545. package/src/apps/mpp/internal/Policy.ts +6 -2
  546. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  547. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  548. package/src/apps/relay/App.test.ts +85 -1
  549. package/src/apps/relay/App.ts +28 -4
  550. package/src/apps/relay/Sponsorships.test.ts +97 -1
  551. package/src/apps/relay/Sponsorships.ts +77 -66
  552. package/src/apps/routes/Access.test.ts +319 -0
  553. package/src/apps/routes/Access.ts +147 -0
  554. package/src/apps/routes/App.ts +10 -0
  555. package/src/apps/routes/routes/chains.test.ts +3 -2
  556. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  557. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  558. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  559. package/src/apps/routes/routes/quotes.test.ts +81 -8
  560. package/src/apps/routes/routes/quotes.ts +109 -27
  561. package/src/apps/routes/routes/transfers.test.ts +252 -15
  562. package/src/apps/routes/routes/transfers.ts +212 -33
  563. package/src/cli/ApiKeys.test.ts +265 -0
  564. package/src/cli/ApiKeys.ts +189 -0
  565. package/src/cli/Cli.test.ts +188 -0
  566. package/src/cli/Cli.ts +280 -12
  567. package/src/cli/Credentials.test.ts +122 -0
  568. package/src/cli/Credentials.ts +144 -0
  569. package/src/cli/Spec.test.ts +133 -0
  570. package/src/cli/Spec.ts +132 -0
  571. package/src/cli/bin.test.ts +49 -0
  572. package/src/cli/bin.ts +5 -1
  573. package/src/cli/commands/auth.test.ts +138 -0
  574. package/src/cli/commands/auth.ts +254 -0
  575. package/src/cli/commands/keys.test.ts +68 -0
  576. package/src/cli/commands/keys.ts +125 -0
  577. package/src/cloudflare.ts +184 -36
  578. package/src/db/Db.test.ts +877 -0
  579. package/src/db/Db.ts +498 -1
  580. package/src/db/Schema.ts +75 -4
  581. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  582. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  583. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  584. package/src/db/tables/authAccounts.test.ts +30 -0
  585. package/src/db/tables/authAccounts.ts +1 -0
  586. package/src/db/tables/earnVaults.test.ts +34 -0
  587. package/src/db/tables/earnVaults.ts +17 -2
  588. package/src/db/tables/organizations.test.ts +148 -84
  589. package/src/db/tables/organizations.ts +11 -43
  590. package/src/db/tables/requestUsage.ts +13 -2
  591. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  592. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  593. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  594. package/src/db/tables/rewardRuns.ts +4 -0
  595. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  596. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  597. package/src/db/tables/routesDepositAddresses.ts +118 -34
  598. package/src/db/tables/routesDeposits.test.ts +66 -5
  599. package/src/db/tables/routesDeposits.ts +47 -26
  600. package/src/db/tables/routesIdempotency.test.ts +80 -0
  601. package/src/db/tables/routesIdempotency.ts +2 -0
  602. package/src/db/tables/routesPolicies.test.ts +143 -0
  603. package/src/db/tables/routesPolicies.ts +251 -0
  604. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  605. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  606. package/src/db/tables/routesTransfers.test.ts +183 -2
  607. package/src/db/tables/routesTransfers.ts +65 -6
  608. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  609. package/src/db/tables/sponsoredTransactions.ts +182 -38
  610. package/src/db/tables/users.test.ts +51 -0
  611. package/src/db/tables/users.ts +12 -0
  612. package/src/handlers/internal/multisig.store.test.ts +120 -0
  613. package/src/handlers/internal/multisig.test.ts +389 -0
  614. package/src/handlers/internal/multisig.ts +13 -10
  615. package/src/handlers/relay.test.ts +259 -83
  616. package/src/handlers/relay.ts +36 -17
  617. package/src/internal/Auth.test.ts +291 -8
  618. package/src/internal/Auth.ts +227 -96
  619. package/src/internal/BetterAuth.test.ts +58 -22
  620. package/src/internal/BetterAuth.ts +23 -17
  621. package/src/internal/Cache.ts +3 -1
  622. package/src/internal/CliAuth.test.ts +279 -0
  623. package/src/internal/CliAuth.ts +319 -0
  624. package/src/internal/EarnSharePrices.test.ts +25 -0
  625. package/src/internal/EarnSharePrices.ts +9 -2
  626. package/src/internal/EarnVaults.test.ts +67 -0
  627. package/src/internal/EarnVaults.ts +299 -4
  628. package/src/internal/EarnWithdrawals.test.ts +315 -0
  629. package/src/internal/EarnWithdrawals.ts +266 -0
  630. package/src/internal/ExecutionContext.ts +31 -0
  631. package/src/internal/Log.test.ts +210 -0
  632. package/src/internal/Log.ts +180 -142
  633. package/src/internal/MetricSink.test.ts +190 -15
  634. package/src/internal/MetricSink.ts +27 -1
  635. package/src/internal/RateLimit.test.ts +144 -8
  636. package/src/internal/RateLimit.ts +254 -26
  637. package/src/internal/Store.ts +4 -5
  638. package/src/internal/Timing.test.ts +32 -0
  639. package/src/internal/Timing.ts +20 -1
  640. package/src/internal/Tron.test-d.ts +22 -0
  641. package/src/internal/Tron.test.ts +94 -0
  642. package/src/internal/Tron.ts +289 -0
  643. package/src/internal/Viem.rpc.test.ts +76 -0
  644. package/src/internal/Viem.ts +29 -6
  645. package/src/internal/rewards/Read.test.ts +109 -0
  646. package/src/internal/rewards/Read.ts +13 -4
  647. package/src/internal/routes/Action.test.ts +70 -0
  648. package/src/internal/routes/Action.ts +76 -1
  649. package/src/internal/routes/Chain.test.ts +18 -0
  650. package/src/internal/routes/Chain.ts +5 -0
  651. package/src/internal/routes/DepositAddress.ts +5 -0
  652. package/src/internal/routes/Evidence.test.ts +64 -0
  653. package/src/internal/routes/Evidence.ts +11 -3
  654. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  655. package/src/internal/routes/Policy.test.ts +316 -0
  656. package/src/internal/routes/Policy.ts +399 -0
  657. package/src/internal/routes/Provider.test.ts +103 -2
  658. package/src/internal/routes/Provider.ts +149 -27
  659. package/src/internal/routes/Quota.test.ts +149 -0
  660. package/src/internal/routes/Quota.ts +226 -0
  661. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  662. package/src/internal/routes/Reconciliation.test.ts +371 -13
  663. package/src/internal/routes/Reconciliation.ts +193 -42
  664. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  665. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  666. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  667. package/src/internal/routes/SourceObservation.test.ts +221 -0
  668. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  669. package/src/internal/routes/Subsidy.ts +4 -2
  670. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  671. package/src/internal/routes/Transfer.test.ts +130 -1
  672. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  673. package/src/internal/routes/Transfer.ts +866 -8
  674. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  675. package/src/internal/routes/TransferReconciliation.ts +91 -166
  676. package/src/internal/routes/TransferSettlement.ts +48 -0
  677. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  678. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  679. package/src/internal/routes/TransferSubsidy.ts +87 -12
  680. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  681. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  682. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  683. package/src/internal/routes/index.test.ts +3 -0
  684. package/src/internal/routes/index.ts +3 -0
  685. package/src/internal/routes/providers/across.ts +13 -0
  686. package/src/internal/routes/providers/index.test.ts +141 -0
  687. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  688. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  689. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  690. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  691. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  692. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  693. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  694. package/src/internal/routes/providers/propAmm.ts +640 -0
  695. package/src/internal/routes/providers/relay.test.ts +1263 -41
  696. package/src/internal/routes/providers/relay.ts +423 -38
  697. package/src/internal/routes/providers/rhino.ts +14 -1
  698. package/src/internal/routes/providers/squid.ts +21 -0
  699. package/src/internal/routes/providers/stargate.test.ts +105 -1
  700. package/src/internal/routes/providers/stargate.ts +22 -9
  701. package/src/internal/routes/providers/symbiosis.ts +13 -47
  702. package/src/providers/index.test.ts +2 -0
  703. package/src/providers/index.ts +18 -0
  704. package/dist/admin/Access.d.ts +0 -39
  705. package/dist/admin/Access.d.ts.map +0 -1
  706. package/dist/admin/Access.js +0 -73
  707. package/dist/admin/Access.js.map +0 -1
  708. package/src/admin/Access.test.ts +0 -130
  709. package/src/admin/Access.ts +0 -85
@@ -0,0 +1,678 @@
1
+ import { useMutation, useQueryClient, useSuspenseQuery } from '@tanstack/react-query'
2
+ import { createFileRoute, Link, useNavigate } from '@tanstack/react-router'
3
+ import { Button, Input, Select } from 'regen-ui'
4
+ import { useEffect, useId, useState } from 'react'
5
+
6
+ import { Card, Page as PageFrame } from '../components/Page.js'
7
+ import { RoutePicker } from '../components/RoutePicker.js'
8
+ import * as Policies from '../lib/route-policies.js'
9
+
10
+ export const Route = createFileRoute('/route-policies')({
11
+ validateSearch: Policies.search,
12
+ loaderDeps: ({ search }) => search,
13
+ loader: ({ context, deps }) =>
14
+ context.queryClient.ensureQueryData(Policies.get.options(toScope(deps))),
15
+ component: Page,
16
+ })
17
+
18
+ function toScope(search: {
19
+ orgId: string
20
+ environment?: Policies.Environment
21
+ projectId?: string
22
+ apiKeyId?: string
23
+ }): Policies.Scope {
24
+ return {
25
+ orgId: search.orgId,
26
+ environment: search.environment ?? 'production',
27
+ ...(search.projectId ? { projectId: search.projectId } : {}),
28
+ ...(search.apiKeyId ? { apiKeyId: search.apiKeyId } : {}),
29
+ }
30
+ }
31
+
32
+ function Page() {
33
+ const search = Route.useSearch()
34
+ const scope = toScope(search)
35
+ const navigate = useNavigate({ from: Route.fullPath })
36
+ const query = useSuspenseQuery(Policies.get.options(scope))
37
+ return (
38
+ <Editor
39
+ key={Policies.serializeScope(scope)}
40
+ navigate={navigate}
41
+ payload={query.data}
42
+ refetch={query.refetch}
43
+ scope={scope}
44
+ search={search}
45
+ />
46
+ )
47
+ }
48
+
49
+ function Editor(options: Editor.Props) {
50
+ const { payload, scope } = options
51
+ const queryClient = useQueryClient()
52
+ const [session, setSession] = useState(() => Policies.createSession(payload))
53
+ const [savedDraft, setSavedDraft] = useState(payload.policy)
54
+ const [stale, setStale] = useState(false)
55
+ const [submitted, setSubmitted] = useState(false)
56
+ const draft = session.draft
57
+ const dirty = Policies.changed(session, savedDraft)
58
+ const mutation = useMutation({
59
+ mutationFn: Policies.put.fn,
60
+ onSuccess: (data) => {
61
+ queryClient.setQueryData(Policies.get.key(data.scope), data)
62
+ setSession(Policies.createSession(data))
63
+ setSavedDraft(data.policy)
64
+ setStale(false)
65
+ setSubmitted(false)
66
+ mutation.reset()
67
+ },
68
+ onError: (error) => error instanceof Policies.StalePolicyError && setStale(true),
69
+ })
70
+ const level = scope.apiKeyId ? 'API key' : scope.projectId ? 'Project' : 'Organization'
71
+
72
+ useEffect(() => {
73
+ const warn = (event: BeforeUnloadEvent) => dirty && event.preventDefault()
74
+ window.addEventListener('beforeunload', warn)
75
+ return () => window.removeEventListener('beforeunload', warn)
76
+ }, [dirty])
77
+
78
+ function reload() {
79
+ mutation.reset()
80
+ void options.refetch().then(({ data }) => {
81
+ if (data) {
82
+ setSession(Policies.createSession(data))
83
+ setSavedDraft(data.policy)
84
+ }
85
+ setStale(false)
86
+ })
87
+ }
88
+
89
+ function setDraft(value: Policies.Overrides) {
90
+ mutation.reset()
91
+ setSession((current) => ({ ...current, draft: value }))
92
+ }
93
+
94
+ return (
95
+ <PageFrame
96
+ title="Route policies"
97
+ description={`${level} overrides · ${scope.environment}`}
98
+ action={
99
+ <Button
100
+ render={<Link params={{ orgId: scope.orgId }} to="/organizations/$orgId" />}
101
+ onClick={(event) => {
102
+ if (dirty && !window.confirm('Discard unsaved route policy changes?'))
103
+ event.preventDefault()
104
+ }}
105
+ >
106
+ Organization
107
+ </Button>
108
+ }
109
+ >
110
+ <dl aria-label="Editing policy" className="flex min-w-0 flex-col gap-1">
111
+ <dt className="text-label-13 text-foreground-secondary">{level}</dt>
112
+ <dd className="text-copy-16 text-foreground break-words">
113
+ {payload.name ?? 'Unnamed key'}
114
+ </dd>
115
+ <dd className="font-mono text-copy-16 text-foreground-secondary break-all sm:text-copy-14">
116
+ {scope.apiKeyId ?? scope.projectId ?? scope.orgId}
117
+ </dd>
118
+ </dl>
119
+ <div className="flex flex-wrap gap-2">
120
+ <Select
121
+ aria-label="Environment"
122
+ disabled={scope.apiKeyId !== undefined}
123
+ items={[
124
+ { label: 'Production', value: 'production' },
125
+ { label: 'Sandbox', value: 'sandbox' },
126
+ ]}
127
+ value={scope.environment}
128
+ onChange={(environment) => {
129
+ if (dirty && !window.confirm('Discard unsaved route policy changes?')) return
130
+ void options.navigate({
131
+ search: { ...options.search, environment: environment as Policies.Environment },
132
+ to: '/route-policies',
133
+ })
134
+ }}
135
+ />
136
+ </div>
137
+ {!scope.projectId && !scope.apiKeyId && payload.version === 0 ? (
138
+ <p
139
+ role="status"
140
+ className="border border-warning bg-warning-subtle p-4 text-copy-16 text-warning-strong sm:text-copy-14"
141
+ >
142
+ Legacy route access remains active until you save. The first save enables policy control
143
+ for this environment; only the routes selected below will be allowed. An empty list blocks
144
+ access.
145
+ </p>
146
+ ) : null}
147
+ {payload.layers.some((layer) => layer.policy.suspended) ? (
148
+ <div className="border border-warning bg-warning-subtle p-4 text-copy-14 text-warning-strong">
149
+ The organization is suspended. Descendants cannot enable access or issue fresh
150
+ instructions. Existing subsidized addresses can still incur costs.
151
+ </div>
152
+ ) : null}
153
+ <form
154
+ className="flex flex-col gap-5"
155
+ onSubmit={(event) => {
156
+ event.preventDefault()
157
+ setSubmitted(true)
158
+ const missing = (Array.isArray(draft.access) ? draft.access : []).some((rule) => {
159
+ const term = draft.terms?.find((term) => same(term, rule))
160
+ return (
161
+ term?.subsidyEnabled === true && (!term.subsidyPayer || term.maxAmount === undefined)
162
+ )
163
+ })
164
+ if (missing) {
165
+ event.currentTarget.querySelector<HTMLElement>('[aria-invalid="true"]')?.focus()
166
+ return
167
+ }
168
+ mutation.mutate({ scope, version: session.baseVersion, policy: draft })
169
+ }}
170
+ >
171
+ <Routes draft={draft} onChange={setDraft} payload={payload} submitted={submitted} />
172
+ {!scope.projectId && !scope.apiKeyId ? (
173
+ <Card className="flex flex-col gap-3 p-5">
174
+ <h2 className="text-heading-20 text-foreground">Organization access</h2>
175
+ <label className="flex items-center gap-2 text-label-14 text-foreground">
176
+ <input
177
+ type="checkbox"
178
+ checked={draft.suspended ?? false}
179
+ onChange={(event) =>
180
+ setDraft({ ...draft, suspended: event.target.checked || undefined })
181
+ }
182
+ />
183
+ Suspend organization
184
+ </label>
185
+ <p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
186
+ Stops all new route instructions. Existing accepted commitments are unchanged.
187
+ </p>
188
+ </Card>
189
+ ) : null}
190
+ <Review draft={draft} payload={payload} />
191
+ {mutation.error ? (
192
+ <div aria-live="polite" className="text-copy-14 text-negative">
193
+ {mutation.error.message}{' '}
194
+ {mutation.error instanceof Policies.StalePolicyError ? (
195
+ <Button type="button" onClick={reload}>
196
+ Reload latest
197
+ </Button>
198
+ ) : null}
199
+ </div>
200
+ ) : null}
201
+ <div className="flex justify-end">
202
+ <Button disabled={stale} variant="primary" type="submit" loading={mutation.isPending}>
203
+ {mutation.isPending ? 'Saving…' : 'Save changes'}
204
+ </Button>
205
+ </div>
206
+ </form>
207
+ </PageFrame>
208
+ )
209
+ }
210
+
211
+ declare namespace Editor {
212
+ type Props = {
213
+ navigate: ReturnType<typeof useNavigate>
214
+ payload: Policies.Payload
215
+ refetch: ReturnType<typeof useSuspenseQuery<Policies.Payload>>['refetch']
216
+ scope: Policies.Scope
217
+ search: ReturnType<typeof Route.useSearch>
218
+ }
219
+ }
220
+
221
+ function Routes(options: Routes.Props) {
222
+ const [selecting, setSelecting] = useState(false)
223
+ const { draft, payload } = options
224
+ const orgLevel = !payload.scope.projectId && !payload.scope.apiKeyId
225
+ const effective = Policies.effective(payload, draft)
226
+ const choices = routeChoices(payload.routes)
227
+ const selected = Array.isArray(draft.access) ? draft.access : []
228
+ const mode =
229
+ draft.access === null
230
+ ? 'legacy'
231
+ : orgLevel
232
+ ? 'selected'
233
+ : draft.access === undefined
234
+ ? 'inherit'
235
+ : selected.length === 0 && !selecting
236
+ ? 'none'
237
+ : 'selected'
238
+ const rows = [...(effective.access ?? [])]
239
+ const storedTerms = [
240
+ ...payload.layers
241
+ .filter(
242
+ (layer) => Policies.serializeScope(layer.scope) !== Policies.serializeScope(payload.scope),
243
+ )
244
+ .flatMap((layer) => layer.policy.terms ?? []),
245
+ ...(draft.terms ?? []),
246
+ ]
247
+ for (const term of storedTerms)
248
+ if (allowed(effective.access, term) && !rows.some((rule) => same(rule, term)))
249
+ rows.push(Policies.selectedRoute(term)!)
250
+ const inactiveTerms = (draft.terms ?? []).filter(
251
+ (term) => !rows.some((rule) => matches(term, rule)),
252
+ )
253
+
254
+ function setAccess(access: Policies.Overrides['access']) {
255
+ options.onChange({ ...draft, access })
256
+ }
257
+
258
+ return (
259
+ <Card className="flex flex-col gap-5 p-5">
260
+ <div className="flex flex-col gap-3">
261
+ <h2 className="text-heading-20 text-foreground">Routes</h2>
262
+ <p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
263
+ {orgLevel
264
+ ? effective.access === null
265
+ ? 'Replace the stored all-route policy to choose explicit routes.'
266
+ : 'Only explicitly added routes are allowed. An empty list blocks all route access.'
267
+ : 'Inherit the parent route list or replace it for this scope. Subsidy fields inherit independently.'}{' '}
268
+ Configure subsidies on each route. New routes start with subsidies disabled.
269
+ </p>
270
+ {!orgLevel && mode !== 'legacy' ? (
271
+ <Select
272
+ aria-label="Routes behavior"
273
+ className="w-full max-w-xl"
274
+ items={[
275
+ { label: 'Inherit', value: 'inherit', suffix: 'Use the parent route list' },
276
+ { label: 'No routes', value: 'none', suffix: 'Block all route access' },
277
+ {
278
+ label: 'Selected routes',
279
+ value: 'selected',
280
+ suffix: 'Allow only the routes added here',
281
+ },
282
+ ]}
283
+ value={mode}
284
+ onChange={(value) => {
285
+ setSelecting(value === 'selected')
286
+ setAccess(value === 'inherit' ? undefined : value === 'none' ? [] : selected)
287
+ }}
288
+ />
289
+ ) : null}
290
+ </div>
291
+ {effective.access === null ? (
292
+ <div className="flex flex-col gap-3 border border-warning bg-warning-subtle p-4 text-copy-16 sm:text-copy-14">
293
+ <p>
294
+ {mode === 'inherit' ? 'Inherited access' : 'This stored policy'} allows all current and
295
+ future catalog routes and providers. This existing value is preserved until explicitly
296
+ replaced; it is no longer offered for new policies.
297
+ </p>
298
+ <Button
299
+ type="button"
300
+ onClick={() => {
301
+ setSelecting(true)
302
+ setAccess([])
303
+ }}
304
+ >
305
+ Replace with selected routes
306
+ </Button>
307
+ {mode === 'legacy' && !orgLevel ? (
308
+ <Button.Text type="button" onClick={() => setAccess(undefined)}>
309
+ Use parent route list
310
+ </Button.Text>
311
+ ) : null}
312
+ </div>
313
+ ) : null}
314
+ {mode === 'selected' ? (
315
+ <RoutePicker
316
+ label="access"
317
+ onAdd={(rule) =>
318
+ options.onChange({
319
+ ...draft,
320
+ access: [...selected, rule],
321
+ terms: [
322
+ ...(draft.terms ?? []).filter((term) => !same(term, rule)),
323
+ {
324
+ ...rule,
325
+ ...draft.terms?.find((term) => same(term, rule)),
326
+ subsidyEnabled: false,
327
+ },
328
+ ],
329
+ })
330
+ }
331
+ routes={payload.routes}
332
+ selected={selected}
333
+ />
334
+ ) : null}
335
+ {rows.length ? (
336
+ <ul
337
+ aria-label="Enabled routes"
338
+ className="flex flex-col divide-y divide-border border-t border-border"
339
+ role="list"
340
+ >
341
+ {rows.map((rule) => (
342
+ <RouteRow
343
+ key={JSON.stringify(rule)}
344
+ effective={Policies.effective(payload, draft, rule)}
345
+ explicit={selected.some((item) => same(item, rule))}
346
+ submitted={options.submitted}
347
+ title={
348
+ choices.find((choice) => same(choice, rule))?.label ??
349
+ `${rule.sourceTokenId} on ${rule.sourceChainId} → ${rule.destinationTokenId} on ${rule.destinationChainId} (${rule.providerId ?? 'Any provider'})`
350
+ }
351
+ term={draft.terms?.find((term) => same(term, rule)) ?? rule}
352
+ onChange={(term) => {
353
+ const terms = (draft.terms ?? []).filter((item) => !same(item, rule))
354
+ if (
355
+ term.subsidyEnabled !== undefined ||
356
+ term.subsidyEligible !== undefined ||
357
+ term.subsidyPayer !== undefined ||
358
+ term.maxAmount !== undefined
359
+ )
360
+ terms.push(term)
361
+ options.onChange({ ...draft, terms: terms.length ? terms : undefined })
362
+ }}
363
+ onRemove={
364
+ mode === 'selected' && selected.some((item) => same(item, rule))
365
+ ? () => setAccess(selected.filter((item) => !same(item, rule)))
366
+ : undefined
367
+ }
368
+ />
369
+ ))}
370
+ </ul>
371
+ ) : effective.access !== null ? (
372
+ <p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
373
+ No routes enabled. Route access and subsidies are blocked.
374
+ </p>
375
+ ) : null}
376
+ {inactiveTerms.length ? (
377
+ <p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
378
+ Saved settings for {inactiveTerms.length} other routes are retained. They do not grant
379
+ access.
380
+ </p>
381
+ ) : null}
382
+ </Card>
383
+ )
384
+ }
385
+
386
+ declare namespace Routes {
387
+ type Props = {
388
+ draft: Policies.Overrides
389
+ onChange: (draft: Policies.Overrides) => void
390
+ payload: Policies.Payload
391
+ submitted: boolean
392
+ }
393
+ }
394
+
395
+ function RouteRow(options: RouteRow.Props) {
396
+ const { effective, term } = options
397
+ const errorId = useId()
398
+ const requireTerms = options.explicit && term.subsidyEnabled === true
399
+ const missingPayer = requireTerms && !term.subsidyPayer
400
+ const missingCap = requireTerms && term.maxAmount === undefined
401
+ const showTerms =
402
+ term.subsidyEnabled === true ||
403
+ (term.subsidyEnabled === undefined && effective.subsidyEnabled && effective.subsidyEligible)
404
+ return (
405
+ <li className="@container flex flex-col gap-3 py-4">
406
+ <div className="flex items-start justify-between gap-3 text-copy-16 sm:text-copy-14">
407
+ <p className="min-w-0 text-pretty">{options.title}</p>
408
+ {options.onRemove ? (
409
+ <Button.Text type="button" onClick={options.onRemove}>
410
+ Remove
411
+ </Button.Text>
412
+ ) : null}
413
+ </div>
414
+ <div className="grid gap-3 @xl:grid-cols-3">
415
+ <label className="flex min-w-0 flex-col gap-2 text-label-13 text-foreground-secondary">
416
+ Subsidy
417
+ <Select
418
+ aria-label="Subsidy"
419
+ items={[
420
+ {
421
+ label: options.explicit ? 'Saved defaults' : 'Inherit',
422
+ value: 'inherit',
423
+ disabled: options.explicit,
424
+ },
425
+ { label: 'Enabled', value: 'true' },
426
+ { label: 'Disabled', value: 'false' },
427
+ ]}
428
+ value={term.subsidyEnabled === undefined ? 'inherit' : String(term.subsidyEnabled)}
429
+ onChange={(value) =>
430
+ options.onChange({
431
+ ...term,
432
+ subsidyEnabled: value === 'inherit' ? undefined : value === 'true',
433
+ })
434
+ }
435
+ />
436
+ </label>
437
+ {showTerms ? (
438
+ <>
439
+ <label className="flex min-w-0 flex-col gap-2 text-label-13 text-foreground-secondary">
440
+ Payer
441
+ <Select
442
+ aria-label="Payer"
443
+ aria-invalid={missingPayer}
444
+ aria-describedby={options.submitted && missingPayer ? errorId : undefined}
445
+ error={options.submitted && missingPayer}
446
+ items={[
447
+ { label: requireTerms ? 'Choose payer' : 'Inherit', value: 'inherit' },
448
+ { label: 'Tempo', value: 'tempo' },
449
+ { label: 'Enterprise', value: 'enterprise' },
450
+ ]}
451
+ value={term.subsidyPayer ?? 'inherit'}
452
+ onChange={(value) =>
453
+ options.onChange({
454
+ ...term,
455
+ subsidyPayer: value === 'inherit' ? undefined : (value as Policies.Payer),
456
+ })
457
+ }
458
+ />
459
+ </label>
460
+ <label className="flex min-w-0 flex-col gap-2 text-label-13 text-foreground-secondary">
461
+ Maximum USD expense
462
+ <Input
463
+ inputMode="decimal"
464
+ aria-invalid={missingCap}
465
+ aria-describedby={options.submitted && missingCap ? errorId : undefined}
466
+ placeholder={requireTerms ? 'Enter cap' : 'Inherit cap'}
467
+ value={term.maxAmount ?? ''}
468
+ onChange={(event) =>
469
+ options.onChange({ ...term, maxAmount: event.target.value || undefined })
470
+ }
471
+ />
472
+ </label>
473
+ </>
474
+ ) : null}
475
+ </div>
476
+ {options.submitted && (missingPayer || missingCap) ? (
477
+ <p id={errorId} role="alert" className="text-copy-16 text-negative sm:text-copy-14">
478
+ Choose a payer and enter a cap for this route before saving.
479
+ </p>
480
+ ) : null}
481
+ <p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
482
+ Effective subsidy:{' '}
483
+ {effective.suspended
484
+ ? 'Suspended'
485
+ : effective.subsidyEnabled && effective.subsidyEligible
486
+ ? 'Enabled'
487
+ : 'Disabled'}
488
+ {effective.subsidyEnabled && effective.subsidyEligible
489
+ ? ` · ${effective.subsidyPayer === 'tempo' ? 'Tempo' : 'Enterprise'} · $${effective.maxAmount} cap`
490
+ : ''}
491
+ </p>
492
+ </li>
493
+ )
494
+ }
495
+
496
+ declare namespace RouteRow {
497
+ type Props = {
498
+ effective: ReturnType<typeof Policies.effective>
499
+ explicit: boolean
500
+ onChange: (term: NonNullable<Policies.Overrides['terms']>[number]) => void
501
+ onRemove?: (() => void) | undefined
502
+ term: NonNullable<Policies.Overrides['terms']>[number]
503
+ submitted: boolean
504
+ title: string
505
+ }
506
+ }
507
+
508
+ function Review({ draft, payload }: Review.Props) {
509
+ const review = Policies.review(payload, draft)
510
+ return (
511
+ <Card className="@container flex flex-col gap-5 p-5">
512
+ <h2 className="text-heading-20 text-foreground">Review</h2>
513
+ <p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
514
+ Effective policy after applying organization, project, API key, and route-specific settings,
515
+ including your unsaved changes.
516
+ </p>
517
+ {review.effective.suspended ? (
518
+ <p className="text-copy-16 text-warning-strong sm:text-copy-14">
519
+ The organization is suspended. All new route access and subsidies are blocked; saved rules
520
+ are retained.
521
+ </p>
522
+ ) : review.effective.access === null ? (
523
+ <p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
524
+ The existing all-route policy also includes future catalog routes and providers. Current
525
+ routes are listed below.
526
+ </p>
527
+ ) : null}
528
+ {review.routes.length ? (
529
+ <ul
530
+ aria-label="Effective routes"
531
+ className="flex flex-col divide-y divide-border border-t border-border"
532
+ role="list"
533
+ >
534
+ {review.routes.map(({ route, effective, sources }) => (
535
+ <li
536
+ key={JSON.stringify(Policies.selectedRoute(route))}
537
+ className="flex flex-col gap-3 py-4"
538
+ >
539
+ <h3 className="text-heading-16 text-foreground">{route.label}</h3>
540
+ <dl className="grid gap-3 @xl:grid-cols-3">
541
+ <ReviewValue
542
+ label="Subsidy"
543
+ value={
544
+ effective.subsidyEnabled && effective.subsidyEligible ? 'Enabled' : 'Disabled'
545
+ }
546
+ source={
547
+ !effective.subsidyEnabled || effective.subsidyEligible
548
+ ? sources.subsidyEnabled
549
+ : sources.subsidyEligible
550
+ }
551
+ />
552
+ {effective.subsidyEnabled && effective.subsidyEligible ? (
553
+ <>
554
+ <ReviewValue
555
+ label="Payer"
556
+ value={effective.subsidyPayer === 'tempo' ? 'Tempo' : 'Enterprise'}
557
+ source={sources.subsidyPayer}
558
+ />
559
+ <ReviewValue
560
+ label="Maximum USD expense"
561
+ value={`$${effective.maxAmount}`}
562
+ source={sources.maxAmount}
563
+ />
564
+ </>
565
+ ) : null}
566
+ </dl>
567
+ </li>
568
+ ))}
569
+ </ul>
570
+ ) : (
571
+ <p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
572
+ No routes are currently allowed.
573
+ </p>
574
+ )}
575
+ <details className="border-t border-border pt-4 text-copy-16 sm:text-copy-14">
576
+ <summary className="cursor-pointer text-foreground-secondary">Saved defaults</summary>
577
+ <div className="flex flex-col gap-3 pt-3">
578
+ <p className="text-foreground-secondary">
579
+ Preserved for routes that still inherit them. Configure new subsidies per route.
580
+ </p>
581
+ <dl className="flex flex-col gap-3">
582
+ {review.defaults.map(({ scope, policy }) => (
583
+ <div key={scope}>
584
+ <dt className="text-label-14">{scope}</dt>
585
+ <dd>
586
+ {[
587
+ policy.subsidyEnabled !== undefined
588
+ ? `Subsidy ${policy.subsidyEnabled ? 'enabled' : 'disabled'}`
589
+ : undefined,
590
+ policy.subsidyPayer
591
+ ? `Payer: ${policy.subsidyPayer === 'tempo' ? 'Tempo' : 'Enterprise'}`
592
+ : undefined,
593
+ policy.maxAmount !== undefined ? `$${policy.maxAmount} cap` : undefined,
594
+ policy.subsidyRoutes !== undefined
595
+ ? `Subsidy eligibility: ${policy.subsidyRoutes === null ? 'all routes' : `${policy.subsidyRoutes.length} saved rules`}`
596
+ : undefined,
597
+ ]
598
+ .filter(Boolean)
599
+ .join(' · ')}
600
+ </dd>
601
+ </div>
602
+ ))}
603
+ <div>
604
+ <dt className="text-label-14">Legacy fallback</dt>
605
+ <dd>
606
+ Subsidy {payload.legacy.subsidyEnabled ? 'enabled' : 'disabled'} · Enterprise · $
607
+ {payload.legacy.maxAmount} cap
608
+ </dd>
609
+ </div>
610
+ </dl>
611
+ </div>
612
+ </details>
613
+ </Card>
614
+ )
615
+ }
616
+
617
+ declare namespace Review {
618
+ type Props = { draft: Policies.Overrides; payload: Policies.Payload }
619
+ }
620
+
621
+ function ReviewValue({ label, value, source }: ReviewValue.Props) {
622
+ return (
623
+ <div className="flex flex-col gap-1">
624
+ <dt className="text-label-13 text-foreground-secondary">{label}</dt>
625
+ <dd className="text-copy-16 text-foreground tabular-nums sm:text-copy-15">{value}</dd>
626
+ {source ? (
627
+ <dd className="text-copy-16 text-foreground-secondary sm:text-copy-14">From {source}</dd>
628
+ ) : null}
629
+ </div>
630
+ )
631
+ }
632
+
633
+ declare namespace ReviewValue {
634
+ type Props = { label: string; source: string | undefined; value: string }
635
+ }
636
+
637
+ function routeChoices(catalog: Policies.Payload['routes']) {
638
+ const routes = catalog.map((route) => ({ ...Policies.selectedRoute(route)!, label: route.label }))
639
+ const any = routes
640
+ .filter(
641
+ (route, index) => routes.findIndex((candidate) => sameRoute(candidate, route)) === index,
642
+ )
643
+ .map(({ providerId: _, ...route }) => ({
644
+ ...route,
645
+ label: `${route.label.replace(/ \([^()]*\)$/, '')} (Any provider)`,
646
+ }))
647
+ return [...any, ...routes]
648
+ }
649
+
650
+ function allowed(rules: Policies.Rule[] | null, route: Policies.Rule) {
651
+ return rules === null || rules.some((rule) => matches(rule, route))
652
+ }
653
+
654
+ function matches(rule: Policies.Rule, route: Policies.Rule) {
655
+ return (
656
+ sameRoute(rule, route) &&
657
+ (rule.providerId === undefined || rule.providerId === route.providerId)
658
+ )
659
+ }
660
+
661
+ function sameRoute(a: Policies.Rule, b: Policies.Rule) {
662
+ return (
663
+ a.sourceChainId === b.sourceChainId &&
664
+ a.sourceTokenId === b.sourceTokenId &&
665
+ a.destinationChainId === b.destinationChainId &&
666
+ a.destinationTokenId === b.destinationTokenId
667
+ )
668
+ }
669
+
670
+ function same(a: Policies.Rule, b: Policies.Rule) {
671
+ return (
672
+ a.sourceChainId === b.sourceChainId &&
673
+ a.sourceTokenId === b.sourceTokenId &&
674
+ a.destinationChainId === b.destinationChainId &&
675
+ a.destinationTokenId === b.destinationTokenId &&
676
+ a.providerId === b.providerId
677
+ )
678
+ }