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
@@ -88,18 +88,14 @@ export namespace schema {
88
88
  ),
89
89
  period: z
90
90
  .object({
91
- end: z.iso
92
- .datetime()
93
- .check(
94
- z.describe('Inclusive end of this line’s service period.'),
95
- z.meta({ examples: ['2026-10-04T00:00:00.000Z'] }),
96
- ),
97
- start: z.iso
98
- .datetime()
99
- .check(
100
- z.describe('Inclusive start of this line’s service period.'),
101
- z.meta({ examples: ['2026-09-04T00:00:00.000Z'] }),
102
- ),
91
+ end: Schema.dateTime().check(
92
+ z.describe('Inclusive end of this line’s service period.'),
93
+ z.meta({ examples: ['2026-10-04T00:00:00.000Z'] }),
94
+ ),
95
+ start: Schema.dateTime().check(
96
+ z.describe('Inclusive start of this line’s service period.'),
97
+ z.meta({ examples: ['2026-09-04T00:00:00.000Z'] }),
98
+ ),
103
99
  })
104
100
  .check(
105
101
  z.describe('Service dates for this invoice line, as reported by Stripe.'),
@@ -178,12 +174,10 @@ export namespace schema {
178
174
  ],
179
175
  }),
180
176
  ),
181
- retrievedAt: z.iso
182
- .datetime()
183
- .check(
184
- z.describe('Time the estimate was read, not a meter aggregation watermark.'),
185
- z.meta({ examples: ['2026-09-05T00:00:00.000Z'] }),
186
- ),
177
+ retrievedAt: Schema.dateTime().check(
178
+ z.describe('Time the estimate was read, not a meter aggregation watermark.'),
179
+ z.meta({ examples: ['2026-09-05T00:00:00.000Z'] }),
180
+ ),
187
181
  startingBalance: Amount.check(
188
182
  z.describe('Customer balance before this invoice; negative amounts are credit.'),
189
183
  ),
@@ -351,7 +345,7 @@ export namespace schema {
351
345
  ),
352
346
  z.meta({ examples: [{ amount: '0.50', currency: 'usd' }] }),
353
347
  ),
354
- updatedAt: z.optional(z.iso.datetime()).check(
348
+ updatedAt: z.optional(Schema.dateTime()).check(
355
349
  z.describe('When the billing status last changed (ISO 8601); absent before first checkout.'), // prettier-ignore
356
350
  z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
357
351
  ),
@@ -400,12 +394,10 @@ export namespace schema {
400
394
  z.describe('Card details; present when `type` is `card`.'),
401
395
  z.meta({ examples: [{ brand: 'visa', expMonth: 12, expYear: 2030, last4: '4242' }] }),
402
396
  ),
403
- createdAt: z.iso
404
- .datetime()
405
- .check(
406
- z.describe('When the method was attached (ISO 8601).'),
407
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
408
- ),
397
+ createdAt: Schema.dateTime().check(
398
+ z.describe('When the method was attached (ISO 8601).'),
399
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
400
+ ),
409
401
  default: z
410
402
  .boolean()
411
403
  .check(z.describe('Whether invoices charge this method.'), z.meta({ examples: [true] })),
@@ -28,12 +28,10 @@ export namespace schema {
28
28
  z.describe('Code shown in both the terminal and the console to match the request.'),
29
29
  z.meta({ examples: ['BCDF-GHJK'] }),
30
30
  )
31
- const expiresAt = z.iso
32
- .datetime()
33
- .check(
34
- z.describe('When the pending sign-in expires (ISO 8601).'),
35
- z.meta({ examples: ['2026-01-01T00:10:00.000Z'] }),
36
- )
31
+ const expiresAt = Schema.dateTime().check(
32
+ z.describe('When the pending sign-in expires (ISO 8601).'),
33
+ z.meta({ examples: ['2026-01-01T00:10:00.000Z'] }),
34
+ )
37
35
  const device = z
38
36
  .string()
39
37
  .check(
@@ -99,12 +97,10 @@ export namespace schema {
99
97
  .object({ device: z.optional(device), name: z.optional(name) })
100
98
  .check(z.describe('CLI details reported when the sign-in started.')),
101
99
  code,
102
- createdAt: z.iso
103
- .datetime()
104
- .check(
105
- z.describe('When the sign-in started (ISO 8601).'),
106
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
107
- ),
100
+ createdAt: Schema.dateTime().check(
101
+ z.describe('When the sign-in started (ISO 8601).'),
102
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
103
+ ),
108
104
  expiresAt,
109
105
  ip: z.optional(
110
106
  z
@@ -155,12 +151,10 @@ export namespace schema {
155
151
  z.object({ status: z.literal('pending') }),
156
152
  z.object({ status: z.literal('denied') }),
157
153
  z.object({
158
- expiresAt: z.iso
159
- .datetime()
160
- .check(
161
- z.describe('When the CLI session expires (ISO 8601).'),
162
- z.meta({ examples: ['2026-01-31T00:00:00.000Z'] }),
163
- ),
154
+ expiresAt: Schema.dateTime().check(
155
+ z.describe('When the CLI session expires (ISO 8601).'),
156
+ z.meta({ examples: ['2026-01-31T00:00:00.000Z'] }),
157
+ ),
164
158
  scopes: z
165
159
  .array(z.string())
166
160
  .check(
@@ -12,9 +12,10 @@ import type * as App from '../App.js'
12
12
 
13
13
  /** Console Fee Payer usage contracts. */
14
14
  export namespace schema {
15
- const timestamp = z.iso
16
- .datetime()
17
- .check(z.describe('ISO 8601 timestamp.'), z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }))
15
+ const timestamp = Schema.dateTime().check(
16
+ z.describe('ISO 8601 timestamp.'),
17
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
18
+ )
18
19
  const amount = z
19
20
  .string()
20
21
  .check(
@@ -105,7 +106,7 @@ export namespace schema {
105
106
  z.meta({ examples: [42] }),
106
107
  ),
107
108
  date: z
108
- .union([z.iso.date(), z.iso.datetime()])
109
+ .union([z.iso.date(), Schema.dateTime()])
109
110
  .check(
110
111
  z.describe(
111
112
  'UTC bucket start: date for daily buckets, timestamp for hourly buckets.',
@@ -33,24 +33,18 @@ export namespace schema {
33
33
  export const Invitation = OpenApi.component(
34
34
  Schema.describe(
35
35
  z.object({
36
- createdAt: z.iso
37
- .datetime()
38
- .check(
39
- z.describe('When the invitation was created (ISO 8601).'),
40
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
41
- ),
42
- email: z
43
- .email()
44
- .check(
45
- z.describe('Invitee email (lowercase).'),
46
- z.meta({ examples: ['dev@example.com'] }),
47
- ),
48
- expiresAt: z.iso
49
- .datetime()
50
- .check(
51
- z.describe('When the invitation expires (ISO 8601).'),
52
- z.meta({ examples: ['2026-01-08T00:00:00.000Z'] }),
53
- ),
36
+ createdAt: Schema.dateTime().check(
37
+ z.describe('When the invitation was created (ISO 8601).'),
38
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
39
+ ),
40
+ email: Schema.Email.check(
41
+ z.describe('Invitee email (lowercase).'),
42
+ z.meta({ examples: ['dev@example.com'] }),
43
+ ),
44
+ expiresAt: Schema.dateTime().check(
45
+ z.describe('When the invitation expires (ISO 8601).'),
46
+ z.meta({ examples: ['2026-01-08T00:00:00.000Z'] }),
47
+ ),
54
48
  id: z
55
49
  .string()
56
50
  .check(
@@ -122,9 +116,10 @@ export namespace schema {
122
116
  export const CreateInvitationRequest = OpenApi.component(
123
117
  z
124
118
  .object({
125
- email: z
126
- .email()
127
- .check(z.describe('Invitee email.'), z.meta({ examples: ['dev@example.com'] })),
119
+ email: Schema.Email.check(
120
+ z.describe('Invitee email.'),
121
+ z.meta({ examples: ['dev@example.com'] }),
122
+ ),
128
123
  role,
129
124
  })
130
125
  .check(z.describe('Fields for creating an invitation.')),
@@ -39,7 +39,7 @@ export namespace schema {
39
39
  z.meta({ examples: [['example.org'], null] }),
40
40
  )
41
41
  const nullableExpiry = z
42
- .nullable(z.iso.datetime({ offset: true }))
42
+ .nullable(Schema.dateTime({ offset: true }))
43
43
  .check(
44
44
  z.describe('When the link expires (ISO 8601), or null for no expiry.'),
45
45
  z.meta({ examples: ['2026-01-08T00:00:00.000Z', null] }),
@@ -59,12 +59,10 @@ export namespace schema {
59
59
  Schema.describe(
60
60
  z.object({
61
61
  allowedEmailDomains,
62
- createdAt: z.iso
63
- .datetime()
64
- .check(
65
- z.describe('When the link was created (ISO 8601).'),
66
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
67
- ),
62
+ createdAt: Schema.dateTime().check(
63
+ z.describe('When the link was created (ISO 8601).'),
64
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
65
+ ),
68
66
  createdBy: z
69
67
  .string()
70
68
  .check(
@@ -82,7 +80,7 @@ export namespace schema {
82
80
  z.meta({ examples: ['iln_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
83
81
  ),
84
82
  lastUsedAt: z
85
- .nullable(z.iso.datetime())
83
+ .nullable(Schema.dateTime())
86
84
  .check(
87
85
  z.describe('When the link last created a membership, or null.'),
88
86
  z.meta({ examples: ['2026-01-02T00:00:00.000Z', null] }),
@@ -107,12 +105,10 @@ export namespace schema {
107
105
  z.describe('Opaque bearer token embedded in the recipient URL (`lnk_…`).'),
108
106
  z.meta({ examples: ['lnk_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
109
107
  ),
110
- updatedAt: z.iso
111
- .datetime()
112
- .check(
113
- z.describe('When the link was last changed (ISO 8601).'),
114
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
115
- ),
108
+ updatedAt: Schema.dateTime().check(
109
+ z.describe('When the link was last changed (ISO 8601).'),
110
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
111
+ ),
116
112
  useCount: z
117
113
  .number()
118
114
  .check(
@@ -131,18 +127,14 @@ export namespace schema {
131
127
  export const Redemption = OpenApi.component(
132
128
  Schema.describe(
133
129
  z.object({
134
- createdAt: z.iso
135
- .datetime()
136
- .check(
137
- z.describe('When the membership was created (ISO 8601).'),
138
- z.meta({ examples: ['2026-01-02T00:00:00.000Z'] }),
139
- ),
140
- email: z
141
- .email()
142
- .check(
143
- z.describe('Verified email used for redemption.'),
144
- z.meta({ examples: ['dev@example.com'] }),
145
- ),
130
+ createdAt: Schema.dateTime().check(
131
+ z.describe('When the membership was created (ISO 8601).'),
132
+ z.meta({ examples: ['2026-01-02T00:00:00.000Z'] }),
133
+ ),
134
+ email: Schema.Email.check(
135
+ z.describe('Verified email used for redemption.'),
136
+ z.meta({ examples: ['dev@example.com'] }),
137
+ ),
146
138
  id: z
147
139
  .string()
148
140
  .check(
@@ -22,14 +22,12 @@ export namespace schema {
22
22
  z.describe('Wallet address bound to this user, when wallet sign-in established it.'),
23
23
  z.meta({ examples: ['0x0000000000000000000000000000000000000001'] }),
24
24
  ),
25
- createdAt: z.iso
26
- .datetime()
27
- .check(
28
- z.describe('When the user was created (ISO 8601).'),
29
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
30
- ),
25
+ createdAt: Schema.dateTime().check(
26
+ z.describe('When the user was created (ISO 8601).'),
27
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
28
+ ),
31
29
  email: z
32
- .optional(z.email())
30
+ .optional(Schema.Email)
33
31
  .check(
34
32
  z.describe('Verified email bound to this user, when present.'),
35
33
  z.meta({ examples: ['dev@example.com'] }),
@@ -40,12 +38,10 @@ export namespace schema {
40
38
  z.describe('Opaque user id (`usr_…`).'),
41
39
  z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
42
40
  ),
43
- updatedAt: z.iso
44
- .datetime()
45
- .check(
46
- z.describe('When the user was last updated (ISO 8601).'),
47
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
48
- ),
41
+ updatedAt: Schema.dateTime().check(
42
+ z.describe('When the user was last updated (ISO 8601).'),
43
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
44
+ ),
49
45
  }),
50
46
  'The signed-in developer.',
51
47
  ),
@@ -27,14 +27,12 @@ export namespace schema {
27
27
  z.describe("The member's wallet address, when wallet sign-in established it."),
28
28
  z.meta({ examples: ['0x20f414b3cbcf1fd8e8f5e1c1c2e3d4a5b6c7d8e9'] }),
29
29
  ),
30
- createdAt: z.iso
31
- .datetime()
32
- .check(
33
- z.describe('When the member joined (ISO 8601).'),
34
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
35
- ),
30
+ createdAt: Schema.dateTime().check(
31
+ z.describe('When the member joined (ISO 8601).'),
32
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
33
+ ),
36
34
  email: z
37
- .optional(z.email())
35
+ .optional(Schema.Email)
38
36
  .check(
39
37
  z.describe("The member's verified email, when known."),
40
38
  z.meta({ examples: ['dev@example.com'] }),
@@ -34,12 +34,10 @@ export namespace schema {
34
34
  export const Organization = OpenApi.component(
35
35
  Schema.describe(
36
36
  z.object({
37
- createdAt: z.iso
38
- .datetime()
39
- .check(
40
- z.describe('When the organization was created (ISO 8601).'),
41
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
42
- ),
37
+ createdAt: Schema.dateTime().check(
38
+ z.describe('When the organization was created (ISO 8601).'),
39
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
40
+ ),
43
41
  id: z
44
42
  .string()
45
43
  .check(
@@ -58,12 +56,10 @@ export namespace schema {
58
56
  z.describe("The caller's role; absent for API keys and the super admin."),
59
57
  z.meta({ examples: ['owner'] }),
60
58
  ),
61
- updatedAt: z.iso
62
- .datetime()
63
- .check(
64
- z.describe('When the organization was last updated (ISO 8601).'),
65
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
66
- ),
59
+ updatedAt: Schema.dateTime().check(
60
+ z.describe('When the organization was last updated (ISO 8601).'),
61
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
62
+ ),
67
63
  }),
68
64
  'An organization: the top-level tenant that owns API keys.',
69
65
  ),
@@ -28,12 +28,10 @@ export namespace schema {
28
28
  export const Project = OpenApi.component(
29
29
  Schema.describe(
30
30
  z.object({
31
- createdAt: z.iso
32
- .datetime()
33
- .check(
34
- z.describe('When the project was created (ISO 8601).'),
35
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
36
- ),
31
+ createdAt: Schema.dateTime().check(
32
+ z.describe('When the project was created (ISO 8601).'),
33
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
34
+ ),
37
35
  environments: z.array(z.enum(environments)).check(
38
36
  z.describe('Environments available to this project: sandbox (testnet) and production (mainnet).'), // prettier-ignore
39
37
  z.meta({ examples: [[...environments]] }),
@@ -53,12 +51,10 @@ export namespace schema {
53
51
  z.describe('Owning organization id (`org_…`).'),
54
52
  z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
55
53
  ),
56
- updatedAt: z.iso
57
- .datetime()
58
- .check(
59
- z.describe('When the project was last updated (ISO 8601).'),
60
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
61
- ),
54
+ updatedAt: Schema.dateTime().check(
55
+ z.describe('When the project was last updated (ISO 8601).'),
56
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
57
+ ),
62
58
  }),
63
59
  'A project: an app or integration within an organization.',
64
60
  ),
@@ -14,9 +14,10 @@ import type * as App from '../App.js'
14
14
 
15
15
  /** Contracts for session-owned Routes activity reads. */
16
16
  export namespace schema {
17
- const timestamp = z.iso
18
- .datetime()
19
- .check(z.describe('ISO 8601 timestamp.'), z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }))
17
+ const timestamp = Schema.dateTime().check(
18
+ z.describe('ISO 8601 timestamp.'),
19
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
20
+ )
20
21
  const volume = z
21
22
  .string()
22
23
  .check(
@@ -95,7 +96,7 @@ export namespace schema {
95
96
  .array(
96
97
  z.object({
97
98
  date: z
98
- .union([z.iso.date(), z.iso.datetime()])
99
+ .union([z.iso.date(), Schema.dateTime()])
99
100
  .check(
100
101
  z.describe(
101
102
  'UTC bucket start: date for daily buckets, timestamp for hourly buckets.',
@@ -1,6 +1,7 @@
1
1
  import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
2
2
 
3
3
  import * as TestApp from '../../../../test/App.js'
4
+ import * as TestRoutes from '../../../../test/Routes.js'
4
5
  import * as ApiKeys from '../../../ApiKeys.js'
5
6
  import * as RoutesAccessRequests from '../../../db/tables/routesAccessRequests.js'
6
7
  import * as Orgs from './orgs.js'
@@ -26,10 +27,15 @@ function request(method: 'DELETE' | 'GET' | 'POST', cookie: string, body?: unkno
26
27
  }
27
28
 
28
29
  /** Creates an app, an owner session, an organization, a project, and one live key. */
29
- async function setup() {
30
+ async function setup(options: setup.Options = {}) {
30
31
  const db = TestApp.database()
31
32
  const kv = { store: TestApp.kvStore() }
32
- const app = TestApp.create({ db, kv, session: { wallet: { origin } } })
33
+ const app = TestApp.create({
34
+ db,
35
+ kv,
36
+ ...(options.notify ? { routesAccessRequests: { notify: options.notify } } : {}),
37
+ session: { wallet: { origin } },
38
+ })
33
39
  const { cookie } = await TestApp.signIn(app, privateKeyToAccount(generatePrivateKey()))
34
40
  if (!cookie) throw new Error('Sign-in did not establish a session')
35
41
  const org = await TestApp.json(
@@ -49,6 +55,13 @@ async function setup() {
49
55
  return { app, cookie, db, key, kv, org, path, project }
50
56
  }
51
57
 
58
+ declare namespace setup {
59
+ type Options = {
60
+ /** Reviewer notifier handed to the management group. */
61
+ notify?: Requests.routesAccessRequests.Options['notify']
62
+ }
63
+ }
64
+
52
65
  test('publishes the request operations', async () => {
53
66
  const { app } = await setup()
54
67
  const spec = await (await app.request('/openapi.json')).json()
@@ -122,6 +135,55 @@ test('creates, lists, and cancels a pending request', async () => {
122
135
  expect(empty.data).toEqual([])
123
136
  })
124
137
 
138
+ test('notifies reviewers of a new request without waiting on them', async () => {
139
+ const notices: Requests.routesAccessRequests.Notice[] = []
140
+ const { app, cookie, db, key, path } = await setup({
141
+ notify: async (notice) => {
142
+ notices.push(notice)
143
+ },
144
+ })
145
+ await TestRoutes.publish(db)
146
+ const created = await app.request(
147
+ path,
148
+ request('POST', cookie, {
149
+ expectedVolume: '$50k per month',
150
+ keyIds: [key.id],
151
+ note: 'Payouts to merchants.',
152
+ routes: [route],
153
+ subsidy: true,
154
+ }),
155
+ )
156
+ expect(created.status).toBe(200)
157
+ await vi.waitFor(() => expect(notices).toHaveLength(1))
158
+ expect(notices[0]).toMatchInlineSnapshot(`
159
+ {
160
+ "environment": "production",
161
+ "expectedVolume": "$50k per month",
162
+ "keyCount": 1,
163
+ "note": "Payouts to merchants.",
164
+ "organization": "Acme",
165
+ "project": "Checkout",
166
+ "routes": [
167
+ "USDC on Base → OUSD on Tempo",
168
+ ],
169
+ "subsidy": true,
170
+ }
171
+ `)
172
+ })
173
+
174
+ test('keeps the request when the notifier fails', async () => {
175
+ const { app, cookie, key, path } = await setup({
176
+ notify: () => Promise.reject(new Error('Slack is down')),
177
+ })
178
+ const created = await app.request(
179
+ path,
180
+ request('POST', cookie, { keyIds: [key.id], routes: [], subsidy: false }),
181
+ )
182
+ expect(created.status).toBe(200)
183
+ const listed = await app.request(path, request('GET', cookie))
184
+ expect((await listed.json()).data).toHaveLength(1)
185
+ })
186
+
125
187
  test('rejects keys outside the project and environment', async () => {
126
188
  const { app, cookie, kv, org, path } = await setup()
127
189
  const { record: sandbox } = await ApiKeys.mint(kv.store, {