tapimo 0.15.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (734) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +896 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +33 -33
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +454 -1
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +10 -4
  45. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  46. package/dist/admin/apps/verified-tokens.js +24 -4
  47. package/dist/admin/apps/verified-tokens.js.map +1 -1
  48. package/dist/admin/index.d.ts +0 -1
  49. package/dist/admin/index.d.ts.map +1 -1
  50. package/dist/admin/index.js +0 -1
  51. package/dist/admin/index.js.map +1 -1
  52. package/dist/admin/ui.generated.d.ts +1 -1
  53. package/dist/admin/ui.generated.d.ts.map +1 -1
  54. package/dist/admin/ui.generated.js +99 -103
  55. package/dist/admin/ui.generated.js.map +1 -1
  56. package/dist/analytics/Analytics.d.ts.map +1 -1
  57. package/dist/analytics/Analytics.js +65 -1
  58. package/dist/analytics/Analytics.js.map +1 -1
  59. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  60. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  61. package/dist/analytics/tables/requestEvents.js +58 -59
  62. package/dist/analytics/tables/requestEvents.js.map +1 -1
  63. package/dist/apps/data/App.d.ts +2709 -2670
  64. package/dist/apps/data/App.d.ts.map +1 -1
  65. package/dist/apps/data/routes/activities.d.ts +5 -5
  66. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  67. package/dist/apps/data/routes/activities.js +50 -0
  68. package/dist/apps/data/routes/activities.js.map +1 -1
  69. package/dist/apps/data/routes/addresses.d.ts +248 -248
  70. package/dist/apps/data/routes/balances.d.ts +22 -22
  71. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  72. package/dist/apps/data/routes/balances.js +5 -7
  73. package/dist/apps/data/routes/balances.js.map +1 -1
  74. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  75. package/dist/apps/data/routes/earn.d.ts +103 -12
  76. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  77. package/dist/apps/data/routes/earn.js +456 -220
  78. package/dist/apps/data/routes/earn.js.map +1 -1
  79. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  80. package/dist/apps/data/routes/exchanges.js +267 -97
  81. package/dist/apps/data/routes/exchanges.js.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.d.ts +1 -19
  83. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  84. package/dist/apps/data/routes/fee-amm.js +93 -56
  85. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  86. package/dist/apps/data/routes/indexer.d.ts +10 -10
  87. package/dist/apps/data/routes/rpc.d.ts +30 -30
  88. package/dist/apps/data/routes/rpc.js +45 -11
  89. package/dist/apps/data/routes/rpc.js.map +1 -1
  90. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  91. package/dist/apps/data/routes/tokens.js +11 -6
  92. package/dist/apps/data/routes/tokens.js.map +1 -1
  93. package/dist/apps/data/routes/transactions.d.ts +2 -0
  94. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  95. package/dist/apps/data/routes/transactions.js +30 -22
  96. package/dist/apps/data/routes/transactions.js.map +1 -1
  97. package/dist/apps/data/routes/transfers.d.ts +12 -12
  98. package/dist/apps/data/routes/valuation.d.ts +30 -30
  99. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  100. package/dist/apps/data/routes/webhooks.d.ts +1 -1
  101. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  102. package/dist/apps/data/routes/webhooks.js +18 -11
  103. package/dist/apps/data/routes/webhooks.js.map +1 -1
  104. package/dist/apps/data/routes/zones.d.ts +3 -3
  105. package/dist/apps/management/App.d.ts +3043 -2198
  106. package/dist/apps/management/App.d.ts.map +1 -1
  107. package/dist/apps/management/App.js +2 -0
  108. package/dist/apps/management/App.js.map +1 -1
  109. package/dist/apps/management/Billing.d.ts +2 -4
  110. package/dist/apps/management/Billing.d.ts.map +1 -1
  111. package/dist/apps/management/Billing.js +65 -26
  112. package/dist/apps/management/Billing.js.map +1 -1
  113. package/dist/apps/management/routes/api-keys.d.ts +16 -4
  114. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  115. package/dist/apps/management/routes/api-keys.js +70 -11
  116. package/dist/apps/management/routes/api-keys.js.map +1 -1
  117. package/dist/apps/management/routes/billing.d.ts +84 -84
  118. package/dist/apps/management/routes/cli.d.ts +912 -0
  119. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  120. package/dist/apps/management/routes/cli.js +416 -0
  121. package/dist/apps/management/routes/cli.js.map +1 -0
  122. package/dist/apps/management/routes/faucet.d.ts +8 -8
  123. package/dist/apps/management/routes/invitations.d.ts +24 -24
  124. package/dist/apps/management/routes/invite-links.d.ts +66 -66
  125. package/dist/apps/management/routes/members.d.ts +16 -16
  126. package/dist/apps/management/routes/orgs.d.ts +20 -20
  127. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  128. package/dist/apps/management/routes/orgs.js +8 -2
  129. package/dist/apps/management/routes/orgs.js.map +1 -1
  130. package/dist/apps/management/routes/projects.d.ts +76 -76
  131. package/dist/apps/management/routes/usage.d.ts +8 -8
  132. package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
  133. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  134. package/dist/apps/management/routes/verified-token-requests.js +7 -9
  135. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  136. package/dist/apps/management/routes/webhooks.d.ts +119 -119
  137. package/dist/apps/mcp.d.ts.map +1 -1
  138. package/dist/apps/mcp.js +16 -3
  139. package/dist/apps/mcp.js.map +1 -1
  140. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  141. package/dist/apps/mpp/internal/Policy.js +4 -2
  142. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  143. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  144. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  145. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  146. package/dist/apps/relay/App.d.ts +8 -0
  147. package/dist/apps/relay/App.d.ts.map +1 -1
  148. package/dist/apps/relay/App.js +16 -4
  149. package/dist/apps/relay/App.js.map +1 -1
  150. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  151. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  152. package/dist/apps/relay/Sponsorships.js +71 -60
  153. package/dist/apps/relay/Sponsorships.js.map +1 -1
  154. package/dist/apps/routes/Access.d.ts +53 -0
  155. package/dist/apps/routes/Access.d.ts.map +1 -1
  156. package/dist/apps/routes/Access.js +121 -0
  157. package/dist/apps/routes/Access.js.map +1 -1
  158. package/dist/apps/routes/App.d.ts +397 -158
  159. package/dist/apps/routes/App.d.ts.map +1 -1
  160. package/dist/apps/routes/App.js.map +1 -1
  161. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  162. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  164. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  165. package/dist/apps/routes/routes/quotes.d.ts +90 -0
  166. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  167. package/dist/apps/routes/routes/quotes.js +101 -27
  168. package/dist/apps/routes/routes/quotes.js.map +1 -1
  169. package/dist/apps/routes/routes/transfers.d.ts +187 -135
  170. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  171. package/dist/apps/routes/routes/transfers.js +182 -37
  172. package/dist/apps/routes/routes/transfers.js.map +1 -1
  173. package/dist/cli/ApiKeys.d.ts +120 -0
  174. package/dist/cli/ApiKeys.d.ts.map +1 -0
  175. package/dist/cli/ApiKeys.js +138 -0
  176. package/dist/cli/ApiKeys.js.map +1 -0
  177. package/dist/cli/Cli.d.ts +92 -34
  178. package/dist/cli/Cli.d.ts.map +1 -1
  179. package/dist/cli/Cli.js +188 -11
  180. package/dist/cli/Cli.js.map +1 -1
  181. package/dist/cli/Credentials.d.ts +95 -0
  182. package/dist/cli/Credentials.d.ts.map +1 -0
  183. package/dist/cli/Credentials.js +110 -0
  184. package/dist/cli/Credentials.js.map +1 -0
  185. package/dist/cli/Spec.d.ts +59 -0
  186. package/dist/cli/Spec.d.ts.map +1 -0
  187. package/dist/cli/Spec.js +77 -0
  188. package/dist/cli/Spec.js.map +1 -0
  189. package/dist/cli/bin.js +5 -1
  190. package/dist/cli/bin.js.map +1 -1
  191. package/dist/cli/commands/admin.d.ts +5 -5
  192. package/dist/cli/commands/admin.d.ts.map +1 -1
  193. package/dist/cli/commands/auth.d.ts +73 -0
  194. package/dist/cli/commands/auth.d.ts.map +1 -0
  195. package/dist/cli/commands/auth.js +204 -0
  196. package/dist/cli/commands/auth.js.map +1 -0
  197. package/dist/cli/commands/keys.d.ts +17 -0
  198. package/dist/cli/commands/keys.d.ts.map +1 -0
  199. package/dist/cli/commands/keys.js +109 -0
  200. package/dist/cli/commands/keys.js.map +1 -0
  201. package/dist/cloudflare.d.ts +27 -2
  202. package/dist/cloudflare.d.ts.map +1 -1
  203. package/dist/cloudflare.js +144 -17
  204. package/dist/cloudflare.js.map +1 -1
  205. package/dist/db/Db.d.ts +23 -0
  206. package/dist/db/Db.d.ts.map +1 -1
  207. package/dist/db/Db.js +418 -1
  208. package/dist/db/Db.js.map +1 -1
  209. package/dist/db/Schema.d.ts +44 -1
  210. package/dist/db/Schema.d.ts.map +1 -1
  211. package/dist/db/Schema.js +56 -3
  212. package/dist/db/Schema.js.map +1 -1
  213. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  214. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  215. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  216. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  217. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  218. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  219. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  220. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  221. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  222. package/dist/db/tables/authAccounts.js +1 -0
  223. package/dist/db/tables/authAccounts.js.map +1 -1
  224. package/dist/db/tables/earnVaults.d.ts +5 -1
  225. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  226. package/dist/db/tables/earnVaults.js +12 -1
  227. package/dist/db/tables/earnVaults.js.map +1 -1
  228. package/dist/db/tables/organizations.d.ts +4 -2
  229. package/dist/db/tables/organizations.d.ts.map +1 -1
  230. package/dist/db/tables/organizations.js +8 -34
  231. package/dist/db/tables/organizations.js.map +1 -1
  232. package/dist/db/tables/requestUsage.d.ts +5 -1
  233. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  234. package/dist/db/tables/requestUsage.js +10 -2
  235. package/dist/db/tables/requestUsage.js.map +1 -1
  236. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  237. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  238. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  239. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  240. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  241. package/dist/db/tables/rewardRuns.js +4 -0
  242. package/dist/db/tables/rewardRuns.js.map +1 -1
  243. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  244. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  245. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  246. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  247. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  248. package/dist/db/tables/routesDepositAddresses.js +84 -31
  249. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  250. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  251. package/dist/db/tables/routesDeposits.js +31 -21
  252. package/dist/db/tables/routesDeposits.js.map +1 -1
  253. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  254. package/dist/db/tables/routesIdempotency.js +2 -0
  255. package/dist/db/tables/routesIdempotency.js.map +1 -1
  256. package/dist/db/tables/routesPolicies.d.ts +58 -0
  257. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  258. package/dist/db/tables/routesPolicies.js +198 -0
  259. package/dist/db/tables/routesPolicies.js.map +1 -0
  260. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  261. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  262. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  263. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  264. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  265. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  266. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  267. package/dist/db/tables/routesTransfers.d.ts +26 -1
  268. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  269. package/dist/db/tables/routesTransfers.js +36 -6
  270. package/dist/db/tables/routesTransfers.js.map +1 -1
  271. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  272. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  273. package/dist/db/tables/sponsoredTransactions.js +144 -33
  274. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  275. package/dist/db/tables/users.d.ts +2 -0
  276. package/dist/db/tables/users.d.ts.map +1 -1
  277. package/dist/db/tables/users.js +11 -0
  278. package/dist/db/tables/users.js.map +1 -1
  279. package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
  280. package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
  281. package/dist/db/tables/verifiedTokenRequests.js +65 -44
  282. package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
  283. package/dist/handlers/internal/multisig.d.ts +1 -1
  284. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  285. package/dist/handlers/internal/multisig.js +3 -2
  286. package/dist/handlers/internal/multisig.js.map +1 -1
  287. package/dist/handlers/relay.d.ts +2 -0
  288. package/dist/handlers/relay.d.ts.map +1 -1
  289. package/dist/handlers/relay.js +34 -15
  290. package/dist/handlers/relay.js.map +1 -1
  291. package/dist/internal/Auth.d.ts +73 -6
  292. package/dist/internal/Auth.d.ts.map +1 -1
  293. package/dist/internal/Auth.js +212 -85
  294. package/dist/internal/Auth.js.map +1 -1
  295. package/dist/internal/BetterAuth.d.ts +22 -0
  296. package/dist/internal/BetterAuth.d.ts.map +1 -1
  297. package/dist/internal/BetterAuth.js +17 -14
  298. package/dist/internal/BetterAuth.js.map +1 -1
  299. package/dist/internal/Cache.d.ts +5 -0
  300. package/dist/internal/Cache.d.ts.map +1 -1
  301. package/dist/internal/Cache.js +3 -1
  302. package/dist/internal/Cache.js.map +1 -1
  303. package/dist/internal/CliAuth.d.ts +243 -0
  304. package/dist/internal/CliAuth.d.ts.map +1 -0
  305. package/dist/internal/CliAuth.js +249 -0
  306. package/dist/internal/CliAuth.js.map +1 -0
  307. package/dist/internal/EarnSharePrices.d.ts +1 -1
  308. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  309. package/dist/internal/EarnSharePrices.js +7 -3
  310. package/dist/internal/EarnSharePrices.js.map +1 -1
  311. package/dist/internal/EarnVaults.d.ts +47 -0
  312. package/dist/internal/EarnVaults.d.ts.map +1 -1
  313. package/dist/internal/EarnVaults.js +188 -4
  314. package/dist/internal/EarnVaults.js.map +1 -1
  315. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  316. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  317. package/dist/internal/EarnWithdrawals.js +189 -0
  318. package/dist/internal/EarnWithdrawals.js.map +1 -0
  319. package/dist/internal/ExecutionContext.d.ts +21 -0
  320. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  321. package/dist/internal/ExecutionContext.js +16 -0
  322. package/dist/internal/ExecutionContext.js.map +1 -0
  323. package/dist/internal/Log.d.ts +7 -3
  324. package/dist/internal/Log.d.ts.map +1 -1
  325. package/dist/internal/Log.js +163 -130
  326. package/dist/internal/Log.js.map +1 -1
  327. package/dist/internal/MetricSink.d.ts.map +1 -1
  328. package/dist/internal/MetricSink.js +26 -1
  329. package/dist/internal/MetricSink.js.map +1 -1
  330. package/dist/internal/RateLimit.d.ts +67 -0
  331. package/dist/internal/RateLimit.d.ts.map +1 -1
  332. package/dist/internal/RateLimit.js +174 -27
  333. package/dist/internal/RateLimit.js.map +1 -1
  334. package/dist/internal/Store.d.ts +6 -0
  335. package/dist/internal/Store.d.ts.map +1 -1
  336. package/dist/internal/Store.js +4 -5
  337. package/dist/internal/Store.js.map +1 -1
  338. package/dist/internal/Timing.d.ts +6 -0
  339. package/dist/internal/Timing.d.ts.map +1 -1
  340. package/dist/internal/Timing.js +21 -1
  341. package/dist/internal/Timing.js.map +1 -1
  342. package/dist/internal/Tron.d.ts +124 -0
  343. package/dist/internal/Tron.d.ts.map +1 -0
  344. package/dist/internal/Tron.js +202 -0
  345. package/dist/internal/Tron.js.map +1 -0
  346. package/dist/internal/Viem.d.ts +4 -0
  347. package/dist/internal/Viem.d.ts.map +1 -1
  348. package/dist/internal/Viem.js +25 -6
  349. package/dist/internal/Viem.js.map +1 -1
  350. package/dist/internal/rewards/Read.d.ts +2 -2
  351. package/dist/internal/rewards/Read.d.ts.map +1 -1
  352. package/dist/internal/rewards/Read.js +11 -2
  353. package/dist/internal/rewards/Read.js.map +1 -1
  354. package/dist/internal/routes/Action.d.ts +27 -0
  355. package/dist/internal/routes/Action.d.ts.map +1 -1
  356. package/dist/internal/routes/Action.js +49 -1
  357. package/dist/internal/routes/Action.js.map +1 -1
  358. package/dist/internal/routes/Chain.d.ts +2 -0
  359. package/dist/internal/routes/Chain.d.ts.map +1 -1
  360. package/dist/internal/routes/Chain.js +4 -0
  361. package/dist/internal/routes/Chain.js.map +1 -1
  362. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  363. package/dist/internal/routes/DepositAddress.js +5 -0
  364. package/dist/internal/routes/DepositAddress.js.map +1 -1
  365. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  366. package/dist/internal/routes/Evidence.js +6 -2
  367. package/dist/internal/routes/Evidence.js.map +1 -1
  368. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  369. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  370. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  371. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  372. package/dist/internal/routes/Policy.d.ts +161 -0
  373. package/dist/internal/routes/Policy.d.ts.map +1 -0
  374. package/dist/internal/routes/Policy.js +249 -0
  375. package/dist/internal/routes/Policy.js.map +1 -0
  376. package/dist/internal/routes/Provider.d.ts +66 -3
  377. package/dist/internal/routes/Provider.d.ts.map +1 -1
  378. package/dist/internal/routes/Provider.js +106 -27
  379. package/dist/internal/routes/Provider.js.map +1 -1
  380. package/dist/internal/routes/Quota.d.ts +57 -0
  381. package/dist/internal/routes/Quota.d.ts.map +1 -0
  382. package/dist/internal/routes/Quota.js +144 -0
  383. package/dist/internal/routes/Quota.js.map +1 -0
  384. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  385. package/dist/internal/routes/Reconciliation.js +163 -47
  386. package/dist/internal/routes/Reconciliation.js.map +1 -1
  387. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  388. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  389. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  390. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  391. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  392. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  393. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  394. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  395. package/dist/internal/routes/Subsidy.d.ts +2 -2
  396. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  397. package/dist/internal/routes/Subsidy.js +2 -2
  398. package/dist/internal/routes/Subsidy.js.map +1 -1
  399. package/dist/internal/routes/Transfer.d.ts +229 -1
  400. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  401. package/dist/internal/routes/Transfer.js +644 -7
  402. package/dist/internal/routes/Transfer.js.map +1 -1
  403. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  404. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  405. package/dist/internal/routes/TransferReconciliation.js +83 -159
  406. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  407. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  408. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  409. package/dist/internal/routes/TransferSettlement.js +2 -0
  410. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  411. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  412. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  413. package/dist/internal/routes/TransferSubsidy.js +64 -5
  414. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  415. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  416. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  417. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  418. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  419. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  420. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  421. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  422. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  423. package/dist/internal/routes/index.d.ts +3 -0
  424. package/dist/internal/routes/index.d.ts.map +1 -1
  425. package/dist/internal/routes/index.js +3 -0
  426. package/dist/internal/routes/index.js.map +1 -1
  427. package/dist/internal/routes/providers/across.d.ts +3 -0
  428. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  429. package/dist/internal/routes/providers/across.js +11 -0
  430. package/dist/internal/routes/providers/across.js.map +1 -1
  431. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  432. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  434. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  435. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  436. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  438. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  439. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  440. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  441. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  442. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  443. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  444. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  445. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  446. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  447. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  448. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  449. package/dist/internal/routes/providers/propAmm.js +524 -0
  450. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  451. package/dist/internal/routes/providers/relay.d.ts +4 -1
  452. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  453. package/dist/internal/routes/providers/relay.js +353 -42
  454. package/dist/internal/routes/providers/relay.js.map +1 -1
  455. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  456. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  457. package/dist/internal/routes/providers/rhino.js +11 -0
  458. package/dist/internal/routes/providers/rhino.js.map +1 -1
  459. package/dist/internal/routes/providers/squid.d.ts +3 -0
  460. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  461. package/dist/internal/routes/providers/squid.js +19 -0
  462. package/dist/internal/routes/providers/squid.js.map +1 -1
  463. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  464. package/dist/internal/routes/providers/stargate.js +22 -9
  465. package/dist/internal/routes/providers/stargate.js.map +1 -1
  466. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  467. package/dist/internal/routes/providers/symbiosis.js +13 -17
  468. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  469. package/dist/providers/index.d.ts +14 -0
  470. package/dist/providers/index.d.ts.map +1 -1
  471. package/dist/providers/index.js +6 -0
  472. package/dist/providers/index.js.map +1 -1
  473. package/package.json +16 -6
  474. package/src/ApiKey.ts +7 -3
  475. package/src/ApiKeys.test.ts +652 -8
  476. package/src/ApiKeys.ts +191 -11
  477. package/src/App.test.ts +405 -18
  478. package/src/App.ts +51 -15
  479. package/src/Client.test-d.ts +157 -10
  480. package/src/Client.test.ts +4 -4
  481. package/src/Scope.ts +1 -2
  482. package/src/admin/App.ts +11 -5
  483. package/src/admin/apps/api-keys.test.ts +98 -2
  484. package/src/admin/apps/api-keys.ts +21 -12
  485. package/src/admin/apps/earn-vaults.test.ts +76 -7
  486. package/src/admin/apps/earn-vaults.ts +47 -8
  487. package/src/admin/apps/organizations.test.ts +147 -31
  488. package/src/admin/apps/organizations.ts +5 -4
  489. package/src/admin/apps/route-policies.test.ts +220 -0
  490. package/src/admin/apps/route-policies.ts +322 -0
  491. package/src/admin/apps/routes-support.test.ts +107 -2
  492. package/src/admin/apps/routes-support.ts +43 -3
  493. package/src/admin/apps/routes.test.ts +150 -0
  494. package/src/admin/apps/routes.ts +97 -1
  495. package/src/admin/apps/scopes.test.ts +1 -1
  496. package/src/admin/apps/verified-tokens.test.ts +32 -0
  497. package/src/admin/apps/verified-tokens.ts +30 -4
  498. package/src/admin/index.ts +0 -1
  499. package/src/admin/ui/plugin.ts +2 -1
  500. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  501. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  502. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  503. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  504. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  505. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  506. package/src/admin/ui/src/lib/routes.ts +34 -0
  507. package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
  508. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  509. package/src/admin/ui/src/routes/__root.tsx +1 -1
  510. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  511. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  512. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  513. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  514. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  515. package/src/admin/ui/src/routes/organizations.tsx +35 -4
  516. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  517. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  518. package/src/admin/ui/src/routes/routes.tsx +85 -2
  519. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  520. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  521. package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
  522. package/src/admin/ui.generated.ts +99 -104
  523. package/src/analytics/Analytics.test.ts +4 -50
  524. package/src/analytics/Analytics.ts +65 -1
  525. package/src/analytics/tables/requestEvents.test.ts +402 -1
  526. package/src/analytics/tables/requestEvents.ts +62 -93
  527. package/src/apps/data/App.test.ts +26 -0
  528. package/src/apps/data/routes/activities.test.ts +315 -14
  529. package/src/apps/data/routes/activities.ts +60 -0
  530. package/src/apps/data/routes/balances.ts +5 -7
  531. package/src/apps/data/routes/earn.bench.ts +18 -0
  532. package/src/apps/data/routes/earn.local.test.ts +507 -0
  533. package/src/apps/data/routes/earn.test.ts +405 -127
  534. package/src/apps/data/routes/earn.ts +660 -270
  535. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  536. package/src/apps/data/routes/exchanges.test.ts +166 -2
  537. package/src/apps/data/routes/exchanges.ts +308 -101
  538. package/src/apps/data/routes/fee-amm.test.ts +153 -2
  539. package/src/apps/data/routes/fee-amm.ts +132 -62
  540. package/src/apps/data/routes/receipts.test.ts +21 -18
  541. package/src/apps/data/routes/rpc.test.ts +34 -2
  542. package/src/apps/data/routes/rpc.ts +47 -10
  543. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  544. package/src/apps/data/routes/tokens.test.ts +4 -4
  545. package/src/apps/data/routes/tokens.ts +11 -6
  546. package/src/apps/data/routes/transactions.test.ts +29 -0
  547. package/src/apps/data/routes/transactions.ts +33 -22
  548. package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
  549. package/src/apps/data/routes/webhooks.test.ts +18 -3
  550. package/src/apps/data/routes/webhooks.ts +27 -13
  551. package/src/apps/management/App.ts +4 -0
  552. package/src/apps/management/Billing.test.ts +253 -27
  553. package/src/apps/management/Billing.ts +83 -29
  554. package/src/apps/management/routes/api-keys.test.ts +1 -1
  555. package/src/apps/management/routes/api-keys.ts +85 -11
  556. package/src/apps/management/routes/billing.test.ts +68 -4
  557. package/src/apps/management/routes/cli.test.ts +370 -0
  558. package/src/apps/management/routes/cli.ts +533 -0
  559. package/src/apps/management/routes/me.test.ts +14 -4
  560. package/src/apps/management/routes/orgs.test.ts +108 -4
  561. package/src/apps/management/routes/orgs.ts +7 -2
  562. package/src/apps/management/routes/usage.test.ts +2 -2
  563. package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
  564. package/src/apps/management/routes/verified-token-requests.ts +7 -10
  565. package/src/apps/mcp.test.ts +108 -25
  566. package/src/apps/mcp.ts +15 -3
  567. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  568. package/src/apps/mpp/internal/Policy.ts +6 -2
  569. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  570. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  571. package/src/apps/relay/App.test.ts +85 -1
  572. package/src/apps/relay/App.ts +28 -4
  573. package/src/apps/relay/Sponsorships.test.ts +97 -1
  574. package/src/apps/relay/Sponsorships.ts +77 -66
  575. package/src/apps/routes/Access.test.ts +319 -0
  576. package/src/apps/routes/Access.ts +147 -0
  577. package/src/apps/routes/App.ts +10 -0
  578. package/src/apps/routes/routes/chains.test.ts +3 -2
  579. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  580. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  581. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  582. package/src/apps/routes/routes/quotes.test.ts +81 -8
  583. package/src/apps/routes/routes/quotes.ts +109 -27
  584. package/src/apps/routes/routes/transfers.test.ts +252 -15
  585. package/src/apps/routes/routes/transfers.ts +212 -33
  586. package/src/cli/ApiKeys.test.ts +265 -0
  587. package/src/cli/ApiKeys.ts +189 -0
  588. package/src/cli/Cli.test.ts +188 -0
  589. package/src/cli/Cli.ts +280 -12
  590. package/src/cli/Credentials.test.ts +122 -0
  591. package/src/cli/Credentials.ts +144 -0
  592. package/src/cli/Spec.test.ts +133 -0
  593. package/src/cli/Spec.ts +132 -0
  594. package/src/cli/bin.test.ts +49 -0
  595. package/src/cli/bin.ts +5 -1
  596. package/src/cli/commands/auth.test.ts +138 -0
  597. package/src/cli/commands/auth.ts +254 -0
  598. package/src/cli/commands/keys.test.ts +68 -0
  599. package/src/cli/commands/keys.ts +125 -0
  600. package/src/cloudflare.ts +184 -36
  601. package/src/db/Db.test.ts +877 -0
  602. package/src/db/Db.ts +507 -1
  603. package/src/db/Schema.ts +75 -4
  604. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  605. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  606. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  607. package/src/db/tables/authAccounts.test.ts +30 -0
  608. package/src/db/tables/authAccounts.ts +1 -0
  609. package/src/db/tables/earnVaults.test.ts +34 -0
  610. package/src/db/tables/earnVaults.ts +17 -2
  611. package/src/db/tables/organizations.test.ts +148 -84
  612. package/src/db/tables/organizations.ts +11 -43
  613. package/src/db/tables/requestUsage.ts +13 -2
  614. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  615. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  616. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  617. package/src/db/tables/rewardRuns.ts +4 -0
  618. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  619. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  620. package/src/db/tables/routesDepositAddresses.ts +118 -34
  621. package/src/db/tables/routesDeposits.test.ts +133 -0
  622. package/src/db/tables/routesDeposits.ts +47 -26
  623. package/src/db/tables/routesIdempotency.test.ts +80 -0
  624. package/src/db/tables/routesIdempotency.ts +2 -0
  625. package/src/db/tables/routesPolicies.test.ts +143 -0
  626. package/src/db/tables/routesPolicies.ts +251 -0
  627. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  628. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  629. package/src/db/tables/routesTransfers.test.ts +183 -2
  630. package/src/db/tables/routesTransfers.ts +65 -6
  631. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  632. package/src/db/tables/sponsoredTransactions.ts +182 -38
  633. package/src/db/tables/users.test.ts +51 -0
  634. package/src/db/tables/users.ts +12 -0
  635. package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
  636. package/src/db/tables/verifiedTokenRequests.ts +80 -44
  637. package/src/handlers/internal/multisig.store.test.ts +120 -0
  638. package/src/handlers/internal/multisig.test.ts +389 -0
  639. package/src/handlers/internal/multisig.ts +13 -10
  640. package/src/handlers/relay.test.ts +259 -83
  641. package/src/handlers/relay.ts +36 -17
  642. package/src/internal/Auth.test.ts +383 -8
  643. package/src/internal/Auth.ts +272 -99
  644. package/src/internal/BetterAuth.test.ts +58 -22
  645. package/src/internal/BetterAuth.ts +23 -17
  646. package/src/internal/Cache.ts +3 -1
  647. package/src/internal/CliAuth.test.ts +279 -0
  648. package/src/internal/CliAuth.ts +319 -0
  649. package/src/internal/EarnSharePrices.test.ts +25 -0
  650. package/src/internal/EarnSharePrices.ts +9 -2
  651. package/src/internal/EarnVaults.test.ts +67 -0
  652. package/src/internal/EarnVaults.ts +299 -4
  653. package/src/internal/EarnWithdrawals.test.ts +315 -0
  654. package/src/internal/EarnWithdrawals.ts +266 -0
  655. package/src/internal/ExecutionContext.ts +31 -0
  656. package/src/internal/Log.test.ts +210 -0
  657. package/src/internal/Log.ts +180 -142
  658. package/src/internal/MetricSink.test.ts +190 -15
  659. package/src/internal/MetricSink.ts +27 -1
  660. package/src/internal/RateLimit.test.ts +144 -8
  661. package/src/internal/RateLimit.ts +254 -26
  662. package/src/internal/Store.ts +4 -5
  663. package/src/internal/Timing.test.ts +32 -0
  664. package/src/internal/Timing.ts +20 -1
  665. package/src/internal/Tron.test-d.ts +22 -0
  666. package/src/internal/Tron.test.ts +94 -0
  667. package/src/internal/Tron.ts +289 -0
  668. package/src/internal/Viem.rpc.test.ts +76 -0
  669. package/src/internal/Viem.ts +29 -6
  670. package/src/internal/rewards/Read.test.ts +109 -0
  671. package/src/internal/rewards/Read.ts +13 -4
  672. package/src/internal/routes/Action.test.ts +70 -0
  673. package/src/internal/routes/Action.ts +76 -1
  674. package/src/internal/routes/Chain.test.ts +18 -0
  675. package/src/internal/routes/Chain.ts +5 -0
  676. package/src/internal/routes/DepositAddress.ts +5 -0
  677. package/src/internal/routes/Evidence.test.ts +64 -0
  678. package/src/internal/routes/Evidence.ts +11 -3
  679. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  680. package/src/internal/routes/Policy.test.ts +316 -0
  681. package/src/internal/routes/Policy.ts +399 -0
  682. package/src/internal/routes/Provider.test.ts +103 -2
  683. package/src/internal/routes/Provider.ts +149 -27
  684. package/src/internal/routes/Quota.test.ts +149 -0
  685. package/src/internal/routes/Quota.ts +226 -0
  686. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  687. package/src/internal/routes/Reconciliation.test.ts +371 -13
  688. package/src/internal/routes/Reconciliation.ts +193 -42
  689. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  690. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  691. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  692. package/src/internal/routes/SourceObservation.test.ts +221 -0
  693. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  694. package/src/internal/routes/Subsidy.ts +4 -2
  695. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  696. package/src/internal/routes/Transfer.test.ts +130 -1
  697. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  698. package/src/internal/routes/Transfer.ts +866 -8
  699. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  700. package/src/internal/routes/TransferReconciliation.ts +91 -166
  701. package/src/internal/routes/TransferSettlement.ts +48 -0
  702. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  703. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  704. package/src/internal/routes/TransferSubsidy.ts +87 -12
  705. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  706. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  707. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  708. package/src/internal/routes/index.test.ts +3 -0
  709. package/src/internal/routes/index.ts +3 -0
  710. package/src/internal/routes/providers/across.ts +13 -0
  711. package/src/internal/routes/providers/index.test.ts +141 -0
  712. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  713. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  714. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  715. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  716. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  717. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  718. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  719. package/src/internal/routes/providers/propAmm.ts +640 -0
  720. package/src/internal/routes/providers/relay.test.ts +1299 -18
  721. package/src/internal/routes/providers/relay.ts +424 -39
  722. package/src/internal/routes/providers/rhino.ts +14 -1
  723. package/src/internal/routes/providers/squid.ts +21 -0
  724. package/src/internal/routes/providers/stargate.test.ts +105 -1
  725. package/src/internal/routes/providers/stargate.ts +22 -9
  726. package/src/internal/routes/providers/symbiosis.ts +13 -47
  727. package/src/providers/index.test.ts +2 -0
  728. package/src/providers/index.ts +18 -0
  729. package/dist/admin/Access.d.ts +0 -39
  730. package/dist/admin/Access.d.ts.map +0 -1
  731. package/dist/admin/Access.js +0 -73
  732. package/dist/admin/Access.js.map +0 -1
  733. package/src/admin/Access.test.ts +0 -130
  734. package/src/admin/Access.ts +0 -85
@@ -0,0 +1,289 @@
1
+ import { Base58, Hash, Hex } from 'ox'
2
+ import { createClient as core_createClient, custom, fallback } from 'viem'
3
+ import type { Client as core_Client, FallbackTransport } from 'viem'
4
+ import * as z from 'zod/mini'
5
+
6
+ /** Converts a checksummed Tron address into its 20-byte ABI address. */
7
+ export function toEvmAddress(address: string): Hex.Hex {
8
+ if (!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(address)) throw new InvalidAddressError()
9
+ const value = Base58.toHex(address)
10
+ const payload = Hex.slice(value, 0, 21)
11
+ if (
12
+ Hex.size(value) !== 25 ||
13
+ Hex.slice(payload, 0, 1) !== '0x41' ||
14
+ Hex.slice(value, 21) !== Hex.slice(Hash.sha256(Hash.sha256(payload)), 0, 4)
15
+ )
16
+ throw new InvalidAddressError()
17
+ return Hex.slice(payload, 1)
18
+ }
19
+
20
+ /** Encodes a 20-byte ABI address as a checksummed Tron address. */
21
+ export function fromEvmAddress(address: Hex.Hex): string {
22
+ if (!/^0x[0-9a-fA-F]{40}$/.test(address)) throw new InvalidAddressError()
23
+ const payload = Hex.concat('0x41', address)
24
+ return Base58.fromHex(Hex.concat(payload, Hex.slice(Hash.sha256(Hash.sha256(payload)), 0, 4)))
25
+ }
26
+
27
+ /** Validated native Tron response contracts used by funding providers. */
28
+ export namespace schema {
29
+ const bytes = z
30
+ .string()
31
+ .check(z.regex(/^(?:[0-9a-fA-F]{2})*$/), z.describe('Unprefixed hexadecimal bytes.'))
32
+ const hash = z
33
+ .string()
34
+ .check(z.regex(/^[0-9a-fA-F]{64}$/), z.describe('Unprefixed transaction hash.'))
35
+ const address = z
36
+ .string()
37
+ .check(z.regex(/^41[0-9a-fA-F]{40}$/), z.describe('Network-prefixed Tron address.'))
38
+ const integer = z
39
+ .number()
40
+ .check(
41
+ z.int(),
42
+ z.nonnegative(),
43
+ z.maximum(Number.MAX_SAFE_INTEGER),
44
+ z.describe('Nonnegative safe integer.'),
45
+ )
46
+
47
+ /** Constant-call response; TVM execution failures remain distinguishable from successful RPC delivery. */
48
+ export const Call = z
49
+ .object({
50
+ constant_result: z.optional(z.array(bytes)),
51
+ result: z.object({ message: z.optional(z.string()), result: z.boolean() }),
52
+ transaction: z.optional(
53
+ z.object({ ret: z.optional(z.array(z.object({ ret: z.optional(z.string()) }))) }),
54
+ ),
55
+ })
56
+ .check(z.describe('Constant contract simulation response.'))
57
+
58
+ /** Solidified block metadata. */
59
+ export const Block = z
60
+ .object({
61
+ blockID: hash,
62
+ block_header: z.object({ raw_data: z.object({ number: integer, timestamp: integer }) }),
63
+ })
64
+ .check(z.describe('Solidified Tron block.'))
65
+
66
+ /** Solidified transaction receipt with native hexadecimal event fields. */
67
+ export const Receipt = z
68
+ .object({
69
+ blockNumber: integer,
70
+ blockTimeStamp: integer,
71
+ id: hash,
72
+ log: z.optional(
73
+ z.array(
74
+ z.object({
75
+ address: z.string().check(z.regex(/^[0-9a-fA-F]{40}$/)),
76
+ data: bytes,
77
+ topics: z.array(hash),
78
+ }),
79
+ ),
80
+ ),
81
+ receipt: z.object({ result: z.optional(z.string()) }),
82
+ result: z.optional(z.string()),
83
+ })
84
+ .check(z.describe('Solidified Tron execution receipt.'))
85
+
86
+ /** Solidified smart-contract transaction and source call evidence. */
87
+ export const Transaction = z
88
+ .object({
89
+ raw_data: z.object({
90
+ contract: z
91
+ .array(
92
+ z.object({
93
+ parameter: z.object({
94
+ value: z.object({
95
+ call_value: z.optional(integer),
96
+ contract_address: address,
97
+ data: bytes,
98
+ owner_address: address,
99
+ }),
100
+ }),
101
+ type: z.literal('TriggerSmartContract'),
102
+ }),
103
+ )
104
+ .check(z.minLength(1)),
105
+ }),
106
+ ret: z.array(z.object({ contractRet: z.string() })).check(z.minLength(1)),
107
+ txID: hash,
108
+ })
109
+ .check(z.describe('Solidified Tron smart-contract transaction.'))
110
+ }
111
+
112
+ /** Creates a read-only Tron client with bounded endpoint fallback and cancellation. */
113
+ export function createClient(options: createClient.Options): createClient.ReturnType {
114
+ if (!options.urls.length) throw new RequestError('At least one Tron endpoint is required.')
115
+ const client = core_createClient({
116
+ transport: fallback(
117
+ options.urls.map((url) =>
118
+ custom(
119
+ {
120
+ async request(parameters: { method: string; params?: readonly unknown[] }) {
121
+ options.signal?.throwIfAborted()
122
+ if (!/^wallet(?:solidity)?\/[a-z]+$/.test(parameters.method))
123
+ throw new RequestError('Unsupported Tron method.')
124
+ const response = await (options.fetch ?? globalThis.fetch)(
125
+ `${url.replace(/\/$/, '')}/${parameters.method}`,
126
+ {
127
+ body: JSON.stringify(parameters.params?.[0] ?? {}),
128
+ headers: { 'content-type': 'application/json' },
129
+ method: 'POST',
130
+ signal: AbortSignal.any([
131
+ AbortSignal.timeout(10_000),
132
+ ...(options.signal ? [options.signal] : []),
133
+ ]),
134
+ },
135
+ )
136
+ if (!response.ok)
137
+ throw new RequestError(`Tron endpoint returned HTTP ${response.status}.`)
138
+ const value: unknown = await response.json()
139
+ if (!value || typeof value !== 'object' || Array.isArray(value))
140
+ throw new RequestError('Invalid Tron response.')
141
+ if ('Error' in value || 'ErrorCode' in value || 'error' in value)
142
+ throw new RequestError('Tron endpoint rejected the request.')
143
+ return value
144
+ },
145
+ },
146
+ { retryCount: 0 },
147
+ ),
148
+ ),
149
+ { retryCount: 0 },
150
+ ),
151
+ })
152
+ const actions = {
153
+ async call(options: call.Options): Promise<Hex.Hex> {
154
+ toEvmAddress(options.to)
155
+ if (options.from) toEvmAddress(options.from)
156
+ if (!/^0x(?:[0-9a-fA-F]{2})+$/.test(options.data))
157
+ throw new RequestError('Invalid contract calldata.')
158
+ const value = options.value ?? 0n
159
+ if (value < 0n || value > BigInt(Number.MAX_SAFE_INTEGER))
160
+ throw new RequestError('TRX call value exceeds the supported range.')
161
+ const result = schema.Call.parse(
162
+ await client.request({
163
+ method: 'wallet/triggerconstantcontract',
164
+ params: [
165
+ {
166
+ call_value: Number(value),
167
+ contract_address: options.to,
168
+ data: options.data.slice(2),
169
+ owner_address: options.from ?? options.to,
170
+ visible: true,
171
+ },
172
+ ],
173
+ } as never),
174
+ )
175
+ if (
176
+ !result.result.result ||
177
+ result.transaction?.ret?.some(
178
+ (entry) => entry.ret !== undefined && entry.ret !== 'SUCCESS',
179
+ ) ||
180
+ result.constant_result?.length !== 1
181
+ )
182
+ throw new RequestError('Tron constant call failed.')
183
+ return `0x${result.constant_result[0]}`
184
+ },
185
+ async getBlock() {
186
+ return schema.Block.parse(
187
+ await client.request({ method: 'walletsolidity/getnowblock' } as never),
188
+ )
189
+ },
190
+ async getTransaction(options: getTransaction.Options) {
191
+ const result = await client.request({
192
+ method: 'walletsolidity/gettransactionbyid',
193
+ params: [{ value: internal.hash(options.hash) }],
194
+ } as never)
195
+ if (Object.keys(result as object).length === 0) return undefined
196
+ const transaction = schema.Transaction.parse(result)
197
+ if (transaction.txID.toLowerCase() !== internal.hash(options.hash))
198
+ throw new RequestError('Tron transaction hash mismatch.')
199
+ return transaction
200
+ },
201
+ async getTransactionReceipt(options: getTransaction.Options) {
202
+ const result = await client.request({
203
+ method: 'walletsolidity/gettransactioninfobyid',
204
+ params: [{ value: internal.hash(options.hash) }],
205
+ } as never)
206
+ if (Object.keys(result as object).length === 0) return undefined
207
+ const receipt = schema.Receipt.parse(result)
208
+ if (receipt.id.toLowerCase() !== internal.hash(options.hash))
209
+ throw new RequestError('Tron receipt hash mismatch.')
210
+ return receipt
211
+ },
212
+ }
213
+ // viem protects Ethereum action names, so native Tron actions extend a separate namespace.
214
+ const { tron, ...extended } = client.extend(() => ({ tron: actions }))
215
+ return { ...extended, ...tron }
216
+ }
217
+
218
+ export declare namespace createClient {
219
+ /** Read-only Tron actions backed by a viem fallback client. */
220
+ type ReturnType = core_Client<FallbackTransport, undefined, undefined> & {
221
+ /** Simulates an ABI-encoded contract call. */
222
+ call: (options: call.Options) => Promise<Hex.Hex>
223
+ /** Reads the latest solidified block. */
224
+ getBlock: () => Promise<z.output<typeof schema.Block>>
225
+ /** Reads solidified source transaction evidence. */
226
+ getTransaction: (
227
+ options: getTransaction.Options,
228
+ ) => Promise<z.output<typeof schema.Transaction> | undefined>
229
+ /** Reads the solidified execution receipt. */
230
+ getTransactionReceipt: (
231
+ options: getTransaction.Options,
232
+ ) => Promise<z.output<typeof schema.Receipt> | undefined>
233
+ }
234
+
235
+ /** Ordered native HTTP endpoints and request cancellation. */
236
+ type Options = {
237
+ /** Fetch implementation used for requests. */
238
+ fetch?: typeof globalThis.fetch | undefined
239
+ /** Cancellation signal shared by all requests. */
240
+ signal?: AbortSignal | undefined
241
+ /** Ordered Tron native HTTP API endpoint URLs. */
242
+ urls: readonly string[]
243
+ }
244
+ }
245
+
246
+ /** Contract-call parameter types. */
247
+ export declare namespace call {
248
+ /** ABI-encoded constant-call parameters. */
249
+ type Options = {
250
+ /** Full ABI-encoded calldata. */
251
+ data: Hex.Hex
252
+ /** Optional checksummed caller address. */
253
+ from?: string | undefined
254
+ /** Checksummed Tron contract address. */
255
+ to: string
256
+ /** TRX value in sun. */
257
+ value?: bigint | undefined
258
+ }
259
+ }
260
+
261
+ /** Transaction lookup parameter types. */
262
+ export declare namespace getTransaction {
263
+ /** Native Tron transaction identifier. */
264
+ type Options = {
265
+ /** Transaction hash, with or without the hexadecimal prefix. */
266
+ hash: string
267
+ }
268
+ }
269
+
270
+ namespace internal {
271
+ export function hash(value: string) {
272
+ const hash = value.replace(/^0x/, '').toLowerCase()
273
+ if (!/^[0-9a-f]{64}$/.test(hash)) throw new RequestError('Invalid Tron transaction hash.')
274
+ return hash
275
+ }
276
+ }
277
+
278
+ /** Invalid Tron address or Base58Check checksum. */
279
+ export class InvalidAddressError extends Error {
280
+ override name = 'Tron.InvalidAddressError'
281
+ constructor() {
282
+ super('Invalid Tron address.')
283
+ }
284
+ }
285
+
286
+ /** Native Tron endpoint or contract execution failure. */
287
+ export class RequestError extends Error {
288
+ override name = 'Tron.RequestError'
289
+ }
@@ -0,0 +1,76 @@
1
+ import * as http from 'node:http'
2
+ import type * as net from 'node:net'
3
+ import { getChainId } from 'viem/actions'
4
+
5
+ import * as Viem from './Viem.js'
6
+
7
+ describe('createEvmClient', () => {
8
+ test.each([
9
+ { auth: 'rpc-key', authorization: 'Bearer rpc-key' },
10
+ {
11
+ auth: { 4217: 'wrong-key', 42431: 'user:password' },
12
+ authorization: 'Basic dXNlcjpwYXNzd29yZA==',
13
+ },
14
+ ])(
15
+ 'authenticates the configured endpoint with $authorization',
16
+ async ({ auth, authorization }) => {
17
+ const headers: (string | undefined)[] = []
18
+ const server = http.createServer(async (request, response) => {
19
+ headers.push(request.headers.authorization)
20
+ let body = ''
21
+ for await (const chunk of request) body += chunk
22
+ response.setHeader('content-type', 'application/json')
23
+ response.end(JSON.stringify({ id: JSON.parse(body).id, jsonrpc: '2.0', result: '0xa5bf' }))
24
+ })
25
+ await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve))
26
+ try {
27
+ const url = `http://127.0.0.1:${(server.address() as net.AddressInfo).port}`
28
+ const client = Viem.createEvmClient({
29
+ chainId: 42431,
30
+ fetch,
31
+ rpc: { auth, url: { 42431: url } },
32
+ urls: ['http://127.0.0.1:1'],
33
+ })
34
+ expect(await getChainId(client)).toBe(42431)
35
+ expect(headers).toEqual([authorization])
36
+ } finally {
37
+ server.closeAllConnections()
38
+ await new Promise<void>((resolve) => server.close(() => resolve()))
39
+ }
40
+ },
41
+ )
42
+
43
+ test('does not forward credentials to redirects or fallback endpoints', async () => {
44
+ const requests: { authorization: string | undefined; path: string | undefined }[] = []
45
+ const server = http.createServer(async (request, response) => {
46
+ requests.push({ authorization: request.headers.authorization, path: request.url })
47
+ if (request.url === '/primary') {
48
+ response.writeHead(302, { location: '/redirect' })
49
+ response.end()
50
+ return
51
+ }
52
+ let body = ''
53
+ for await (const chunk of request) body += chunk
54
+ response.setHeader('content-type', 'application/json')
55
+ response.end(JSON.stringify({ id: JSON.parse(body).id, jsonrpc: '2.0', result: '0xa5bf' }))
56
+ })
57
+ await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve))
58
+ try {
59
+ const url = `http://127.0.0.1:${(server.address() as net.AddressInfo).port}`
60
+ const client = Viem.createEvmClient({
61
+ chainId: 42431,
62
+ fetch,
63
+ rpc: { auth: 'rpc-key', url: `${url}/primary` },
64
+ urls: [`${url}/fallback`],
65
+ })
66
+ expect(await getChainId(client)).toBe(42431)
67
+ expect(requests).toEqual([
68
+ { authorization: 'Bearer rpc-key', path: '/primary' },
69
+ { authorization: undefined, path: '/fallback' },
70
+ ])
71
+ } finally {
72
+ server.closeAllConnections()
73
+ await new Promise<void>((resolve) => server.close(() => resolve()))
74
+ }
75
+ })
76
+ })
@@ -73,14 +73,33 @@ export type ZoneHeaders = Record<string, string>
73
73
 
74
74
  /** Creates a generic EVM client with ordered RPC endpoint fallback. */
75
75
  export function createEvmClient(options: createEvmClient.Options): createEvmClient.ReturnType {
76
+ const resolved =
77
+ options.rpc && options.chainId !== undefined
78
+ ? resolveRpc(options.rpc, { chainId: options.chainId as ChainId, principal: null })
79
+ : undefined
80
+ const urls = [...new Set([...(resolved?.url ? [resolved.url] : []), ...options.urls])]
76
81
  const fallback_transport = fallback(
77
- options.urls.map((url) =>
78
- http(url, {
82
+ urls.map((url) => {
83
+ const authorization =
84
+ url !== resolved?.url
85
+ ? undefined
86
+ : resolved.basicAuth
87
+ ? `Basic ${btoa(resolved.basicAuth)}`
88
+ : resolved.bearerAuth
89
+ ? `Bearer ${resolved.bearerAuth}`
90
+ : undefined
91
+ return http(url, {
79
92
  fetchFn: options.fetch,
80
- ...(options.signal ? { fetchOptions: { signal: options.signal } } : {}),
93
+ fetchOptions: {
94
+ ...(options.signal ? { signal: options.signal } : {}),
95
+ // Credentials belong only to the configured endpoint, never its redirects or catalog fallbacks.
96
+ ...(authorization
97
+ ? { headers: { Authorization: authorization }, redirect: 'manual' }
98
+ : {}),
99
+ },
81
100
  retryCount: 0,
82
- }),
83
- ),
101
+ })
102
+ }),
84
103
  )
85
104
  const chainId = options.chainId
86
105
  const transport: FallbackTransport = (parameters) => {
@@ -98,16 +117,20 @@ export function createEvmClient(options: createEvmClient.Options): createEvmClie
98
117
  },
99
118
  }
100
119
  }
101
- return core_createClient({ transport })
120
+ return core_createClient({ batch: options.batch, transport })
102
121
  }
103
122
 
104
123
  export declare namespace createEvmClient {
105
124
  /** Generic EVM RPC client configuration. */
106
125
  type Options = {
126
+ /** Contract read batching configuration. */
127
+ batch?: core_Client['batch'] | undefined
107
128
  /** EIP-155 chain id attached to request failures. */
108
129
  chainId?: number | undefined
109
130
  /** Fetch implementation used for RPC requests. */
110
131
  fetch: typeof globalThis.fetch
132
+ /** Trusted RPC configuration resolved using the client chain id. */
133
+ rpc?: getClient.Rpc | undefined
111
134
  /** Optional request cancellation signal. */
112
135
  signal?: AbortSignal | undefined
113
136
  /** Ordered RPC endpoint URLs. */
@@ -4,6 +4,7 @@ import type { Address } from 'viem'
4
4
  import * as TestApp from '../../../test/App.js'
5
5
  import * as RewardAccounts from '../../db/tables/rewardAccounts.js'
6
6
  import * as RewardCampaigns from '../../db/tables/rewardCampaigns.js'
7
+ import * as RewardEligibilityAssociations from '../../db/tables/rewardEligibilityAssociations.js'
7
8
  import * as RewardRuns from '../../db/tables/rewardRuns.js'
8
9
  import * as core_EarnVaults from '../../db/tables/earnVaults.js'
9
10
  import * as Campaigns from './Campaigns.js'
@@ -31,6 +32,114 @@ const config = {
31
32
  } satisfies Campaigns.Config
32
33
 
33
34
  describe('Earn rewards reads', () => {
35
+ test.each([
36
+ { balance: '30000000', baseNet: '0.02', name: 'fresh deposit', qualifiedShares: undefined },
37
+ { balance: '30000000', baseNet: '0.02', name: 'zero qualification', qualifiedShares: '0' },
38
+ { balance: '0', baseNet: '0.02', name: 'zero balance', qualifiedShares: undefined },
39
+ { balance: '30000000', baseNet: '0.08', name: 'base above target', qualifiedShares: undefined },
40
+ ])(
41
+ 'exposes the registered boost target for $name without increasing net APY',
42
+ async (options) => {
43
+ vi.useFakeTimers({ now: (config.boostRewards.startTimestamp + 1) * 1_000, toFake: ['Date'] })
44
+ try {
45
+ const db = TestApp.database()
46
+ await seedCampaign(db)
47
+ await RewardEligibilityAssociations.upsert(db, {
48
+ chainId: 4217,
49
+ vaultAddress,
50
+ walletAddress: recipient,
51
+ })
52
+ if (options.qualifiedShares !== undefined)
53
+ await seedAccount(db, { qualifiedShares: options.qualifiedShares })
54
+ const apy = await Read.positionApy({
55
+ assetDecimals: 6,
56
+ baseNet: options.baseNet,
57
+ chainId: 4217,
58
+ db,
59
+ excludedAddresses: [],
60
+ recipient,
61
+ shareBalance: options.balance,
62
+ value: options.balance,
63
+ vaultAddress,
64
+ })
65
+ expect(apy?.breakdown[0]).toMatchInlineSnapshot(`
66
+ {
67
+ "assetAmount": {
68
+ "baseUnits": "0",
69
+ "decimals": 6,
70
+ "formatted": "0",
71
+ },
72
+ "net": "0.0700",
73
+ "type": "boost",
74
+ }
75
+ `)
76
+ expect(apy?.breakdown).toHaveLength(2)
77
+ expect(apy?.breakdown[1]).toMatchObject({
78
+ assetAmount: { baseUnits: options.balance },
79
+ net: options.baseNet,
80
+ type: 'base',
81
+ })
82
+ expect(apy?.net).toBe(options.baseNet)
83
+ } finally {
84
+ vi.useRealTimers()
85
+ }
86
+ },
87
+ )
88
+
89
+ test.each([
90
+ { enabled: true, excluded: false, name: 'unregistered wallet', offset: 1, registered: false },
91
+ { enabled: false, excluded: false, name: 'disabled campaign', offset: 1, registered: true },
92
+ { enabled: true, excluded: false, name: 'future campaign', offset: -1, registered: true },
93
+ { enabled: true, excluded: false, name: 'ended campaign', offset: 600, registered: true },
94
+ { enabled: true, excluded: true, name: 'excluded wallet', offset: 1, registered: true },
95
+ ])('omits a zero-amount boost for $name', async (options) => {
96
+ vi.useFakeTimers({
97
+ now: (config.boostRewards.startTimestamp + options.offset) * 1_000,
98
+ toFake: ['Date'],
99
+ })
100
+ try {
101
+ const db = TestApp.database()
102
+ await seedCampaign(db, {
103
+ config: { boostRewards: { ...config.boostRewards, enabled: options.enabled } },
104
+ })
105
+ if (options.registered)
106
+ await RewardEligibilityAssociations.upsert(db, {
107
+ chainId: 4217,
108
+ vaultAddress,
109
+ walletAddress: recipient,
110
+ })
111
+ const apy = await Read.positionApy({
112
+ assetDecimals: 6,
113
+ baseNet: '0.02',
114
+ chainId: 4217,
115
+ db,
116
+ excludedAddresses: options.excluded ? [recipient] : [],
117
+ recipient,
118
+ shareBalance: '30000000',
119
+ value: '30000000',
120
+ vaultAddress,
121
+ })
122
+ expect(apy).toMatchInlineSnapshot(`
123
+ {
124
+ "breakdown": [
125
+ {
126
+ "assetAmount": {
127
+ "baseUnits": "30000000",
128
+ "decimals": 6,
129
+ "formatted": "30",
130
+ },
131
+ "net": "0.02",
132
+ "type": "base",
133
+ },
134
+ ],
135
+ "net": "0.02",
136
+ }
137
+ `)
138
+ } finally {
139
+ vi.useRealTimers()
140
+ }
141
+ })
142
+
34
143
  test('calculates wallet APY below, at, and above the qualified cap', async () => {
35
144
  vi.useFakeTimers({ now: (config.boostRewards.startTimestamp + 1) * 1_000, toFake: ['Date'] })
36
145
  try {
@@ -4,6 +4,7 @@ import { Value as core_Value } from 'ox'
4
4
  import * as Db from '../../db/Db.js'
5
5
  import * as RewardAccounts from '../../db/tables/rewardAccounts.js'
6
6
  import * as RewardCampaigns from '../../db/tables/rewardCampaigns.js'
7
+ import * as RewardEligibilityAssociations from '../../db/tables/rewardEligibilityAssociations.js'
7
8
  import * as RewardRuns from '../../db/tables/rewardRuns.js'
8
9
  import * as Campaigns from './Campaigns.js'
9
10
  import type * as Viem from '../Viem.js'
@@ -64,7 +65,7 @@ export type Recipient = {
64
65
 
65
66
  /** Effective APY combining live position amounts with the latest delivered reward qualification. */
66
67
  export type PositionApy = {
67
- /** Position amounts grouped by the annual rate they receive. */
68
+ /** Position amounts by annual rate, including an eligible boost target with zero qualified amount. */
68
69
  breakdown: readonly {
69
70
  /** Position amount in vault asset units. */
70
71
  assetAmount: {
@@ -77,7 +78,7 @@ export type PositionApy = {
77
78
  }
78
79
  /** Annual rate applied to this amount, as a decimal ratio. */
79
80
  net: string
80
- /** Whether this amount receives the base or qualified boost rate. */
81
+ /** Base rate or eligible boost target; zero boost amount does not imply earned rewards. */
81
82
  type: 'base' | 'boost'
82
83
  }[]
83
84
  /** Balance-weighted annual rate for the wallet's position, as a decimal ratio. */
@@ -238,9 +239,16 @@ export async function positionApy(options: positionApy.Options): Promise<Positio
238
239
  if (amounts === undefined || amounts.shareBalance < 0n || amounts.value < 0n) return null
239
240
 
240
241
  const db = Db.get(options.db)
241
- const [account, campaign] = await Promise.all([
242
+ // Registration is a keyed lookup, so it loads with the other rows rather
243
+ // than as a dependent round trip once qualification proves absent.
244
+ const [account, campaign, eligible] = await Promise.all([
242
245
  RewardAccounts.get(db, options),
243
246
  RewardCampaigns.get(db, options),
247
+ RewardEligibilityAssociations.get(db, {
248
+ chainId: options.chainId,
249
+ vaultAddress: getAddress(options.vaultAddress),
250
+ walletAddress: getAddress(options.recipient),
251
+ }),
244
252
  ])
245
253
  // Stored qualification applies only while the campaign is active and the recipient is eligible.
246
254
  const now = Math.floor(Date.now() / 1_000)
@@ -282,7 +290,8 @@ export async function positionApy(options: positionApy.Options): Promise<Positio
282
290
  const baseAmount = value - boostAmount
283
291
  const breakdown: PositionApy['breakdown'][number][] = []
284
292
  const assetDecimals = campaign?.assetDecimals ?? options.assetDecimals
285
- if (boostAmount > 0n && boostRate !== undefined && boostNet !== undefined)
293
+ // Registration exposes the target before qualification arrives, without changing the weighted position rate.
294
+ if ((boostAmount > 0n || eligible) && boostRate !== undefined && boostNet !== undefined)
286
295
  breakdown.push({
287
296
  assetAmount: {
288
297
  baseUnits: boostAmount.toString(),
@@ -1,3 +1,6 @@
1
+ import { AbiFunction } from 'ox'
2
+
3
+ import * as Tron from '../Tron.js'
1
4
  import * as Action from './Action.js'
2
5
 
3
6
  const sourceToken = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'
@@ -225,3 +228,70 @@ describe('validateEvmCalls', () => {
225
228
  ).toThrow(Action.InvalidActionError)
226
229
  })
227
230
  })
231
+
232
+ describe('validateTronCalls', () => {
233
+ const token = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'
234
+ const executor = 'TJRabPrwbZy45sbavfcjinPJC18kjpRTv8'
235
+ const approve = AbiFunction.from('function approve(address spender, uint256 amount)')
236
+ const calls = [
237
+ {
238
+ data: AbiFunction.encodeData(approve, [Tron.toEvmAddress(executor), 1_000_000n]),
239
+ to: token,
240
+ value: '0x0',
241
+ },
242
+ { data: '0x12345678', to: executor, value: '0x64' },
243
+ ]
244
+
245
+ test('accepts bounded approvals and exact SUN fees', () => {
246
+ expect(() =>
247
+ Action.validateTronCalls({
248
+ action: { calls, type: 'tron:calls' },
249
+ nativeValues: [{ to: executor, value: '0x64' }],
250
+ sourceAmount: '1000000',
251
+ sourceTokenAddress: token,
252
+ }),
253
+ ).not.toThrow()
254
+ })
255
+
256
+ test('rejects native fees outside provider allowances', () => {
257
+ expect(() =>
258
+ Action.validateTronCalls({
259
+ action: { calls, type: 'tron:calls' },
260
+ nativeValues: [{ to: executor, value: '0x65' }],
261
+ sourceAmount: '1000000',
262
+ sourceTokenAddress: token,
263
+ }),
264
+ ).toThrowErrorMatchingInlineSnapshot(
265
+ `[Routes.Action.InvalidActionError: Native value must match a validated provider fee.]`,
266
+ )
267
+ })
268
+
269
+ test('rejects approvals above the source amount', () => {
270
+ expect(() =>
271
+ Action.validateTronCalls({
272
+ action: { calls, type: 'tron:calls' },
273
+ nativeValues: [{ to: executor, value: '0x64' }],
274
+ sourceAmount: '999999',
275
+ sourceTokenAddress: token,
276
+ }),
277
+ ).toThrowErrorMatchingInlineSnapshot(
278
+ `[Routes.Action.InvalidActionError: Approval must stay bounded to the route amount.]`,
279
+ )
280
+ })
281
+
282
+ test('rejects a malformed Base58 checksum', () => {
283
+ expect(() =>
284
+ Action.validateTronCalls({
285
+ action: {
286
+ calls: [{ ...calls[0]!, to: `${token.slice(0, -1)}u` }, calls[1]!],
287
+ type: 'tron:calls',
288
+ },
289
+ nativeValues: [{ to: executor, value: '0x64' }],
290
+ sourceAmount: '1000000',
291
+ sourceTokenAddress: token,
292
+ }),
293
+ ).toThrowErrorMatchingInlineSnapshot(
294
+ `[Routes.Action.InvalidActionError: Malformed Tron calls or allowances.]`,
295
+ )
296
+ })
297
+ })