tapimo 0.14.0 → 0.15.1

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