tapimo 0.15.1 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +893 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +70 -70
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +529 -76
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +157 -157
  45. package/dist/admin/index.d.ts +0 -1
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +0 -1
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/ui.generated.d.ts +1 -1
  50. package/dist/admin/ui.generated.d.ts.map +1 -1
  51. package/dist/admin/ui.generated.js +205 -201
  52. package/dist/admin/ui.generated.js.map +1 -1
  53. package/dist/analytics/Analytics.d.ts.map +1 -1
  54. package/dist/analytics/Analytics.js +65 -1
  55. package/dist/analytics/Analytics.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  57. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  58. package/dist/analytics/tables/requestEvents.js +58 -59
  59. package/dist/analytics/tables/requestEvents.js.map +1 -1
  60. package/dist/apps/data/App.d.ts +2709 -2670
  61. package/dist/apps/data/App.d.ts.map +1 -1
  62. package/dist/apps/data/routes/activities.d.ts +357 -357
  63. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  64. package/dist/apps/data/routes/activities.js +50 -0
  65. package/dist/apps/data/routes/activities.js.map +1 -1
  66. package/dist/apps/data/routes/addresses.d.ts +248 -248
  67. package/dist/apps/data/routes/balances.d.ts +22 -22
  68. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  69. package/dist/apps/data/routes/balances.js +5 -7
  70. package/dist/apps/data/routes/balances.js.map +1 -1
  71. package/dist/apps/data/routes/blocks.d.ts +125 -125
  72. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  73. package/dist/apps/data/routes/earn.d.ts +103 -12
  74. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  75. package/dist/apps/data/routes/earn.js +456 -220
  76. package/dist/apps/data/routes/earn.js.map +1 -1
  77. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  78. package/dist/apps/data/routes/exchanges.js +267 -97
  79. package/dist/apps/data/routes/exchanges.js.map +1 -1
  80. package/dist/apps/data/routes/fee-amm.d.ts +109 -127
  81. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.js +83 -54
  83. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +43 -43
  85. package/dist/apps/data/routes/receipts.d.ts +235 -235
  86. package/dist/apps/data/routes/rpc.d.ts +30 -30
  87. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  88. package/dist/apps/data/routes/tokens.js +11 -6
  89. package/dist/apps/data/routes/tokens.js.map +1 -1
  90. package/dist/apps/data/routes/transactions.d.ts +2 -0
  91. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  92. package/dist/apps/data/routes/transactions.js +30 -22
  93. package/dist/apps/data/routes/transactions.js.map +1 -1
  94. package/dist/apps/data/routes/transfers.d.ts +77 -77
  95. package/dist/apps/data/routes/valuation.d.ts +32 -32
  96. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  97. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  98. package/dist/apps/data/routes/webhooks.js +1 -1
  99. package/dist/apps/data/routes/webhooks.js.map +1 -1
  100. package/dist/apps/data/routes/zones.d.ts +31 -31
  101. package/dist/apps/management/App.d.ts +2909 -2064
  102. package/dist/apps/management/App.d.ts.map +1 -1
  103. package/dist/apps/management/App.js +2 -0
  104. package/dist/apps/management/App.js.map +1 -1
  105. package/dist/apps/management/Billing.d.ts +2 -4
  106. package/dist/apps/management/Billing.d.ts.map +1 -1
  107. package/dist/apps/management/Billing.js +65 -26
  108. package/dist/apps/management/Billing.js.map +1 -1
  109. package/dist/apps/management/routes/api-keys.d.ts +257 -245
  110. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  111. package/dist/apps/management/routes/api-keys.js +70 -11
  112. package/dist/apps/management/routes/api-keys.js.map +1 -1
  113. package/dist/apps/management/routes/billing.d.ts +84 -84
  114. package/dist/apps/management/routes/cli.d.ts +912 -0
  115. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  116. package/dist/apps/management/routes/cli.js +416 -0
  117. package/dist/apps/management/routes/cli.js.map +1 -0
  118. package/dist/apps/management/routes/faucet.d.ts +8 -8
  119. package/dist/apps/management/routes/invitations.d.ts +138 -138
  120. package/dist/apps/management/routes/invite-links.d.ts +172 -172
  121. package/dist/apps/management/routes/members.d.ts +16 -16
  122. package/dist/apps/management/routes/orgs.d.ts +104 -104
  123. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  124. package/dist/apps/management/routes/orgs.js +8 -2
  125. package/dist/apps/management/routes/orgs.js.map +1 -1
  126. package/dist/apps/management/routes/projects.d.ts +125 -125
  127. package/dist/apps/management/routes/usage.d.ts +8 -8
  128. package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
  129. package/dist/apps/management/routes/webhooks.d.ts +485 -485
  130. package/dist/apps/mpp/App.d.ts +44 -44
  131. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  132. package/dist/apps/mpp/internal/Policy.js +4 -2
  133. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  134. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  135. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  136. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  137. package/dist/apps/relay/App.d.ts +8 -0
  138. package/dist/apps/relay/App.d.ts.map +1 -1
  139. package/dist/apps/relay/App.js +16 -4
  140. package/dist/apps/relay/App.js.map +1 -1
  141. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  142. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  143. package/dist/apps/relay/Sponsorships.js +71 -60
  144. package/dist/apps/relay/Sponsorships.js.map +1 -1
  145. package/dist/apps/routes/Access.d.ts +53 -0
  146. package/dist/apps/routes/Access.d.ts.map +1 -1
  147. package/dist/apps/routes/Access.js +121 -0
  148. package/dist/apps/routes/Access.js.map +1 -1
  149. package/dist/apps/routes/App.d.ts +397 -158
  150. package/dist/apps/routes/App.d.ts.map +1 -1
  151. package/dist/apps/routes/App.js.map +1 -1
  152. package/dist/apps/routes/routes/chains.d.ts +25 -25
  153. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  154. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  155. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  156. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  157. package/dist/apps/routes/routes/quotes.d.ts +171 -81
  158. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  159. package/dist/apps/routes/routes/quotes.js +101 -27
  160. package/dist/apps/routes/routes/quotes.js.map +1 -1
  161. package/dist/apps/routes/routes/transfers.d.ts +532 -480
  162. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/transfers.js +182 -37
  164. package/dist/apps/routes/routes/transfers.js.map +1 -1
  165. package/dist/cli/ApiKeys.d.ts +120 -0
  166. package/dist/cli/ApiKeys.d.ts.map +1 -0
  167. package/dist/cli/ApiKeys.js +138 -0
  168. package/dist/cli/ApiKeys.js.map +1 -0
  169. package/dist/cli/Cli.d.ts +92 -34
  170. package/dist/cli/Cli.d.ts.map +1 -1
  171. package/dist/cli/Cli.js +188 -11
  172. package/dist/cli/Cli.js.map +1 -1
  173. package/dist/cli/Credentials.d.ts +95 -0
  174. package/dist/cli/Credentials.d.ts.map +1 -0
  175. package/dist/cli/Credentials.js +110 -0
  176. package/dist/cli/Credentials.js.map +1 -0
  177. package/dist/cli/Spec.d.ts +59 -0
  178. package/dist/cli/Spec.d.ts.map +1 -0
  179. package/dist/cli/Spec.js +77 -0
  180. package/dist/cli/Spec.js.map +1 -0
  181. package/dist/cli/bin.js +5 -1
  182. package/dist/cli/bin.js.map +1 -1
  183. package/dist/cli/commands/admin.d.ts +5 -5
  184. package/dist/cli/commands/admin.d.ts.map +1 -1
  185. package/dist/cli/commands/auth.d.ts +73 -0
  186. package/dist/cli/commands/auth.d.ts.map +1 -0
  187. package/dist/cli/commands/auth.js +204 -0
  188. package/dist/cli/commands/auth.js.map +1 -0
  189. package/dist/cli/commands/keys.d.ts +17 -0
  190. package/dist/cli/commands/keys.d.ts.map +1 -0
  191. package/dist/cli/commands/keys.js +109 -0
  192. package/dist/cli/commands/keys.js.map +1 -0
  193. package/dist/cloudflare.d.ts +27 -2
  194. package/dist/cloudflare.d.ts.map +1 -1
  195. package/dist/cloudflare.js +144 -17
  196. package/dist/cloudflare.js.map +1 -1
  197. package/dist/db/Db.d.ts +23 -0
  198. package/dist/db/Db.d.ts.map +1 -1
  199. package/dist/db/Db.js +413 -1
  200. package/dist/db/Db.js.map +1 -1
  201. package/dist/db/Schema.d.ts +44 -1
  202. package/dist/db/Schema.d.ts.map +1 -1
  203. package/dist/db/Schema.js +56 -3
  204. package/dist/db/Schema.js.map +1 -1
  205. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  206. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  207. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  208. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  209. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  210. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  211. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  212. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  213. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  214. package/dist/db/tables/authAccounts.js +1 -0
  215. package/dist/db/tables/authAccounts.js.map +1 -1
  216. package/dist/db/tables/earnVaults.d.ts +5 -1
  217. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  218. package/dist/db/tables/earnVaults.js +12 -1
  219. package/dist/db/tables/earnVaults.js.map +1 -1
  220. package/dist/db/tables/organizations.d.ts +4 -2
  221. package/dist/db/tables/organizations.d.ts.map +1 -1
  222. package/dist/db/tables/organizations.js +8 -34
  223. package/dist/db/tables/organizations.js.map +1 -1
  224. package/dist/db/tables/requestUsage.d.ts +5 -1
  225. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  226. package/dist/db/tables/requestUsage.js +10 -2
  227. package/dist/db/tables/requestUsage.js.map +1 -1
  228. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  229. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  230. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  231. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  232. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  233. package/dist/db/tables/rewardRuns.js +4 -0
  234. package/dist/db/tables/rewardRuns.js.map +1 -1
  235. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  236. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  237. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  238. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  239. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  240. package/dist/db/tables/routesDepositAddresses.js +84 -31
  241. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  242. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  243. package/dist/db/tables/routesDeposits.js +31 -21
  244. package/dist/db/tables/routesDeposits.js.map +1 -1
  245. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  246. package/dist/db/tables/routesIdempotency.js +2 -0
  247. package/dist/db/tables/routesIdempotency.js.map +1 -1
  248. package/dist/db/tables/routesPolicies.d.ts +58 -0
  249. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  250. package/dist/db/tables/routesPolicies.js +198 -0
  251. package/dist/db/tables/routesPolicies.js.map +1 -0
  252. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  253. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  254. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  255. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  256. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  257. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  258. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  259. package/dist/db/tables/routesTransfers.d.ts +26 -1
  260. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  261. package/dist/db/tables/routesTransfers.js +36 -6
  262. package/dist/db/tables/routesTransfers.js.map +1 -1
  263. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  264. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js +144 -33
  266. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  267. package/dist/db/tables/users.d.ts +2 -0
  268. package/dist/db/tables/users.d.ts.map +1 -1
  269. package/dist/db/tables/users.js +11 -0
  270. package/dist/db/tables/users.js.map +1 -1
  271. package/dist/handlers/internal/multisig.d.ts +1 -1
  272. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  273. package/dist/handlers/internal/multisig.js +3 -2
  274. package/dist/handlers/internal/multisig.js.map +1 -1
  275. package/dist/handlers/relay.d.ts +2 -0
  276. package/dist/handlers/relay.d.ts.map +1 -1
  277. package/dist/handlers/relay.js +34 -15
  278. package/dist/handlers/relay.js.map +1 -1
  279. package/dist/internal/Auth.d.ts +57 -6
  280. package/dist/internal/Auth.d.ts.map +1 -1
  281. package/dist/internal/Auth.js +182 -78
  282. package/dist/internal/Auth.js.map +1 -1
  283. package/dist/internal/BetterAuth.d.ts +22 -0
  284. package/dist/internal/BetterAuth.d.ts.map +1 -1
  285. package/dist/internal/BetterAuth.js +17 -14
  286. package/dist/internal/BetterAuth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts +5 -0
  288. package/dist/internal/Cache.d.ts.map +1 -1
  289. package/dist/internal/Cache.js +3 -1
  290. package/dist/internal/Cache.js.map +1 -1
  291. package/dist/internal/CliAuth.d.ts +243 -0
  292. package/dist/internal/CliAuth.d.ts.map +1 -0
  293. package/dist/internal/CliAuth.js +249 -0
  294. package/dist/internal/CliAuth.js.map +1 -0
  295. package/dist/internal/EarnSharePrices.d.ts +1 -1
  296. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  297. package/dist/internal/EarnSharePrices.js +7 -3
  298. package/dist/internal/EarnSharePrices.js.map +1 -1
  299. package/dist/internal/EarnVaults.d.ts +47 -0
  300. package/dist/internal/EarnVaults.d.ts.map +1 -1
  301. package/dist/internal/EarnVaults.js +188 -4
  302. package/dist/internal/EarnVaults.js.map +1 -1
  303. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  304. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  305. package/dist/internal/EarnWithdrawals.js +189 -0
  306. package/dist/internal/EarnWithdrawals.js.map +1 -0
  307. package/dist/internal/ExecutionContext.d.ts +21 -0
  308. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  309. package/dist/internal/ExecutionContext.js +16 -0
  310. package/dist/internal/ExecutionContext.js.map +1 -0
  311. package/dist/internal/Log.d.ts +7 -3
  312. package/dist/internal/Log.d.ts.map +1 -1
  313. package/dist/internal/Log.js +163 -130
  314. package/dist/internal/Log.js.map +1 -1
  315. package/dist/internal/MetricSink.d.ts.map +1 -1
  316. package/dist/internal/MetricSink.js +26 -1
  317. package/dist/internal/MetricSink.js.map +1 -1
  318. package/dist/internal/RateLimit.d.ts +67 -0
  319. package/dist/internal/RateLimit.d.ts.map +1 -1
  320. package/dist/internal/RateLimit.js +174 -27
  321. package/dist/internal/RateLimit.js.map +1 -1
  322. package/dist/internal/Store.d.ts +6 -0
  323. package/dist/internal/Store.d.ts.map +1 -1
  324. package/dist/internal/Store.js +4 -5
  325. package/dist/internal/Store.js.map +1 -1
  326. package/dist/internal/Timing.d.ts +6 -0
  327. package/dist/internal/Timing.d.ts.map +1 -1
  328. package/dist/internal/Timing.js +21 -1
  329. package/dist/internal/Timing.js.map +1 -1
  330. package/dist/internal/Tron.d.ts +124 -0
  331. package/dist/internal/Tron.d.ts.map +1 -0
  332. package/dist/internal/Tron.js +202 -0
  333. package/dist/internal/Tron.js.map +1 -0
  334. package/dist/internal/Viem.d.ts +4 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Viem.js +25 -6
  337. package/dist/internal/Viem.js.map +1 -1
  338. package/dist/internal/rewards/Read.d.ts +2 -2
  339. package/dist/internal/rewards/Read.d.ts.map +1 -1
  340. package/dist/internal/rewards/Read.js +11 -2
  341. package/dist/internal/rewards/Read.js.map +1 -1
  342. package/dist/internal/routes/Action.d.ts +27 -0
  343. package/dist/internal/routes/Action.d.ts.map +1 -1
  344. package/dist/internal/routes/Action.js +49 -1
  345. package/dist/internal/routes/Action.js.map +1 -1
  346. package/dist/internal/routes/Chain.d.ts +2 -0
  347. package/dist/internal/routes/Chain.d.ts.map +1 -1
  348. package/dist/internal/routes/Chain.js +4 -0
  349. package/dist/internal/routes/Chain.js.map +1 -1
  350. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  351. package/dist/internal/routes/DepositAddress.js +5 -0
  352. package/dist/internal/routes/DepositAddress.js.map +1 -1
  353. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  354. package/dist/internal/routes/Evidence.js +6 -2
  355. package/dist/internal/routes/Evidence.js.map +1 -1
  356. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  357. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  358. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  359. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  360. package/dist/internal/routes/Policy.d.ts +161 -0
  361. package/dist/internal/routes/Policy.d.ts.map +1 -0
  362. package/dist/internal/routes/Policy.js +249 -0
  363. package/dist/internal/routes/Policy.js.map +1 -0
  364. package/dist/internal/routes/Provider.d.ts +66 -3
  365. package/dist/internal/routes/Provider.d.ts.map +1 -1
  366. package/dist/internal/routes/Provider.js +106 -27
  367. package/dist/internal/routes/Provider.js.map +1 -1
  368. package/dist/internal/routes/Quota.d.ts +57 -0
  369. package/dist/internal/routes/Quota.d.ts.map +1 -0
  370. package/dist/internal/routes/Quota.js +144 -0
  371. package/dist/internal/routes/Quota.js.map +1 -0
  372. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  373. package/dist/internal/routes/Reconciliation.js +163 -47
  374. package/dist/internal/routes/Reconciliation.js.map +1 -1
  375. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  376. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  377. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  378. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  379. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  380. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  381. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  382. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  383. package/dist/internal/routes/Subsidy.d.ts +2 -2
  384. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  385. package/dist/internal/routes/Subsidy.js +2 -2
  386. package/dist/internal/routes/Subsidy.js.map +1 -1
  387. package/dist/internal/routes/Transfer.d.ts +229 -1
  388. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  389. package/dist/internal/routes/Transfer.js +644 -7
  390. package/dist/internal/routes/Transfer.js.map +1 -1
  391. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  392. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  393. package/dist/internal/routes/TransferReconciliation.js +83 -159
  394. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  395. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  396. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  397. package/dist/internal/routes/TransferSettlement.js +2 -0
  398. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  399. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  400. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  401. package/dist/internal/routes/TransferSubsidy.js +64 -5
  402. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  403. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  404. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  405. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  406. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  407. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  408. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  409. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  410. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  411. package/dist/internal/routes/index.d.ts +3 -0
  412. package/dist/internal/routes/index.d.ts.map +1 -1
  413. package/dist/internal/routes/index.js +3 -0
  414. package/dist/internal/routes/index.js.map +1 -1
  415. package/dist/internal/routes/providers/across.d.ts +3 -0
  416. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  417. package/dist/internal/routes/providers/across.js +11 -0
  418. package/dist/internal/routes/providers/across.js.map +1 -1
  419. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  420. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  421. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  422. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  423. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  424. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  425. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  426. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  427. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  428. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  429. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  430. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  431. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  432. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  434. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  435. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  436. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/propAmm.js +524 -0
  438. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  439. package/dist/internal/routes/providers/relay.d.ts +3 -0
  440. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  441. package/dist/internal/routes/providers/relay.js +352 -41
  442. package/dist/internal/routes/providers/relay.js.map +1 -1
  443. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  444. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  445. package/dist/internal/routes/providers/rhino.js +11 -0
  446. package/dist/internal/routes/providers/rhino.js.map +1 -1
  447. package/dist/internal/routes/providers/squid.d.ts +3 -0
  448. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  449. package/dist/internal/routes/providers/squid.js +19 -0
  450. package/dist/internal/routes/providers/squid.js.map +1 -1
  451. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  452. package/dist/internal/routes/providers/stargate.js +22 -9
  453. package/dist/internal/routes/providers/stargate.js.map +1 -1
  454. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  455. package/dist/internal/routes/providers/symbiosis.js +13 -17
  456. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  457. package/dist/providers/index.d.ts +14 -0
  458. package/dist/providers/index.d.ts.map +1 -1
  459. package/dist/providers/index.js +6 -0
  460. package/dist/providers/index.js.map +1 -1
  461. package/package.json +16 -6
  462. package/src/ApiKey.ts +7 -3
  463. package/src/ApiKeys.test.ts +652 -8
  464. package/src/ApiKeys.ts +191 -11
  465. package/src/App.test.ts +405 -18
  466. package/src/App.ts +51 -15
  467. package/src/Client.test-d.ts +157 -10
  468. package/src/Client.test.ts +4 -4
  469. package/src/Scope.ts +1 -2
  470. package/src/admin/App.ts +11 -5
  471. package/src/admin/apps/api-keys.test.ts +98 -2
  472. package/src/admin/apps/api-keys.ts +21 -12
  473. package/src/admin/apps/earn-vaults.test.ts +76 -7
  474. package/src/admin/apps/earn-vaults.ts +47 -8
  475. package/src/admin/apps/organizations.test.ts +147 -31
  476. package/src/admin/apps/organizations.ts +5 -4
  477. package/src/admin/apps/route-policies.test.ts +220 -0
  478. package/src/admin/apps/route-policies.ts +322 -0
  479. package/src/admin/apps/routes-support.test.ts +107 -2
  480. package/src/admin/apps/routes-support.ts +43 -3
  481. package/src/admin/apps/routes.test.ts +150 -0
  482. package/src/admin/apps/routes.ts +97 -1
  483. package/src/admin/apps/scopes.test.ts +1 -1
  484. package/src/admin/index.ts +0 -1
  485. package/src/admin/ui/plugin.ts +2 -1
  486. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  487. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  488. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  489. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  490. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  491. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  492. package/src/admin/ui/src/lib/routes.ts +34 -0
  493. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  494. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  495. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  496. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  497. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  498. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  499. package/src/admin/ui/src/routes/organizations.tsx +1 -0
  500. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  501. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  502. package/src/admin/ui/src/routes/routes.tsx +85 -2
  503. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  504. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  505. package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
  506. package/src/admin/ui.generated.ts +258 -202
  507. package/src/analytics/Analytics.test.ts +4 -50
  508. package/src/analytics/Analytics.ts +65 -1
  509. package/src/analytics/tables/requestEvents.test.ts +402 -1
  510. package/src/analytics/tables/requestEvents.ts +62 -93
  511. package/src/apps/data/routes/activities.test.ts +315 -14
  512. package/src/apps/data/routes/activities.ts +60 -0
  513. package/src/apps/data/routes/balances.ts +5 -7
  514. package/src/apps/data/routes/earn.bench.ts +18 -0
  515. package/src/apps/data/routes/earn.local.test.ts +507 -0
  516. package/src/apps/data/routes/earn.test.ts +405 -127
  517. package/src/apps/data/routes/earn.ts +660 -270
  518. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  519. package/src/apps/data/routes/exchanges.test.ts +166 -2
  520. package/src/apps/data/routes/exchanges.ts +308 -101
  521. package/src/apps/data/routes/fee-amm.test.ts +134 -2
  522. package/src/apps/data/routes/fee-amm.ts +122 -60
  523. package/src/apps/data/routes/receipts.test.ts +21 -18
  524. package/src/apps/data/routes/rpc.test.ts +2 -2
  525. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  526. package/src/apps/data/routes/tokens.test.ts +4 -4
  527. package/src/apps/data/routes/tokens.ts +11 -6
  528. package/src/apps/data/routes/transactions.test.ts +29 -0
  529. package/src/apps/data/routes/transactions.ts +33 -22
  530. package/src/apps/data/routes/webhooks.test.ts +12 -3
  531. package/src/apps/data/routes/webhooks.ts +2 -1
  532. package/src/apps/management/App.ts +4 -0
  533. package/src/apps/management/Billing.test.ts +253 -27
  534. package/src/apps/management/Billing.ts +83 -29
  535. package/src/apps/management/routes/api-keys.test.ts +1 -1
  536. package/src/apps/management/routes/api-keys.ts +85 -11
  537. package/src/apps/management/routes/billing.test.ts +68 -4
  538. package/src/apps/management/routes/cli.test.ts +370 -0
  539. package/src/apps/management/routes/cli.ts +533 -0
  540. package/src/apps/management/routes/me.test.ts +14 -4
  541. package/src/apps/management/routes/orgs.test.ts +108 -4
  542. package/src/apps/management/routes/orgs.ts +7 -2
  543. package/src/apps/management/routes/usage.test.ts +2 -2
  544. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  545. package/src/apps/mpp/internal/Policy.ts +6 -2
  546. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  547. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  548. package/src/apps/relay/App.test.ts +85 -1
  549. package/src/apps/relay/App.ts +28 -4
  550. package/src/apps/relay/Sponsorships.test.ts +97 -1
  551. package/src/apps/relay/Sponsorships.ts +77 -66
  552. package/src/apps/routes/Access.test.ts +319 -0
  553. package/src/apps/routes/Access.ts +147 -0
  554. package/src/apps/routes/App.ts +10 -0
  555. package/src/apps/routes/routes/chains.test.ts +3 -2
  556. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  557. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  558. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  559. package/src/apps/routes/routes/quotes.test.ts +81 -8
  560. package/src/apps/routes/routes/quotes.ts +109 -27
  561. package/src/apps/routes/routes/transfers.test.ts +252 -15
  562. package/src/apps/routes/routes/transfers.ts +212 -33
  563. package/src/cli/ApiKeys.test.ts +265 -0
  564. package/src/cli/ApiKeys.ts +189 -0
  565. package/src/cli/Cli.test.ts +188 -0
  566. package/src/cli/Cli.ts +280 -12
  567. package/src/cli/Credentials.test.ts +122 -0
  568. package/src/cli/Credentials.ts +144 -0
  569. package/src/cli/Spec.test.ts +133 -0
  570. package/src/cli/Spec.ts +132 -0
  571. package/src/cli/bin.test.ts +49 -0
  572. package/src/cli/bin.ts +5 -1
  573. package/src/cli/commands/auth.test.ts +138 -0
  574. package/src/cli/commands/auth.ts +254 -0
  575. package/src/cli/commands/keys.test.ts +68 -0
  576. package/src/cli/commands/keys.ts +125 -0
  577. package/src/cloudflare.ts +184 -36
  578. package/src/db/Db.test.ts +877 -0
  579. package/src/db/Db.ts +498 -1
  580. package/src/db/Schema.ts +75 -4
  581. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  582. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  583. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  584. package/src/db/tables/authAccounts.test.ts +30 -0
  585. package/src/db/tables/authAccounts.ts +1 -0
  586. package/src/db/tables/earnVaults.test.ts +34 -0
  587. package/src/db/tables/earnVaults.ts +17 -2
  588. package/src/db/tables/organizations.test.ts +148 -84
  589. package/src/db/tables/organizations.ts +11 -43
  590. package/src/db/tables/requestUsage.ts +13 -2
  591. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  592. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  593. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  594. package/src/db/tables/rewardRuns.ts +4 -0
  595. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  596. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  597. package/src/db/tables/routesDepositAddresses.ts +118 -34
  598. package/src/db/tables/routesDeposits.test.ts +66 -5
  599. package/src/db/tables/routesDeposits.ts +47 -26
  600. package/src/db/tables/routesIdempotency.test.ts +80 -0
  601. package/src/db/tables/routesIdempotency.ts +2 -0
  602. package/src/db/tables/routesPolicies.test.ts +143 -0
  603. package/src/db/tables/routesPolicies.ts +251 -0
  604. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  605. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  606. package/src/db/tables/routesTransfers.test.ts +183 -2
  607. package/src/db/tables/routesTransfers.ts +65 -6
  608. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  609. package/src/db/tables/sponsoredTransactions.ts +182 -38
  610. package/src/db/tables/users.test.ts +51 -0
  611. package/src/db/tables/users.ts +12 -0
  612. package/src/handlers/internal/multisig.store.test.ts +120 -0
  613. package/src/handlers/internal/multisig.test.ts +389 -0
  614. package/src/handlers/internal/multisig.ts +13 -10
  615. package/src/handlers/relay.test.ts +259 -83
  616. package/src/handlers/relay.ts +36 -17
  617. package/src/internal/Auth.test.ts +291 -8
  618. package/src/internal/Auth.ts +227 -96
  619. package/src/internal/BetterAuth.test.ts +58 -22
  620. package/src/internal/BetterAuth.ts +23 -17
  621. package/src/internal/Cache.ts +3 -1
  622. package/src/internal/CliAuth.test.ts +279 -0
  623. package/src/internal/CliAuth.ts +319 -0
  624. package/src/internal/EarnSharePrices.test.ts +25 -0
  625. package/src/internal/EarnSharePrices.ts +9 -2
  626. package/src/internal/EarnVaults.test.ts +67 -0
  627. package/src/internal/EarnVaults.ts +299 -4
  628. package/src/internal/EarnWithdrawals.test.ts +315 -0
  629. package/src/internal/EarnWithdrawals.ts +266 -0
  630. package/src/internal/ExecutionContext.ts +31 -0
  631. package/src/internal/Log.test.ts +210 -0
  632. package/src/internal/Log.ts +180 -142
  633. package/src/internal/MetricSink.test.ts +190 -15
  634. package/src/internal/MetricSink.ts +27 -1
  635. package/src/internal/RateLimit.test.ts +144 -8
  636. package/src/internal/RateLimit.ts +254 -26
  637. package/src/internal/Store.ts +4 -5
  638. package/src/internal/Timing.test.ts +32 -0
  639. package/src/internal/Timing.ts +20 -1
  640. package/src/internal/Tron.test-d.ts +22 -0
  641. package/src/internal/Tron.test.ts +94 -0
  642. package/src/internal/Tron.ts +289 -0
  643. package/src/internal/Viem.rpc.test.ts +76 -0
  644. package/src/internal/Viem.ts +29 -6
  645. package/src/internal/rewards/Read.test.ts +109 -0
  646. package/src/internal/rewards/Read.ts +13 -4
  647. package/src/internal/routes/Action.test.ts +70 -0
  648. package/src/internal/routes/Action.ts +76 -1
  649. package/src/internal/routes/Chain.test.ts +18 -0
  650. package/src/internal/routes/Chain.ts +5 -0
  651. package/src/internal/routes/DepositAddress.ts +5 -0
  652. package/src/internal/routes/Evidence.test.ts +64 -0
  653. package/src/internal/routes/Evidence.ts +11 -3
  654. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  655. package/src/internal/routes/Policy.test.ts +316 -0
  656. package/src/internal/routes/Policy.ts +399 -0
  657. package/src/internal/routes/Provider.test.ts +103 -2
  658. package/src/internal/routes/Provider.ts +149 -27
  659. package/src/internal/routes/Quota.test.ts +149 -0
  660. package/src/internal/routes/Quota.ts +226 -0
  661. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  662. package/src/internal/routes/Reconciliation.test.ts +371 -13
  663. package/src/internal/routes/Reconciliation.ts +193 -42
  664. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  665. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  666. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  667. package/src/internal/routes/SourceObservation.test.ts +221 -0
  668. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  669. package/src/internal/routes/Subsidy.ts +4 -2
  670. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  671. package/src/internal/routes/Transfer.test.ts +130 -1
  672. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  673. package/src/internal/routes/Transfer.ts +866 -8
  674. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  675. package/src/internal/routes/TransferReconciliation.ts +91 -166
  676. package/src/internal/routes/TransferSettlement.ts +48 -0
  677. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  678. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  679. package/src/internal/routes/TransferSubsidy.ts +87 -12
  680. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  681. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  682. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  683. package/src/internal/routes/index.test.ts +3 -0
  684. package/src/internal/routes/index.ts +3 -0
  685. package/src/internal/routes/providers/across.ts +13 -0
  686. package/src/internal/routes/providers/index.test.ts +141 -0
  687. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  688. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  689. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  690. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  691. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  692. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  693. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  694. package/src/internal/routes/providers/propAmm.ts +640 -0
  695. package/src/internal/routes/providers/relay.test.ts +1263 -41
  696. package/src/internal/routes/providers/relay.ts +423 -38
  697. package/src/internal/routes/providers/rhino.ts +14 -1
  698. package/src/internal/routes/providers/squid.ts +21 -0
  699. package/src/internal/routes/providers/stargate.test.ts +105 -1
  700. package/src/internal/routes/providers/stargate.ts +22 -9
  701. package/src/internal/routes/providers/symbiosis.ts +13 -47
  702. package/src/providers/index.test.ts +2 -0
  703. package/src/providers/index.ts +18 -0
  704. package/dist/admin/Access.d.ts +0 -39
  705. package/dist/admin/Access.d.ts.map +0 -1
  706. package/dist/admin/Access.js +0 -73
  707. package/dist/admin/Access.js.map +0 -1
  708. package/src/admin/Access.test.ts +0 -130
  709. package/src/admin/Access.ts +0 -85
@@ -1,5 +1,7 @@
1
+ import { Hash, Hex } from 'ox'
1
2
  import * as z from 'zod/mini'
2
3
 
4
+ import type * as Metrics from '../Metrics.js'
3
5
  import * as Store from './Store.js'
4
6
 
5
7
  /** Zod schemas owned by the rate-limit module. */
@@ -46,6 +48,10 @@ export namespace RateLimitStore {
46
48
  key: string
47
49
  /** Rate-limit policy. */
48
50
  limit: Limit
51
+ /** Caller the quota belongs to, grouping its quotas on one object; defaults to the key. */
52
+ principal?: string | undefined
53
+ /** Keeps a deferred increment alive past the response; omitted, it runs unattended. */
54
+ waitUntil?: ((promise: Promise<unknown>) => void) | undefined
49
55
  }
50
56
  }
51
57
 
@@ -65,29 +71,199 @@ export function memory(options: memory.Options = {}): RateLimitStore {
65
71
  return {
66
72
  async consume(options) {
67
73
  const time = now().getTime()
68
- const window = options.limit.period === 'second' ? 1_000 : 60_000
69
- const bucket = Math.floor(time / window)
74
+ const { bucket, expiresAt, reset } = window(options.limit, time)
70
75
  // The bucket isolates window counts if the backing store applies the TTL
71
76
  // after the next window starts.
72
77
  const count = await Store.increment(
73
78
  store,
74
79
  `ratelimit:${options.limit.period}:${bucket}:${options.key}`,
75
- {
76
- ttl: (bucket + 1) * window - time,
77
- },
80
+ { ttl: expiresAt - time },
78
81
  )
79
- const limit = options.limit.limit
82
+ return result(options.limit, count, reset)
83
+ },
84
+ }
85
+ }
80
86
 
81
- return {
82
- allowed: count <= limit,
83
- limit,
84
- remaining: Math.max(limit - count, 0),
85
- reset: Math.ceil(((bucket + 1) * window) / 1_000),
87
+ /**
88
+ * Creates a rate-limit store over quota Durable Objects, one object per
89
+ * principal holding a row per quota, so a caller's counters stay on one warm
90
+ * object across scopes and windows.
91
+ */
92
+ export function durableObject(
93
+ namespace: durableObject.Namespace,
94
+ options: durableObject.Options = {},
95
+ ): RateLimitStore {
96
+ const { metrics, name = (principal: string) => `tempo-api:rate-limiter:${principal}` } = options
97
+ // Last known count per object and quota for the current window, plus the
98
+ // increments this isolate has sent there and not yet heard back on.
99
+ const locals = new Map<string, Local>()
100
+ return {
101
+ async consume(options) {
102
+ const { bucket, reset } = window(options.limit, Date.now())
103
+ const object = name(options.principal ?? options.key)
104
+ const quota = `${options.limit.period}:${options.key}`
105
+ const local = localFor(locals, `${object}\n${quota}`, bucket)
106
+ // Unsettled increments may already be in the reported count; counting
107
+ // them again errs toward waiting, never toward admitting.
108
+ const known = (local.count ?? 0) + local.pending + 1
109
+ // Deferring needs a lifetime for the increment and fewer unanswered
110
+ // increments than the margin, which bounds any overshoot, even before
111
+ // the counter has reported a count for this window.
112
+ const deferred =
113
+ options.waitUntil !== undefined &&
114
+ local.pending < margin(options.limit) &&
115
+ defers(options.limit, known)
116
+ local.pending++
117
+ const start = performance.now()
118
+ // Stubs are request-scoped I/O objects in Workers, so resolve one per call.
119
+ const run = Store.durableObjectRetry(() =>
120
+ namespace.getByName(object).consume({ bucket, quota }),
121
+ ).then(
122
+ (outcome) => {
123
+ if (local.count === undefined || outcome.count > local.count) local.count = outcome.count
124
+ // Best effort once the caller has stopped waiting: metrics buffer
125
+ // until the request flushes, so a late reply lands in a later flush
126
+ // or not at all.
127
+ metrics?.histogram('rate_limit_rpc_ms', performance.now() - start, { cold: outcome.cold })
128
+ metrics?.count('rate_limit_consume_count', 1, {
129
+ cold: outcome.cold,
130
+ deferred,
131
+ outcome: 'ok',
132
+ })
133
+ return outcome
134
+ },
135
+ (error: unknown) => {
136
+ // A fast rejection fails open upstream without the 300 ms timing
137
+ // marker, so it leaves its own signal here.
138
+ metrics?.count('rate_limit_consume_count', 1, { deferred, outcome: 'error' })
139
+ throw error
140
+ },
141
+ )
142
+ const settled = run
143
+ .catch(() => {})
144
+ .finally(() => {
145
+ local.pending--
146
+ })
147
+ if (!deferred) {
148
+ const outcome = await run
149
+ return result(options.limit, outcome.count, reset)
86
150
  }
151
+ // Far from the limit the answer cannot change the response, so the
152
+ // request proceeds on the local estimate while the increment lands.
153
+ options.waitUntil?.(settled)
154
+ return result(options.limit, known, reset)
87
155
  },
88
156
  }
89
157
  }
90
158
 
159
+ export declare namespace durableObject {
160
+ /** Quota Durable Object namespace. */
161
+ type Namespace = {
162
+ /** Gets the stub for one principal's object. */
163
+ getByName(name: string): Stub
164
+ }
165
+
166
+ /** Quota Durable Object RPC surface. */
167
+ type Stub = {
168
+ /** Counts one request in the given window. */
169
+ consume(options: Stub.ConsumeOptions): Promise<Outcome>
170
+ }
171
+
172
+ namespace Stub {
173
+ /** Window selected by the caller, so the object needs no clock of its own. */
174
+ type ConsumeOptions = {
175
+ /** Fixed-window number; the object keeps only the newest it has seen per quota. */
176
+ bucket: number
177
+ /** Quota within the principal's object: the period plus the quota key. */
178
+ quota: string
179
+ }
180
+ }
181
+
182
+ /** One counted request. */
183
+ type Outcome = {
184
+ /** Whether the object was constructed to serve this call. */
185
+ cold: boolean
186
+ /** Requests counted in the window, including this one. */
187
+ count: number
188
+ }
189
+
190
+ /** Options for creating a quota Durable Object store. */
191
+ type Options = {
192
+ /** Receives round-trip and cold-start metrics. */
193
+ metrics?: Metrics.Metrics | undefined
194
+ /** Maps a principal to its object name. */
195
+ name?: ((principal: string) => string) | undefined
196
+ }
197
+ }
198
+
199
+ /** Limits at or below this always wait for the counter: one overshoot would be visible. */
200
+ const exactLimit = 10
201
+
202
+ /** Most unanswered increments one isolate may defer per quota before a consume waits for the counter. */
203
+ function margin(limit: Limit): number {
204
+ return Math.max(1, Math.ceil(limit.limit / 100))
205
+ }
206
+
207
+ /**
208
+ * Whether a consume may proceed on the local estimate `known` (last known
209
+ * count plus unanswered increments plus this request) instead of waiting for
210
+ * the counter. Small limits and anything within the margin wait.
211
+ */
212
+ export function defers(limit: Limit, known: number): boolean {
213
+ return limit.limit > exactLimit && known < limit.limit - margin(limit)
214
+ }
215
+
216
+ /** Isolate-local view of one object's quota in the current window. */
217
+ type Local = {
218
+ /** Window the view belongs to. */
219
+ bucket: number
220
+ /** Largest count the counter has reported for the window; unknown until the first reply. */
221
+ count?: number | undefined
222
+ /** Increments sent and not yet settled. */
223
+ pending: number
224
+ }
225
+
226
+ /** Cap on tracked identities per isolate; the oldest is dropped past it. */
227
+ const localsMax = 10_000
228
+
229
+ function localFor(locals: Map<string, Local>, identity: string, bucket: number): Local {
230
+ const existing = locals.get(identity)
231
+ if (existing?.bucket === bucket) return existing
232
+ if (!existing && locals.size >= localsMax) locals.delete(locals.keys().next().value as string)
233
+ const local: Local = { bucket, pending: 0 }
234
+ locals.set(identity, local)
235
+ return local
236
+ }
237
+
238
+ /** Fixed-window boundaries for one limit at one instant. */
239
+ export function window(limit: Limit, time: number): window.ReturnType {
240
+ const width = limit.period === 'second' ? 1_000 : 60_000
241
+ const bucket = Math.floor(time / width)
242
+ const expiresAt = (bucket + 1) * width
243
+ return { bucket, expiresAt, reset: Math.ceil(expiresAt / 1_000) }
244
+ }
245
+
246
+ export declare namespace window {
247
+ /** One fixed window. */
248
+ type ReturnType = {
249
+ /** Window number since the epoch. */
250
+ bucket: number
251
+ /** Epoch milliseconds the window ends. */
252
+ expiresAt: number
253
+ /** Window end in Unix seconds, as published in `RateLimit-Reset`. */
254
+ reset: number
255
+ }
256
+ }
257
+
258
+ function result(limit: Limit, count: number, reset: number): Result {
259
+ return {
260
+ allowed: count <= limit.limit,
261
+ limit: limit.limit,
262
+ remaining: Math.max(limit.limit - count, 0),
263
+ reset,
264
+ }
265
+ }
266
+
91
267
  export declare namespace memory {
92
268
  /** Options for creating an in-memory fixed-window rate-limit store. */
93
269
  type Options = {
@@ -109,23 +285,68 @@ export type Binding = {
109
285
  * when any configured layer denies; fails open when a binding errors.
110
286
  */
111
287
  export async function edge(request: Request, options: edge.Options): Promise<Response | undefined> {
112
- try {
288
+ const check = async (run: () => Promise<{ success: boolean }>[]) => {
289
+ try {
290
+ const results = await Promise.all(run())
291
+ if (results.some((result) => !result.success))
292
+ return new Response('Rate limit exceeded', {
293
+ headers: { 'retry-after': '10' },
294
+ status: 429,
295
+ })
296
+ } catch (error) {
297
+ console.error('Edge rate limit check failed:', error)
298
+ }
299
+ return undefined
300
+ }
301
+
302
+ if (!options.resolvePartition)
303
+ return check(() => {
304
+ const checks: Promise<{ success: boolean }>[] = []
305
+ if (options.ip) checks.push(options.ip.limit({ key: clientKey(request) }))
306
+ const asn = clientAsn(request)
307
+ if (options.asn && asn !== undefined) checks.push(options.asn.limit({ key: `asn:${asn}` }))
308
+ if (options.global) checks.push(options.global.limit({ key: 'global' }))
309
+ return checks
310
+ })
311
+
312
+ const [global, network] = await Promise.all([
313
+ check(() => (options.global ? [options.global.limit({ key: 'global' })] : [])),
314
+ check(() => {
315
+ const checks: Promise<{ success: boolean }>[] = []
316
+ if (options.ip) checks.push(options.ip.limit({ key: clientKey(request) }))
317
+ const asn = clientAsn(request)
318
+ if (options.asn && asn !== undefined) checks.push(options.asn.limit({ key: `asn:${asn}` }))
319
+ return checks
320
+ }),
321
+ ])
322
+ if (global) return global
323
+ if (!network) return undefined
324
+
325
+ // Credential lookups get a separate network budget so rotating invalid
326
+ // tokens cannot turn an exhausted transport bucket into backend fan-out.
327
+ const admission = await check(() => {
113
328
  const checks: Promise<{ success: boolean }>[] = []
114
- if (options.ip) checks.push(options.ip.limit({ key: clientKey(request) }))
329
+ if (options.ip)
330
+ checks.push(options.ip.limit({ key: partitionKey(clientKey(request), 'credential-probe') }))
115
331
  const asn = clientAsn(request)
116
- if (options.asn && asn !== undefined) checks.push(options.asn.limit({ key: `asn:${asn}` }))
117
- if (options.global) checks.push(options.global.limit({ key: 'global' }))
118
-
119
- const results = await Promise.all(checks)
120
- if (results.some((result) => !result.success))
121
- return new Response('Rate limit exceeded', {
122
- headers: { 'retry-after': '10' },
123
- status: 429,
124
- })
125
- } catch (error) {
126
- console.error('Edge rate limit check failed:', error)
127
- }
128
- return undefined
332
+ if (options.asn && asn !== undefined)
333
+ checks.push(options.asn.limit({ key: partitionKey(`asn:${asn}`, 'credential-probe') }))
334
+ return checks
335
+ })
336
+ if (admission) return network
337
+
338
+ const resolved = await options.resolvePartition()
339
+ if (resolved === undefined) return network
340
+
341
+ return check(() => {
342
+ const checks: Promise<{ success: boolean }>[] = []
343
+ if (options.ip)
344
+ checks.push(options.ip.limit({ key: partitionKey(clientKey(request), resolved) }))
345
+ const asn = clientAsn(request)
346
+ if (options.asn && asn !== undefined)
347
+ checks.push(options.asn.limit({ key: partitionKey(`asn:${asn}`, resolved) }))
348
+ return checks
349
+ })
129
350
  }
130
351
 
131
352
  export declare namespace edge {
@@ -137,12 +358,19 @@ export declare namespace edge {
137
358
  global?: Binding | undefined
138
359
  /** Per-client limit, keyed by IPv4 address or IPv6 /64 prefix. */
139
360
  ip?: Binding | undefined
361
+ /** Resolves a confirmed credential partition when the shared network limit rejects. */
362
+ resolvePartition?: (() => Promise<string | undefined>) | undefined
140
363
  }
141
364
  }
142
365
 
143
366
  /** Cloudflare-enriched request properties; absent outside Workers (tests, service bindings). */
144
367
  type CfProperties = { asn?: number | undefined }
145
368
 
369
+ /** Hashes a network and credential partition into Cloudflare's 64-byte binding-key limit. */
370
+ function partitionKey(network: string, partition: string): string {
371
+ return Hash.sha256(Hex.fromString(`${network}:partition:${partition}`)).slice(2)
372
+ }
373
+
146
374
  function clientAsn(request: Request): number | undefined {
147
375
  const direct = (request as Request & { cf?: CfProperties }).cf?.asn
148
376
  if (direct !== undefined) return direct
@@ -891,12 +891,11 @@ function durableObjectStub(
891
891
  }
892
892
 
893
893
  /**
894
- * Runs a Durable Object stub call, retrying once when workerd marks the error
895
- * retryable (transient transport failures, e.g. "Network connection lost.")
896
- * and not overloaded. Callers pass a thunk so the retry resolves a fresh
897
- * stub: a stub that threw is disconnected.
894
+ * Runs a Durable Object call, retrying once when workerd marks the error
895
+ * retryable and not overloaded. Callers pass a thunk so the retry resolves a
896
+ * fresh stub: a stub that threw is disconnected.
898
897
  */
899
- async function durableObjectRetry<value>(call: () => Promise<value>): Promise<value> {
898
+ export async function durableObjectRetry<value>(call: () => Promise<value>): Promise<value> {
900
899
  try {
901
900
  return await call()
902
901
  } catch (error) {
@@ -97,3 +97,35 @@ describe('middleware', () => {
97
97
  }
98
98
  })
99
99
  })
100
+
101
+ describe('record', () => {
102
+ test('adds observed durations under one metric', async () => {
103
+ const app = new Hono<{ Variables: Timing.Variables }>()
104
+ app.use('*', Timing.middleware())
105
+ app.get('/', async (c) => {
106
+ Timing.record('db', 12)
107
+ // Attribution survives awaited work inside the request.
108
+ await Promise.resolve()
109
+ Timing.record('db', 8)
110
+ return c.text('ok')
111
+ })
112
+
113
+ const response = await app.request('/')
114
+ const timing = response.headers.get('server-timing')
115
+
116
+ expect(timing?.match(/db/g)).toHaveLength(1)
117
+ expect(timing).toContain('db;dur=20.0')
118
+ })
119
+
120
+ test('ignores requests without timing middleware', async () => {
121
+ const app = new Hono<{ Variables: Timing.Variables }>()
122
+ app.get('/', (c) => {
123
+ Timing.record('db', 12)
124
+ return c.text('ok')
125
+ })
126
+
127
+ const response = await app.request('/')
128
+
129
+ expect(response.headers.get('server-timing')).toBeNull()
130
+ })
131
+ })
@@ -1,3 +1,4 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks'
1
2
  import type { Context, MiddlewareHandler } from 'hono'
2
3
 
3
4
  /** Hono variables used to collect Server-Timing metrics. */
@@ -49,6 +50,9 @@ export type Seed = {
49
50
 
50
51
  const requestSeeds = new WeakMap<Request, Seed>()
51
52
 
53
+ /** Metrics of the request whose async continuation is currently running. */
54
+ const scopes = new AsyncLocalStorage<Metric[]>()
55
+
52
56
  /** Seeds timings collected by an outer runtime onto the same request object. */
53
57
  export function seed(request: Request, value: Seed): void {
54
58
  requestSeeds.set(request, value)
@@ -69,7 +73,9 @@ export function middleware<
69
73
  c.set('timingSums', new Map())
70
74
 
71
75
  const start = performance.now()
72
- await next()
76
+ // Downstream work runs inside the request's async scope so hooks without a
77
+ // context, such as database query observers, can still attribute to it.
78
+ await scopes.run(metrics, next)
73
79
  metrics.push({ duration: performance.now() - start, name: 'request' })
74
80
  for (const timing of outerActive) {
75
81
  active.splice(active.indexOf(timing), 1)
@@ -144,6 +150,19 @@ export async function sum<environment extends Environment, value>(
144
150
  }
145
151
  }
146
152
 
153
+ /**
154
+ * Adds an already-measured duration to the current request's metric,
155
+ * accumulating repeats. Suits hooks that observe work they cannot wrap and
156
+ * have no request context of their own; a no-op outside a timed request.
157
+ */
158
+ export function record(name: string, duration: number): void {
159
+ const metrics = scopes.getStore()
160
+ if (!metrics) return
161
+ const existing = metrics.find((metric) => metric.name === name)
162
+ if (existing) existing.duration += duration
163
+ else metrics.push({ duration, name })
164
+ }
165
+
147
166
  function format(metrics: readonly Metric[]) {
148
167
  return metrics
149
168
  .map((metric) => `${name(metric.name)};dur=${metric.duration.toFixed(1)}`)
@@ -0,0 +1,22 @@
1
+ import type { Hex } from 'ox'
2
+ import { describe, expectTypeOf, test } from 'vitest'
3
+
4
+ import * as Tron from './Tron.js'
5
+
6
+ describe('createClient', () => {
7
+ test('exposes typed native Tron actions', () => {
8
+ const client = Tron.createClient({ urls: ['https://api.trongrid.io'] })
9
+ expectTypeOf(client.call).returns.toEqualTypeOf<Promise<Hex.Hex>>()
10
+ expectTypeOf(client.getTransactionReceipt).returns.resolves.toMatchTypeOf<
11
+ | {
12
+ blockNumber: number
13
+ id: string
14
+ receipt: { result?: string | undefined }
15
+ }
16
+ | undefined
17
+ >()
18
+ expectTypeOf(client.getBlock).returns.resolves.toMatchTypeOf<{
19
+ block_header: { raw_data: { number: number; timestamp: number } }
20
+ }>()
21
+ })
22
+ })
@@ -0,0 +1,94 @@
1
+ import { Base58, Hash, Hex } from 'ox'
2
+ import { describe, expect, test } from 'vitest'
3
+
4
+ import * as Tron from './Tron.js'
5
+
6
+ const usdt = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'
7
+ const address = '0xa614f803b6fd780986a42c78ec9c7f77e6ded13c'
8
+
9
+ describe('toEvmAddress', () => {
10
+ test('decodes the Tron USDT address without its network prefix', () => {
11
+ expect(Tron.toEvmAddress(usdt)).toMatchInlineSnapshot(
12
+ '"0xa614f803b6fd780986a42c78ec9c7f77e6ded13c"',
13
+ )
14
+ })
15
+
16
+ test('rejects a changed checksum and ambiguous characters', () => {
17
+ expect(() => Tron.toEvmAddress(`${usdt.slice(0, -1)}k`)).toThrowErrorMatchingInlineSnapshot(
18
+ '[Tron.InvalidAddressError: Invalid Tron address.]',
19
+ )
20
+ expect(() =>
21
+ Tron.toEvmAddress('T0LAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj'),
22
+ ).toThrowErrorMatchingInlineSnapshot('[Tron.InvalidAddressError: Invalid Tron address.]')
23
+ })
24
+
25
+ test('rejects a valid checksum for another network', () => {
26
+ const payload = Hex.concat('0x00', address)
27
+ const value = Base58.fromHex(
28
+ Hex.concat(payload, Hex.slice(Hash.sha256(Hash.sha256(payload)), 0, 4)),
29
+ )
30
+ expect(() => Tron.toEvmAddress(value)).toThrowErrorMatchingInlineSnapshot(
31
+ '[Tron.InvalidAddressError: Invalid Tron address.]',
32
+ )
33
+ })
34
+ })
35
+
36
+ describe('fromEvmAddress', () => {
37
+ test('encodes the Tron USDT address and zero address', () => {
38
+ expect(Tron.fromEvmAddress(address)).toMatchInlineSnapshot(
39
+ '"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"',
40
+ )
41
+ expect(Tron.fromEvmAddress(`0x${'00'.repeat(20)}`)).toMatchInlineSnapshot(
42
+ '"T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb"',
43
+ )
44
+ })
45
+
46
+ test('rejects an ABI word in place of an address', () => {
47
+ expect(() => Tron.fromEvmAddress(`0x${'00'.repeat(32)}`)).toThrowErrorMatchingInlineSnapshot(
48
+ '[Tron.InvalidAddressError: Invalid Tron address.]',
49
+ )
50
+ })
51
+ })
52
+
53
+ describe('schema', () => {
54
+ test('validates source evidence with native network-prefixed addresses', () => {
55
+ const result = Tron.schema.Transaction.safeParse({
56
+ raw_data: {
57
+ contract: [
58
+ {
59
+ parameter: {
60
+ value: {
61
+ contract_address: `41${address.slice(2)}`,
62
+ data: 'a9059cbb',
63
+ owner_address: `41${'11'.repeat(20)}`,
64
+ },
65
+ },
66
+ type: 'TriggerSmartContract',
67
+ },
68
+ ],
69
+ },
70
+ ret: [{ contractRet: 'SUCCESS' }],
71
+ txID: 'aa'.repeat(32),
72
+ })
73
+ expect(result.success).toMatchInlineSnapshot('true')
74
+ })
75
+
76
+ test('rejects missing evidence and malformed hexadecimal results', () => {
77
+ expect([
78
+ Tron.schema.Transaction.safeParse({}).success,
79
+ Tron.schema.Receipt.safeParse({}).success,
80
+ Tron.schema.Call.safeParse({ constant_result: ['xyz'], result: { result: true } }).success,
81
+ Tron.schema.Block.safeParse({
82
+ blockID: 'aa'.repeat(32),
83
+ block_header: { raw_data: { number: -1, timestamp: 100 } },
84
+ }).success,
85
+ ]).toMatchInlineSnapshot(`
86
+ [
87
+ false,
88
+ false,
89
+ false,
90
+ false,
91
+ ]
92
+ `)
93
+ })
94
+ })