tapimo 0.19.0 → 0.20.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 (494) hide show
  1. package/README.md +13 -5
  2. package/dist/ApiKey.d.ts +2 -2
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +2 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +85 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +218 -56
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +12543 -13912
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +4 -5
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +12 -20
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +20 -36
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +871 -828
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +14 -26
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +93 -186
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +3 -5
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/audit-logs.d.ts +18 -18
  27. package/dist/admin/apps/audit-logs.js +1 -1
  28. package/dist/admin/apps/audit-logs.js.map +1 -1
  29. package/dist/admin/apps/earn-vaults.d.ts +27 -27
  30. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  31. package/dist/admin/apps/earn-vaults.js +11 -5
  32. package/dist/admin/apps/earn-vaults.js.map +1 -1
  33. package/dist/admin/apps/organizations.d.ts +17 -17
  34. package/dist/admin/apps/prop-amms.d.ts +4 -4
  35. package/dist/admin/apps/routes-support.js +1 -38
  36. package/dist/admin/apps/routes-support.js.map +1 -1
  37. package/dist/admin/apps/routes.d.ts +153 -153
  38. package/dist/admin/apps/sentinel.d.ts +4 -4
  39. package/dist/admin/apps/verified-tokens.d.ts +24 -24
  40. package/dist/admin/apps/zone-delegation-requests.d.ts +332 -0
  41. package/dist/admin/apps/zone-delegation-requests.d.ts.map +1 -0
  42. package/dist/admin/apps/zone-delegation-requests.js +200 -0
  43. package/dist/admin/apps/zone-delegation-requests.js.map +1 -0
  44. package/dist/admin/apps/zone-delegations.d.ts +512 -52
  45. package/dist/admin/apps/zone-delegations.d.ts.map +1 -1
  46. package/dist/admin/apps/zone-delegations.js +134 -44
  47. package/dist/admin/apps/zone-delegations.js.map +1 -1
  48. package/dist/admin/index.d.ts +1 -1
  49. package/dist/admin/index.d.ts.map +1 -1
  50. package/dist/admin/index.js +1 -1
  51. package/dist/admin/index.js.map +1 -1
  52. package/dist/admin/ui.generated.d.ts +1 -1
  53. package/dist/admin/ui.generated.d.ts.map +1 -1
  54. package/dist/admin/ui.generated.js +341 -397
  55. package/dist/admin/ui.generated.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  57. package/dist/analytics/tables/requestEvents.js +4 -2
  58. package/dist/analytics/tables/requestEvents.js.map +1 -1
  59. package/dist/apps/data/App.d.ts +11932 -13214
  60. package/dist/apps/data/App.d.ts.map +1 -1
  61. package/dist/apps/data/App.js +32 -13
  62. package/dist/apps/data/App.js.map +1 -1
  63. package/dist/apps/data/ZoneSelection.d.ts +1 -1
  64. package/dist/apps/data/ZoneSelection.d.ts.map +1 -1
  65. package/dist/apps/data/ZoneSelection.js +2 -2
  66. package/dist/apps/data/ZoneSelection.js.map +1 -1
  67. package/dist/apps/data/routes/activities.d.ts +60 -27
  68. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  69. package/dist/apps/data/routes/activities.js +91 -16
  70. package/dist/apps/data/routes/activities.js.map +1 -1
  71. package/dist/apps/data/routes/addresses.d.ts +893 -875
  72. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  73. package/dist/apps/data/routes/balances.d.ts +36 -36
  74. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  75. package/dist/apps/data/routes/balances.js +3 -1
  76. package/dist/apps/data/routes/balances.js.map +1 -1
  77. package/dist/apps/data/routes/blocks.d.ts +40 -40
  78. package/dist/apps/data/routes/blocks.d.ts.map +1 -1
  79. package/dist/apps/data/routes/blocks.js +3 -7
  80. package/dist/apps/data/routes/blocks.js.map +1 -1
  81. package/dist/apps/data/routes/coingecko.d.ts +236 -236
  82. package/dist/apps/data/routes/earn-transactions.d.ts +14 -14
  83. package/dist/apps/data/routes/earn.d.ts +261 -1445
  84. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  85. package/dist/apps/data/routes/earn.js +64 -490
  86. package/dist/apps/data/routes/earn.js.map +1 -1
  87. package/dist/apps/data/routes/exchanges.d.ts +144 -144
  88. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  89. package/dist/apps/data/routes/exchanges.js +5 -15
  90. package/dist/apps/data/routes/exchanges.js.map +1 -1
  91. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  92. package/dist/apps/data/routes/fee-amm.js +3 -9
  93. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  94. package/dist/apps/data/routes/indexer.d.ts +13 -13
  95. package/dist/apps/data/routes/receipts.d.ts +53 -53
  96. package/dist/apps/data/routes/receipts.js +1 -1
  97. package/dist/apps/data/routes/receipts.js.map +1 -1
  98. package/dist/apps/data/routes/rpc.d.ts +52 -0
  99. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  100. package/dist/apps/data/routes/rpc.js +19 -18
  101. package/dist/apps/data/routes/rpc.js.map +1 -1
  102. package/dist/apps/data/routes/tokenlist.d.ts +14 -14
  103. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  104. package/dist/apps/data/routes/tokenlist.js +1 -3
  105. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  106. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  107. package/dist/apps/data/routes/tokens.js +7 -5
  108. package/dist/apps/data/routes/tokens.js.map +1 -1
  109. package/dist/apps/data/routes/transactions.d.ts +281 -281
  110. package/dist/apps/data/routes/transactions.js +3 -3
  111. package/dist/apps/data/routes/transactions.js.map +1 -1
  112. package/dist/apps/data/routes/transfers.d.ts +12 -12
  113. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  114. package/dist/apps/data/routes/transfers.js +1 -3
  115. package/dist/apps/data/routes/transfers.js.map +1 -1
  116. package/dist/apps/data/routes/valuation.d.ts +30 -30
  117. package/dist/apps/data/routes/valuation.d.ts.map +1 -1
  118. package/dist/apps/data/routes/valuation.js +1 -3
  119. package/dist/apps/data/routes/valuation.js.map +1 -1
  120. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  121. package/dist/apps/data/routes/webhooks.d.ts +102 -102
  122. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  123. package/dist/apps/data/routes/webhooks.js +9 -23
  124. package/dist/apps/data/routes/webhooks.js.map +1 -1
  125. package/dist/apps/data/routes/zone-deposits.d.ts +16 -16
  126. package/dist/apps/data/routes/zone-withdrawals.d.ts +31 -31
  127. package/dist/apps/data/routes/zones.d.ts +28 -28
  128. package/dist/apps/management/App.d.ts +18 -102
  129. package/dist/apps/management/App.d.ts.map +1 -1
  130. package/dist/apps/management/App.js +1 -1
  131. package/dist/apps/management/App.js.map +1 -1
  132. package/dist/apps/management/routes/api-keys.d.ts +253 -339
  133. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  134. package/dist/apps/management/routes/api-keys.js +25 -11
  135. package/dist/apps/management/routes/api-keys.js.map +1 -1
  136. package/dist/apps/management/routes/billing.d.ts +92 -92
  137. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  138. package/dist/apps/management/routes/billing.js +5 -13
  139. package/dist/apps/management/routes/billing.js.map +1 -1
  140. package/dist/apps/management/routes/cli.d.ts.map +1 -1
  141. package/dist/apps/management/routes/cli.js +3 -9
  142. package/dist/apps/management/routes/cli.js.map +1 -1
  143. package/dist/apps/management/routes/faucet.d.ts +16 -16
  144. package/dist/apps/management/routes/fee-payer-usage.d.ts +38 -38
  145. package/dist/apps/management/routes/fee-payer-usage.d.ts.map +1 -1
  146. package/dist/apps/management/routes/fee-payer-usage.js +2 -4
  147. package/dist/apps/management/routes/fee-payer-usage.js.map +1 -1
  148. package/dist/apps/management/routes/invitations.d.ts +52 -52
  149. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  150. package/dist/apps/management/routes/invitations.js +4 -12
  151. package/dist/apps/management/routes/invitations.js.map +1 -1
  152. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  153. package/dist/apps/management/routes/invite-links.js +6 -14
  154. package/dist/apps/management/routes/invite-links.js.map +1 -1
  155. package/dist/apps/management/routes/me.d.ts +6 -6
  156. package/dist/apps/management/routes/me.d.ts.map +1 -1
  157. package/dist/apps/management/routes/me.js +3 -7
  158. package/dist/apps/management/routes/me.js.map +1 -1
  159. package/dist/apps/management/routes/members.d.ts +84 -84
  160. package/dist/apps/management/routes/members.d.ts.map +1 -1
  161. package/dist/apps/management/routes/members.js +2 -4
  162. package/dist/apps/management/routes/members.js.map +1 -1
  163. package/dist/apps/management/routes/orgs.d.ts +44 -44
  164. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  165. package/dist/apps/management/routes/orgs.js +2 -6
  166. package/dist/apps/management/routes/orgs.js.map +1 -1
  167. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  168. package/dist/apps/management/routes/projects.js +2 -6
  169. package/dist/apps/management/routes/projects.js.map +1 -1
  170. package/dist/apps/management/routes/route-usage.d.ts +34 -34
  171. package/dist/apps/management/routes/route-usage.d.ts.map +1 -1
  172. package/dist/apps/management/routes/route-usage.js +2 -4
  173. package/dist/apps/management/routes/route-usage.js.map +1 -1
  174. package/dist/apps/management/routes/routes-access-requests.d.ts +120 -91
  175. package/dist/apps/management/routes/routes-access-requests.d.ts.map +1 -1
  176. package/dist/apps/management/routes/routes-access-requests.js +49 -9
  177. package/dist/apps/management/routes/routes-access-requests.js.map +1 -1
  178. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  179. package/dist/apps/management/routes/usage.js +8 -16
  180. package/dist/apps/management/routes/usage.js.map +1 -1
  181. package/dist/apps/management/routes/verified-token-requests.d.ts +39 -39
  182. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  183. package/dist/apps/management/routes/verified-token-requests.js +3 -7
  184. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  185. package/dist/apps/management/routes/webhooks.d.ts +2089 -2089
  186. package/dist/apps/management/routes/zone-delegations.d.ts +14 -17
  187. package/dist/apps/management/routes/zone-delegations.d.ts.map +1 -1
  188. package/dist/apps/management/routes/zone-delegations.js +1 -6
  189. package/dist/apps/management/routes/zone-delegations.js.map +1 -1
  190. package/dist/apps/mpp/App.d.ts +44 -44
  191. package/dist/apps/mpp/App.js +3 -3
  192. package/dist/apps/mpp/App.js.map +1 -1
  193. package/dist/apps/mpp/internal/Adapter.js +1 -1
  194. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  195. package/dist/apps/mpp/internal/Error.d.ts.map +1 -1
  196. package/dist/apps/mpp/internal/Error.js +1 -0
  197. package/dist/apps/mpp/internal/Error.js.map +1 -1
  198. package/dist/apps/mpp/internal/Policy.d.ts +5 -1
  199. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  200. package/dist/apps/mpp/internal/Policy.js +35 -13
  201. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  202. package/dist/apps/relay/App.d.ts +2 -2
  203. package/dist/apps/relay/App.d.ts.map +1 -1
  204. package/dist/apps/relay/App.js +25 -16
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/routes/App.d.ts +311 -311
  207. package/dist/apps/routes/routes/deposit-addresses.d.ts +1099 -1099
  208. package/dist/apps/routes/routes/list.d.ts +74 -74
  209. package/dist/apps/routes/routes/transfers.d.ts +94 -94
  210. package/dist/cli/ApiKeys.d.ts +19 -26
  211. package/dist/cli/ApiKeys.d.ts.map +1 -1
  212. package/dist/db/Db.d.ts +3 -3
  213. package/dist/db/Db.d.ts.map +1 -1
  214. package/dist/db/Db.js +27 -0
  215. package/dist/db/Db.js.map +1 -1
  216. package/dist/db/Schema.d.ts +28 -62
  217. package/dist/db/Schema.d.ts.map +1 -1
  218. package/dist/db/Schema.js +18 -18
  219. package/dist/db/Schema.js.map +1 -1
  220. package/dist/db/tables/rewardRuns.d.ts +21 -0
  221. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  222. package/dist/db/tables/rewardRuns.js +19 -0
  223. package/dist/db/tables/rewardRuns.js.map +1 -1
  224. package/dist/db/tables/routesAccessRequests.d.ts +13 -0
  225. package/dist/db/tables/routesAccessRequests.d.ts.map +1 -1
  226. package/dist/db/tables/routesAccessRequests.js +12 -0
  227. package/dist/db/tables/routesAccessRequests.js.map +1 -1
  228. package/dist/db/tables/zoneDelegationRequests.d.ts +165 -0
  229. package/dist/db/tables/zoneDelegationRequests.d.ts.map +1 -0
  230. package/dist/db/tables/{zoneKeyRequests.js → zoneDelegationRequests.js} +43 -42
  231. package/dist/db/tables/zoneDelegationRequests.js.map +1 -0
  232. package/dist/db/tables/zoneDelegations.d.ts +11 -5
  233. package/dist/db/tables/zoneDelegations.d.ts.map +1 -1
  234. package/dist/db/tables/zoneDelegations.js +21 -3
  235. package/dist/db/tables/zoneDelegations.js.map +1 -1
  236. package/dist/handlers/internal/accounts.d.ts +7 -0
  237. package/dist/handlers/internal/accounts.d.ts.map +1 -0
  238. package/dist/handlers/internal/{multisig.js → accounts.js} +10 -10
  239. package/dist/handlers/internal/{multisig.js.map → accounts.js.map} +1 -1
  240. package/dist/handlers/internal/sponsorship.js +17 -17
  241. package/dist/handlers/internal/sponsorship.js.map +1 -1
  242. package/dist/handlers/relay.d.ts +6 -6
  243. package/dist/handlers/relay.d.ts.map +1 -1
  244. package/dist/handlers/relay.js +15 -15
  245. package/dist/handlers/relay.js.map +1 -1
  246. package/dist/internal/Auth.d.ts.map +1 -1
  247. package/dist/internal/Auth.js +4 -8
  248. package/dist/internal/Auth.js.map +1 -1
  249. package/dist/internal/EarnRates.d.ts.map +1 -1
  250. package/dist/internal/EarnRates.js +1 -3
  251. package/dist/internal/EarnRates.js.map +1 -1
  252. package/dist/internal/EarnVaults.js +2 -2
  253. package/dist/internal/Log.d.ts +2 -4
  254. package/dist/internal/Log.d.ts.map +1 -1
  255. package/dist/internal/Log.js +0 -3
  256. package/dist/internal/Log.js.map +1 -1
  257. package/dist/internal/Response.d.ts +1 -1
  258. package/dist/internal/Response.d.ts.map +1 -1
  259. package/dist/internal/Response.js +0 -3
  260. package/dist/internal/Response.js.map +1 -1
  261. package/dist/internal/Schema.d.ts +11 -0
  262. package/dist/internal/Schema.d.ts.map +1 -1
  263. package/dist/internal/Schema.js +24 -1
  264. package/dist/internal/Schema.js.map +1 -1
  265. package/dist/internal/ZoneAccess.d.ts +70 -35
  266. package/dist/internal/ZoneAccess.d.ts.map +1 -1
  267. package/dist/internal/ZoneAccess.js +312 -131
  268. package/dist/internal/ZoneAccess.js.map +1 -1
  269. package/dist/internal/ZoneDelegation.d.ts +7 -19
  270. package/dist/internal/ZoneDelegation.d.ts.map +1 -1
  271. package/dist/internal/ZoneDelegation.js +8 -29
  272. package/dist/internal/ZoneDelegation.js.map +1 -1
  273. package/dist/internal/{ZoneKeyApproval.d.ts → ZoneDelegationApproval.d.ts} +3 -5
  274. package/dist/internal/ZoneDelegationApproval.d.ts.map +1 -0
  275. package/dist/internal/ZoneDelegationApproval.js +16 -0
  276. package/dist/internal/ZoneDelegationApproval.js.map +1 -0
  277. package/dist/internal/ZoneKeyRewrite.d.ts +98 -0
  278. package/dist/internal/ZoneKeyRewrite.d.ts.map +1 -0
  279. package/dist/internal/ZoneKeyRewrite.js +151 -0
  280. package/dist/internal/ZoneKeyRewrite.js.map +1 -0
  281. package/dist/internal/rewards/Campaigns.d.ts +2 -0
  282. package/dist/internal/rewards/Campaigns.d.ts.map +1 -1
  283. package/dist/internal/rewards/Campaigns.js.map +1 -1
  284. package/dist/internal/rewards/Distributions.d.ts.map +1 -1
  285. package/dist/internal/rewards/Distributions.js +2 -6
  286. package/dist/internal/rewards/Distributions.js.map +1 -1
  287. package/dist/internal/rewards/Monitor.d.ts +4 -1
  288. package/dist/internal/rewards/Monitor.d.ts.map +1 -1
  289. package/dist/internal/rewards/Monitor.js +19 -2
  290. package/dist/internal/rewards/Monitor.js.map +1 -1
  291. package/dist/internal/rewards/Runner.d.ts.map +1 -1
  292. package/dist/internal/rewards/Runner.js +9 -1
  293. package/dist/internal/rewards/Runner.js.map +1 -1
  294. package/dist/internal/routes/Action.d.ts.map +1 -1
  295. package/dist/internal/routes/Action.js +2 -3
  296. package/dist/internal/routes/Action.js.map +1 -1
  297. package/dist/internal/routes/Deposit.d.ts.map +1 -1
  298. package/dist/internal/routes/Deposit.js +2 -6
  299. package/dist/internal/routes/Deposit.js.map +1 -1
  300. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  301. package/dist/internal/routes/DepositAddress.js +4 -10
  302. package/dist/internal/routes/DepositAddress.js.map +1 -1
  303. package/dist/internal/routes/Policy.d.ts.map +1 -1
  304. package/dist/internal/routes/Policy.js +2 -1
  305. package/dist/internal/routes/Policy.js.map +1 -1
  306. package/dist/internal/routes/Provider.js +8 -8
  307. package/dist/internal/routes/Provider.js.map +1 -1
  308. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  309. package/dist/internal/routes/Reconciliation.js +3 -2
  310. package/dist/internal/routes/Reconciliation.js.map +1 -1
  311. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  312. package/dist/internal/routes/Transfer.js +4 -12
  313. package/dist/internal/routes/Transfer.js.map +1 -1
  314. package/dist/internal/routes/UniversalDepositAddress.d.ts.map +1 -1
  315. package/dist/internal/routes/UniversalDepositAddress.js +3 -6
  316. package/dist/internal/routes/UniversalDepositAddress.js.map +1 -1
  317. package/dist/internal/routes/providers/SquidOrder.d.ts.map +1 -1
  318. package/dist/internal/routes/providers/SquidOrder.js +3 -2
  319. package/dist/internal/routes/providers/SquidOrder.js.map +1 -1
  320. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  321. package/dist/internal/routes/providers/relay.js +4 -3
  322. package/dist/internal/routes/providers/relay.js.map +1 -1
  323. package/package.json +20 -5
  324. package/src/ApiKey.ts +2 -2
  325. package/src/ApiKeys.test.ts +284 -51
  326. package/src/ApiKeys.ts +297 -64
  327. package/src/App.ts +4 -5
  328. package/src/Client.test-d.ts +33 -126
  329. package/src/Scope.test.ts +26 -45
  330. package/src/Scope.ts +24 -37
  331. package/src/admin/App.test.ts +51 -4
  332. package/src/admin/App.ts +25 -33
  333. package/src/admin/Mcp.test.ts +2 -1
  334. package/src/admin/apps/api-keys.test.ts +90 -20
  335. package/src/admin/apps/api-keys.ts +5 -8
  336. package/src/admin/apps/audit-logs.ts +1 -1
  337. package/src/admin/apps/earn-vaults.test.ts +19 -19
  338. package/src/admin/apps/earn-vaults.ts +11 -5
  339. package/src/admin/apps/routes-support.test.ts +254 -3
  340. package/src/admin/apps/routes-support.ts +1 -44
  341. package/src/admin/apps/scopes.test.ts +3 -3
  342. package/src/admin/apps/zone-delegation-requests.test.ts +246 -0
  343. package/src/admin/apps/zone-delegation-requests.ts +240 -0
  344. package/src/admin/apps/zone-delegations.test.ts +218 -58
  345. package/src/admin/apps/zone-delegations.ts +146 -46
  346. package/src/admin/index.ts +1 -1
  347. package/src/admin/ui/src/components/ApiKeyForm.tsx +4 -3
  348. package/src/admin/ui/src/lib/config.ts +3 -3
  349. package/src/admin/ui/src/lib/query-client.ts +1 -1
  350. package/src/admin/ui/src/lib/review-queues.ts +10 -10
  351. package/src/admin/ui/src/lib/routes-setup.test.ts +1 -2
  352. package/src/admin/ui/src/lib/routes-setup.ts +3 -5
  353. package/src/admin/ui/src/lib/scopes.test.ts +3 -6
  354. package/src/admin/ui/src/lib/scopes.ts +2 -9
  355. package/src/admin/ui/src/lib/{zone-key-requests.ts → zone-delegation-requests.ts} +27 -31
  356. package/src/admin/ui/src/routeTree.gen.ts +17 -17
  357. package/src/admin/ui/src/routes/__root.tsx +1 -1
  358. package/src/admin/ui/src/routes/api-keys.tsx +2 -15
  359. package/src/admin/ui/src/routes/audit-logs.tsx +2 -2
  360. package/src/admin/ui/src/routes/index.tsx +11 -11
  361. package/src/admin/ui/src/routes/organizations.tsx +3 -1
  362. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +3 -1
  363. package/src/admin/ui/src/routes/organizations_.$orgId_.setup.tsx +1 -3
  364. package/src/admin/ui/src/routes/{zone-key-requests.tsx → zone-delegation-requests.tsx} +228 -172
  365. package/src/admin/ui/vite.config.ts +14 -1
  366. package/src/admin/ui.generated.ts +412 -583
  367. package/src/analytics/tables/requestEvents.test.ts +13 -3
  368. package/src/analytics/tables/requestEvents.ts +4 -3
  369. package/src/apps/data/App.test.ts +72 -35
  370. package/src/apps/data/App.ts +29 -13
  371. package/src/apps/data/ZoneSelection.test.ts +53 -70
  372. package/src/apps/data/ZoneSelection.ts +2 -2
  373. package/src/apps/data/routes/activities.test.ts +140 -6
  374. package/src/apps/data/routes/activities.ts +124 -18
  375. package/src/apps/data/routes/balances.ts +5 -1
  376. package/src/apps/data/routes/blocks.ts +9 -13
  377. package/src/apps/data/routes/earn-transactions.local.test.ts +6 -1
  378. package/src/apps/data/routes/earn-transactions.test.ts +7 -3
  379. package/src/apps/data/routes/earn.bench.ts +0 -14
  380. package/src/apps/data/routes/earn.discovery.test.ts +4 -39
  381. package/src/apps/data/routes/earn.local.test.ts +27 -34
  382. package/src/apps/data/routes/earn.test.ts +172 -490
  383. package/src/apps/data/routes/earn.ts +103 -652
  384. package/src/apps/data/routes/exchanges.ts +20 -30
  385. package/src/apps/data/routes/fee-amm.ts +12 -18
  386. package/src/apps/data/routes/indexer.test.ts +14 -12
  387. package/src/apps/data/routes/receipts.ts +1 -1
  388. package/src/apps/data/routes/rpc.test.ts +23 -18
  389. package/src/apps/data/routes/rpc.ts +21 -21
  390. package/src/apps/data/routes/rpc.zone.test.ts +60 -6
  391. package/src/apps/data/routes/tokenlist.ts +4 -6
  392. package/src/apps/data/routes/tokens.test.ts +20 -0
  393. package/src/apps/data/routes/tokens.ts +10 -5
  394. package/src/apps/data/routes/transactions.ts +3 -3
  395. package/src/apps/data/routes/transfers.ts +4 -6
  396. package/src/apps/data/routes/valuation.test.ts +2 -4
  397. package/src/apps/data/routes/valuation.ts +4 -6
  398. package/src/apps/data/routes/webhooks.test.ts +1 -5
  399. package/src/apps/data/routes/webhooks.ts +30 -44
  400. package/src/apps/data/routes/zones.test.ts +35 -19
  401. package/src/apps/management/App.ts +3 -1
  402. package/src/apps/management/routes/api-keys.test.ts +112 -22
  403. package/src/apps/management/routes/api-keys.ts +30 -15
  404. package/src/apps/management/routes/billing.ts +17 -25
  405. package/src/apps/management/routes/cli.ts +12 -18
  406. package/src/apps/management/routes/fee-payer-usage.ts +5 -4
  407. package/src/apps/management/routes/invitations.ts +16 -21
  408. package/src/apps/management/routes/invite-links.ts +18 -26
  409. package/src/apps/management/routes/me.ts +9 -13
  410. package/src/apps/management/routes/members.ts +5 -7
  411. package/src/apps/management/routes/orgs.ts +8 -12
  412. package/src/apps/management/routes/projects.ts +8 -12
  413. package/src/apps/management/routes/route-usage.ts +5 -4
  414. package/src/apps/management/routes/routes-access-requests.test.ts +64 -2
  415. package/src/apps/management/routes/routes-access-requests.ts +99 -15
  416. package/src/apps/management/routes/scopes.test.ts +3 -3
  417. package/src/apps/management/routes/usage.ts +20 -28
  418. package/src/apps/management/routes/verified-token-requests.ts +9 -13
  419. package/src/apps/management/routes/zone-delegations.test.ts +3 -5
  420. package/src/apps/management/routes/zone-delegations.ts +4 -9
  421. package/src/apps/mpp/App.ts +3 -3
  422. package/src/apps/mpp/Mpp.zone.test.ts +49 -18
  423. package/src/apps/mpp/internal/Adapter.ts +1 -1
  424. package/src/apps/mpp/internal/Error.test.ts +3 -0
  425. package/src/apps/mpp/internal/Error.ts +1 -0
  426. package/src/apps/mpp/internal/Policy.test.ts +9 -8
  427. package/src/apps/mpp/internal/Policy.ts +37 -14
  428. package/src/apps/relay/App.sandbox.test.ts +15 -14
  429. package/src/apps/relay/App.test.ts +120 -61
  430. package/src/apps/relay/App.ts +28 -18
  431. package/src/apps/relay/App.zone-billing.test.ts +9 -4
  432. package/src/apps/routes/App.test.ts +21 -22
  433. package/src/db/Db.ts +34 -3
  434. package/src/db/Schema.ts +26 -26
  435. package/src/db/tables/rewardRuns.ts +39 -0
  436. package/src/db/tables/routesAccessRequests.test.ts +65 -0
  437. package/src/db/tables/routesAccessRequests.ts +25 -0
  438. package/src/db/tables/{zoneKeyRequests.test.ts → zoneDelegationRequests.test.ts} +36 -77
  439. package/src/db/tables/{zoneKeyRequests.ts → zoneDelegationRequests.ts} +69 -52
  440. package/src/db/tables/zoneDelegations.test.ts +5 -6
  441. package/src/db/tables/zoneDelegations.ts +25 -8
  442. package/src/handlers/internal/{multisig.store.test.ts → accounts.store.test.ts} +16 -16
  443. package/src/handlers/internal/{multisig.test.ts → accounts.test.ts} +85 -82
  444. package/src/handlers/internal/{multisig.ts → accounts.ts} +9 -9
  445. package/src/handlers/internal/sponsorship.ts +20 -20
  446. package/src/handlers/relay.test.ts +48 -46
  447. package/src/handlers/relay.ts +26 -26
  448. package/src/internal/Auth.test.ts +6 -2
  449. package/src/internal/Auth.ts +4 -10
  450. package/src/internal/EarnRates.ts +4 -6
  451. package/src/internal/EarnVaults.ts +2 -2
  452. package/src/internal/Log.test-d.ts +1 -0
  453. package/src/internal/Log.test.ts +4 -6
  454. package/src/internal/Log.ts +2 -6
  455. package/src/internal/Response.ts +0 -3
  456. package/src/internal/Schema.test.ts +42 -0
  457. package/src/internal/Schema.ts +36 -1
  458. package/src/internal/ZoneAccess.test.ts +515 -312
  459. package/src/internal/ZoneAccess.ts +410 -158
  460. package/src/internal/ZoneDelegation.test.ts +1 -41
  461. package/src/internal/ZoneDelegation.ts +10 -48
  462. package/src/internal/ZoneDelegationApproval.test.ts +22 -0
  463. package/src/internal/{ZoneKeyApproval.ts → ZoneDelegationApproval.ts} +4 -11
  464. package/src/internal/ZoneKeyRewrite.ts +231 -0
  465. package/src/internal/rewards/Campaigns.ts +2 -0
  466. package/src/internal/rewards/Distributions.ts +8 -12
  467. package/src/internal/rewards/Monitor.test.ts +64 -0
  468. package/src/internal/rewards/Monitor.ts +27 -4
  469. package/src/internal/rewards/Runner.ts +9 -1
  470. package/src/internal/routes/Action.ts +5 -6
  471. package/src/internal/routes/Deposit.ts +8 -12
  472. package/src/internal/routes/DepositAddress.ts +13 -19
  473. package/src/internal/routes/Policy.ts +2 -1
  474. package/src/internal/routes/Provider.ts +8 -8
  475. package/src/internal/routes/Reconciliation.ts +3 -2
  476. package/src/internal/routes/Transfer.ts +16 -24
  477. package/src/internal/routes/UniversalDepositAddress.ts +9 -12
  478. package/src/internal/routes/providers/SquidOrder.ts +3 -2
  479. package/src/internal/routes/providers/relay.ts +4 -3
  480. package/dist/admin/apps/zone-key-requests.d.ts +0 -406
  481. package/dist/admin/apps/zone-key-requests.d.ts.map +0 -1
  482. package/dist/admin/apps/zone-key-requests.js +0 -183
  483. package/dist/admin/apps/zone-key-requests.js.map +0 -1
  484. package/dist/db/tables/zoneKeyRequests.d.ts +0 -289
  485. package/dist/db/tables/zoneKeyRequests.d.ts.map +0 -1
  486. package/dist/db/tables/zoneKeyRequests.js.map +0 -1
  487. package/dist/handlers/internal/multisig.d.ts +0 -7
  488. package/dist/handlers/internal/multisig.d.ts.map +0 -1
  489. package/dist/internal/ZoneKeyApproval.d.ts.map +0 -1
  490. package/dist/internal/ZoneKeyApproval.js +0 -21
  491. package/dist/internal/ZoneKeyApproval.js.map +0 -1
  492. package/src/admin/apps/zone-key-requests.test.ts +0 -272
  493. package/src/admin/apps/zone-key-requests.ts +0 -231
  494. package/src/internal/ZoneKeyApproval.test.ts +0 -46
@@ -393,6 +393,21 @@ describe('narrows responses by status', () => {
393
393
  >()
394
394
  })
395
395
 
396
+ test('admin zone key rewrite routes return the plan, the applied plan, or the narrow refusal', async () => {
397
+ const client = hc<ReturnType<typeof Admin.create>>('https://admin.example')
398
+ const planned = await client['zone-delegations']['rewrite-keys'].$get()
399
+ if (planned.status === 200)
400
+ expectTypeOf(await planned.json()).toEqualTypeOf<
401
+ z.output<typeof AdminZoneDelegations.schema.RewritePlan>
402
+ >()
403
+ const applied = await client['zone-delegations']['rewrite-keys'].$post()
404
+ if (applied.status === 200)
405
+ expectTypeOf(await applied.json()).toEqualTypeOf<
406
+ z.output<typeof AdminZoneDelegations.schema.RewriteApplied>
407
+ >()
408
+ else if (applied.status === 400) expectTypeOf((await applied.json()).error.code).toBeString()
409
+ })
410
+
396
411
  test('POST /v1/earn/rewards/eligibility', async () => {
397
412
  const client = Client.create()
398
413
  const res = await client.v1.earn.rewards.eligibility.$post({
@@ -579,125 +594,6 @@ describe('narrows responses by status', () => {
579
594
  }
580
595
  })
581
596
 
582
- test('GET /v1/earn/vaults', async () => {
583
- const client = Client.create()
584
- const res = await client.v1.earn.vaults.$get({
585
- query: {
586
- 'apy.window': '24h',
587
- capability: 'deposit',
588
- 'engine.type': 'erc4626',
589
- include: 'access,apy,capabilities,token.logoUri,tvl,zone,zones',
590
- },
591
- })
592
-
593
- expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 502 | PaidAccessStatus>()
594
-
595
- if (res.status === 200) {
596
- const json = await res.json()
597
- expectTypeOf(json).toEqualTypeOf<z.output<typeof Earn.schema.getEarnVaults.Response>>()
598
- expectTypeOf(json.data[0]!.access?.status).toEqualTypeOf<'allowlisted' | 'open' | undefined>()
599
- // `apy` and `tvl` are include-gated, so both are absent unless requested.
600
- expectTypeOf(json.data[0]!.apy?.methodology).toEqualTypeOf<
601
- 'share-price-growth-annualized:v1' | undefined
602
- >()
603
- expectTypeOf(json.data[0]!.apy?.net).toEqualTypeOf<string | undefined>()
604
- expectTypeOf(json.data[0]!.apy?.vault).toEqualTypeOf<string | undefined>()
605
- expectTypeOf(json.data[0]!.apy?.window).toEqualTypeOf<
606
- '1h' | '1d' | '7d' | '30d' | undefined
607
- >()
608
- expectTypeOf(json.data[0]!.assetToken.address).toEqualTypeOf<`0x${string}`>()
609
- expectTypeOf(json.data[0]!.capabilities?.deposit).toEqualTypeOf<boolean | undefined>()
610
- expectTypeOf(json.data[0]!.engine.type).toEqualTypeOf<'erc4626' | 'veda' | null>()
611
- expectTypeOf(json.data[0]!.instantLiquidity).toEqualTypeOf<string | null>()
612
- expectTypeOf(json.data[0]!.instantLiquidityValue).toEqualTypeOf<
613
- VaultValue | null | undefined
614
- >()
615
- expectTypeOf(json.data[0]!.sharePrice?.amount).toEqualTypeOf<string | undefined>()
616
- expectTypeOf(json.data[0]!.apy?.rewards?.[0]?.apr).toEqualTypeOf<string | null | undefined>()
617
- expectTypeOf(json.data[0]!.apy?.rewards?.[0]?.asset.address).toEqualTypeOf<
618
- `0x${string}` | undefined
619
- >()
620
- expectTypeOf(json.data[0]!.apy?.rewards?.[0]?.calculatedThrough).toEqualTypeOf<
621
- number | undefined
622
- >()
623
- expectTypeOf(json.data[0]!.apy?.rewards?.[0]?.targetTotalApr).toEqualTypeOf<
624
- string | undefined
625
- >()
626
- expectTypeOf(json.data[0]!.slug).toEqualTypeOf<string | null>()
627
- expectTypeOf(json.data[0]!.state.openRedeemRequestCount).toEqualTypeOf<number>()
628
- expectTypeOf(json.data[0]!.state.totalAssets).toEqualTypeOf<string>()
629
- expectTypeOf(json.data[0]!.tvl).toEqualTypeOf<VaultValue | null | undefined>()
630
- expectTypeOf(json.data[0]!.tvl?.currency).toEqualTypeOf<string | undefined>()
631
- expectTypeOf(json.data[0]!.vaultAddress).toEqualTypeOf<`0x${string}`>()
632
- expectTypeOf(json.data[0]!.verified).toEqualTypeOf<boolean>()
633
- expectTypeOf(json.data[0]!.zone?.chainId).toEqualTypeOf<number | undefined>()
634
- expectTypeOf(json.data[0]!.zones?.[0]?.deploymentBlock).toEqualTypeOf<number | undefined>()
635
- expectTypeOf(json.data[0]!.zones?.[0]?.earnRouter).toEqualTypeOf<`0x${string}` | undefined>()
636
- expectTypeOf(json.meta?.valuation?.basis).toEqualTypeOf<'nominal' | undefined>()
637
- void json
638
- return
639
- }
640
- if (res.status === 400) {
641
- const json = await res.json()
642
- expectTypeOf(json.error.code).toEqualTypeOf<
643
- Access400<'chain_id_invalid' | 'chain_id_unsupported' | 'query_invalid'>
644
- >()
645
- void json
646
- return
647
- }
648
- if (res.status === 502) {
649
- const json = await res.json()
650
- expectTypeOf(json.error.code).toEqualTypeOf<'upstream_error'>()
651
- void json
652
- return
653
- }
654
- })
655
-
656
- test('GET /v1/earn/vaults/verified', async () => {
657
- const client = Client.create()
658
- const res = await client.v1.earn.vaults.verified.$get({
659
- query: {
660
- 'apy.window': '7d',
661
- include: 'access,apy,capabilities,token.logoUri,tvl,zone,zones',
662
- },
663
- })
664
-
665
- expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 502 | PaidAccessStatus>()
666
-
667
- if (res.status === 200) {
668
- const json = await res.json()
669
- expectTypeOf(json).toEqualTypeOf<
670
- z.output<typeof Earn.schema.getVerifiedEarnVaults.Response>
671
- >()
672
- expectTypeOf(json.data[0]!.apy?.vault).toEqualTypeOf<string | undefined>()
673
- expectTypeOf(json.data[0]!.engine.type).toEqualTypeOf<'erc4626' | 'veda'>()
674
- expectTypeOf(json.data[0]!.instantLiquidity).toEqualTypeOf<string | null>()
675
- expectTypeOf(json.data[0]!.slug).toEqualTypeOf<string>()
676
- expectTypeOf(json.data[0]!.state.feesActive).toEqualTypeOf<boolean>()
677
- expectTypeOf(json.data[0]!.tvl).toEqualTypeOf<VaultValue | null | undefined>()
678
- expectTypeOf(json.data[0]!.tvl?.formatted).toEqualTypeOf<string | undefined>()
679
- expectTypeOf(json.data[0]!.verified).toEqualTypeOf<true>()
680
- expectTypeOf(json.data[0]!.zones?.[0]?.chainId).toEqualTypeOf<number | undefined>()
681
- expectTypeOf(json.meta?.valuation?.source).toEqualTypeOf<string | undefined>()
682
- void json
683
- return
684
- }
685
- if (res.status === 400) {
686
- const json = await res.json()
687
- expectTypeOf(json.error.code).toEqualTypeOf<
688
- Access400<'chain_id_invalid' | 'chain_id_unsupported' | 'query_invalid'>
689
- >()
690
- void json
691
- return
692
- }
693
- if (res.status === 502) {
694
- const json = await res.json()
695
- expectTypeOf(json.error.code).toEqualTypeOf<'upstream_error'>()
696
- void json
697
- return
698
- }
699
- })
700
-
701
597
  test('GET /v1/earn/addresses/:address/positions', async () => {
702
598
  const client = Client.create()
703
599
  const res = await client.v1.earn.addresses[':address'].positions.$get({
@@ -780,7 +676,6 @@ describe('narrows responses by status', () => {
780
676
  expectTypeOf(json.label).toEqualTypeOf<string>()
781
677
  expectTypeOf(json.meta?.valuation?.asOf).toEqualTypeOf<string | undefined>()
782
678
  expectTypeOf(json.sharePrice?.decimals).toEqualTypeOf<number | undefined>()
783
- expectTypeOf(json.slug).toEqualTypeOf<string | null>()
784
679
  expectTypeOf(json.state.depositsPaused).toEqualTypeOf<boolean>()
785
680
  expectTypeOf(json.tvl).toEqualTypeOf<VaultValue | null | undefined>()
786
681
  expectTypeOf(json.tvl?.amount).toEqualTypeOf<string | undefined>()
@@ -1753,9 +1648,7 @@ describe('narrows responses by status', () => {
1753
1648
  }
1754
1649
  case 403: {
1755
1650
  const json = await res.json()
1756
- expectTypeOf(json.error.code).toEqualTypeOf<
1757
- 'forbidden' | 'scope_not_issuable' | 'zone_key_approval_required'
1758
- >()
1651
+ expectTypeOf(json.error.code).toEqualTypeOf<'forbidden' | 'scope_not_issuable'>()
1759
1652
  void json
1760
1653
  return
1761
1654
  }
@@ -1809,7 +1702,7 @@ describe('narrows responses by status', () => {
1809
1702
  case 403: {
1810
1703
  const json = await res.json()
1811
1704
  expectTypeOf(json.error.code).toEqualTypeOf<
1812
- 'api_key_forbidden' | 'api_key_ip_forbidden' | 'forbidden' | 'zone_key_approval_required'
1705
+ 'api_key_forbidden' | 'api_key_ip_forbidden' | 'forbidden'
1813
1706
  >()
1814
1707
  void json
1815
1708
  return
@@ -4842,7 +4735,7 @@ describe('narrows responses by status', () => {
4842
4735
  json: { jsonrpc: '2.0', method: 'eth_chainId', params: [] },
4843
4736
  })
4844
4737
 
4845
- expectTypeOf(res.status).toEqualTypeOf<200 | 204 | 400 | 413 | 502 | PublicAccessStatus>()
4738
+ expectTypeOf(res.status).toEqualTypeOf<200 | 204 | 400 | 413 | 502 | 503 | PublicAccessStatus>()
4846
4739
 
4847
4740
  switch (res.status) {
4848
4741
  case 200: {
@@ -4881,6 +4774,12 @@ describe('narrows responses by status', () => {
4881
4774
  void json
4882
4775
  return
4883
4776
  }
4777
+ case 503: {
4778
+ const json = await res.json()
4779
+ expectTypeOf(json.error.code).toEqualTypeOf<'zone_access_unavailable'>()
4780
+ void json
4781
+ return
4782
+ }
4884
4783
  }
4885
4784
  })
4886
4785
 
@@ -4891,7 +4790,7 @@ describe('narrows responses by status', () => {
4891
4790
  param: { chain: 'testnet' },
4892
4791
  })
4893
4792
 
4894
- expectTypeOf(res.status).toEqualTypeOf<200 | 204 | 400 | 413 | 502 | PublicAccessStatus>()
4793
+ expectTypeOf(res.status).toEqualTypeOf<200 | 204 | 400 | 413 | 502 | 503 | PublicAccessStatus>()
4895
4794
 
4896
4795
  switch (res.status) {
4897
4796
  case 200: {
@@ -4930,6 +4829,12 @@ describe('narrows responses by status', () => {
4930
4829
  void json
4931
4830
  return
4932
4831
  }
4832
+ case 503: {
4833
+ const json = await res.json()
4834
+ expectTypeOf(json.error.code).toEqualTypeOf<'zone_access_unavailable'>()
4835
+ void json
4836
+ return
4837
+ }
4933
4838
  }
4934
4839
  })
4935
4840
 
@@ -4942,6 +4847,8 @@ describe('narrows responses by status', () => {
4942
4847
  'amount.to': '2000000',
4943
4848
  chainId: '4217',
4944
4849
  include: 'zones,token.logoUri,token.verified',
4850
+ 'timestamp.from': '2026-10-22T00:00:00Z',
4851
+ 'timestamp.to': '2026-10-23T00:00:00Z',
4945
4852
  type: 'transfer,swap',
4946
4853
  'valuation.amount.from': '1',
4947
4854
  'valuation.amount.to': '100',
package/src/Scope.test.ts CHANGED
@@ -30,7 +30,6 @@ describe('extend', () => {
30
30
  ]),
31
31
  ).toEqual([
32
32
  ...Scope.catalog,
33
- Scope.zoneEntry,
34
33
  Scope.zoneWriteEntry,
35
34
  {
36
35
  description: 'Read project accounts.',
@@ -53,28 +52,34 @@ describe('extend', () => {
53
52
  })
54
53
  })
55
54
 
56
- describe('expandAliases', () => {
57
- test('adds the generic read scope and the current scope for a legacy Zone read scope', () => {
58
- expect(
59
- Scope.expandAliases(['data:read', 'zone:1424310001:read', 'zone:1424310001:write']),
60
- ).toEqual([
61
- 'data:read',
62
- 'zone:1424310001:read',
63
- 'zone:1424310001:write',
64
- 'zone:read',
65
- 'zone:1424310003:read',
66
- ])
67
- })
68
-
69
- test('does not duplicate scopes the key already holds', () => {
70
- expect(
71
- Scope.expandAliases(['zone:1424310001:read', 'zone:1424310003:read', 'zone:read']),
72
- ).toEqual(['zone:1424310001:read', 'zone:1424310003:read', 'zone:read'])
55
+ describe('issuable', () => {
56
+ test('refuses retired per-Zone scopes while still recognizing them as stored', () => {
57
+ expect(Scope.issuable(Scope.catalog, 'zone:421700001:read')).toBe(false)
58
+ expect(Scope.includes(Scope.catalog, 'zone:421700001:read')).toBe(true)
59
+ expect(Scope.issuable(Scope.catalog, 'zone:421700001:write')).toBe(false)
60
+ expect(Scope.includes(Scope.catalog, 'zone:421700001:write')).toBe(true)
61
+ expect(Scope.issuable(Scope.catalog, 'zone:read')).toBe(true)
62
+ expect(Scope.issuable(Scope.catalog, 'zone:write')).toBe(true)
73
63
  })
64
+ })
74
65
 
75
- test('leaves keys without legacy Zone read scopes untouched', () => {
76
- const scopes = ['data:read', 'zone:read', 'zone:421700001:write', '*']
77
- expect(Scope.expandAliases(scopes)).toBe(scopes)
66
+ describe('catalog', () => {
67
+ test('offers both generic Zone scopes self-serve and keeps the retired template admin-only', () => {
68
+ expect(Scope.catalog.filter((entry) => entry.scope.startsWith('zone:'))).toMatchInlineSnapshot(`
69
+ [
70
+ {
71
+ "description": "Read RPC and indexed data in Zones the organization is delegated.",
72
+ "scope": "zone:read",
73
+ "selfServe": true,
74
+ },
75
+ {
76
+ "description": "Broadcast signed transactions to Zones the key is tagged for.",
77
+ "scope": "zone:write",
78
+ "selfServe": true,
79
+ },
80
+ ]
81
+ `)
82
+ expect(Scope.zoneWriteEntry.selfServe).toBe(false)
78
83
  })
79
84
  })
80
85
 
@@ -93,27 +98,3 @@ describe('parseZone', () => {
93
98
  ])
94
99
  })
95
100
  })
96
-
97
- describe('zoneTags', () => {
98
- test('collects the chain ids of per-Zone scopes, sorted and deduplicated', () => {
99
- expect(
100
- Scope.zoneTags([
101
- 'data:read',
102
- 'zone:421700002:write',
103
- 'zone:421700001:read',
104
- 'zone:421700002:read',
105
- ]),
106
- ).toEqual([421700001, 421700002])
107
- })
108
-
109
- test('covers aliased chain ids once expanded', () => {
110
- expect(Scope.zoneTags(Scope.expandAliases(['zone:1424310001:read']))).toEqual([
111
- 1424310001, 1424310003,
112
- ])
113
- })
114
-
115
- test('is undefined when no legacy Zone scope narrows the key', () => {
116
- expect(Scope.zoneTags(['data:read', 'zone:read'])).toBeUndefined()
117
- expect(Scope.zoneTags(['*'])).toBeUndefined()
118
- })
119
- })
package/src/Scope.ts CHANGED
@@ -97,22 +97,21 @@ export const catalog = [
97
97
  scope: 'webhooks:write',
98
98
  selfServe: false,
99
99
  },
100
- // The generic Zone read scope is self-serve: approval attaches to widening the organization's Zone delegations instead.
100
+ // Generic Zone scopes are self-serve: approval attaches to widening the organization's Zone delegations instead.
101
101
  {
102
102
  description: 'Read RPC and indexed data in Zones the organization is delegated.',
103
103
  scope: 'zone:read',
104
104
  selfServe: true,
105
105
  },
106
+ // Broadcasts are account-signed, so the delegation only bounds which Zones a key may be tagged for.
107
+ {
108
+ description: 'Broadcast signed transactions to Zones the key is tagged for.',
109
+ scope: 'zone:write',
110
+ selfServe: true,
111
+ },
106
112
  ] as const satisfies readonly Entry[]
107
113
 
108
- /** Templated `/v1/scopes` entry for per-zone read scopes. */
109
- export const zoneEntry = {
110
- description: 'Read RPC and indexed data for one zone chain id.',
111
- scope: 'zone:<chainId>:read',
112
- selfServe: false,
113
- } as const satisfies Entry
114
-
115
- /** Templated `/v1/scopes` entry for per-zone transaction broadcast scopes. */
114
+ /** Templated `/v1/scopes` entry for the retired per-zone broadcast scopes, listed while stored keys still hold them. */
116
115
  export const zoneWriteEntry = {
117
116
  description: 'Broadcast signed transactions to one zone chain id.',
118
117
  scope: 'zone:<chainId>:write',
@@ -124,7 +123,7 @@ const zonePattern = /^zone:([1-9]\d*):(read|write)$/
124
123
 
125
124
  /** Zod schemas owned by the scope vocabulary. */
126
125
  export namespace schema {
127
- /** A concrete per-zone read or write scope. */
126
+ /** A concrete per-zone scope, retired for both verbs but still held by stored keys until the rewrite's cleanup strips it. */
128
127
  export const Zone = z
129
128
  .union([
130
129
  z.templateLiteral(['zone:', z.int(), ':read']),
@@ -132,11 +131,13 @@ export namespace schema {
132
131
  ])
133
132
  .check(
134
133
  z.regex(zonePattern),
135
- z.describe('Per-zone read or write scope (`zone:<chainId>:read|write`).'),
134
+ z.describe(
135
+ 'Retired per-zone scope (`zone:<chainId>:read|write`); keys use `zone:read` or `zone:write` with Zone tags instead.',
136
+ ),
136
137
  )
137
138
  }
138
139
 
139
- /** Per-zone read or write scope, granting access to one zone chain id. */
140
+ /** Retired per-zone scope naming one zone chain id; stored records still parse, fresh grants refuse it. */
140
141
  export type Zone = z.output<typeof schema.Zone>
141
142
 
142
143
  /** Issuable API-key scope identifier, including host-defined scopes. */
@@ -162,7 +163,7 @@ export const selfServe: readonly Id[] = catalog
162
163
  */
163
164
  export function extend(entries: readonly Entry[] = []): Catalog {
164
165
  const identifiers = new Set<string>()
165
- const result = [...catalog, zoneEntry, zoneWriteEntry, ...entries]
166
+ const result = [...catalog, zoneWriteEntry, ...entries]
166
167
  for (const entry of result) {
167
168
  if (!entry.scope.trim()) throw new Error('Scope identifier must not be empty.')
168
169
  if (identifiers.has(entry.scope)) throw new Error(`Duplicate scope \`${entry.scope}\`.`)
@@ -171,11 +172,16 @@ export function extend(entries: readonly Entry[] = []): Catalog {
171
172
  return result
172
173
  }
173
174
 
174
- /** Returns whether a catalog contains a scope identifier. */
175
+ /** Returns whether a catalog contains a scope identifier, including retired per-Zone read scopes stored on older keys. */
175
176
  export function includes(catalog: Catalog, scope: string): scope is Id {
176
177
  return schema.Zone.safeParse(scope).success || catalog.some((entry) => entry.scope === scope)
177
178
  }
178
179
 
180
+ /** Returns whether a scope may be granted to a key; per-Zone scopes are retired in favor of `zone:read`/`zone:write` plus tags. */
181
+ export function issuable(catalog: Catalog, scope: string): scope is Id {
182
+ return includes(catalog, scope) && parseZone(scope) === undefined
183
+ }
184
+
179
185
  /** Parses a concrete per-Zone scope into its chain id and verb; undefined for every other scope. */
180
186
  export function parseZone(scope: string): parseZone.Result | undefined {
181
187
  const match = zonePattern.exec(scope)
@@ -200,29 +206,10 @@ export function zoneReadChainId(scope: string): number | undefined {
200
206
  return zone?.verb === 'read' ? Schema.resolveChainId(zone.chainId) : undefined
201
207
  }
202
208
 
203
- /**
204
- * Adds the scopes a per-Zone read scope implies: the generic `zone:read` and,
205
- * for an aliased chain id, the current per-Zone read scope. Write scopes stay per Zone.
206
- */
207
- export function expandAliases(scopes: readonly string[]): readonly string[] {
208
- const aliases = new Set<string>()
209
- for (const scope of scopes) {
210
- const zone = parseZone(scope)
211
- if (zone?.verb !== 'read') continue
212
- aliases.add('zone:read')
213
- aliases.add(`zone:${Schema.resolveChainId(zone.chainId)}:read`)
214
- }
215
- for (const scope of scopes) aliases.delete(scope)
216
- return aliases.size ? [...scopes, ...aliases] : scopes
217
- }
218
-
219
- /**
220
- * Zone chain ids named by per-Zone scopes, serving as implicit delegation tags
221
- * for keys without explicit ones. `undefined` means no Zone.
222
- */
223
- export function zoneTags(scopes: readonly string[]): readonly number[] | undefined {
224
- const tags = new Set(scopes.flatMap((scope) => parseZone(scope)?.chainId ?? []))
225
- return tags.size ? [...tags].sort((a, b) => a - b) : undefined
209
+ /** Zone chain id a write scope names, resolved from any legacy alias; undefined for every other scope. */
210
+ export function zoneWriteChainId(scope: string): number | undefined {
211
+ const zone = parseZone(scope)
212
+ return zone?.verb === 'write' ? Schema.resolveChainId(zone.chainId) : undefined
226
213
  }
227
214
 
228
215
  /** Returns the self-issuable identifiers in a scope catalog. */
@@ -20,6 +20,16 @@ describe('create', () => {
20
20
  method: 'POST',
21
21
  }),
22
22
  new Request('http://admin/api-keys/key_x', { method: 'DELETE' }),
23
+ new Request('http://admin/audit-logs'),
24
+ new Request('http://admin/early-access'),
25
+ new Request('http://admin/openapi.json'),
26
+ new Request('http://admin/prop-amms/pools'),
27
+ new Request('http://admin/route-policies', { method: 'PUT' }),
28
+ new Request('http://admin/routes'),
29
+ new Request('http://admin/sentinel'),
30
+ new Request('http://admin/zone-delegations'),
31
+ new Request('http://admin/zone-delegation-requests'),
32
+ new Request('http://admin/zone-delegations/rewrite-keys', { method: 'POST' }),
23
33
  new Request('http://admin/earn/verified-vaults', {
24
34
  body: JSON.stringify({}),
25
35
  headers: { 'content-type': 'application/json' },
@@ -64,7 +74,7 @@ describe('create', () => {
64
74
  const html = await shell.text()
65
75
  const json = html.match(/window\.__TEMPO_API_CONFIG__=({.*?})<\/script>/)?.[1]
66
76
  expect(JSON.parse(json!)).toEqual({
67
- auth: { identity: null, loginUrl: '/login', zoneKeyApprover: false },
77
+ auth: { delegationApprover: false, identity: null, loginUrl: '/login' },
68
78
  rewards: { chainId: 4217, operatorAddress: '0x6000000000000000000000000000000000000006' },
69
79
  })
70
80
  const assetPath = html.match(/\.\/(assets\/[^"]+\.js)/)?.[1]
@@ -210,6 +220,43 @@ describe('create', () => {
210
220
  })
211
221
  expect(records[0]?.requestId).toBeTruthy()
212
222
  })
223
+
224
+ test('records one row per request on bare and nested paths', async () => {
225
+ const { app, db } = TestAdmin.setup({
226
+ identify: () => ({ email: 'ops@tempo.xyz' }),
227
+ })
228
+ await Organizations.create(db, { id: 'org', name: 'Operations' })
229
+ const statuses = [
230
+ (await app.request('http://admin/organizations')).status,
231
+ (await app.request('http://admin/organizations/org')).status,
232
+ ]
233
+ const records = await db.kysely
234
+ .selectFrom('admin_audit_logs')
235
+ .select(['method', 'path', 'status'])
236
+ .orderBy('path')
237
+ .execute()
238
+
239
+ expect({ records, statuses }).toMatchInlineSnapshot(`
240
+ {
241
+ "records": [
242
+ {
243
+ "method": "GET",
244
+ "path": "/organizations",
245
+ "status": 200,
246
+ },
247
+ {
248
+ "method": "GET",
249
+ "path": "/organizations/org",
250
+ "status": 200,
251
+ },
252
+ ],
253
+ "statuses": [
254
+ 200,
255
+ 200,
256
+ ],
257
+ }
258
+ `)
259
+ })
213
260
  })
214
261
 
215
262
  describe('GET /config.json', () => {
@@ -224,12 +271,12 @@ describe('create', () => {
224
271
  expect(await response.json()).toMatchInlineSnapshot(`
225
272
  {
226
273
  "auth": {
274
+ "delegationApprover": false,
227
275
  "identity": {
228
276
  "email": "ops@tempo.xyz",
229
277
  },
230
278
  "loginUrl": "/login",
231
279
  "logoutUrl": "/logout",
232
- "zoneKeyApprover": false,
233
280
  },
234
281
  "rewards": {
235
282
  "chainId": 4217,
@@ -246,10 +293,10 @@ describe('create', () => {
246
293
  expect(await response.json()).toMatchInlineSnapshot(`
247
294
  {
248
295
  "auth": {
296
+ "delegationApprover": false,
249
297
  "identity": {
250
298
  "email": "ops@tempo.xyz",
251
299
  },
252
- "zoneKeyApprover": false,
253
300
  },
254
301
  "rewards": {
255
302
  "chainId": 4217,
@@ -283,10 +330,10 @@ describe('create', () => {
283
330
  expect(json).toBeDefined()
284
331
  expect(JSON.parse(json!)).toEqual({
285
332
  auth: {
333
+ delegationApprover: false,
286
334
  identity: { email: 'admin@tempo.xyz' },
287
335
  loginUrl: 'https://sso/login',
288
336
  logoutUrl: 'https://sso/logout',
289
- zoneKeyApprover: false,
290
337
  },
291
338
  rewards: { chainId: 4217, operatorAddress: '0x6000000000000000000000000000000000000006' },
292
339
  })