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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Address as core_Address, Hash, Hex, Rlp, RpcResponse, Signature } from 'ox'
|
|
2
2
|
import {
|
|
3
|
+
AccountConfig,
|
|
4
|
+
AccountOperation,
|
|
3
5
|
KeyAuthorization,
|
|
4
|
-
MultisigConfig,
|
|
5
|
-
MultisigOperation,
|
|
6
6
|
SignatureEnvelope,
|
|
7
7
|
TxEnvelopeTempo,
|
|
8
8
|
} from 'ox/tempo'
|
|
@@ -291,7 +291,7 @@ export async function handleRawTransaction(options: handleRawTransaction.Options
|
|
|
291
291
|
function isCanonical(serialized: Hex.Hex) {
|
|
292
292
|
try {
|
|
293
293
|
const envelope = TxEnvelopeTempo.deserialize(serialized as TxEnvelopeTempo.Serialized)
|
|
294
|
-
// Fee-payer handoffs encode a sender address or, for
|
|
294
|
+
// Fee-payer handoffs encode a sender address or, for configurable account senders, the `0x00` marker; parsing recovers `from` either way.
|
|
295
295
|
const slot = (Rlp.toHex(Hex.slice(serialized, 1)) as readonly Hex.Hex[])[11]
|
|
296
296
|
const serialized_parsed = serialized.startsWith(TxEnvelopeTempo.feePayerMagic)
|
|
297
297
|
? TxEnvelopeTempo.serialize(envelope, {
|
|
@@ -387,7 +387,7 @@ async function recoverSender(client: Client, serialized: `0x76${string}` | `0x78
|
|
|
387
387
|
const payload = TxEnvelopeTempo.getSignPayload(envelope)
|
|
388
388
|
|
|
389
389
|
const sender = await (async () => {
|
|
390
|
-
if (signature.type === '
|
|
390
|
+
if (signature.type === 'configurable') return verifyConfigurable(client, { payload, signature })
|
|
391
391
|
if (signature.type !== 'keychain') return recoverSigner(payload, signature)
|
|
392
392
|
// Tempo rejects V1 access-key signatures, which do not bind the key to its account.
|
|
393
393
|
if (signature.version !== 'v2')
|
|
@@ -418,8 +418,8 @@ async function recoverSender(client: Client, serialized: `0x76${string}` | `0x78
|
|
|
418
418
|
const { signature: signature_authorization } = keyAuthorization
|
|
419
419
|
const payload_authorization = KeyAuthorization.getSignPayload(keyAuthorization)
|
|
420
420
|
const authorizer =
|
|
421
|
-
signature_authorization.type === '
|
|
422
|
-
? await
|
|
421
|
+
signature_authorization.type === 'configurable'
|
|
422
|
+
? await verifyConfigurable(client, {
|
|
423
423
|
payload: payload_authorization,
|
|
424
424
|
signature: signature_authorization,
|
|
425
425
|
})
|
|
@@ -472,63 +472,63 @@ async function recoverSender(client: Client, serialized: `0x76${string}` | `0x78
|
|
|
472
472
|
}
|
|
473
473
|
|
|
474
474
|
/**
|
|
475
|
-
* Returns a
|
|
475
|
+
* Returns a configurable signature's account once its config matches the on-chain commitment and
|
|
476
476
|
* owner approvals of `payload` reach quorum. Raw signing returns before any node checks them.
|
|
477
477
|
*/
|
|
478
|
-
async function
|
|
478
|
+
async function verifyConfigurable(client: Client, options: verifyConfigurable.Options) {
|
|
479
479
|
const { payload, signature } = options
|
|
480
480
|
const { account } = signature
|
|
481
|
-
const config =
|
|
481
|
+
const config = AccountConfig.from(signature.config)
|
|
482
482
|
// Caller-token Zone endpoints scope reads to the authorized account.
|
|
483
483
|
const commitment = await readContract(client, {
|
|
484
|
-
...Actions.
|
|
484
|
+
...Actions.accounts.getConfigCommitment.call({ account }),
|
|
485
485
|
account,
|
|
486
486
|
})
|
|
487
487
|
// A version-zero config derives its account; a registered account must match its stored commitment.
|
|
488
488
|
if (
|
|
489
489
|
config.version === 0n &&
|
|
490
490
|
!core_Address.isEqual(
|
|
491
|
-
|
|
491
|
+
AccountConfig.getAddress(config, { factory: Addresses.configurableAccountRecoveryFactory }),
|
|
492
492
|
account,
|
|
493
493
|
)
|
|
494
494
|
)
|
|
495
495
|
throw new RpcResponse.InvalidParamsError({
|
|
496
|
-
message: 'Initial account config does not match the
|
|
496
|
+
message: 'Initial account config does not match the configurable account.',
|
|
497
497
|
})
|
|
498
498
|
if (
|
|
499
499
|
!(config.version === 0n && Hex.toBigInt(commitment) === 0n) &&
|
|
500
|
-
commitment.toLowerCase() !==
|
|
500
|
+
commitment.toLowerCase() !== AccountConfig.getCommitment(config).toLowerCase()
|
|
501
501
|
)
|
|
502
502
|
throw new RpcResponse.InvalidParamsError({
|
|
503
503
|
message: `Account config does not match account ${account}.`,
|
|
504
504
|
})
|
|
505
505
|
const { threshold, weight } = await (async () => {
|
|
506
506
|
try {
|
|
507
|
-
return await
|
|
507
|
+
return await AccountOperation.selectApprovals({
|
|
508
508
|
account,
|
|
509
509
|
approvals: signature.signatures.map((approval) => SignatureEnvelope.serialize(approval)),
|
|
510
510
|
config,
|
|
511
|
-
hash:
|
|
511
|
+
hash: AccountConfig.getSignPayload({ account, config, payload }),
|
|
512
512
|
})
|
|
513
513
|
} catch (error) {
|
|
514
|
-
if (error instanceof
|
|
514
|
+
if (error instanceof AccountOperation.InvalidApprovalError)
|
|
515
515
|
throw new RpcResponse.InvalidParamsError({ message: error.shortMessage })
|
|
516
516
|
throw error
|
|
517
517
|
}
|
|
518
518
|
})()
|
|
519
519
|
if (weight < threshold)
|
|
520
520
|
throw new RpcResponse.InvalidParamsError({
|
|
521
|
-
message: '
|
|
521
|
+
message: 'Configurable account approvals do not reach quorum.',
|
|
522
522
|
})
|
|
523
523
|
return account
|
|
524
524
|
}
|
|
525
525
|
|
|
526
|
-
declare namespace
|
|
526
|
+
declare namespace verifyConfigurable {
|
|
527
527
|
type Options = {
|
|
528
528
|
/** Sign payload the account's owners approve. */
|
|
529
529
|
payload: Hex.Hex
|
|
530
|
-
/**
|
|
531
|
-
signature: Extract<SignatureEnvelope.SignatureEnvelope, { type: '
|
|
530
|
+
/** Configurable signature carrying the account config and owner approvals. */
|
|
531
|
+
signature: Extract<SignatureEnvelope.SignatureEnvelope, { type: 'configurable' }>
|
|
532
532
|
}
|
|
533
533
|
}
|
|
534
534
|
|
|
@@ -801,7 +801,7 @@ describe.skipIf(Runtime.get().mode !== 'localnet')('behavior: raw sponsorship se
|
|
|
801
801
|
})
|
|
802
802
|
})
|
|
803
803
|
|
|
804
|
-
describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG === 'sha-
|
|
804
|
+
describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG === 'sha-04e67d3')(
|
|
805
805
|
'multisig',
|
|
806
806
|
() => {
|
|
807
807
|
let client: ReturnType<typeof Relay.getClient>
|
|
@@ -812,7 +812,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
812
812
|
server = await Relay.createServer(
|
|
813
813
|
(
|
|
814
814
|
await Relay.relay({
|
|
815
|
-
|
|
815
|
+
accounts: { store },
|
|
816
816
|
tokens: localnetTokens,
|
|
817
817
|
})
|
|
818
818
|
).listener,
|
|
@@ -831,7 +831,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
831
831
|
test('example: initial configuration', async () => {
|
|
832
832
|
const owner_1 = Relay.accounts[1]!
|
|
833
833
|
const owner_2 = Relay.accounts[2]!
|
|
834
|
-
const account = Account.
|
|
834
|
+
const account = Account.fromConfig({
|
|
835
835
|
address: 'infer',
|
|
836
836
|
owners: [owner_1.address, owner_2.address],
|
|
837
837
|
salt: toHex(0x109700, { size: 32 }),
|
|
@@ -857,10 +857,10 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
857
857
|
token: Relay.addresses.alphaUsd,
|
|
858
858
|
})
|
|
859
859
|
expect({
|
|
860
|
-
signatureCount: pending.
|
|
860
|
+
signatureCount: pending.operation?.signatureCount,
|
|
861
861
|
status: pending.status,
|
|
862
|
-
threshold: pending.
|
|
863
|
-
weight: pending.
|
|
862
|
+
threshold: pending.operation?.threshold,
|
|
863
|
+
weight: pending.operation?.weight,
|
|
864
864
|
}).toMatchInlineSnapshot(`
|
|
865
865
|
{
|
|
866
866
|
"signatureCount": 1,
|
|
@@ -879,10 +879,10 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
879
879
|
token: Relay.addresses.alphaUsd,
|
|
880
880
|
} as never)
|
|
881
881
|
expect({
|
|
882
|
-
signatureCount: receipt.
|
|
882
|
+
signatureCount: receipt.operation?.signatureCount,
|
|
883
883
|
status: receipt.status,
|
|
884
|
-
threshold: receipt.
|
|
885
|
-
weight: receipt.
|
|
884
|
+
threshold: receipt.operation?.threshold,
|
|
885
|
+
weight: receipt.operation?.weight,
|
|
886
886
|
}).toMatchInlineSnapshot(`
|
|
887
887
|
{
|
|
888
888
|
"signatureCount": 2,
|
|
@@ -903,8 +903,8 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
903
903
|
const transaction = await getTransaction(client, {
|
|
904
904
|
hash: receipt.transactionHash,
|
|
905
905
|
})
|
|
906
|
-
if (transaction.signature?.type !== '
|
|
907
|
-
throw new Error('Expected a
|
|
906
|
+
if (transaction.signature?.type !== 'configurable')
|
|
907
|
+
throw new Error('Expected a configurable signature.')
|
|
908
908
|
expect({
|
|
909
909
|
account: transaction.signature.account,
|
|
910
910
|
signatureCount: transaction.signature.signatures.length,
|
|
@@ -914,15 +914,15 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
914
914
|
{
|
|
915
915
|
"account": "${account.address.toLowerCase()}",
|
|
916
916
|
"signatureCount": 2,
|
|
917
|
-
"type": "
|
|
917
|
+
"type": "configurable",
|
|
918
918
|
"version": 0n,
|
|
919
919
|
}
|
|
920
920
|
`)
|
|
921
921
|
})
|
|
922
922
|
|
|
923
|
-
test('rejects
|
|
924
|
-
const child = Account.
|
|
925
|
-
expect(() => Account.
|
|
923
|
+
test('rejects configurable accounts as owners', () => {
|
|
924
|
+
const child = Account.fromConfig({ owners: [Relay.accounts[3]!] })
|
|
925
|
+
expect(() => Account.fromConfig({ owners: [child as never] })).toThrow()
|
|
926
926
|
})
|
|
927
927
|
|
|
928
928
|
test('example: weighted quorum', async () => {
|
|
@@ -932,7 +932,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
932
932
|
const heavy = owners[0]!
|
|
933
933
|
const light_1 = owners[1]!
|
|
934
934
|
const light_2 = owners[2]!
|
|
935
|
-
const account = Account.
|
|
935
|
+
const account = Account.fromConfig({
|
|
936
936
|
address: 'infer',
|
|
937
937
|
owners: [
|
|
938
938
|
{ owner: heavy.address, weight: 2 },
|
|
@@ -959,7 +959,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
959
959
|
})
|
|
960
960
|
expect({
|
|
961
961
|
status: alicePending.status,
|
|
962
|
-
weight: alicePending.
|
|
962
|
+
weight: alicePending.operation?.weight,
|
|
963
963
|
}).toMatchInlineSnapshot(`
|
|
964
964
|
{
|
|
965
965
|
"status": "pending",
|
|
@@ -1010,7 +1010,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1010
1010
|
} as never)
|
|
1011
1011
|
expect({
|
|
1012
1012
|
status: bobCarolPending.status,
|
|
1013
|
-
weight: bobCarolPending.
|
|
1013
|
+
weight: bobCarolPending.operation?.weight,
|
|
1014
1014
|
}).toMatchInlineSnapshot(`
|
|
1015
1015
|
{
|
|
1016
1016
|
"status": "pending",
|
|
@@ -1031,12 +1031,12 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1031
1031
|
const transaction = await getTransaction(client, {
|
|
1032
1032
|
hash: receipt.transactionHash,
|
|
1033
1033
|
})
|
|
1034
|
-
if (transaction.signature?.type !== '
|
|
1035
|
-
throw new Error('Expected a
|
|
1034
|
+
if (transaction.signature?.type !== 'configurable')
|
|
1035
|
+
throw new Error('Expected a configurable signature.')
|
|
1036
1036
|
expect({
|
|
1037
1037
|
signatureCount: transaction.signature.signatures.length,
|
|
1038
1038
|
status: receipt.status,
|
|
1039
|
-
weight: receipt.
|
|
1039
|
+
weight: receipt.operation?.weight,
|
|
1040
1040
|
}).toMatchInlineSnapshot(`
|
|
1041
1041
|
{
|
|
1042
1042
|
"signatureCount": 2,
|
|
@@ -1055,7 +1055,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1055
1055
|
account: feePayerAccount,
|
|
1056
1056
|
onSponsored: () => ({ subsidized: true }),
|
|
1057
1057
|
},
|
|
1058
|
-
|
|
1058
|
+
accounts: { store: sponsorStore },
|
|
1059
1059
|
tokens: localnetTokens,
|
|
1060
1060
|
})
|
|
1061
1061
|
).listener,
|
|
@@ -1089,7 +1089,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1089
1089
|
sponsorship_details: { subsidized: true },
|
|
1090
1090
|
})
|
|
1091
1091
|
|
|
1092
|
-
const ownerFirst = Account.
|
|
1092
|
+
const ownerFirst = Account.fromConfig({
|
|
1093
1093
|
address: 'infer',
|
|
1094
1094
|
owners: [owner_1.address, owner_2.address],
|
|
1095
1095
|
salt: toHex(0x109704, { size: 32 }),
|
|
@@ -1110,9 +1110,10 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1110
1110
|
to: recipient.address,
|
|
1111
1111
|
token: Relay.addresses.alphaUsd,
|
|
1112
1112
|
})
|
|
1113
|
-
if (!ownerFirstPending.
|
|
1113
|
+
if (!ownerFirstPending.operation)
|
|
1114
|
+
throw new Error('Expected a configurable account operation.')
|
|
1114
1115
|
const ownerFirstTransaction = Transaction.deserialize(
|
|
1115
|
-
ownerFirstPending.
|
|
1116
|
+
ownerFirstPending.operation.transaction,
|
|
1116
1117
|
)
|
|
1117
1118
|
expect({
|
|
1118
1119
|
feePayerSigned:
|
|
@@ -1144,7 +1145,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1144
1145
|
}
|
|
1145
1146
|
`)
|
|
1146
1147
|
|
|
1147
|
-
const feePayerFirst = Account.
|
|
1148
|
+
const feePayerFirst = Account.fromConfig({
|
|
1148
1149
|
address: 'infer',
|
|
1149
1150
|
owners: [owner_1.address, owner_2.address],
|
|
1150
1151
|
salt: toHex(0x109705, { size: 32 }),
|
|
@@ -1165,9 +1166,10 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1165
1166
|
to: recipient.address,
|
|
1166
1167
|
token: Relay.addresses.alphaUsd,
|
|
1167
1168
|
})
|
|
1168
|
-
if (!feePayerFirstPending.
|
|
1169
|
+
if (!feePayerFirstPending.operation)
|
|
1170
|
+
throw new Error('Expected a configurable account operation.')
|
|
1169
1171
|
const feePayerFirstTransaction = Transaction.deserialize(
|
|
1170
|
-
feePayerFirstPending.
|
|
1172
|
+
feePayerFirstPending.operation.transaction,
|
|
1171
1173
|
)
|
|
1172
1174
|
expect({
|
|
1173
1175
|
feePayerSigned:
|
|
@@ -1206,7 +1208,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1206
1208
|
test('example: initial config and immediate access key use', async () => {
|
|
1207
1209
|
const owner_1 = Relay.accounts[3]!
|
|
1208
1210
|
const owner_2 = Relay.accounts[4]!
|
|
1209
|
-
const account = Account.
|
|
1211
|
+
const account = Account.fromConfig({
|
|
1210
1212
|
address: 'infer',
|
|
1211
1213
|
owners: [owner_1, owner_2],
|
|
1212
1214
|
salt: toHex(0x109706, { size: 32 }),
|
|
@@ -1228,10 +1230,10 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1228
1230
|
owner: owner_1,
|
|
1229
1231
|
})
|
|
1230
1232
|
expect({
|
|
1231
|
-
signatureCount: pending.
|
|
1233
|
+
signatureCount: pending.operation.signatureCount,
|
|
1232
1234
|
status: pending.status,
|
|
1233
|
-
threshold: pending.
|
|
1234
|
-
weight: pending.
|
|
1235
|
+
threshold: pending.operation.threshold,
|
|
1236
|
+
weight: pending.operation.weight,
|
|
1235
1237
|
}).toMatchInlineSnapshot(`
|
|
1236
1238
|
{
|
|
1237
1239
|
"signatureCount": 1,
|
|
@@ -1261,13 +1263,13 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1261
1263
|
status: receipt.status,
|
|
1262
1264
|
transactionSignature: transaction.signature?.type,
|
|
1263
1265
|
version:
|
|
1264
|
-
transaction.keyAuthorization?.signature.type === '
|
|
1266
|
+
transaction.keyAuthorization?.signature.type === 'configurable'
|
|
1265
1267
|
? transaction.keyAuthorization.signature.config.version
|
|
1266
1268
|
: undefined,
|
|
1267
1269
|
}).toMatchInlineSnapshot(`
|
|
1268
1270
|
{
|
|
1269
1271
|
"from": "${account.address.toLowerCase()}",
|
|
1270
|
-
"keyAuthorizationSignature": "
|
|
1272
|
+
"keyAuthorizationSignature": "configurable",
|
|
1271
1273
|
"status": "success",
|
|
1272
1274
|
"transactionSignature": "keychain",
|
|
1273
1275
|
"version": 0n,
|
|
@@ -1278,7 +1280,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1278
1280
|
test('example: initial config and subsequent access key use', async () => {
|
|
1279
1281
|
const owner_1 = Relay.accounts[6]!
|
|
1280
1282
|
const owner_2 = Relay.accounts[8]!
|
|
1281
|
-
const account = Account.
|
|
1283
|
+
const account = Account.fromConfig({
|
|
1282
1284
|
address: 'infer',
|
|
1283
1285
|
owners: [owner_1, owner_2],
|
|
1284
1286
|
salt: toHex(0x109707, { size: 32 }),
|
|
@@ -1330,9 +1332,9 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1330
1332
|
transactionSignature: initialTransaction.signature?.type,
|
|
1331
1333
|
}).toMatchInlineSnapshot(`
|
|
1332
1334
|
{
|
|
1333
|
-
"keyAuthorizationSignature": "
|
|
1335
|
+
"keyAuthorizationSignature": "configurable",
|
|
1334
1336
|
"status": "success",
|
|
1335
|
-
"transactionSignature": "
|
|
1337
|
+
"transactionSignature": "configurable",
|
|
1336
1338
|
}
|
|
1337
1339
|
`)
|
|
1338
1340
|
|
|
@@ -1357,7 +1359,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1357
1359
|
const owner_1 = Relay.accounts[1]!
|
|
1358
1360
|
const owner_2 = Relay.accounts[2]!
|
|
1359
1361
|
const owner_3 = Relay.accounts[3]!
|
|
1360
|
-
const account = Account.
|
|
1362
|
+
const account = Account.fromConfig({
|
|
1361
1363
|
address: 'infer',
|
|
1362
1364
|
owners: [owner_1, owner_2],
|
|
1363
1365
|
salt: toHex(0x109708, { size: 32 }),
|
|
@@ -1374,14 +1376,14 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1374
1376
|
to: account.address,
|
|
1375
1377
|
token: Relay.addresses.alphaUsd,
|
|
1376
1378
|
})
|
|
1377
|
-
const { receipt: pending } = await Actions.
|
|
1379
|
+
const { receipt: pending } = await Actions.accounts.updateConfigSync(client, {
|
|
1378
1380
|
account,
|
|
1379
1381
|
nextConfig,
|
|
1380
1382
|
owner: owner_1,
|
|
1381
1383
|
})
|
|
1382
1384
|
expect({
|
|
1383
1385
|
status: pending.status,
|
|
1384
|
-
version: pending.
|
|
1386
|
+
version: pending.operation?.config.version,
|
|
1385
1387
|
}).toMatchInlineSnapshot(`
|
|
1386
1388
|
{
|
|
1387
1389
|
"status": "pending",
|
|
@@ -1389,7 +1391,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1389
1391
|
}
|
|
1390
1392
|
`)
|
|
1391
1393
|
|
|
1392
|
-
const { receipt: updateReceipt, ...rotation } = await Actions.
|
|
1394
|
+
const { receipt: updateReceipt, ...rotation } = await Actions.accounts.updateConfigSync(
|
|
1393
1395
|
client,
|
|
1394
1396
|
{
|
|
1395
1397
|
account,
|
|
@@ -1412,7 +1414,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1412
1414
|
}
|
|
1413
1415
|
`)
|
|
1414
1416
|
|
|
1415
|
-
const currentAccount = Account.
|
|
1417
|
+
const currentAccount = Account.fromConfig(account.address)
|
|
1416
1418
|
const { receipt } = await Actions.token.transferSync(client, {
|
|
1417
1419
|
account: currentAccount,
|
|
1418
1420
|
amount: 11n,
|
|
@@ -1427,7 +1429,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1427
1429
|
account: transaction.from,
|
|
1428
1430
|
status: receipt.status,
|
|
1429
1431
|
version:
|
|
1430
|
-
transaction.signature?.type === '
|
|
1432
|
+
transaction.signature?.type === 'configurable'
|
|
1431
1433
|
? transaction.signature.config.version
|
|
1432
1434
|
: undefined,
|
|
1433
1435
|
}).toMatchInlineSnapshot(`
|
|
@@ -1442,7 +1444,7 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1442
1444
|
test('behavior: routes pathless approvals to their operation chain', async () => {
|
|
1443
1445
|
const owner_1 = Relay.accounts[1]!
|
|
1444
1446
|
const owner_2 = Relay.accounts[2]!
|
|
1445
|
-
const account = Account.
|
|
1447
|
+
const account = Account.fromConfig({
|
|
1446
1448
|
address: 'infer',
|
|
1447
1449
|
owners: [owner_1, owner_2],
|
|
1448
1450
|
salt: toHex(0x109709, { size: 32 }),
|
|
@@ -1470,10 +1472,10 @@ describe.runIf(Runtime.get().mode === 'localnet' && process.env.TEMPO_IMAGE_TAG
|
|
|
1470
1472
|
await Relay.relay({
|
|
1471
1473
|
getClient(chainId) {
|
|
1472
1474
|
if (chainId !== Relay.chain.id)
|
|
1473
|
-
throw new Error('Expected the
|
|
1475
|
+
throw new Error('Expected the configurable account operation chain.')
|
|
1474
1476
|
return getClient(chainId)
|
|
1475
1477
|
},
|
|
1476
|
-
|
|
1478
|
+
accounts: { store },
|
|
1477
1479
|
tokens: localnetTokens,
|
|
1478
1480
|
})
|
|
1479
1481
|
).listener,
|
package/src/handlers/relay.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AbiEvent, Hash, Hex, RpcRequest, RpcResponse } from 'ox'
|
|
2
2
|
import {
|
|
3
|
+
type AccountOperation,
|
|
3
4
|
KeyAuthorization,
|
|
4
|
-
type MultisigOperation,
|
|
5
5
|
Transaction as core_Transaction,
|
|
6
6
|
TxEnvelopeTempo,
|
|
7
7
|
} from 'ox/tempo'
|
|
@@ -30,7 +30,7 @@ import { type Handler, from } from '../Handler.js'
|
|
|
30
30
|
import * as Store from '../internal/Store.js'
|
|
31
31
|
import * as PublicUrl from '../internal/PublicUrl.js'
|
|
32
32
|
import * as Tip20 from '../internal/Tip20.js'
|
|
33
|
-
import * as
|
|
33
|
+
import * as Accounts from './internal/accounts.js'
|
|
34
34
|
import * as Sponsorship from './internal/sponsorship.js'
|
|
35
35
|
import * as Utils from './internal/utils.js'
|
|
36
36
|
|
|
@@ -87,7 +87,7 @@ export function relay(options: relay.Options = {}): Handler {
|
|
|
87
87
|
const getClient = getClient_ ?? defaultGetClient({ apiKey })
|
|
88
88
|
const resolveTokens = resolveTokens_ ?? defaultResolveTokens({ apiKey })
|
|
89
89
|
const feePayerOptions = options.feePayer
|
|
90
|
-
const
|
|
90
|
+
const accountsStore = options.accounts ? Accounts.fromStore(options.accounts.store) : undefined
|
|
91
91
|
|
|
92
92
|
const getTokens = async (chainId: number | undefined): Promise<readonly Address[]> => {
|
|
93
93
|
if (chainId === undefined) return []
|
|
@@ -170,9 +170,9 @@ export function relay(options: relay.Options = {}): Handler {
|
|
|
170
170
|
)
|
|
171
171
|
const chainId_request = chainId_path ?? chainId_body
|
|
172
172
|
|
|
173
|
-
if (
|
|
173
|
+
if (accountsStore && Accounts.methods.has(request.method)) {
|
|
174
174
|
let sponsorshipDetails: Sponsorship.SponsorshipDetails | undefined
|
|
175
|
-
const
|
|
175
|
+
const handleAccountsRequest = Relay.handleRequest(
|
|
176
176
|
async (inner, requestOptions) => {
|
|
177
177
|
// Inner calls serve the caller's operation, so they resolve under its method.
|
|
178
178
|
const client = await getClient(requestOptions?.chainId, { method: request.method })
|
|
@@ -186,13 +186,13 @@ export function relay(options: relay.Options = {}): Handler {
|
|
|
186
186
|
}
|
|
187
187
|
return await client.request(inner as never, requestOptions)
|
|
188
188
|
},
|
|
189
|
-
{ plugins: [Relay.
|
|
189
|
+
{ plugins: [Relay.accounts({ store: accountsStore })] },
|
|
190
190
|
)
|
|
191
191
|
try {
|
|
192
192
|
const hash = (() => {
|
|
193
|
-
if (request.method === '
|
|
193
|
+
if (request.method === 'account_approveKeyAuthorization') return first?.['hash']
|
|
194
194
|
if (
|
|
195
|
-
request.method === '
|
|
195
|
+
request.method === 'account_getOperation' ||
|
|
196
196
|
request.method === 'eth_getTransactionByHash' ||
|
|
197
197
|
request.method === 'eth_getTransactionReceipt'
|
|
198
198
|
)
|
|
@@ -201,10 +201,10 @@ export function relay(options: relay.Options = {}): Handler {
|
|
|
201
201
|
})()
|
|
202
202
|
const operation =
|
|
203
203
|
typeof hash === 'string' && Hash.validate(hash)
|
|
204
|
-
? ((await
|
|
205
|
-
method: '
|
|
204
|
+
? ((await handleAccountsRequest({
|
|
205
|
+
method: 'account_getOperation',
|
|
206
206
|
params: [hash],
|
|
207
|
-
})) as
|
|
207
|
+
})) as AccountOperation.Rpc | null)
|
|
208
208
|
: undefined
|
|
209
209
|
// Stored hashes commit to their payload's chain. Authorize it before coordination can return state or update approvals without upstream access.
|
|
210
210
|
if (operation) {
|
|
@@ -219,9 +219,9 @@ export function relay(options: relay.Options = {}): Handler {
|
|
|
219
219
|
await getClient(chainId, { method: request.method })
|
|
220
220
|
}
|
|
221
221
|
const result =
|
|
222
|
-
request.method === '
|
|
222
|
+
request.method === 'account_getOperation' && operation !== undefined
|
|
223
223
|
? operation
|
|
224
|
-
: await
|
|
224
|
+
: await handleAccountsRequest(
|
|
225
225
|
{
|
|
226
226
|
method: request.method,
|
|
227
227
|
params,
|
|
@@ -296,11 +296,11 @@ export function relay(options: relay.Options = {}): Handler {
|
|
|
296
296
|
|
|
297
297
|
const { feePayer: _feePayer, ...normalized } =
|
|
298
298
|
Utils.normalizeFillTransactionRequest(parameters)
|
|
299
|
-
const
|
|
300
|
-
typeof normalized['
|
|
301
|
-
normalized['
|
|
299
|
+
const hasAccountSimulation =
|
|
300
|
+
typeof normalized['configurableAccountSimulation'] === 'object' &&
|
|
301
|
+
normalized['configurableAccountSimulation'] !== null
|
|
302
302
|
const shouldDeferFeePayerSignature =
|
|
303
|
-
feePayerOptions &&
|
|
303
|
+
feePayerOptions && accountsStore && hasAccountSimulation
|
|
304
304
|
|
|
305
305
|
// When sponsoring, the sponsor's preferred fee token (if set)
|
|
306
306
|
// overrides whatever the consumer asked for — the sponsor is
|
|
@@ -526,7 +526,7 @@ export function relay(options: relay.Options = {}): Handler {
|
|
|
526
526
|
})(),
|
|
527
527
|
// Sign as fee payer (if sponsored and not already signed).
|
|
528
528
|
(async () => {
|
|
529
|
-
//
|
|
529
|
+
// Configurable account finalization changes the sender signature. Sign after quorum.
|
|
530
530
|
if (shouldDeferFeePayerSignature)
|
|
531
531
|
return { sponsorshipDetails: undefined, transaction: transaction_filled }
|
|
532
532
|
// Never sign with the managed fee payer for an app-provided
|
|
@@ -865,6 +865,13 @@ export namespace relay {
|
|
|
865
865
|
}
|
|
866
866
|
|
|
867
867
|
export type Options = from.Options & {
|
|
868
|
+
/** Configurable account coordination. */
|
|
869
|
+
accounts?:
|
|
870
|
+
| {
|
|
871
|
+
/** Authoritative state shared by every relay instance. */
|
|
872
|
+
store: Store.State
|
|
873
|
+
}
|
|
874
|
+
| undefined
|
|
868
875
|
/**
|
|
869
876
|
* Tempo API key used by the default RPC clients and token resolver. When
|
|
870
877
|
* omitted, RPC clients use each chain's default transport.
|
|
@@ -881,7 +888,7 @@ export namespace relay {
|
|
|
881
888
|
}
|
|
882
889
|
| undefined
|
|
883
890
|
/**
|
|
884
|
-
* Resolves a viem client from the request or stored
|
|
891
|
+
* Resolves a viem client from the request or stored configurable account operation, synchronously or asynchronously.
|
|
885
892
|
* Receives the JSON-RPC method the client will serve. Defaults to Tempo mainnet and testnet clients.
|
|
886
893
|
*/
|
|
887
894
|
getClient?:
|
|
@@ -916,13 +923,6 @@ export namespace relay {
|
|
|
916
923
|
url?: string | undefined
|
|
917
924
|
}
|
|
918
925
|
| undefined
|
|
919
|
-
/** Native multisig coordination. */
|
|
920
|
-
multisig?:
|
|
921
|
-
| {
|
|
922
|
-
/** Authoritative state shared by every relay instance. */
|
|
923
|
-
store: Store.State
|
|
924
|
-
}
|
|
925
|
-
| undefined
|
|
926
926
|
/**
|
|
927
927
|
* Relay features.
|
|
928
928
|
*
|
|
@@ -468,8 +468,12 @@ describe('require', () => {
|
|
|
468
468
|
`)
|
|
469
469
|
})
|
|
470
470
|
|
|
471
|
-
test(
|
|
472
|
-
const zoned = {
|
|
471
|
+
test("carries the key record's Zone tags on the principal", async () => {
|
|
472
|
+
const zoned = {
|
|
473
|
+
...key,
|
|
474
|
+
scopes: ['data:read', 'zone:read', 'zone:421700002:write'],
|
|
475
|
+
zoneTags: [421700001, 421700002],
|
|
476
|
+
}
|
|
473
477
|
const app = createApp({
|
|
474
478
|
auth: {
|
|
475
479
|
apiKey: { resolve: TestApp.resolver({ keys: [{ ...zoned, token }] }) },
|
package/src/internal/Auth.ts
CHANGED
|
@@ -984,7 +984,7 @@ namespace schema {
|
|
|
984
984
|
/** Email OTP send body accepted before Better Auth runs; 254 characters is the SMTP path limit. */
|
|
985
985
|
export const EmailOtpSend = z
|
|
986
986
|
.object({
|
|
987
|
-
email:
|
|
987
|
+
email: Schema.Email.check(z.maxLength(254), z.describe('Recipient email address.')),
|
|
988
988
|
type: z.literal('sign-in').check(z.describe('OTP purpose; only sign-in is supported.')),
|
|
989
989
|
})
|
|
990
990
|
.check(z.describe('Email OTP send request.'))
|
|
@@ -2385,10 +2385,10 @@ export function require<environment extends Environment = Environment>(
|
|
|
2385
2385
|
|
|
2386
2386
|
// CLI session tokens are prefixed, so they skip the API-key lookup.
|
|
2387
2387
|
const cliToken = CliAuth.isToken(credential.token)
|
|
2388
|
-
const
|
|
2388
|
+
const apiKey = cliToken
|
|
2389
2389
|
? null
|
|
2390
2390
|
: await Timing.sum(c as never, 'auth_key', () => auth.apiKey?.resolve(c, credential.token))
|
|
2391
|
-
if (!
|
|
2391
|
+
if (!apiKey) {
|
|
2392
2392
|
if (unsupportedChain)
|
|
2393
2393
|
return Response.unsupportedChainId(
|
|
2394
2394
|
c,
|
|
@@ -2427,10 +2427,6 @@ export function require<environment extends Environment = Environment>(
|
|
|
2427
2427
|
})
|
|
2428
2428
|
}
|
|
2429
2429
|
|
|
2430
|
-
const scopes = Scope.expandAliases(apiKey_resolved.scopes)
|
|
2431
|
-
const apiKey =
|
|
2432
|
-
scopes === apiKey_resolved.scopes ? apiKey_resolved : { ...apiKey_resolved, scopes }
|
|
2433
|
-
|
|
2434
2430
|
// Sandbox keys are testnet-only. A sandbox key that explicitly targets
|
|
2435
2431
|
// mainnet (`?chainId`) is rejected with a clear message rather than
|
|
2436
2432
|
// steered or downgraded to anonymous, so the caller learns their key does
|
|
@@ -2968,8 +2964,6 @@ function payer(c: hono_Context) {
|
|
|
2968
2964
|
}
|
|
2969
2965
|
|
|
2970
2966
|
function principalFromApiKey(apiKey: ApiKey.ApiKey): Principal {
|
|
2971
|
-
// Explicit record tags win; per-Zone scopes double as tags for keys without them.
|
|
2972
|
-
const zoneTags = apiKey.zoneTags ?? Scope.zoneTags(apiKey.scopes)
|
|
2973
2967
|
return {
|
|
2974
2968
|
apiKey,
|
|
2975
2969
|
environment: apiKey.environment,
|
|
@@ -2977,7 +2971,7 @@ function principalFromApiKey(apiKey: ApiKey.ApiKey): Principal {
|
|
|
2977
2971
|
orgId: apiKey.orgId,
|
|
2978
2972
|
...(apiKey.projectId === undefined ? {} : { projectId: apiKey.projectId }),
|
|
2979
2973
|
type: 'api_key',
|
|
2980
|
-
...(zoneTags === undefined ? {} : { zoneTags }),
|
|
2974
|
+
...(apiKey.zoneTags === undefined ? {} : { zoneTags: apiKey.zoneTags }),
|
|
2981
2975
|
}
|
|
2982
2976
|
}
|
|
2983
2977
|
|
|
@@ -71,12 +71,10 @@ export namespace schema {
|
|
|
71
71
|
/** Annualized share-price growth over one measurement window. */
|
|
72
72
|
export const Apy = z
|
|
73
73
|
.strictObject({
|
|
74
|
-
asOf:
|
|
75
|
-
.
|
|
76
|
-
.
|
|
77
|
-
|
|
78
|
-
z.meta({ examples: ['2026-07-21T09:00:00.000Z'] }),
|
|
79
|
-
),
|
|
74
|
+
asOf: Schema.dateTime().check(
|
|
75
|
+
z.describe('UTC instant the rate was measured to, rounded to a 15-minute bucket.'),
|
|
76
|
+
z.meta({ examples: ['2026-07-21T09:00:00.000Z'] }),
|
|
77
|
+
),
|
|
80
78
|
methodology: z
|
|
81
79
|
.literal(methodology)
|
|
82
80
|
.check(
|