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
@@ -4,8 +4,8 @@ import * as jose from 'jose'
4
4
  import { nanoid } from 'nanoid'
5
5
  import { Hash, Hex, Json, Secp256k1 } from 'ox'
6
6
  import {
7
+ AccountOperation,
7
8
  KeyAuthorization,
8
- MultisigOperation,
9
9
  SignatureEnvelope,
10
10
  TxEnvelopeTempo,
11
11
  ZoneRpcAuthentication,
@@ -58,7 +58,8 @@ const runtime = Runtime.get()
58
58
  const feePayerAccount = Tempo.accounts[10]!
59
59
  const senderAccount = Tempo.accounts[9]!
60
60
  const zone = runtime.zone.chainId
61
- const zoneScope = `zone:${zone}:read` as const
61
+ /** Generic Zone read scope; keys tag the Zones they read. */
62
+ const zoneScope = 'zone:read' as const
62
63
  const zoneOptions = TestApp.zone({
63
64
  chainId: zone,
64
65
  rpcUrl: runtime.zone.internalRpcUrl,
@@ -106,8 +107,10 @@ const keys = [
106
107
  orgId: 'org_2',
107
108
  projectId: 'prj_2',
108
109
  environment: 'production',
109
- scopes: ['*'],
110
+ // The wildcard grants no Zone; the key carries explicit Zone grants beside it (fee-payer signing counts as a read).
111
+ scopes: ['*', 'zone:read', 'zone:write'],
110
112
  token: 'secret_wildcard_prod',
113
+ zoneTags: [zone],
111
114
  },
112
115
  {
113
116
  id: 'key_unscoped',
@@ -124,6 +127,7 @@ const keys = [
124
127
  environment: 'sandbox',
125
128
  scopes: ['rpc-relay:read', zoneScope],
126
129
  token: 'secret_zone_relay',
130
+ zoneTags: [zone],
127
131
  },
128
132
  {
129
133
  id: 'key_zone_sponsor',
@@ -132,6 +136,7 @@ const keys = [
132
136
  environment: 'sandbox',
133
137
  scopes: ['rpc-relay:sponsor', zoneScope],
134
138
  token: 'secret_zone_sponsor',
139
+ zoneTags: [zone],
135
140
  },
136
141
  {
137
142
  id: 'key_zone_writer',
@@ -141,6 +146,23 @@ const keys = [
141
146
  scopes: ['rpc-relay:read', 'rpc-relay:sponsor', `zone:${zone}:write`],
142
147
  token: 'secret_zone_writer',
143
148
  },
149
+ {
150
+ id: 'key_zone_tagged_writer',
151
+ orgId: 'org_1',
152
+ projectId: 'prj_1',
153
+ environment: 'sandbox',
154
+ scopes: ['rpc-relay:read', 'rpc-relay:sponsor', 'zone:write'],
155
+ token: 'secret_zone_tagged_writer',
156
+ zoneTags: [zone],
157
+ },
158
+ {
159
+ id: 'key_zone_untagged_writer',
160
+ orgId: 'org_1',
161
+ projectId: 'prj_1',
162
+ environment: 'sandbox',
163
+ scopes: ['rpc-relay:read', 'rpc-relay:sponsor', 'zone:write'],
164
+ token: 'secret_zone_untagged_writer',
165
+ },
144
166
  {
145
167
  id: 'key_unattributed',
146
168
  orgId: 'org_1',
@@ -157,14 +179,22 @@ const keys = [
157
179
  },
158
180
  ] as const satisfies readonly TestApp.kvStore.Key[]
159
181
 
160
- describe('behavior: multisig coordination', () => {
182
+ /** Holds every fixture organization's whole-Zone delegation; apps without their own database share it. */
183
+ const zoneDb = TestApp.database()
184
+ await TestApp.delegateZone(zoneDb, { chainIds: [zone], environment: 'sandbox', orgId: 'org_1' })
185
+ await TestApp.delegateZone(zoneDb, { chainIds: [zone], orgId: 'org_2' })
186
+ await TestApp.delegateZone(zoneDb, { chainIds: [zone, zone + 1], orgId: 'org_oidc' })
187
+ await TestApp.delegateZone(zoneDb, { chainIds: [zone], orgId: 'org_other' })
188
+
189
+ describe('behavior: configurable account coordination', () => {
161
190
  test('uses configured state and reports coordinator failures', async () => {
162
191
  const entries: Log.Entry[] = []
163
192
  const store = Store.memory()
164
193
  const app = TestApp.create({
165
194
  auth: { keys },
195
+ db: zoneDb,
166
196
  logger: (entry) => void entries.push(entry),
167
- relay: { multisig: { store } },
197
+ relay: { accounts: { store } },
168
198
  })
169
199
  const hash = Hex.random(32)
170
200
  const request = async () => {
@@ -172,7 +202,7 @@ describe('behavior: multisig coordination', () => {
172
202
  body: JSON.stringify({
173
203
  id: 1,
174
204
  jsonrpc: '2.0',
175
- method: 'multisig_getOperation',
205
+ method: 'account_getOperation',
176
206
  params: [hash],
177
207
  }),
178
208
  headers: { 'content-type': 'application/json', 'tempo-api-key': 'secret_unscoped' },
@@ -181,7 +211,7 @@ describe('behavior: multisig coordination', () => {
181
211
  return response.json()
182
212
  }
183
213
  expect(await request()).toMatchObject({ result: null })
184
- await store.put(`multisig:v2:multisig:operation:${hash}`, 'invalid')
214
+ await store.put(`accounts:v1:configurableAccount:operation:${hash}`, 'invalid')
185
215
  expect(await request()).toMatchObject({ error: { code: -32603 } })
186
216
  expect(entries.at(-1)?.rpc).toMatchObject({ serverErrors: 1 })
187
217
  })
@@ -200,6 +230,7 @@ describe('behavior: Zone chain routing', () => {
200
230
  function app() {
201
231
  return TestApp.create({
202
232
  auth: { keys },
233
+ db: zoneDb,
203
234
  zones: [zoneOptions],
204
235
  })
205
236
  }
@@ -283,27 +314,32 @@ describe('behavior: Zone chain routing', () => {
283
314
  error: {
284
315
  code: -32602,
285
316
  data: { code: 'api_key_forbidden' },
286
- message: expect.stringContaining(`zone:${zone}:write`),
317
+ message: expect.stringContaining('`zone:write` with a tag for Zone'),
287
318
  },
288
319
  })
289
- // A write scope broadcasts but never reads.
320
+ // A write scope broadcasts but never reads, whether a stored per-Zone scope or generic plus a tag.
321
+ for (const apiKey of ['secret_zone_writer', 'secret_zone_tagged_writer']) {
322
+ expect(await request(api, { apiKey, body: read, mount, pathChainId: zone })).toMatchObject({
323
+ error: {
324
+ code: -32602,
325
+ data: { code: 'api_key_forbidden' },
326
+ message: expect.stringContaining(zoneScope),
327
+ },
328
+ })
329
+ expect(
330
+ await request(api, { apiKey, body: broadcast, mount, pathChainId: zone }),
331
+ ).not.toMatchObject({ error: { data: { code: 'api_key_forbidden' } } })
332
+ }
333
+ // The generic write scope without a tag for the Zone broadcasts nowhere.
290
334
  expect(
291
- await request(api, { apiKey: 'secret_zone_writer', body: read, mount, pathChainId: zone }),
335
+ await request(api, { apiKey: 'secret_zone_untagged_writer', body: broadcast, mount, pathChainId: zone }), // prettier-ignore
292
336
  ).toMatchObject({
293
337
  error: {
294
338
  code: -32602,
295
339
  data: { code: 'api_key_forbidden' },
296
- message: expect.stringContaining(zoneScope),
340
+ message: expect.stringContaining('`zone:write` with a tag for Zone'),
297
341
  },
298
342
  })
299
- expect(
300
- await request(api, {
301
- apiKey: 'secret_zone_writer',
302
- body: broadcast,
303
- mount,
304
- pathChainId: zone,
305
- }),
306
- ).not.toMatchObject({ error: { data: { code: 'api_key_forbidden' } } })
307
343
  // A Zone token admits both.
308
344
  for (const body of [read, broadcast])
309
345
  expect(
@@ -315,6 +351,7 @@ describe('behavior: Zone chain routing', () => {
315
351
  test('sponsors a Zone broadcast for a write-only key', async () => {
316
352
  const api = TestApp.create({
317
353
  auth: { keys },
354
+ db: zoneDb,
318
355
  relay: { feePayer: { account: Tempo.accounts[1]! } },
319
356
  zones: [zoneOptions],
320
357
  })
@@ -345,6 +382,7 @@ describe('behavior: Zone chain routing', () => {
345
382
  const entries: Log.Entry[] = []
346
383
  const api = TestApp.create({
347
384
  auth: { keys },
385
+ db: zoneDb,
348
386
  logger: (entry) => void entries.push(entry),
349
387
  zones: [zoneOptions],
350
388
  })
@@ -393,6 +431,7 @@ describe('behavior: Zone chain routing', () => {
393
431
  test('allows a Zone token on the default chain', async () => {
394
432
  const api = TestApp.create({
395
433
  auth: { keys },
434
+ db: zoneDb,
396
435
  defaultChainId: zone,
397
436
  zones: [zoneOptions],
398
437
  })
@@ -418,6 +457,7 @@ describe('behavior: Zone chain routing', () => {
418
457
  try {
419
458
  const api = TestApp.create({
420
459
  auth: { keys },
460
+ db: zoneDb,
421
461
  rpc: { auth: 'internal:secret', url: server.url },
422
462
  zones: [TestApp.zone({ chainId: zone, rpcUrl: server.url })],
423
463
  })
@@ -450,6 +490,7 @@ describe('behavior: Zone chain routing', () => {
450
490
  for (const selector of ['path', 'body', 'default'] as const) {
451
491
  const api = TestApp.create({
452
492
  auth: { keys },
493
+ db: zoneDb,
453
494
  ...(selector === 'default' ? { defaultChainId: zone } : {}),
454
495
  rpc: { publicZoneUrl: server.url, url: 'http://internal.zone.test' },
455
496
  zones: [TestApp.zone({ chainId: zone, rpcUrl: 'http://internal.zone.test' })],
@@ -501,6 +542,7 @@ describe('behavior: Zone chain routing', () => {
501
542
  try {
502
543
  const api = TestApp.create({
503
544
  auth: { keys },
545
+ db: zoneDb,
504
546
  rpc: { publicZoneUrl: server.url, url: 'http://internal.zone.test' },
505
547
  zones: [TestApp.zone({ chainId: zone, rpcUrl: 'http://internal.zone.test' })],
506
548
  })
@@ -576,6 +618,7 @@ describe('behavior: Zone chain routing', () => {
576
618
  try {
577
619
  const api = TestApp.create({
578
620
  auth: { keys },
621
+ db: zoneDb,
579
622
  rpc: {
580
623
  auth: 'internal:secret',
581
624
  publicZoneUrl: publicRpc.url,
@@ -633,6 +676,7 @@ describe('behavior: Zone chain routing', () => {
633
676
  try {
634
677
  const api = TestApp.create({
635
678
  auth: { keys },
679
+ db: zoneDb,
636
680
  rpc: ({ chainId }) => (chainId === zone ? { url: server.url } : {}),
637
681
  zones: [zoneOptions],
638
682
  })
@@ -690,6 +734,7 @@ describe('behavior: Zone chain routing', () => {
690
734
  try {
691
735
  const api = TestApp.create({
692
736
  auth: { keys },
737
+ db: zoneDb,
693
738
  ...(selector === 'default' ? { defaultChainId: zone } : {}),
694
739
  rpc: ({ chainId }) => (chainId === zone ? { url: server.url } : {}),
695
740
  zones: [zoneOptions],
@@ -734,16 +779,17 @@ describe('behavior: Zone chain routing', () => {
734
779
  },
735
780
  )
736
781
 
737
- test('keeps multisig coordination on an explicit Zone path only when configured', async () => {
782
+ test('keeps configurable account coordination on an explicit Zone path only when configured', async () => {
738
783
  const body = {
739
784
  id: 1,
740
785
  jsonrpc: '2.0',
741
- method: 'multisig_getOperation',
786
+ method: 'account_getOperation',
742
787
  params: [Hex.random(32)],
743
788
  }
744
789
  const configured = TestApp.create({
745
790
  auth: { keys },
746
- relay: { multisig: { store: Store.memory() } },
791
+ db: zoneDb,
792
+ relay: { accounts: { store: Store.memory() } },
747
793
  zones: [zoneOptions],
748
794
  })
749
795
  expect(
@@ -788,6 +834,7 @@ describe('behavior: Zone chain routing', () => {
788
834
  try {
789
835
  const api = TestApp.create({
790
836
  auth: { keys },
837
+ db: zoneDb,
791
838
  rpc: { publicZoneUrl: publicRpc.url, url: internalRpc.url },
792
839
  zones: [TestApp.zone({ chainId: zone, rpcUrl: internalRpc.url })],
793
840
  })
@@ -820,6 +867,7 @@ describe('behavior: Zone chain routing', () => {
820
867
  try {
821
868
  const api = TestApp.create({
822
869
  auth: { keys },
870
+ db: zoneDb,
823
871
  rpc: ({ chainId }) => (chainId === zone ? { auth: 'rpc:secret', url: server.url } : {}),
824
872
  zones: [zoneOptions],
825
873
  })
@@ -857,6 +905,7 @@ describe('behavior: Zone chain routing', () => {
857
905
  try {
858
906
  const api = TestApp.create({
859
907
  auth: { keys },
908
+ db: zoneDb,
860
909
  rpc: { url: () => server.url },
861
910
  zones: [zoneOptions],
862
911
  })
@@ -904,6 +953,7 @@ describe('behavior: Zone chain routing', () => {
904
953
  test('rejects a Zone configured as the default chain', async () => {
905
954
  const api = TestApp.create({
906
955
  auth: { keys },
956
+ db: zoneDb,
907
957
  defaultChainId: zone,
908
958
  zones: [zoneOptions],
909
959
  })
@@ -918,6 +968,7 @@ describe('behavior: Zone chain routing', () => {
918
968
  test('rejects Zone selectors under a base path', async () => {
919
969
  const api = TestApp.create({
920
970
  auth: { keys },
971
+ db: zoneDb,
921
972
  path: '/api',
922
973
  zones: [zoneOptions],
923
974
  })
@@ -953,6 +1004,7 @@ describe('behavior: Zone chain routing', () => {
953
1004
  })
954
1005
  const api = TestApp.create({
955
1006
  auth: { keys },
1007
+ db: zoneDb,
956
1008
  relay: { feePayer: { account: feePayerAccount } },
957
1009
  rpc: { publicZoneUrl: server.url, url: 'http://internal.zone.test' },
958
1010
  zones: [TestApp.zone({ chainId: zone, rpcUrl: 'http://internal.zone.test' })],
@@ -991,6 +1043,7 @@ describe('behavior: Zone chain routing', () => {
991
1043
  const entries: Log.Entry[] = []
992
1044
  const api = TestApp.create({
993
1045
  auth: { keys },
1046
+ db: zoneDb,
994
1047
  logger: (entry) => void entries.push(entry),
995
1048
  relay: { feePayer: { account: feePayerAccount } },
996
1049
  zones: [zoneOptions],
@@ -3696,9 +3749,9 @@ describe('behavior: Zone workload identity', () => {
3696
3749
  expect(resolved).not.toContain(zone)
3697
3750
  })
3698
3751
 
3699
- test('enforces the chain selected by multisig coordination', async () => {
3752
+ test('enforces the chain selected by configurable account coordination', async () => {
3700
3753
  const { app, entries, resolved } = await Oidc.setup({
3701
- relay: { multisig: { store: Store.memory() } },
3754
+ relay: { accounts: { store: Store.memory() } },
3702
3755
  })
3703
3756
  const transaction = await Tempo.accounts[0]!.signTransaction({
3704
3757
  calls: [{ to: Tempo.accounts[2]!.address, value: 0n }],
@@ -3785,7 +3838,7 @@ describe('behavior: Zone workload identity', () => {
3785
3838
  )
3786
3839
 
3787
3840
  const storedRequests = [
3788
- ['multisig_approveKeyAuthorization', 'keyAuthorization', 'success'],
3841
+ ['account_approveKeyAuthorization', 'keyAuthorization', 'success'],
3789
3842
  ['eth_getTransactionByHash', 'transaction', 'submitting'],
3790
3843
  ['eth_getTransactionReceipt', 'transaction', 'submitting'],
3791
3844
  ] as const
@@ -3793,10 +3846,10 @@ describe('behavior: Zone workload identity', () => {
3793
3846
  test.each(storedRequests)('authorizes stored results from %s', async (method, type, status) => {
3794
3847
  const { hash, operation, store } = await Oidc.operation({ status, type })
3795
3848
  const { app, credential, entries, resolved } = await Oidc.setup({
3796
- relay: { multisig: { store } },
3849
+ relay: { accounts: { store } },
3797
3850
  })
3798
3851
  const params =
3799
- method === 'multisig_approveKeyAuthorization' ? [{ hash, signature: 'invalid' }] : [hash]
3852
+ method === 'account_approveKeyAuthorization' ? [{ hash, signature: 'invalid' }] : [hash]
3800
3853
  for (const [authorization, code, reason] of [
3801
3854
  [undefined, 'unauthorized', 'missing'],
3802
3855
  ['invalid', 'unauthorized', 'invalid'],
@@ -3809,7 +3862,7 @@ describe('behavior: Zone workload identity', () => {
3809
3862
  headers: {
3810
3863
  ...(authorization ? { authorization: `Bearer ${authorization}` } : {}),
3811
3864
  'content-type': 'application/json',
3812
- 'tempo-api-key': method.startsWith('multisig_approve')
3865
+ 'tempo-api-key': method.startsWith('account_approve')
3813
3866
  ? 'secret_oidc_zone_writer'
3814
3867
  : 'secret_oidc_zone',
3815
3868
  },
@@ -3820,7 +3873,7 @@ describe('behavior: Zone workload identity', () => {
3820
3873
  expect(body).not.toHaveProperty('result')
3821
3874
  expect(entries.at(-1)?.vercelOidc).toMatchObject([{ chainId: zone, reason }])
3822
3875
  expect(resolved).toEqual([])
3823
- expect(await store.get(`multisig:v2:multisig:operation:${hash}`)).toBe(
3876
+ expect(await store.get(`accounts:v1:configurableAccount:operation:${hash}`)).toBe(
3824
3877
  Json.stringify(operation),
3825
3878
  )
3826
3879
  }
@@ -3831,7 +3884,7 @@ describe('behavior: Zone workload identity', () => {
3831
3884
  headers: {
3832
3885
  authorization: `Bearer ${await credential()}`,
3833
3886
  'content-type': 'application/json',
3834
- 'tempo-api-key': method.startsWith('multisig_approve')
3887
+ 'tempo-api-key': method.startsWith('account_approve')
3835
3888
  ? 'secret_oidc_zone_writer'
3836
3889
  : 'secret_oidc_zone',
3837
3890
  },
@@ -3841,7 +3894,7 @@ describe('behavior: Zone workload identity', () => {
3841
3894
  expect(body).not.toHaveProperty('error')
3842
3895
  if (method === 'eth_getTransactionReceipt') expect(body.result).toBeNull()
3843
3896
  else if (method === 'eth_getTransactionByHash')
3844
- expect(body.result).toMatchObject({ hash, multisig: { hash, status } })
3897
+ expect(body.result).toMatchObject({ hash, operation: { hash, status } })
3845
3898
  else expect(body.result).toMatchObject({ hash, status, type })
3846
3899
  expect(entries.at(-1)?.vercelOidc).toMatchObject([{ chainId: zone, outcome: 'authorized' }])
3847
3900
  }
@@ -3849,9 +3902,9 @@ describe('behavior: Zone workload identity', () => {
3849
3902
 
3850
3903
  test.each(storedRequests)('enforces stored chain access on %s', async (method, type, status) => {
3851
3904
  const { hash, store } = await Oidc.operation({ status, type })
3852
- const { app, credential, resolved } = await Oidc.setup({ relay: { multisig: { store } } })
3905
+ const { app, credential, resolved } = await Oidc.setup({ relay: { accounts: { store } } })
3853
3906
  const params =
3854
- method === 'multisig_approveKeyAuthorization' ? [{ hash, signature: 'invalid' }] : [hash]
3907
+ method === 'account_approveKeyAuthorization' ? [{ hash, signature: 'invalid' }] : [hash]
3855
3908
  for (const [path, apiKey, error] of [
3856
3909
  [
3857
3910
  `/rpc/relay/${runtime.chainId}`,
@@ -3875,21 +3928,21 @@ describe('behavior: Zone workload identity', () => {
3875
3928
  })
3876
3929
 
3877
3930
  test.each(['transaction', 'keyAuthorization'] as const)(
3878
- 'denies pending multisig %s approvals before writes',
3931
+ 'denies pending configurable account %s approvals before writes',
3879
3932
  async (type) => {
3880
3933
  const { hash, operation, store } = await Oidc.operation({ type })
3881
- const { app, entries, resolved } = await Oidc.setup({ relay: { multisig: { store } } })
3934
+ const { app, entries, resolved } = await Oidc.setup({ relay: { accounts: { store } } })
3882
3935
  const requests = (() => {
3883
3936
  if (operation.type === 'transaction')
3884
3937
  return [
3885
3938
  [
3886
- MultisigOperation.serializeTransaction(operation, {
3939
+ AccountOperation.serializeTransaction(operation, {
3887
3940
  approvals: operation.approvals,
3888
3941
  }),
3889
3942
  ],
3890
3943
  ]
3891
3944
  const authorization = KeyAuthorization.deserialize(
3892
- MultisigOperation.serializeKeyAuthorization(operation.keyAuthorization, {
3945
+ AccountOperation.serializeKeyAuthorization(operation.keyAuthorization, {
3893
3946
  account: operation.account,
3894
3947
  approvals: operation.approvals,
3895
3948
  config: operation.config,
@@ -3915,8 +3968,8 @@ describe('behavior: Zone workload identity', () => {
3915
3968
  jsonrpc: '2.0',
3916
3969
  method:
3917
3970
  type === 'transaction'
3918
- ? 'multisig_approveRawTransaction'
3919
- : 'multisig_approveKeyAuthorization',
3971
+ ? 'account_approveRawTransaction'
3972
+ : 'account_approveKeyAuthorization',
3920
3973
  params,
3921
3974
  }),
3922
3975
  headers: {
@@ -3928,7 +3981,7 @@ describe('behavior: Zone workload identity', () => {
3928
3981
  expect(await response.json()).toMatchObject({ error: { data: { code: 'unauthorized' } } })
3929
3982
  expect(entries.at(-1)?.vercelOidc).toMatchObject([{ chainId: zone, reason: 'missing' }])
3930
3983
  expect(resolved).toEqual([])
3931
- expect(await store.get(`multisig:v2:multisig:operation:${hash}`)).toBe(
3984
+ expect(await store.get(`accounts:v1:configurableAccount:operation:${hash}`)).toBe(
3932
3985
  Json.stringify(operation),
3933
3986
  )
3934
3987
  }
@@ -3936,11 +3989,11 @@ describe('behavior: Zone workload identity', () => {
3936
3989
  )
3937
3990
 
3938
3991
  test.each(['transaction', 'keyAuthorization'] as const)(
3939
- 'enforces workload identity on stored multisig %s operations',
3992
+ 'enforces workload identity on stored configurable account %s operations',
3940
3993
  async (type) => {
3941
3994
  const { hash, store } = await Oidc.operation({ type })
3942
3995
  const { app, credential, entries, resolved } = await Oidc.setup({
3943
- relay: { multisig: { store } },
3996
+ relay: { accounts: { store } },
3944
3997
  })
3945
3998
  for (const apiKey of ['secret_oidc_zone', 'secret_oidc_wildcard']) {
3946
3999
  for (const [authorization, reason, code] of [
@@ -3954,7 +4007,7 @@ describe('behavior: Zone workload identity', () => {
3954
4007
  body: JSON.stringify({
3955
4008
  id: 1,
3956
4009
  jsonrpc: '2.0',
3957
- method: 'multisig_getOperation',
4010
+ method: 'account_getOperation',
3958
4011
  params: [hash],
3959
4012
  }),
3960
4013
  headers: {
@@ -3979,18 +4032,18 @@ describe('behavior: Zone workload identity', () => {
3979
4032
  )
3980
4033
 
3981
4034
  test.each(['transaction', 'keyAuthorization'] as const)(
3982
- 'returns authorized stored multisig %s operations',
4035
+ 'returns authorized stored configurable account %s operations',
3983
4036
  async (type) => {
3984
4037
  const { hash, operation, store } = await Oidc.operation({ type })
3985
4038
  const { app, credential, entries } = await Oidc.setup({
3986
- relay: { multisig: { store } },
4039
+ relay: { accounts: { store } },
3987
4040
  })
3988
4041
  for (const path of ['/rpc/relay', `/rpc/relay/${zone}`]) {
3989
4042
  const response = await app.request(path, {
3990
4043
  body: JSON.stringify({
3991
4044
  id: 1,
3992
4045
  jsonrpc: '2.0',
3993
- method: 'multisig_getOperation',
4046
+ method: 'account_getOperation',
3994
4047
  params: [hash],
3995
4048
  }),
3996
4049
  headers: {
@@ -4011,15 +4064,15 @@ describe('behavior: Zone workload identity', () => {
4011
4064
  )
4012
4065
 
4013
4066
  test.each(['transaction', 'keyAuthorization'] as const)(
4014
- 'rejects conflicting chains on stored multisig %s operations',
4067
+ 'rejects conflicting chains on stored configurable account %s operations',
4015
4068
  async (type) => {
4016
4069
  const { hash, store } = await Oidc.operation({ type })
4017
- const { app, credential, resolved } = await Oidc.setup({ relay: { multisig: { store } } })
4070
+ const { app, credential, resolved } = await Oidc.setup({ relay: { accounts: { store } } })
4018
4071
  const response = await app.request(`/rpc/relay/${runtime.chainId}`, {
4019
4072
  body: JSON.stringify({
4020
4073
  id: 1,
4021
4074
  jsonrpc: '2.0',
4022
- method: 'multisig_getOperation',
4075
+ method: 'account_getOperation',
4023
4076
  params: [hash],
4024
4077
  }),
4025
4078
  headers: {
@@ -4037,15 +4090,15 @@ describe('behavior: Zone workload identity', () => {
4037
4090
  )
4038
4091
 
4039
4092
  test.each(['transaction', 'keyAuthorization'] as const)(
4040
- 'requires Zone scope on stored multisig %s operations',
4093
+ 'requires Zone scope on stored configurable account %s operations',
4041
4094
  async (type) => {
4042
4095
  const { hash, store } = await Oidc.operation({ type })
4043
- const { app, credential, resolved } = await Oidc.setup({ relay: { multisig: { store } } })
4096
+ const { app, credential, resolved } = await Oidc.setup({ relay: { accounts: { store } } })
4044
4097
  const response = await app.request('/rpc/relay', {
4045
4098
  body: JSON.stringify({
4046
4099
  id: 1,
4047
4100
  jsonrpc: '2.0',
4048
- method: 'multisig_getOperation',
4101
+ method: 'account_getOperation',
4049
4102
  params: [hash],
4050
4103
  }),
4051
4104
  headers: {
@@ -4131,6 +4184,7 @@ describe.skipIf(runtime.mode !== 'localnet')('behavior: Zone withdrawal fees', (
4131
4184
  await TestApp.verifiedSeed(db, zone)
4132
4185
  // A cap the gas alone fits under, which the outbox fee would exceed.
4133
4186
  await BillingSettings.upsert(db, { orgId: 'org_2', txFeeLimit: '0.50' })
4187
+ await TestApp.delegateZone(db, { chainIds: [zone], orgId: 'org_2' })
4134
4188
  const app = TestApp.create({
4135
4189
  auth: { keys },
4136
4190
  db,
@@ -4427,8 +4481,9 @@ namespace Oidc {
4427
4481
  environment: 'production',
4428
4482
  id: 'key_oidc_zone',
4429
4483
  orgId: 'org_oidc',
4430
- scopes: ['rpc-relay:read', 'rpc-relay:sponsor', `zone:${zone}:read`],
4484
+ scopes: ['rpc-relay:read', 'rpc-relay:sponsor', zoneScope],
4431
4485
  token: 'secret_oidc_zone',
4486
+ zoneTags: [zone],
4432
4487
  },
4433
4488
  {
4434
4489
  environment: 'production',
@@ -4441,8 +4496,10 @@ namespace Oidc {
4441
4496
  environment: 'production',
4442
4497
  id: 'key_oidc_wildcard',
4443
4498
  orgId: 'org_oidc',
4444
- scopes: ['*'],
4499
+ // The wildcard grants no Zone; the key carries the explicit Zone grants beside it.
4500
+ scopes: ['*', zoneScope, `zone:${zone}:write`, `zone:${zone + 1}:write`],
4445
4501
  token: 'secret_oidc_wildcard',
4502
+ zoneTags: [zone, zone + 1],
4446
4503
  },
4447
4504
  {
4448
4505
  environment: 'production',
@@ -4455,8 +4512,9 @@ namespace Oidc {
4455
4512
  environment: 'production',
4456
4513
  id: 'key_oidc_other_org',
4457
4514
  orgId: 'org_other',
4458
- scopes: ['rpc-relay:read', 'rpc-relay:sponsor', `zone:${zone}:read`],
4515
+ scopes: ['rpc-relay:read', 'rpc-relay:sponsor', zoneScope],
4459
4516
  token: 'secret_oidc_other_org',
4517
+ zoneTags: [zone],
4460
4518
  },
4461
4519
  ] as const satisfies readonly TestApp.kvStore.Key[]
4462
4520
 
@@ -4465,7 +4523,7 @@ namespace Oidc {
4465
4523
  status?: 'pending' | 'submitting' | 'success' | undefined
4466
4524
  type: 'transaction' | 'keyAuthorization'
4467
4525
  }) {
4468
- const account = TempoAccount.fromMultisig({
4526
+ const account = TempoAccount.fromConfig({
4469
4527
  owners: [Tempo.accounts[0]!.address, Tempo.accounts[1]!.address],
4470
4528
  salt: Hex.random(32),
4471
4529
  threshold: 2,
@@ -4500,7 +4558,7 @@ namespace Oidc {
4500
4558
  ),
4501
4559
  type: 'keyAuthorization' as const,
4502
4560
  }
4503
- const hash = MultisigOperation.getHash(payload)
4561
+ const hash = AccountOperation.getHash(payload)
4504
4562
  const approvals = await Promise.all(
4505
4563
  Tempo.accounts
4506
4564
  .slice(0, options.status && options.status !== 'pending' ? 2 : 1)
@@ -4519,7 +4577,7 @@ namespace Oidc {
4519
4577
  }
4520
4578
  const operation = (() => {
4521
4579
  if (payload.type === 'transaction')
4522
- return MultisigOperation.from({
4580
+ return AccountOperation.from({
4523
4581
  ...payload,
4524
4582
  ...properties,
4525
4583
  ...(options.status === 'submitting'
@@ -4527,12 +4585,12 @@ namespace Oidc {
4527
4585
  : {}),
4528
4586
  status: options.status === 'submitting' ? 'submitting' : 'pending',
4529
4587
  })
4530
- return MultisigOperation.from({
4588
+ return AccountOperation.from({
4531
4589
  ...payload,
4532
4590
  ...properties,
4533
4591
  keyAuthorization:
4534
4592
  options.status === 'success'
4535
- ? MultisigOperation.serializeKeyAuthorization(payload.keyAuthorization, {
4593
+ ? AccountOperation.serializeKeyAuthorization(payload.keyAuthorization, {
4536
4594
  account: account.address,
4537
4595
  approvals,
4538
4596
  config: account.config!,
@@ -4542,7 +4600,7 @@ namespace Oidc {
4542
4600
  })
4543
4601
  })()
4544
4602
  const store = Store.memory()
4545
- await store.put(`multisig:v2:multisig:operation:${hash}`, Json.stringify(operation))
4603
+ await store.put(`accounts:v1:configurableAccount:operation:${hash}`, Json.stringify(operation))
4546
4604
  return { hash, operation, store }
4547
4605
  }
4548
4606
 
@@ -4557,6 +4615,7 @@ namespace Oidc {
4557
4615
  return {
4558
4616
  app: TestApp.create({
4559
4617
  auth: { keys },
4618
+ db: zoneDb,
4560
4619
  logger: (entry) => void entries.push(entry),
4561
4620
  rpc: ({ chainId, zone }) => {
4562
4621
  resolved.push(chainId)