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
@@ -15,11 +15,11 @@ import { tempoMainnet } from 'viem/tempo/chains';
15
15
  import * as z from 'zod/mini';
16
16
  import * as ApiKey from '../ApiKey.js';
17
17
  import * as ApiKeys from '../ApiKeys.js';
18
- import * as ApiKeyAdmissions from '../db/tables/apiKeyAdmissions.js';
19
- import * as ApiKeyOwnerTombstones from '../db/tables/apiKeyOwnerTombstones.js';
20
18
  import * as AuthAccounts from '../db/tables/authAccounts.js';
21
19
  import * as BetterAuth from './BetterAuth.js';
20
+ import * as CliAuth from './CliAuth.js';
22
21
  import * as Db from '../db/Db.js';
22
+ import * as ExecutionContext from './ExecutionContext.js';
23
23
  import * as Memberships from '../db/tables/memberships.js';
24
24
  import * as IpAllowlist from './IpAllowlist.js';
25
25
  import * as Metadata from '../apps/metadata.js';
@@ -35,11 +35,14 @@ import * as Timing from './Timing.js';
35
35
  import * as Users from '../db/tables/users.js';
36
36
  const policySymbol = Symbol('tempo-api.auth.policy');
37
37
  const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management');
38
+ const trustedClientIps = new WeakMap();
38
39
  const defaultApiKeyRateLimit = { limit: 10_000, period: 'minute' };
39
40
  const defaultIdentitySessionTtl = 24 * 60 * 60;
40
41
  const defaultMppRateLimit = { limit: 100, period: 'minute' };
41
42
  const defaultPublicRateLimit = { limit: 60, period: 'minute' };
42
43
  const identityCookieName = 'tempo_identity';
44
+ const privacyUrl = 'https://tempo.xyz/privacy-policy/';
45
+ const termsUrl = 'https://console.tempo.xyz/legal/terms';
43
46
  const walletIdentityIssuer = 'https://wallet.tempo.xyz/api/oidc';
44
47
  function isIdentityTokenError(error) {
45
48
  return (error instanceof jose.errors.JOSEAlgNotAllowed ||
@@ -56,6 +59,15 @@ function isIdentityTokenError(error) {
56
59
  export function getPrincipal(c) {
57
60
  return c.get('principal') ?? null;
58
61
  }
62
+ /** Resolves the caller IP from configured trusted metadata. */
63
+ export function getTrustedClientIp(c) {
64
+ const auth = c.get('auth');
65
+ return auth ? trustedClientIp(c, auth) : resolveTrustedClientIp(c.req.raw, undefined);
66
+ }
67
+ /** Marks a synthesized in-process request with its trusted caller IP address. */
68
+ export function trustClientIp(request, address) {
69
+ trustedClientIps.set(request, address);
70
+ }
59
71
  /**
60
72
  * Guards `:orgId` routes and resolves the organization. Sessions require membership, API keys require ownership, and the super admin bypasses ownership.
61
73
  */
@@ -351,13 +363,15 @@ function createAuthMiddleware(options, resolve) {
351
363
  ...(sessionChainIds ? { sessionChainIds: new Set(sessionChainIds) } : {}),
352
364
  },
353
365
  }),
354
- rateLimit: RateLimit.memory(options.rateLimit),
366
+ rateLimit: rateLimitStore(options.rateLimit),
355
367
  ...(options.session ? { session: options.session } : {}),
356
368
  ...(options.superAdmin?.secret
357
369
  ? { superAdmin: { tokenHash: ApiKey.hash(options.superAdmin.secret) } }
358
370
  : {}),
359
371
  };
360
372
  return createMiddleware((c, next) => {
373
+ // Every route records its credential, including unprotected and unmatched paths.
374
+ recordCredential(c, getApiKeyCredential(c));
361
375
  const resolved = resolveRequestPolicy(c, { base, defaults, options });
362
376
  if (!resolved)
363
377
  return next();
@@ -386,7 +400,9 @@ function resolveRequestPolicy(c, options) {
386
400
  const inheritedKey = `${inheritedMethod.toUpperCase()} ${key.slice(key.indexOf(' ') + 1)}`;
387
401
  return overrides?.[inheritedKey];
388
402
  })();
389
- const routeOverride = management && configuredOverride ? { mpp: configuredOverride.mpp } : configuredOverride;
403
+ // Generated management routes already materialize the GET's MPP contract.
404
+ // Reapplying its override would also copy GET-only quota controls.
405
+ const routeOverride = management ? undefined : configuredOverride;
390
406
  return {
391
407
  management,
392
408
  policy: bindMppScope(resolvePolicy(options.base, options.defaults, [...routePolicies, routeOverride], description), scope),
@@ -394,15 +410,28 @@ function resolveRequestPolicy(c, options) {
394
410
  }
395
411
  function createApiKeyResolver(options) {
396
412
  const requests = new WeakMap();
397
- const uncached = (c, token) => {
413
+ // Requests whose key came from KV in this request: `ApiKeys.resolve` already
414
+ // read the fences, so reading them again adds a round trip and nothing else.
415
+ const fenced = new WeakMap();
416
+ const uncached = async (c, token) => {
398
417
  const kv = contextKv(c);
399
- return kv
400
- ? ApiKeys.resolve(kv.store, token, { scopeCatalog: options.scopeCatalog })
401
- : Promise.resolve(null);
418
+ if (!kv)
419
+ return null;
420
+ const apiKey = await ApiKeys.resolve(kv.store, token, { scopeCatalog: options.scopeCatalog });
421
+ fenced.set(c, ApiKey.hash(token));
422
+ return apiKey;
402
423
  };
403
424
  const cache = options.apiKey === false || options.apiKey?.cache === false
404
425
  ? { invalidate: () => { }, peek: () => undefined, resolve: uncached }
405
426
  : cachedResolve(uncached, options.apiKey?.cache ?? {});
427
+ // A cached record still checks its fences every request, so revocation and
428
+ // owner deletion never wait for the isolate cache to expire.
429
+ const active = async (c, token, apiKey) => {
430
+ const kv = contextKv(c);
431
+ if (!apiKey || !kv || fenced.get(c) === ApiKey.hash(token))
432
+ return apiKey;
433
+ return (await ApiKeys.isFenced(kv.store, apiKey)) ? null : apiKey;
434
+ };
406
435
  return {
407
436
  peek: (c, token) => {
408
437
  const tokenHash = ApiKey.hash(token);
@@ -411,18 +440,17 @@ function createApiKeyResolver(options) {
411
440
  return existing.apiKey;
412
441
  return cache.peek(token);
413
442
  },
443
+ probe: async (c, token) => {
444
+ // Probes must not warm the resolution cache before rate-limit admission.
445
+ return active(c, token, await uncached(c, token));
446
+ },
414
447
  resolve: async (c, token) => {
415
448
  const tokenHash = ApiKey.hash(token);
416
449
  const existing = requests.get(c);
417
450
  if (existing?.tokenHash === tokenHash)
418
451
  return existing.apiKey;
419
452
  const cached = await cache.resolve(c, token);
420
- const kv = contextKv(c);
421
- const apiKey = cached &&
422
- ((kv && (await ApiKeys.isOwnerDeleted(kv.store, cached))) ||
423
- !(await apiKeyOwnerExists(cached, options.db)))
424
- ? null
425
- : cached;
453
+ const apiKey = await active(c, token, cached);
426
454
  if (cached && !apiKey)
427
455
  cache.invalidate(token);
428
456
  requests.set(c, { apiKey, tokenHash });
@@ -430,17 +458,6 @@ function createApiKeyResolver(options) {
430
458
  },
431
459
  };
432
460
  }
433
- /** Rejects attributed keys fenced by a committed owner deletion. */
434
- async function apiKeyOwnerExists(apiKey, source) {
435
- if (!source)
436
- return true;
437
- const db = Db.get(source);
438
- if (!(await ApiKeyAdmissions.matches(db, apiKey)))
439
- return false;
440
- if (await ApiKeyOwnerTombstones.isDeleted(db, apiKey))
441
- return false;
442
- return true;
443
- }
444
461
  /** Zod schemas documenting the session sign-in surface. */
445
462
  var schema;
446
463
  (function (schema) {
@@ -534,7 +551,7 @@ export function install(options) {
534
551
  get email() {
535
552
  return options.email();
536
553
  },
537
- rateLimit: RateLimit.memory(options_middleware.rateLimit),
554
+ rateLimit: rateLimitStore(options_middleware.rateLimit),
538
555
  secret: options_session.secret,
539
556
  ...(options_session.google ? { google: options_session.google } : {}),
540
557
  ...(options_session.trustedOrigins
@@ -579,7 +596,10 @@ export function install(options) {
579
596
  return value === null ? undefined : JSON.parse(value);
580
597
  },
581
598
  async set(key, value, options) {
582
- await kv.store.put(`auth:${key}`, JSON.stringify(value), options?.ttl ? { ttl: options.ttl * 1_000 } : {});
599
+ const payload = key.startsWith('session:')
600
+ ? { ...value, ...(await bindWalletSession(value)) }
601
+ : value;
602
+ await kv.store.put(`auth:${key}`, JSON.stringify(payload), options?.ttl ? { ttl: options.ttl * 1_000 } : {});
583
603
  },
584
604
  },
585
605
  ...(ttl ? { ttl } : {}),
@@ -616,8 +636,51 @@ export function install(options) {
616
636
  return { email: verifiedEmail ?? user.email ?? undefined, user };
617
637
  });
618
638
  }
639
+ async function bindWalletSession(payload) {
640
+ const user = await resolveWallet(payload);
641
+ if (!user)
642
+ throw new Error('Authenticated wallet user was not found');
643
+ if (!user.user.termsSharedAt)
644
+ await Users.recordTermsShared(Db.get(db), user.user.id);
645
+ return { email: user.email, userId: user.user.id };
646
+ }
647
+ async function resolveWalletSession(payload) {
648
+ // Legacy sessions cannot be safely rebound after an email or wallet reassignment.
649
+ if (!payload.userId)
650
+ return null;
651
+ const database = Db.get(db);
652
+ const [user, linkedUserId] = await Promise.all([
653
+ Users.get(database, payload.userId),
654
+ AuthAccounts.getWalletUserId(database, payload.address),
655
+ ]);
656
+ if (!user || linkedUserId !== payload.userId)
657
+ return null;
658
+ if (payload.email && (user.email !== payload.email || !user.emailVerified))
659
+ return null;
660
+ return { email: user.emailVerified ? user.email : undefined, user };
661
+ }
662
+ // CLI sessions act as the approving user; the principal's identity names the
663
+ // CLI session so handlers never mistake it for a wallet sign-in.
664
+ const resolveCli = async (token) => {
665
+ const record = await CliAuth.resolve(kv.store, token);
666
+ if (!record)
667
+ return null;
668
+ const user = await Users.get(Db.get(db), record.userId);
669
+ if (!user)
670
+ return null;
671
+ return {
672
+ cli: { expiresAt: record.expiresAt, scopes: record.scopes ?? [] },
673
+ ...(user.emailVerified && user.email ? { email: user.email } : {}),
674
+ id: user.id,
675
+ identity: { provider: 'cli', subject: record.id },
676
+ type: 'session',
677
+ };
678
+ };
619
679
  const session = {
620
680
  resolve: async (c) => {
681
+ const bearer = /^Bearer\s+(.+)$/i.exec(c.req.header('authorization') ?? '')?.[1];
682
+ if (bearer && CliAuth.isToken(bearer))
683
+ return resolveCli(bearer);
621
684
  const [betterAuth, identitySession, wallet] = await Promise.all([
622
685
  (async () => {
623
686
  const auth = BetterAuth.fromContext(c, options_betterAuth);
@@ -651,7 +714,7 @@ export function install(options) {
651
714
  const payload = JSON.parse(value);
652
715
  if (payload.expiresAt <= Math.floor(Date.now() / 1_000))
653
716
  return null;
654
- const user = await resolveWallet(payload);
717
+ const user = await resolveWalletSession(payload);
655
718
  if (!user)
656
719
  return null;
657
720
  return {
@@ -665,7 +728,7 @@ export function install(options) {
665
728
  const payload = await handler.getSession(c.req.raw);
666
729
  if (!payload)
667
730
  return null;
668
- const user = await resolveWallet(payload);
731
+ const user = await resolveWalletSession(payload);
669
732
  if (!user)
670
733
  return null;
671
734
  return {
@@ -688,6 +751,11 @@ export function install(options) {
688
751
  const policy_public = policy({ public: true });
689
752
  const describe = OpenApi.describeRoute({ hide: true });
690
753
  const app = new Hono()
754
+ .use('*', async (c, next) => {
755
+ await next();
756
+ c.header('Tempo-Terms-URL', termsUrl);
757
+ c.header('Tempo-Privacy-URL', privacyUrl);
758
+ })
691
759
  .use('/v1/auth/siwe', policy_public, describe)
692
760
  .use('/v1/auth/siwe/*', policy_public, describe);
693
761
  // Documented operations: pre-routes carrying the OpenAPI metadata and the
@@ -782,11 +850,12 @@ export function install(options) {
782
850
  });
783
851
  const address = Address.checksum(claims.subject);
784
852
  await Users.upsertByAddress(Db.get(db), { address });
853
+ const binding = await bindWalletSession({ address, email: claims.email });
785
854
  const issuedAt = Math.floor(Date.now() / 1_000);
786
855
  const token = Hex.fromBytes(crypto.getRandomValues(new Uint8Array(32))).slice(2);
787
856
  await kv.store.put(identitySessionKey(token), JSON.stringify({
788
857
  address,
789
- ...(claims.email ? { email: claims.email } : {}),
858
+ ...binding,
790
859
  expiresAt: issuedAt + identitySessionTtl,
791
860
  issuedAt,
792
861
  }), { ttl: identitySessionTtl * 1_000 });
@@ -802,10 +871,12 @@ export function install(options) {
802
871
  app.post('/v1/auth/logout', policy(false), createMiddleware(async (c, next) => {
803
872
  const auth = c.get('auth');
804
873
  const principal = principalFromPublic(c, auth);
805
- const result = await consumeRateLimit(auth, {
874
+ const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(auth, {
806
875
  key: `public:${principal.id}`,
807
876
  limit: auth.publicRateLimit ?? defaultPublicRateLimit,
808
- });
877
+ principal: `public:${principal.id}`,
878
+ waitUntil: ExecutionContext.waitUntil(c),
879
+ }));
809
880
  if (result) {
810
881
  setRateLimitHeaders(c, result);
811
882
  if (!result.allowed)
@@ -815,7 +886,7 @@ export function install(options) {
815
886
  await next();
816
887
  return undefined;
817
888
  }), OpenApi.describeRoute({
818
- description: 'Revokes auth sessions and clears their cookies.',
889
+ description: 'Revokes auth sessions and clears their cookies. A CLI session sent as `Authorization: Bearer` is revoked on its own.',
819
890
  hide: false,
820
891
  operationId: 'logout',
821
892
  responses: {
@@ -826,6 +897,22 @@ export function install(options) {
826
897
  summary: 'Sign out',
827
898
  tags: ['Authentication'],
828
899
  }), async (c) => {
900
+ // A CLI session carries only its bearer token; revoke it and leave browser sessions alone.
901
+ const bearer = /^Bearer\s+(.+)$/i.exec(c.req.header('authorization') ?? '')?.[1];
902
+ if (bearer && CliAuth.isToken(bearer)) {
903
+ try {
904
+ await CliAuth.revoke(kv.store, bearer);
905
+ }
906
+ catch (cause) {
907
+ c.error = cause instanceof Error ? cause : new Error('CLI logout failed', { cause });
908
+ return Response.error(c, {
909
+ code: 'session_logout_failed',
910
+ message: 'Session logout failed',
911
+ status: 500,
912
+ });
913
+ }
914
+ return c.body(null, 204);
915
+ }
829
916
  const walletHeaders = (() => {
830
917
  const authorization = c.req.header('authorization');
831
918
  const cookie = c.req.header('cookie');
@@ -906,7 +993,7 @@ export function install(options) {
906
993
  Metadata.attach(app, {
907
994
  securitySchemes: {
908
995
  session: {
909
- description: 'Session cookie established by email OTP, Wallet identity, or SIWE sign-in. Browsers send `tempo_auth.session_token`, `tempo_identity`, or `accounts_auth`; Accounts sessions may also use `Authorization: Bearer <token>`.', // prettier-ignore
996
+ description: 'Session cookie established by email OTP, Wallet identity, or SIWE sign-in. Browsers send `tempo_auth.session_token`, `tempo_identity`, or `accounts_auth`; Accounts sessions may also use `Authorization: Bearer <token>`, and CLI sessions always use `Authorization: Bearer tempo:cli:…`.', // prettier-ignore
910
997
  in: 'header',
911
998
  name: 'Cookie',
912
999
  type: 'apiKey',
@@ -917,7 +1004,6 @@ export function install(options) {
917
1004
  })();
918
1005
  const resolve = createApiKeyResolver({
919
1006
  apiKey: options_middleware.apiKey,
920
- db: options.db,
921
1007
  scopeCatalog,
922
1008
  });
923
1009
  const defaults = laneDefaults(options_middleware);
@@ -930,12 +1016,15 @@ export function install(options) {
930
1016
  : undefined;
931
1017
  return createMiddleware(async (c, next) => {
932
1018
  const credential = getApiKeyCredential(c);
1019
+ recordCredential(c, credential);
933
1020
  const resolved = resolveRequestPolicy(c, { base, defaults, options: options_middleware });
934
1021
  const isSuperAdmin = credential &&
935
1022
  superAdminTokenHash !== undefined &&
936
1023
  ApiKey.hash(credential.token) === superAdminTokenHash;
1024
+ // CLI session tokens are never API keys, so they skip key resolution here too.
937
1025
  const canUseApiKeyQuota = credential &&
938
1026
  !isSuperAdmin &&
1027
+ !CliAuth.isToken(credential.token) &&
939
1028
  !hasPaymentCredential(c) &&
940
1029
  options_middleware.apiKey !== false &&
941
1030
  resolved?.policy?.apiKey &&
@@ -943,11 +1032,20 @@ export function install(options) {
943
1032
  const cached = canUseApiKeyQuota ? resolve.peek(c, credential.token) : undefined;
944
1033
  if (cached)
945
1034
  return next();
946
- const response = await Timing.time(c, 'edge_rate_limit', () => options_edgeRateLimit(c.req.raw));
1035
+ const response = await Timing.time(c, 'edge_rate_limit', () => options_edgeRateLimit(c.req.raw, canUseApiKeyQuota
1036
+ ? {
1037
+ resolvePartition: async () => {
1038
+ const apiKey = cached === undefined ? await resolve.probe(c, credential.token) : cached;
1039
+ // Rotating invalid credentials stays in the anonymous transport bucket.
1040
+ return apiKey ? `api-key:${ApiKey.hash(credential.token)}` : undefined;
1041
+ },
1042
+ }
1043
+ : {}));
947
1044
  if (response)
948
1045
  return response;
1046
+ // Cold keys resolve here, ahead of the auth lane, so time both under one name.
949
1047
  if (canUseApiKeyQuota && cached === undefined)
950
- await resolve.resolve(c, credential.token);
1048
+ await Timing.sum(c, 'auth_key', () => resolve.resolve(c, credential.token));
951
1049
  return next();
952
1050
  });
953
1051
  })();
@@ -1026,7 +1124,9 @@ export function installMppManagementRoutes(app, options = {}) {
1026
1124
  continue;
1027
1125
  if (postPaths.has(target.path))
1028
1126
  throw new Error(`MPP management POST conflicts with an existing route: ${target.path}`);
1029
- const management = policy({ mpp });
1127
+ const management = policy({
1128
+ mpp: { session: mpp.session },
1129
+ });
1030
1130
  management[mppManagementSymbol] = { description: target.description };
1031
1131
  app.post(stripBasePath(target.path, options.basePath), management, OpenApi.describeRoute({ hide: true }));
1032
1132
  }
@@ -1101,6 +1201,7 @@ function resolveApiKeyLane(current, override, default_) {
1101
1201
  return current ?? default_;
1102
1202
  const base = current ?? default_;
1103
1203
  return {
1204
+ bucket: override.bucket ?? base.bucket,
1104
1205
  rateLimit: override.rateLimit ?? base.rateLimit,
1105
1206
  scopes: override.scopes ?? base.scopes,
1106
1207
  };
@@ -1114,6 +1215,7 @@ function resolveMppLane(current, override, default_) {
1114
1215
  return current ?? default_;
1115
1216
  const base = current ?? default_;
1116
1217
  return {
1218
+ bucket: override.bucket ?? base.bucket,
1117
1219
  rateLimit: override.rateLimit ?? base.rateLimit,
1118
1220
  session: { ...base.session, ...override.session },
1119
1221
  };
@@ -1126,7 +1228,10 @@ function resolvePublicLane(current, override, default_) {
1126
1228
  if (override === true)
1127
1229
  return current ?? default_;
1128
1230
  const base = current ?? default_;
1129
- return { rateLimit: override.rateLimit ?? base.rateLimit };
1231
+ return {
1232
+ bucket: override.bucket ?? base.bucket,
1233
+ rateLimit: override.rateLimit ?? base.rateLimit,
1234
+ };
1130
1235
  }
1131
1236
  function resolveSessionLane(current, override, default_) {
1132
1237
  if (override === undefined)
@@ -1273,6 +1378,7 @@ export function require(policy) {
1273
1378
  return createMiddleware(async (c, next) => {
1274
1379
  const auth = c.get('auth');
1275
1380
  const credential = getApiKeyCredential(c);
1381
+ recordCredential(c, credential);
1276
1382
  const hasQueryApiKey = new URL(c.req.url).searchParams.has('key');
1277
1383
  // Auth owns `key`; strict route schemas must not validate it.
1278
1384
  stripApiKeyQuery(c);
@@ -1312,7 +1418,11 @@ export function require(policy) {
1312
1418
  c.set('principal', { actor: 'super_admin', id: 'super_admin', type: 'super_admin' });
1313
1419
  return proceed();
1314
1420
  }
1315
- const apiKey_resolved = await auth.apiKey?.resolve(c, credential.token);
1421
+ // CLI session tokens are prefixed, so they skip the API-key lookup.
1422
+ const cliToken = CliAuth.isToken(credential.token);
1423
+ const apiKey_resolved = cliToken
1424
+ ? null
1425
+ : await Timing.sum(c, 'auth_key', () => auth.apiKey?.resolve(c, credential.token));
1316
1426
  if (!apiKey_resolved) {
1317
1427
  if (unsupportedChain)
1318
1428
  return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
@@ -1326,6 +1436,18 @@ export function require(policy) {
1326
1436
  return proceed();
1327
1437
  }
1328
1438
  }
1439
+ if (cliToken)
1440
+ return jsonError(c, policy.session
1441
+ ? {
1442
+ code: 'session_invalid',
1443
+ message: 'CLI session is invalid or expired. Sign in again.',
1444
+ status: 401,
1445
+ }
1446
+ : {
1447
+ code: 'forbidden',
1448
+ message: 'CLI sessions cannot call this route. Use an API key.',
1449
+ status: 403,
1450
+ });
1329
1451
  return jsonError(c, {
1330
1452
  code: 'api_key_invalid',
1331
1453
  message: 'Invalid API key',
@@ -1360,12 +1482,15 @@ export function require(policy) {
1360
1482
  ? (policy.public?.rateLimit ?? auth.publicRateLimit ?? { limit: 60, period: 'minute' })
1361
1483
  : resolveApiKeyLimit({ apiKey, auth, policy: policy.apiKey, scope });
1362
1484
  const paid = hasPayment && !throttled;
1485
+ const bucket = policy.apiKey.bucket;
1363
1486
  const result = paid
1364
1487
  ? null
1365
- : await consumeRateLimit(auth, {
1366
- key: `api_key:${apiKey.id}:scope:${scope}`,
1488
+ : await Timing.time(c, 'rate_limit', () => consumeRateLimit(auth, {
1489
+ key: rateLimitKey(`api_key:${apiKey.id}:scope:${scope}`, bucket),
1367
1490
  limit,
1368
- });
1491
+ principal: `api_key:${apiKey.id}`,
1492
+ waitUntil: ExecutionContext.waitUntil(c),
1493
+ }));
1369
1494
  if (result) {
1370
1495
  setRateLimitHeaders(c, result);
1371
1496
  // Surface the bucket so callers can correlate a 429 with the exhausted
@@ -1398,7 +1523,7 @@ export function require(policy) {
1398
1523
  if (missing.length > 0)
1399
1524
  return jsonError(c, {
1400
1525
  code: 'api_key_forbidden',
1401
- message: 'API key missing required scope',
1526
+ message: `API key is missing required permissions: ${missing.join(', ')}. Use an API key with these scopes.`,
1402
1527
  status: 403,
1403
1528
  });
1404
1529
  if (paid)
@@ -1445,10 +1570,12 @@ export function require(policy) {
1445
1570
  }
1446
1571
  const limit = policy.public?.rateLimit;
1447
1572
  if (limit) {
1448
- const result = await consumeRateLimit(auth, {
1449
- key: `public:${publicPrincipal.id}`,
1573
+ const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(auth, {
1574
+ key: rateLimitKey(`public:${publicPrincipal.id}`, policy.public?.bucket),
1450
1575
  limit,
1451
- });
1576
+ principal: `public:${publicPrincipal.id}`,
1577
+ waitUntil: ExecutionContext.waitUntil(c),
1578
+ }));
1452
1579
  if (result)
1453
1580
  setRateLimitHeaders(c, result);
1454
1581
  if (!result || result.allowed) {
@@ -1489,6 +1616,10 @@ export function require(policy) {
1489
1616
  * server-side — we just stop waiting for it.
1490
1617
  */
1491
1618
  const rateLimitConsumeTimeout = 300;
1619
+ /** Accepts a ready store or builds the counter-backed default from its options. */
1620
+ function rateLimitStore(options) {
1621
+ return options && 'consume' in options ? options : RateLimit.memory(options);
1622
+ }
1492
1623
  /** Consumes one quota and returns null when its counter is unavailable, allowing callers to fail open. */
1493
1624
  export function consumeRateLimit(auth, options) {
1494
1625
  if (!auth.rateLimit)
@@ -1572,11 +1703,20 @@ function getApiKeyCredential(c) {
1572
1703
  return { token: apiKey };
1573
1704
  return null;
1574
1705
  }
1706
+ // Recorded before any lookup: requests that stall or are canceled during
1707
+ // resolution never receive a principal, but still need caller attribution.
1708
+ function recordCredential(c, credential) {
1709
+ if (credential)
1710
+ c.set('credential', 'api_key');
1711
+ else if (hasPaymentCredential(c))
1712
+ c.set('credential', 'payment');
1713
+ }
1575
1714
  function clientIp(c, auth) {
1576
- return auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip');
1715
+ return (trustedClientIps.get(c.req.raw) ??
1716
+ (auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip')));
1577
1717
  }
1578
1718
  function trustedClientIp(c, auth) {
1579
- return resolveTrustedClientIp(c.req.raw, auth.publicClientIp);
1719
+ return trustedClientIps.get(c.req.raw) ?? resolveTrustedClientIp(c.req.raw, auth.publicClientIp);
1580
1720
  }
1581
1721
  function resolveTrustedClientIp(request, resolve) {
1582
1722
  if (resolve)
@@ -1697,10 +1837,12 @@ function principalFromPublic(c, auth) {
1697
1837
  }
1698
1838
  async function requirePayment(c, next, options) {
1699
1839
  if (hasPaymentCredential(c)) {
1700
- const result = await consumeRateLimit(options.auth, {
1701
- key: `mpp:${options.principal.type}:${options.principal.id}`,
1840
+ const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(options.auth, {
1841
+ key: rateLimitKey(`mpp:${options.principal.type}:${options.principal.id}`, options.policy.mpp?.bucket),
1702
1842
  limit: options.policy.mpp?.rateLimit ?? options.auth.mpp?.rateLimit ?? defaultMppRateLimit,
1703
- });
1843
+ principal: `mpp:${options.principal.type}:${options.principal.id}`,
1844
+ waitUntil: ExecutionContext.waitUntil(c),
1845
+ }));
1704
1846
  if (result) {
1705
1847
  setRateLimitHeaders(c, result);
1706
1848
  c.header('RateLimit-Scope', 'mpp');
@@ -1748,6 +1890,9 @@ function requirePaymentOrRateLimit(c, next, options) {
1748
1890
  return requirePayment(c, next, options);
1749
1891
  return rateLimitExceeded(c, options.rateLimit);
1750
1892
  }
1893
+ function rateLimitKey(key, bucket) {
1894
+ return bucket === undefined ? key : `${key}:bucket:${bucket}`;
1895
+ }
1751
1896
  /** Emits a `429` with a `Retry-After` derived from the window reset. */
1752
1897
  function rateLimitExceeded(c, result) {
1753
1898
  c.header('Retry-After', String(Math.max(result.reset - Math.ceil(Date.now() / 1_000), 1)));
@@ -1778,18 +1923,12 @@ async function resolveSession(c, auth) {
1778
1923
  /** Maximum resolve-cache entries held per isolate before eviction. */
1779
1924
  const cachedMaxEntries = 10_000;
1780
1925
  /**
1781
- * Wraps token resolution with a short-TTL per-isolate cache so hot keys skip
1782
- * the backend read on every request. Positive results cache for `ttl`
1783
- * (default 60s), negative for `negativeTtl` (default 10s) so a freshly minted
1784
- * key is usable quickly; concurrent misses for one token are single-flighted.
1785
- * Entries are keyed by the token's sha256 (`ApiKey.hash`) — never the
1786
- * plaintext. Key updates may remain stale for up to `ttl`, the accepted
1787
- * trade-off for removing a backend read from the auth path.
1926
+ * Caches completed resolutions per isolate by token hash, with positive and negative TTLs.
1927
+ * Each miss resolves independently so callers never await another request's pending I/O.
1788
1928
  */
1789
- function cachedResolve(resolve, options) {
1929
+ export function cachedResolve(resolve, options) {
1790
1930
  const { negativeTtl = 10_000, now = Date.now, ttl = 60_000 } = options;
1791
1931
  const cells = new Map();
1792
- const flights = new Map();
1793
1932
  return {
1794
1933
  invalidate(token) {
1795
1934
  cells.delete(`v1:${ApiKey.hash(token)}`);
@@ -1812,31 +1951,19 @@ function cachedResolve(resolve, options) {
1812
1951
  return cell.value;
1813
1952
  if (cell)
1814
1953
  cells.delete(key);
1815
- const existing = flights.get(key);
1816
- if (existing)
1817
- return existing;
1818
- const flight = (async () => {
1819
- const value = await resolve(c, token);
1820
- // Bound the cache: random invalid tokens each add a (negative) entry,
1821
- // so sweep expired cells at the cap and then drop the oldest.
1822
- if (cells.size >= cachedMaxEntries) {
1823
- const time = now();
1824
- for (const [name, entry] of cells)
1825
- if (entry.expiresAt <= time)
1826
- cells.delete(name);
1827
- while (cells.size >= cachedMaxEntries)
1828
- cells.delete(cells.keys().next().value);
1829
- }
1830
- cells.set(key, { expiresAt: now() + (value ? ttl : negativeTtl), value });
1831
- return value;
1832
- })();
1833
- flights.set(key, flight);
1834
- try {
1835
- return await flight;
1836
- }
1837
- finally {
1838
- flights.delete(key);
1954
+ const value = await resolve(c, token);
1955
+ // Bound the cache: random invalid tokens each add a (negative) entry,
1956
+ // so sweep expired cells at the cap and then drop the oldest.
1957
+ if (cells.size >= cachedMaxEntries) {
1958
+ const time = now();
1959
+ for (const [name, entry] of cells)
1960
+ if (entry.expiresAt <= time)
1961
+ cells.delete(name);
1962
+ while (cells.size >= cachedMaxEntries)
1963
+ cells.delete(cells.keys().next().value);
1839
1964
  }
1965
+ cells.set(key, { expiresAt: now() + (value ? ttl : negativeTtl), value });
1966
+ return value;
1840
1967
  },
1841
1968
  };
1842
1969
  }