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,251 @@
1
+ import { sql, type Selectable } from 'kysely'
2
+
3
+ import type * as Db from '../Db.js'
4
+ import type * as Schema from '../Schema.js'
5
+ import type * as Policy from '../../internal/routes/Policy.js'
6
+ import * as RoutesSubsidies from './routesSubsidies.js'
7
+
8
+ export type Table = Schema.RoutesPolicy
9
+ export type Record = Omit<Selectable<Table>, 'apiKeyId' | 'projectId'> & Policy.Scope
10
+ export type Layer = { scope: Policy.Scope; version: number; policy: Policy.Overrides }
11
+ export class ConflictError extends Error {
12
+ override name = 'RoutesPolicies.ConflictError'
13
+ }
14
+ export class InvalidScopeError extends Error {
15
+ override name = 'RoutesPolicies.InvalidScopeError'
16
+ }
17
+
18
+ export async function get(db: Db.Db, scope: Policy.Scope): Promise<Record | undefined> {
19
+ const row = await scoped(db, scope).selectAll().executeTakeFirst()
20
+ return row && domain(row)
21
+ }
22
+
23
+ export async function load(
24
+ db: Db.Db,
25
+ scope: Policy.Scope,
26
+ ): Promise<{ layers: Layer[]; legacy: Policy.Legacy }> {
27
+ const scopes: Policy.Scope[] = [
28
+ { orgId: scope.orgId, environment: scope.environment },
29
+ ...(scope.projectId
30
+ ? [{ orgId: scope.orgId, environment: scope.environment, projectId: scope.projectId }]
31
+ : []),
32
+ ...(scope.apiKeyId ? [scope] : []),
33
+ ]
34
+ const records = await Promise.all(scopes.map((item) => get(db, item)))
35
+ const legacy = await RoutesSubsidies.getOrganization(db, scope.orgId)
36
+ return {
37
+ layers: records.map((record, index) =>
38
+ record
39
+ ? { scope: pickScope(record), version: record.version, policy: record.policy }
40
+ : { scope: scopes[index]!, version: 0, policy: {} },
41
+ ),
42
+ legacy: {
43
+ subsidyEnabled: legacy?.enabled ?? false,
44
+ maxAmount: legacy?.maxAmount ?? '0',
45
+ subsidyPayer: 'enterprise',
46
+ },
47
+ }
48
+ }
49
+
50
+ export function save(
51
+ db: Db.Db,
52
+ input: {
53
+ scope: Policy.Scope
54
+ version: number
55
+ policy: Policy.Overrides
56
+ /** Revalidates external key ownership under the policy lock. */
57
+ validateScope?: (() => Promise<boolean>) | undefined
58
+ },
59
+ ): Promise<Record> {
60
+ return db.transaction(async (tx) => {
61
+ await RoutesSubsidies.lockOrganization(tx, input.scope.orgId)
62
+ if (input.validateScope && !(await input.validateScope())) throw new InvalidScopeError()
63
+ return saveIn(tx, input)
64
+ })
65
+ }
66
+
67
+ export function clearKey(db: Db.Db, input: clearKey.Input): Promise<readonly Record[]> {
68
+ return db.transaction((tx) => clearKeyIn(tx, input))
69
+ }
70
+
71
+ /** Locks current, destination, and historical key policy owners before owner or admission locks. */
72
+ export async function lockKeyOrganizations(
73
+ db: Db.Db,
74
+ input: lockKeyOrganizations.Input,
75
+ ): Promise<void> {
76
+ const rows = await db.kysely
77
+ .selectFrom('routes_policies')
78
+ .select('orgId')
79
+ .where('apiKeyId', '=', input.apiKeyId)
80
+ .distinct()
81
+ .execute()
82
+ for (const orgId of [...new Set([...input.orgIds, ...rows.map((row) => row.orgId)])].sort())
83
+ await RoutesSubsidies.lockOrganization(db, orgId)
84
+ }
85
+
86
+ export declare namespace lockKeyOrganizations {
87
+ /** Key being reassigned and its current and destination owners. */
88
+ type Input = {
89
+ /** API key identifier. */
90
+ apiKeyId: string
91
+ /** Current and destination organization identifiers. */
92
+ orgIds: readonly string[]
93
+ }
94
+ }
95
+
96
+ /** Clears key overrides inside a caller-owned transaction. */
97
+ export async function clearKeyIn(db: Db.Db, input: clearKey.Input): Promise<readonly Record[]> {
98
+ const rows = await db.kysely
99
+ .selectFrom('routes_policies')
100
+ .selectAll()
101
+ .where('apiKeyId', '=', input.apiKeyId)
102
+ .orderBy('orgId')
103
+ .orderBy('environment')
104
+ .orderBy('projectId')
105
+ .execute()
106
+ const records: Record[] = []
107
+ for (const row of rows) {
108
+ await RoutesSubsidies.lockOrganization(db, row.orgId)
109
+ // Former projects may be deleted; retain monotonic revisions without revalidating their existence.
110
+ const updated = await db.kysely
111
+ .updateTable('routes_policies')
112
+ .set({ policy: {}, updatedAt: new Date().toISOString(), version: sql`version + 1` })
113
+ .where('orgId', '=', row.orgId)
114
+ .where('environment', '=', row.environment)
115
+ .where('projectId', '=', row.projectId)
116
+ .where('apiKeyId', '=', row.apiKeyId)
117
+ .returningAll()
118
+ .executeTakeFirst()
119
+ if (updated) records.push(domain(updated))
120
+ }
121
+ return records
122
+ }
123
+
124
+ export namespace clearKey {
125
+ export type Input = { apiKeyId: string }
126
+ }
127
+
128
+ export function copyKey(db: Db.Db, input: copyKey.Input): Promise<Record | undefined> {
129
+ if (
130
+ input.source.environment !== input.destination.environment ||
131
+ input.source.orgId !== input.destination.orgId ||
132
+ input.source.projectId !== input.destination.projectId
133
+ )
134
+ return Promise.reject(new InvalidScopeError())
135
+ return db.transaction((tx) => copyKeyIn(tx, input))
136
+ }
137
+
138
+ /** Copies key overrides inside a caller-owned transaction. */
139
+ export async function copyKeyIn(db: Db.Db, input: copyKey.Input): Promise<Record | undefined> {
140
+ if (
141
+ input.source.environment !== input.destination.environment ||
142
+ input.source.orgId !== input.destination.orgId ||
143
+ input.source.projectId !== input.destination.projectId
144
+ )
145
+ throw new InvalidScopeError()
146
+ await RoutesSubsidies.lockOrganization(db, input.destination.orgId)
147
+ const source = await get(db, input.source)
148
+ if (!input.source.apiKeyId || !input.destination.apiKeyId) throw new InvalidScopeError()
149
+ if (!source) return undefined
150
+ const destination = await get(db, input.destination)
151
+ return saveIn(db, {
152
+ policy: source.policy,
153
+ scope: input.destination,
154
+ version: destination?.version ?? 0,
155
+ })
156
+ }
157
+
158
+ export namespace copyKey {
159
+ export type Input = { destination: Policy.Scope; source: Policy.Scope }
160
+ }
161
+
162
+ async function saveIn(
163
+ db: Db.Db,
164
+ input: { scope: Policy.Scope; version: number; policy: Policy.Overrides },
165
+ ): Promise<Record> {
166
+ await validateScope(db, input.scope)
167
+ if (
168
+ (input.scope.projectId !== undefined || input.scope.apiKeyId !== undefined) &&
169
+ input.policy.suspended !== undefined
170
+ )
171
+ throw new InvalidScopeError()
172
+ const before = await get(db, input.scope)
173
+ if ((before?.version ?? 0) !== input.version) throw new ConflictError()
174
+ const now = new Date().toISOString()
175
+ const keys = storage(input.scope)
176
+ const row =
177
+ input.version === 0
178
+ ? await db.kysely
179
+ .insertInto('routes_policies')
180
+ .values({ ...keys, version: 1, policy: input.policy, createdAt: now, updatedAt: now })
181
+ .returningAll()
182
+ .executeTakeFirstOrThrow()
183
+ : await db.kysely
184
+ .updateTable('routes_policies')
185
+ .set({ version: input.version + 1, policy: input.policy, updatedAt: now })
186
+ .where('orgId', '=', keys.orgId)
187
+ .where('environment', '=', keys.environment)
188
+ .where('projectId', '=', keys.projectId)
189
+ .where('apiKeyId', '=', keys.apiKeyId)
190
+ .where('version', '=', input.version)
191
+ .returningAll()
192
+ .executeTakeFirst()
193
+ if (!row) throw new ConflictError()
194
+ return domain(row)
195
+ }
196
+
197
+ function scoped(db: Db.Db, scope: Policy.Scope) {
198
+ const key = storage(scope)
199
+ return db.kysely
200
+ .selectFrom('routes_policies')
201
+ .where('orgId', '=', key.orgId)
202
+ .where('environment', '=', key.environment)
203
+ .where('projectId', '=', key.projectId)
204
+ .where('apiKeyId', '=', key.apiKeyId)
205
+ }
206
+ function storage(scope: Policy.Scope) {
207
+ return {
208
+ orgId: scope.orgId,
209
+ environment: scope.environment,
210
+ projectId: scope.projectId ?? '',
211
+ apiKeyId: scope.apiKeyId ?? '',
212
+ }
213
+ }
214
+ function domain(row: Selectable<Table>): Record {
215
+ return {
216
+ orgId: row.orgId,
217
+ environment: row.environment,
218
+ ...(row.projectId ? { projectId: row.projectId } : {}),
219
+ ...(row.apiKeyId ? { apiKeyId: row.apiKeyId } : {}),
220
+ version: row.version,
221
+ policy: row.policy,
222
+ createdAt: row.createdAt,
223
+ updatedAt: row.updatedAt,
224
+ }
225
+ }
226
+ function pickScope(value: Policy.Scope): Policy.Scope {
227
+ return {
228
+ orgId: value.orgId,
229
+ environment: value.environment,
230
+ ...(value.projectId ? { projectId: value.projectId } : {}),
231
+ ...(value.apiKeyId ? { apiKeyId: value.apiKeyId } : {}),
232
+ }
233
+ }
234
+ async function validateScope(db: Db.Db, scope: Policy.Scope) {
235
+ if (scope.projectId) {
236
+ const project = await db.kysely
237
+ .selectFrom('projects')
238
+ .select('id')
239
+ .where('id', '=', scope.projectId)
240
+ .where('orgId', '=', scope.orgId)
241
+ .executeTakeFirst()
242
+ if (!project) throw new InvalidScopeError()
243
+ } else {
244
+ const org = await db.kysely
245
+ .selectFrom('organizations')
246
+ .select('id')
247
+ .where('id', '=', scope.orgId)
248
+ .executeTakeFirst()
249
+ if (!org) throw new InvalidScopeError()
250
+ }
251
+ }
@@ -7,6 +7,8 @@ import type * as Schema from '../Schema.js'
7
7
  export type Table = Schema.RoutesTransferSubsidy
8
8
  /** A shared subsidy transaction and its billing owner. */
9
9
  export type Record = Selectable<Table>
10
+ /** Immutable evidence for an expired signed Solana attempt. */
11
+ export type ExpiredAttemptTable = Schema.RoutesTransferSubsidyExpiredAttempt
10
12
 
11
13
  /** Serializes subsidy preparation for a source payment and returns its persisted settlement. */
12
14
  export async function getForUpdateIn(
@@ -36,3 +38,65 @@ export declare namespace getForUpdateIn {
36
38
  transactionRef: string
37
39
  }
38
40
  }
41
+
42
+ /** Archives an expired Solana signature under the canonical source lock. */
43
+ export async function markExpiredIn(
44
+ db: Db.Db,
45
+ options: markExpiredIn.Options,
46
+ ): Promise<markExpiredIn.Result> {
47
+ const settlement = await getForUpdateIn(db, options)
48
+ if (!settlement) return { type: 'not_found' }
49
+ if (settlement.transferId !== options.transferId) return { settlement, type: 'shared' }
50
+ if (
51
+ settlement.status !== 'active' ||
52
+ !settlement.destinationChainId.startsWith('solana:') ||
53
+ settlement.transaction !== options.signedTransaction
54
+ )
55
+ return { settlement, type: 'stale' }
56
+ const signed: unknown = JSON.parse(options.signedTransaction)
57
+ if (
58
+ !signed ||
59
+ typeof signed !== 'object' ||
60
+ !('hash' in signed) ||
61
+ signed.hash !== options.signedHash
62
+ )
63
+ return { settlement, type: 'stale' }
64
+
65
+ // The caller proves final expiry before entering this transaction. Exact transaction
66
+ // comparison prevents a late recovery worker from replacing a newer signature.
67
+ const expiredAt = new Date().toISOString()
68
+ await db.kysely
69
+ .insertInto('routes_transfer_subsidy_expired_attempts')
70
+ .values({
71
+ createdAt: settlement.createdAt,
72
+ expiredAt,
73
+ sourceChainId: settlement.sourceChainId,
74
+ transaction: JSON.stringify(settlement.transaction),
75
+ transactionHash: options.signedHash,
76
+ transactionRef: settlement.transactionRef,
77
+ transferId: settlement.transferId,
78
+ })
79
+ .execute()
80
+ await db.kysely
81
+ .updateTable('routes_transfer_subsidies')
82
+ .set({ status: 'expired' })
83
+ .where('sourceChainId', '=', options.sourceChainId)
84
+ .where('transactionRef', '=', options.transactionRef)
85
+ .where('status', '=', 'active')
86
+ .executeTakeFirstOrThrow()
87
+ return { settlement: { ...settlement, status: 'expired' }, type: 'expired' }
88
+ }
89
+
90
+ export declare namespace markExpiredIn {
91
+ /** Expected canonical signed Solana attempt and its original billing owner. */
92
+ type Options = getForUpdateIn.Options & {
93
+ /** Signature of the signed attempt being retired. */
94
+ signedHash: string
95
+ /** Exact serialized signed transaction persisted in the settlement row. */
96
+ signedTransaction: string
97
+ /** Original subsidy billing owner. */
98
+ transferId: string
99
+ }
100
+ /** Outcome of the source-keyed expiry compare and swap. */
101
+ type Result = { type: 'not_found' } | { settlement: Record; type: 'expired' | 'shared' | 'stale' }
102
+ }
@@ -10,7 +10,10 @@ export type Record = Selectable<Table>
10
10
 
11
11
  /** Serializes inventory and nonce operations for one signer and chain. */
12
12
  async function lock(db: Db.Db, options: Lane): Promise<void> {
13
- const key = `${options.chainId}:${options.account.toLowerCase()}`
13
+ const account = options.chainId.startsWith('eip155:')
14
+ ? options.account.toLowerCase()
15
+ : options.account
16
+ const key = `${options.chainId}:${account}`
14
17
  await sql`SELECT pg_advisory_xact_lock(hashtextextended(${key}, 0))`.execute(db.kysely)
15
18
  }
16
19
 
@@ -24,10 +27,13 @@ type Lane = {
24
27
  /** Locks a signer lane and rejects new work when its nonce cannot be recovered. */
25
28
  export async function lockAvailableIn(db: Db.Db, options: Lane): Promise<void> {
26
29
  await lock(db, options)
30
+ const account = options.chainId.startsWith('eip155:')
31
+ ? options.account.toLowerCase()
32
+ : options.account
27
33
  const current = await db.kysely
28
34
  .selectFrom('routes_transfer_subsidy_nonces')
29
35
  .selectAll()
30
- .where('account', '=', options.account.toLowerCase())
36
+ .where('account', '=', account)
31
37
  .where('chainId', '=', options.chainId)
32
38
  .forUpdate()
33
39
  .executeTakeFirst()
@@ -51,7 +57,11 @@ export async function blockIn(db: Db.Db, options: block.Options): Promise<void>
51
57
  blockedTransferId: options.transferId,
52
58
  updatedAt: now,
53
59
  })
54
- .where('account', '=', options.account.toLowerCase())
60
+ .where(
61
+ 'account',
62
+ '=',
63
+ options.chainId.startsWith('eip155:') ? options.account.toLowerCase() : options.account,
64
+ )
55
65
  .where('chainId', '=', options.chainId)
56
66
  .executeTakeFirst()
57
67
  if (updated.numUpdatedRows !== 1n) throw new MissingCursorError()
@@ -69,7 +79,9 @@ export declare namespace block {
69
79
 
70
80
  /** Reserves one nonce under a transaction-scoped signer and chain lock. */
71
81
  export async function reserve(db: Db.Db, options: reserve.Options): Promise<number> {
72
- const account = options.account.toLowerCase()
82
+ const account = options.chainId.startsWith('eip155:')
83
+ ? options.account.toLowerCase()
84
+ : options.account
73
85
  await lock(db, options)
74
86
  const current = await db.kysely
75
87
  .selectFrom('routes_transfer_subsidy_nonces')
@@ -85,6 +85,60 @@ describe('listProcessing', () => {
85
85
  })
86
86
  })
87
87
 
88
+ describe('recordTronEventCursor', () => {
89
+ test('advances only the current source scan and leaves the public version unchanged', async () => {
90
+ const guid = `0x${'ab'.repeat(32)}`
91
+ const record = await seed({
92
+ providerState: { legacyMeshOutbound: { amount: '1000000', guid } },
93
+ snapshot: TestRoutes.transferSnapshot({
94
+ provider: { id: 'legacy-mesh', name: 'USDT0 Legacy Mesh' },
95
+ }),
96
+ })
97
+ const processing = await Transfer.transition(db, {
98
+ expectedVersion: record.version,
99
+ id: record.id,
100
+ status: 'processing',
101
+ })
102
+ if (processing.type !== 'applied') throw new Error('Expected processing transfer.')
103
+
104
+ const first = await RoutesTransfers.recordTronEventCursor(db, {
105
+ cursor: { fingerprint: 'next-page', offset: 0 },
106
+ guid,
107
+ id: record.id,
108
+ previousCursor: null,
109
+ })
110
+ expect(first?.providerState).toMatchObject({
111
+ legacyMeshOutbound: { guid },
112
+ tronEventCursor: { fingerprint: 'next-page', offset: 0 },
113
+ })
114
+ expect(first?.version).toBe(processing.record.version)
115
+ expect(
116
+ await RoutesTransfers.recordTronEventCursor(db, {
117
+ cursor: { fingerprint: 'wrong-source', offset: 0 },
118
+ guid: `0x${'cd'.repeat(32)}`,
119
+ id: record.id,
120
+ previousCursor: { fingerprint: 'next-page', offset: 0 },
121
+ }),
122
+ ).toBeUndefined()
123
+ expect(
124
+ await RoutesTransfers.recordTronEventCursor(db, {
125
+ cursor: { fingerprint: 'stale-page', offset: 0 },
126
+ guid,
127
+ id: record.id,
128
+ previousCursor: null,
129
+ }),
130
+ ).toBeUndefined()
131
+ const cleared = await RoutesTransfers.recordTronEventCursor(db, {
132
+ cursor: null,
133
+ guid,
134
+ id: record.id,
135
+ previousCursor: { fingerprint: 'next-page', offset: 0 },
136
+ })
137
+ expect(cleared?.providerState).not.toHaveProperty('tronEventCursor')
138
+ expect(cleared?.version).toBe(processing.record.version)
139
+ })
140
+ })
141
+
88
142
  describe('count', () => {
89
143
  test('shares the list filter and stops at the cap', async () => {
90
144
  const total = await RoutesTransfers.count(db, owner, { cap: 100 })
@@ -134,6 +188,69 @@ describe('update', () => {
134
188
  })
135
189
 
136
190
  describe('subsidies', () => {
191
+ test('retains Tempo obligations operationally while billing only enterprise and legacy payers', async () => {
192
+ const records = await Promise.all(
193
+ (['tempo', 'enterprise', 'legacy'] as const).map(async (payer) => {
194
+ const record = await seed({
195
+ orgId: `org_transfer_payer_${payer}`,
196
+ ...(payer === 'legacy'
197
+ ? {}
198
+ : {
199
+ providerState: {
200
+ routePolicy: {
201
+ maxAmount: '1',
202
+ scope: { environment: 'production', orgId: `org_transfer_payer_${payer}` },
203
+ subsidyPayer: payer,
204
+ versions: [1],
205
+ },
206
+ },
207
+ }),
208
+ subsidyCommitment: {
209
+ account: `0x${'ac'.repeat(20)}`,
210
+ amount: { baseUnits: '1', currency: 'USD', decimals: 6, formatted: '0.000001' },
211
+ chainId: '4217',
212
+ nativeAmount: '0',
213
+ tokenAddress: `0x${'bc'.repeat(20)}`,
214
+ },
215
+ })
216
+ expect(await RoutesTransfers.hasUnreportedSubsidies(db, record.orgId)).toBe(true)
217
+ let result = await Transfer.transition(db, {
218
+ expectedVersion: record.version,
219
+ id: record.id,
220
+ status: 'processing',
221
+ })
222
+ if (result.type !== 'applied') throw new Error('Expected processing transfer.')
223
+ result = await Transfer.transition(db, {
224
+ expectedVersion: result.record.version,
225
+ id: record.id,
226
+ subsidyAmount: { baseUnits: '1', currency: 'USD', decimals: 6, formatted: '0.000001' },
227
+ subsidyTransactionHash: `0x${payer.charCodeAt(0).toString(16).repeat(64).slice(0, 64)}`,
228
+ })
229
+ if (result.type !== 'applied') throw new Error('Expected subsidized transfer.')
230
+ result = await Transfer.transition(db, {
231
+ expectedVersion: result.record.version,
232
+ id: record.id,
233
+ status: 'completed',
234
+ })
235
+ if (result.type !== 'applied') throw new Error('Expected completed transfer.')
236
+ expect(await RoutesTransfers.hasUnreportedSubsidies(db, record.orgId)).toBe(
237
+ payer !== 'tempo',
238
+ )
239
+ return result.record
240
+ }),
241
+ )
242
+
243
+ expect(records.map((record) => RoutesTransfers.subsidies(record))).toHaveLength(3)
244
+ expect((await RoutesTransfers.listUnreportedSubsidies(db)).map(({ id }) => id)).toEqual(
245
+ expect.arrayContaining(records.filter((_, index) => index > 0).map(({ id }) => id)),
246
+ )
247
+ expect((await RoutesTransfers.listUnreportedSubsidies(db)).map(({ id }) => id)).not.toContain(
248
+ records[0]!.id,
249
+ )
250
+ for (const record of records.slice(1))
251
+ await RoutesTransfers.markSubsidyReported(db, record.id, new Date().toISOString())
252
+ })
253
+
137
254
  test('keeps prepared liability durable and reports completed production usage once', async () => {
138
255
  const record = await seed({ orgId: 'org_transfer_subsidy' })
139
256
  const processing = await Transfer.transition(db, {
@@ -217,7 +334,11 @@ describe('subsidies', () => {
217
334
  chainId: commitment.chainId,
218
335
  tokenAddress: commitment.tokenAddress,
219
336
  }),
220
- ).toEqual({ nativeAmount: 200n, tokenAmount: 6002n })
337
+ ).toEqual({
338
+ nativeAmount: 200n,
339
+ tokenAmount: 6002n,
340
+ tokenAmounts: { [commitment.tokenAddress]: 6002n },
341
+ })
221
342
  expect(await RoutesTransfers.hasUnreportedSubsidies(db, 'org_expired_transfer_subsidy')).toBe(
222
343
  true,
223
344
  )
@@ -244,11 +365,71 @@ describe('subsidies', () => {
244
365
  chainId: commitment.chainId,
245
366
  tokenAddress: commitment.tokenAddress,
246
367
  }),
247
- ).toEqual({ nativeAmount: 100n, tokenAmount: 3001n })
368
+ ).toEqual({
369
+ nativeAmount: 100n,
370
+ tokenAmount: 3001n,
371
+ tokenAmounts: { [commitment.tokenAddress]: 3001n },
372
+ })
248
373
  expect(await RoutesTransfers.hasUnreportedSubsidies(db, expired.orgId)).toBe(false)
249
374
  })
250
375
  })
251
376
 
377
+ describe('subsidyReservations', () => {
378
+ test('preserves case-sensitive Solana wallet and mint reservations', async () => {
379
+ const account = 'So11111111111111111111111111111111111111112'
380
+ const tokenAddress = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
381
+ const chainId = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'
382
+ const record = await seed({
383
+ subsidyCommitment: {
384
+ account,
385
+ amount: { baseUnits: '3001', currency: 'USD', decimals: 6, formatted: '0.003001' },
386
+ chainId,
387
+ nativeAmount: '5000',
388
+ tokenAddress,
389
+ },
390
+ })
391
+ expect({ account: record.subsidyAccount, tokenAddress: record.subsidyTokenAddress }).toEqual({
392
+ account,
393
+ tokenAddress,
394
+ })
395
+ expect(
396
+ await RoutesTransfers.subsidyReservations(db, { account, chainId, tokenAddress }),
397
+ ).toEqual({
398
+ nativeAmount: 5000n,
399
+ tokenAmount: 3001n,
400
+ tokenAmounts: { [tokenAddress]: 3001n },
401
+ })
402
+ })
403
+
404
+ test('includes other delivery tokens that can also pay Tempo fees', async () => {
405
+ const account = `0x${'78'.repeat(20)}`
406
+ const token = `0x${'79'.repeat(20)}`
407
+ const feeToken = `0x${'80'.repeat(20)}`
408
+ const commitment = {
409
+ account,
410
+ amount: { baseUnits: '3001', currency: 'USD', decimals: 6, formatted: '0.003001' },
411
+ chainId: 'eip155:4217',
412
+ nativeAmount: '1000000000000',
413
+ tokenAddress: token,
414
+ }
415
+ const first = await seed({ subsidyCommitment: commitment })
416
+ await seed({ subsidyCommitment: { ...commitment, tokenAddress: feeToken } })
417
+ const options = { account, chainId: commitment.chainId, tokenAddress: token }
418
+ expect(await RoutesTransfers.subsidyReservations(db, options)).toEqual({
419
+ nativeAmount: 2_000_000_000_000n,
420
+ tokenAmount: 3001n,
421
+ tokenAmounts: { [feeToken]: 3001n, [token]: 3001n },
422
+ })
423
+ expect(
424
+ await RoutesTransfers.subsidyReservations(db, { ...options, excludeId: first.id }),
425
+ ).toEqual({
426
+ nativeAmount: 1_000_000_000_000n,
427
+ tokenAmount: 0n,
428
+ tokenAmounts: { [feeToken]: 3001n },
429
+ })
430
+ })
431
+ })
432
+
252
433
  describe('list', () => {
253
434
  test('filters across owners and searches transaction references', async () => {
254
435
  const record = await seed({