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
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: {
|
|
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: '
|
|
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(`
|
|
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
|
|
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: '
|
|
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(
|
|
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
|
|
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: '
|
|
786
|
+
method: 'account_getOperation',
|
|
742
787
|
params: [Hex.random(32)],
|
|
743
788
|
}
|
|
744
789
|
const configured = TestApp.create({
|
|
745
790
|
auth: { keys },
|
|
746
|
-
|
|
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
|
|
3752
|
+
test('enforces the chain selected by configurable account coordination', async () => {
|
|
3700
3753
|
const { app, entries, resolved } = await Oidc.setup({
|
|
3701
|
-
relay: {
|
|
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
|
-
['
|
|
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: {
|
|
3849
|
+
relay: { accounts: { store } },
|
|
3797
3850
|
})
|
|
3798
3851
|
const params =
|
|
3799
|
-
method === '
|
|
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('
|
|
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(`
|
|
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('
|
|
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,
|
|
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: {
|
|
3905
|
+
const { app, credential, resolved } = await Oidc.setup({ relay: { accounts: { store } } })
|
|
3853
3906
|
const params =
|
|
3854
|
-
method === '
|
|
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
|
|
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: {
|
|
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
|
-
|
|
3939
|
+
AccountOperation.serializeTransaction(operation, {
|
|
3887
3940
|
approvals: operation.approvals,
|
|
3888
3941
|
}),
|
|
3889
3942
|
],
|
|
3890
3943
|
]
|
|
3891
3944
|
const authorization = KeyAuthorization.deserialize(
|
|
3892
|
-
|
|
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
|
-
? '
|
|
3919
|
-
: '
|
|
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(`
|
|
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
|
|
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: {
|
|
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: '
|
|
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
|
|
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: {
|
|
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: '
|
|
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
|
|
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: {
|
|
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: '
|
|
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
|
|
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: {
|
|
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: '
|
|
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',
|
|
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
|
-
|
|
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',
|
|
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.
|
|
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 =
|
|
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
|
|
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
|
|
4588
|
+
return AccountOperation.from({
|
|
4531
4589
|
...payload,
|
|
4532
4590
|
...properties,
|
|
4533
4591
|
keyAuthorization:
|
|
4534
4592
|
options.status === 'success'
|
|
4535
|
-
?
|
|
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(`
|
|
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)
|