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
@@ -10,9 +10,12 @@ import * as Id from '../Id.js';
10
10
  import * as OpenApi from '../OpenApi.js';
11
11
  import * as Schema from '../Schema.js';
12
12
  import * as Action from './Action.js';
13
+ import * as Policy from './Policy.js';
13
14
  import * as Provider from './Provider.js';
15
+ import * as SolanaTransferSubsidy from './SolanaTransferSubsidy.js';
14
16
  import * as TransferSubsidy from './TransferSubsidy.js';
15
17
  import * as TransferWebhook from './TransferWebhook.js';
18
+ import * as TronTransferSubsidy from './TronTransferSubsidy.js';
16
19
  /** Public route transfer statuses, in the order documented by the API. */
17
20
  export const statuses = [
18
21
  'awaiting-source',
@@ -242,14 +245,14 @@ export var schema;
242
245
  .number()
243
246
  .check(z.int(), z.gte(0), z.lte(10_000), z.describe('Maximum acceptable slippage in basis points.'), z.meta({ examples: [50] }))),
244
247
  sourceChain: z
245
- .string()
246
- .check(z.describe('Source chain CAIP-2 id, slug, or alias.'), z.meta({ examples: ['tempo', 'base', 'ethereum', 'eip155:4217'] })),
248
+ .optional(z.string())
249
+ .check(z.describe('Source chain CAIP-2 id, slug, or alias. Defaults to the destination chain.'), z.meta({ examples: ['tempo', 'base', 'ethereum', 'eip155:4217'] })),
247
250
  sourceToken: z
248
251
  .string()
249
252
  .check(z.minLength(1), z.describe('Source token symbol, contract address, or token key.'), z.meta({ examples: ['usdce', 'usdc'] })),
250
253
  subsidize: z
251
254
  .optional(z.boolean())
252
- .check(z.describe('Guarantees normalized 1:1 delivery for exact-source Tempo USD transfers to Base or Ethereum. A Tempo Admin must enable subsidies for the organization.'), z.meta({ examples: [true] })),
255
+ .check(z.describe('Guarantees normalized 1:1 USD delivery for exact-source transfers to Tempo or from Tempo to Base, Ethereum, Solana, or Tron. Requires organization subsidy approval.'), z.meta({ examples: [true] })),
253
256
  })
254
257
  .check(z.describe('Route transfer creation request.')), 'CreateRoutesTransferRequest');
255
258
  })(schema || (schema = {}));
@@ -287,13 +290,21 @@ export async function createIn(tx, input) {
287
290
  status: 'awaiting-source',
288
291
  statusReason: null,
289
292
  statusUpdatedAt: now.toISOString(),
290
- subsidyAccount: input.subsidyCommitment?.account.toLowerCase() ?? null,
293
+ subsidyAccount: input.subsidyCommitment
294
+ ? input.subsidyCommitment.chainId.startsWith('eip155:')
295
+ ? input.subsidyCommitment.account.toLowerCase()
296
+ : input.subsidyCommitment.account
297
+ : null,
291
298
  subsidyAmount: null,
292
299
  subsidyChainId: input.subsidyCommitment?.chainId ?? null,
293
300
  subsidyCommitmentAmount: input.subsidyCommitment?.amount ?? null,
294
301
  subsidyMeterReportedAt: null,
295
302
  subsidyNativeAmount: input.subsidyCommitment?.nativeAmount ?? null,
296
- subsidyTokenAddress: input.subsidyCommitment?.tokenAddress.toLowerCase() ?? null,
303
+ subsidyTokenAddress: input.subsidyCommitment
304
+ ? input.subsidyCommitment.chainId.startsWith('eip155:')
305
+ ? input.subsidyCommitment.tokenAddress.toLowerCase()
306
+ : input.subsidyCommitment.tokenAddress
307
+ : null,
297
308
  subsidyTransactionHash: null,
298
309
  updatedAt: now.toISOString(),
299
310
  version: 1,
@@ -569,6 +580,585 @@ export async function blockSubsidy(db, options) {
569
580
  });
570
581
  });
571
582
  }
583
+ /** Persists an unsigned Solana subsidy before contacting the signer. */
584
+ export async function prepareSolanaSubsidy(db, options) {
585
+ return db.transaction(async (tx) => {
586
+ await RoutesSubsidies.lockOrganization(tx, options.orgId);
587
+ const current = await RoutesTransfers.getForUpdate(tx, options.id);
588
+ if (!current)
589
+ return { type: 'not_found' };
590
+ if (current.orgId !== options.orgId || current.status !== 'processing')
591
+ return { current, type: 'invalid' };
592
+ const signed = SolanaTransferSubsidy.readSigned(current.providerState?.['transferSubsidy']);
593
+ if (signed) {
594
+ if (!SolanaTransferSubsidy.matchesTerms(signed, {
595
+ account: options.account,
596
+ amount: BigInt(options.subsidyAmount.baseUnits),
597
+ chainId: options.chainId,
598
+ recipient: current.snapshot.recipient,
599
+ token: options.tokenAddress,
600
+ }))
601
+ throw new SubsidyEvidenceError();
602
+ return { record: current, signed, type: 'signed' };
603
+ }
604
+ const existing = SolanaTransferSubsidy.readPrepared(current.providerState?.['solanaTransferSubsidyPrepared']);
605
+ if (existing) {
606
+ if (!SolanaTransferSubsidy.matchesTerms(existing, {
607
+ account: options.account,
608
+ amount: BigInt(options.subsidyAmount.baseUnits),
609
+ chainId: options.chainId,
610
+ recipient: current.snapshot.recipient,
611
+ token: options.tokenAddress,
612
+ }))
613
+ throw new SubsidyEvidenceError();
614
+ if (!(await options.expiring(existing)))
615
+ return { prepared: existing, record: current, type: 'prepared' };
616
+ }
617
+ if (!current.subsidyCommitmentAmount ||
618
+ BigInt(options.subsidyAmount.baseUnits) > BigInt(current.subsidyCommitmentAmount.baseUnits))
619
+ throw new SubsidyCommitmentExceededError();
620
+ const transactionRef = current.snapshot.sourceTransactionHashes?.[0];
621
+ const source = transactionRef
622
+ ? await RoutesTransferTransactions.getSource(tx, {
623
+ chainId: current.snapshot.sourceChain.id,
624
+ transactionRef,
625
+ transferId: current.id,
626
+ })
627
+ : undefined;
628
+ if (source?.transferId !== current.id)
629
+ throw new SubsidyEvidenceError();
630
+ const settlement = await RoutesTransferSubsidies.getForUpdateIn(tx, {
631
+ sourceChainId: source.chainId,
632
+ transactionRef: source.transactionRef,
633
+ });
634
+ if (settlement) {
635
+ const signed = SolanaTransferSubsidy.readSigned(settlement.transaction);
636
+ if (!signed ||
637
+ settlement.destinationChainId !== options.chainId ||
638
+ settlement.recipient !== current.snapshot.recipient ||
639
+ settlement.tokenAddress !== options.tokenAddress ||
640
+ !SolanaTransferSubsidy.matchesTerms(signed, {
641
+ account: signed.account,
642
+ amount: BigInt(options.subsidyAmount.baseUnits),
643
+ chainId: options.chainId,
644
+ recipient: current.snapshot.recipient,
645
+ token: options.tokenAddress,
646
+ }))
647
+ throw new SubsidyEvidenceError();
648
+ // The original owner alone can replace the expired canonical transaction.
649
+ if (settlement.status === 'expired') {
650
+ if (settlement.transferId !== current.id)
651
+ return { type: 'pending' };
652
+ }
653
+ else {
654
+ const result = await transitionIn(tx, {
655
+ current,
656
+ expectedVersion: current.version,
657
+ id: current.id,
658
+ // Preserve Solana transaction bytes as serialized text for exact replay.
659
+ providerState: {
660
+ ...current.providerState,
661
+ transferSubsidy: JSON.stringify(signed),
662
+ transferSubsidyOwnerId: settlement.transferId,
663
+ },
664
+ subsidyAccount: signed.account,
665
+ subsidyAmount: null,
666
+ subsidyChainId: signed.chainId,
667
+ subsidyCommitmentAmount: null,
668
+ subsidyNativeAmount: null,
669
+ subsidyTokenAddress: settlement.tokenAddress,
670
+ subsidyTransactionHash: signed.hash,
671
+ });
672
+ if (result.type !== 'applied')
673
+ throw new AtomicTransitionError();
674
+ return { record: result.record, references: result.references, signed, type: 'shared' };
675
+ }
676
+ }
677
+ await RoutesTransferSubsidyNonces.lockAvailableIn(tx, {
678
+ account: options.account,
679
+ chainId: options.chainId,
680
+ }).catch((cause) => {
681
+ if (cause instanceof RoutesTransferSubsidyNonces.BlockedError)
682
+ throw new SubsidySignerBlockedError();
683
+ throw cause;
684
+ });
685
+ const reservations = await RoutesTransfers.subsidyReservations(tx, {
686
+ account: options.account,
687
+ chainId: options.chainId,
688
+ excludeId: current.id,
689
+ tokenAddress: options.tokenAddress,
690
+ });
691
+ const prepared = await options.prepare({ reservations });
692
+ if (!SolanaTransferSubsidy.matchesTerms(prepared, {
693
+ account: options.account,
694
+ amount: BigInt(options.subsidyAmount.baseUnits),
695
+ chainId: options.chainId,
696
+ recipient: current.snapshot.recipient,
697
+ token: options.tokenAddress,
698
+ }))
699
+ throw new SubsidyEvidenceError();
700
+ const result = await transitionIn(tx, {
701
+ current,
702
+ expectedVersion: current.version,
703
+ id: current.id,
704
+ // Keep the native transaction bytes and Horcrux request intact across database round trips.
705
+ providerState: {
706
+ ...current.providerState,
707
+ solanaTransferSubsidyPrepared: JSON.stringify(prepared),
708
+ },
709
+ subsidyAccount: options.account,
710
+ subsidyAmount: options.subsidyAmount,
711
+ subsidyChainId: options.chainId,
712
+ subsidyNativeAmount: prepared.nativeAmount,
713
+ subsidyTokenAddress: options.tokenAddress,
714
+ });
715
+ if (result.type !== 'applied')
716
+ throw new AtomicTransitionError();
717
+ return { prepared, record: result.record, references: result.references, type: 'prepared' };
718
+ });
719
+ }
720
+ /** Persists a verified Solana signature before broadcasting the transaction. */
721
+ export async function signSolanaSubsidy(db, options) {
722
+ return db.transaction(async (tx) => {
723
+ const current = await RoutesTransfers.getForUpdate(tx, options.id);
724
+ if (!current)
725
+ return { type: 'not_found' };
726
+ if (current.status !== 'processing')
727
+ return { current, type: 'invalid' };
728
+ const existing = SolanaTransferSubsidy.readSigned(current.providerState?.['transferSubsidy']);
729
+ if (existing)
730
+ return { record: current, signed: existing, type: 'replayed' };
731
+ const prepared = SolanaTransferSubsidy.readPrepared(current.providerState?.['solanaTransferSubsidyPrepared']);
732
+ if (!prepared ||
733
+ prepared.request.transaction !== options.signed.request.transaction ||
734
+ prepared.lastValidBlockHeight !== options.signed.lastValidBlockHeight ||
735
+ prepared.account !== options.signed.account ||
736
+ prepared.amount !== options.signed.amount ||
737
+ prepared.chainId !== options.signed.chainId ||
738
+ !SolanaTransferSubsidy.matchesTerms(options.signed, {
739
+ account: prepared.account,
740
+ amount: BigInt(prepared.amount),
741
+ chainId: prepared.chainId,
742
+ recipient: current.snapshot.recipient,
743
+ token: current.snapshot.destinationToken.address,
744
+ }))
745
+ throw new SubsidyEvidenceError();
746
+ const transactionRef = current.snapshot.sourceTransactionHashes?.[0];
747
+ const source = transactionRef
748
+ ? await RoutesTransferTransactions.getSource(tx, {
749
+ chainId: current.snapshot.sourceChain.id,
750
+ transactionRef,
751
+ transferId: current.id,
752
+ })
753
+ : undefined;
754
+ if (source?.transferId !== current.id)
755
+ throw new SubsidyEvidenceError();
756
+ const settlement = await RoutesTransferSubsidies.getForUpdateIn(tx, {
757
+ sourceChainId: source.chainId,
758
+ transactionRef: source.transactionRef,
759
+ });
760
+ const signed = settlement?.status === 'active'
761
+ ? SolanaTransferSubsidy.readSigned(settlement.transaction)
762
+ : options.signed;
763
+ if (!signed ||
764
+ (settlement &&
765
+ (settlement.destinationChainId !== prepared.chainId ||
766
+ settlement.recipient !== current.snapshot.recipient ||
767
+ settlement.tokenAddress !== current.snapshot.destinationToken.address ||
768
+ (settlement.status === 'expired' && settlement.transferId !== current.id) ||
769
+ !SolanaTransferSubsidy.matchesTerms(signed, {
770
+ account: signed.account,
771
+ amount: BigInt(prepared.amount),
772
+ chainId: prepared.chainId,
773
+ recipient: current.snapshot.recipient,
774
+ token: current.snapshot.destinationToken.address,
775
+ }))))
776
+ throw new SubsidyEvidenceError();
777
+ const result = await transitionIn(tx, {
778
+ current,
779
+ expectedVersion: current.version,
780
+ id: current.id,
781
+ providerState: {
782
+ ...current.providerState,
783
+ transferSubsidy: JSON.stringify(signed),
784
+ ...(settlement?.status === 'active'
785
+ ? { transferSubsidyOwnerId: settlement.transferId }
786
+ : {}),
787
+ },
788
+ ...(settlement?.status === 'active'
789
+ ? { subsidyAmount: null, subsidyCommitmentAmount: null, subsidyNativeAmount: null }
790
+ : {}),
791
+ subsidyTransactionHash: signed.hash,
792
+ });
793
+ if (result.type !== 'applied')
794
+ throw new AtomicTransitionError();
795
+ return {
796
+ record: result.record,
797
+ references: result.references,
798
+ signed,
799
+ type: settlement?.status === 'active' ? 'shared' : 'signed',
800
+ };
801
+ });
802
+ }
803
+ /** Follows the canonical subsidy when another transfer owns the source payment. */
804
+ export async function syncSharedSolanaSubsidy(db, options) {
805
+ return db.transaction(async (tx) => {
806
+ await RoutesSubsidies.lockOrganization(tx, options.orgId);
807
+ const current = await RoutesTransfers.getForUpdate(tx, options.id);
808
+ if (!current)
809
+ return { type: 'not_found' };
810
+ if (current.orgId !== options.orgId || current.status !== 'processing')
811
+ return { type: 'pending' };
812
+ const signed = SolanaTransferSubsidy.readSigned(current.providerState?.['transferSubsidy']);
813
+ if (!signed ||
814
+ signed.hash !== options.signed.hash ||
815
+ current.subsidyTransactionHash !== signed.hash)
816
+ return { type: 'pending' };
817
+ const transactionRef = current.snapshot.sourceTransactionHashes?.[0];
818
+ const source = transactionRef
819
+ ? await RoutesTransferTransactions.getSource(tx, {
820
+ chainId: current.snapshot.sourceChain.id,
821
+ transactionRef,
822
+ transferId: current.id,
823
+ })
824
+ : undefined;
825
+ if (source?.transferId !== current.id)
826
+ throw new SubsidyEvidenceError();
827
+ const settlement = await RoutesTransferSubsidies.getForUpdateIn(tx, {
828
+ sourceChainId: source.chainId,
829
+ transactionRef: source.transactionRef,
830
+ });
831
+ if (!settlement ||
832
+ settlement.destinationChainId !== signed.chainId ||
833
+ settlement.recipient !== signed.recipient ||
834
+ settlement.tokenAddress !== signed.token)
835
+ throw new SubsidyEvidenceError();
836
+ if (settlement.transferId === current.id)
837
+ return { type: 'unchanged' };
838
+ // The owner has already proved expiry; shared transfers wait for its replacement.
839
+ if (settlement.status === 'expired')
840
+ return { type: 'pending' };
841
+ const replacement = SolanaTransferSubsidy.readSigned(settlement.transaction);
842
+ if (!replacement ||
843
+ !SolanaTransferSubsidy.matchesTerms(replacement, {
844
+ account: signed.account,
845
+ amount: BigInt(signed.amount),
846
+ chainId: signed.chainId,
847
+ recipient: signed.recipient,
848
+ token: signed.token,
849
+ }))
850
+ throw new SubsidyEvidenceError();
851
+ if (replacement.hash === signed.hash)
852
+ return { type: 'unchanged' };
853
+ const result = await transitionIn(tx, {
854
+ current,
855
+ expectedVersion: current.version,
856
+ id: current.id,
857
+ providerState: {
858
+ ...current.providerState,
859
+ solanaTransferSubsidyPrepared: null,
860
+ transferSubsidy: JSON.stringify(replacement),
861
+ transferSubsidyOwnerId: settlement.transferId,
862
+ },
863
+ subsidyTransactionHash: replacement.hash,
864
+ });
865
+ if (result.type !== 'applied')
866
+ throw new AtomicTransitionError();
867
+ return {
868
+ record: result.record,
869
+ references: result.references,
870
+ signed: replacement,
871
+ type: 'synchronized',
872
+ };
873
+ });
874
+ }
875
+ /** Retires an unlanded signed Solana attempt so its billing owner can prepare again. */
876
+ export async function recoverExpiredSolanaSubsidy(db, options) {
877
+ return db.transaction(async (tx) => {
878
+ await RoutesSubsidies.lockOrganization(tx, options.orgId);
879
+ const current = await RoutesTransfers.getForUpdate(tx, options.id);
880
+ if (!current)
881
+ return { type: 'not_found' };
882
+ if (current.orgId !== options.orgId || current.status !== 'processing')
883
+ return { type: 'pending' };
884
+ const signed = SolanaTransferSubsidy.readSigned(current.providerState?.['transferSubsidy']);
885
+ if (!signed ||
886
+ signed.hash !== options.signed.hash ||
887
+ current.subsidyTransactionHash !== signed.hash)
888
+ return { type: 'pending' };
889
+ if (!SolanaTransferSubsidy.matchesTerms(signed, {
890
+ account: signed.account,
891
+ amount: BigInt(signed.amount),
892
+ chainId: current.snapshot.destinationChain.id,
893
+ recipient: current.snapshot.recipient,
894
+ token: current.snapshot.destinationToken.address,
895
+ }))
896
+ throw new SubsidyEvidenceError();
897
+ const transactionRef = current.snapshot.sourceTransactionHashes?.[0];
898
+ const source = transactionRef
899
+ ? await RoutesTransferTransactions.getSource(tx, {
900
+ chainId: current.snapshot.sourceChain.id,
901
+ transactionRef,
902
+ transferId: current.id,
903
+ })
904
+ : undefined;
905
+ if (source?.transferId !== current.id)
906
+ throw new SubsidyEvidenceError();
907
+ const outcome = await RoutesTransferSubsidies.markExpiredIn(tx, {
908
+ signedHash: signed.hash,
909
+ signedTransaction: JSON.stringify(signed),
910
+ sourceChainId: source.chainId,
911
+ transactionRef: source.transactionRef,
912
+ transferId: current.id,
913
+ });
914
+ if (outcome.type === 'not_found')
915
+ throw new SubsidyEvidenceError();
916
+ const settlement = outcome.settlement;
917
+ if (settlement.destinationChainId !== signed.chainId ||
918
+ settlement.recipient !== signed.recipient ||
919
+ settlement.tokenAddress !== signed.token)
920
+ throw new SubsidyEvidenceError();
921
+ if (outcome.type === 'expired') {
922
+ const result = await transitionIn(tx, {
923
+ current,
924
+ expectedVersion: current.version,
925
+ id: current.id,
926
+ providerState: {
927
+ ...current.providerState,
928
+ solanaTransferSubsidyPrepared: null,
929
+ transferSubsidy: null,
930
+ transferSubsidyOwnerId: null,
931
+ },
932
+ subsidyTransactionHash: null,
933
+ });
934
+ if (result.type !== 'applied')
935
+ throw new AtomicTransitionError();
936
+ return { record: result.record, references: result.references, type: 'recovered' };
937
+ }
938
+ if (settlement.status !== 'active')
939
+ return { type: 'pending' };
940
+ const replacement = SolanaTransferSubsidy.readSigned(settlement.transaction);
941
+ if (!replacement || replacement.hash === signed.hash || replacement.amount !== signed.amount)
942
+ return { type: 'pending' };
943
+ const result = await transitionIn(tx, {
944
+ current,
945
+ expectedVersion: current.version,
946
+ id: current.id,
947
+ providerState: {
948
+ ...current.providerState,
949
+ solanaTransferSubsidyPrepared: null,
950
+ transferSubsidy: JSON.stringify(replacement),
951
+ transferSubsidyOwnerId: settlement.transferId,
952
+ },
953
+ subsidyTransactionHash: replacement.hash,
954
+ });
955
+ if (result.type !== 'applied')
956
+ throw new AtomicTransitionError();
957
+ return { record: result.record, references: result.references, type: 'recovered' };
958
+ });
959
+ }
960
+ /** Persists an unsigned Tron subsidy before contacting the signer. */
961
+ export async function prepareTronSubsidy(db, options) {
962
+ return db.transaction(async (tx) => {
963
+ await RoutesSubsidies.lockOrganization(tx, options.orgId);
964
+ const current = await RoutesTransfers.getForUpdate(tx, options.id);
965
+ if (!current)
966
+ return { type: 'not_found' };
967
+ if (current.orgId !== options.orgId || current.status !== 'processing')
968
+ return { current, type: 'invalid' };
969
+ const signed = TronTransferSubsidy.readSigned(current.providerState?.['transferSubsidy']);
970
+ if (signed) {
971
+ if (!TronTransferSubsidy.matchesTerms(signed, {
972
+ account: options.account,
973
+ amount: BigInt(options.subsidyAmount.baseUnits),
974
+ chainId: options.chainId,
975
+ recipient: current.snapshot.recipient,
976
+ token: options.tokenAddress,
977
+ }))
978
+ throw new SubsidyEvidenceError();
979
+ return { record: current, signed, type: 'signed' };
980
+ }
981
+ const existing = TronTransferSubsidy.readPrepared(current.providerState?.['tronTransferSubsidyPrepared']);
982
+ if (existing) {
983
+ if (!TronTransferSubsidy.matchesTerms(existing, {
984
+ account: options.account,
985
+ amount: BigInt(options.subsidyAmount.baseUnits),
986
+ chainId: options.chainId,
987
+ recipient: current.snapshot.recipient,
988
+ token: options.tokenAddress,
989
+ }))
990
+ throw new SubsidyEvidenceError();
991
+ return { prepared: existing, record: current, type: 'prepared' };
992
+ }
993
+ if (!current.subsidyCommitmentAmount ||
994
+ BigInt(options.subsidyAmount.baseUnits) > BigInt(current.subsidyCommitmentAmount.baseUnits))
995
+ throw new SubsidyCommitmentExceededError();
996
+ const transactionRef = current.snapshot.sourceTransactionHashes?.[0];
997
+ const source = transactionRef
998
+ ? await RoutesTransferTransactions.getSource(tx, {
999
+ chainId: current.snapshot.sourceChain.id,
1000
+ transactionRef,
1001
+ transferId: current.id,
1002
+ })
1003
+ : undefined;
1004
+ if (source?.transferId !== current.id)
1005
+ throw new SubsidyEvidenceError();
1006
+ const settlement = await RoutesTransferSubsidies.getForUpdateIn(tx, {
1007
+ sourceChainId: source.chainId,
1008
+ transactionRef: source.transactionRef,
1009
+ });
1010
+ if (settlement) {
1011
+ const signed = TronTransferSubsidy.readSigned(settlement.transaction);
1012
+ if (!signed ||
1013
+ settlement.destinationChainId !== options.chainId ||
1014
+ settlement.recipient !== current.snapshot.recipient ||
1015
+ settlement.tokenAddress !== options.tokenAddress ||
1016
+ !TronTransferSubsidy.matchesTerms(signed, {
1017
+ account: signed.account,
1018
+ amount: BigInt(options.subsidyAmount.baseUnits),
1019
+ chainId: options.chainId,
1020
+ recipient: current.snapshot.recipient,
1021
+ token: options.tokenAddress,
1022
+ }))
1023
+ throw new SubsidyEvidenceError();
1024
+ const result = await transitionIn(tx, {
1025
+ current,
1026
+ expectedVersion: current.version,
1027
+ id: current.id,
1028
+ // The database maps nested JSON keys to camelCase; preserve Tron raw_data for exact replay.
1029
+ providerState: {
1030
+ ...current.providerState,
1031
+ transferSubsidy: JSON.stringify(signed),
1032
+ transferSubsidyOwnerId: settlement.transferId,
1033
+ },
1034
+ subsidyAccount: signed.account,
1035
+ subsidyAmount: null,
1036
+ subsidyChainId: signed.chainId,
1037
+ subsidyCommitmentAmount: null,
1038
+ subsidyNativeAmount: null,
1039
+ subsidyTokenAddress: settlement.tokenAddress,
1040
+ subsidyTransactionHash: signed.hash,
1041
+ });
1042
+ if (result.type !== 'applied')
1043
+ throw new AtomicTransitionError();
1044
+ return { record: result.record, references: result.references, signed, type: 'shared' };
1045
+ }
1046
+ await RoutesTransferSubsidyNonces.lockAvailableIn(tx, {
1047
+ account: options.account,
1048
+ chainId: options.chainId,
1049
+ }).catch((cause) => {
1050
+ if (cause instanceof RoutesTransferSubsidyNonces.BlockedError)
1051
+ throw new SubsidySignerBlockedError();
1052
+ throw cause;
1053
+ });
1054
+ const reservations = await RoutesTransfers.subsidyReservations(tx, {
1055
+ account: options.account,
1056
+ chainId: options.chainId,
1057
+ excludeId: current.id,
1058
+ tokenAddress: options.tokenAddress,
1059
+ });
1060
+ const prepared = await options.prepare({ reservations });
1061
+ if (!TronTransferSubsidy.matchesTerms(prepared, {
1062
+ account: options.account,
1063
+ amount: BigInt(options.subsidyAmount.baseUnits),
1064
+ chainId: options.chainId,
1065
+ recipient: current.snapshot.recipient,
1066
+ token: options.tokenAddress,
1067
+ }))
1068
+ throw new SubsidyEvidenceError();
1069
+ const result = await transitionIn(tx, {
1070
+ current,
1071
+ expectedVersion: current.version,
1072
+ id: current.id,
1073
+ // Keep the native transaction bytes and Horcrux request field names intact across database round trips.
1074
+ providerState: {
1075
+ ...current.providerState,
1076
+ tronTransferSubsidyPrepared: JSON.stringify(prepared),
1077
+ },
1078
+ subsidyAccount: options.account,
1079
+ subsidyAmount: options.subsidyAmount,
1080
+ subsidyChainId: options.chainId,
1081
+ subsidyNativeAmount: prepared.nativeAmount,
1082
+ subsidyTokenAddress: options.tokenAddress,
1083
+ });
1084
+ if (result.type !== 'applied')
1085
+ throw new AtomicTransitionError();
1086
+ return { prepared, record: result.record, references: result.references, type: 'prepared' };
1087
+ });
1088
+ }
1089
+ /** Persists a verified Tron signature before broadcasting the transaction. */
1090
+ export async function signTronSubsidy(db, options) {
1091
+ return db.transaction(async (tx) => {
1092
+ const current = await RoutesTransfers.getForUpdate(tx, options.id);
1093
+ if (!current)
1094
+ return { type: 'not_found' };
1095
+ if (current.status !== 'processing')
1096
+ return { current, type: 'invalid' };
1097
+ const existing = TronTransferSubsidy.readSigned(current.providerState?.['transferSubsidy']);
1098
+ if (existing)
1099
+ return { record: current, signed: existing, type: 'replayed' };
1100
+ const prepared = TronTransferSubsidy.readPrepared(current.providerState?.['tronTransferSubsidyPrepared']);
1101
+ if (!prepared ||
1102
+ prepared.hash !== options.signed.hash ||
1103
+ prepared.account !== options.signed.account ||
1104
+ prepared.amount !== options.signed.amount ||
1105
+ prepared.chainId !== options.signed.chainId ||
1106
+ !TronTransferSubsidy.matchesTerms(options.signed, {
1107
+ account: prepared.account,
1108
+ amount: BigInt(prepared.amount),
1109
+ chainId: prepared.chainId,
1110
+ recipient: current.snapshot.recipient,
1111
+ token: current.snapshot.destinationToken.address,
1112
+ }))
1113
+ throw new SubsidyEvidenceError();
1114
+ const transactionRef = current.snapshot.sourceTransactionHashes?.[0];
1115
+ const source = transactionRef
1116
+ ? await RoutesTransferTransactions.getSource(tx, {
1117
+ chainId: current.snapshot.sourceChain.id,
1118
+ transactionRef,
1119
+ transferId: current.id,
1120
+ })
1121
+ : undefined;
1122
+ if (source?.transferId !== current.id)
1123
+ throw new SubsidyEvidenceError();
1124
+ const settlement = await RoutesTransferSubsidies.getForUpdateIn(tx, {
1125
+ sourceChainId: source.chainId,
1126
+ transactionRef: source.transactionRef,
1127
+ });
1128
+ const signed = settlement
1129
+ ? TronTransferSubsidy.readSigned(settlement.transaction)
1130
+ : options.signed;
1131
+ if (!signed ||
1132
+ (settlement &&
1133
+ (settlement.destinationChainId !== prepared.chainId ||
1134
+ settlement.recipient !== current.snapshot.recipient ||
1135
+ settlement.tokenAddress !== current.snapshot.destinationToken.address ||
1136
+ signed.amount !== prepared.amount)))
1137
+ throw new SubsidyEvidenceError();
1138
+ const result = await transitionIn(tx, {
1139
+ current,
1140
+ expectedVersion: current.version,
1141
+ id: current.id,
1142
+ providerState: {
1143
+ ...current.providerState,
1144
+ transferSubsidy: JSON.stringify(signed),
1145
+ ...(settlement ? { transferSubsidyOwnerId: settlement.transferId } : {}),
1146
+ },
1147
+ ...(settlement
1148
+ ? { subsidyAmount: null, subsidyCommitmentAmount: null, subsidyNativeAmount: null }
1149
+ : {}),
1150
+ subsidyTransactionHash: signed.hash,
1151
+ });
1152
+ if (result.type !== 'applied')
1153
+ throw new AtomicTransitionError();
1154
+ return {
1155
+ record: result.record,
1156
+ references: result.references,
1157
+ signed,
1158
+ type: settlement ? 'shared' : 'signed',
1159
+ };
1160
+ });
1161
+ }
572
1162
  /** Atomically records a verified destination transaction and completes a transfer. */
573
1163
  export async function complete(db, options) {
574
1164
  return db.transaction(async (tx) => {
@@ -579,7 +1169,8 @@ export async function complete(db, options) {
579
1169
  const transactions = await RoutesTransferTransactions.listByTransfer(tx, current.id);
580
1170
  const existing = options.transactionHashes.every((transactionHash) => transactions.some((transaction) => transaction.chainId === options.chainId &&
581
1171
  transaction.role === 'destination' &&
582
- transaction.transactionRef === transactionHash.toLowerCase()));
1172
+ transaction.transactionRef ===
1173
+ RoutesTransferTransactions.normalize(options.chainId, transactionHash)));
583
1174
  return existing ? { record: current, type: 'replayed' } : { current, type: 'invalid' };
584
1175
  }
585
1176
  if (current.status !== 'processing')
@@ -609,6 +1200,42 @@ export async function complete(db, options) {
609
1200
  return { record: result.record, references: result.references, type: 'completed' };
610
1201
  });
611
1202
  }
1203
+ /**
1204
+ * Returns an `action-required` transfer to `processing` so reconciliation re-verifies it.
1205
+ * Refuses transfers holding a prepared or signed subsidy, which need on-chain recovery first.
1206
+ */
1207
+ export async function retry(db, options) {
1208
+ return db.transaction(async (tx) => {
1209
+ const current = await RoutesTransfers.getForUpdate(tx, options.id);
1210
+ if (!current)
1211
+ return { type: 'not_found' };
1212
+ if (current.version !== options.expectedVersion)
1213
+ return { current, type: 'stale' };
1214
+ if (current.status !== 'action-required')
1215
+ return { current, type: 'invalid' };
1216
+ // A prepared or signed subsidy may still land; reconciling again could prepare a replacement.
1217
+ const state = current.providerState;
1218
+ if (current.subsidyTransactionHash !== null ||
1219
+ state?.['transferSubsidy'] ||
1220
+ state?.['solanaTransferSubsidyPrepared'] ||
1221
+ state?.['tronTransferSubsidyPrepared'])
1222
+ return { current, type: 'subsidy_pending' };
1223
+ const result = await transitionIn(tx, {
1224
+ current,
1225
+ expectedVersion: current.version,
1226
+ id: current.id,
1227
+ status: 'processing',
1228
+ });
1229
+ if (result.type !== 'applied')
1230
+ throw new AtomicTransitionError();
1231
+ return {
1232
+ previous: current,
1233
+ record: result.record,
1234
+ references: result.references,
1235
+ type: 'retried',
1236
+ };
1237
+ });
1238
+ }
612
1239
  /**
613
1240
  * Applies a version-guarded material change: a status transition, a snapshot
614
1241
  * update, or both. The row update and its immutable event commit in one
@@ -628,11 +1255,21 @@ async function transitionIn(tx, options) {
628
1255
  const status = options.status ?? current.status;
629
1256
  if (status !== current.status && !canTransition(current.status, status))
630
1257
  return { current, type: 'invalid' };
1258
+ // Provider evidence can be replaced or cleared after a reorg; accepted
1259
+ // financial terms remain immutable across every lifecycle transition.
1260
+ const routePolicy = Policy.commitment(current.providerState);
1261
+ let providerState = options.providerState === undefined ? current.providerState : options.providerState;
1262
+ if (routePolicy)
1263
+ providerState = {
1264
+ ...providerState,
1265
+ routePolicy,
1266
+ routePolicyKey: Policy.commitmentKey(routePolicy),
1267
+ };
631
1268
  const updated = await RoutesTransfers.update(tx, {
632
1269
  expectedVersion: options.expectedVersion,
633
1270
  id: options.id,
634
1271
  providerDeliveredAt: current.providerDeliveredAt,
635
- providerState: options.providerState === undefined ? current.providerState : options.providerState,
1272
+ providerState,
636
1273
  snapshot: options.snapshot === undefined ? current.snapshot : parseSnapshot(options.snapshot),
637
1274
  status,
638
1275
  statusReason: options.statusReason ?? (status === current.status ? current.statusReason : null),