tapimo 0.14.0 → 0.15.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 (1141) hide show
  1. package/README.md +7 -4
  2. package/dist/ApiKey.js +1 -1
  3. package/dist/ApiKey.js.map +1 -1
  4. package/dist/ApiKeys.d.ts +95 -14
  5. package/dist/ApiKeys.d.ts.map +1 -1
  6. package/dist/ApiKeys.js +360 -49
  7. package/dist/ApiKeys.js.map +1 -1
  8. package/dist/App.d.ts +12457 -10365
  9. package/dist/App.d.ts.map +1 -1
  10. package/dist/App.js +300 -22
  11. package/dist/App.js.map +1 -1
  12. package/dist/Assets.d.ts.map +1 -1
  13. package/dist/Assets.js +2 -1
  14. package/dist/Assets.js.map +1 -1
  15. package/dist/Handler.d.ts +0 -1
  16. package/dist/Handler.d.ts.map +1 -1
  17. package/dist/Handler.js +0 -1
  18. package/dist/Handler.js.map +1 -1
  19. package/dist/Scope.d.ts +13 -5
  20. package/dist/Scope.d.ts.map +1 -1
  21. package/dist/Scope.js +16 -5
  22. package/dist/Scope.js.map +1 -1
  23. package/dist/Webhooks.js +1 -1
  24. package/dist/Webhooks.js.map +1 -1
  25. package/dist/admin/App.d.ts +3057 -549
  26. package/dist/admin/App.d.ts.map +1 -1
  27. package/dist/admin/App.js +26 -5
  28. package/dist/admin/App.js.map +1 -1
  29. package/dist/admin/apps/api-keys.d.ts +159 -7
  30. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  31. package/dist/admin/apps/api-keys.js +95 -43
  32. package/dist/admin/apps/api-keys.js.map +1 -1
  33. package/dist/admin/apps/earn-vaults.d.ts +1398 -0
  34. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  35. package/dist/admin/apps/earn-vaults.js +463 -7
  36. package/dist/admin/apps/earn-vaults.js.map +1 -1
  37. package/dist/admin/apps/organizations.d.ts +267 -15
  38. package/dist/admin/apps/organizations.d.ts.map +1 -1
  39. package/dist/admin/apps/organizations.js +241 -25
  40. package/dist/admin/apps/organizations.js.map +1 -1
  41. package/dist/admin/apps/routes-support.d.ts +95 -0
  42. package/dist/admin/apps/routes-support.d.ts.map +1 -0
  43. package/dist/admin/apps/routes-support.js +151 -0
  44. package/dist/admin/apps/routes-support.js.map +1 -0
  45. package/dist/admin/apps/routes.d.ts +2764 -0
  46. package/dist/admin/apps/routes.d.ts.map +1 -0
  47. package/dist/admin/apps/routes.js +728 -0
  48. package/dist/admin/apps/routes.js.map +1 -0
  49. package/dist/admin/apps/subsidies.d.ts +501 -0
  50. package/dist/admin/apps/subsidies.d.ts.map +1 -0
  51. package/dist/admin/apps/subsidies.js +384 -0
  52. package/dist/admin/apps/subsidies.js.map +1 -0
  53. package/dist/admin/apps/verified-tokens.d.ts +88 -88
  54. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  55. package/dist/admin/apps/verified-tokens.js +3 -3
  56. package/dist/admin/apps/verified-tokens.js.map +1 -1
  57. package/dist/admin/ui.generated.d.ts +1 -1
  58. package/dist/admin/ui.generated.d.ts.map +1 -1
  59. package/dist/admin/ui.generated.js +129 -69
  60. package/dist/admin/ui.generated.js.map +1 -1
  61. package/dist/analytics/Analytics.d.ts +5 -2
  62. package/dist/analytics/Analytics.d.ts.map +1 -1
  63. package/dist/analytics/Analytics.js +31 -1
  64. package/dist/analytics/Analytics.js.map +1 -1
  65. package/dist/analytics/tables/requestEvents.d.ts +2 -1
  66. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  67. package/dist/analytics/tables/requestEvents.js +10 -1
  68. package/dist/analytics/tables/requestEvents.js.map +1 -1
  69. package/dist/analytics/tables/routesLifecycleIntervals.d.ts +72 -0
  70. package/dist/analytics/tables/routesLifecycleIntervals.d.ts.map +1 -0
  71. package/dist/analytics/tables/routesLifecycleIntervals.js +56 -0
  72. package/dist/analytics/tables/routesLifecycleIntervals.js.map +1 -0
  73. package/dist/apps/Zones.d.ts +21 -12526
  74. package/dist/apps/Zones.d.ts.map +1 -1
  75. package/dist/apps/Zones.js +37 -5
  76. package/dist/apps/Zones.js.map +1 -1
  77. package/dist/apps/data/App.d.ts +3971 -2595
  78. package/dist/apps/data/App.d.ts.map +1 -1
  79. package/dist/apps/data/App.js +76 -21
  80. package/dist/apps/data/App.js.map +1 -1
  81. package/dist/apps/data/routes/activities.d.ts +364 -34
  82. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  83. package/dist/apps/data/routes/activities.js +495 -190
  84. package/dist/apps/data/routes/activities.js.map +1 -1
  85. package/dist/apps/data/routes/addresses.d.ts +72 -0
  86. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  87. package/dist/apps/data/routes/blocks.d.ts +37 -37
  88. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  89. package/dist/apps/data/routes/coingecko.js +47 -21
  90. package/dist/apps/data/routes/coingecko.js.map +1 -1
  91. package/dist/apps/data/routes/earn.d.ts +1450 -337
  92. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  93. package/dist/apps/data/routes/earn.js +1226 -144
  94. package/dist/apps/data/routes/earn.js.map +1 -1
  95. package/dist/apps/data/routes/fee-amm.d.ts +5 -0
  96. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  97. package/dist/apps/data/routes/fee-amm.js +31 -19
  98. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  99. package/dist/apps/data/routes/indexer.d.ts +125 -0
  100. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  101. package/dist/apps/data/routes/indexer.js +83 -27
  102. package/dist/apps/data/routes/indexer.js.map +1 -1
  103. package/dist/apps/data/routes/rpc.d.ts +507 -33
  104. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  105. package/dist/apps/data/routes/rpc.js +266 -156
  106. package/dist/apps/data/routes/rpc.js.map +1 -1
  107. package/dist/apps/data/routes/tokenlist.d.ts +47 -15
  108. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  109. package/dist/apps/data/routes/tokenlist.js +68 -11
  110. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  111. package/dist/apps/data/routes/tokens.d.ts +2 -0
  112. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  113. package/dist/apps/data/routes/tokens.js +26 -14
  114. package/dist/apps/data/routes/tokens.js.map +1 -1
  115. package/dist/apps/data/routes/transfers.d.ts +28 -12
  116. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  117. package/dist/apps/data/routes/transfers.js +9 -7
  118. package/dist/apps/data/routes/transfers.js.map +1 -1
  119. package/dist/apps/data/routes/valuation.d.ts +30 -30
  120. package/dist/apps/data/routes/verified-tokens.d.ts +9 -9
  121. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  122. package/dist/apps/data/routes/verified-tokens.js +64 -20
  123. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  124. package/dist/apps/data/routes/webhooks.d.ts +613 -176
  125. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  126. package/dist/apps/data/routes/webhooks.js +291 -195
  127. package/dist/apps/data/routes/webhooks.js.map +1 -1
  128. package/dist/apps/data/routes/zones.d.ts.map +1 -1
  129. package/dist/apps/data/routes/zones.js +20 -12
  130. package/dist/apps/data/routes/zones.js.map +1 -1
  131. package/dist/apps/docs/reference.js +2 -2
  132. package/dist/apps/docs/reference.js.map +1 -1
  133. package/dist/apps/index.d.ts +1 -1
  134. package/dist/apps/index.d.ts.map +1 -1
  135. package/dist/apps/index.js +1 -1
  136. package/dist/apps/index.js.map +1 -1
  137. package/dist/apps/management/App.d.ts +3763 -3385
  138. package/dist/apps/management/App.d.ts.map +1 -1
  139. package/dist/apps/management/App.js +5 -14
  140. package/dist/apps/management/App.js.map +1 -1
  141. package/dist/apps/management/Billing.d.ts +48 -7
  142. package/dist/apps/management/Billing.d.ts.map +1 -1
  143. package/dist/apps/management/Billing.js +204 -25
  144. package/dist/apps/management/Billing.js.map +1 -1
  145. package/dist/apps/management/routes/api-keys.d.ts +106 -4
  146. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  147. package/dist/apps/management/routes/api-keys.js +43 -15
  148. package/dist/apps/management/routes/api-keys.js.map +1 -1
  149. package/dist/apps/management/routes/billing.d.ts +290 -4
  150. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  151. package/dist/apps/management/routes/billing.js +274 -49
  152. package/dist/apps/management/routes/billing.js.map +1 -1
  153. package/dist/apps/management/routes/faucet.d.ts +6 -6
  154. package/dist/apps/management/routes/faucet.js +1 -1
  155. package/dist/apps/management/routes/faucet.js.map +1 -1
  156. package/dist/apps/management/routes/invitations.d.ts +77 -2
  157. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  158. package/dist/apps/management/routes/invitations.js +117 -13
  159. package/dist/apps/management/routes/invitations.js.map +1 -1
  160. package/dist/apps/management/routes/invite-links.d.ts +4 -4
  161. package/dist/apps/management/routes/me.d.ts.map +1 -1
  162. package/dist/apps/management/routes/me.js +6 -2
  163. package/dist/apps/management/routes/me.js.map +1 -1
  164. package/dist/apps/management/routes/members.d.ts +30 -30
  165. package/dist/apps/management/routes/orgs.d.ts +18 -2
  166. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  167. package/dist/apps/management/routes/orgs.js +52 -12
  168. package/dist/apps/management/routes/orgs.js.map +1 -1
  169. package/dist/apps/management/routes/projects.d.ts +4 -4
  170. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  171. package/dist/apps/management/routes/projects.js +6 -1
  172. package/dist/apps/management/routes/projects.js.map +1 -1
  173. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  174. package/dist/apps/management/routes/scopes.js +4 -1
  175. package/dist/apps/management/routes/scopes.js.map +1 -1
  176. package/dist/apps/management/routes/usage.d.ts +24 -24
  177. package/dist/apps/management/routes/usage.js +21 -4
  178. package/dist/apps/management/routes/usage.js.map +1 -1
  179. package/dist/apps/management/routes/verified-token-requests.d.ts +2 -2
  180. package/dist/apps/management/routes/webhooks.d.ts +280 -214
  181. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  182. package/dist/apps/management/routes/webhooks.js +58 -12
  183. package/dist/apps/management/routes/webhooks.js.map +1 -1
  184. package/dist/apps/mcp.d.ts +1 -1
  185. package/dist/apps/mcp.js +7 -7
  186. package/dist/apps/mcp.js.map +1 -1
  187. package/dist/apps/mpp/App.d.ts.map +1 -1
  188. package/dist/apps/mpp/App.js +35 -7
  189. package/dist/apps/mpp/App.js.map +1 -1
  190. package/dist/apps/mpp/internal/Adapter.d.ts +2 -0
  191. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  192. package/dist/apps/mpp/internal/Adapter.js +30 -1
  193. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  194. package/dist/apps/mpp/internal/Policy.d.ts +22 -4
  195. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  196. package/dist/apps/mpp/internal/Policy.js +24 -6
  197. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  198. package/dist/apps/mpp/internal/Sponsorship.d.ts +3 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  200. package/dist/apps/mpp/internal/Sponsorship.js +6 -3
  201. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  202. package/dist/apps/relay/App.d.ts +2 -0
  203. package/dist/apps/relay/App.d.ts.map +1 -1
  204. package/dist/apps/relay/App.js +134 -75
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/relay/Sponsorships.d.ts +5 -3
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  208. package/dist/apps/relay/Sponsorships.js +209 -28
  209. package/dist/apps/relay/Sponsorships.js.map +1 -1
  210. package/dist/apps/{funding → routes}/Access.d.ts +4 -4
  211. package/dist/apps/routes/Access.d.ts.map +1 -0
  212. package/dist/apps/{funding → routes}/Access.js +4 -4
  213. package/dist/apps/routes/Access.js.map +1 -0
  214. package/dist/apps/{funding → routes}/App.d.ts +418 -124
  215. package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
  216. package/dist/apps/{funding → routes}/App.js +16 -16
  217. package/dist/apps/routes/App.js.map +1 -0
  218. package/dist/apps/routes/Inventory.d.ts.map +1 -0
  219. package/dist/apps/{funding → routes}/Inventory.js +2 -2
  220. package/dist/apps/routes/Inventory.js.map +1 -0
  221. package/dist/apps/routes/index.d.ts +2 -0
  222. package/dist/apps/routes/index.d.ts.map +1 -0
  223. package/dist/apps/routes/index.js +2 -0
  224. package/dist/apps/routes/index.js.map +1 -0
  225. package/dist/apps/{funding → routes}/routes/chains.d.ts +7 -7
  226. package/dist/apps/routes/routes/chains.d.ts.map +1 -0
  227. package/dist/apps/{funding → routes}/routes/chains.js +25 -25
  228. package/dist/apps/routes/routes/chains.js.map +1 -0
  229. package/dist/apps/{funding → routes}/routes/deposit-addresses.d.ts +107 -43
  230. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
  231. package/dist/apps/{funding → routes}/routes/deposit-addresses.js +497 -222
  232. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -0
  233. package/dist/apps/{funding → routes}/routes/providers.d.ts +8 -8
  234. package/dist/apps/routes/routes/providers.d.ts.map +1 -0
  235. package/dist/apps/routes/routes/providers.js +57 -0
  236. package/dist/apps/routes/routes/providers.js.map +1 -0
  237. package/dist/apps/{funding → routes}/routes/quotes.d.ts +19 -16
  238. package/dist/apps/routes/routes/quotes.d.ts.map +1 -0
  239. package/dist/apps/{funding → routes}/routes/quotes.js +55 -38
  240. package/dist/apps/routes/routes/quotes.js.map +1 -0
  241. package/dist/apps/{funding → routes}/routes/transfers.d.ts +379 -74
  242. package/dist/apps/routes/routes/transfers.d.ts.map +1 -0
  243. package/dist/apps/routes/routes/transfers.js +1140 -0
  244. package/dist/apps/routes/routes/transfers.js.map +1 -0
  245. package/dist/cli/Cli.d.ts +30 -0
  246. package/dist/cli/Cli.d.ts.map +1 -1
  247. package/dist/cli/commands/admin.d.ts +36 -0
  248. package/dist/cli/commands/admin.d.ts.map +1 -1
  249. package/dist/cli/commands/admin.js +273 -0
  250. package/dist/cli/commands/admin.js.map +1 -1
  251. package/dist/cloudflare.d.ts +16 -14
  252. package/dist/cloudflare.d.ts.map +1 -1
  253. package/dist/cloudflare.js +26 -21
  254. package/dist/cloudflare.js.map +1 -1
  255. package/dist/db/Db.d.ts +63 -21
  256. package/dist/db/Db.d.ts.map +1 -1
  257. package/dist/db/Db.js +1030 -15
  258. package/dist/db/Db.js.map +1 -1
  259. package/dist/db/Schema.d.ts +780 -133
  260. package/dist/db/Schema.d.ts.map +1 -1
  261. package/dist/db/Schema.js +575 -162
  262. package/dist/db/Schema.js.map +1 -1
  263. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts +4 -0
  264. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts.map +1 -0
  265. package/dist/db/tables/apiKeyAdmissionBootstraps.js +2 -0
  266. package/dist/db/tables/apiKeyAdmissionBootstraps.js.map +1 -0
  267. package/dist/db/tables/apiKeyAdmissions.d.ts +73 -0
  268. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -0
  269. package/dist/db/tables/apiKeyAdmissions.js +142 -0
  270. package/dist/db/tables/apiKeyAdmissions.js.map +1 -0
  271. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts +4 -0
  272. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts.map +1 -0
  273. package/dist/db/tables/apiKeyOwnerAdmissions.js +2 -0
  274. package/dist/db/tables/apiKeyOwnerAdmissions.js.map +1 -0
  275. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +20 -0
  276. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -0
  277. package/dist/db/tables/apiKeyOwnerTombstones.js +57 -0
  278. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -0
  279. package/dist/db/tables/apiKeyRevocations.d.ts +21 -0
  280. package/dist/db/tables/apiKeyRevocations.d.ts.map +1 -0
  281. package/dist/db/tables/apiKeyRevocations.js +98 -0
  282. package/dist/db/tables/apiKeyRevocations.js.map +1 -0
  283. package/dist/db/tables/authAccounts.d.ts +47 -0
  284. package/dist/db/tables/authAccounts.d.ts.map +1 -0
  285. package/dist/db/tables/authAccounts.js +72 -0
  286. package/dist/db/tables/authAccounts.js.map +1 -0
  287. package/dist/db/tables/authSessions.d.ts +12 -0
  288. package/dist/db/tables/authSessions.d.ts.map +1 -0
  289. package/dist/db/tables/authSessions.js +2 -0
  290. package/dist/db/tables/authSessions.js.map +1 -0
  291. package/dist/db/tables/authVerifications.d.ts +12 -0
  292. package/dist/db/tables/authVerifications.d.ts.map +1 -0
  293. package/dist/db/tables/authVerifications.js +2 -0
  294. package/dist/db/tables/authVerifications.js.map +1 -0
  295. package/dist/db/tables/invitations.d.ts +17 -1
  296. package/dist/db/tables/invitations.d.ts.map +1 -1
  297. package/dist/db/tables/invitations.js +123 -43
  298. package/dist/db/tables/invitations.js.map +1 -1
  299. package/dist/db/tables/memberships.d.ts +8 -0
  300. package/dist/db/tables/memberships.d.ts.map +1 -1
  301. package/dist/db/tables/memberships.js +51 -2
  302. package/dist/db/tables/memberships.js.map +1 -1
  303. package/dist/db/tables/organizations.d.ts +32 -10
  304. package/dist/db/tables/organizations.d.ts.map +1 -1
  305. package/dist/db/tables/organizations.js +110 -49
  306. package/dist/db/tables/organizations.js.map +1 -1
  307. package/dist/db/tables/projects.d.ts +2 -0
  308. package/dist/db/tables/projects.d.ts.map +1 -1
  309. package/dist/db/tables/projects.js +12 -3
  310. package/dist/db/tables/projects.js.map +1 -1
  311. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  312. package/dist/db/tables/requestUsage.js.map +1 -1
  313. package/dist/db/tables/rewardAccounts.d.ts +86 -0
  314. package/dist/db/tables/rewardAccounts.d.ts.map +1 -0
  315. package/dist/db/tables/rewardAccounts.js +88 -0
  316. package/dist/db/tables/rewardAccounts.js.map +1 -0
  317. package/dist/db/tables/rewardCampaignDistributors.d.ts +36 -0
  318. package/dist/db/tables/rewardCampaignDistributors.d.ts.map +1 -0
  319. package/dist/db/tables/rewardCampaignDistributors.js +30 -0
  320. package/dist/db/tables/rewardCampaignDistributors.js.map +1 -0
  321. package/dist/db/tables/rewardCampaigns.d.ts +171 -0
  322. package/dist/db/tables/rewardCampaigns.d.ts.map +1 -0
  323. package/dist/db/tables/rewardCampaigns.js +392 -0
  324. package/dist/db/tables/rewardCampaigns.js.map +1 -0
  325. package/dist/db/tables/rewardCredits.d.ts +53 -0
  326. package/dist/db/tables/rewardCredits.d.ts.map +1 -0
  327. package/dist/db/tables/rewardCredits.js +63 -0
  328. package/dist/db/tables/rewardCredits.js.map +1 -0
  329. package/dist/db/tables/rewardEligibilityAssociations.d.ts +61 -0
  330. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -0
  331. package/dist/db/tables/rewardEligibilityAssociations.js +103 -0
  332. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -0
  333. package/dist/db/tables/rewardRuns.d.ts +188 -0
  334. package/dist/db/tables/rewardRuns.d.ts.map +1 -0
  335. package/dist/db/tables/rewardRuns.js +278 -0
  336. package/dist/db/tables/rewardRuns.js.map +1 -0
  337. package/dist/db/tables/rewardTransactionAttempts.d.ts +100 -0
  338. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -0
  339. package/dist/db/tables/rewardTransactionAttempts.js +163 -0
  340. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -0
  341. package/dist/db/tables/routesCatalog.d.ts +58 -0
  342. package/dist/db/tables/routesCatalog.d.ts.map +1 -0
  343. package/dist/db/tables/{fundingCatalog.js → routesCatalog.js} +19 -19
  344. package/dist/db/tables/routesCatalog.js.map +1 -0
  345. package/dist/db/tables/routesDepositAddresses.d.ts +476 -0
  346. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -0
  347. package/dist/db/tables/routesDepositAddresses.js +587 -0
  348. package/dist/db/tables/routesDepositAddresses.js.map +1 -0
  349. package/dist/db/tables/{fundingDepositRequestObservations.d.ts → routesDepositRequestObservations.d.ts} +6 -6
  350. package/dist/db/tables/routesDepositRequestObservations.d.ts.map +1 -0
  351. package/dist/db/tables/{fundingDepositRequestObservations.js → routesDepositRequestObservations.js} +6 -6
  352. package/dist/db/tables/routesDepositRequestObservations.js.map +1 -0
  353. package/dist/db/tables/{fundingDeposits.d.ts → routesDeposits.d.ts} +210 -22
  354. package/dist/db/tables/routesDeposits.d.ts.map +1 -0
  355. package/dist/db/tables/routesDeposits.js +576 -0
  356. package/dist/db/tables/routesDeposits.js.map +1 -0
  357. package/dist/db/tables/routesIdempotency.d.ts +166 -0
  358. package/dist/db/tables/routesIdempotency.d.ts.map +1 -0
  359. package/dist/db/tables/routesIdempotency.js +330 -0
  360. package/dist/db/tables/routesIdempotency.js.map +1 -0
  361. package/dist/db/tables/routesSubsidies.d.ts +27 -0
  362. package/dist/db/tables/routesSubsidies.d.ts.map +1 -0
  363. package/dist/db/tables/routesSubsidies.js +45 -0
  364. package/dist/db/tables/routesSubsidies.js.map +1 -0
  365. package/dist/db/tables/{fundingTransferEvents.d.ts → routesTransferEvents.d.ts} +3 -3
  366. package/dist/db/tables/routesTransferEvents.d.ts.map +1 -0
  367. package/dist/db/tables/{fundingTransferEvents.js → routesTransferEvents.js} +3 -3
  368. package/dist/db/tables/routesTransferEvents.js.map +1 -0
  369. package/dist/db/tables/routesTransferSubsidies.d.ts +19 -0
  370. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -0
  371. package/dist/db/tables/routesTransferSubsidies.js +17 -0
  372. package/dist/db/tables/routesTransferSubsidies.js.map +1 -0
  373. package/dist/db/tables/routesTransferSubsidyNonces.d.ts +51 -0
  374. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -0
  375. package/dist/db/tables/routesTransferSubsidyNonces.js +82 -0
  376. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -0
  377. package/dist/db/tables/routesTransferTransactions.d.ts +77 -0
  378. package/dist/db/tables/routesTransferTransactions.d.ts.map +1 -0
  379. package/dist/db/tables/{fundingTransferTransactions.js → routesTransferTransactions.js} +31 -13
  380. package/dist/db/tables/routesTransferTransactions.js.map +1 -0
  381. package/dist/db/tables/routesTransfers.d.ts +319 -0
  382. package/dist/db/tables/routesTransfers.d.ts.map +1 -0
  383. package/dist/db/tables/routesTransfers.js +372 -0
  384. package/dist/db/tables/routesTransfers.js.map +1 -0
  385. package/dist/db/tables/sponsoredTransactions.d.ts +75 -20
  386. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  387. package/dist/db/tables/sponsoredTransactions.js +124 -54
  388. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  389. package/dist/db/tables/sponsorshipAttributions.d.ts +69 -0
  390. package/dist/db/tables/sponsorshipAttributions.d.ts.map +1 -0
  391. package/dist/db/tables/sponsorshipAttributions.js +77 -0
  392. package/dist/db/tables/sponsorshipAttributions.js.map +1 -0
  393. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts +22 -0
  394. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts.map +1 -0
  395. package/dist/db/tables/sponsorshipReconciliationCursors.js +45 -0
  396. package/dist/db/tables/sponsorshipReconciliationCursors.js.map +1 -0
  397. package/dist/db/tables/stripeCustomers.d.ts +11 -0
  398. package/dist/db/tables/stripeCustomers.d.ts.map +1 -1
  399. package/dist/db/tables/stripeCustomers.js +13 -0
  400. package/dist/db/tables/stripeCustomers.js.map +1 -1
  401. package/dist/db/tables/users.d.ts +17 -1
  402. package/dist/db/tables/users.d.ts.map +1 -1
  403. package/dist/db/tables/users.js +47 -2
  404. package/dist/db/tables/users.js.map +1 -1
  405. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  406. package/dist/db/tables/webhookQueueEvents.js +5 -1
  407. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  408. package/dist/db/tables/webhookSubscriptions.d.ts +19 -11
  409. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  410. package/dist/db/tables/webhookSubscriptions.js +45 -13
  411. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  412. package/dist/handlers/internal/executionError.d.ts +2 -2
  413. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  414. package/dist/handlers/internal/executionError.js +1 -2
  415. package/dist/handlers/internal/executionError.js.map +1 -1
  416. package/dist/handlers/internal/multisig.d.ts +4 -232
  417. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  418. package/dist/handlers/internal/multisig.js +11 -537
  419. package/dist/handlers/internal/multisig.js.map +1 -1
  420. package/dist/handlers/internal/sponsorship.d.ts +19 -8
  421. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  422. package/dist/handlers/internal/sponsorship.js +13 -9
  423. package/dist/handlers/internal/sponsorship.js.map +1 -1
  424. package/dist/handlers/relay.d.ts +9 -12
  425. package/dist/handlers/relay.d.ts.map +1 -1
  426. package/dist/handlers/relay.js +81 -85
  427. package/dist/handlers/relay.js.map +1 -1
  428. package/dist/index.d.ts +0 -17
  429. package/dist/index.d.ts.map +1 -1
  430. package/dist/index.js +0 -17
  431. package/dist/index.js.map +1 -1
  432. package/dist/internal/AssetResponse.d.ts +12 -0
  433. package/dist/internal/AssetResponse.d.ts.map +1 -0
  434. package/dist/internal/AssetResponse.js +21 -0
  435. package/dist/internal/AssetResponse.js.map +1 -0
  436. package/dist/internal/Auth.d.ts +48 -12
  437. package/dist/internal/Auth.d.ts.map +1 -1
  438. package/dist/internal/Auth.js +603 -175
  439. package/dist/internal/Auth.js.map +1 -1
  440. package/dist/internal/BetterAuth.d.ts +1488 -0
  441. package/dist/internal/BetterAuth.d.ts.map +1 -0
  442. package/dist/internal/BetterAuth.js +253 -0
  443. package/dist/internal/BetterAuth.js.map +1 -0
  444. package/dist/internal/Cache.d.ts +2 -0
  445. package/dist/internal/Cache.d.ts.map +1 -1
  446. package/dist/internal/Cache.js +2 -0
  447. package/dist/internal/Cache.js.map +1 -1
  448. package/dist/internal/EarnRates.d.ts +26 -3
  449. package/dist/internal/EarnRates.d.ts.map +1 -1
  450. package/dist/internal/EarnRates.js +84 -19
  451. package/dist/internal/EarnRates.js.map +1 -1
  452. package/dist/internal/EarnSharePrices.d.ts +120 -0
  453. package/dist/internal/EarnSharePrices.d.ts.map +1 -0
  454. package/dist/internal/EarnSharePrices.js +179 -0
  455. package/dist/internal/EarnSharePrices.js.map +1 -0
  456. package/dist/internal/EarnVaults.d.ts +4 -0
  457. package/dist/internal/EarnVaults.d.ts.map +1 -1
  458. package/dist/internal/EarnVaults.js +27 -10
  459. package/dist/internal/EarnVaults.js.map +1 -1
  460. package/dist/internal/Email.d.ts +37 -0
  461. package/dist/internal/Email.d.ts.map +1 -0
  462. package/dist/internal/Email.js +16 -0
  463. package/dist/internal/Email.js.map +1 -0
  464. package/dist/internal/Log.d.ts +32 -28
  465. package/dist/internal/Log.d.ts.map +1 -1
  466. package/dist/internal/Log.js +18 -11
  467. package/dist/internal/Log.js.map +1 -1
  468. package/dist/internal/MetricSink.d.ts +3 -0
  469. package/dist/internal/MetricSink.d.ts.map +1 -1
  470. package/dist/internal/MetricSink.js +67 -8
  471. package/dist/internal/MetricSink.js.map +1 -1
  472. package/dist/internal/Mpp.d.ts.map +1 -1
  473. package/dist/internal/Mpp.js +20 -25
  474. package/dist/internal/Mpp.js.map +1 -1
  475. package/dist/internal/OpenApi.d.ts +26 -3
  476. package/dist/internal/OpenApi.d.ts.map +1 -1
  477. package/dist/internal/OpenApi.js +25 -10
  478. package/dist/internal/OpenApi.js.map +1 -1
  479. package/dist/internal/Provider.d.ts +1 -1
  480. package/dist/internal/Provider.d.ts.map +1 -1
  481. package/dist/internal/RateLimit.d.ts.map +1 -1
  482. package/dist/internal/RateLimit.js +13 -1
  483. package/dist/internal/RateLimit.js.map +1 -1
  484. package/dist/internal/Store.d.ts +16 -0
  485. package/dist/internal/Store.d.ts.map +1 -1
  486. package/dist/internal/Store.js +59 -8
  487. package/dist/internal/Store.js.map +1 -1
  488. package/dist/internal/Tidx.d.ts +9 -2
  489. package/dist/internal/Tidx.d.ts.map +1 -1
  490. package/dist/internal/Tidx.js +78 -11
  491. package/dist/internal/Tidx.js.map +1 -1
  492. package/dist/internal/Timing.d.ts +26 -0
  493. package/dist/internal/Timing.d.ts.map +1 -1
  494. package/dist/internal/Timing.js +63 -5
  495. package/dist/internal/Timing.js.map +1 -1
  496. package/dist/internal/VercelOidc.d.ts +94 -0
  497. package/dist/internal/VercelOidc.d.ts.map +1 -0
  498. package/dist/internal/VercelOidc.js +128 -0
  499. package/dist/internal/VercelOidc.js.map +1 -0
  500. package/dist/internal/VerifiedTokens.d.ts +2 -8
  501. package/dist/internal/VerifiedTokens.d.ts.map +1 -1
  502. package/dist/internal/VerifiedTokens.js +24 -24
  503. package/dist/internal/VerifiedTokens.js.map +1 -1
  504. package/dist/internal/Viem.d.ts +30 -2067
  505. package/dist/internal/Viem.d.ts.map +1 -1
  506. package/dist/internal/Viem.js +167 -17
  507. package/dist/internal/Viem.js.map +1 -1
  508. package/dist/internal/Webhooks.d.ts +12 -4
  509. package/dist/internal/Webhooks.d.ts.map +1 -1
  510. package/dist/internal/Webhooks.js +9 -3
  511. package/dist/internal/Webhooks.js.map +1 -1
  512. package/dist/internal/ZoneRpc.d.ts +7 -0
  513. package/dist/internal/ZoneRpc.d.ts.map +1 -0
  514. package/dist/internal/ZoneRpc.js +49 -0
  515. package/dist/internal/ZoneRpc.js.map +1 -0
  516. package/dist/internal/index.d.ts +3 -1
  517. package/dist/internal/index.d.ts.map +1 -1
  518. package/dist/internal/index.js +3 -1
  519. package/dist/internal/index.js.map +1 -1
  520. package/dist/internal/rewards/Audit.d.ts +88 -0
  521. package/dist/internal/rewards/Audit.d.ts.map +1 -0
  522. package/dist/internal/rewards/Audit.js +134 -0
  523. package/dist/internal/rewards/Audit.js.map +1 -0
  524. package/dist/internal/rewards/Campaigns.d.ts +572 -0
  525. package/dist/internal/rewards/Campaigns.d.ts.map +1 -0
  526. package/dist/internal/rewards/Campaigns.js +531 -0
  527. package/dist/internal/rewards/Campaigns.js.map +1 -0
  528. package/dist/internal/rewards/Credits.d.ts +76 -0
  529. package/dist/internal/rewards/Credits.d.ts.map +1 -0
  530. package/dist/internal/rewards/Credits.js +95 -0
  531. package/dist/internal/rewards/Credits.js.map +1 -0
  532. package/dist/internal/rewards/Events.d.ts +100 -0
  533. package/dist/internal/rewards/Events.d.ts.map +1 -0
  534. package/dist/internal/rewards/Events.js +340 -0
  535. package/dist/internal/rewards/Events.js.map +1 -0
  536. package/dist/internal/rewards/Projection.d.ts +237 -0
  537. package/dist/internal/rewards/Projection.d.ts.map +1 -0
  538. package/dist/internal/rewards/Projection.js +616 -0
  539. package/dist/internal/rewards/Projection.js.map +1 -0
  540. package/dist/internal/rewards/Rates.d.ts +44 -0
  541. package/dist/internal/rewards/Rates.d.ts.map +1 -0
  542. package/dist/internal/rewards/Rates.js +60 -0
  543. package/dist/internal/rewards/Rates.js.map +1 -0
  544. package/dist/internal/rewards/Read.d.ts +158 -0
  545. package/dist/internal/rewards/Read.d.ts.map +1 -0
  546. package/dist/internal/rewards/Read.js +292 -0
  547. package/dist/internal/rewards/Read.js.map +1 -0
  548. package/dist/internal/rewards/Runner.d.ts +164 -0
  549. package/dist/internal/rewards/Runner.d.ts.map +1 -0
  550. package/dist/internal/rewards/Runner.js +1778 -0
  551. package/dist/internal/rewards/Runner.js.map +1 -0
  552. package/dist/internal/rewards/Signer.d.ts +224 -0
  553. package/dist/internal/rewards/Signer.d.ts.map +1 -0
  554. package/dist/internal/rewards/Signer.js +135 -0
  555. package/dist/internal/rewards/Signer.js.map +1 -0
  556. package/dist/internal/rewards/index.d.ts +15 -0
  557. package/dist/internal/rewards/index.d.ts.map +1 -0
  558. package/dist/internal/rewards/index.js +15 -0
  559. package/dist/internal/rewards/index.js.map +1 -0
  560. package/dist/internal/{funding → routes}/Action.d.ts +12 -1
  561. package/dist/internal/routes/Action.d.ts.map +1 -0
  562. package/dist/internal/{funding → routes}/Action.js +17 -9
  563. package/dist/internal/routes/Action.js.map +1 -0
  564. package/dist/internal/{funding → routes}/Catalog.d.ts +20 -20
  565. package/dist/internal/routes/Catalog.d.ts.map +1 -0
  566. package/dist/internal/{funding → routes}/Catalog.js +29 -29
  567. package/dist/internal/routes/Catalog.js.map +1 -0
  568. package/dist/internal/{funding → routes}/Chain.d.ts +10 -10
  569. package/dist/internal/routes/Chain.d.ts.map +1 -0
  570. package/dist/internal/{funding → routes}/Chain.js +3 -3
  571. package/dist/internal/routes/Chain.js.map +1 -0
  572. package/dist/internal/{funding → routes}/Deposit.d.ts +45 -23
  573. package/dist/internal/routes/Deposit.d.ts.map +1 -0
  574. package/dist/internal/{funding → routes}/Deposit.js +60 -27
  575. package/dist/internal/routes/Deposit.js.map +1 -0
  576. package/dist/internal/{funding → routes}/DepositAddress.d.ts +56 -27
  577. package/dist/internal/routes/DepositAddress.d.ts.map +1 -0
  578. package/dist/internal/{funding → routes}/DepositAddress.js +95 -33
  579. package/dist/internal/routes/DepositAddress.js.map +1 -0
  580. package/dist/internal/{funding → routes}/DepositWebhook.d.ts +4 -4
  581. package/dist/internal/routes/DepositWebhook.d.ts.map +1 -0
  582. package/dist/internal/{funding → routes}/DepositWebhook.js +4 -4
  583. package/dist/internal/routes/DepositWebhook.js.map +1 -0
  584. package/dist/internal/routes/Economics.d.ts +25 -0
  585. package/dist/internal/routes/Economics.d.ts.map +1 -0
  586. package/dist/internal/routes/Economics.js +28 -0
  587. package/dist/internal/routes/Economics.js.map +1 -0
  588. package/dist/internal/{funding → routes}/Evidence.d.ts +3 -3
  589. package/dist/internal/routes/Evidence.d.ts.map +1 -0
  590. package/dist/internal/{funding → routes}/Evidence.js +7 -7
  591. package/dist/internal/routes/Evidence.js.map +1 -0
  592. package/dist/internal/routes/Observability.d.ts +154 -0
  593. package/dist/internal/routes/Observability.d.ts.map +1 -0
  594. package/dist/internal/routes/Observability.js +389 -0
  595. package/dist/internal/routes/Observability.js.map +1 -0
  596. package/dist/internal/{funding → routes}/Provider.d.ts +311 -105
  597. package/dist/internal/routes/Provider.d.ts.map +1 -0
  598. package/dist/internal/{funding → routes}/Provider.js +229 -98
  599. package/dist/internal/routes/Provider.js.map +1 -0
  600. package/dist/internal/{funding → routes}/Reconciliation.d.ts +11 -6
  601. package/dist/internal/routes/Reconciliation.d.ts.map +1 -0
  602. package/dist/internal/{funding → routes}/Reconciliation.js +408 -158
  603. package/dist/internal/routes/Reconciliation.js.map +1 -0
  604. package/dist/internal/routes/Route.d.ts +21 -0
  605. package/dist/internal/routes/Route.d.ts.map +1 -0
  606. package/dist/internal/{funding → routes}/Route.js +1 -1
  607. package/dist/internal/routes/Route.js.map +1 -0
  608. package/dist/internal/{funding → routes}/SourceObservation.d.ts +6 -6
  609. package/dist/internal/routes/SourceObservation.d.ts.map +1 -0
  610. package/dist/internal/{funding → routes}/SourceObservation.js +8 -8
  611. package/dist/internal/routes/SourceObservation.js.map +1 -0
  612. package/dist/internal/{funding → routes}/Subsidy.d.ts +48 -3
  613. package/dist/internal/routes/Subsidy.d.ts.map +1 -0
  614. package/dist/internal/{funding → routes}/Subsidy.js +43 -3
  615. package/dist/internal/routes/Subsidy.js.map +1 -0
  616. package/dist/internal/{funding → routes}/Token.d.ts +4 -4
  617. package/dist/internal/routes/Token.d.ts.map +1 -0
  618. package/dist/internal/{funding → routes}/Token.js +3 -3
  619. package/dist/internal/routes/Token.js.map +1 -0
  620. package/dist/internal/{funding → routes}/Transfer.d.ts +241 -46
  621. package/dist/internal/routes/Transfer.d.ts.map +1 -0
  622. package/dist/internal/routes/Transfer.js +728 -0
  623. package/dist/internal/routes/Transfer.js.map +1 -0
  624. package/dist/internal/{funding → routes}/TransferReconciliation.d.ts +13 -10
  625. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -0
  626. package/dist/internal/routes/TransferReconciliation.js +422 -0
  627. package/dist/internal/routes/TransferReconciliation.js.map +1 -0
  628. package/dist/internal/routes/TransferSubsidy.d.ts +201 -0
  629. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -0
  630. package/dist/internal/routes/TransferSubsidy.js +256 -0
  631. package/dist/internal/routes/TransferSubsidy.js.map +1 -0
  632. package/dist/internal/{funding → routes}/TransferWebhook.d.ts +5 -5
  633. package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
  634. package/dist/internal/{funding → routes}/TransferWebhook.js +3 -3
  635. package/dist/internal/routes/TransferWebhook.js.map +1 -0
  636. package/dist/internal/{funding → routes}/index.d.ts +2 -0
  637. package/dist/internal/routes/index.d.ts.map +1 -0
  638. package/dist/internal/{funding → routes}/index.js +2 -0
  639. package/dist/internal/routes/index.js.map +1 -0
  640. package/dist/internal/{funding → routes}/providers/across.d.ts +4 -4
  641. package/dist/internal/routes/providers/across.d.ts.map +1 -0
  642. package/dist/internal/{funding → routes}/providers/across.js +13 -13
  643. package/dist/internal/routes/providers/across.js.map +1 -0
  644. package/dist/internal/{funding → routes}/providers/relay.d.ts +21 -12
  645. package/dist/internal/routes/providers/relay.d.ts.map +1 -0
  646. package/dist/internal/{funding → routes}/providers/relay.js +194 -110
  647. package/dist/internal/routes/providers/relay.js.map +1 -0
  648. package/dist/internal/{funding → routes}/providers/rhino.d.ts +4 -4
  649. package/dist/internal/routes/providers/rhino.d.ts.map +1 -0
  650. package/dist/internal/{funding → routes}/providers/rhino.js +10 -10
  651. package/dist/internal/routes/providers/rhino.js.map +1 -0
  652. package/dist/internal/{funding → routes}/providers/squid.d.ts +4 -4
  653. package/dist/internal/routes/providers/squid.d.ts.map +1 -0
  654. package/dist/internal/{funding → routes}/providers/squid.js +14 -14
  655. package/dist/internal/routes/providers/squid.js.map +1 -0
  656. package/dist/internal/{funding → routes}/providers/stargate.d.ts +46 -18
  657. package/dist/internal/routes/providers/stargate.d.ts.map +1 -0
  658. package/dist/internal/routes/providers/stargate.js +898 -0
  659. package/dist/internal/routes/providers/stargate.js.map +1 -0
  660. package/dist/internal/{funding → routes}/providers/symbiosis.d.ts +4 -4
  661. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -0
  662. package/dist/internal/{funding → routes}/providers/symbiosis.js +30 -20
  663. package/dist/internal/routes/providers/symbiosis.js.map +1 -0
  664. package/dist/internal/webhookDestinations/slack.js +12 -12
  665. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  666. package/dist/providers/index.d.ts +12 -12
  667. package/dist/providers/index.d.ts.map +1 -1
  668. package/dist/providers/index.js +12 -12
  669. package/dist/providers/index.js.map +1 -1
  670. package/dist/server.d.ts +19 -0
  671. package/dist/server.d.ts.map +1 -0
  672. package/dist/server.js +19 -0
  673. package/dist/server.js.map +1 -0
  674. package/package.json +15 -4
  675. package/src/ApiKey.ts +1 -1
  676. package/src/ApiKeys.test.ts +1033 -3
  677. package/src/ApiKeys.ts +489 -48
  678. package/src/App.test-d.ts +1 -1
  679. package/src/App.test.ts +216 -25
  680. package/src/App.ts +334 -31
  681. package/src/Assets.test.ts +2 -2
  682. package/src/Assets.ts +3 -1
  683. package/src/Auth.test-d.ts +1 -1
  684. package/src/Client.test-d.ts +539 -110
  685. package/src/Handler.ts +0 -1
  686. package/src/OpenApi.contract.test.ts +195 -0
  687. package/src/Scope.ts +17 -5
  688. package/src/Webhooks.ts +1 -1
  689. package/src/admin/App.test.ts +30 -2
  690. package/src/admin/App.ts +42 -6
  691. package/src/admin/apps/api-keys.test.ts +267 -5
  692. package/src/admin/apps/api-keys.ts +100 -50
  693. package/src/admin/apps/earn-vaults.test.ts +158 -0
  694. package/src/admin/apps/earn-vaults.ts +679 -6
  695. package/src/admin/apps/organizations.test.ts +306 -17
  696. package/src/admin/apps/organizations.ts +299 -24
  697. package/src/admin/apps/routes-support.test.ts +200 -0
  698. package/src/admin/apps/routes-support.ts +201 -0
  699. package/src/admin/apps/routes.test.ts +450 -0
  700. package/src/admin/apps/routes.ts +896 -0
  701. package/src/admin/apps/scopes.test.ts +15 -5
  702. package/src/admin/apps/subsidies.test.ts +306 -0
  703. package/src/admin/apps/subsidies.ts +457 -0
  704. package/src/admin/apps/verified-tokens.test.ts +8 -3
  705. package/src/admin/apps/verified-tokens.ts +3 -3
  706. package/src/admin/ui/plugin.ts +1 -2
  707. package/src/admin/ui/src/components/RewardCampaignForm.tsx +1009 -0
  708. package/src/admin/ui/src/lib/config.ts +11 -2
  709. package/src/admin/ui/src/lib/earn-vaults.ts +2 -2
  710. package/src/admin/ui/src/lib/organizations.test.ts +83 -50
  711. package/src/admin/ui/src/lib/organizations.ts +106 -25
  712. package/src/admin/ui/src/lib/query-client.ts +1 -1
  713. package/src/admin/ui/src/lib/reward-campaigns.ts +136 -0
  714. package/src/admin/ui/src/lib/routes.test.ts +88 -0
  715. package/src/admin/ui/src/lib/routes.ts +304 -0
  716. package/src/admin/ui/src/lib/subsidies.ts +75 -0
  717. package/src/admin/ui/src/routeTree.gen.ts +63 -0
  718. package/src/admin/ui/src/routes/__root.tsx +12 -1
  719. package/src/admin/ui/src/routes/api-keys.tsx +196 -84
  720. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +105 -70
  721. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +239 -23
  722. package/src/admin/ui/src/routes/routes.tsx +1615 -0
  723. package/src/admin/ui/src/routes/routes_.support.tsx +248 -0
  724. package/src/admin/ui/src/routes/subsidies.tsx +799 -0
  725. package/src/admin/ui.generated.ts +144 -69
  726. package/src/analytics/Analytics.test.ts +108 -18
  727. package/src/analytics/Analytics.ts +38 -6
  728. package/src/analytics/tables/requestEvents.test.ts +100 -0
  729. package/src/analytics/tables/requestEvents.ts +10 -1
  730. package/src/analytics/tables/routesLifecycleIntervals.ts +140 -0
  731. package/src/apps/Zones.test.ts +15 -0
  732. package/src/apps/Zones.ts +52 -5
  733. package/src/apps/composition.test.ts +68 -60
  734. package/src/apps/data/App.test.ts +154 -2
  735. package/src/apps/data/App.ts +88 -28
  736. package/src/apps/data/routes/activities.test.ts +419 -7
  737. package/src/apps/data/routes/activities.ts +683 -216
  738. package/src/apps/data/routes/balances.test.ts +2 -2
  739. package/src/apps/data/routes/blocks.test.ts +46 -1
  740. package/src/apps/data/routes/coingecko.test.ts +419 -1
  741. package/src/apps/data/routes/coingecko.ts +309 -253
  742. package/src/apps/data/routes/earn.discovery.test.ts +274 -0
  743. package/src/apps/data/routes/earn.test.ts +1294 -17
  744. package/src/apps/data/routes/earn.ts +1838 -321
  745. package/src/apps/data/routes/exchanges.test.ts +12 -15
  746. package/src/apps/data/routes/fee-amm.test.ts +224 -0
  747. package/src/apps/data/routes/fee-amm.ts +191 -160
  748. package/src/apps/data/routes/indexer.test.ts +389 -0
  749. package/src/apps/data/routes/indexer.ts +165 -69
  750. package/src/apps/data/routes/receipts.test.ts +1 -1
  751. package/src/apps/data/routes/rpc.test.ts +352 -8
  752. package/src/apps/data/routes/rpc.ts +407 -219
  753. package/src/apps/data/routes/rpc.zone.test.ts +340 -0
  754. package/src/apps/data/routes/tokenlist.test.ts +285 -0
  755. package/src/apps/data/routes/tokenlist.ts +173 -88
  756. package/src/apps/data/routes/tokens.test.ts +93 -3
  757. package/src/apps/data/routes/tokens.ts +39 -23
  758. package/src/apps/data/routes/transactions.test.ts +1 -1
  759. package/src/apps/data/routes/transfers.test.ts +56 -24
  760. package/src/apps/data/routes/transfers.ts +19 -8
  761. package/src/apps/data/routes/valuation.test.ts +1 -1
  762. package/src/apps/data/routes/verified-tokens.test.ts +345 -0
  763. package/src/apps/data/routes/verified-tokens.ts +99 -29
  764. package/src/apps/data/routes/webhooks.test.ts +645 -83
  765. package/src/apps/data/routes/webhooks.ts +1089 -857
  766. package/src/apps/data/routes/zones.test.ts +148 -71
  767. package/src/apps/data/routes/zones.ts +71 -55
  768. package/src/apps/docs/reference.ts +2 -2
  769. package/src/apps/index.ts +1 -1
  770. package/src/apps/management/App.ts +9 -51
  771. package/src/apps/management/Billing.test.ts +375 -14
  772. package/src/apps/management/Billing.ts +265 -29
  773. package/src/apps/management/routes/api-keys.test.ts +269 -7
  774. package/src/apps/management/routes/api-keys.ts +61 -20
  775. package/src/apps/management/routes/billing.test.ts +477 -15
  776. package/src/apps/management/routes/billing.ts +377 -50
  777. package/src/apps/management/routes/faucet.test.ts +1 -1
  778. package/src/apps/management/routes/faucet.ts +1 -1
  779. package/src/apps/management/routes/invitations.test.ts +270 -3
  780. package/src/apps/management/routes/invitations.ts +185 -15
  781. package/src/apps/management/routes/invoicePreview.test.ts +549 -0
  782. package/src/apps/management/routes/me.test.ts +246 -5
  783. package/src/apps/management/routes/me.ts +7 -2
  784. package/src/apps/management/routes/members.test.ts +108 -0
  785. package/src/apps/management/routes/orgs.test.ts +191 -3
  786. package/src/apps/management/routes/orgs.ts +58 -11
  787. package/src/apps/management/routes/projects.test.ts +33 -3
  788. package/src/apps/management/routes/projects.ts +6 -1
  789. package/src/apps/management/routes/scopes.test.ts +30 -2
  790. package/src/apps/management/routes/scopes.ts +4 -1
  791. package/src/apps/management/routes/usage.test.ts +32 -0
  792. package/src/apps/management/routes/usage.ts +22 -4
  793. package/src/apps/management/routes/webhooks.test.ts +49 -26
  794. package/src/apps/management/routes/webhooks.ts +78 -22
  795. package/src/apps/mcp.test.ts +6 -6
  796. package/src/apps/mcp.ts +7 -7
  797. package/src/apps/mpp/App.ts +37 -7
  798. package/src/apps/mpp/Mpp.test.ts +49 -8
  799. package/src/apps/mpp/Mpp.zone.test.ts +219 -0
  800. package/src/apps/mpp/internal/Adapter.ts +34 -0
  801. package/src/apps/mpp/internal/Policy.test.ts +86 -31
  802. package/src/apps/mpp/internal/Policy.ts +49 -7
  803. package/src/apps/mpp/internal/Sponsorship.test.ts +207 -0
  804. package/src/apps/mpp/internal/Sponsorship.ts +9 -3
  805. package/src/apps/relay/App.test.ts +839 -64
  806. package/src/apps/relay/App.ts +148 -81
  807. package/src/apps/relay/App.zone-billing.test.ts +257 -0
  808. package/src/apps/relay/Sponsorships.test.ts +67 -4
  809. package/src/apps/relay/Sponsorships.ts +233 -32
  810. package/src/apps/relay/Sponsorships.zone.test.ts +102 -0
  811. package/src/apps/{funding → routes}/Access.ts +6 -6
  812. package/src/apps/routes/App.test.ts +165 -0
  813. package/src/apps/routes/App.ts +96 -0
  814. package/src/apps/{funding → routes}/Inventory.ts +2 -2
  815. package/src/apps/routes/index.ts +1 -0
  816. package/src/apps/{funding → routes}/routes/chains.test.ts +66 -66
  817. package/src/apps/{funding → routes}/routes/chains.ts +23 -23
  818. package/src/apps/{funding → routes}/routes/deposit-addresses.test.ts +1358 -458
  819. package/src/apps/{funding → routes}/routes/deposit-addresses.ts +566 -246
  820. package/src/apps/{funding → routes}/routes/providers.test.ts +27 -33
  821. package/src/apps/{funding → routes}/routes/providers.ts +23 -23
  822. package/src/apps/{funding → routes}/routes/quotes.test.ts +298 -41
  823. package/src/apps/{funding → routes}/routes/quotes.ts +57 -40
  824. package/src/apps/{funding → routes}/routes/transfers.test.ts +1100 -353
  825. package/src/apps/routes/routes/transfers.ts +1332 -0
  826. package/src/cli/Cli.test.ts +1 -1
  827. package/src/cli/commands/admin.test.ts +748 -1
  828. package/src/cli/commands/admin.ts +278 -0
  829. package/src/cloudflare.ts +52 -47
  830. package/src/db/Db.test.ts +245 -2
  831. package/src/db/Db.ts +1476 -34
  832. package/src/db/Schema.ts +729 -228
  833. package/src/db/tables/apiKeyAdmissionBootstraps.ts +4 -0
  834. package/src/db/tables/apiKeyAdmissions.ts +218 -0
  835. package/src/db/tables/apiKeyOwnerAdmissions.ts +4 -0
  836. package/src/db/tables/apiKeyOwnerTombstones.ts +81 -0
  837. package/src/db/tables/apiKeyRevocations.test.ts +74 -0
  838. package/src/db/tables/apiKeyRevocations.ts +121 -0
  839. package/src/db/tables/authAccounts.ts +105 -0
  840. package/src/db/tables/authSessions.ts +13 -0
  841. package/src/db/tables/authVerifications.ts +13 -0
  842. package/src/db/tables/invitations.ts +142 -45
  843. package/src/db/tables/memberships.ts +79 -3
  844. package/src/db/tables/organizations.test.ts +690 -13
  845. package/src/db/tables/organizations.ts +139 -55
  846. package/src/db/tables/projects.test.ts +16 -0
  847. package/src/db/tables/projects.ts +13 -3
  848. package/src/db/tables/requestUsage.ts +4 -1
  849. package/src/db/tables/rewardAccounts.ts +178 -0
  850. package/src/db/tables/rewardCampaignDistributors.ts +68 -0
  851. package/src/db/tables/rewardCampaigns.test.ts +1388 -0
  852. package/src/db/tables/rewardCampaigns.ts +647 -0
  853. package/src/db/tables/rewardCredits.ts +110 -0
  854. package/src/db/tables/rewardEligibilityAssociations.test.ts +271 -0
  855. package/src/db/tables/rewardEligibilityAssociations.ts +184 -0
  856. package/src/db/tables/rewardRuns.ts +514 -0
  857. package/src/db/tables/rewardTransactionAttempts.ts +272 -0
  858. package/src/db/tables/routesCatalog.test.ts +185 -0
  859. package/src/db/tables/routesCatalog.ts +163 -0
  860. package/src/db/tables/routesDepositAddresses.test.ts +1048 -0
  861. package/src/db/tables/routesDepositAddresses.ts +1008 -0
  862. package/src/db/tables/{fundingDepositRequestObservations.test.ts → routesDepositRequestObservations.test.ts} +13 -14
  863. package/src/db/tables/{fundingDepositRequestObservations.ts → routesDepositRequestObservations.ts} +10 -10
  864. package/src/db/tables/{fundingDeposits.test.ts → routesDeposits.test.ts} +316 -46
  865. package/src/db/tables/routesDeposits.ts +1062 -0
  866. package/src/db/tables/routesIdempotency.test.ts +796 -0
  867. package/src/db/tables/routesIdempotency.ts +496 -0
  868. package/src/db/tables/routesSubsidies.test.ts +120 -0
  869. package/src/db/tables/routesSubsidies.ts +71 -0
  870. package/src/db/tables/{fundingTransferEvents.ts → routesTransferEvents.ts} +4 -4
  871. package/src/db/tables/routesTransferSubsidies.ts +38 -0
  872. package/src/db/tables/routesTransferSubsidyNonces.ts +124 -0
  873. package/src/db/tables/routesTransferTransactions.test.ts +195 -0
  874. package/src/db/tables/{fundingTransferTransactions.ts → routesTransferTransactions.ts} +63 -18
  875. package/src/db/tables/routesTransfers.test.ts +338 -0
  876. package/src/db/tables/routesTransfers.ts +662 -0
  877. package/src/db/tables/sponsoredTransactions.test.ts +269 -45
  878. package/src/db/tables/sponsoredTransactions.ts +225 -65
  879. package/src/db/tables/sponsorshipAttributions.test.ts +160 -0
  880. package/src/db/tables/sponsorshipAttributions.ts +168 -0
  881. package/src/db/tables/sponsorshipReconciliationCursors.test.ts +115 -0
  882. package/src/db/tables/sponsorshipReconciliationCursors.ts +67 -0
  883. package/src/db/tables/stripeCustomers.test.ts +85 -0
  884. package/src/db/tables/stripeCustomers.ts +24 -0
  885. package/src/db/tables/users.test.ts +129 -0
  886. package/src/db/tables/users.ts +49 -3
  887. package/src/db/tables/webhookQueueEvents.ts +8 -1
  888. package/src/db/tables/webhookSubscriptions.ts +95 -20
  889. package/src/handlers/internal/executionError.ts +3 -4
  890. package/src/handlers/internal/multisig.ts +13 -816
  891. package/src/handlers/internal/sponsorship.ts +26 -10
  892. package/src/handlers/relay.test-d.ts +9 -1
  893. package/src/handlers/relay.test.ts +823 -3
  894. package/src/handlers/relay.ts +127 -107
  895. package/src/index.test-d.ts +7 -0
  896. package/src/index.ts +0 -17
  897. package/src/internal/AssetResponse.ts +26 -0
  898. package/src/internal/Auth.test.ts +1564 -9
  899. package/src/internal/Auth.ts +833 -239
  900. package/src/internal/BetterAuth.test.ts +242 -0
  901. package/src/internal/BetterAuth.ts +349 -0
  902. package/src/internal/Cache.ts +2 -0
  903. package/src/internal/EarnRates.test.ts +17 -0
  904. package/src/internal/EarnRates.ts +124 -31
  905. package/src/internal/EarnSharePrices.test.ts +182 -0
  906. package/src/internal/EarnSharePrices.ts +313 -0
  907. package/src/internal/EarnVaults.test.ts +21 -0
  908. package/src/internal/EarnVaults.ts +33 -11
  909. package/src/internal/Email.ts +54 -0
  910. package/src/internal/Idempotency.test.ts +2 -2
  911. package/src/internal/Log.test-d.ts +8 -7
  912. package/src/internal/Log.test.ts +114 -16
  913. package/src/internal/Log.ts +53 -40
  914. package/src/internal/MetricSink.test.ts +313 -26
  915. package/src/internal/MetricSink.ts +73 -8
  916. package/src/internal/Mpp.test.ts +31 -0
  917. package/src/internal/Mpp.ts +21 -24
  918. package/src/internal/OpenApi.ts +45 -12
  919. package/src/internal/Provider.test.ts +1 -1
  920. package/src/internal/Provider.ts +1 -1
  921. package/src/internal/RateLimit.test.ts +21 -3
  922. package/src/internal/RateLimit.ts +12 -1
  923. package/src/internal/Store.test-d.ts +1 -1
  924. package/src/internal/Store.test.ts +151 -8
  925. package/src/internal/Store.ts +76 -9
  926. package/src/internal/Tidx.test.ts +59 -8
  927. package/src/internal/Tidx.ts +86 -14
  928. package/src/internal/Timing.test.ts +77 -0
  929. package/src/internal/Timing.ts +83 -6
  930. package/src/internal/VercelOidc.test.ts +188 -0
  931. package/src/internal/VercelOidc.ts +193 -0
  932. package/src/internal/VerifiedTokens.test.ts +60 -6
  933. package/src/internal/VerifiedTokens.ts +21 -24
  934. package/src/internal/Viem.batch.test.ts +80 -0
  935. package/src/internal/Viem.test.ts +201 -2
  936. package/src/internal/Viem.ts +221 -25
  937. package/src/internal/Webhooks.test.ts +85 -6
  938. package/src/internal/Webhooks.ts +22 -4
  939. package/src/internal/ZoneRpc.ts +50 -0
  940. package/src/internal/exchange/Provider.test.ts +2 -2
  941. package/src/internal/index.test.ts +3 -1
  942. package/src/internal/index.ts +3 -1
  943. package/src/internal/rewards/Audit.ts +231 -0
  944. package/src/internal/rewards/Campaigns.test.ts +1234 -0
  945. package/src/internal/rewards/Campaigns.ts +1205 -0
  946. package/src/internal/rewards/Credits.ts +165 -0
  947. package/src/internal/rewards/Events.local.test.ts +113 -0
  948. package/src/internal/rewards/Events.test.ts +152 -0
  949. package/src/internal/rewards/Events.ts +468 -0
  950. package/src/internal/rewards/Projection.test.ts +681 -0
  951. package/src/internal/rewards/Projection.ts +987 -0
  952. package/src/internal/rewards/Rates.test.ts +171 -0
  953. package/src/internal/rewards/Rates.ts +110 -0
  954. package/src/internal/rewards/Read.test.ts +501 -0
  955. package/src/internal/rewards/Read.ts +476 -0
  956. package/src/internal/rewards/Runner.checkpoint.test.ts +80 -0
  957. package/src/internal/rewards/Runner.states.test.ts +188 -0
  958. package/src/internal/rewards/Runner.test.ts +90 -0
  959. package/src/internal/rewards/Runner.ts +2229 -0
  960. package/src/internal/rewards/Signer.test.ts +79 -0
  961. package/src/internal/rewards/Signer.ts +180 -0
  962. package/src/internal/rewards/index.ts +14 -0
  963. package/src/internal/{funding → routes}/Action.test.ts +63 -14
  964. package/src/internal/{funding → routes}/Action.ts +35 -8
  965. package/src/internal/{funding → routes}/Catalog.test.ts +3 -3
  966. package/src/internal/{funding → routes}/Catalog.ts +39 -39
  967. package/src/internal/{funding → routes}/Chain.test.ts +1 -1
  968. package/src/internal/{funding → routes}/Chain.ts +11 -11
  969. package/src/internal/{funding → routes}/Deposit.test.ts +1 -1
  970. package/src/internal/{funding → routes}/Deposit.ts +93 -45
  971. package/src/internal/{funding → routes}/DepositAddress.test.ts +11 -3
  972. package/src/internal/{funding → routes}/DepositAddress.ts +132 -53
  973. package/src/internal/{funding → routes}/DepositWebhook.test.ts +61 -18
  974. package/src/internal/{funding → routes}/DepositWebhook.ts +9 -9
  975. package/src/internal/routes/Economics.test.ts +42 -0
  976. package/src/internal/routes/Economics.ts +47 -0
  977. package/src/internal/{funding → routes}/Evidence.test.ts +6 -6
  978. package/src/internal/{funding → routes}/Evidence.ts +9 -9
  979. package/src/internal/routes/Observability.test.ts +636 -0
  980. package/src/internal/routes/Observability.ts +668 -0
  981. package/src/internal/{funding → routes}/Provider.test.ts +489 -153
  982. package/src/internal/{funding → routes}/Provider.ts +489 -186
  983. package/src/internal/{funding → routes}/Reconciliation.local.test.ts +84 -12
  984. package/src/internal/{funding → routes}/Reconciliation.test.ts +1213 -279
  985. package/src/internal/{funding → routes}/Reconciliation.ts +501 -203
  986. package/src/internal/routes/Reconciliation.unattributed.test.ts +250 -0
  987. package/src/internal/{funding → routes}/Route.ts +7 -7
  988. package/src/internal/{funding → routes}/SourceObservation.test.ts +13 -14
  989. package/src/internal/{funding → routes}/SourceObservation.ts +13 -13
  990. package/src/internal/{funding → routes}/Subsidy.local.test.ts +7 -7
  991. package/src/internal/routes/Subsidy.test.ts +169 -0
  992. package/src/internal/{funding → routes}/Subsidy.ts +86 -6
  993. package/src/internal/{funding → routes}/Token.test.ts +1 -1
  994. package/src/internal/{funding → routes}/Token.ts +5 -5
  995. package/src/internal/routes/Transfer.test.ts +1199 -0
  996. package/src/internal/routes/Transfer.ts +1206 -0
  997. package/src/internal/routes/TransferReconciliation.test.ts +731 -0
  998. package/src/internal/routes/TransferReconciliation.ts +527 -0
  999. package/src/internal/routes/TransferSubsidy.test.ts +172 -0
  1000. package/src/internal/routes/TransferSubsidy.ts +447 -0
  1001. package/src/internal/{funding → routes}/TransferWebhook.test.ts +13 -13
  1002. package/src/internal/{funding → routes}/TransferWebhook.ts +7 -7
  1003. package/src/internal/{funding → routes}/index.test.ts +5 -3
  1004. package/src/internal/{funding → routes}/index.ts +2 -0
  1005. package/src/internal/{funding → routes}/providers/across.ts +16 -16
  1006. package/src/internal/{funding → routes}/providers/index.test.ts +157 -44
  1007. package/src/internal/{funding → routes}/providers/relay.test.ts +165 -32
  1008. package/src/internal/{funding → routes}/providers/relay.ts +228 -121
  1009. package/src/internal/{funding → routes}/providers/rhino.ts +16 -16
  1010. package/src/internal/{funding → routes}/providers/squid.ts +17 -17
  1011. package/src/internal/routes/providers/stargate.test.ts +728 -0
  1012. package/src/internal/routes/providers/stargate.ts +1276 -0
  1013. package/src/internal/{funding → routes}/providers/symbiosis.ts +64 -24
  1014. package/src/internal/webhookDestinations/slack.ts +10 -10
  1015. package/src/providers/index.ts +13 -13
  1016. package/src/server.ts +18 -0
  1017. package/dist/apps/funding/Access.d.ts.map +0 -1
  1018. package/dist/apps/funding/Access.js.map +0 -1
  1019. package/dist/apps/funding/App.js.map +0 -1
  1020. package/dist/apps/funding/Inventory.d.ts.map +0 -1
  1021. package/dist/apps/funding/Inventory.js.map +0 -1
  1022. package/dist/apps/funding/ProviderAttempts.d.ts +0 -5
  1023. package/dist/apps/funding/ProviderAttempts.d.ts.map +0 -1
  1024. package/dist/apps/funding/ProviderAttempts.js +0 -24
  1025. package/dist/apps/funding/ProviderAttempts.js.map +0 -1
  1026. package/dist/apps/funding/index.d.ts +0 -2
  1027. package/dist/apps/funding/index.d.ts.map +0 -1
  1028. package/dist/apps/funding/index.js +0 -2
  1029. package/dist/apps/funding/index.js.map +0 -1
  1030. package/dist/apps/funding/routes/chains.d.ts.map +0 -1
  1031. package/dist/apps/funding/routes/chains.js.map +0 -1
  1032. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +0 -1
  1033. package/dist/apps/funding/routes/deposit-addresses.js.map +0 -1
  1034. package/dist/apps/funding/routes/providers.d.ts.map +0 -1
  1035. package/dist/apps/funding/routes/providers.js +0 -57
  1036. package/dist/apps/funding/routes/providers.js.map +0 -1
  1037. package/dist/apps/funding/routes/quotes.d.ts.map +0 -1
  1038. package/dist/apps/funding/routes/quotes.js.map +0 -1
  1039. package/dist/apps/funding/routes/transfers.d.ts.map +0 -1
  1040. package/dist/apps/funding/routes/transfers.js +0 -828
  1041. package/dist/apps/funding/routes/transfers.js.map +0 -1
  1042. package/dist/db/tables/fundingCatalog.d.ts +0 -58
  1043. package/dist/db/tables/fundingCatalog.d.ts.map +0 -1
  1044. package/dist/db/tables/fundingCatalog.js.map +0 -1
  1045. package/dist/db/tables/fundingDepositAddresses.d.ts +0 -192
  1046. package/dist/db/tables/fundingDepositAddresses.d.ts.map +0 -1
  1047. package/dist/db/tables/fundingDepositAddresses.js +0 -235
  1048. package/dist/db/tables/fundingDepositAddresses.js.map +0 -1
  1049. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +0 -1
  1050. package/dist/db/tables/fundingDepositRequestObservations.js.map +0 -1
  1051. package/dist/db/tables/fundingDeposits.d.ts.map +0 -1
  1052. package/dist/db/tables/fundingDeposits.js +0 -295
  1053. package/dist/db/tables/fundingDeposits.js.map +0 -1
  1054. package/dist/db/tables/fundingIdempotency.d.ts +0 -91
  1055. package/dist/db/tables/fundingIdempotency.d.ts.map +0 -1
  1056. package/dist/db/tables/fundingIdempotency.js +0 -103
  1057. package/dist/db/tables/fundingIdempotency.js.map +0 -1
  1058. package/dist/db/tables/fundingTransferEvents.d.ts.map +0 -1
  1059. package/dist/db/tables/fundingTransferEvents.js.map +0 -1
  1060. package/dist/db/tables/fundingTransferTransactions.d.ts +0 -53
  1061. package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
  1062. package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
  1063. package/dist/db/tables/fundingTransfers.d.ts +0 -99
  1064. package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
  1065. package/dist/db/tables/fundingTransfers.js +0 -110
  1066. package/dist/db/tables/fundingTransfers.js.map +0 -1
  1067. package/dist/internal/funding/Action.d.ts.map +0 -1
  1068. package/dist/internal/funding/Action.js.map +0 -1
  1069. package/dist/internal/funding/Catalog.d.ts.map +0 -1
  1070. package/dist/internal/funding/Catalog.js.map +0 -1
  1071. package/dist/internal/funding/Chain.d.ts.map +0 -1
  1072. package/dist/internal/funding/Chain.js.map +0 -1
  1073. package/dist/internal/funding/Deposit.d.ts.map +0 -1
  1074. package/dist/internal/funding/Deposit.js.map +0 -1
  1075. package/dist/internal/funding/DepositAddress.d.ts.map +0 -1
  1076. package/dist/internal/funding/DepositAddress.js.map +0 -1
  1077. package/dist/internal/funding/DepositWebhook.d.ts.map +0 -1
  1078. package/dist/internal/funding/DepositWebhook.js.map +0 -1
  1079. package/dist/internal/funding/Evidence.d.ts.map +0 -1
  1080. package/dist/internal/funding/Evidence.js.map +0 -1
  1081. package/dist/internal/funding/Provider.d.ts.map +0 -1
  1082. package/dist/internal/funding/Provider.js.map +0 -1
  1083. package/dist/internal/funding/Reconciliation.d.ts.map +0 -1
  1084. package/dist/internal/funding/Reconciliation.js.map +0 -1
  1085. package/dist/internal/funding/Route.d.ts +0 -21
  1086. package/dist/internal/funding/Route.d.ts.map +0 -1
  1087. package/dist/internal/funding/Route.js.map +0 -1
  1088. package/dist/internal/funding/SourceObservation.d.ts.map +0 -1
  1089. package/dist/internal/funding/SourceObservation.js.map +0 -1
  1090. package/dist/internal/funding/Subsidy.d.ts.map +0 -1
  1091. package/dist/internal/funding/Subsidy.js.map +0 -1
  1092. package/dist/internal/funding/Token.d.ts.map +0 -1
  1093. package/dist/internal/funding/Token.js.map +0 -1
  1094. package/dist/internal/funding/Transfer.d.ts.map +0 -1
  1095. package/dist/internal/funding/Transfer.js +0 -462
  1096. package/dist/internal/funding/Transfer.js.map +0 -1
  1097. package/dist/internal/funding/TransferReconciliation.d.ts.map +0 -1
  1098. package/dist/internal/funding/TransferReconciliation.js +0 -192
  1099. package/dist/internal/funding/TransferReconciliation.js.map +0 -1
  1100. package/dist/internal/funding/TransferWebhook.d.ts.map +0 -1
  1101. package/dist/internal/funding/TransferWebhook.js.map +0 -1
  1102. package/dist/internal/funding/index.d.ts.map +0 -1
  1103. package/dist/internal/funding/index.js.map +0 -1
  1104. package/dist/internal/funding/providers/across.d.ts.map +0 -1
  1105. package/dist/internal/funding/providers/across.js.map +0 -1
  1106. package/dist/internal/funding/providers/relay.d.ts.map +0 -1
  1107. package/dist/internal/funding/providers/relay.js.map +0 -1
  1108. package/dist/internal/funding/providers/rhino.d.ts.map +0 -1
  1109. package/dist/internal/funding/providers/rhino.js.map +0 -1
  1110. package/dist/internal/funding/providers/squid.d.ts.map +0 -1
  1111. package/dist/internal/funding/providers/squid.js.map +0 -1
  1112. package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
  1113. package/dist/internal/funding/providers/stargate.js +0 -579
  1114. package/dist/internal/funding/providers/stargate.js.map +0 -1
  1115. package/dist/internal/funding/providers/symbiosis.d.ts.map +0 -1
  1116. package/dist/internal/funding/providers/symbiosis.js.map +0 -1
  1117. package/src/apps/funding/App.test.ts +0 -78
  1118. package/src/apps/funding/App.ts +0 -88
  1119. package/src/apps/funding/ProviderAttempts.ts +0 -26
  1120. package/src/apps/funding/index.ts +0 -1
  1121. package/src/apps/funding/routes/transfers.ts +0 -987
  1122. package/src/db/tables/fundingCatalog.test.ts +0 -122
  1123. package/src/db/tables/fundingCatalog.ts +0 -163
  1124. package/src/db/tables/fundingDepositAddresses.test.ts +0 -608
  1125. package/src/db/tables/fundingDepositAddresses.ts +0 -443
  1126. package/src/db/tables/fundingDeposits.ts +0 -572
  1127. package/src/db/tables/fundingIdempotency.test.ts +0 -182
  1128. package/src/db/tables/fundingIdempotency.ts +0 -180
  1129. package/src/db/tables/fundingTransferTransactions.test.ts +0 -112
  1130. package/src/db/tables/fundingTransfers.test.ts +0 -115
  1131. package/src/db/tables/fundingTransfers.ts +0 -189
  1132. package/src/handlers/internal/multisig.test.ts +0 -818
  1133. package/src/internal/funding/Subsidy.test.ts +0 -75
  1134. package/src/internal/funding/Transfer.test.ts +0 -524
  1135. package/src/internal/funding/Transfer.ts +0 -762
  1136. package/src/internal/funding/TransferReconciliation.test.ts +0 -147
  1137. package/src/internal/funding/TransferReconciliation.ts +0 -264
  1138. package/src/internal/funding/providers/stargate.test.ts +0 -328
  1139. package/src/internal/funding/providers/stargate.ts +0 -856
  1140. /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
  1141. /package/src/internal/{funding → routes}/Route.test.ts +0 -0
@@ -1,31 +1,57 @@
1
1
  import * as Accounts from 'accounts/server';
2
+ import { splitSetCookieHeader } from 'better-auth/cookies';
2
3
  import { Hono } from 'hono';
4
+ import { deleteCookie, getCookie, setCookie } from 'hono/cookie';
3
5
  import { createMiddleware } from 'hono/factory';
4
6
  import { matchedRoutes } from 'hono/route';
5
7
  import { findTargetHandler } from 'hono/utils/handler';
8
+ import * as jose from 'jose';
9
+ import { sql } from 'kysely';
6
10
  import { Challenge, Credential } from 'mppx';
7
11
  import { Mppx, tempo } from 'mppx/hono';
12
+ import { Address, Hex } from 'ox';
8
13
  import { Addresses } from 'viem/tempo';
9
14
  import { tempoMainnet } from 'viem/tempo/chains';
10
15
  import * as z from 'zod/mini';
11
16
  import * as ApiKey from '../ApiKey.js';
12
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
+ import * as AuthAccounts from '../db/tables/authAccounts.js';
21
+ import * as BetterAuth from './BetterAuth.js';
13
22
  import * as Db from '../db/Db.js';
14
23
  import * as Memberships from '../db/tables/memberships.js';
15
24
  import * as IpAllowlist from './IpAllowlist.js';
16
25
  import * as Metadata from '../apps/metadata.js';
17
26
  import * as OpenApi from './OpenApi.js';
18
27
  import * as Organizations from '../db/tables/organizations.js';
28
+ import * as Path from './Path.js';
19
29
  import * as Projects from '../db/tables/projects.js';
20
30
  import * as RateLimit from './RateLimit.js';
21
31
  import * as Response from './Response.js';
22
32
  import * as Schema from './Schema.js';
23
33
  import * as Scope from '../Scope.js';
34
+ import * as Timing from './Timing.js';
24
35
  import * as Users from '../db/tables/users.js';
25
36
  const policySymbol = Symbol('tempo-api.auth.policy');
26
37
  const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management');
27
38
  const defaultApiKeyRateLimit = { limit: 10_000, period: 'minute' };
39
+ const defaultIdentitySessionTtl = 24 * 60 * 60;
28
40
  const defaultMppRateLimit = { limit: 100, period: 'minute' };
41
+ const defaultPublicRateLimit = { limit: 60, period: 'minute' };
42
+ const identityCookieName = 'tempo_identity';
43
+ const walletIdentityIssuer = 'https://wallet.tempo.xyz/api/oidc';
44
+ function isIdentityTokenError(error) {
45
+ return (error instanceof jose.errors.JOSEAlgNotAllowed ||
46
+ error instanceof jose.errors.JOSENotSupported ||
47
+ error instanceof jose.errors.JWSInvalid ||
48
+ error instanceof jose.errors.JWKSNoMatchingKey ||
49
+ error instanceof jose.errors.JWSSignatureVerificationFailed ||
50
+ error instanceof jose.errors.JWTClaimValidationFailed ||
51
+ error instanceof jose.errors.JWTExpired ||
52
+ error instanceof jose.errors.JWTInvalid ||
53
+ (error instanceof Error && error.message === 'email not verified'));
54
+ }
29
55
  /** Reads the authenticated principal from a Hono context. */
30
56
  export function getPrincipal(c) {
31
57
  return c.get('principal') ?? null;
@@ -265,6 +291,13 @@ export function paidAccessError(c) {
265
291
  }
266
292
  /** Creates auth middleware for protected OpenAPI routes. */
267
293
  export function middleware(options) {
294
+ const resolve = createApiKeyResolver({
295
+ apiKey: options.apiKey,
296
+ scopeCatalog: options.scopeCatalog,
297
+ });
298
+ return createAuthMiddleware(options, resolve);
299
+ }
300
+ function createAuthMiddleware(options, resolve) {
268
301
  const { rateLimit: mppRateLimit = defaultMppRateLimit, session: session_ = {}, sessionChainIds, ...mpp } = options.mpp === false ? {} : (options.mpp ?? {});
269
302
  const secretKey = resolveMppSecretKey(mpp.secretKey);
270
303
  const defaults = laneDefaults(options);
@@ -278,24 +311,13 @@ export function middleware(options) {
278
311
  // keyed by token sha256) so hot keys skip the backend read on the auth path
279
312
  // of every request. Pass `apiKey.cache: false` when immediate key updates
280
313
  // matter more than the per-request read.
281
- const resolve = (() => {
282
- const uncached = (c, token) => {
283
- const kv = contextKv(c);
284
- return kv
285
- ? ApiKeys.resolve(kv.store, token, { scopeCatalog: options.scopeCatalog })
286
- : Promise.resolve(null);
287
- };
288
- if (options.apiKey === false || options.apiKey?.cache === false)
289
- return uncached;
290
- return cachedResolve(uncached, options.apiKey?.cache ?? {});
291
- })();
292
314
  const auth = {
293
315
  ...(options.apiKey === false
294
316
  ? {}
295
317
  : {
296
318
  apiKey: {
297
319
  ...(options.apiKey?.rateLimits ? { rateLimits: options.apiKey.rateLimits } : {}),
298
- resolve,
320
+ resolve: resolve.resolve,
299
321
  },
300
322
  }),
301
323
  // The throttle ceiling for sandbox keys without active billing, so
@@ -336,33 +358,90 @@ export function middleware(options) {
336
358
  : {}),
337
359
  };
338
360
  return createMiddleware((c, next) => {
339
- const route = openApiRoute(c);
340
- if (!route)
361
+ const resolved = resolveRequestPolicy(c, { base, defaults, options });
362
+ if (!resolved)
341
363
  return next();
342
- const { key, description, management, scope } = route;
343
- const overrides = options.overrides;
344
- const routePolicies = policies(c);
345
- const configuredOverride = (() => {
346
- const configured = overrides?.[key];
347
- if (configured !== undefined)
348
- return configured;
349
- const inheritedMethod = routePolicies.find((policy) => policy.inheritOverridesFrom)?.inheritOverridesFrom;
350
- if (inheritedMethod === undefined)
351
- return undefined;
352
- const inheritedKey = `${inheritedMethod.toUpperCase()} ${key.slice(key.indexOf(' ') + 1)}`;
353
- return overrides?.[inheritedKey];
354
- })();
355
- const routeOverride = management && configuredOverride ? { mpp: configuredOverride.mpp } : configuredOverride;
356
- const endpointPolicy = bindMppScope(resolvePolicy(base, defaults, [...routePolicies, routeOverride], description), scope);
357
- if (!endpointPolicy)
364
+ c.set('auth', auth);
365
+ if (!resolved.policy)
358
366
  return next();
359
- if (management && (!auth.mpp || !endpointPolicy.mpp))
367
+ if (resolved.management && (!auth.mpp || !resolved.policy.mpp))
360
368
  return next();
361
- c.set('auth', auth);
362
- return require(endpointPolicy)(c, next);
369
+ return require(resolved.policy)(c, next);
363
370
  });
364
371
  }
365
- /** Zod schemas documenting the session sign-in surface (`/v1/auth/siwe`). */
372
+ function resolveRequestPolicy(c, options) {
373
+ const route = openApiRoute(c);
374
+ if (!route)
375
+ return undefined;
376
+ const { key, description, management, scope } = route;
377
+ const overrides = options.options.overrides;
378
+ const routePolicies = policies(c);
379
+ const configuredOverride = (() => {
380
+ const configured = overrides?.[key];
381
+ if (configured !== undefined)
382
+ return configured;
383
+ const inheritedMethod = routePolicies.find((routePolicy) => routePolicy !== false && routePolicy.inheritOverridesFrom !== undefined)?.inheritOverridesFrom;
384
+ if (inheritedMethod === undefined)
385
+ return undefined;
386
+ const inheritedKey = `${inheritedMethod.toUpperCase()} ${key.slice(key.indexOf(' ') + 1)}`;
387
+ return overrides?.[inheritedKey];
388
+ })();
389
+ const routeOverride = management && configuredOverride ? { mpp: configuredOverride.mpp } : configuredOverride;
390
+ return {
391
+ management,
392
+ policy: bindMppScope(resolvePolicy(options.base, options.defaults, [...routePolicies, routeOverride], description), scope),
393
+ };
394
+ }
395
+ function createApiKeyResolver(options) {
396
+ const requests = new WeakMap();
397
+ const uncached = (c, token) => {
398
+ const kv = contextKv(c);
399
+ return kv
400
+ ? ApiKeys.resolve(kv.store, token, { scopeCatalog: options.scopeCatalog })
401
+ : Promise.resolve(null);
402
+ };
403
+ const cache = options.apiKey === false || options.apiKey?.cache === false
404
+ ? { invalidate: () => { }, peek: () => undefined, resolve: uncached }
405
+ : cachedResolve(uncached, options.apiKey?.cache ?? {});
406
+ return {
407
+ peek: (c, token) => {
408
+ const tokenHash = ApiKey.hash(token);
409
+ const existing = requests.get(c);
410
+ if (existing?.tokenHash === tokenHash)
411
+ return existing.apiKey;
412
+ return cache.peek(token);
413
+ },
414
+ resolve: async (c, token) => {
415
+ const tokenHash = ApiKey.hash(token);
416
+ const existing = requests.get(c);
417
+ if (existing?.tokenHash === tokenHash)
418
+ return existing.apiKey;
419
+ 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;
426
+ if (cached && !apiKey)
427
+ cache.invalidate(token);
428
+ requests.set(c, { apiKey, tokenHash });
429
+ return apiKey;
430
+ },
431
+ };
432
+ }
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
+ /** Zod schemas documenting the session sign-in surface. */
366
445
  var schema;
367
446
  (function (schema) {
368
447
  const siweMessage = 'api.tempo.xyz wants you to sign in with your Ethereum account:\n0x0000000000000000000000000000000000000000\n\nURI: https://api.tempo.xyz\nVersion: 1\nChain ID: 0\nNonce: 3D0sZfnHqTBmc9tKR\nIssued At: 2026-01-01T00:00:00.000Z\nExpiration Time: 2026-01-01T00:10:00.000Z';
@@ -379,19 +458,19 @@ var schema;
379
458
  let challenge;
380
459
  (function (challenge) {
381
460
  /** Request body. Accepted fields beyond this document pass through to the SDK handler. */
382
- challenge.Body = z.object({});
461
+ challenge.Body = OpenApi.component(z.object({}), 'SiweChallengeRequest');
383
462
  /** Response body. */
384
- challenge.Response = z.object({
463
+ challenge.Response = OpenApi.component(z.object({
385
464
  message: z
386
465
  .string()
387
466
  .check(z.describe('Single-use EIP-4361 (SIWE) message to sign and submit for verification.'), z.meta({ examples: [siweMessage] })),
388
- });
467
+ }), 'SiweChallengeResponse');
389
468
  })(challenge = schema.challenge || (schema.challenge = {}));
390
469
  /** Schemas for `POST /v1/auth/siwe` (verify). */
391
470
  let verify;
392
471
  (function (verify) {
393
472
  /** Request body. */
394
- verify.Body = z.object({
473
+ verify.Body = OpenApi.component(z.object({
395
474
  address: z
396
475
  .string()
397
476
  .check(z.describe('Wallet address that signed the message; becomes the session subject.'), z.meta({ examples: ['0x0000000000000000000000000000000000000001'] })),
@@ -407,14 +486,26 @@ var schema;
407
486
  signature: z
408
487
  .string()
409
488
  .check(z.describe('Signature over the challenge message (or the key-authorization digest).'), z.meta({ examples: [`0x${'aa'.repeat(65)}`] })),
410
- });
489
+ }), 'SiweVerifyRequest');
411
490
  /** Response body. */
412
- verify.Response = z.object({
491
+ verify.Response = OpenApi.component(z.object({
413
492
  token: z
414
493
  .optional(z.string())
415
494
  .check(z.describe('Bearer session token; present only when `returnToken` is true.'), z.meta({ examples: ['aa'.repeat(32)] })),
416
- });
495
+ }), 'SiweVerifyResponse');
417
496
  })(verify = schema.verify || (schema.verify = {}));
497
+ /** Schemas for `POST /v1/auth/identity`. */
498
+ let identity;
499
+ (function (identity) {
500
+ /** Request body. */
501
+ identity.Body = OpenApi.component(z.object({
502
+ idToken: z
503
+ .string()
504
+ .check(z.describe('Wallet-issued OpenID Connect identity token.'), z.meta({ examples: ['eyJhbGciOiJFZERTQSJ9.eyJzdWIiOiIweDAwMDAifQ.c2lnbmF0dXJl'] })),
505
+ }), 'IdentitySignInRequest');
506
+ /** Response body. */
507
+ identity.Response = OpenApi.component(z.object({}), 'IdentitySignInResponse');
508
+ })(identity = schema.identity || (schema.identity = {}));
418
509
  })(schema || (schema = {}));
419
510
  /** `{ error }` response for a sign-in handler failure status. */
420
511
  function handlerError(description) {
@@ -431,17 +522,34 @@ function handlerError(description) {
431
522
  */
432
523
  export function install(options) {
433
524
  const { db, kv, scopeCatalog } = options;
434
- const { session: options_session, ...options_middleware } = options.auth === false ? {} : (options.auth ?? {});
525
+ const { edgeRateLimit: options_edgeRateLimit, session: options_session, ...options_middleware } = options.auth === false ? {} : (options.auth ?? {});
526
+ const publicClientIp = typeof options_middleware.public === 'object' ? options_middleware.public.clientIp : undefined;
435
527
  if (options_session && !kv)
436
528
  throw new Error('`auth.session` requires the `kv` state store: sessions and sign-in challenges persist there.'); // prettier-ignore
529
+ const options_betterAuth = options_session
530
+ ? {
531
+ basePath: Path.join(options.basePath, 'v1/auth'),
532
+ clientIp: (request) => resolveTrustedClientIp(request, publicClientIp),
533
+ db,
534
+ get email() {
535
+ return options.email();
536
+ },
537
+ rateLimit: RateLimit.memory(options_middleware.rateLimit),
538
+ secret: options_session.secret,
539
+ ...(options_session.google ? { google: options_session.google } : {}),
540
+ ...(options_session.trustedOrigins
541
+ ? { trustedOrigins: options_session.trustedOrigins }
542
+ : {}),
543
+ }
544
+ : undefined;
437
545
  // Session sign-in surface (challenge, verify, logout — SIWE wallet sign-in
438
546
  // today) plus the capability the session lane resolves through. Public but
439
547
  // policy-gated: the hidden describeRoute engages the middleware for the
440
548
  // mounted sub-app, and the public lane rate-limits challenge-store writes.
441
549
  const app = (() => {
442
- if (!options_session || !kv)
550
+ if (!options_betterAuth || !options_session || !kv)
443
551
  return undefined;
444
- const { issuer, origin, requireEmail, ttl } = (typeof options_session === 'object' ? options_session.wallet : undefined) ?? {};
552
+ const { issuer, origin, requireEmail, ttl } = options_session.wallet ?? {};
445
553
  const handler = Accounts.Handler.auth({
446
554
  getClient: options.getClient,
447
555
  ...(issuer || requireEmail
@@ -476,30 +584,108 @@ export function install(options) {
476
584
  },
477
585
  ...(ttl ? { ttl } : {}),
478
586
  });
587
+ const identity = options_session.identity;
588
+ const identitySessionTtl = identity?.ttl ?? defaultIdentitySessionTtl;
589
+ const identitySessionKey = (token) => `identity:session:${token}`;
590
+ async function resolveWallet(payload) {
591
+ const database = Db.get(db);
592
+ const verifiedEmail = payload.email?.trim().toLowerCase();
593
+ return database.kysely.transaction().execute(async (kysely) => {
594
+ const tx = { ...database, kysely };
595
+ // Organization creation locks the same address row before resolving
596
+ // the wallet owner, serializing resource writes with reconciliation.
597
+ const addressUser = await Users.getByAddressForUpdate(tx, payload.address);
598
+ if (!addressUser)
599
+ return null;
600
+ if (verifiedEmail)
601
+ await sql `SELECT pg_advisory_xact_lock(hashtextextended(${verifiedEmail}, 0))`.execute(kysely);
602
+ const linkedUserId = await AuthAccounts.getWalletUserId(tx, payload.address);
603
+ const linkedUser = linkedUserId ? await Users.get(tx, linkedUserId) : undefined;
604
+ const emailUser = verifiedEmail ? await Users.getByEmail(tx, verifiedEmail) : undefined;
605
+ const walletUser = linkedUser ?? addressUser;
606
+ const walletHasResources = emailUser && walletUser.id !== emailUser.id
607
+ ? await Memberships.existsForUser(tx, walletUser.id)
608
+ : false;
609
+ // A verified email reconciles a provisional email-less wallet link.
610
+ // Keep a provisional owner when changing it would orphan its access.
611
+ const user = walletHasResources ? walletUser : (emailUser ?? walletUser);
612
+ if (linkedUser?.id !== user.id)
613
+ await AuthAccounts.setWalletUser(tx, { address: payload.address, userId: user.id });
614
+ if (verifiedEmail && (user.email !== verifiedEmail || !user.emailVerified))
615
+ await Users.setEmail(tx, user.id, verifiedEmail);
616
+ return { email: verifiedEmail ?? user.email ?? undefined, user };
617
+ });
618
+ }
479
619
  const session = {
480
620
  resolve: async (c) => {
481
- const payload = await handler.getSession(c.req.raw);
482
- if (!payload)
621
+ const [betterAuth, identitySession, wallet] = await Promise.all([
622
+ (async () => {
623
+ const auth = BetterAuth.fromContext(c, options_betterAuth);
624
+ const request = BetterAuth.request(c, options_betterAuth);
625
+ const result = await auth.api.getSession({ headers: request.headers });
626
+ if (!result)
627
+ return null;
628
+ const provider = 'provider' in result.session && typeof result.session.provider === 'string'
629
+ ? result.session.provider
630
+ : undefined;
631
+ if (!provider ||
632
+ !result.user.email ||
633
+ (provider === 'email' && !options_betterAuth.email))
634
+ return null;
635
+ return {
636
+ email: result.user.email,
637
+ id: result.user.id,
638
+ identity: { provider, subject: result.user.email },
639
+ type: 'session',
640
+ };
641
+ })(),
642
+ (async () => {
643
+ if (!identity)
644
+ return null;
645
+ const token = getCookie(c, identityCookieName);
646
+ if (!token)
647
+ return null;
648
+ const value = await kv.store.get(identitySessionKey(token));
649
+ if (value === null)
650
+ return null;
651
+ const payload = JSON.parse(value);
652
+ if (payload.expiresAt <= Math.floor(Date.now() / 1_000))
653
+ return null;
654
+ const user = await resolveWallet(payload);
655
+ if (!user)
656
+ return null;
657
+ return {
658
+ ...(user.email ? { email: user.email } : {}),
659
+ id: user.user.id,
660
+ identity: { provider: 'wallet', subject: payload.address },
661
+ type: 'session',
662
+ };
663
+ })(),
664
+ (async () => {
665
+ const payload = await handler.getSession(c.req.raw);
666
+ if (!payload)
667
+ return null;
668
+ const user = await resolveWallet(payload);
669
+ if (!user)
670
+ return null;
671
+ return {
672
+ ...(user.email ? { email: user.email } : {}),
673
+ id: user.user.id,
674
+ identity: { provider: 'wallet', subject: payload.address },
675
+ type: 'session',
676
+ };
677
+ })(),
678
+ ]);
679
+ if (betterAuth && identitySession && betterAuth.id !== identitySession.id)
483
680
  return null;
484
- const database = Db.get(db);
485
- const user = await Users.getByAddress(database, payload.address);
486
- if (!user)
681
+ if (betterAuth && wallet && betterAuth.id !== wallet.id)
487
682
  return null;
488
- // Fold a newly verified email onto the user row: identity tokens are
489
- // optional per sign-in, so the column fills lazily.
490
- if (payload.email && user.email !== payload.email)
491
- await Users.setEmail(database, user.id, payload.email);
492
- const email = payload.email ?? user.email ?? undefined;
493
- return {
494
- ...(email ? { email } : {}),
495
- id: user.id,
496
- identity: { provider: 'wallet', subject: payload.address },
497
- type: 'session',
498
- };
683
+ if (identitySession && wallet && identitySession.id !== wallet.id)
684
+ return null;
685
+ return betterAuth ?? identitySession ?? wallet;
499
686
  },
500
687
  };
501
688
  const policy_public = policy({ public: true });
502
- const policy_session = policy({ public: true, session: true });
503
689
  const describe = OpenApi.describeRoute({ hide: true });
504
690
  const app = new Hono()
505
691
  .use('/v1/auth/siwe', policy_public, describe)
@@ -507,10 +693,7 @@ export function install(options) {
507
693
  // Documented operations: pre-routes carrying the OpenAPI metadata and the
508
694
  // envelope-shaped body validation; the mounted handler owns behavior.
509
695
  // Statement form keeps them off the app type (`hc` surface).
510
- app.post('/v1/auth/siwe/challenge', policy_public, OpenApi.validate('json', schema.challenge.Body, {
511
- code: 'body_invalid',
512
- message: 'Invalid request body',
513
- }), OpenApi.describeRoute({
696
+ app.post('/v1/auth/siwe/challenge', policy_public, OpenApi.documentJsonRequest(schema.challenge.Body), validateJsonRequest(schema.challenge.Body), OpenApi.describeRoute({
514
697
  description: 'Issues a single-use SIWE challenge message to sign. The challenge expires after a short TTL.',
515
698
  // Overrides the surface-wide hidden mount guard for this documented route.
516
699
  hide: false,
@@ -528,10 +711,7 @@ export function install(options) {
528
711
  summary: 'Create challenge (SIWE)',
529
712
  tags: ['Authentication'],
530
713
  }));
531
- app.post('/v1/auth/siwe', policy_public, OpenApi.validate('json', schema.verify.Body, {
532
- code: 'body_invalid',
533
- message: 'Invalid request body',
534
- }), OpenApi.describeRoute({
714
+ app.post('/v1/auth/siwe', policy_public, OpenApi.documentJsonRequest(schema.verify.Body), validateJsonRequest(schema.verify.Body), OpenApi.describeRoute({
535
715
  description: 'Verifies the signed challenge and establishes a session. Sets a session cookie by default; pass `returnToken` to receive a bearer token instead.',
536
716
  hide: false,
537
717
  operationId: 'verifySiwe',
@@ -557,35 +737,257 @@ export function install(options) {
557
737
  summary: 'Authenticate (SIWE)',
558
738
  tags: ['Authentication'],
559
739
  }));
560
- app.post('/v1/auth/siwe/logout', policy_session, OpenApi.describeRoute({
561
- description: 'Revokes the current session and clears the session cookie.',
740
+ if (identity)
741
+ app.post('/v1/auth/identity', policy_public, OpenApi.documentJsonRequest(schema.identity.Body), validateJsonRequest(schema.identity.Body), OpenApi.describeRoute({
742
+ description: 'Verifies a Wallet-issued OpenID Connect identity token and establishes a session.',
743
+ hide: false,
744
+ operationId: 'verifyIdentity',
745
+ responses: {
746
+ 200: {
747
+ content: {
748
+ 'application/json': { schema: OpenApi.resolver(schema.identity.Response) },
749
+ },
750
+ description: 'Session established.',
751
+ headers: {
752
+ ...OpenApi.successHeaders,
753
+ 'Set-Cookie': {
754
+ description: `Session cookie (${identityCookieName}).`,
755
+ schema: { type: 'string' },
756
+ },
757
+ },
758
+ },
759
+ 400: OpenApi.standardError(400, 'Malformed request body.', ['body_invalid']),
760
+ 401: OpenApi.standardError(401, 'Identity verification failed.', ['identity_invalid']),
761
+ 429: OpenApi.standardError(429, 'Rate limited.'),
762
+ 500: OpenApi.standardError(500, 'Internal server error.'),
763
+ },
764
+ summary: 'Authenticate identity',
765
+ tags: ['Authentication'],
766
+ }), async (c) => {
767
+ const { idToken } = schema.identity.Body.parse(await c.req.json());
768
+ const claims = await Accounts.Identity.verify(idToken, {
769
+ audience: identity.audience,
770
+ issuer: identity.issuer ?? walletIdentityIssuer,
771
+ }).catch((error) => {
772
+ // Issuer and network failures must reach the request error signal.
773
+ if (isIdentityTokenError(error))
774
+ return undefined;
775
+ throw error;
776
+ });
777
+ if (!claims || !Address.validate(claims.subject, { strict: false }))
778
+ return Response.error(c, {
779
+ code: 'identity_invalid',
780
+ message: 'Invalid identity token',
781
+ status: 401,
782
+ });
783
+ const address = Address.checksum(claims.subject);
784
+ await Users.upsertByAddress(Db.get(db), { address });
785
+ const issuedAt = Math.floor(Date.now() / 1_000);
786
+ const token = Hex.fromBytes(crypto.getRandomValues(new Uint8Array(32))).slice(2);
787
+ await kv.store.put(identitySessionKey(token), JSON.stringify({
788
+ address,
789
+ ...(claims.email ? { email: claims.email } : {}),
790
+ expiresAt: issuedAt + identitySessionTtl,
791
+ issuedAt,
792
+ }), { ttl: identitySessionTtl * 1_000 });
793
+ setCookie(c, identityCookieName, token, {
794
+ httpOnly: true,
795
+ maxAge: identitySessionTtl,
796
+ path: '/',
797
+ sameSite: 'Lax',
798
+ secure: new URL(c.req.url).protocol === 'https:',
799
+ });
800
+ return c.json({}, 200);
801
+ });
802
+ app.post('/v1/auth/logout', policy(false), createMiddleware(async (c, next) => {
803
+ const auth = c.get('auth');
804
+ const principal = principalFromPublic(c, auth);
805
+ const result = await consumeRateLimit(auth, {
806
+ key: `public:${principal.id}`,
807
+ limit: auth.publicRateLimit ?? defaultPublicRateLimit,
808
+ });
809
+ if (result) {
810
+ setRateLimitHeaders(c, result);
811
+ if (!result.allowed)
812
+ return rateLimitExceeded(c, result);
813
+ }
814
+ c.set('principal', principal);
815
+ await next();
816
+ return undefined;
817
+ }), OpenApi.describeRoute({
818
+ description: 'Revokes auth sessions and clears their cookies.',
562
819
  hide: false,
563
- operationId: 'siweLogout',
820
+ operationId: 'logout',
564
821
  responses: {
565
- 204: { description: 'Session revoked and cookie cleared.' },
822
+ 204: { description: 'Sessions revoked and cookies cleared.' },
566
823
  429: OpenApi.standardError(429, 'Rate limited.'),
567
- 500: OpenApi.standardError(500, 'Internal server error.'),
824
+ 500: OpenApi.standardError(500, 'Session logout failed.', ['session_logout_failed']),
568
825
  },
569
826
  summary: 'Sign out',
570
827
  tags: ['Authentication'],
571
- }));
828
+ }), async (c) => {
829
+ const walletHeaders = (() => {
830
+ const authorization = c.req.header('authorization');
831
+ const cookie = c.req.header('cookie');
832
+ if (!authorization?.match(/^Bearer\s+.+$/i) || !cookie?.match(/(?:^|;\s*)accounts_auth=/))
833
+ return [c.req.raw.headers];
834
+ const bearer = new Headers(c.req.raw.headers);
835
+ bearer.delete('cookie');
836
+ const cookie_ = new Headers(c.req.raw.headers);
837
+ cookie_.delete('authorization');
838
+ return [bearer, cookie_];
839
+ })();
840
+ const [betterAuth, identityLogout, ...accounts] = await Promise.allSettled([
841
+ BetterAuth.fromContext(c, options_betterAuth).api.signOut({
842
+ headers: c.req.raw.headers,
843
+ returnHeaders: true,
844
+ }),
845
+ (async () => {
846
+ const token = getCookie(c, identityCookieName);
847
+ deleteCookie(c, identityCookieName, { path: '/' });
848
+ if (token)
849
+ await kv.store.delete(identitySessionKey(token));
850
+ })(),
851
+ ...walletHeaders.map((headers) => handler.request(new Request(new URL('/logout', c.req.url), {
852
+ headers,
853
+ method: 'POST',
854
+ }))),
855
+ ]);
856
+ if (betterAuth.status === 'fulfilled')
857
+ for (const cookie of splitSetCookieHeader(betterAuth.value.headers.get('Set-Cookie') ?? ''))
858
+ c.header('Set-Cookie', cookie, { append: true });
859
+ for (const result of accounts)
860
+ if (result.status === 'fulfilled')
861
+ for (const cookie of splitSetCookieHeader(result.value.headers.get('Set-Cookie') ?? ''))
862
+ c.header('Set-Cookie', cookie, { append: true });
863
+ const error = (() => {
864
+ const rejected = [betterAuth, identityLogout, ...accounts].find((result) => result.status === 'rejected');
865
+ if (rejected?.status === 'rejected')
866
+ return rejected.reason instanceof Error
867
+ ? rejected.reason
868
+ : new Error('Session logout failed', { cause: rejected.reason });
869
+ const failed = accounts.find((result) => result.status === 'fulfilled' && !result.value.ok);
870
+ if (failed?.status === 'fulfilled')
871
+ return new Error(`Accounts session logout failed with status ${failed.value.status}`);
872
+ return undefined;
873
+ })();
874
+ if (error) {
875
+ c.error = error;
876
+ return Response.error(c, {
877
+ code: 'session_logout_failed',
878
+ message: 'Session logout failed',
879
+ status: 500,
880
+ });
881
+ }
882
+ return c.body(null, 204);
883
+ });
884
+ app.route('/v1/auth/siwe', handler);
885
+ app.on(['GET', 'POST'], '/v1/auth/*', policy_public, describe, async (c, next) => {
886
+ if (c.req.method === 'POST' &&
887
+ stripBasePath(c.req.path, basePath(c)) === '/v1/auth/email-otp/send-verification-otp') {
888
+ const body = await c.req.raw
889
+ .clone()
890
+ .json()
891
+ .catch(() => undefined);
892
+ if (body && typeof body === 'object' && 'type' in body && body.type !== 'sign-in')
893
+ return Response.error(c, {
894
+ code: 'body_invalid',
895
+ message: 'Only sign-in OTPs are supported',
896
+ status: 400,
897
+ });
898
+ }
899
+ const response = await BetterAuth.fromContext(c, options_betterAuth).handler(BetterAuth.request(c, options_betterAuth));
900
+ // Leave unmatched paths available to auth providers mounted by the host app.
901
+ return response.status === 404 ? next() : response;
902
+ });
572
903
  return Object.assign(
573
904
  // The tag joins the `Management API` group at `management()`'s chosen slot;
574
905
  // group listings filter to defined tags, so it drops out when unmounted.
575
- Metadata.attach(app.route('/v1/auth/siwe', handler), {
906
+ Metadata.attach(app, {
907
+ securitySchemes: {
908
+ 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
910
+ in: 'header',
911
+ name: 'Cookie',
912
+ type: 'apiKey',
913
+ },
914
+ },
576
915
  tags: [{ name: 'Authentication', description: 'Authenticate into the Tempo Platform.' }],
577
916
  }), { session });
578
917
  })();
918
+ const resolve = createApiKeyResolver({
919
+ apiKey: options_middleware.apiKey,
920
+ db: options.db,
921
+ scopeCatalog,
922
+ });
923
+ const defaults = laneDefaults(options_middleware);
924
+ const base = {};
925
+ const edgeRateLimit = (() => {
926
+ if (options.auth === false || !options_edgeRateLimit)
927
+ return undefined;
928
+ const superAdminTokenHash = options_middleware.superAdmin?.secret
929
+ ? ApiKey.hash(options_middleware.superAdmin.secret)
930
+ : undefined;
931
+ return createMiddleware(async (c, next) => {
932
+ const credential = getApiKeyCredential(c);
933
+ const resolved = resolveRequestPolicy(c, { base, defaults, options: options_middleware });
934
+ const isSuperAdmin = credential &&
935
+ superAdminTokenHash !== undefined &&
936
+ ApiKey.hash(credential.token) === superAdminTokenHash;
937
+ const canUseApiKeyQuota = credential &&
938
+ !isSuperAdmin &&
939
+ !hasPaymentCredential(c) &&
940
+ options_middleware.apiKey !== false &&
941
+ resolved?.policy?.apiKey &&
942
+ (!resolved.management || (options_middleware.mpp !== false && resolved.policy.mpp));
943
+ const cached = canUseApiKeyQuota ? resolve.peek(c, credential.token) : undefined;
944
+ if (cached)
945
+ return next();
946
+ const response = await Timing.time(c, 'edge_rate_limit', () => options_edgeRateLimit(c.req.raw));
947
+ if (response)
948
+ return response;
949
+ if (canUseApiKeyQuota && cached === undefined)
950
+ await resolve.resolve(c, credential.token);
951
+ return next();
952
+ });
953
+ })();
579
954
  const middleware_ = options.auth === false
580
955
  ? undefined
581
- : middleware({
956
+ : createAuthMiddleware({
582
957
  ...options_middleware,
583
958
  ...(app ? { session: app.session } : {}),
584
959
  scopeCatalog,
585
- });
586
- return { app, middleware: middleware_ };
960
+ }, resolve);
961
+ return { app, edgeRateLimit, middleware: middleware_ };
587
962
  }
588
- /** Creates route middleware that contributes an auth policy override. */
963
+ function validateJsonRequest(schema) {
964
+ return async (c, next) => {
965
+ if (!c.req.header('content-type')?.toLowerCase().startsWith('application/json'))
966
+ return Response.error(c, {
967
+ code: 'body_invalid',
968
+ message: 'Invalid request body',
969
+ status: 400,
970
+ });
971
+ const value = await (async () => {
972
+ try {
973
+ return await c.req.raw.clone().json();
974
+ }
975
+ catch {
976
+ return undefined;
977
+ }
978
+ })();
979
+ const result = schema.safeParse(value);
980
+ if (!result.success)
981
+ return Response.error(c, {
982
+ code: 'body_invalid',
983
+ details: Response.validationDetails(result.error.issues),
984
+ message: 'Invalid request body',
985
+ status: 400,
986
+ });
987
+ return next();
988
+ };
989
+ }
990
+ /** Creates route middleware that contributes an auth policy override, or bypasses auth when passed `false`. */
589
991
  export function policy(options) {
590
992
  const middleware = createMiddleware((_, next) => next());
591
993
  middleware[policySymbol] = options;
@@ -601,7 +1003,7 @@ export function installMppManagementRoutes(app, options = {}) {
601
1003
  continue;
602
1004
  const target = targets.get(route.path) ?? { path: route.path };
603
1005
  const override = policyFromRoute(route);
604
- if (override?.mpp !== undefined)
1006
+ if (override && override.mpp !== undefined)
605
1007
  target.mpp = resolveMppLane(target.mpp, override.mpp, { session: {} });
606
1008
  const spec = openApiSpec(route);
607
1009
  if (spec) {
@@ -646,7 +1048,7 @@ function laneDefaults(options) {
646
1048
  scopes: apiKey?.scopes ?? [Scope.wildcard],
647
1049
  },
648
1050
  mpp: { session: {} },
649
- public: { rateLimit: public_?.rateLimit ?? { limit: 60, period: 'minute' } },
1051
+ public: { rateLimit: public_?.rateLimit ?? defaultPublicRateLimit },
650
1052
  session: true,
651
1053
  };
652
1054
  }
@@ -796,7 +1198,7 @@ export function describeAccess(app) {
796
1198
  if (typeof spec?.operationId === 'string')
797
1199
  group.operationId = spec.operationId;
798
1200
  const override = policyFromRoute(route);
799
- if (override)
1201
+ if (override !== undefined)
800
1202
  group.overrides.push(override);
801
1203
  groups.set(key, group);
802
1204
  }
@@ -809,7 +1211,12 @@ export function describeAccess(app) {
809
1211
  let public_ = false;
810
1212
  let mpp = false;
811
1213
  let session = false;
1214
+ let bypass = false;
812
1215
  for (const override of overrides) {
1216
+ if (override === false) {
1217
+ bypass = true;
1218
+ break;
1219
+ }
813
1220
  if (override.apiKey !== undefined)
814
1221
  apiKey = override.apiKey !== false;
815
1222
  if (override.apiKey && override.apiKey !== true && override.apiKey.scopes)
@@ -821,7 +1228,14 @@ export function describeAccess(app) {
821
1228
  if (override.session !== undefined)
822
1229
  session = override.session !== false;
823
1230
  }
824
- access[operationId] = { apiKey, mpp, public: public_, scopes: apiKey ? scopes : [], session };
1231
+ access[operationId] = {
1232
+ apiKey,
1233
+ ...(bypass ? { bypass: true } : {}),
1234
+ mpp,
1235
+ public: public_,
1236
+ scopes: apiKey ? scopes : [],
1237
+ session,
1238
+ };
825
1239
  }
826
1240
  return access;
827
1241
  }
@@ -862,14 +1276,17 @@ export function require(policy) {
862
1276
  const hasQueryApiKey = new URL(c.req.url).searchParams.has('key');
863
1277
  // Auth owns `key`; strict route schemas must not validate it.
864
1278
  stripApiKeyQuery(c);
865
- // Reject unknown chains before MPP builds a chain-bound challenge. Route
866
- // groups publish their supported chains into the shared app context.
867
1279
  const chainId = explicitChainId(c);
868
1280
  const supportedChainIds = c.var['supportedChainIds'];
869
- if (chainId !== undefined &&
870
- supportedChainIds instanceof Set &&
871
- !supportedChainIds.has(chainId))
872
- return Response.unsupportedChainId(c, chainId, supportedChainIds);
1281
+ const unsupportedChain = (() => {
1282
+ if (chainId === undefined ||
1283
+ !(supportedChainIds instanceof Set) ||
1284
+ supportedChainIds.has(chainId))
1285
+ return undefined;
1286
+ return { chainId, supportedChainIds };
1287
+ })();
1288
+ if (unsupportedChain && !credential)
1289
+ return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
873
1290
  const proceed = async () => {
874
1291
  await next();
875
1292
  // Query credential responses must not enter shared caches.
@@ -890,11 +1307,15 @@ export function require(policy) {
890
1307
  // The super admin secret precedes key lookup: it is not a stored key.
891
1308
  // It must never reach KV resolution or scope/quota checks.
892
1309
  if (auth.superAdmin && ApiKey.hash(credential.token) === auth.superAdmin.tokenHash) {
1310
+ if (unsupportedChain)
1311
+ return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
893
1312
  c.set('principal', { actor: 'super_admin', id: 'super_admin', type: 'super_admin' });
894
1313
  return proceed();
895
1314
  }
896
1315
  const apiKey_resolved = await auth.apiKey?.resolve(c, credential.token);
897
1316
  if (!apiKey_resolved) {
1317
+ if (unsupportedChain)
1318
+ return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
898
1319
  // A bearer session token is indistinguishable from an API key at the
899
1320
  // header, so a failed key lookup falls through to the session lane
900
1321
  // before rejecting.
@@ -931,6 +1352,28 @@ export function require(policy) {
931
1352
  message: 'API key not permitted for this route',
932
1353
  status: 403,
933
1354
  });
1355
+ // Non-paid requests consume API-key quota before rejection. Paid
1356
+ // requests use the MPP quota after access checks.
1357
+ const scope = policy.apiKey.scopes[0] ?? Scope.wildcard;
1358
+ const throttled = apiKey.environment === 'sandbox' && apiKey.billingActive !== true;
1359
+ const limit = throttled
1360
+ ? (policy.public?.rateLimit ?? auth.publicRateLimit ?? { limit: 60, period: 'minute' })
1361
+ : resolveApiKeyLimit({ apiKey, auth, policy: policy.apiKey, scope });
1362
+ const paid = hasPayment && !throttled;
1363
+ const result = paid
1364
+ ? null
1365
+ : await consumeRateLimit(auth, {
1366
+ key: `api_key:${apiKey.id}:scope:${scope}`,
1367
+ limit,
1368
+ });
1369
+ if (result) {
1370
+ setRateLimitHeaders(c, result);
1371
+ // Surface the bucket so callers can correlate a 429 with the exhausted
1372
+ // quota. MPP challenges own their headers and drop these by design.
1373
+ c.header('RateLimit-Scope', scope);
1374
+ }
1375
+ if (unsupportedChain)
1376
+ return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
934
1377
  if (apiKey.allowedIps.length &&
935
1378
  !(await IpAllowlist.allows(c, {
936
1379
  address: trustedClientIp(c, auth),
@@ -958,53 +1401,25 @@ export function require(policy) {
958
1401
  message: 'API key missing required scope',
959
1402
  status: 403,
960
1403
  });
961
- // Sandbox keys without active billing are throttled to the public quota.
962
- // `billingActive` is snapshotted on the key record (stamped at mint,
963
- // re-synced when billing changes), so this needs no billing read on the
964
- // request path. Resolved before the paid lane so a payment credential
965
- // can't buy past the throttle: sandbox is non-billable testnet.
966
- const throttled = apiKey.environment === 'sandbox' && apiKey.billingActive !== true;
967
- if (hasPayment && !throttled)
1404
+ if (paid)
968
1405
  return requirePayment(c, proceed, {
969
1406
  auth,
970
1407
  payment: { reason: 'api_key_over_quota', type: 'mpp' },
971
1408
  policy,
972
1409
  principal,
973
1410
  });
974
- if (policy.apiKey) {
975
- // A route consumes exactly one quota bucket: its single required scope,
976
- // else `'*'` (zero scopes). Routes today require at most one scope; a
977
- // future multi-scope route buckets against its first scope.
978
- const scope = policy.apiKey.scopes[0] ?? Scope.wildcard;
979
- // A throttled sandbox key shares the key's bucket but at the public
980
- // ceiling, so activating billing lifts the limit on the same counter.
981
- const limit = throttled
982
- ? (policy.public?.rateLimit ?? auth.publicRateLimit ?? { limit: 60, period: 'minute' })
983
- : resolveApiKeyLimit({ apiKey, auth, policy: policy.apiKey, scope });
984
- const result = await consumeRateLimit(auth, {
985
- key: `api_key:${apiKey.id}:scope:${scope}`,
986
- limit,
1411
+ if (result && !result.allowed) {
1412
+ // A throttled sandbox key gets a plain 429, never an MPP challenge. It
1413
+ // must activate billing to lift the ceiling, not pay per request.
1414
+ if (throttled)
1415
+ return rateLimitExceeded(c, result);
1416
+ return requirePaymentOrRateLimit(c, proceed, {
1417
+ auth,
1418
+ payment: { reason: 'api_key_over_quota', type: 'mpp' },
1419
+ policy,
1420
+ principal,
1421
+ rateLimit: result,
987
1422
  });
988
- if (result) {
989
- setRateLimitHeaders(c, result);
990
- // Surface the bucket so callers can correlate a 429 with the exhausted
991
- // quota. Set before the over-quota branch so it rides the 429 (an MPP
992
- // 402 challenge is owned by mppx and drops these headers — by design).
993
- c.header('RateLimit-Scope', scope);
994
- }
995
- if (result && !result.allowed) {
996
- // A throttled sandbox key gets a plain 429, never an MPP challenge —
997
- // it must activate billing to lift the ceiling, not pay per request.
998
- if (throttled)
999
- return rateLimitExceeded(c, result);
1000
- return requirePaymentOrRateLimit(c, proceed, {
1001
- auth,
1002
- payment: { reason: 'api_key_over_quota', type: 'mpp' },
1003
- policy,
1004
- principal,
1005
- rateLimit: result,
1006
- });
1007
- }
1008
1423
  }
1009
1424
  return proceed();
1010
1425
  }
@@ -1074,7 +1489,8 @@ export function require(policy) {
1074
1489
  * server-side — we just stop waiting for it.
1075
1490
  */
1076
1491
  const rateLimitConsumeTimeout = 300;
1077
- function consumeRateLimit(auth, options) {
1492
+ /** Consumes one quota and returns null when its counter is unavailable, allowing callers to fail open. */
1493
+ export function consumeRateLimit(auth, options) {
1078
1494
  if (!auth.rateLimit)
1079
1495
  return Promise.resolve(null);
1080
1496
  // Fail open: a rate-limit store error (e.g. a lost Durable Object connection)
@@ -1160,12 +1576,15 @@ function clientIp(c, auth) {
1160
1576
  return auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip');
1161
1577
  }
1162
1578
  function trustedClientIp(c, auth) {
1163
- if (auth.publicClientIp)
1164
- return auth.publicClientIp(c.req.raw);
1579
+ return resolveTrustedClientIp(c.req.raw, auth.publicClientIp);
1580
+ }
1581
+ function resolveTrustedClientIp(request, resolve) {
1582
+ if (resolve)
1583
+ return resolve(request);
1165
1584
  // Cloudflare supplies both the request metadata and this header.
1166
- if (!('cf' in c.req.raw))
1585
+ if (!('cf' in request))
1167
1586
  return undefined;
1168
- return c.req.header('cf-connecting-ip');
1587
+ return request.headers.get('cf-connecting-ip') ?? undefined;
1169
1588
  }
1170
1589
  /** Removes the reserved auth query parameter before route validation. */
1171
1590
  function stripApiKeyQuery(c) {
@@ -1348,19 +1767,13 @@ function setRateLimitHeaders(c, result) {
1348
1767
  function contextKv(c) {
1349
1768
  return c.get('kv');
1350
1769
  }
1351
- // Resolve the session lane from the auth context's capability. Failures
1352
- // resolve to `null` so the remaining lanes and the final `401` still apply.
1770
+ // Resolve the session lane from the auth context's capability. Dependency
1771
+ // failures propagate to the app error boundary instead of becoming a `401`.
1353
1772
  async function resolveSession(c, auth) {
1354
1773
  const session = auth.session;
1355
1774
  if (!session)
1356
1775
  return null;
1357
- try {
1358
- return await session.resolve(c);
1359
- }
1360
- catch (error) {
1361
- console.error('[auth] session resolve failed; treating as no session', error);
1362
- return null;
1363
- }
1776
+ return session.resolve(c);
1364
1777
  }
1365
1778
  /** Maximum resolve-cache entries held per isolate before eviction. */
1366
1779
  const cachedMaxEntries = 10_000;
@@ -1377,39 +1790,54 @@ function cachedResolve(resolve, options) {
1377
1790
  const { negativeTtl = 10_000, now = Date.now, ttl = 60_000 } = options;
1378
1791
  const cells = new Map();
1379
1792
  const flights = new Map();
1380
- return async (c, token) => {
1381
- // Versioned so a future record-shape change can't serve stale shapes.
1382
- const key = `v1:${ApiKey.hash(token)}`;
1383
- const cell = cells.get(key);
1384
- if (cell && cell.expiresAt > now())
1385
- return cell.value;
1386
- if (cell)
1793
+ return {
1794
+ invalidate(token) {
1795
+ cells.delete(`v1:${ApiKey.hash(token)}`);
1796
+ },
1797
+ peek(token) {
1798
+ const key = `v1:${ApiKey.hash(token)}`;
1799
+ const cell = cells.get(key);
1800
+ if (!cell)
1801
+ return undefined;
1802
+ if (cell.expiresAt > now())
1803
+ return cell.value;
1387
1804
  cells.delete(key);
1388
- const existing = flights.get(key);
1389
- if (existing)
1390
- return existing;
1391
- const flight = (async () => {
1392
- const value = await resolve(c, token);
1393
- // Bound the cache: random invalid tokens each add a (negative) entry,
1394
- // so sweep expired cells at the cap and then drop the oldest.
1395
- if (cells.size >= cachedMaxEntries) {
1396
- const time = now();
1397
- for (const [name, entry] of cells)
1398
- if (entry.expiresAt <= time)
1399
- cells.delete(name);
1400
- while (cells.size >= cachedMaxEntries)
1401
- cells.delete(cells.keys().next().value);
1805
+ return undefined;
1806
+ },
1807
+ async resolve(c, token) {
1808
+ // Versioned so a future record-shape change can't serve stale shapes.
1809
+ const key = `v1:${ApiKey.hash(token)}`;
1810
+ const cell = cells.get(key);
1811
+ if (cell && cell.expiresAt > now())
1812
+ return cell.value;
1813
+ if (cell)
1814
+ 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;
1402
1836
  }
1403
- cells.set(key, { expiresAt: now() + (value ? ttl : negativeTtl), value });
1404
- return value;
1405
- })();
1406
- flights.set(key, flight);
1407
- try {
1408
- return await flight;
1409
- }
1410
- finally {
1411
- flights.delete(key);
1412
- }
1837
+ finally {
1838
+ flights.delete(key);
1839
+ }
1840
+ },
1413
1841
  };
1414
1842
  }
1415
1843
  /** Thrown when a rate-limit consume exceeds {@link rateLimitConsumeTimeout}. */