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