tapimo 0.15.1 → 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 (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
@@ -13,6 +13,7 @@ import * as Deposit from './Deposit.js'
13
13
  import * as DepositWebhook from './DepositWebhook.js'
14
14
  import * as Observability from './Observability.js'
15
15
  import * as Provider from './Provider.js'
16
+ import * as Policy from './Policy.js'
16
17
  import * as Subsidy from './Subsidy.js'
17
18
 
18
19
  const defaultBatchSize = 25
@@ -973,35 +974,57 @@ export async function reconcileRequest(
973
974
  : record.providerTransferIndex === providerTransferIndex,
974
975
  )
975
976
  if (!deposit) {
976
- deposit = await Deposit.create(db, {
977
- detectionTrigger: trigger,
978
- now: new Date(options.request.createdAt),
979
- ...(observation?.pollObservedAt ? { pollObservedAt: observation.pollObservedAt } : {}),
980
- providerRequestId: options.request.id,
981
- providerTransferIndex,
982
- snapshot: {
983
- depositAddressId: options.address.id,
984
- ...(options.address.snapshot.subsidize ? { destinationAmountRequired } : {}),
985
- destinationChain: options.address.snapshot.destinationChain,
986
- destinationToken: options.address.snapshot.destinationToken,
987
- provider: options.address.snapshot.provider,
988
- recipient: options.address.recipient,
989
- refundAddress: options.address.refundAddress,
990
- ...(transfer.sender ? { sender: transfer.sender } : {}),
991
- sourceAmount,
992
- sourceChain: options.address.snapshot.sourceChain,
993
- sourceToken: options.address.snapshot.sourceToken,
994
- sourceTransactionHashes: [transfer.transactionHash],
977
+ const result = await RoutesDeposits.withSourceTransaction(db, {
978
+ depositAddressId: options.address.id,
979
+ fn: async (tx): Promise<RoutesDeposits.insertOrGetSource.Result> => {
980
+ const records = await RoutesDeposits.listBySourceTransaction(tx, {
981
+ depositAddressId: options.address.id,
982
+ sourceTransactionHash: transfer.transactionHash,
983
+ })
984
+ const existing = records.find(
985
+ (record) => record.sourceTransferIndex === transfer.transferIndex,
986
+ )
987
+ if (existing) return { record: existing, type: 'existing' }
988
+ return {
989
+ record: await Deposit.create(tx, {
990
+ detectionTrigger: trigger,
991
+ now: new Date(options.request.createdAt),
992
+ ...(observation?.pollObservedAt
993
+ ? { pollObservedAt: observation.pollObservedAt }
994
+ : {}),
995
+ providerRequestId: options.request.id,
996
+ providerTransferIndex,
997
+ snapshot: {
998
+ depositAddressId: options.address.id,
999
+ ...(options.address.snapshot.subsidize ? { destinationAmountRequired } : {}),
1000
+ destinationChain: options.address.snapshot.destinationChain,
1001
+ destinationToken: options.address.snapshot.destinationToken,
1002
+ provider: options.address.snapshot.provider,
1003
+ recipient: options.address.recipient,
1004
+ refundAddress: options.address.refundAddress,
1005
+ ...(transfer.sender ? { sender: transfer.sender } : {}),
1006
+ sourceAmount,
1007
+ sourceChain: options.address.snapshot.sourceChain,
1008
+ sourceToken: options.address.snapshot.sourceToken,
1009
+ sourceTransactionHashes: [transfer.transactionHash],
1010
+ },
1011
+ sourceTransactionHash: transfer.transactionHash,
1012
+ sourceTransferIndex: transfer.transferIndex,
1013
+ ...(observation?.webhookReceivedAt
1014
+ ? { webhookReceivedAt: observation.webhookReceivedAt }
1015
+ : {}),
1016
+ }),
1017
+ type: 'created',
1018
+ }
995
1019
  },
996
1020
  sourceTransactionHash: transfer.transactionHash,
997
- sourceTransferIndex: transfer.transferIndex,
998
- ...(observation?.webhookReceivedAt
999
- ? { webhookReceivedAt: observation.webhookReceivedAt }
1000
- : {}),
1001
1021
  })
1002
- Observability.recordDeposit(options.metrics, { record: deposit })
1022
+ deposit = result.record
1023
+ if (result.type === 'created') {
1024
+ Observability.recordDeposit(options.metrics, { record: deposit })
1025
+ created += 1
1026
+ }
1003
1027
  source.deposits.push(deposit)
1004
- created += 1
1005
1028
  }
1006
1029
  if (
1007
1030
  !Deposit.isTerminal(deposit.status) ||
@@ -1036,6 +1059,16 @@ export async function reconcileRequest(
1036
1059
  verified.push({ deposit, required, source: transfer, sourceAmount: BigInt(transfer.amount) })
1037
1060
  }
1038
1061
  }
1062
+ // Chain observation can add deposits after the initial timestamp update but before source verification completes.
1063
+ if (observation)
1064
+ await RoutesDeposits.recordRequestObservation(db, {
1065
+ depositAddressId: observation.depositAddressId,
1066
+ ...(observation.pollObservedAt ? { pollObservedAt: observation.pollObservedAt } : {}),
1067
+ providerRequestId: observation.providerRequestId,
1068
+ ...(observation.webhookReceivedAt
1069
+ ? { webhookReceivedAt: observation.webhookReceivedAt }
1070
+ : {}),
1071
+ })
1039
1072
  if (verified.length === 0) return { created, terminal: false, updated: updatedIds.size }
1040
1073
  if (!sourceEvidenceComplete) {
1041
1074
  return { created, terminal: false, updated: updatedIds.size }
@@ -1277,6 +1310,37 @@ async function reconcileProviderRecovery(db: Db.Db, options: ReconcileDeliveryOp
1277
1310
  }
1278
1311
  }
1279
1312
 
1313
+ function providerSubsidyUpdate(options: {
1314
+ address: RoutesDepositAddresses.Record
1315
+ deposit: RoutesDeposits.Record
1316
+ subsidy: Provider.Subsidy
1317
+ }): Pick<Deposit.transition.Options, 'providerState' | 'providerSubsidy'> {
1318
+ const { address, deposit, subsidy } = options
1319
+ if (deposit.providerSubsidy || deposit.providerState?.['unbilledProviderSubsidy']) return {}
1320
+ const commitment = Policy.commitment(address.providerState)
1321
+ const destinationToken = address.snapshot.destinationToken
1322
+ const settled =
1323
+ deposit.settlementTransactionHash && deposit.subsidyAmount
1324
+ ? scaleBaseUnits(
1325
+ BigInt(deposit.subsidyAmount.baseUnits),
1326
+ deposit.subsidyAmount.decimals,
1327
+ destinationToken.decimals,
1328
+ )
1329
+ : 0n
1330
+ const provider = scaleBaseUnits(
1331
+ BigInt(subsidy.amount.baseUnits),
1332
+ subsidy.amount.decimals,
1333
+ destinationToken.decimals,
1334
+ )
1335
+ if (
1336
+ !commitment ||
1337
+ Subsidy.supportsGap(commitment, { amount: settled + provider, destinationToken })
1338
+ )
1339
+ return { providerSubsidy: subsidy }
1340
+ // Provider expense is already irreversible. Preserve evidence without billing beyond the pinned cap.
1341
+ return { providerState: { unbilledProviderSubsidy: subsidy } }
1342
+ }
1343
+
1280
1344
  async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1281
1345
  let followUp: reconcileRequest.ReturnType['followUp']
1282
1346
  let terminal = true
@@ -1287,7 +1351,10 @@ async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1287
1351
  if (
1288
1352
  allTerminal &&
1289
1353
  (!options.address.snapshot.subsidize ||
1290
- options.verified.some((entry) => entry.deposit.providerSubsidy))
1354
+ options.verified.some(
1355
+ (entry) =>
1356
+ entry.deposit.providerSubsidy || entry.deposit.providerState?.['unbilledProviderSubsidy'],
1357
+ ))
1291
1358
  )
1292
1359
  return { terminal, updatedIds }
1293
1360
  const deliveryObservation = await observeProviderDelivery(options)
@@ -1310,8 +1377,10 @@ async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1310
1377
  ),
1311
1378
  )
1312
1379
  const destinationTransfers = destinationEvidence.flat()
1380
+ const providerSucceeded =
1381
+ options.request?.status === 'success' || deliveryObservation?.type === 'verified'
1313
1382
  const providerEvidenceComplete =
1314
- (options.request?.status === 'success' || deliveryObservation?.type === 'verified') &&
1383
+ providerSucceeded &&
1315
1384
  destinationEvidence.length > 0 &&
1316
1385
  destinationEvidence.every((transfers) => transfers.length > 0)
1317
1386
  const providerOutput = destinationTransfers.reduce(
@@ -1332,7 +1401,13 @@ async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1332
1401
  const deposit = options.verified.find(
1333
1402
  (entry) => entry.deposit.id === providerSubsidyDepositId,
1334
1403
  )?.deposit
1335
- if (!deposit || deposit.providerSubsidy) return { terminal, updatedIds }
1404
+ if (!deposit || deposit.providerSubsidy || deposit.providerState?.['unbilledProviderSubsidy'])
1405
+ return { terminal, updatedIds }
1406
+ const update = providerSubsidyUpdate({
1407
+ address: options.address,
1408
+ deposit,
1409
+ subsidy: providerSubsidy,
1410
+ })
1336
1411
  const result = await transitionDeposit(db, {
1337
1412
  current: deposit,
1338
1413
  metrics: options.metrics,
@@ -1340,12 +1415,27 @@ async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1340
1415
  transition: {
1341
1416
  expectedVersion: deposit.version,
1342
1417
  id: deposit.id,
1343
- providerSubsidy,
1418
+ ...update,
1419
+ ...(update.providerState
1420
+ ? { providerState: { ...deposit.providerState, ...update.providerState } }
1421
+ : {}),
1344
1422
  },
1345
1423
  })
1346
- if (result.type === 'applied') updatedIds.add(deposit.id)
1424
+ if (result.type === 'applied') {
1425
+ updatedIds.add(deposit.id)
1426
+ if (update.providerState)
1427
+ options.metrics?.count('routes_deposit_subsidy_count', 1, {
1428
+ outcome: 'provider_subsidy_unbilled',
1429
+ provider: options.address.providerId,
1430
+ })
1431
+ }
1347
1432
  return {
1348
- terminal: result.type !== 'stale' || Boolean(result.current.providerSubsidy),
1433
+ terminal:
1434
+ result.type !== 'stale' ||
1435
+ Boolean(
1436
+ result.current.providerSubsidy ||
1437
+ result.current.providerState?.['unbilledProviderSubsidy'],
1438
+ ),
1349
1439
  updatedIds,
1350
1440
  }
1351
1441
  }
@@ -1366,13 +1456,31 @@ async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1366
1456
  const settlement = await reconcileSubsidy(database, {
1367
1457
  address: options.address,
1368
1458
  delivered,
1369
- deposit,
1459
+ deposit:
1460
+ providerSubsidy && deposit.id === providerSubsidyDepositId
1461
+ ? { ...deposit, providerSubsidy }
1462
+ : deposit,
1370
1463
  providerEvidenceComplete,
1464
+ providerSucceeded,
1371
1465
  required,
1372
1466
  sourceAmount,
1373
1467
  subsidies: options.subsidies,
1374
1468
  verifyTransfers: options.verifyTransfers,
1375
1469
  })
1470
+ const providerUpdate =
1471
+ providerSubsidy && deposit.id === providerSubsidyDepositId
1472
+ ? providerSubsidyUpdate({
1473
+ address: options.address,
1474
+ deposit: {
1475
+ ...deposit,
1476
+ ...(settlement.subsidyAmount ? { subsidyAmount: settlement.subsidyAmount } : {}),
1477
+ ...(settlement.settlementTransactionHash
1478
+ ? { settlementTransactionHash: settlement.settlementTransactionHash }
1479
+ : {}),
1480
+ },
1481
+ subsidy: providerSubsidy,
1482
+ })
1483
+ : {}
1376
1484
  const destinationAmount = Value.tokenAmount({
1377
1485
  baseUnits: delivered + settlement.delivered,
1378
1486
  currency: options.address.snapshot.destinationToken.currency,
@@ -1403,17 +1511,16 @@ async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1403
1511
  }
1404
1512
  : {}),
1405
1513
  ...(providerEvidenceComplete ? { providerDeliveredAt: new Date().toISOString() } : {}),
1406
- ...(providerSubsidy && deposit.id === providerSubsidyDepositId
1407
- ? { providerSubsidy }
1408
- : {}),
1514
+ ...providerUpdate,
1409
1515
  providerRequestIds: options.request
1410
1516
  ? unique([...deposit.providerRequestIds, options.request.id])
1411
1517
  : deposit.providerRequestIds,
1412
- ...(deliveryObservation?.providerState
1518
+ ...(deliveryObservation?.providerState || providerUpdate.providerState
1413
1519
  ? {
1414
1520
  providerState: {
1415
1521
  ...deposit.providerState,
1416
- ...deliveryObservation.providerState,
1522
+ ...deliveryObservation?.providerState,
1523
+ ...providerUpdate.providerState,
1417
1524
  },
1418
1525
  }
1419
1526
  : {}),
@@ -1489,6 +1596,14 @@ async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1489
1596
  })
1490
1597
  options.onDeposit?.(result.record, committed.references)
1491
1598
  updatedIds.add(deposit.id)
1599
+ if (
1600
+ !deposit.providerState?.['unbilledProviderSubsidy'] &&
1601
+ result.record.providerState?.['unbilledProviderSubsidy']
1602
+ )
1603
+ options.metrics?.count('routes_deposit_subsidy_count', 1, {
1604
+ outcome: 'provider_subsidy_unbilled',
1605
+ provider: options.address.providerId,
1606
+ })
1492
1607
  }
1493
1608
  if (result.type === 'applied' || result.type === 'unchanged') {
1494
1609
  if (settlement.broadcast && options.subsidies) {
@@ -1514,6 +1629,7 @@ type ReconcileSubsidyOptions = {
1514
1629
  delivered: bigint
1515
1630
  deposit: RoutesDeposits.Record
1516
1631
  providerEvidenceComplete: boolean
1632
+ providerSucceeded: boolean
1517
1633
  required: bigint
1518
1634
  sourceAmount: bigint
1519
1635
  subsidies?: Subsidy.Settler | undefined
@@ -1643,11 +1759,25 @@ async function reconcileSubsidy(
1643
1759
  },
1644
1760
  }
1645
1761
  }
1762
+ // Fixed-rate delivery belongs in the provider fill; never add a second destination transaction.
1763
+ if (options.address.providerState?.['fixedRate'] === '1:1' && options.providerSucceeded)
1764
+ return {
1765
+ ...empty,
1766
+ outcome: 'underfilled',
1767
+ status: 'action-required',
1768
+ statusReason: {
1769
+ code: 'subsidy_failed',
1770
+ message: 'The provider completed without delivering the fixed-rate amount.',
1771
+ },
1772
+ }
1646
1773
  if (!options.providerEvidenceComplete) return { ...empty, status: 'bridging' }
1647
- const policy = await Subsidy.check(db, {
1648
- environment: options.address.environment,
1649
- orgId: options.address.orgId,
1650
- })
1774
+ const commitment = Policy.commitment(options.address.providerState)
1775
+ const policy = commitment
1776
+ ? ({ maxAmount: commitment.maxAmount, type: 'allowed' } as const)
1777
+ : await Subsidy.check(db, {
1778
+ environment: options.address.environment,
1779
+ orgId: options.address.orgId,
1780
+ })
1651
1781
  if (policy.type === 'denied')
1652
1782
  return {
1653
1783
  ...empty,
@@ -1658,9 +1788,21 @@ async function reconcileSubsidy(
1658
1788
  message: Subsidy.denialMessages[policy.reason],
1659
1789
  },
1660
1790
  }
1791
+ const providerExpense =
1792
+ options.deposit.providerSubsidy ??
1793
+ Provider.schema.Subsidy.safeParse(options.deposit.providerState?.['unbilledProviderSubsidy'])
1794
+ .data
1795
+ const providerSubsidyAmount =
1796
+ commitment && providerExpense
1797
+ ? scaleBaseUnits(
1798
+ BigInt(providerExpense.amount.baseUnits),
1799
+ providerExpense.amount.decimals,
1800
+ options.address.snapshot.destinationToken.decimals,
1801
+ )
1802
+ : 0n
1661
1803
  if (
1662
1804
  !Subsidy.supportsGap(policy, {
1663
- amount: deficit,
1805
+ amount: deficit + providerSubsidyAmount,
1664
1806
  destinationToken: options.address.snapshot.destinationToken,
1665
1807
  })
1666
1808
  )
@@ -1684,6 +1826,7 @@ async function reconcileSubsidy(
1684
1826
  },
1685
1827
  }
1686
1828
  if (
1829
+ !commitment &&
1687
1830
  !Subsidy.supports(options.subsidies.policy, {
1688
1831
  amount: options.sourceAmount.toString(),
1689
1832
  destinationToken: options.address.snapshot.destinationToken,
@@ -1741,6 +1884,14 @@ async function reconcileSubsidy(
1741
1884
  }
1742
1885
  }
1743
1886
 
1887
+ function scaleBaseUnits(amount: bigint, fromDecimals: number, toDecimals: number): bigint {
1888
+ if (fromDecimals === toDecimals) return amount
1889
+ if (fromDecimals < toDecimals) return amount * 10n ** BigInt(toDecimals - fromDecimals)
1890
+ // Round upward: a fractional destination base unit still consumes commitment capacity.
1891
+ const divisor = 10n ** BigInt(fromDecimals - toDecimals)
1892
+ return (amount + divisor - 1n) / divisor
1893
+ }
1894
+
1744
1895
  function destinationBaseUnits(amount: bigint, sourceDecimals: number, destinationDecimals: number) {
1745
1896
  if (destinationDecimals >= sourceDecimals)
1746
1897
  return amount * 10n ** BigInt(destinationDecimals - sourceDecimals)
@@ -0,0 +1,232 @@
1
+ import { Hash, Hex } from 'ox'
2
+
3
+ import * as Value from '../Value.js'
4
+ import * as SolanaTransferSubsidy from './SolanaTransferSubsidy.js'
5
+ import * as Transfer from './Transfer.js'
6
+ import type * as TransferSettlement from './TransferSettlement.js'
7
+
8
+ /** Advances a persisted Solana subsidy through signing, broadcast, and finality. */
9
+ export async function settle(options: settle.Options): Promise<TransferSettlement.Result> {
10
+ let current = options.current
11
+ const existing = SolanaTransferSubsidy.readSigned(current.providerState?.['transferSubsidy'])
12
+ const prepared = SolanaTransferSubsidy.readPrepared(
13
+ current.providerState?.['solanaTransferSubsidyPrepared'],
14
+ )
15
+ const terms = {
16
+ account: existing?.account ?? prepared?.account ?? current.subsidyAccount ?? '',
17
+ amount: options.deficit,
18
+ chainId: options.destinationChain.id,
19
+ recipient: current.snapshot.recipient,
20
+ token: current.snapshot.destinationToken.address,
21
+ }
22
+ if (
23
+ (existing && !SolanaTransferSubsidy.matchesTerms(existing, terms)) ||
24
+ (prepared && !SolanaTransferSubsidy.matchesTerms(prepared, terms))
25
+ ) {
26
+ options.recordSubsidy('evidence_conflict')
27
+ return {
28
+ reason: {
29
+ code: 'subsidy_failed',
30
+ message: 'Destination subsidy evidence conflicts with the verified delivery.',
31
+ },
32
+ record: current,
33
+ type: 'action-required',
34
+ }
35
+ }
36
+ const account = existing?.account ?? prepared?.account ?? current.subsidyAccount
37
+ const settler = options.settlers?.find((entry) => entry.account === account)
38
+ if (!settler) {
39
+ options.recordSubsidy('unavailable')
40
+ return {
41
+ reason: {
42
+ code: 'subsidy_failed',
43
+ message: 'Destination subsidy settlement is unavailable.',
44
+ },
45
+ record: current,
46
+ type: 'action-required',
47
+ }
48
+ }
49
+ const commitment = current.subsidyCommitmentAmount
50
+ if (!existing && !prepared && (!commitment || options.deficit > BigInt(commitment.baseUnits))) {
51
+ options.recordSubsidy('routes_subsidy_limit_exceeded')
52
+ return {
53
+ reason: {
54
+ code: 'routes_subsidy_limit_exceeded',
55
+ message: 'The required destination subsidy exceeds its approved commitment.',
56
+ },
57
+ record: current,
58
+ type: 'action-required',
59
+ }
60
+ }
61
+ const recipient = current.snapshot.recipient
62
+ const token = current.snapshot.destinationToken.address
63
+ const subsidyAmount = Value.tokenAmount({
64
+ baseUnits: options.deficit,
65
+ currency: current.snapshot.destinationToken.currency,
66
+ decimals: current.snapshot.destinationToken.decimals,
67
+ })
68
+ let signed = existing
69
+ if (!signed) {
70
+ const result = await Transfer.prepareSolanaSubsidy(options.db, {
71
+ account: settler.account,
72
+ chainId: options.destinationChain.id,
73
+ expiring: (prepared) => settler.expiring({ chain: options.destinationChain, prepared }),
74
+ id: current.id,
75
+ orgId: current.orgId,
76
+ prepare: ({ reservations }) =>
77
+ settler.prepare({
78
+ amount: options.deficit,
79
+ chain: options.destinationChain,
80
+ recipient,
81
+ reservations,
82
+ token,
83
+ }),
84
+ subsidyAmount,
85
+ tokenAddress: token,
86
+ }).catch((cause) => {
87
+ if (cause instanceof SolanaTransferSubsidy.BalanceUnavailableError) return 'balance' as const
88
+ if (cause instanceof Transfer.SubsidySignerBlockedError) return 'blocked' as const
89
+ throw cause
90
+ })
91
+ if (result === 'balance' || result === 'blocked') {
92
+ options.recordSubsidy(result === 'balance' ? 'balance_unavailable' : 'signer_blocked')
93
+ return {
94
+ reason: {
95
+ code: result === 'balance' ? 'subsidy_balance_unavailable' : 'subsidy_failed',
96
+ message:
97
+ result === 'balance'
98
+ ? 'Tempo lacks enough destination token inventory or native gas.'
99
+ : 'Destination subsidy settlement requires operator recovery.',
100
+ },
101
+ record: current,
102
+ type: 'action-required',
103
+ }
104
+ }
105
+ if (result.type === 'not_found' || result.type === 'invalid' || result.type === 'pending')
106
+ return { type: 'pending' }
107
+ current = result.record
108
+ if ('references' in result && result.references && options.dispatchTransferUpdates)
109
+ await options.dispatchTransferUpdates(result.references)
110
+ if (result.type === 'signed' || result.type === 'shared') {
111
+ signed = result.signed
112
+ if (result.type === 'shared') options.recordSubsidy('shared')
113
+ } else {
114
+ options.recordSubsidy('prepared')
115
+ if (await settler.expiring({ chain: options.destinationChain, prepared: result.prepared }))
116
+ return { type: 'pending' }
117
+ // A refreshed blockhash changes the request, so Horcrux must use a new replay key.
118
+ const signature = await settler.sign({
119
+ idempotencyKey: `${current.id}:${Hash.sha256(Hex.fromBytes(Buffer.from(result.prepared.request.transaction, 'base64')))}`,
120
+ prepared: result.prepared,
121
+ })
122
+ if (await settler.expiring({ chain: options.destinationChain, prepared: result.prepared }))
123
+ return { type: 'pending' }
124
+ const persisted = await Transfer.signSolanaSubsidy(options.db, {
125
+ id: current.id,
126
+ signed: signature,
127
+ })
128
+ if (persisted.type === 'not_found' || persisted.type === 'invalid') return { type: 'pending' }
129
+ signed = persisted.signed
130
+ current = persisted.record
131
+ if ('references' in persisted && options.dispatchTransferUpdates)
132
+ await options.dispatchTransferUpdates(persisted.references)
133
+ options.recordSubsidy(persisted.type === 'shared' ? 'shared' : 'signed')
134
+ }
135
+ }
136
+ if (
137
+ typeof current.providerState?.['transferSubsidyOwnerId'] === 'string' &&
138
+ current.providerState['transferSubsidyOwnerId'] !== current.id
139
+ ) {
140
+ const result = await Transfer.syncSharedSolanaSubsidy(options.db, {
141
+ id: current.id,
142
+ orgId: current.orgId,
143
+ signed,
144
+ })
145
+ if (result.type === 'not_found' || result.type === 'pending') return { type: 'pending' }
146
+ if (result.type === 'synchronized') {
147
+ current = result.record
148
+ signed = result.signed
149
+ options.recordSubsidy('shared')
150
+ if (options.dispatchTransferUpdates) await options.dispatchTransferUpdates(result.references)
151
+ }
152
+ }
153
+ const status = await settler.status({
154
+ chain: options.destinationChain,
155
+ recipient,
156
+ signed,
157
+ token,
158
+ })
159
+ if (status === 'expired') {
160
+ const result = await Transfer.recoverExpiredSolanaSubsidy(options.db, {
161
+ id: current.id,
162
+ orgId: current.orgId,
163
+ signed,
164
+ })
165
+ if (result.type === 'recovered') {
166
+ options.recordSubsidy('expired_recovered')
167
+ if (options.dispatchTransferUpdates) await options.dispatchTransferUpdates(result.references)
168
+ }
169
+ return { type: 'pending' }
170
+ }
171
+ if (status === 'ambiguous') {
172
+ options.recordSubsidy('expiry_ambiguous')
173
+ return {
174
+ reason: {
175
+ code: 'manual_recovery_required',
176
+ message: 'The Solana subsidy transaction could not be verified after expiry.',
177
+ },
178
+ record: current,
179
+ type: 'action-required',
180
+ }
181
+ }
182
+ if (status === 'reverted') {
183
+ options.recordSubsidy('reverted')
184
+ return {
185
+ reason: {
186
+ code: 'subsidy_failed',
187
+ message: 'The destination subsidy transaction reverted.',
188
+ },
189
+ record: current,
190
+ state: {
191
+ subsidyAmount: Value.tokenAmount({
192
+ baseUnits: 0n,
193
+ currency: current.snapshot.destinationToken.currency,
194
+ decimals: current.snapshot.destinationToken.decimals,
195
+ }),
196
+ },
197
+ type: 'action-required',
198
+ }
199
+ }
200
+ if (status === 'pending') {
201
+ const rejected = await settler.broadcast({ chain: options.destinationChain, signed }).then(
202
+ () => false,
203
+ (cause: unknown) => {
204
+ if (SolanaTransferSubsidy.isPermanentBroadcastError(cause)) return true
205
+ throw cause
206
+ },
207
+ )
208
+ if (rejected) {
209
+ options.recordSubsidy('broadcast_rejected')
210
+ return {
211
+ reason: {
212
+ code: 'subsidy_failed',
213
+ message: 'The Solana subsidy transaction was rejected.',
214
+ },
215
+ record: current,
216
+ type: 'action-required',
217
+ }
218
+ }
219
+ options.recordSubsidy('broadcast')
220
+ return { type: 'pending' }
221
+ }
222
+ options.recordSubsidy('completed')
223
+ return { amount: options.deficit, hash: signed.hash, record: current, type: 'success' }
224
+ }
225
+
226
+ export declare namespace settle {
227
+ /** Dependencies for one Solana settlement attempt. */
228
+ type Options = TransferSettlement.Options & {
229
+ /** Available Horcrux-managed Solana wallets. */
230
+ settlers?: readonly SolanaTransferSubsidy.Settler[] | undefined
231
+ }
232
+ }