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
@@ -0,0 +1,619 @@
1
+ import { AbiFunction, Address, Hash, Hex, Secp256k1, Signature } from 'ox'
2
+ import * as z from 'zod/mini'
3
+
4
+ import * as Tron from '../Tron.js'
5
+ import type * as Chain from './Chain.js'
6
+
7
+ const balanceOf = AbiFunction.from('function balanceOf(address account) view returns (uint256)')
8
+ const transfer = AbiFunction.from('function transfer(address to, uint256 amount) returns (bool)')
9
+ const transferTopic = Hash.keccak256(Hex.fromString('Transfer(address,address,uint256)')).slice(2)
10
+ const minimumPreparationWindowMs = 30_000
11
+
12
+ namespace schema {
13
+ const address = z.string().check(z.regex(/^41[0-9a-fA-F]{40}$/))
14
+ const bytes = z.string().check(z.regex(/^(?:[0-9a-fA-F]{2})+$/))
15
+ const integer = z.number().check(z.int(), z.nonnegative(), z.maximum(Number.MAX_SAFE_INTEGER))
16
+
17
+ /** Native Tron transaction fields required for exact signing and broadcast. */
18
+ export const UnsignedTransaction = z
19
+ .object({
20
+ raw_data: z.object({
21
+ contract: z
22
+ .array(
23
+ z.object({
24
+ parameter: z.object({
25
+ value: z.object({
26
+ call_value: z.optional(integer),
27
+ contract_address: address,
28
+ data: bytes,
29
+ owner_address: address,
30
+ }),
31
+ }),
32
+ type: z.literal('TriggerSmartContract'),
33
+ }),
34
+ )
35
+ .check(z.minLength(1), z.maxLength(1)),
36
+ expiration: integer,
37
+ fee_limit: integer,
38
+ ref_block_bytes: z.string().check(z.regex(/^[0-9a-fA-F]{4}$/)),
39
+ ref_block_hash: z.string().check(z.regex(/^[0-9a-fA-F]{16}$/)),
40
+ timestamp: integer,
41
+ }),
42
+ raw_data_hex: bytes,
43
+ txID: z.string().check(z.regex(/^[0-9a-fA-F]{64}$/)),
44
+ })
45
+ .check(z.describe('Unsigned Tron smart-contract transaction.'))
46
+ }
47
+
48
+ /** An immutable Tron transaction prepared before requesting a Horcrux signature. */
49
+ export type Prepared = {
50
+ /** Base58Check address of the destination subsidy wallet. */
51
+ account: string
52
+ /** Destination token amount supplied by Tempo. */
53
+ amount: string
54
+ /** Destination chain CAIP-2 identifier. */
55
+ chainId: string
56
+ /** Native TRX fee limit reserved in SUN. */
57
+ nativeAmount: string
58
+ /** Full node's unsigned transaction, retained for exact broadcast. */
59
+ transaction: Record<string, unknown>
60
+ /** Horcrux request body retained unchanged for ambiguous signing retries. */
61
+ request: {
62
+ network: 'tron:mainnet'
63
+ transaction: {
64
+ raw_data: {
65
+ contract: readonly [
66
+ {
67
+ contract_address: string
68
+ data: string
69
+ owner_address: string
70
+ type: 'TriggerSmartContract'
71
+ },
72
+ ]
73
+ expiration: number
74
+ fee_limit: number
75
+ ref_block_bytes: string
76
+ ref_block_hash: string
77
+ timestamp: number
78
+ }
79
+ }
80
+ }
81
+ /** SHA-256 of the exact raw protobuf bytes signed by Horcrux. */
82
+ hash: Hex.Hex
83
+ /** Unprefixed protobuf serialization of the prepared raw transaction. */
84
+ rawDataHex: string
85
+ /** Original Tron expiration in Unix milliseconds. */
86
+ expiresAt: number
87
+ }
88
+
89
+ /** A Horcrux-signed transaction, persisted before broadcast. */
90
+ export type Signed = Prepared & {
91
+ /** Exact 65-byte secp256k1 signature returned by Horcrux. */
92
+ signature: string
93
+ }
94
+
95
+ /** Read-only destination inventory check for a Tron subsidy wallet. */
96
+ export type Inventory = {
97
+ /** Base58Check subsidy wallet address. */
98
+ account: string
99
+ /** Verifies TRC-20 and TRX capacity including outstanding reservations. */
100
+ check: (options: create.CheckOptions) => Promise<{ nativeAmount: string }>
101
+ /** Operational maximum destination subsidy. */
102
+ policy: { maxAmount: string }
103
+ }
104
+
105
+ /** Prepares, signs, broadcasts, and verifies one Tron destination subsidy. */
106
+ export type Settler = Inventory & {
107
+ /** Broadcasts exactly the persisted signed transaction. */
108
+ broadcast: (options: { chain: Chain.Chain; signed: Signed }) => Promise<void>
109
+ /** Constructs an unsigned transaction without contacting Horcrux. */
110
+ prepare: (options: create.PrepareOptions) => Promise<Prepared>
111
+ /** Signs a previously persisted immutable request through Horcrux. */
112
+ sign: (options: { idempotencyKey: string; prepared: Prepared }) => Promise<Signed>
113
+ /** Reads a solidified execution receipt and matching TRC-20 transfer log. */
114
+ status: (options: create.StatusOptions) => Promise<'pending' | 'reverted' | 'success'>
115
+ }
116
+
117
+ /** Validates an unsigned transaction restored from private route state. */
118
+ export function readPrepared(value: unknown): Prepared | undefined {
119
+ if (typeof value === 'string') {
120
+ try {
121
+ value = JSON.parse(value)
122
+ } catch {
123
+ return undefined
124
+ }
125
+ }
126
+ if (!isObject(value)) return undefined
127
+ const request = value['request']
128
+ const transaction = value['transaction']
129
+ const raw =
130
+ isObject(request) && isObject(request['transaction'])
131
+ ? request['transaction']['raw_data']
132
+ : undefined
133
+ const contracts = isObject(raw) ? raw['contract'] : undefined
134
+ const contract = Array.isArray(contracts) ? contracts[0] : undefined
135
+ if (
136
+ typeof value['account'] !== 'string' ||
137
+ typeof value['amount'] !== 'string' ||
138
+ !/^\d+$/.test(value['amount']) ||
139
+ value['chainId'] !== 'tron:0x2b6653dc' ||
140
+ typeof value['nativeAmount'] !== 'string' ||
141
+ !/^[1-9]\d*$/.test(value['nativeAmount']) ||
142
+ !isObject(transaction) ||
143
+ !isObject(request) ||
144
+ request['network'] !== 'tron:mainnet' ||
145
+ !isObject(raw) ||
146
+ !Array.isArray(contracts) ||
147
+ contracts.length !== 1 ||
148
+ !isObject(contract) ||
149
+ contract['type'] !== 'TriggerSmartContract' ||
150
+ typeof contract['owner_address'] !== 'string' ||
151
+ typeof contract['contract_address'] !== 'string' ||
152
+ typeof contract['data'] !== 'string' ||
153
+ !/^41[0-9a-fA-F]{40}$/.test(contract['owner_address']) ||
154
+ !/^41[0-9a-fA-F]{40}$/.test(contract['contract_address']) ||
155
+ !/^(?:[0-9a-fA-F]{2})+$/.test(contract['data']) ||
156
+ typeof raw['ref_block_bytes'] !== 'string' ||
157
+ !/^[0-9a-fA-F]{4}$/.test(raw['ref_block_bytes']) ||
158
+ typeof raw['ref_block_hash'] !== 'string' ||
159
+ !/^[0-9a-fA-F]{16}$/.test(raw['ref_block_hash']) ||
160
+ typeof raw['timestamp'] !== 'number' ||
161
+ !Number.isSafeInteger(raw['timestamp']) ||
162
+ typeof raw['expiration'] !== 'number' ||
163
+ !Number.isSafeInteger(raw['expiration']) ||
164
+ raw['expiration'] <= raw['timestamp'] ||
165
+ value['expiresAt'] !== raw['expiration'] ||
166
+ typeof raw['fee_limit'] !== 'number' ||
167
+ !Number.isSafeInteger(raw['fee_limit']) ||
168
+ String(raw['fee_limit']) !== value['nativeAmount'] ||
169
+ typeof value['rawDataHex'] !== 'string' ||
170
+ !/^(?:[0-9a-fA-F]{2})+$/.test(value['rawDataHex']) ||
171
+ typeof value['hash'] !== 'string' ||
172
+ !/^0x[0-9a-fA-F]{64}$/.test(value['hash']) ||
173
+ transaction['raw_data_hex'] !== value['rawDataHex'] ||
174
+ typeof transaction['txID'] !== 'string' ||
175
+ transaction['txID'].toLowerCase() !== value['hash'].slice(2).toLowerCase()
176
+ )
177
+ return undefined
178
+ try {
179
+ if (
180
+ Tron.toEvmAddress(value['account']).slice(2).toLowerCase() !==
181
+ contract['owner_address'].slice(2).toLowerCase()
182
+ )
183
+ return undefined
184
+ if (Hash.sha256(`0x${value['rawDataHex']}`).toLowerCase() !== value['hash'].toLowerCase())
185
+ return undefined
186
+ const decoded = AbiFunction.decodeData(transfer, `0x${contract['data']}`)
187
+ if (decoded[1] !== BigInt(value['amount'])) return undefined
188
+ } catch {
189
+ return undefined
190
+ }
191
+ return value as Prepared
192
+ }
193
+
194
+ /** Validates a signed Tron transaction restored from private route state. */
195
+ export function readSigned(value: unknown): Signed | undefined {
196
+ const prepared = readPrepared(value)
197
+ if (!prepared || typeof (prepared as Signed).signature !== 'string') return undefined
198
+ const signature = (prepared as Signed).signature
199
+ if (!/^[0-9a-fA-F]{130}$/.test(signature)) return undefined
200
+ try {
201
+ const recovered = Secp256k1.recoverAddress({
202
+ payload: prepared.hash,
203
+ signature: Signature.from(`0x${signature}`),
204
+ })
205
+ if (!Address.isEqual(recovered, Tron.toEvmAddress(prepared.account))) return undefined
206
+ } catch {
207
+ return undefined
208
+ }
209
+ return prepared as Signed
210
+ }
211
+
212
+ /** Checks a persisted Tron transaction against freshly verified transfer terms. */
213
+ export function matchesTerms(prepared: Prepared, options: matchesTerms.Options): boolean {
214
+ if (
215
+ !readPrepared(prepared) ||
216
+ prepared.chainId !== options.chainId ||
217
+ prepared.account !== options.account ||
218
+ prepared.amount !== options.amount.toString()
219
+ )
220
+ return false
221
+ try {
222
+ const contract = prepared.request.transaction.raw_data.contract[0]
223
+ return (
224
+ contract.owner_address.toLowerCase() ===
225
+ `41${Tron.toEvmAddress(options.account).slice(2)}`.toLowerCase() &&
226
+ contract.contract_address.toLowerCase() ===
227
+ `41${Tron.toEvmAddress(options.token).slice(2)}`.toLowerCase() &&
228
+ contract.data.toLowerCase() ===
229
+ AbiFunction.encodeData(transfer, [Tron.toEvmAddress(options.recipient), options.amount])
230
+ .slice(2)
231
+ .toLowerCase()
232
+ )
233
+ } catch {
234
+ return false
235
+ }
236
+ }
237
+
238
+ export declare namespace matchesTerms {
239
+ /** Exact destination subsidy terms verified independently of the persisted request. */
240
+ type Options = {
241
+ /** Base58Check Tron subsidy wallet. */
242
+ account: string
243
+ /** Destination amount in token base units. */
244
+ amount: bigint
245
+ /** Destination chain CAIP-2 identifier. */
246
+ chainId: string
247
+ /** Base58Check recipient. */
248
+ recipient: string
249
+ /** Base58Check TRC-20 contract. */
250
+ token: string
251
+ }
252
+ }
253
+
254
+ /** Creates a Tron inventory checker and transaction signer for one Horcrux wallet. */
255
+ export function create(options: create.Options): Settler {
256
+ if (!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(options.account))
257
+ throw new ConfigurationError('Invalid Tron subsidy account.')
258
+ Tron.toEvmAddress(options.account)
259
+ if (!/^[0-9a-fA-F-]{36}$/.test(options.walletId))
260
+ throw new ConfigurationError('Invalid Horcrux wallet ID.')
261
+ if (!Number.isSafeInteger(options.feeLimitSun) || options.feeLimitSun <= 0)
262
+ throw new ConfigurationError('Invalid Tron fee limit.')
263
+ const horcruxUrl = new URL(options.horcrux.url)
264
+ if (
265
+ !['https:', 'http:'].includes(horcruxUrl.protocol) ||
266
+ (horcruxUrl.protocol === 'http:' &&
267
+ !['localhost', '127.0.0.1', '[::1]'].includes(horcruxUrl.hostname)) ||
268
+ horcruxUrl.username ||
269
+ horcruxUrl.password ||
270
+ horcruxUrl.search ||
271
+ horcruxUrl.hash
272
+ )
273
+ throw new ConfigurationError('Horcrux requires HTTPS or loopback HTTP.')
274
+ if (
275
+ options.horcrux.auth.type === 'none' &&
276
+ !['localhost', '127.0.0.1', '[::1]'].includes(horcruxUrl.hostname)
277
+ )
278
+ throw new ConfigurationError('Unauthenticated Horcrux requires loopback.')
279
+
280
+ async function check(parameters: create.CheckOptions) {
281
+ assertChain(parameters.chain)
282
+ Tron.toEvmAddress(parameters.recipient)
283
+ Tron.toEvmAddress(parameters.token)
284
+ const client = Tron.createClient({ fetch: options.fetch, urls: parameters.chain.rpcUrls })
285
+ const balance = AbiFunction.decodeResult(
286
+ balanceOf,
287
+ await client.call({
288
+ data: AbiFunction.encodeData(balanceOf, [Tron.toEvmAddress(options.account)]),
289
+ to: parameters.token,
290
+ }),
291
+ )
292
+ if (balance < parameters.amount + parameters.reservations.tokenAmount)
293
+ throw new BalanceUnavailableError()
294
+ const account = await post(parameters.chain, 'wallet/getaccount', {
295
+ address: `41${Tron.toEvmAddress(options.account).slice(2)}`,
296
+ visible: false,
297
+ })
298
+ const nativeBalance = account['balance'] ?? 0
299
+ if (
300
+ typeof nativeBalance !== 'number' ||
301
+ !Number.isSafeInteger(nativeBalance) ||
302
+ nativeBalance < 0
303
+ )
304
+ throw new UpstreamError('Invalid Tron account balance.')
305
+ if (BigInt(nativeBalance) < BigInt(options.feeLimitSun) + parameters.reservations.nativeAmount)
306
+ throw new BalanceUnavailableError()
307
+ return { nativeAmount: String(options.feeLimitSun) }
308
+ }
309
+
310
+ async function prepare(parameters: create.PrepareOptions): Promise<Prepared> {
311
+ await check(parameters)
312
+ const data = AbiFunction.encodeData(transfer, [
313
+ Tron.toEvmAddress(parameters.recipient),
314
+ parameters.amount,
315
+ ]).slice(2)
316
+ const account = `41${Tron.toEvmAddress(options.account).slice(2)}`
317
+ const token = `41${Tron.toEvmAddress(parameters.token).slice(2)}`
318
+ const result = await post(parameters.chain, 'wallet/triggersmartcontract', {
319
+ contract_address: token,
320
+ data,
321
+ fee_limit: options.feeLimitSun,
322
+ owner_address: account,
323
+ visible: false,
324
+ })
325
+ const transaction = result['transaction']
326
+ if (
327
+ !isObject(result['result']) ||
328
+ result['result']['result'] !== true ||
329
+ !isObject(transaction)
330
+ )
331
+ throw new UpstreamError('Tron refused subsidy transaction construction.')
332
+ // Validate a parsed copy while retaining the node's original transaction for broadcast.
333
+ const parsed = schema.UnsignedTransaction.safeParse(transaction)
334
+ if (!parsed.success) throw new UpstreamError('Malformed unsigned Tron subsidy transaction.')
335
+ const { raw_data: raw, raw_data_hex: rawDataHex, txID: txId } = parsed.data
336
+ const value = raw.contract[0]!.parameter.value
337
+ if (
338
+ raw.fee_limit !== options.feeLimitSun ||
339
+ raw.timestamp <= 0 ||
340
+ // Signing is a separate durable step, so refuse node transactions nearly at expiry.
341
+ raw.expiration <= Date.now() + minimumPreparationWindowMs ||
342
+ raw.expiration <= raw.timestamp
343
+ )
344
+ throw new UpstreamError('Malformed unsigned Tron subsidy transaction.')
345
+ if (
346
+ value.owner_address.toLowerCase() !== account.toLowerCase() ||
347
+ value.contract_address.toLowerCase() !== token.toLowerCase() ||
348
+ value.data.toLowerCase() !== data.toLowerCase() ||
349
+ (value.call_value !== undefined && value.call_value !== 0)
350
+ )
351
+ throw new UpstreamError('Tron changed the subsidy transaction terms.')
352
+ const hash = Hash.sha256(`0x${rawDataHex}`)
353
+ if (hash.slice(2).toLowerCase() !== txId.toLowerCase())
354
+ throw new UpstreamError('Tron transaction hash does not match its raw bytes.')
355
+ return {
356
+ account: options.account,
357
+ amount: parameters.amount.toString(),
358
+ chainId: parameters.chain.id,
359
+ expiresAt: raw.expiration,
360
+ hash,
361
+ nativeAmount: String(options.feeLimitSun),
362
+ rawDataHex,
363
+ request: {
364
+ network: 'tron:mainnet',
365
+ transaction: {
366
+ raw_data: {
367
+ contract: [
368
+ {
369
+ contract_address: token,
370
+ data,
371
+ owner_address: account,
372
+ type: 'TriggerSmartContract',
373
+ },
374
+ ],
375
+ expiration: raw.expiration,
376
+ fee_limit: options.feeLimitSun,
377
+ ref_block_bytes: raw.ref_block_bytes,
378
+ ref_block_hash: raw.ref_block_hash,
379
+ timestamp: raw.timestamp,
380
+ },
381
+ },
382
+ },
383
+ transaction,
384
+ }
385
+ }
386
+
387
+ async function sign(parameters: { idempotencyKey: string; prepared: Prepared }): Promise<Signed> {
388
+ const { idempotencyKey, prepared } = parameters
389
+ if (!/^[\x21-\x7e]{1,256}$/.test(idempotencyKey))
390
+ throw new ConfigurationError('Invalid Horcrux idempotency key.')
391
+ if (prepared.account !== options.account || prepared.chainId !== 'tron:0x2b6653dc')
392
+ throw new ConfigurationError('Tron subsidy signer does not match the prepared transaction.')
393
+ const headers: Record<string, string> = {
394
+ 'content-type': 'application/json',
395
+ 'Idempotency-Key': idempotencyKey,
396
+ }
397
+ if (options.horcrux.auth.type === 'cloudflare-access') {
398
+ headers['CF-Access-Client-Id'] = options.horcrux.auth.clientId
399
+ headers['CF-Access-Client-Secret'] = options.horcrux.auth.clientSecret
400
+ }
401
+ const response = await options.fetch(
402
+ new URL(`/v1/wallets/${options.walletId}/sign`, horcruxUrl),
403
+ {
404
+ body: JSON.stringify(prepared.request),
405
+ headers,
406
+ method: 'POST',
407
+ redirect: 'manual',
408
+ signal: AbortSignal.timeout(10_000),
409
+ },
410
+ )
411
+ if (!response.ok) throw new SigningError(`Horcrux signing returned HTTP ${response.status}.`)
412
+ const result: unknown = await response.json()
413
+ if (!isObject(result) || typeof result['signed_transaction'] !== 'string')
414
+ throw new SigningError('Horcrux returned an invalid signing response.')
415
+ const bytes = result['signed_transaction']
416
+ if (
417
+ !/^(?:[0-9a-fA-F]{2})+$/.test(bytes) ||
418
+ bytes.length !== prepared.rawDataHex.length + 130 ||
419
+ bytes.slice(0, prepared.rawDataHex.length).toLowerCase() !== prepared.rawDataHex.toLowerCase()
420
+ )
421
+ throw new SigningError('Horcrux changed the signed Tron transaction.')
422
+ const signature = bytes.slice(-130)
423
+ const recovered = Secp256k1.recoverAddress({
424
+ payload: prepared.hash,
425
+ signature: Signature.from(`0x${signature}`),
426
+ })
427
+ if (!Address.isEqual(recovered, Tron.toEvmAddress(options.account)))
428
+ throw new SigningError('Horcrux signature does not belong to the subsidy wallet.')
429
+ return { ...prepared, signature }
430
+ }
431
+
432
+ async function broadcast(parameters: { chain: Chain.Chain; signed: Signed }): Promise<void> {
433
+ assertChain(parameters.chain)
434
+ const { signed } = parameters
435
+ const result = await post(parameters.chain, 'wallet/broadcasttransaction', {
436
+ ...signed.transaction,
437
+ signature: [signed.signature],
438
+ })
439
+ const code =
440
+ result['code'] ?? (isObject(result['result']) ? result['result']['code'] : undefined)
441
+ // A duplicate response means this exact signed txID was already submitted.
442
+ if (code === 'DUP_TRANSACTION_ERROR') return
443
+ if (
444
+ result['result'] !== true ||
445
+ (typeof result['txid'] === 'string' &&
446
+ result['txid'].toLowerCase() !== signed.hash.slice(2).toLowerCase())
447
+ )
448
+ throw new BroadcastError(
449
+ 'Tron rejected the subsidy transaction.',
450
+ typeof code === 'string' ? code : undefined,
451
+ )
452
+ }
453
+
454
+ async function status(
455
+ parameters: create.StatusOptions,
456
+ ): Promise<'pending' | 'reverted' | 'success'> {
457
+ assertChain(parameters.chain)
458
+ const client = Tron.createClient({ fetch: options.fetch, urls: parameters.chain.rpcUrls })
459
+ const receipt = await client.getTransactionReceipt({ hash: parameters.signed.hash })
460
+ if (!receipt) return 'pending'
461
+ const transaction = await client.getTransaction({ hash: parameters.signed.hash })
462
+ if (!transaction) return 'pending'
463
+ const call = transaction.raw_data.contract[0]?.parameter.value
464
+ const expectedData = AbiFunction.encodeData(transfer, [
465
+ Tron.toEvmAddress(parameters.recipient),
466
+ BigInt(parameters.signed.amount),
467
+ ]).slice(2)
468
+ if (
469
+ !call ||
470
+ call.owner_address.toLowerCase() !==
471
+ `41${Tron.toEvmAddress(parameters.signed.account).slice(2)}`.toLowerCase() ||
472
+ call.contract_address.toLowerCase() !==
473
+ `41${Tron.toEvmAddress(parameters.token).slice(2)}`.toLowerCase() ||
474
+ call.data.toLowerCase() !== expectedData.toLowerCase() ||
475
+ (call.call_value ?? 0) !== 0
476
+ )
477
+ return 'reverted'
478
+ if (
479
+ receipt.receipt.result !== 'SUCCESS' ||
480
+ receipt.result === 'FAILED' ||
481
+ transaction.ret.some(({ contractRet }) => contractRet !== 'SUCCESS')
482
+ )
483
+ return 'reverted'
484
+ const sender = Tron.toEvmAddress(parameters.signed.account).slice(2).toLowerCase()
485
+ const recipient = Tron.toEvmAddress(parameters.recipient).slice(2).toLowerCase()
486
+ const token = Tron.toEvmAddress(parameters.token).slice(2).toLowerCase()
487
+ const matched = receipt.log?.some(
488
+ (log) =>
489
+ log.address.toLowerCase() === token &&
490
+ log.topics.length === 3 &&
491
+ log.topics[0]?.toLowerCase() === transferTopic.toLowerCase() &&
492
+ log.topics[1]?.slice(24).toLowerCase() === sender &&
493
+ log.topics[2]?.slice(24).toLowerCase() === recipient &&
494
+ /^[0-9a-fA-F]{64}$/.test(log.data) &&
495
+ BigInt(`0x${log.data}`) === BigInt(parameters.signed.amount),
496
+ )
497
+ return matched ? 'success' : 'reverted'
498
+ }
499
+
500
+ async function post(
501
+ chain: Chain.Chain,
502
+ method: string,
503
+ body: object,
504
+ ): Promise<Record<string, unknown>> {
505
+ assertChain(chain)
506
+ for (const url of chain.rpcUrls) {
507
+ try {
508
+ const response = await options.fetch(`${url.replace(/\/$/, '')}/${method}`, {
509
+ body: JSON.stringify(body),
510
+ headers: { 'content-type': 'application/json' },
511
+ method: 'POST',
512
+ signal: AbortSignal.timeout(10_000),
513
+ })
514
+ if (!response.ok) continue
515
+ const result: unknown = await response.json()
516
+ if (isObject(result)) return result
517
+ } catch {
518
+ // Try the next configured Tron endpoint.
519
+ }
520
+ }
521
+ throw new UpstreamError('Tron RPC is unavailable.')
522
+ }
523
+
524
+ return {
525
+ account: options.account,
526
+ broadcast,
527
+ check,
528
+ policy: options.policy,
529
+ prepare,
530
+ sign,
531
+ status,
532
+ }
533
+ }
534
+
535
+ export declare namespace create {
536
+ /** Horcrux and native Tron RPC dependencies. */
537
+ type Options = {
538
+ /** Base58Check subsidy wallet address. */
539
+ account: string
540
+ /** Maximum native fee reserved per transaction, in SUN. */
541
+ feeLimitSun: number
542
+ /** Fetch implementation for Horcrux and chain RPC. */
543
+ fetch: typeof globalThis.fetch
544
+ /** Horcrux connection and authentication. */
545
+ horcrux: {
546
+ auth: { type: 'none' } | { clientId: string; clientSecret: string; type: 'cloudflare-access' }
547
+ url: string
548
+ }
549
+ /** Horcrux Tron wallet UUID. */
550
+ walletId: string
551
+ /** Operational maximum destination subsidy. */
552
+ policy: { maxAmount: string }
553
+ }
554
+
555
+ /** Creation-time inventory request. */
556
+ type CheckOptions = {
557
+ amount: bigint
558
+ chain: Chain.Chain
559
+ recipient: string
560
+ reservations: { nativeAmount: bigint; tokenAmount: bigint }
561
+ token: string
562
+ }
563
+
564
+ /** Unsigned transaction preparation request. */
565
+ type PrepareOptions = CheckOptions
566
+
567
+ /** Solidified receipt query and expected destination transfer. */
568
+ type StatusOptions = { chain: Chain.Chain; recipient: string; signed: Signed; token: string }
569
+ }
570
+
571
+ function assertChain(chain: Chain.Chain) {
572
+ if (chain.id !== 'tron:0x2b6653dc' || chain.kind !== 'tron' || chain.rpcUrls.length === 0)
573
+ throw new ConfigurationError('Unsupported Tron subsidy chain.')
574
+ }
575
+
576
+ function isObject(value: unknown): value is Record<string, unknown> {
577
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
578
+ }
579
+
580
+ /** The Tron subsidy wallet lacks token inventory or native TRX. */
581
+ export class BalanceUnavailableError extends Error {
582
+ override name = 'Routes.TronTransferSubsidy.BalanceUnavailableError'
583
+ }
584
+
585
+ /** The Tron subsidy signer or chain configuration is invalid. */
586
+ export class ConfigurationError extends Error {
587
+ override name = 'Routes.TronTransferSubsidy.ConfigurationError'
588
+ }
589
+
590
+ /** Horcrux could not provide a verified Tron signature. */
591
+ export class SigningError extends Error {
592
+ override name = 'Routes.TronTransferSubsidy.SigningError'
593
+ }
594
+
595
+ /** Tron reported a rejected broadcast. */
596
+ export class BroadcastError extends Error {
597
+ override name = 'Routes.TronTransferSubsidy.BroadcastError'
598
+
599
+ /** Native Tron broadcast rejection code, when supplied by the node. */
600
+ code: string | undefined
601
+
602
+ constructor(message: string, code?: string) {
603
+ super(message)
604
+ this.code = code
605
+ }
606
+ }
607
+
608
+ /** Returns whether the signed transaction has a deterministic validation failure. */
609
+ export function isPermanentBroadcastError(cause: unknown): boolean {
610
+ return (
611
+ cause instanceof BroadcastError &&
612
+ ['SIGERROR', 'CONTRACT_VALIDATE_ERROR', 'TOO_BIG_TRANSACTION_ERROR'].includes(cause.code ?? '')
613
+ )
614
+ }
615
+
616
+ /** Tron RPC failed or returned incompatible transaction data. */
617
+ export class UpstreamError extends Error {
618
+ override name = 'Routes.TronTransferSubsidy.UpstreamError'
619
+ }
@@ -12,14 +12,17 @@ test('exports routes modules', () => {
12
12
  "Evidence",
13
13
  "Observability",
14
14
  "Provider",
15
+ "Quota",
15
16
  "Reconciliation",
16
17
  "Route",
18
+ "SolanaTransferSubsidy",
17
19
  "SourceObservation",
18
20
  "Subsidy",
19
21
  "Token",
20
22
  "Transfer",
21
23
  "TransferReconciliation",
22
24
  "TransferSubsidy",
25
+ "TronTransferSubsidy",
23
26
  ]
24
27
  `)
25
28
  })
@@ -7,11 +7,14 @@ export * as DepositWebhook from './DepositWebhook.js'
7
7
  export * as Evidence from './Evidence.js'
8
8
  export * as Observability from './Observability.js'
9
9
  export * as Provider from './Provider.js'
10
+ export * as Quota from './Quota.js'
10
11
  export * as Reconciliation from './Reconciliation.js'
11
12
  export * as Route from './Route.js'
13
+ export * as SolanaTransferSubsidy from './SolanaTransferSubsidy.js'
12
14
  export * as SourceObservation from './SourceObservation.js'
13
15
  export * as Subsidy from './Subsidy.js'
14
16
  export * as Token from './Token.js'
15
17
  export * as Transfer from './Transfer.js'
16
18
  export * as TransferReconciliation from './TransferReconciliation.js'
17
19
  export * as TransferSubsidy from './TransferSubsidy.js'
20
+ export * as TronTransferSubsidy from './TronTransferSubsidy.js'