tapimo 0.15.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +893 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +70 -70
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +529 -76
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +157 -157
  45. package/dist/admin/index.d.ts +0 -1
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +0 -1
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/ui.generated.d.ts +1 -1
  50. package/dist/admin/ui.generated.d.ts.map +1 -1
  51. package/dist/admin/ui.generated.js +205 -201
  52. package/dist/admin/ui.generated.js.map +1 -1
  53. package/dist/analytics/Analytics.d.ts.map +1 -1
  54. package/dist/analytics/Analytics.js +65 -1
  55. package/dist/analytics/Analytics.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  57. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  58. package/dist/analytics/tables/requestEvents.js +58 -59
  59. package/dist/analytics/tables/requestEvents.js.map +1 -1
  60. package/dist/apps/data/App.d.ts +2709 -2670
  61. package/dist/apps/data/App.d.ts.map +1 -1
  62. package/dist/apps/data/routes/activities.d.ts +357 -357
  63. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  64. package/dist/apps/data/routes/activities.js +50 -0
  65. package/dist/apps/data/routes/activities.js.map +1 -1
  66. package/dist/apps/data/routes/addresses.d.ts +248 -248
  67. package/dist/apps/data/routes/balances.d.ts +22 -22
  68. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  69. package/dist/apps/data/routes/balances.js +5 -7
  70. package/dist/apps/data/routes/balances.js.map +1 -1
  71. package/dist/apps/data/routes/blocks.d.ts +125 -125
  72. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  73. package/dist/apps/data/routes/earn.d.ts +103 -12
  74. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  75. package/dist/apps/data/routes/earn.js +456 -220
  76. package/dist/apps/data/routes/earn.js.map +1 -1
  77. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  78. package/dist/apps/data/routes/exchanges.js +267 -97
  79. package/dist/apps/data/routes/exchanges.js.map +1 -1
  80. package/dist/apps/data/routes/fee-amm.d.ts +109 -127
  81. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.js +83 -54
  83. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +43 -43
  85. package/dist/apps/data/routes/receipts.d.ts +235 -235
  86. package/dist/apps/data/routes/rpc.d.ts +30 -30
  87. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  88. package/dist/apps/data/routes/tokens.js +11 -6
  89. package/dist/apps/data/routes/tokens.js.map +1 -1
  90. package/dist/apps/data/routes/transactions.d.ts +2 -0
  91. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  92. package/dist/apps/data/routes/transactions.js +30 -22
  93. package/dist/apps/data/routes/transactions.js.map +1 -1
  94. package/dist/apps/data/routes/transfers.d.ts +77 -77
  95. package/dist/apps/data/routes/valuation.d.ts +32 -32
  96. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  97. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  98. package/dist/apps/data/routes/webhooks.js +1 -1
  99. package/dist/apps/data/routes/webhooks.js.map +1 -1
  100. package/dist/apps/data/routes/zones.d.ts +31 -31
  101. package/dist/apps/management/App.d.ts +2909 -2064
  102. package/dist/apps/management/App.d.ts.map +1 -1
  103. package/dist/apps/management/App.js +2 -0
  104. package/dist/apps/management/App.js.map +1 -1
  105. package/dist/apps/management/Billing.d.ts +2 -4
  106. package/dist/apps/management/Billing.d.ts.map +1 -1
  107. package/dist/apps/management/Billing.js +65 -26
  108. package/dist/apps/management/Billing.js.map +1 -1
  109. package/dist/apps/management/routes/api-keys.d.ts +257 -245
  110. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  111. package/dist/apps/management/routes/api-keys.js +70 -11
  112. package/dist/apps/management/routes/api-keys.js.map +1 -1
  113. package/dist/apps/management/routes/billing.d.ts +84 -84
  114. package/dist/apps/management/routes/cli.d.ts +912 -0
  115. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  116. package/dist/apps/management/routes/cli.js +416 -0
  117. package/dist/apps/management/routes/cli.js.map +1 -0
  118. package/dist/apps/management/routes/faucet.d.ts +8 -8
  119. package/dist/apps/management/routes/invitations.d.ts +138 -138
  120. package/dist/apps/management/routes/invite-links.d.ts +172 -172
  121. package/dist/apps/management/routes/members.d.ts +16 -16
  122. package/dist/apps/management/routes/orgs.d.ts +104 -104
  123. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  124. package/dist/apps/management/routes/orgs.js +8 -2
  125. package/dist/apps/management/routes/orgs.js.map +1 -1
  126. package/dist/apps/management/routes/projects.d.ts +125 -125
  127. package/dist/apps/management/routes/usage.d.ts +8 -8
  128. package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
  129. package/dist/apps/management/routes/webhooks.d.ts +485 -485
  130. package/dist/apps/mpp/App.d.ts +44 -44
  131. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  132. package/dist/apps/mpp/internal/Policy.js +4 -2
  133. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  134. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  135. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  136. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  137. package/dist/apps/relay/App.d.ts +8 -0
  138. package/dist/apps/relay/App.d.ts.map +1 -1
  139. package/dist/apps/relay/App.js +16 -4
  140. package/dist/apps/relay/App.js.map +1 -1
  141. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  142. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  143. package/dist/apps/relay/Sponsorships.js +71 -60
  144. package/dist/apps/relay/Sponsorships.js.map +1 -1
  145. package/dist/apps/routes/Access.d.ts +53 -0
  146. package/dist/apps/routes/Access.d.ts.map +1 -1
  147. package/dist/apps/routes/Access.js +121 -0
  148. package/dist/apps/routes/Access.js.map +1 -1
  149. package/dist/apps/routes/App.d.ts +397 -158
  150. package/dist/apps/routes/App.d.ts.map +1 -1
  151. package/dist/apps/routes/App.js.map +1 -1
  152. package/dist/apps/routes/routes/chains.d.ts +25 -25
  153. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  154. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  155. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  156. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  157. package/dist/apps/routes/routes/quotes.d.ts +171 -81
  158. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  159. package/dist/apps/routes/routes/quotes.js +101 -27
  160. package/dist/apps/routes/routes/quotes.js.map +1 -1
  161. package/dist/apps/routes/routes/transfers.d.ts +532 -480
  162. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/transfers.js +182 -37
  164. package/dist/apps/routes/routes/transfers.js.map +1 -1
  165. package/dist/cli/ApiKeys.d.ts +120 -0
  166. package/dist/cli/ApiKeys.d.ts.map +1 -0
  167. package/dist/cli/ApiKeys.js +138 -0
  168. package/dist/cli/ApiKeys.js.map +1 -0
  169. package/dist/cli/Cli.d.ts +92 -34
  170. package/dist/cli/Cli.d.ts.map +1 -1
  171. package/dist/cli/Cli.js +188 -11
  172. package/dist/cli/Cli.js.map +1 -1
  173. package/dist/cli/Credentials.d.ts +95 -0
  174. package/dist/cli/Credentials.d.ts.map +1 -0
  175. package/dist/cli/Credentials.js +110 -0
  176. package/dist/cli/Credentials.js.map +1 -0
  177. package/dist/cli/Spec.d.ts +59 -0
  178. package/dist/cli/Spec.d.ts.map +1 -0
  179. package/dist/cli/Spec.js +77 -0
  180. package/dist/cli/Spec.js.map +1 -0
  181. package/dist/cli/bin.js +5 -1
  182. package/dist/cli/bin.js.map +1 -1
  183. package/dist/cli/commands/admin.d.ts +5 -5
  184. package/dist/cli/commands/admin.d.ts.map +1 -1
  185. package/dist/cli/commands/auth.d.ts +73 -0
  186. package/dist/cli/commands/auth.d.ts.map +1 -0
  187. package/dist/cli/commands/auth.js +204 -0
  188. package/dist/cli/commands/auth.js.map +1 -0
  189. package/dist/cli/commands/keys.d.ts +17 -0
  190. package/dist/cli/commands/keys.d.ts.map +1 -0
  191. package/dist/cli/commands/keys.js +109 -0
  192. package/dist/cli/commands/keys.js.map +1 -0
  193. package/dist/cloudflare.d.ts +27 -2
  194. package/dist/cloudflare.d.ts.map +1 -1
  195. package/dist/cloudflare.js +144 -17
  196. package/dist/cloudflare.js.map +1 -1
  197. package/dist/db/Db.d.ts +23 -0
  198. package/dist/db/Db.d.ts.map +1 -1
  199. package/dist/db/Db.js +413 -1
  200. package/dist/db/Db.js.map +1 -1
  201. package/dist/db/Schema.d.ts +44 -1
  202. package/dist/db/Schema.d.ts.map +1 -1
  203. package/dist/db/Schema.js +56 -3
  204. package/dist/db/Schema.js.map +1 -1
  205. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  206. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  207. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  208. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  209. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  210. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  211. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  212. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  213. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  214. package/dist/db/tables/authAccounts.js +1 -0
  215. package/dist/db/tables/authAccounts.js.map +1 -1
  216. package/dist/db/tables/earnVaults.d.ts +5 -1
  217. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  218. package/dist/db/tables/earnVaults.js +12 -1
  219. package/dist/db/tables/earnVaults.js.map +1 -1
  220. package/dist/db/tables/organizations.d.ts +4 -2
  221. package/dist/db/tables/organizations.d.ts.map +1 -1
  222. package/dist/db/tables/organizations.js +8 -34
  223. package/dist/db/tables/organizations.js.map +1 -1
  224. package/dist/db/tables/requestUsage.d.ts +5 -1
  225. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  226. package/dist/db/tables/requestUsage.js +10 -2
  227. package/dist/db/tables/requestUsage.js.map +1 -1
  228. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  229. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  230. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  231. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  232. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  233. package/dist/db/tables/rewardRuns.js +4 -0
  234. package/dist/db/tables/rewardRuns.js.map +1 -1
  235. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  236. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  237. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  238. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  239. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  240. package/dist/db/tables/routesDepositAddresses.js +84 -31
  241. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  242. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  243. package/dist/db/tables/routesDeposits.js +31 -21
  244. package/dist/db/tables/routesDeposits.js.map +1 -1
  245. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  246. package/dist/db/tables/routesIdempotency.js +2 -0
  247. package/dist/db/tables/routesIdempotency.js.map +1 -1
  248. package/dist/db/tables/routesPolicies.d.ts +58 -0
  249. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  250. package/dist/db/tables/routesPolicies.js +198 -0
  251. package/dist/db/tables/routesPolicies.js.map +1 -0
  252. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  253. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  254. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  255. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  256. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  257. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  258. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  259. package/dist/db/tables/routesTransfers.d.ts +26 -1
  260. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  261. package/dist/db/tables/routesTransfers.js +36 -6
  262. package/dist/db/tables/routesTransfers.js.map +1 -1
  263. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  264. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js +144 -33
  266. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  267. package/dist/db/tables/users.d.ts +2 -0
  268. package/dist/db/tables/users.d.ts.map +1 -1
  269. package/dist/db/tables/users.js +11 -0
  270. package/dist/db/tables/users.js.map +1 -1
  271. package/dist/handlers/internal/multisig.d.ts +1 -1
  272. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  273. package/dist/handlers/internal/multisig.js +3 -2
  274. package/dist/handlers/internal/multisig.js.map +1 -1
  275. package/dist/handlers/relay.d.ts +2 -0
  276. package/dist/handlers/relay.d.ts.map +1 -1
  277. package/dist/handlers/relay.js +34 -15
  278. package/dist/handlers/relay.js.map +1 -1
  279. package/dist/internal/Auth.d.ts +57 -6
  280. package/dist/internal/Auth.d.ts.map +1 -1
  281. package/dist/internal/Auth.js +182 -78
  282. package/dist/internal/Auth.js.map +1 -1
  283. package/dist/internal/BetterAuth.d.ts +22 -0
  284. package/dist/internal/BetterAuth.d.ts.map +1 -1
  285. package/dist/internal/BetterAuth.js +17 -14
  286. package/dist/internal/BetterAuth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts +5 -0
  288. package/dist/internal/Cache.d.ts.map +1 -1
  289. package/dist/internal/Cache.js +3 -1
  290. package/dist/internal/Cache.js.map +1 -1
  291. package/dist/internal/CliAuth.d.ts +243 -0
  292. package/dist/internal/CliAuth.d.ts.map +1 -0
  293. package/dist/internal/CliAuth.js +249 -0
  294. package/dist/internal/CliAuth.js.map +1 -0
  295. package/dist/internal/EarnSharePrices.d.ts +1 -1
  296. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  297. package/dist/internal/EarnSharePrices.js +7 -3
  298. package/dist/internal/EarnSharePrices.js.map +1 -1
  299. package/dist/internal/EarnVaults.d.ts +47 -0
  300. package/dist/internal/EarnVaults.d.ts.map +1 -1
  301. package/dist/internal/EarnVaults.js +188 -4
  302. package/dist/internal/EarnVaults.js.map +1 -1
  303. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  304. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  305. package/dist/internal/EarnWithdrawals.js +189 -0
  306. package/dist/internal/EarnWithdrawals.js.map +1 -0
  307. package/dist/internal/ExecutionContext.d.ts +21 -0
  308. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  309. package/dist/internal/ExecutionContext.js +16 -0
  310. package/dist/internal/ExecutionContext.js.map +1 -0
  311. package/dist/internal/Log.d.ts +7 -3
  312. package/dist/internal/Log.d.ts.map +1 -1
  313. package/dist/internal/Log.js +163 -130
  314. package/dist/internal/Log.js.map +1 -1
  315. package/dist/internal/MetricSink.d.ts.map +1 -1
  316. package/dist/internal/MetricSink.js +26 -1
  317. package/dist/internal/MetricSink.js.map +1 -1
  318. package/dist/internal/RateLimit.d.ts +67 -0
  319. package/dist/internal/RateLimit.d.ts.map +1 -1
  320. package/dist/internal/RateLimit.js +174 -27
  321. package/dist/internal/RateLimit.js.map +1 -1
  322. package/dist/internal/Store.d.ts +6 -0
  323. package/dist/internal/Store.d.ts.map +1 -1
  324. package/dist/internal/Store.js +4 -5
  325. package/dist/internal/Store.js.map +1 -1
  326. package/dist/internal/Timing.d.ts +6 -0
  327. package/dist/internal/Timing.d.ts.map +1 -1
  328. package/dist/internal/Timing.js +21 -1
  329. package/dist/internal/Timing.js.map +1 -1
  330. package/dist/internal/Tron.d.ts +124 -0
  331. package/dist/internal/Tron.d.ts.map +1 -0
  332. package/dist/internal/Tron.js +202 -0
  333. package/dist/internal/Tron.js.map +1 -0
  334. package/dist/internal/Viem.d.ts +4 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Viem.js +25 -6
  337. package/dist/internal/Viem.js.map +1 -1
  338. package/dist/internal/rewards/Read.d.ts +2 -2
  339. package/dist/internal/rewards/Read.d.ts.map +1 -1
  340. package/dist/internal/rewards/Read.js +11 -2
  341. package/dist/internal/rewards/Read.js.map +1 -1
  342. package/dist/internal/routes/Action.d.ts +27 -0
  343. package/dist/internal/routes/Action.d.ts.map +1 -1
  344. package/dist/internal/routes/Action.js +49 -1
  345. package/dist/internal/routes/Action.js.map +1 -1
  346. package/dist/internal/routes/Chain.d.ts +2 -0
  347. package/dist/internal/routes/Chain.d.ts.map +1 -1
  348. package/dist/internal/routes/Chain.js +4 -0
  349. package/dist/internal/routes/Chain.js.map +1 -1
  350. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  351. package/dist/internal/routes/DepositAddress.js +5 -0
  352. package/dist/internal/routes/DepositAddress.js.map +1 -1
  353. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  354. package/dist/internal/routes/Evidence.js +6 -2
  355. package/dist/internal/routes/Evidence.js.map +1 -1
  356. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  357. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  358. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  359. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  360. package/dist/internal/routes/Policy.d.ts +161 -0
  361. package/dist/internal/routes/Policy.d.ts.map +1 -0
  362. package/dist/internal/routes/Policy.js +249 -0
  363. package/dist/internal/routes/Policy.js.map +1 -0
  364. package/dist/internal/routes/Provider.d.ts +66 -3
  365. package/dist/internal/routes/Provider.d.ts.map +1 -1
  366. package/dist/internal/routes/Provider.js +106 -27
  367. package/dist/internal/routes/Provider.js.map +1 -1
  368. package/dist/internal/routes/Quota.d.ts +57 -0
  369. package/dist/internal/routes/Quota.d.ts.map +1 -0
  370. package/dist/internal/routes/Quota.js +144 -0
  371. package/dist/internal/routes/Quota.js.map +1 -0
  372. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  373. package/dist/internal/routes/Reconciliation.js +163 -47
  374. package/dist/internal/routes/Reconciliation.js.map +1 -1
  375. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  376. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  377. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  378. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  379. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  380. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  381. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  382. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  383. package/dist/internal/routes/Subsidy.d.ts +2 -2
  384. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  385. package/dist/internal/routes/Subsidy.js +2 -2
  386. package/dist/internal/routes/Subsidy.js.map +1 -1
  387. package/dist/internal/routes/Transfer.d.ts +229 -1
  388. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  389. package/dist/internal/routes/Transfer.js +644 -7
  390. package/dist/internal/routes/Transfer.js.map +1 -1
  391. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  392. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  393. package/dist/internal/routes/TransferReconciliation.js +83 -159
  394. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  395. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  396. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  397. package/dist/internal/routes/TransferSettlement.js +2 -0
  398. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  399. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  400. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  401. package/dist/internal/routes/TransferSubsidy.js +64 -5
  402. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  403. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  404. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  405. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  406. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  407. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  408. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  409. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  410. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  411. package/dist/internal/routes/index.d.ts +3 -0
  412. package/dist/internal/routes/index.d.ts.map +1 -1
  413. package/dist/internal/routes/index.js +3 -0
  414. package/dist/internal/routes/index.js.map +1 -1
  415. package/dist/internal/routes/providers/across.d.ts +3 -0
  416. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  417. package/dist/internal/routes/providers/across.js +11 -0
  418. package/dist/internal/routes/providers/across.js.map +1 -1
  419. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  420. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  421. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  422. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  423. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  424. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  425. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  426. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  427. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  428. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  429. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  430. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  431. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  432. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  434. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  435. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  436. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/propAmm.js +524 -0
  438. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  439. package/dist/internal/routes/providers/relay.d.ts +3 -0
  440. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  441. package/dist/internal/routes/providers/relay.js +352 -41
  442. package/dist/internal/routes/providers/relay.js.map +1 -1
  443. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  444. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  445. package/dist/internal/routes/providers/rhino.js +11 -0
  446. package/dist/internal/routes/providers/rhino.js.map +1 -1
  447. package/dist/internal/routes/providers/squid.d.ts +3 -0
  448. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  449. package/dist/internal/routes/providers/squid.js +19 -0
  450. package/dist/internal/routes/providers/squid.js.map +1 -1
  451. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  452. package/dist/internal/routes/providers/stargate.js +22 -9
  453. package/dist/internal/routes/providers/stargate.js.map +1 -1
  454. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  455. package/dist/internal/routes/providers/symbiosis.js +13 -17
  456. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  457. package/dist/providers/index.d.ts +14 -0
  458. package/dist/providers/index.d.ts.map +1 -1
  459. package/dist/providers/index.js +6 -0
  460. package/dist/providers/index.js.map +1 -1
  461. package/package.json +16 -6
  462. package/src/ApiKey.ts +7 -3
  463. package/src/ApiKeys.test.ts +652 -8
  464. package/src/ApiKeys.ts +191 -11
  465. package/src/App.test.ts +405 -18
  466. package/src/App.ts +51 -15
  467. package/src/Client.test-d.ts +157 -10
  468. package/src/Client.test.ts +4 -4
  469. package/src/Scope.ts +1 -2
  470. package/src/admin/App.ts +11 -5
  471. package/src/admin/apps/api-keys.test.ts +98 -2
  472. package/src/admin/apps/api-keys.ts +21 -12
  473. package/src/admin/apps/earn-vaults.test.ts +76 -7
  474. package/src/admin/apps/earn-vaults.ts +47 -8
  475. package/src/admin/apps/organizations.test.ts +147 -31
  476. package/src/admin/apps/organizations.ts +5 -4
  477. package/src/admin/apps/route-policies.test.ts +220 -0
  478. package/src/admin/apps/route-policies.ts +322 -0
  479. package/src/admin/apps/routes-support.test.ts +107 -2
  480. package/src/admin/apps/routes-support.ts +43 -3
  481. package/src/admin/apps/routes.test.ts +150 -0
  482. package/src/admin/apps/routes.ts +97 -1
  483. package/src/admin/apps/scopes.test.ts +1 -1
  484. package/src/admin/index.ts +0 -1
  485. package/src/admin/ui/plugin.ts +2 -1
  486. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  487. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  488. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  489. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  490. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  491. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  492. package/src/admin/ui/src/lib/routes.ts +34 -0
  493. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  494. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  495. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  496. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  497. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  498. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  499. package/src/admin/ui/src/routes/organizations.tsx +1 -0
  500. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  501. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  502. package/src/admin/ui/src/routes/routes.tsx +85 -2
  503. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  504. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  505. package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
  506. package/src/admin/ui.generated.ts +258 -202
  507. package/src/analytics/Analytics.test.ts +4 -50
  508. package/src/analytics/Analytics.ts +65 -1
  509. package/src/analytics/tables/requestEvents.test.ts +402 -1
  510. package/src/analytics/tables/requestEvents.ts +62 -93
  511. package/src/apps/data/routes/activities.test.ts +315 -14
  512. package/src/apps/data/routes/activities.ts +60 -0
  513. package/src/apps/data/routes/balances.ts +5 -7
  514. package/src/apps/data/routes/earn.bench.ts +18 -0
  515. package/src/apps/data/routes/earn.local.test.ts +507 -0
  516. package/src/apps/data/routes/earn.test.ts +405 -127
  517. package/src/apps/data/routes/earn.ts +660 -270
  518. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  519. package/src/apps/data/routes/exchanges.test.ts +166 -2
  520. package/src/apps/data/routes/exchanges.ts +308 -101
  521. package/src/apps/data/routes/fee-amm.test.ts +134 -2
  522. package/src/apps/data/routes/fee-amm.ts +122 -60
  523. package/src/apps/data/routes/receipts.test.ts +21 -18
  524. package/src/apps/data/routes/rpc.test.ts +2 -2
  525. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  526. package/src/apps/data/routes/tokens.test.ts +4 -4
  527. package/src/apps/data/routes/tokens.ts +11 -6
  528. package/src/apps/data/routes/transactions.test.ts +29 -0
  529. package/src/apps/data/routes/transactions.ts +33 -22
  530. package/src/apps/data/routes/webhooks.test.ts +12 -3
  531. package/src/apps/data/routes/webhooks.ts +2 -1
  532. package/src/apps/management/App.ts +4 -0
  533. package/src/apps/management/Billing.test.ts +253 -27
  534. package/src/apps/management/Billing.ts +83 -29
  535. package/src/apps/management/routes/api-keys.test.ts +1 -1
  536. package/src/apps/management/routes/api-keys.ts +85 -11
  537. package/src/apps/management/routes/billing.test.ts +68 -4
  538. package/src/apps/management/routes/cli.test.ts +370 -0
  539. package/src/apps/management/routes/cli.ts +533 -0
  540. package/src/apps/management/routes/me.test.ts +14 -4
  541. package/src/apps/management/routes/orgs.test.ts +108 -4
  542. package/src/apps/management/routes/orgs.ts +7 -2
  543. package/src/apps/management/routes/usage.test.ts +2 -2
  544. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  545. package/src/apps/mpp/internal/Policy.ts +6 -2
  546. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  547. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  548. package/src/apps/relay/App.test.ts +85 -1
  549. package/src/apps/relay/App.ts +28 -4
  550. package/src/apps/relay/Sponsorships.test.ts +97 -1
  551. package/src/apps/relay/Sponsorships.ts +77 -66
  552. package/src/apps/routes/Access.test.ts +319 -0
  553. package/src/apps/routes/Access.ts +147 -0
  554. package/src/apps/routes/App.ts +10 -0
  555. package/src/apps/routes/routes/chains.test.ts +3 -2
  556. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  557. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  558. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  559. package/src/apps/routes/routes/quotes.test.ts +81 -8
  560. package/src/apps/routes/routes/quotes.ts +109 -27
  561. package/src/apps/routes/routes/transfers.test.ts +252 -15
  562. package/src/apps/routes/routes/transfers.ts +212 -33
  563. package/src/cli/ApiKeys.test.ts +265 -0
  564. package/src/cli/ApiKeys.ts +189 -0
  565. package/src/cli/Cli.test.ts +188 -0
  566. package/src/cli/Cli.ts +280 -12
  567. package/src/cli/Credentials.test.ts +122 -0
  568. package/src/cli/Credentials.ts +144 -0
  569. package/src/cli/Spec.test.ts +133 -0
  570. package/src/cli/Spec.ts +132 -0
  571. package/src/cli/bin.test.ts +49 -0
  572. package/src/cli/bin.ts +5 -1
  573. package/src/cli/commands/auth.test.ts +138 -0
  574. package/src/cli/commands/auth.ts +254 -0
  575. package/src/cli/commands/keys.test.ts +68 -0
  576. package/src/cli/commands/keys.ts +125 -0
  577. package/src/cloudflare.ts +184 -36
  578. package/src/db/Db.test.ts +877 -0
  579. package/src/db/Db.ts +498 -1
  580. package/src/db/Schema.ts +75 -4
  581. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  582. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  583. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  584. package/src/db/tables/authAccounts.test.ts +30 -0
  585. package/src/db/tables/authAccounts.ts +1 -0
  586. package/src/db/tables/earnVaults.test.ts +34 -0
  587. package/src/db/tables/earnVaults.ts +17 -2
  588. package/src/db/tables/organizations.test.ts +148 -84
  589. package/src/db/tables/organizations.ts +11 -43
  590. package/src/db/tables/requestUsage.ts +13 -2
  591. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  592. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  593. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  594. package/src/db/tables/rewardRuns.ts +4 -0
  595. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  596. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  597. package/src/db/tables/routesDepositAddresses.ts +118 -34
  598. package/src/db/tables/routesDeposits.test.ts +66 -5
  599. package/src/db/tables/routesDeposits.ts +47 -26
  600. package/src/db/tables/routesIdempotency.test.ts +80 -0
  601. package/src/db/tables/routesIdempotency.ts +2 -0
  602. package/src/db/tables/routesPolicies.test.ts +143 -0
  603. package/src/db/tables/routesPolicies.ts +251 -0
  604. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  605. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  606. package/src/db/tables/routesTransfers.test.ts +183 -2
  607. package/src/db/tables/routesTransfers.ts +65 -6
  608. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  609. package/src/db/tables/sponsoredTransactions.ts +182 -38
  610. package/src/db/tables/users.test.ts +51 -0
  611. package/src/db/tables/users.ts +12 -0
  612. package/src/handlers/internal/multisig.store.test.ts +120 -0
  613. package/src/handlers/internal/multisig.test.ts +389 -0
  614. package/src/handlers/internal/multisig.ts +13 -10
  615. package/src/handlers/relay.test.ts +259 -83
  616. package/src/handlers/relay.ts +36 -17
  617. package/src/internal/Auth.test.ts +291 -8
  618. package/src/internal/Auth.ts +227 -96
  619. package/src/internal/BetterAuth.test.ts +58 -22
  620. package/src/internal/BetterAuth.ts +23 -17
  621. package/src/internal/Cache.ts +3 -1
  622. package/src/internal/CliAuth.test.ts +279 -0
  623. package/src/internal/CliAuth.ts +319 -0
  624. package/src/internal/EarnSharePrices.test.ts +25 -0
  625. package/src/internal/EarnSharePrices.ts +9 -2
  626. package/src/internal/EarnVaults.test.ts +67 -0
  627. package/src/internal/EarnVaults.ts +299 -4
  628. package/src/internal/EarnWithdrawals.test.ts +315 -0
  629. package/src/internal/EarnWithdrawals.ts +266 -0
  630. package/src/internal/ExecutionContext.ts +31 -0
  631. package/src/internal/Log.test.ts +210 -0
  632. package/src/internal/Log.ts +180 -142
  633. package/src/internal/MetricSink.test.ts +190 -15
  634. package/src/internal/MetricSink.ts +27 -1
  635. package/src/internal/RateLimit.test.ts +144 -8
  636. package/src/internal/RateLimit.ts +254 -26
  637. package/src/internal/Store.ts +4 -5
  638. package/src/internal/Timing.test.ts +32 -0
  639. package/src/internal/Timing.ts +20 -1
  640. package/src/internal/Tron.test-d.ts +22 -0
  641. package/src/internal/Tron.test.ts +94 -0
  642. package/src/internal/Tron.ts +289 -0
  643. package/src/internal/Viem.rpc.test.ts +76 -0
  644. package/src/internal/Viem.ts +29 -6
  645. package/src/internal/rewards/Read.test.ts +109 -0
  646. package/src/internal/rewards/Read.ts +13 -4
  647. package/src/internal/routes/Action.test.ts +70 -0
  648. package/src/internal/routes/Action.ts +76 -1
  649. package/src/internal/routes/Chain.test.ts +18 -0
  650. package/src/internal/routes/Chain.ts +5 -0
  651. package/src/internal/routes/DepositAddress.ts +5 -0
  652. package/src/internal/routes/Evidence.test.ts +64 -0
  653. package/src/internal/routes/Evidence.ts +11 -3
  654. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  655. package/src/internal/routes/Policy.test.ts +316 -0
  656. package/src/internal/routes/Policy.ts +399 -0
  657. package/src/internal/routes/Provider.test.ts +103 -2
  658. package/src/internal/routes/Provider.ts +149 -27
  659. package/src/internal/routes/Quota.test.ts +149 -0
  660. package/src/internal/routes/Quota.ts +226 -0
  661. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  662. package/src/internal/routes/Reconciliation.test.ts +371 -13
  663. package/src/internal/routes/Reconciliation.ts +193 -42
  664. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  665. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  666. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  667. package/src/internal/routes/SourceObservation.test.ts +221 -0
  668. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  669. package/src/internal/routes/Subsidy.ts +4 -2
  670. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  671. package/src/internal/routes/Transfer.test.ts +130 -1
  672. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  673. package/src/internal/routes/Transfer.ts +866 -8
  674. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  675. package/src/internal/routes/TransferReconciliation.ts +91 -166
  676. package/src/internal/routes/TransferSettlement.ts +48 -0
  677. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  678. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  679. package/src/internal/routes/TransferSubsidy.ts +87 -12
  680. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  681. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  682. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  683. package/src/internal/routes/index.test.ts +3 -0
  684. package/src/internal/routes/index.ts +3 -0
  685. package/src/internal/routes/providers/across.ts +13 -0
  686. package/src/internal/routes/providers/index.test.ts +141 -0
  687. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  688. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  689. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  690. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  691. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  692. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  693. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  694. package/src/internal/routes/providers/propAmm.ts +640 -0
  695. package/src/internal/routes/providers/relay.test.ts +1263 -41
  696. package/src/internal/routes/providers/relay.ts +423 -38
  697. package/src/internal/routes/providers/rhino.ts +14 -1
  698. package/src/internal/routes/providers/squid.ts +21 -0
  699. package/src/internal/routes/providers/stargate.test.ts +105 -1
  700. package/src/internal/routes/providers/stargate.ts +22 -9
  701. package/src/internal/routes/providers/symbiosis.ts +13 -47
  702. package/src/providers/index.test.ts +2 -0
  703. package/src/providers/index.ts +18 -0
  704. package/dist/admin/Access.d.ts +0 -39
  705. package/dist/admin/Access.d.ts.map +0 -1
  706. package/dist/admin/Access.js +0 -73
  707. package/dist/admin/Access.js.map +0 -1
  708. package/src/admin/Access.test.ts +0 -130
  709. package/src/admin/Access.ts +0 -85
package/README.md CHANGED
@@ -135,6 +135,143 @@ token.symbol
135
135
 
136
136
  ## Development
137
137
 
138
+ ### Local API with local Horcrux
139
+
140
+ Clone the Horcrux backend as a sibling checkout (the checkout must include the
141
+ `horcrux dev` local-signing backend), then prepare this checkout:
142
+
143
+ ```sh
144
+ git clone https://github.com/tempoxyz/horcrux.git ../horcrux
145
+ pnpm setup:env
146
+ ```
147
+
148
+ Set these values in the ignored repo-root `.env`:
149
+
150
+ ```dotenv
151
+ HORCRUX_URL=http://127.0.0.1:3040
152
+ HORCRUX_ACCESS_CLIENT_ID=
153
+ HORCRUX_ACCESS_CLIENT_SECRET=
154
+ HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
155
+ ROUTES_SUBSIDY_MAX_AMOUNT=0.10
156
+ ```
157
+
158
+ Start the opt-in stack with `docker compose --profile subsidies up -d --build`.
159
+ Set `TEMPO_API_HORCRUX_SOURCE` if the sibling checkout is elsewhere. Compose mounts
160
+ the public `seeds/horcrux-wallets.json` fixture read-only and starts `horcrux dev`
161
+ with `HORCRUX_DEV_WALLETS=/etc/horcrux/wallets.json`. To customize the preinitialized
162
+ wallets, copy the manifest, preserve its schema, use stable UUIDs, and set
163
+ `TEMPO_API_HORCRUX_WALLETS` to that host path. Horcrux atomically initializes the
164
+ fixed development team/grant and refuses metadata, key, ID, address, or grant
165
+ conflicts. It preserves wallets, signed history, and replay state on restart; do not
166
+ delete its database volume as a routine reinitialization step.
167
+
168
+ The fixture contains EVM, Tron, and Solana wallets and uses only publicly compromised
169
+ developer keys. Never use these keys for real credentials or send real funds to any
170
+ derived address. The EVM wallet is public Anvil account 0. API route subsidies still
171
+ use only that EVM address through the normal Horcrux viem SDK; local Horcrux does not
172
+ add API-managed Tron or Solana subsidies. Direct Horcrux HTTP clients identify all
173
+ wallet families by the manifest UUID, while the viem integration can look up its EVM
174
+ wallet by address. The dev backend exposes the normal EVM/Tempo, Solana, Tron, and
175
+ hash signing APIs without policies or broadcasting.
176
+
177
+ Horcrux shares the API container's network namespace and listens only on loopback;
178
+ unauthenticated SDK access is accepted only by an API with
179
+ `ENVIRONMENT=development`, a loopback HTTP(S) URL, and both Cloudflare credentials
180
+ absent. After changing `.env` or the manifest,
181
+ run `docker compose restart api horcrux`. This profile starts a signer only: it does
182
+ not start bridges, Tron, Solana, Base/Ethereum forks, or other chains. Point the
183
+ relevant RPC URLs at disposable nodes yourself. Signing locally does not change
184
+ where the API broadcasts. Fund the EVM address with disposable destination tokens
185
+ and fee funds on the tested chain only when exercising settlement.
186
+ `ROUTES_SUBSIDY_MAX_AMOUNT` is a per-subsidy cap, not a total spending budget.
187
+
188
+ Developers not exercising Routes subsidies can leave
189
+ `HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS` empty and run the API without Horcrux
190
+ access. Fee sponsorship keeps its existing setup; there is no private-key fallback
191
+ for Routes subsidies.
192
+
193
+ ### Hosted Routes subsidy wallets
194
+
195
+ Set `HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS` to a comma-separated list of EVM
196
+ wallet addresses registered in Horcrux. The first address funds new commitments;
197
+ retain retiring addresses until their existing commitments settle. Address-based
198
+ `horcruxAccount` construction is synchronous and requires no discovery request.
199
+ These wallets need the destination token and transaction fee funds on each
200
+ supported destination chain. Fee sponsorship, MPP settlement, and rewards signing
201
+ remain separate.
202
+
203
+ The first EVM wallet also signs inbound Tempo deposit subsidies through Horcrux
204
+ sign-hash. Fund it with pathUSD and its selected fee token on Tempo. Transfer
205
+ reservations do not count deposit top-ups, so monitor the shared Tempo balance for
206
+ both obligations. Relay fixed-rate deposit addresses use Relay's 1:1 subsidy.
207
+
208
+ The SDK is pinned to `@zygis-tempo/horcrux-viem@0.1.0` on npm, aliased as
209
+ `@horcrux/viem`. The SDK owns the Horcrux signing protocol; the API still owns
210
+ inventory checks, nonce reservations, transaction persistence, and broadcast.
211
+
212
+ For production, `apps/api/wrangler.background.jsonc` owns `HORCRUX_URL` and
213
+ `HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS`. CI and `pnpm -C apps/api deploy` run
214
+ `apps/api/scripts/prepare:production.ts` to copy only those values into the HTTP
215
+ Worker's generated `wrangler.deploy.jsonc`. The shared `wrangler.jsonc` has no
216
+ production Horcrux defaults, so local development and previews cannot inherit them.
217
+ The HTTP deployment keeps queue producers but leaves consumers, cron, and the
218
+ reward signer binding on `api-background`.
219
+
220
+ Keep `HORCRUX_ACCESS_CLIENT_ID` and `HORCRUX_ACCESS_CLIENT_SECRET` as Cloudflare
221
+ secrets on both production Workers before rollout. They are not stored in Wrangler
222
+ configuration or read from GitHub Actions. If the URL or wallet list was previously
223
+ stored as a Cloudflare secret, remove that secret binding before deploying the
224
+ same name as a plain-text Wrangler variable.
225
+
226
+ For PR and main-tracking previews, configure these once in the API repository's
227
+ GitHub Actions settings. CI uploads them to each preview Worker under the same
228
+ names without the `_DEV` suffix; no manual Worker configuration is needed.
229
+
230
+ | GitHub Actions setting | Name | Value |
231
+ | ---------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
232
+ | Secret or variable | `HORCRUX_URL_DEV` | Cloudflare-accessible runtime API base URL of the Horcrux instance containing the dev wallet (not its admin URL) |
233
+ | Secret or variable | `HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS_DEV` | Comma-separated EVM wallet addresses, active first, not UUIDs |
234
+ | Secret or variable | `HORCRUX_ROUTES_TRANSFER_SUBSIDY_TRON_WALLETS_DEV` | Comma-separated Tron address and Horcrux UUID pairs, active first |
235
+ | Secret | `HORCRUX_ACCESS_CLIENT_ID_DEV` | Dev Cloudflare Access client ID |
236
+ | Secret | `HORCRUX_ACCESS_CLIENT_SECRET_DEV` | Dev Cloudflare Access client secret |
237
+
238
+ Secrets take precedence when both a secret and variable have the same name.
239
+ The credential pair must be complete or absent. Setting a wallet list requires
240
+ the URL and both credentials. Removing both wallet settings disables transfer
241
+ subsidies on the next preview deployment; drain pending commitments first.
242
+ Absent credentials leave existing Worker credentials unchanged. Use only dev
243
+ wallets and an identity authorized for those wallets. CI's disposable local signer
244
+ needs none of these settings.
245
+
246
+ Grant the workload access to each subsidy wallet and permit its destination-chain
247
+ ERC-20 transfers. `ROUTES_SUBSIDY_MAX_AMOUNT` remains the operational USD limit.
248
+ An empty wallet list disables transfer subsidies; enabled subsidies with incomplete
249
+ Horcrux credentials fail closed. There is no private-key fallback.
250
+
251
+ For Tempo USDT0 to Tron USDT, set `HORCRUX_ROUTES_TRANSFER_SUBSIDY_TRON_WALLETS`
252
+ to comma-separated `TronAddress:HorcruxWalletUUID` pairs, active first. Fund those
253
+ wallets with Tron USDT and TRX. Set `ROUTES_TRON_SUBSIDY_FEE_LIMIT_SUN` to the
254
+ maximum native fee reserved for each TRC-20 transfer. The API persists Tron
255
+ transaction bytes before Horcrux signing and reuses the same signature and
256
+ transaction on retries. Keep retiring wallets configured until their pending
257
+ transfers settle. The production wallet mapping belongs in
258
+ `apps/api/wrangler.background.jsonc`; the deploy script copies it into the HTTP
259
+ Worker when present. An empty mapping leaves Tron transfer subsidies disabled.
260
+
261
+ This replaces `ROUTES_TRANSFER_SUBSIDY_ACCOUNT` and
262
+ `ROUTES_TRANSFER_SUBSIDY_PRIVATE_KEY`. For migration, register the existing wallets
263
+ in Horcrux or drain their unsigned commitments before switching addresses. After
264
+ cutover, remove the unused private-key secrets from Cloudflare and GitHub;
265
+ deployment workflows no longer upload them. Persisted signed transactions still
266
+ replay through the existing nonce and settlement records. Token top-up billing
267
+ is unchanged; destination gas remains paid by Tempo.
268
+
269
+ Run the configuration tests with disposable local infrastructure:
270
+
271
+ ```sh
272
+ pnpm test:local apps/api/src/RoutesTransferSubsidies.test.ts --run
273
+ ```
274
+
138
275
  ### Quickprompt
139
276
 
140
277
  Paste into your agent:
package/dist/ApiKey.d.ts CHANGED
@@ -46,6 +46,7 @@ export type ApiKey = z.output<typeof schema.ApiKey>;
46
46
  * never reach logs. Apply to anything that may embed a credential — error
47
47
  * stacks, request dumps, and the values of the `tempo-api-key` and
48
48
  * `Authorization` headers (whose tokens match the issued-token pattern).
49
+ * CLI session tokens are masked too.
49
50
  */
50
51
  export declare function redact(text: string): string;
51
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ApiKey.d.ts","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAM7B,+CAA+C;AAC/C,yBAAiB,MAAM,CAAC;IACtB,gEAAgE;IACzD,MAAM,UAAU,4DAepB,CAAA;IAEH;;;;;OAKG;IACI,MAAM,MAAM;;;;;;;;;;;;;;;;qBAiCjB,CAAA;CACH;AAED,mDAAmD;AACnD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AAEnD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI3C;AAiCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,GAAE,MAAM,CAAC,aAAa,CAAgB,GAAG,MAAM,CAEvF;AAED,mDAAmD;AACnD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,qFAAqF;AACrF,eAAO,MAAM,YAAY,YAAY,CAAA;AAErC,oFAAoF;AACpF,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C"}
1
+ {"version":3,"file":"ApiKey.d.ts","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAO7B,+CAA+C;AAC/C,yBAAiB,MAAM,CAAC;IACtB,gEAAgE;IACzD,MAAM,UAAU,4DAepB,CAAA;IAEH;;;;;OAKG;IACI,MAAM,MAAM;;;;;;;;;;;;;;;;qBAiCjB,CAAA;CACH;AAED,mDAAmD;AACnD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3C;AAiCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,GAAE,MAAM,CAAC,aAAa,CAAgB,GAAG,MAAM,CAEvF;AAED,mDAAmD;AACnD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,qFAAqF;AACrF,eAAO,MAAM,YAAY,YAAY,CAAA;AAErC,oFAAoF;AACpF,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C"}
package/dist/ApiKey.js CHANGED
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import { Hash, Hex } from 'ox';
14
14
  import * as z from 'zod/mini';
15
+ import * as CliAuth from './internal/CliAuth.js';
15
16
  import * as Id from './internal/Id.js';
16
17
  import * as IpAllowlist from './internal/IpAllowlist.js';
17
18
  import * as RateLimit from './internal/RateLimit.js';
@@ -57,11 +58,12 @@ export var schema;
57
58
  * never reach logs. Apply to anything that may embed a credential — error
58
59
  * stacks, request dumps, and the values of the `tempo-api-key` and
59
60
  * `Authorization` headers (whose tokens match the issued-token pattern).
61
+ * CLI session tokens are masked too.
60
62
  */
61
63
  export function redact(text) {
62
- return text
64
+ return CliAuth.redact(text
63
65
  .replace(tokenPattern(), (match) => `${match.split('sk:')[0]}sk:…`)
64
- .replace(legacyTokenPattern(), 'tempo_…');
66
+ .replace(legacyTokenPattern(), 'tempo_…'));
65
67
  }
66
68
  /**
67
69
  * Token prefix per environment. The prefix encodes the environment so a leaked
@@ -1 +1 @@
1
- {"version":3,"file":"ApiKey.js","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApiKey.js","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"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"}
package/dist/ApiKeys.d.ts CHANGED
@@ -28,6 +28,10 @@ export declare namespace schema {
28
28
  * scope identifiers against its configured catalog.
29
29
  */
30
30
  const MintInput: z.ZodMiniObject<{
31
+ createdBy: z.ZodMiniOptional<z.ZodMiniString<string>>;
32
+ expiresAt: z.ZodMiniOptional<z.ZodMiniISODateTime>;
33
+ orgId: z.ZodMiniOptional<z.ZodMiniString<string>>;
34
+ scopes: z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>;
31
35
  allowedIps: z.ZodMiniDefault<z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>>;
32
36
  billingActive: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
33
37
  environment: z.ZodMiniDefault<z.ZodMiniEnum<{
@@ -40,10 +44,6 @@ export declare namespace schema {
40
44
  limit: z.ZodMiniNumber<number>;
41
45
  period: z.ZodMiniUnion<readonly [z.ZodMiniLiteral<"minute">, z.ZodMiniLiteral<"second">]>;
42
46
  }, z.core.$strip>>>;
43
- createdBy: z.ZodMiniOptional<z.ZodMiniString<string>>;
44
- expiresAt: z.ZodMiniOptional<z.ZodMiniISODateTime>;
45
- orgId: z.ZodMiniOptional<z.ZodMiniString<string>>;
46
- scopes: z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>;
47
47
  }, z.core.$strip>;
48
48
  /**
49
49
  * A persisted API-key record: the resolved `ApiKey.schema` plus
@@ -51,6 +51,10 @@ export declare namespace schema {
51
51
  * and persisted shapes in lockstep.
52
52
  */
53
53
  const Record: z.ZodMiniObject<{
54
+ createdAt: z.ZodMiniString<string>;
55
+ createdBy: z.ZodMiniOptional<z.ZodMiniString<string>>;
56
+ expiresAt: z.ZodMiniOptional<z.ZodMiniString<string>>;
57
+ tokenLast4: z.ZodMiniString<string>;
54
58
  allowedIps: z.ZodMiniDefault<z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>>;
55
59
  billingActive: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
56
60
  environment: z.ZodMiniDefault<z.ZodMiniEnum<{
@@ -66,10 +70,6 @@ export declare namespace schema {
66
70
  period: z.ZodMiniUnion<readonly [z.ZodMiniLiteral<"minute">, z.ZodMiniLiteral<"second">]>;
67
71
  }, z.core.$strip>>>;
68
72
  scopes: z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>;
69
- createdAt: z.ZodMiniString<string>;
70
- createdBy: z.ZodMiniOptional<z.ZodMiniString<string>>;
71
- expiresAt: z.ZodMiniOptional<z.ZodMiniString<string>>;
72
- tokenLast4: z.ZodMiniString<string>;
73
73
  }, z.core.$strip>;
74
74
  }
75
75
  /**
@@ -104,9 +104,18 @@ export type MintResult = {
104
104
  */
105
105
  export declare function mint(state: Store.State, input: MintInput, options?: mint.Options): Promise<MintResult>;
106
106
  /** Mints an attributed key after atomically reserving an organization-wide live-key slot. */
107
- export declare function mintBounded(db: Db.Db, state: Store.State, input: MintInput, options?: mint.Options): Promise<MintResult>;
108
- /** Durably fences key use before deleting its organization or project. The idempotent fence remains on failure so concurrent attempts cannot reopen the owner. */
107
+ export declare function mintBounded(db: Db.Db, state: Store.State, input: MintInput, options?: mintBounded.Options): Promise<MintResult>;
108
+ export declare namespace mintBounded {
109
+ /** Options for {@link mintBounded}. */
110
+ type Options = mint.Options & {
111
+ /** Scopes the locked policy-source key must authorize before issuance. */
112
+ sourceScopes?: readonly Scope.Id[] | undefined;
113
+ };
114
+ }
115
+ /** Durably fences key use before deleting its organization or project. Reconcile failed deletions against committed SQL state before removing the fence. */
109
116
  export declare function markOwnerDeleting(state: Store.State, owner: markOwnerDeleting.Owner): Promise<void>;
117
+ /** Removes an aborted deletion's KV fence while holding the SQL owner lock against concurrent deletion. */
118
+ export declare function reconcileOwnerDeletion(db: Db.Db, state: Store.State, owner: markOwnerDeleting.Owner): Promise<void>;
110
119
  export declare namespace markOwnerDeleting {
111
120
  /** API-key owner being deleted. */
112
121
  type Owner = {
@@ -121,6 +130,8 @@ export declare namespace mint {
121
130
  type Options = {
122
131
  /** Scope catalog accepted while minting the key. */
123
132
  scopeCatalog?: Scope.Catalog | undefined;
133
+ /** Existing key whose explicit route-policy overrides are copied to this replacement. */
134
+ policySourceApiKeyId?: string | undefined;
124
135
  };
125
136
  }
126
137
  /**
@@ -222,7 +233,7 @@ export declare namespace listByOrg {
222
233
  };
223
234
  }
224
235
  /**
225
- * Revokes a key by id, deleting its record and index entries.
236
+ * Revokes a key by id with a durable KV marker, then deletes its record and index entries.
226
237
  *
227
238
  * @param state - The KV state store holding key records.
228
239
  * @param id - The key id (`key_…`).
@@ -345,6 +356,21 @@ export declare namespace backfill {
345
356
  scanned: number;
346
357
  };
347
358
  }
359
+ /** Returns whether a key is revoked or its organization or project is being deleted, in one bulk read. */
360
+ export declare function isFenced(state: Store.State, key: isFenced.Key): Promise<boolean>;
361
+ export declare namespace isFenced {
362
+ /** Key identity the fences apply to. */
363
+ type Key = {
364
+ /** Key id (`key_…`). */
365
+ id: string;
366
+ /** Owning organization id. */
367
+ orgId: string;
368
+ /** Owning project id, when project-attributed. */
369
+ projectId?: string | undefined;
370
+ };
371
+ }
372
+ /** Returns whether a key has a durable KV revocation marker. */
373
+ export declare function isRevoked(state: Store.State, id: string): Promise<boolean>;
348
374
  /** Returns whether the organization or attributed project has been deleted. */
349
375
  export declare function isOwnerDeleted(state: Store.State, owner: isOwnerDeleted.Owner): Promise<boolean>;
350
376
  export declare namespace isOwnerDeleted {
@@ -1 +1 @@
1
- {"version":3,"file":"ApiKeys.d.ts","sourceRoot":"","sources":["../src/ApiKeys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApiKeys.d.ts","sourceRoot":"","sources":["../src/ApiKeys.ts"],"names":[],"mappings":"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"}
package/dist/ApiKeys.js CHANGED
@@ -16,6 +16,9 @@ import * as ApiKey from './ApiKey.js';
16
16
  import * as ApiKeyAdmissions from './db/tables/apiKeyAdmissions.js';
17
17
  import * as ApiKeyOwnerTombstones from './db/tables/apiKeyOwnerTombstones.js';
18
18
  import * as ApiKeyRevocations from './db/tables/apiKeyRevocations.js';
19
+ import * as Organizations from './db/tables/organizations.js';
20
+ import * as RoutesPolicies from './db/tables/routesPolicies.js';
21
+ import * as RoutesSubsidies from './db/tables/routesSubsidies.js';
19
22
  import * as Store from './internal/Store.js';
20
23
  import * as Scope from './Scope.js';
21
24
  const billingSnapshotSchema = z.object({
@@ -108,15 +111,54 @@ async function mintValidated(state, data, id) {
108
111
  }
109
112
  /** Mints an attributed key after atomically reserving an organization-wide live-key slot. */
110
113
  export async function mintBounded(db, state, input, options = {}) {
111
- if (input.orgId === undefined)
114
+ if (options.sourceScopes && !options.policySourceApiKeyId)
115
+ throw new RoutesPolicies.InvalidScopeError();
116
+ if (input.orgId === undefined) {
117
+ if (options.policySourceApiKeyId)
118
+ throw new RoutesPolicies.InvalidScopeError();
112
119
  return mint(state, input, options);
120
+ }
113
121
  const orgId = input.orgId;
114
- const data = validateMintInput(input, options);
122
+ const validated = validateMintInput(input, options);
115
123
  const id = ApiKey.generateId();
116
124
  const result = await db.transaction(async (tx) => {
125
+ const data = await (async () => {
126
+ if (!options.policySourceApiKeyId)
127
+ return validated;
128
+ // Match reassignment/revocation lock order and retain the source lock
129
+ // through the policy copy. The admission ledger also fences stale KV.
130
+ await ApiKeyAdmissions.lock(tx, options.policySourceApiKeyId);
131
+ const source = await get(state, options.policySourceApiKeyId, options);
132
+ if (!source ||
133
+ source.orgId !== orgId ||
134
+ source.projectId !== validated.projectId ||
135
+ source.environment !== validated.environment ||
136
+ (options.sourceScopes !== undefined &&
137
+ !options.sourceScopes.every((scope) => source.scopes.includes(scope) || source.scopes.includes(Scope.wildcard))) ||
138
+ !(await ApiKeyAdmissions.matches(tx, source)))
139
+ throw new RoutesPolicies.InvalidScopeError();
140
+ // The locked source, not the caller's earlier snapshot, bounds every copied restriction.
141
+ const { allowedIps: _allowedIps, expiresAt, rateLimits: _rateLimits, ...rest } = validated;
142
+ const expiry = [expiresAt, source.expiresAt]
143
+ .filter((value) => value !== undefined)
144
+ .sort((a, b) => Date.parse(a) - Date.parse(b))[0];
145
+ return {
146
+ ...rest,
147
+ allowedIps: source.allowedIps,
148
+ ...(expiry === undefined ? {} : { expiresAt: expiry }),
149
+ ...(source.rateLimits === undefined ? {} : { rateLimits: source.rateLimits }),
150
+ };
151
+ })();
152
+ // Policy copies share deletion's subsidy-before-owner lock order.
153
+ if (options.policySourceApiKeyId)
154
+ await RoutesSubsidies.lockOrganization(tx, orgId);
117
155
  const owner = { orgId, projectId: data.projectId };
118
156
  if (!(await ApiKeyOwnerTombstones.lockActive(tx, owner)))
119
157
  throw new OwnerDeletedError();
158
+ // A rotated one-off keeps its synthetic owner and policies. Materialize
159
+ // that owner before the replacement loses the original key's self-owner fallback.
160
+ if (options.policySourceApiKeyId === orgId && !(await Organizations.get(tx, orgId)))
161
+ await Organizations.create(tx, { id: orgId, name: orgId });
120
162
  await ApiKeyAdmissions.lockOrganization(tx, orgId);
121
163
  const legacy = (await ApiKeyAdmissions.isBootstrapped(tx, orgId))
122
164
  ? { complete: true, records: [] }
@@ -130,16 +172,65 @@ export async function mintBounded(db, state, input, options = {}) {
130
172
  orgId,
131
173
  projectId: data.projectId ?? null,
132
174
  });
133
- return admitted ? mintValidated(state, data, id) : null;
175
+ if (!admitted)
176
+ return null;
177
+ await ApiKeyAdmissions.setPendingScopes(tx, id, data.scopes);
178
+ // Keep the credential unprivileged until its policy copy commits. KV cannot
179
+ // participate in the database transaction, so publishing the requested
180
+ // scopes here could leave a broadened key behind when copy/commit fails.
181
+ const minted = await mintValidated(state, { ...data, scopes: [] }, id);
182
+ if (options.policySourceApiKeyId)
183
+ await RoutesPolicies.copyKeyIn(tx, {
184
+ destination: {
185
+ apiKeyId: minted.record.id,
186
+ environment: minted.record.environment,
187
+ orgId: minted.record.orgId,
188
+ ...(minted.record.projectId === undefined ? {} : { projectId: minted.record.projectId }),
189
+ },
190
+ source: {
191
+ apiKeyId: options.policySourceApiKeyId,
192
+ environment: minted.record.environment,
193
+ orgId: minted.record.orgId,
194
+ ...(minted.record.projectId === undefined ? {} : { projectId: minted.record.projectId }),
195
+ },
196
+ });
197
+ return minted;
134
198
  });
135
199
  if (!result)
136
200
  throw new LiveKeyLimitError(maxLiveKeysPerOrganization);
137
- return result;
201
+ try {
202
+ const record = await publishScopes(db, state, result.record.id, options);
203
+ if (!record)
204
+ throw new Error('minted API key missing while publishing scopes');
205
+ return { ...result, record };
206
+ }
207
+ catch (cause) {
208
+ // The caller never received this credential. Fence even ambiguous KV writes before freeing its slot.
209
+ await db.transaction(async (tx) => {
210
+ await ApiKeyAdmissions.lock(tx, result.record.id);
211
+ await ApiKeyRevocations.markPending(tx, result.record.id, orgId);
212
+ await ApiKeyAdmissions.release(tx, result.record.id);
213
+ });
214
+ try {
215
+ await revokeBounded(db, state, result.record.id);
216
+ }
217
+ catch {
218
+ // Failed KV cleanup leaves the non-expiring SQL fence intact; preserve the publication error.
219
+ }
220
+ throw cause;
221
+ }
138
222
  }
139
- /** Durably fences key use before deleting its organization or project. The idempotent fence remains on failure so concurrent attempts cannot reopen the owner. */
223
+ /** Durably fences key use before deleting its organization or project. Reconcile failed deletions against committed SQL state before removing the fence. */
140
224
  export async function markOwnerDeleting(state, owner) {
141
225
  await state.put(ownerDeletedKey(owner), 'deleting');
142
226
  }
227
+ /** Removes an aborted deletion's KV fence while holding the SQL owner lock against concurrent deletion. */
228
+ export async function reconcileOwnerDeletion(db, state, owner) {
229
+ await db.transaction(async (tx) => {
230
+ if (await ApiKeyOwnerTombstones.lockActive(tx, owner))
231
+ await state.delete(ownerDeletedKey(owner));
232
+ });
233
+ }
143
234
  /**
144
235
  * Resolves a plaintext API key token to its metadata, or `null`. Expiry is
145
236
  * enforced on read — not just via the store's native TTL — so it holds on
@@ -152,7 +243,7 @@ export async function markOwnerDeleting(state, owner) {
152
243
  */
153
244
  export async function resolve(state, token, options = {}) {
154
245
  const record = await read(state, ApiKey.keyFor(token), Date.now(), options.scopeCatalog ?? Scope.catalog);
155
- if (!record || (await isOwnerDeleted(state, record)))
246
+ if (!record || (await isFenced(state, record)))
156
247
  return null;
157
248
  return record;
158
249
  }
@@ -253,13 +344,15 @@ export async function listByOrgPage(state, orgId, options) {
253
344
  };
254
345
  }
255
346
  /**
256
- * Revokes a key by id, deleting its record and index entries.
347
+ * Revokes a key by id with a durable KV marker, then deletes its record and index entries.
257
348
  *
258
349
  * @param state - The KV state store holding key records.
259
350
  * @param id - The key id (`key_…`).
260
351
  * @returns Whether a matching record was deleted.
261
352
  */
262
353
  export async function revoke(state, id) {
354
+ // The ID index can be missing while the token record survives. Keep its fence permanently, even when cleanup cannot find the record.
355
+ await state.put(`${revokedPrefix}${id}`, '1');
263
356
  const recordKey = await state.get(idKeyFor(id));
264
357
  if (!recordKey)
265
358
  return false;
@@ -369,6 +462,7 @@ export async function update(state, id, input, options = {}) {
369
462
  }
370
463
  /** Updates a key while atomically enforcing owner fences and admission accounting. */
371
464
  export async function updateBounded(db, state, id, input, options = {}) {
465
+ let reassigning = false;
372
466
  const result = await db.transaction(async (tx) => {
373
467
  await ApiKeyAdmissions.lock(tx, id);
374
468
  const record = await get(state, id, options);
@@ -378,8 +472,14 @@ export async function updateBounded(db, state, id, input, options = {}) {
378
472
  (record.orgId !== options.expectedOwner.orgId ||
379
473
  record.projectId !== options.expectedOwner.projectId))
380
474
  return { type: 'missing' };
381
- if (input.orgId === undefined && input.projectId === undefined)
475
+ const pendingScopes = (await ApiKeyAdmissions.get(tx, id))?.pendingScopes;
476
+ // An explicit scope edit supersedes every earlier deferred publication,
477
+ // including an intentional empty grant. Never revive it from a stale caller.
478
+ if (input.orgId === undefined && input.projectId === undefined) {
479
+ if (input.scopes !== undefined)
480
+ await ApiKeyAdmissions.setPendingScopes(tx, id, null);
382
481
  return { type: 'updated', updated: await update(state, id, input, options) };
482
+ }
383
483
  const owner = {
384
484
  orgId: input.orgId ?? record.orgId,
385
485
  projectId: input.projectId ?? record.projectId,
@@ -387,6 +487,12 @@ export async function updateBounded(db, state, id, input, options = {}) {
387
487
  const owners = [owner];
388
488
  if (record.orgId !== record.id)
389
489
  owners.push({ orgId: record.orgId, projectId: record.projectId });
490
+ reassigning = owner.orgId !== record.orgId || owner.projectId !== record.projectId;
491
+ if (reassigning)
492
+ await RoutesPolicies.lockKeyOrganizations(tx, {
493
+ apiKeyId: id,
494
+ orgIds: [record.orgId, owner.orgId],
495
+ });
390
496
  if (!(await ApiKeyOwnerTombstones.lockActiveMany(tx, owners)))
391
497
  throw new OwnerDeletedError();
392
498
  await ApiKeyAdmissions.lockOrganization(tx, owner.orgId);
@@ -405,14 +511,45 @@ export async function updateBounded(db, state, id, input, options = {}) {
405
511
  });
406
512
  if (!admitted)
407
513
  return { type: 'limit' };
408
- const updated = await update(state, id, input, options);
514
+ if (reassigning) {
515
+ // Fail closed across the KV/SQL boundary. The key remains scope-less if
516
+ // clearing, reassignment, or the eventual SQL commit fails.
517
+ await ApiKeyAdmissions.setPendingScopes(tx, id, input.scopes ?? pendingScopes ?? record.scopes);
518
+ const disabled = await update(state, id, { scopes: [] }, options);
519
+ if (!disabled)
520
+ return { type: 'missing' };
521
+ await RoutesPolicies.clearKeyIn(tx, { apiKeyId: id });
522
+ }
523
+ else if (input.scopes !== undefined)
524
+ await ApiKeyAdmissions.setPendingScopes(tx, id, null);
525
+ const transactionalInput = reassigning ? { ...input, scopes: [] } : input;
526
+ const updated = await update(state, id, transactionalInput, options);
409
527
  if (!updated)
410
528
  await ApiKeyAdmissions.release(tx, id);
411
529
  return { type: 'updated', updated };
412
530
  });
413
531
  if (result.type === 'limit')
414
532
  throw new LiveKeyLimitError(maxLiveKeysPerOrganization);
415
- return result.type === 'missing' ? null : result.updated;
533
+ if (result.type === 'missing')
534
+ return null;
535
+ if (!result.updated || !reassigning)
536
+ return result.updated;
537
+ return publishScopes(db, state, id, options);
538
+ }
539
+ /** Publishes only the latest committed scope intent, serialized with key edits and revocation. */
540
+ async function publishScopes(db, state, id, options) {
541
+ return db.transaction(async (tx) => {
542
+ await ApiKeyAdmissions.lock(tx, id);
543
+ const record = await get(state, id, options);
544
+ if (!record || !(await ApiKeyAdmissions.matches(tx, record)))
545
+ return null;
546
+ const pending = (await ApiKeyAdmissions.get(tx, id))?.pendingScopes;
547
+ if (pending == null)
548
+ return record;
549
+ const updated = await update(state, id, { scopes: pending }, options);
550
+ await ApiKeyAdmissions.setPendingScopes(tx, id, null);
551
+ return updated;
552
+ });
416
553
  }
417
554
  /**
418
555
  * Re-attributes a key while preserving the existing public API.
@@ -650,6 +787,22 @@ const orgPrefix = 'apikey_org:';
650
787
  function orgKeyFor(orgId, id) {
651
788
  return `${orgPrefix}${orgId}:${id}`;
652
789
  }
790
+ /** Storage-key prefix for durable key revocation markers. */
791
+ const revokedPrefix = 'apikey_revoked:';
792
+ /** Returns whether a key is revoked or its organization or project is being deleted, in one bulk read. */
793
+ export async function isFenced(state, key) {
794
+ const revoked = `${revokedPrefix}${key.id}`;
795
+ const org = ownerDeletedKey({ orgId: key.orgId });
796
+ const project = key.projectId === undefined ? undefined : ownerDeletedKey(key);
797
+ const values = await Store.getMany(state, project ? [revoked, org, project] : [revoked, org]);
798
+ return (values.get(revoked) != null ||
799
+ Boolean(values.get(org)) ||
800
+ (project !== undefined && values.get(project) != null));
801
+ }
802
+ /** Returns whether a key has a durable KV revocation marker. */
803
+ export async function isRevoked(state, id) {
804
+ return (await state.get(`${revokedPrefix}${id}`)) !== null;
805
+ }
653
806
  /** Storage-key prefix for durable owner deletion markers. */
654
807
  const ownerDeletedPrefix = 'apikey_owner_deleted:';
655
808
  /** Returns whether the organization or attributed project has been deleted. */