tapimo 0.15.1 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +893 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +70 -70
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +529 -76
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +157 -157
  45. package/dist/admin/index.d.ts +0 -1
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +0 -1
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/ui.generated.d.ts +1 -1
  50. package/dist/admin/ui.generated.d.ts.map +1 -1
  51. package/dist/admin/ui.generated.js +205 -201
  52. package/dist/admin/ui.generated.js.map +1 -1
  53. package/dist/analytics/Analytics.d.ts.map +1 -1
  54. package/dist/analytics/Analytics.js +65 -1
  55. package/dist/analytics/Analytics.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  57. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  58. package/dist/analytics/tables/requestEvents.js +58 -59
  59. package/dist/analytics/tables/requestEvents.js.map +1 -1
  60. package/dist/apps/data/App.d.ts +2709 -2670
  61. package/dist/apps/data/App.d.ts.map +1 -1
  62. package/dist/apps/data/routes/activities.d.ts +357 -357
  63. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  64. package/dist/apps/data/routes/activities.js +50 -0
  65. package/dist/apps/data/routes/activities.js.map +1 -1
  66. package/dist/apps/data/routes/addresses.d.ts +248 -248
  67. package/dist/apps/data/routes/balances.d.ts +22 -22
  68. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  69. package/dist/apps/data/routes/balances.js +5 -7
  70. package/dist/apps/data/routes/balances.js.map +1 -1
  71. package/dist/apps/data/routes/blocks.d.ts +125 -125
  72. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  73. package/dist/apps/data/routes/earn.d.ts +103 -12
  74. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  75. package/dist/apps/data/routes/earn.js +456 -220
  76. package/dist/apps/data/routes/earn.js.map +1 -1
  77. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  78. package/dist/apps/data/routes/exchanges.js +267 -97
  79. package/dist/apps/data/routes/exchanges.js.map +1 -1
  80. package/dist/apps/data/routes/fee-amm.d.ts +109 -127
  81. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.js +83 -54
  83. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +43 -43
  85. package/dist/apps/data/routes/receipts.d.ts +235 -235
  86. package/dist/apps/data/routes/rpc.d.ts +30 -30
  87. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  88. package/dist/apps/data/routes/tokens.js +11 -6
  89. package/dist/apps/data/routes/tokens.js.map +1 -1
  90. package/dist/apps/data/routes/transactions.d.ts +2 -0
  91. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  92. package/dist/apps/data/routes/transactions.js +30 -22
  93. package/dist/apps/data/routes/transactions.js.map +1 -1
  94. package/dist/apps/data/routes/transfers.d.ts +77 -77
  95. package/dist/apps/data/routes/valuation.d.ts +32 -32
  96. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  97. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  98. package/dist/apps/data/routes/webhooks.js +1 -1
  99. package/dist/apps/data/routes/webhooks.js.map +1 -1
  100. package/dist/apps/data/routes/zones.d.ts +31 -31
  101. package/dist/apps/management/App.d.ts +2909 -2064
  102. package/dist/apps/management/App.d.ts.map +1 -1
  103. package/dist/apps/management/App.js +2 -0
  104. package/dist/apps/management/App.js.map +1 -1
  105. package/dist/apps/management/Billing.d.ts +2 -4
  106. package/dist/apps/management/Billing.d.ts.map +1 -1
  107. package/dist/apps/management/Billing.js +65 -26
  108. package/dist/apps/management/Billing.js.map +1 -1
  109. package/dist/apps/management/routes/api-keys.d.ts +257 -245
  110. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  111. package/dist/apps/management/routes/api-keys.js +70 -11
  112. package/dist/apps/management/routes/api-keys.js.map +1 -1
  113. package/dist/apps/management/routes/billing.d.ts +84 -84
  114. package/dist/apps/management/routes/cli.d.ts +912 -0
  115. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  116. package/dist/apps/management/routes/cli.js +416 -0
  117. package/dist/apps/management/routes/cli.js.map +1 -0
  118. package/dist/apps/management/routes/faucet.d.ts +8 -8
  119. package/dist/apps/management/routes/invitations.d.ts +138 -138
  120. package/dist/apps/management/routes/invite-links.d.ts +172 -172
  121. package/dist/apps/management/routes/members.d.ts +16 -16
  122. package/dist/apps/management/routes/orgs.d.ts +104 -104
  123. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  124. package/dist/apps/management/routes/orgs.js +8 -2
  125. package/dist/apps/management/routes/orgs.js.map +1 -1
  126. package/dist/apps/management/routes/projects.d.ts +125 -125
  127. package/dist/apps/management/routes/usage.d.ts +8 -8
  128. package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
  129. package/dist/apps/management/routes/webhooks.d.ts +485 -485
  130. package/dist/apps/mpp/App.d.ts +44 -44
  131. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  132. package/dist/apps/mpp/internal/Policy.js +4 -2
  133. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  134. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  135. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  136. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  137. package/dist/apps/relay/App.d.ts +8 -0
  138. package/dist/apps/relay/App.d.ts.map +1 -1
  139. package/dist/apps/relay/App.js +16 -4
  140. package/dist/apps/relay/App.js.map +1 -1
  141. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  142. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  143. package/dist/apps/relay/Sponsorships.js +71 -60
  144. package/dist/apps/relay/Sponsorships.js.map +1 -1
  145. package/dist/apps/routes/Access.d.ts +53 -0
  146. package/dist/apps/routes/Access.d.ts.map +1 -1
  147. package/dist/apps/routes/Access.js +121 -0
  148. package/dist/apps/routes/Access.js.map +1 -1
  149. package/dist/apps/routes/App.d.ts +397 -158
  150. package/dist/apps/routes/App.d.ts.map +1 -1
  151. package/dist/apps/routes/App.js.map +1 -1
  152. package/dist/apps/routes/routes/chains.d.ts +25 -25
  153. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  154. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  155. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  156. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  157. package/dist/apps/routes/routes/quotes.d.ts +171 -81
  158. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  159. package/dist/apps/routes/routes/quotes.js +101 -27
  160. package/dist/apps/routes/routes/quotes.js.map +1 -1
  161. package/dist/apps/routes/routes/transfers.d.ts +532 -480
  162. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/transfers.js +182 -37
  164. package/dist/apps/routes/routes/transfers.js.map +1 -1
  165. package/dist/cli/ApiKeys.d.ts +120 -0
  166. package/dist/cli/ApiKeys.d.ts.map +1 -0
  167. package/dist/cli/ApiKeys.js +138 -0
  168. package/dist/cli/ApiKeys.js.map +1 -0
  169. package/dist/cli/Cli.d.ts +92 -34
  170. package/dist/cli/Cli.d.ts.map +1 -1
  171. package/dist/cli/Cli.js +188 -11
  172. package/dist/cli/Cli.js.map +1 -1
  173. package/dist/cli/Credentials.d.ts +95 -0
  174. package/dist/cli/Credentials.d.ts.map +1 -0
  175. package/dist/cli/Credentials.js +110 -0
  176. package/dist/cli/Credentials.js.map +1 -0
  177. package/dist/cli/Spec.d.ts +59 -0
  178. package/dist/cli/Spec.d.ts.map +1 -0
  179. package/dist/cli/Spec.js +77 -0
  180. package/dist/cli/Spec.js.map +1 -0
  181. package/dist/cli/bin.js +5 -1
  182. package/dist/cli/bin.js.map +1 -1
  183. package/dist/cli/commands/admin.d.ts +5 -5
  184. package/dist/cli/commands/admin.d.ts.map +1 -1
  185. package/dist/cli/commands/auth.d.ts +73 -0
  186. package/dist/cli/commands/auth.d.ts.map +1 -0
  187. package/dist/cli/commands/auth.js +204 -0
  188. package/dist/cli/commands/auth.js.map +1 -0
  189. package/dist/cli/commands/keys.d.ts +17 -0
  190. package/dist/cli/commands/keys.d.ts.map +1 -0
  191. package/dist/cli/commands/keys.js +109 -0
  192. package/dist/cli/commands/keys.js.map +1 -0
  193. package/dist/cloudflare.d.ts +27 -2
  194. package/dist/cloudflare.d.ts.map +1 -1
  195. package/dist/cloudflare.js +144 -17
  196. package/dist/cloudflare.js.map +1 -1
  197. package/dist/db/Db.d.ts +23 -0
  198. package/dist/db/Db.d.ts.map +1 -1
  199. package/dist/db/Db.js +413 -1
  200. package/dist/db/Db.js.map +1 -1
  201. package/dist/db/Schema.d.ts +44 -1
  202. package/dist/db/Schema.d.ts.map +1 -1
  203. package/dist/db/Schema.js +56 -3
  204. package/dist/db/Schema.js.map +1 -1
  205. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  206. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  207. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  208. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  209. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  210. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  211. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  212. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  213. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  214. package/dist/db/tables/authAccounts.js +1 -0
  215. package/dist/db/tables/authAccounts.js.map +1 -1
  216. package/dist/db/tables/earnVaults.d.ts +5 -1
  217. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  218. package/dist/db/tables/earnVaults.js +12 -1
  219. package/dist/db/tables/earnVaults.js.map +1 -1
  220. package/dist/db/tables/organizations.d.ts +4 -2
  221. package/dist/db/tables/organizations.d.ts.map +1 -1
  222. package/dist/db/tables/organizations.js +8 -34
  223. package/dist/db/tables/organizations.js.map +1 -1
  224. package/dist/db/tables/requestUsage.d.ts +5 -1
  225. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  226. package/dist/db/tables/requestUsage.js +10 -2
  227. package/dist/db/tables/requestUsage.js.map +1 -1
  228. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  229. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  230. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  231. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  232. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  233. package/dist/db/tables/rewardRuns.js +4 -0
  234. package/dist/db/tables/rewardRuns.js.map +1 -1
  235. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  236. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  237. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  238. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  239. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  240. package/dist/db/tables/routesDepositAddresses.js +84 -31
  241. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  242. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  243. package/dist/db/tables/routesDeposits.js +31 -21
  244. package/dist/db/tables/routesDeposits.js.map +1 -1
  245. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  246. package/dist/db/tables/routesIdempotency.js +2 -0
  247. package/dist/db/tables/routesIdempotency.js.map +1 -1
  248. package/dist/db/tables/routesPolicies.d.ts +58 -0
  249. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  250. package/dist/db/tables/routesPolicies.js +198 -0
  251. package/dist/db/tables/routesPolicies.js.map +1 -0
  252. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  253. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  254. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  255. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  256. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  257. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  258. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  259. package/dist/db/tables/routesTransfers.d.ts +26 -1
  260. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  261. package/dist/db/tables/routesTransfers.js +36 -6
  262. package/dist/db/tables/routesTransfers.js.map +1 -1
  263. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  264. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js +144 -33
  266. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  267. package/dist/db/tables/users.d.ts +2 -0
  268. package/dist/db/tables/users.d.ts.map +1 -1
  269. package/dist/db/tables/users.js +11 -0
  270. package/dist/db/tables/users.js.map +1 -1
  271. package/dist/handlers/internal/multisig.d.ts +1 -1
  272. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  273. package/dist/handlers/internal/multisig.js +3 -2
  274. package/dist/handlers/internal/multisig.js.map +1 -1
  275. package/dist/handlers/relay.d.ts +2 -0
  276. package/dist/handlers/relay.d.ts.map +1 -1
  277. package/dist/handlers/relay.js +34 -15
  278. package/dist/handlers/relay.js.map +1 -1
  279. package/dist/internal/Auth.d.ts +57 -6
  280. package/dist/internal/Auth.d.ts.map +1 -1
  281. package/dist/internal/Auth.js +182 -78
  282. package/dist/internal/Auth.js.map +1 -1
  283. package/dist/internal/BetterAuth.d.ts +22 -0
  284. package/dist/internal/BetterAuth.d.ts.map +1 -1
  285. package/dist/internal/BetterAuth.js +17 -14
  286. package/dist/internal/BetterAuth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts +5 -0
  288. package/dist/internal/Cache.d.ts.map +1 -1
  289. package/dist/internal/Cache.js +3 -1
  290. package/dist/internal/Cache.js.map +1 -1
  291. package/dist/internal/CliAuth.d.ts +243 -0
  292. package/dist/internal/CliAuth.d.ts.map +1 -0
  293. package/dist/internal/CliAuth.js +249 -0
  294. package/dist/internal/CliAuth.js.map +1 -0
  295. package/dist/internal/EarnSharePrices.d.ts +1 -1
  296. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  297. package/dist/internal/EarnSharePrices.js +7 -3
  298. package/dist/internal/EarnSharePrices.js.map +1 -1
  299. package/dist/internal/EarnVaults.d.ts +47 -0
  300. package/dist/internal/EarnVaults.d.ts.map +1 -1
  301. package/dist/internal/EarnVaults.js +188 -4
  302. package/dist/internal/EarnVaults.js.map +1 -1
  303. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  304. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  305. package/dist/internal/EarnWithdrawals.js +189 -0
  306. package/dist/internal/EarnWithdrawals.js.map +1 -0
  307. package/dist/internal/ExecutionContext.d.ts +21 -0
  308. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  309. package/dist/internal/ExecutionContext.js +16 -0
  310. package/dist/internal/ExecutionContext.js.map +1 -0
  311. package/dist/internal/Log.d.ts +7 -3
  312. package/dist/internal/Log.d.ts.map +1 -1
  313. package/dist/internal/Log.js +163 -130
  314. package/dist/internal/Log.js.map +1 -1
  315. package/dist/internal/MetricSink.d.ts.map +1 -1
  316. package/dist/internal/MetricSink.js +26 -1
  317. package/dist/internal/MetricSink.js.map +1 -1
  318. package/dist/internal/RateLimit.d.ts +67 -0
  319. package/dist/internal/RateLimit.d.ts.map +1 -1
  320. package/dist/internal/RateLimit.js +174 -27
  321. package/dist/internal/RateLimit.js.map +1 -1
  322. package/dist/internal/Store.d.ts +6 -0
  323. package/dist/internal/Store.d.ts.map +1 -1
  324. package/dist/internal/Store.js +4 -5
  325. package/dist/internal/Store.js.map +1 -1
  326. package/dist/internal/Timing.d.ts +6 -0
  327. package/dist/internal/Timing.d.ts.map +1 -1
  328. package/dist/internal/Timing.js +21 -1
  329. package/dist/internal/Timing.js.map +1 -1
  330. package/dist/internal/Tron.d.ts +124 -0
  331. package/dist/internal/Tron.d.ts.map +1 -0
  332. package/dist/internal/Tron.js +202 -0
  333. package/dist/internal/Tron.js.map +1 -0
  334. package/dist/internal/Viem.d.ts +4 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Viem.js +25 -6
  337. package/dist/internal/Viem.js.map +1 -1
  338. package/dist/internal/rewards/Read.d.ts +2 -2
  339. package/dist/internal/rewards/Read.d.ts.map +1 -1
  340. package/dist/internal/rewards/Read.js +11 -2
  341. package/dist/internal/rewards/Read.js.map +1 -1
  342. package/dist/internal/routes/Action.d.ts +27 -0
  343. package/dist/internal/routes/Action.d.ts.map +1 -1
  344. package/dist/internal/routes/Action.js +49 -1
  345. package/dist/internal/routes/Action.js.map +1 -1
  346. package/dist/internal/routes/Chain.d.ts +2 -0
  347. package/dist/internal/routes/Chain.d.ts.map +1 -1
  348. package/dist/internal/routes/Chain.js +4 -0
  349. package/dist/internal/routes/Chain.js.map +1 -1
  350. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  351. package/dist/internal/routes/DepositAddress.js +5 -0
  352. package/dist/internal/routes/DepositAddress.js.map +1 -1
  353. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  354. package/dist/internal/routes/Evidence.js +6 -2
  355. package/dist/internal/routes/Evidence.js.map +1 -1
  356. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  357. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  358. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  359. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  360. package/dist/internal/routes/Policy.d.ts +161 -0
  361. package/dist/internal/routes/Policy.d.ts.map +1 -0
  362. package/dist/internal/routes/Policy.js +249 -0
  363. package/dist/internal/routes/Policy.js.map +1 -0
  364. package/dist/internal/routes/Provider.d.ts +66 -3
  365. package/dist/internal/routes/Provider.d.ts.map +1 -1
  366. package/dist/internal/routes/Provider.js +106 -27
  367. package/dist/internal/routes/Provider.js.map +1 -1
  368. package/dist/internal/routes/Quota.d.ts +57 -0
  369. package/dist/internal/routes/Quota.d.ts.map +1 -0
  370. package/dist/internal/routes/Quota.js +144 -0
  371. package/dist/internal/routes/Quota.js.map +1 -0
  372. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  373. package/dist/internal/routes/Reconciliation.js +163 -47
  374. package/dist/internal/routes/Reconciliation.js.map +1 -1
  375. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  376. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  377. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  378. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  379. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  380. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  381. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  382. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  383. package/dist/internal/routes/Subsidy.d.ts +2 -2
  384. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  385. package/dist/internal/routes/Subsidy.js +2 -2
  386. package/dist/internal/routes/Subsidy.js.map +1 -1
  387. package/dist/internal/routes/Transfer.d.ts +229 -1
  388. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  389. package/dist/internal/routes/Transfer.js +644 -7
  390. package/dist/internal/routes/Transfer.js.map +1 -1
  391. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  392. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  393. package/dist/internal/routes/TransferReconciliation.js +83 -159
  394. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  395. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  396. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  397. package/dist/internal/routes/TransferSettlement.js +2 -0
  398. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  399. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  400. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  401. package/dist/internal/routes/TransferSubsidy.js +64 -5
  402. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  403. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  404. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  405. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  406. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  407. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  408. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  409. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  410. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  411. package/dist/internal/routes/index.d.ts +3 -0
  412. package/dist/internal/routes/index.d.ts.map +1 -1
  413. package/dist/internal/routes/index.js +3 -0
  414. package/dist/internal/routes/index.js.map +1 -1
  415. package/dist/internal/routes/providers/across.d.ts +3 -0
  416. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  417. package/dist/internal/routes/providers/across.js +11 -0
  418. package/dist/internal/routes/providers/across.js.map +1 -1
  419. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  420. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  421. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  422. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  423. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  424. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  425. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  426. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  427. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  428. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  429. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  430. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  431. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  432. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  434. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  435. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  436. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/propAmm.js +524 -0
  438. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  439. package/dist/internal/routes/providers/relay.d.ts +3 -0
  440. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  441. package/dist/internal/routes/providers/relay.js +352 -41
  442. package/dist/internal/routes/providers/relay.js.map +1 -1
  443. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  444. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  445. package/dist/internal/routes/providers/rhino.js +11 -0
  446. package/dist/internal/routes/providers/rhino.js.map +1 -1
  447. package/dist/internal/routes/providers/squid.d.ts +3 -0
  448. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  449. package/dist/internal/routes/providers/squid.js +19 -0
  450. package/dist/internal/routes/providers/squid.js.map +1 -1
  451. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  452. package/dist/internal/routes/providers/stargate.js +22 -9
  453. package/dist/internal/routes/providers/stargate.js.map +1 -1
  454. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  455. package/dist/internal/routes/providers/symbiosis.js +13 -17
  456. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  457. package/dist/providers/index.d.ts +14 -0
  458. package/dist/providers/index.d.ts.map +1 -1
  459. package/dist/providers/index.js +6 -0
  460. package/dist/providers/index.js.map +1 -1
  461. package/package.json +16 -6
  462. package/src/ApiKey.ts +7 -3
  463. package/src/ApiKeys.test.ts +652 -8
  464. package/src/ApiKeys.ts +191 -11
  465. package/src/App.test.ts +405 -18
  466. package/src/App.ts +51 -15
  467. package/src/Client.test-d.ts +157 -10
  468. package/src/Client.test.ts +4 -4
  469. package/src/Scope.ts +1 -2
  470. package/src/admin/App.ts +11 -5
  471. package/src/admin/apps/api-keys.test.ts +98 -2
  472. package/src/admin/apps/api-keys.ts +21 -12
  473. package/src/admin/apps/earn-vaults.test.ts +76 -7
  474. package/src/admin/apps/earn-vaults.ts +47 -8
  475. package/src/admin/apps/organizations.test.ts +147 -31
  476. package/src/admin/apps/organizations.ts +5 -4
  477. package/src/admin/apps/route-policies.test.ts +220 -0
  478. package/src/admin/apps/route-policies.ts +322 -0
  479. package/src/admin/apps/routes-support.test.ts +107 -2
  480. package/src/admin/apps/routes-support.ts +43 -3
  481. package/src/admin/apps/routes.test.ts +150 -0
  482. package/src/admin/apps/routes.ts +97 -1
  483. package/src/admin/apps/scopes.test.ts +1 -1
  484. package/src/admin/index.ts +0 -1
  485. package/src/admin/ui/plugin.ts +2 -1
  486. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  487. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  488. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  489. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  490. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  491. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  492. package/src/admin/ui/src/lib/routes.ts +34 -0
  493. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  494. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  495. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  496. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  497. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  498. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  499. package/src/admin/ui/src/routes/organizations.tsx +1 -0
  500. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  501. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  502. package/src/admin/ui/src/routes/routes.tsx +85 -2
  503. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  504. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  505. package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
  506. package/src/admin/ui.generated.ts +258 -202
  507. package/src/analytics/Analytics.test.ts +4 -50
  508. package/src/analytics/Analytics.ts +65 -1
  509. package/src/analytics/tables/requestEvents.test.ts +402 -1
  510. package/src/analytics/tables/requestEvents.ts +62 -93
  511. package/src/apps/data/routes/activities.test.ts +315 -14
  512. package/src/apps/data/routes/activities.ts +60 -0
  513. package/src/apps/data/routes/balances.ts +5 -7
  514. package/src/apps/data/routes/earn.bench.ts +18 -0
  515. package/src/apps/data/routes/earn.local.test.ts +507 -0
  516. package/src/apps/data/routes/earn.test.ts +405 -127
  517. package/src/apps/data/routes/earn.ts +660 -270
  518. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  519. package/src/apps/data/routes/exchanges.test.ts +166 -2
  520. package/src/apps/data/routes/exchanges.ts +308 -101
  521. package/src/apps/data/routes/fee-amm.test.ts +134 -2
  522. package/src/apps/data/routes/fee-amm.ts +122 -60
  523. package/src/apps/data/routes/receipts.test.ts +21 -18
  524. package/src/apps/data/routes/rpc.test.ts +2 -2
  525. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  526. package/src/apps/data/routes/tokens.test.ts +4 -4
  527. package/src/apps/data/routes/tokens.ts +11 -6
  528. package/src/apps/data/routes/transactions.test.ts +29 -0
  529. package/src/apps/data/routes/transactions.ts +33 -22
  530. package/src/apps/data/routes/webhooks.test.ts +12 -3
  531. package/src/apps/data/routes/webhooks.ts +2 -1
  532. package/src/apps/management/App.ts +4 -0
  533. package/src/apps/management/Billing.test.ts +253 -27
  534. package/src/apps/management/Billing.ts +83 -29
  535. package/src/apps/management/routes/api-keys.test.ts +1 -1
  536. package/src/apps/management/routes/api-keys.ts +85 -11
  537. package/src/apps/management/routes/billing.test.ts +68 -4
  538. package/src/apps/management/routes/cli.test.ts +370 -0
  539. package/src/apps/management/routes/cli.ts +533 -0
  540. package/src/apps/management/routes/me.test.ts +14 -4
  541. package/src/apps/management/routes/orgs.test.ts +108 -4
  542. package/src/apps/management/routes/orgs.ts +7 -2
  543. package/src/apps/management/routes/usage.test.ts +2 -2
  544. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  545. package/src/apps/mpp/internal/Policy.ts +6 -2
  546. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  547. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  548. package/src/apps/relay/App.test.ts +85 -1
  549. package/src/apps/relay/App.ts +28 -4
  550. package/src/apps/relay/Sponsorships.test.ts +97 -1
  551. package/src/apps/relay/Sponsorships.ts +77 -66
  552. package/src/apps/routes/Access.test.ts +319 -0
  553. package/src/apps/routes/Access.ts +147 -0
  554. package/src/apps/routes/App.ts +10 -0
  555. package/src/apps/routes/routes/chains.test.ts +3 -2
  556. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  557. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  558. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  559. package/src/apps/routes/routes/quotes.test.ts +81 -8
  560. package/src/apps/routes/routes/quotes.ts +109 -27
  561. package/src/apps/routes/routes/transfers.test.ts +252 -15
  562. package/src/apps/routes/routes/transfers.ts +212 -33
  563. package/src/cli/ApiKeys.test.ts +265 -0
  564. package/src/cli/ApiKeys.ts +189 -0
  565. package/src/cli/Cli.test.ts +188 -0
  566. package/src/cli/Cli.ts +280 -12
  567. package/src/cli/Credentials.test.ts +122 -0
  568. package/src/cli/Credentials.ts +144 -0
  569. package/src/cli/Spec.test.ts +133 -0
  570. package/src/cli/Spec.ts +132 -0
  571. package/src/cli/bin.test.ts +49 -0
  572. package/src/cli/bin.ts +5 -1
  573. package/src/cli/commands/auth.test.ts +138 -0
  574. package/src/cli/commands/auth.ts +254 -0
  575. package/src/cli/commands/keys.test.ts +68 -0
  576. package/src/cli/commands/keys.ts +125 -0
  577. package/src/cloudflare.ts +184 -36
  578. package/src/db/Db.test.ts +877 -0
  579. package/src/db/Db.ts +498 -1
  580. package/src/db/Schema.ts +75 -4
  581. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  582. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  583. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  584. package/src/db/tables/authAccounts.test.ts +30 -0
  585. package/src/db/tables/authAccounts.ts +1 -0
  586. package/src/db/tables/earnVaults.test.ts +34 -0
  587. package/src/db/tables/earnVaults.ts +17 -2
  588. package/src/db/tables/organizations.test.ts +148 -84
  589. package/src/db/tables/organizations.ts +11 -43
  590. package/src/db/tables/requestUsage.ts +13 -2
  591. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  592. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  593. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  594. package/src/db/tables/rewardRuns.ts +4 -0
  595. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  596. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  597. package/src/db/tables/routesDepositAddresses.ts +118 -34
  598. package/src/db/tables/routesDeposits.test.ts +66 -5
  599. package/src/db/tables/routesDeposits.ts +47 -26
  600. package/src/db/tables/routesIdempotency.test.ts +80 -0
  601. package/src/db/tables/routesIdempotency.ts +2 -0
  602. package/src/db/tables/routesPolicies.test.ts +143 -0
  603. package/src/db/tables/routesPolicies.ts +251 -0
  604. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  605. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  606. package/src/db/tables/routesTransfers.test.ts +183 -2
  607. package/src/db/tables/routesTransfers.ts +65 -6
  608. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  609. package/src/db/tables/sponsoredTransactions.ts +182 -38
  610. package/src/db/tables/users.test.ts +51 -0
  611. package/src/db/tables/users.ts +12 -0
  612. package/src/handlers/internal/multisig.store.test.ts +120 -0
  613. package/src/handlers/internal/multisig.test.ts +389 -0
  614. package/src/handlers/internal/multisig.ts +13 -10
  615. package/src/handlers/relay.test.ts +259 -83
  616. package/src/handlers/relay.ts +36 -17
  617. package/src/internal/Auth.test.ts +291 -8
  618. package/src/internal/Auth.ts +227 -96
  619. package/src/internal/BetterAuth.test.ts +58 -22
  620. package/src/internal/BetterAuth.ts +23 -17
  621. package/src/internal/Cache.ts +3 -1
  622. package/src/internal/CliAuth.test.ts +279 -0
  623. package/src/internal/CliAuth.ts +319 -0
  624. package/src/internal/EarnSharePrices.test.ts +25 -0
  625. package/src/internal/EarnSharePrices.ts +9 -2
  626. package/src/internal/EarnVaults.test.ts +67 -0
  627. package/src/internal/EarnVaults.ts +299 -4
  628. package/src/internal/EarnWithdrawals.test.ts +315 -0
  629. package/src/internal/EarnWithdrawals.ts +266 -0
  630. package/src/internal/ExecutionContext.ts +31 -0
  631. package/src/internal/Log.test.ts +210 -0
  632. package/src/internal/Log.ts +180 -142
  633. package/src/internal/MetricSink.test.ts +190 -15
  634. package/src/internal/MetricSink.ts +27 -1
  635. package/src/internal/RateLimit.test.ts +144 -8
  636. package/src/internal/RateLimit.ts +254 -26
  637. package/src/internal/Store.ts +4 -5
  638. package/src/internal/Timing.test.ts +32 -0
  639. package/src/internal/Timing.ts +20 -1
  640. package/src/internal/Tron.test-d.ts +22 -0
  641. package/src/internal/Tron.test.ts +94 -0
  642. package/src/internal/Tron.ts +289 -0
  643. package/src/internal/Viem.rpc.test.ts +76 -0
  644. package/src/internal/Viem.ts +29 -6
  645. package/src/internal/rewards/Read.test.ts +109 -0
  646. package/src/internal/rewards/Read.ts +13 -4
  647. package/src/internal/routes/Action.test.ts +70 -0
  648. package/src/internal/routes/Action.ts +76 -1
  649. package/src/internal/routes/Chain.test.ts +18 -0
  650. package/src/internal/routes/Chain.ts +5 -0
  651. package/src/internal/routes/DepositAddress.ts +5 -0
  652. package/src/internal/routes/Evidence.test.ts +64 -0
  653. package/src/internal/routes/Evidence.ts +11 -3
  654. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  655. package/src/internal/routes/Policy.test.ts +316 -0
  656. package/src/internal/routes/Policy.ts +399 -0
  657. package/src/internal/routes/Provider.test.ts +103 -2
  658. package/src/internal/routes/Provider.ts +149 -27
  659. package/src/internal/routes/Quota.test.ts +149 -0
  660. package/src/internal/routes/Quota.ts +226 -0
  661. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  662. package/src/internal/routes/Reconciliation.test.ts +371 -13
  663. package/src/internal/routes/Reconciliation.ts +193 -42
  664. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  665. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  666. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  667. package/src/internal/routes/SourceObservation.test.ts +221 -0
  668. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  669. package/src/internal/routes/Subsidy.ts +4 -2
  670. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  671. package/src/internal/routes/Transfer.test.ts +130 -1
  672. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  673. package/src/internal/routes/Transfer.ts +866 -8
  674. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  675. package/src/internal/routes/TransferReconciliation.ts +91 -166
  676. package/src/internal/routes/TransferSettlement.ts +48 -0
  677. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  678. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  679. package/src/internal/routes/TransferSubsidy.ts +87 -12
  680. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  681. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  682. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  683. package/src/internal/routes/index.test.ts +3 -0
  684. package/src/internal/routes/index.ts +3 -0
  685. package/src/internal/routes/providers/across.ts +13 -0
  686. package/src/internal/routes/providers/index.test.ts +141 -0
  687. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  688. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  689. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  690. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  691. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  692. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  693. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  694. package/src/internal/routes/providers/propAmm.ts +640 -0
  695. package/src/internal/routes/providers/relay.test.ts +1263 -41
  696. package/src/internal/routes/providers/relay.ts +423 -38
  697. package/src/internal/routes/providers/rhino.ts +14 -1
  698. package/src/internal/routes/providers/squid.ts +21 -0
  699. package/src/internal/routes/providers/stargate.test.ts +105 -1
  700. package/src/internal/routes/providers/stargate.ts +22 -9
  701. package/src/internal/routes/providers/symbiosis.ts +13 -47
  702. package/src/providers/index.test.ts +2 -0
  703. package/src/providers/index.ts +18 -0
  704. package/dist/admin/Access.d.ts +0 -39
  705. package/dist/admin/Access.d.ts.map +0 -1
  706. package/dist/admin/Access.js +0 -73
  707. package/dist/admin/Access.js.map +0 -1
  708. package/src/admin/Access.test.ts +0 -130
  709. package/src/admin/Access.ts +0 -85
@@ -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),