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
|
@@ -5,19 +5,19 @@ import { tempoLocalnet } from 'viem/tempo/chains'
|
|
|
5
5
|
import * as Handler from '../../Handler.js'
|
|
6
6
|
import * as Log from '../../internal/Log.js'
|
|
7
7
|
import * as StateStore from '../../internal/Store.js'
|
|
8
|
-
import * as
|
|
8
|
+
import * as Accounts from './accounts.js'
|
|
9
9
|
|
|
10
10
|
describe('fromStore', () => {
|
|
11
11
|
test('requires atomic state', () => {
|
|
12
12
|
const { swap: _, ...state } = StateStore.memory()
|
|
13
|
-
expect(() =>
|
|
14
|
-
`[Error:
|
|
13
|
+
expect(() => Accounts.fromStore(state)).toThrowErrorMatchingInlineSnapshot(
|
|
14
|
+
`[Error: Configurable account coordination requires an atomic state store.]`,
|
|
15
15
|
)
|
|
16
16
|
})
|
|
17
17
|
|
|
18
18
|
test('preserves concurrent compare-and-set', async () => {
|
|
19
19
|
const state = StateStore.memory()
|
|
20
|
-
const a =
|
|
20
|
+
const a = Accounts.fromStore(state)
|
|
21
21
|
const results = await Promise.all([
|
|
22
22
|
a.compareAndSet('operation', null, 'a'),
|
|
23
23
|
a.compareAndSet('operation', null, 'b'),
|
|
@@ -35,7 +35,7 @@ describe('fromStore', () => {
|
|
|
35
35
|
test('honors absolute expiration', async () => {
|
|
36
36
|
vi.useFakeTimers()
|
|
37
37
|
try {
|
|
38
|
-
const store =
|
|
38
|
+
const store = Accounts.fromStore(StateStore.memory())
|
|
39
39
|
await store.compareAndSet('lease', null, 'a', { expiresAt: Date.now() + 100 })
|
|
40
40
|
await vi.advanceTimersByTimeAsync(101)
|
|
41
41
|
expect(await store.getItem('lease')).toBeNull()
|
|
@@ -52,7 +52,7 @@ describe('relay', () => {
|
|
|
52
52
|
test('serves unknown operations without forwarding them to the node', async () => {
|
|
53
53
|
const handler = Handler.relay({
|
|
54
54
|
getClient: () => client,
|
|
55
|
-
|
|
55
|
+
accounts: { store: StateStore.memory() },
|
|
56
56
|
})
|
|
57
57
|
const response = await handler.fetch(
|
|
58
58
|
new Request('http://relay/', {
|
|
@@ -60,7 +60,7 @@ describe('relay', () => {
|
|
|
60
60
|
body: JSON.stringify({
|
|
61
61
|
id: 42,
|
|
62
62
|
jsonrpc: '2.0',
|
|
63
|
-
method: '
|
|
63
|
+
method: 'account_getOperation',
|
|
64
64
|
params: [Hex.random(32)],
|
|
65
65
|
}),
|
|
66
66
|
}),
|
|
@@ -77,14 +77,14 @@ describe('relay', () => {
|
|
|
77
77
|
test('rejects invalid parameters across the five methods', async () => {
|
|
78
78
|
const handler = Handler.relay({
|
|
79
79
|
getClient: () => client,
|
|
80
|
-
|
|
80
|
+
accounts: { store: StateStore.memory() },
|
|
81
81
|
})
|
|
82
82
|
for (const method of [
|
|
83
|
-
'
|
|
84
|
-
'
|
|
85
|
-
'
|
|
86
|
-
'
|
|
87
|
-
'
|
|
83
|
+
'account_approveRawTransaction',
|
|
84
|
+
'account_approveRawTransactionSync',
|
|
85
|
+
'account_approveKeyAuthorization',
|
|
86
|
+
'account_getConfig',
|
|
87
|
+
'account_getOperation',
|
|
88
88
|
]) {
|
|
89
89
|
const response = await handler.fetch(
|
|
90
90
|
new Request('http://relay/', {
|
|
@@ -100,15 +100,15 @@ describe('relay', () => {
|
|
|
100
100
|
const state = StateStore.memory()
|
|
101
101
|
const hash = Hex.random(32)
|
|
102
102
|
// Operation lookup keys are part of the persisted Viem coordinator format.
|
|
103
|
-
await state.put(`
|
|
104
|
-
const handler = Handler.relay({ getClient: () => client,
|
|
103
|
+
await state.put(`accounts:v1:configurableAccount:operation:${hash}`, 'invalid')
|
|
104
|
+
const handler = Handler.relay({ getClient: () => client, accounts: { store: state } })
|
|
105
105
|
const response = await handler.fetch(
|
|
106
106
|
new Request('http://relay/', {
|
|
107
107
|
method: 'POST',
|
|
108
108
|
body: JSON.stringify({
|
|
109
109
|
id: 1,
|
|
110
110
|
jsonrpc: '2.0',
|
|
111
|
-
method: '
|
|
111
|
+
method: 'account_getOperation',
|
|
112
112
|
params: [hash],
|
|
113
113
|
}),
|
|
114
114
|
}),
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Hex, Rlp } 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'
|
|
@@ -20,7 +20,7 @@ import * as StateStore from '../../internal/Store.js'
|
|
|
20
20
|
|
|
21
21
|
const owners = Accounts.create(inject('tempoTestMnemonic'))
|
|
22
22
|
const chain = defineChain({ ...tempoLocalnet, id: 1337 })
|
|
23
|
-
const client = createClient({ chain, transport: http(inject('
|
|
23
|
+
const client = createClient({ chain, transport: http(inject('tempoAccountsRpcUrl')) })
|
|
24
24
|
const feeToken = '0x20c0000000000000000000000000000000000000'
|
|
25
25
|
|
|
26
26
|
beforeAll(async () => {
|
|
@@ -30,18 +30,18 @@ beforeAll(async () => {
|
|
|
30
30
|
describe('relay', () => {
|
|
31
31
|
test('serves all five TIP-1101 methods and keeps submitted hashes distinct', async () => {
|
|
32
32
|
const relay = fixture()
|
|
33
|
-
const account =
|
|
33
|
+
const account = configurable()
|
|
34
34
|
const config = {
|
|
35
|
-
...
|
|
35
|
+
...AccountConfig.toRpc(account.config!),
|
|
36
36
|
owners: account.config!.owners.map(({ owner, weight }) => ({
|
|
37
37
|
owner: owner.toLowerCase(),
|
|
38
38
|
weight,
|
|
39
39
|
})),
|
|
40
40
|
}
|
|
41
|
-
expect(await relay.rpc('
|
|
42
|
-
expect(await relay.rpc('
|
|
41
|
+
expect(await relay.rpc('account_getConfig', [{ address: account.address }])).toBeNull()
|
|
42
|
+
expect(await relay.rpc('account_getOperation', [Hex.random(32)])).toBeNull()
|
|
43
43
|
const first = await approval(account, [owners[1]])
|
|
44
|
-
const hash = (await relay.rpc('
|
|
44
|
+
const hash = (await relay.rpc('account_approveRawTransaction', [first])) as Hex.Hex
|
|
45
45
|
const pending = await relay.operation(hash)
|
|
46
46
|
expect(pending).toMatchObject({
|
|
47
47
|
hash,
|
|
@@ -52,13 +52,13 @@ describe('relay', () => {
|
|
|
52
52
|
threshold: 2,
|
|
53
53
|
})
|
|
54
54
|
expect(pending.config.version).toBe('0x0')
|
|
55
|
-
expect(await relay.rpc('
|
|
55
|
+
expect(await relay.rpc('account_getConfig', [{ address: account.address }])).toEqual(config)
|
|
56
56
|
expect(await relay.rpc('eth_getTransactionReceipt', [hash])).toBeNull()
|
|
57
57
|
const second = await approval(account, [owners[2]])
|
|
58
|
-
const complete = (await relay.rpc('
|
|
58
|
+
const complete = (await relay.rpc('account_approveRawTransactionSync', [
|
|
59
59
|
second,
|
|
60
60
|
1000,
|
|
61
|
-
])) as
|
|
61
|
+
])) as AccountOperation.TransactionRpc
|
|
62
62
|
expect(complete).toMatchObject({ hash, status: 'success', signatureCount: 2, weight: 2 })
|
|
63
63
|
expect(complete.transactionHash).not.toBe(hash)
|
|
64
64
|
const receipt = await getTransactionReceipt(client, { hash: complete.transactionHash! })
|
|
@@ -67,13 +67,13 @@ describe('relay', () => {
|
|
|
67
67
|
status: 'success',
|
|
68
68
|
feePayer: owners[0].address.toLowerCase(),
|
|
69
69
|
})
|
|
70
|
-
expect(await relay.rpc('
|
|
70
|
+
expect(await relay.rpc('account_approveRawTransaction', [first])).toBe(hash)
|
|
71
71
|
expect(await relay.operation(hash)).toEqual(complete)
|
|
72
72
|
expect(await relay.rpc('eth_getTransactionReceipt', [hash])).toMatchObject({
|
|
73
73
|
transactionHash: complete.transactionHash,
|
|
74
|
-
|
|
74
|
+
operation: { hash },
|
|
75
75
|
})
|
|
76
|
-
expect(await relay.rpc('
|
|
76
|
+
expect(await relay.rpc('account_getConfig', [{ address: account.address }])).toEqual(config)
|
|
77
77
|
|
|
78
78
|
const key = KeyAuthorization.from({
|
|
79
79
|
account: account.address,
|
|
@@ -81,13 +81,13 @@ describe('relay', () => {
|
|
|
81
81
|
chainId: BigInt(chain.id),
|
|
82
82
|
type: 'secp256k1',
|
|
83
83
|
})
|
|
84
|
-
const keyHash =
|
|
84
|
+
const keyHash = AccountConfig.getSignPayload({
|
|
85
85
|
account: account.address,
|
|
86
86
|
config: account.config!,
|
|
87
87
|
payload: KeyAuthorization.getSignPayload(key),
|
|
88
88
|
})
|
|
89
89
|
const signed = KeyAuthorization.from(key, {
|
|
90
|
-
signature: SignatureEnvelope.from<SignatureEnvelope.
|
|
90
|
+
signature: SignatureEnvelope.from<SignatureEnvelope.Configurable>({
|
|
91
91
|
account: account.address,
|
|
92
92
|
config: account.config!,
|
|
93
93
|
signatures: [
|
|
@@ -97,20 +97,20 @@ describe('relay', () => {
|
|
|
97
97
|
],
|
|
98
98
|
}),
|
|
99
99
|
})
|
|
100
|
-
const keyPending = (await relay.rpc('
|
|
100
|
+
const keyPending = (await relay.rpc('account_approveKeyAuthorization', [
|
|
101
101
|
{ keyAuthorization: KeyAuthorization.toRpc(signed) },
|
|
102
|
-
])) as
|
|
102
|
+
])) as AccountOperation.KeyAuthorizationRpc
|
|
103
103
|
expect(keyPending).toMatchObject({ hash: keyHash, status: 'pending', type: 'keyAuthorization' })
|
|
104
104
|
const nonce = await client.request({
|
|
105
105
|
method: 'eth_getTransactionCount',
|
|
106
106
|
params: [account.address, 'latest'],
|
|
107
107
|
})
|
|
108
|
-
const keySuccess = (await relay.rpc('
|
|
108
|
+
const keySuccess = (await relay.rpc('account_approveKeyAuthorization', [
|
|
109
109
|
{ hash: keyHash, signature: await owners[2].sign({ hash: keyHash }) },
|
|
110
|
-
])) as
|
|
110
|
+
])) as AccountOperation.KeyAuthorizationRpc
|
|
111
111
|
expect(keySuccess).toMatchObject({ hash: keyHash, status: 'success', signatureCount: 2 })
|
|
112
112
|
expect(KeyAuthorization.deserialize(keySuccess.keyAuthorization).signature?.type).toBe(
|
|
113
|
-
'
|
|
113
|
+
'configurable',
|
|
114
114
|
)
|
|
115
115
|
expect(await relay.operation(keyHash)).toEqual(keySuccess)
|
|
116
116
|
expect(
|
|
@@ -126,11 +126,11 @@ describe('relay', () => {
|
|
|
126
126
|
const wallet = createClient({
|
|
127
127
|
chain,
|
|
128
128
|
transport: withRelay(
|
|
129
|
-
http(inject('
|
|
129
|
+
http(inject('tempoAccountsRpcUrl')),
|
|
130
130
|
custom({ request: ({ method, params }) => relay.rpc(method, params ?? []) }),
|
|
131
131
|
),
|
|
132
132
|
})
|
|
133
|
-
const account =
|
|
133
|
+
const account = configurable()
|
|
134
134
|
const pending = await sendTransactionSync(wallet, {
|
|
135
135
|
account,
|
|
136
136
|
calls: [{ to: account.address, value: 0n }],
|
|
@@ -150,13 +150,13 @@ describe('relay', () => {
|
|
|
150
150
|
const store = StateStore.memory()
|
|
151
151
|
const a = fixture({ store })
|
|
152
152
|
const b = fixture({ store })
|
|
153
|
-
const account =
|
|
153
|
+
const account = configurable(3)
|
|
154
154
|
const first = await approval(account, [owners[1]])
|
|
155
155
|
const second = await approval(account, [owners[2]])
|
|
156
156
|
const hashes = await Promise.all([
|
|
157
|
-
a.rpc('
|
|
158
|
-
b.rpc('
|
|
159
|
-
a.rpc('
|
|
157
|
+
a.rpc('account_approveRawTransaction', [first]),
|
|
158
|
+
b.rpc('account_approveRawTransaction', [second]),
|
|
159
|
+
a.rpc('account_approveRawTransaction', [first]),
|
|
160
160
|
])
|
|
161
161
|
expect(new Set(hashes).size).toBe(1)
|
|
162
162
|
expect(await a.operation(hashes[0] as Hex.Hex)).toMatchObject({
|
|
@@ -166,11 +166,11 @@ describe('relay', () => {
|
|
|
166
166
|
})
|
|
167
167
|
})
|
|
168
168
|
|
|
169
|
-
test.each(['
|
|
169
|
+
test.each(['account_approveRawTransaction', 'eth_sendRawTransaction'])(
|
|
170
170
|
'selects a weighted quorum and submits asynchronously via %s',
|
|
171
171
|
async (method) => {
|
|
172
172
|
const relay = fixture()
|
|
173
|
-
const account = Account.
|
|
173
|
+
const account = Account.fromConfig({
|
|
174
174
|
owners: [
|
|
175
175
|
{ owner: owners[1].address, weight: 2 },
|
|
176
176
|
{ owner: owners[2].address, weight: 1 },
|
|
@@ -192,29 +192,29 @@ describe('relay', () => {
|
|
|
192
192
|
|
|
193
193
|
test('rejects positive-version configs for an unregistered account', async () => {
|
|
194
194
|
const relay = fixture()
|
|
195
|
-
const initial =
|
|
196
|
-
const account = Account.
|
|
195
|
+
const initial = configurable()
|
|
196
|
+
const account = Account.fromConfig({
|
|
197
197
|
...initial.config!,
|
|
198
198
|
address: initial.address,
|
|
199
199
|
version: 1n,
|
|
200
200
|
})
|
|
201
201
|
await expect(
|
|
202
|
-
relay.rpc('
|
|
202
|
+
relay.rpc('account_approveRawTransaction', [await approval(account, [owners[1]])]),
|
|
203
203
|
).rejects.toMatchObject({ code: -32602 })
|
|
204
204
|
expect((await relay.store.list()).keys).toEqual([])
|
|
205
205
|
})
|
|
206
206
|
|
|
207
207
|
test('validates cached configurations before returning them', async () => {
|
|
208
208
|
const relay = fixture()
|
|
209
|
-
const account =
|
|
210
|
-
await relay.rpc('
|
|
209
|
+
const account = configurable()
|
|
210
|
+
await relay.rpc('account_approveRawTransaction', [await approval(account, [owners[1]])])
|
|
211
211
|
const { keys } = await relay.store.list()
|
|
212
212
|
const key = keys.find(
|
|
213
213
|
({ name }) => name.includes(':config:') && name.endsWith(`0x${'00'.repeat(32)}`),
|
|
214
214
|
)!
|
|
215
215
|
await relay.store.put(key.name, '{}')
|
|
216
216
|
await expect(
|
|
217
|
-
relay.rpc('
|
|
217
|
+
relay.rpc('account_getConfig', [{ address: account.address }]),
|
|
218
218
|
).rejects.toMatchObject({ code: -32603 })
|
|
219
219
|
})
|
|
220
220
|
|
|
@@ -222,15 +222,15 @@ describe('relay', () => {
|
|
|
222
222
|
const store = StateStore.memory()
|
|
223
223
|
const rejected = fixture({ store, validate: async () => false })
|
|
224
224
|
const accepted = fixture({ store })
|
|
225
|
-
const account =
|
|
225
|
+
const account = configurable()
|
|
226
226
|
const first = await approval(account, [owners[1]])
|
|
227
227
|
const second = await approval(account, [owners[2]])
|
|
228
|
-
const hash = (await rejected.rpc('
|
|
229
|
-
await expect(
|
|
230
|
-
rejected.
|
|
231
|
-
)
|
|
228
|
+
const hash = (await rejected.rpc('account_approveRawTransaction', [first])) as Hex.Hex
|
|
229
|
+
await expect(rejected.rpc('account_approveRawTransactionSync', [second])).rejects.toMatchObject(
|
|
230
|
+
{ code: -32602, message: 'Sponsorship rejected.' },
|
|
231
|
+
)
|
|
232
232
|
expect(await accepted.operation(hash)).toMatchObject({ status: 'pending', signatureCount: 2 })
|
|
233
|
-
expect(await accepted.rpc('
|
|
233
|
+
expect(await accepted.rpc('account_approveRawTransactionSync', [second])).toMatchObject({
|
|
234
234
|
status: 'success',
|
|
235
235
|
})
|
|
236
236
|
})
|
|
@@ -238,15 +238,15 @@ describe('relay', () => {
|
|
|
238
238
|
test('rejects malformed requests and non-owner approvals', async () => {
|
|
239
239
|
const relay = fixture()
|
|
240
240
|
for (const [method, params] of [
|
|
241
|
-
['
|
|
242
|
-
['
|
|
243
|
-
['
|
|
244
|
-
['
|
|
245
|
-
['
|
|
241
|
+
['account_approveRawTransaction', ['0x76']],
|
|
242
|
+
['account_approveRawTransactionSync', ['0x']],
|
|
243
|
+
['account_approveKeyAuthorization', [{ hash: Hex.random(32), signature: '0x' }]],
|
|
244
|
+
['account_getConfig', [{ address: 'invalid' }]],
|
|
245
|
+
['account_getOperation', ['0x']],
|
|
246
246
|
] as const)
|
|
247
247
|
await expect(relay.rpc(method, params)).rejects.toMatchObject({ code: -32602 })
|
|
248
248
|
await expect(
|
|
249
|
-
relay.rpc('
|
|
249
|
+
relay.rpc('account_approveRawTransaction', [await approval(configurable(), [owners[4]])]),
|
|
250
250
|
).rejects.toMatchObject({ code: -32602 })
|
|
251
251
|
})
|
|
252
252
|
|
|
@@ -254,7 +254,7 @@ describe('relay', () => {
|
|
|
254
254
|
'retains partial approvals without broadcasting via %s',
|
|
255
255
|
async (method) => {
|
|
256
256
|
const relay = fixture()
|
|
257
|
-
const account =
|
|
257
|
+
const account = configurable()
|
|
258
258
|
const partial = await approval(account, [owners[1]])
|
|
259
259
|
const result = (await relay.rpc(method, [partial])) as
|
|
260
260
|
| Hex.Hex
|
|
@@ -281,31 +281,31 @@ describe('relay', () => {
|
|
|
281
281
|
test('rejects chain mismatches before collecting approvals', async () => {
|
|
282
282
|
const relay = fixture()
|
|
283
283
|
await expect(
|
|
284
|
-
relay.rpc('
|
|
284
|
+
relay.rpc('account_approveRawTransaction', [await approval(configurable(), [owners[1]])], 1),
|
|
285
285
|
).rejects.toMatchObject({ code: -32602, message: 'Conflicting chain ids.' })
|
|
286
286
|
expect((await relay.store.list()).keys).toEqual([])
|
|
287
287
|
})
|
|
288
288
|
|
|
289
289
|
test('reports corrupt stored state as an observable server error', async () => {
|
|
290
290
|
const relay = fixture()
|
|
291
|
-
const hash = (await relay.rpc('
|
|
292
|
-
await approval(
|
|
291
|
+
const hash = (await relay.rpc('account_approveRawTransaction', [
|
|
292
|
+
await approval(configurable(), [owners[1]]),
|
|
293
293
|
])) as Hex.Hex
|
|
294
294
|
const { keys } = await relay.store.list()
|
|
295
295
|
const key = keys.find(({ name }) => name.endsWith(hash.toLowerCase()))!
|
|
296
296
|
await relay.store.put(key.name, 'invalid')
|
|
297
|
-
const response = await relay.response('
|
|
297
|
+
const response = await relay.response('account_getOperation', [hash])
|
|
298
298
|
expect(response).toMatchObject({ error: { code: -32603 } })
|
|
299
299
|
expect(Log.rpcErrors(response)).toMatchObject({ serverErrors: 1 })
|
|
300
300
|
})
|
|
301
301
|
})
|
|
302
302
|
|
|
303
303
|
describe('raw sponsorship', () => {
|
|
304
|
-
test('sponsors a
|
|
305
|
-
const account =
|
|
304
|
+
test('sponsors a configurable account fee-payer handoff its owners approved', async () => {
|
|
305
|
+
const account = configurable(1)
|
|
306
306
|
const relay = fixture()
|
|
307
307
|
const serialized = await handoff({ account, signers: [owners[1]] })
|
|
308
|
-
// Fee-payer serialization writes the `0x00` marker instead of a sender for
|
|
308
|
+
// Fee-payer serialization writes the `0x00` marker instead of a sender for configurable account signatures.
|
|
309
309
|
expect((Rlp.toHex(Hex.slice(serialized, 1)) as readonly Hex.Hex[])[11]).toBe('0x00')
|
|
310
310
|
|
|
311
311
|
const result = (await relay.rpc('eth_signRawTransaction', [serialized])) as `0x76${string}`
|
|
@@ -316,23 +316,23 @@ describe('raw sponsorship', () => {
|
|
|
316
316
|
test.each([
|
|
317
317
|
{
|
|
318
318
|
name: 'approvals below quorum',
|
|
319
|
-
account: () =>
|
|
320
|
-
message: '
|
|
319
|
+
account: () => configurable(2),
|
|
320
|
+
message: 'Configurable account approvals do not reach quorum.',
|
|
321
321
|
signers: () => [owners[1]],
|
|
322
322
|
},
|
|
323
323
|
{
|
|
324
324
|
name: 'a non-owner approval',
|
|
325
|
-
account: () =>
|
|
326
|
-
message: 'Invalid
|
|
325
|
+
account: () => configurable(1),
|
|
326
|
+
message: 'Invalid operation approval: signature is from non-owner <address>.',
|
|
327
327
|
signers: () => [owners[4]],
|
|
328
328
|
},
|
|
329
329
|
{
|
|
330
330
|
name: 'a config that does not derive its account',
|
|
331
|
-
account: () => ({ ...
|
|
332
|
-
message: 'Initial account config does not match the
|
|
331
|
+
account: () => ({ ...configurable(1), address: `0x${'ab'.repeat(20)}` as const }),
|
|
332
|
+
message: 'Initial account config does not match the configurable account.',
|
|
333
333
|
signers: () => [owners[1]],
|
|
334
334
|
},
|
|
335
|
-
])('rejects a
|
|
335
|
+
])('rejects a configurable account handoff with $name', async ({ account, message, signers }) => {
|
|
336
336
|
const relay = fixture()
|
|
337
337
|
|
|
338
338
|
const { error } = await relay.response('eth_signRawTransaction', [
|
|
@@ -342,8 +342,8 @@ describe('raw sponsorship', () => {
|
|
|
342
342
|
expect(error?.message.replace(/0x[0-9a-f]{40}/i, '<address>')).toBe(message)
|
|
343
343
|
})
|
|
344
344
|
|
|
345
|
-
test('sponsors an access key a
|
|
346
|
-
const account =
|
|
345
|
+
test('sponsors an access key a configurable account authorized in the same transaction', async () => {
|
|
346
|
+
const account = configurable(1)
|
|
347
347
|
const relay = fixture()
|
|
348
348
|
|
|
349
349
|
const result = (await relay.rpc('eth_signRawTransaction', [
|
|
@@ -353,8 +353,8 @@ describe('raw sponsorship', () => {
|
|
|
353
353
|
expect(TxEnvelopeTempo.deserialize(result as never).from).toBe(account.address.toLowerCase())
|
|
354
354
|
})
|
|
355
355
|
|
|
356
|
-
test('rejects an access key a non-owner authorized for a
|
|
357
|
-
const account =
|
|
356
|
+
test('rejects an access key a non-owner authorized for a configurable account', async () => {
|
|
357
|
+
const account = configurable(1)
|
|
358
358
|
const relay = fixture()
|
|
359
359
|
|
|
360
360
|
const { error } = await relay.response('eth_signRawTransaction', [
|
|
@@ -362,20 +362,23 @@ describe('raw sponsorship', () => {
|
|
|
362
362
|
])
|
|
363
363
|
|
|
364
364
|
expect(error?.message.replace(/0x[0-9a-f]{40}/i, '<address>')).toMatchInlineSnapshot(
|
|
365
|
-
`"Invalid
|
|
365
|
+
`"Invalid operation approval: signature is from non-owner <address>."`,
|
|
366
366
|
)
|
|
367
367
|
})
|
|
368
368
|
})
|
|
369
369
|
|
|
370
|
-
function
|
|
371
|
-
return Account.
|
|
370
|
+
function configurable(threshold = 2) {
|
|
371
|
+
return Account.fromConfig({
|
|
372
372
|
owners: [owners[1].address, owners[2].address, owners[3].address],
|
|
373
373
|
salt: Hex.random(32),
|
|
374
374
|
threshold,
|
|
375
375
|
})
|
|
376
376
|
}
|
|
377
377
|
|
|
378
|
-
async function approval(
|
|
378
|
+
async function approval(
|
|
379
|
+
account: Account.ConfigurableAccount,
|
|
380
|
+
signers: readonly Accounts.Account[],
|
|
381
|
+
) {
|
|
379
382
|
const transaction = TxEnvelopeTempo.from({
|
|
380
383
|
calls: [{ to: account.address, value: 0n }],
|
|
381
384
|
chainId: chain.id,
|
|
@@ -386,7 +389,7 @@ async function approval(account: Account.MultisigAccount, signers: readonly Acco
|
|
|
386
389
|
maxPriorityFeePerGas: 0n,
|
|
387
390
|
nonce: 0n,
|
|
388
391
|
})
|
|
389
|
-
const hash =
|
|
392
|
+
const hash = AccountConfig.getSignPayload({
|
|
390
393
|
account: account.address,
|
|
391
394
|
config: account.config!,
|
|
392
395
|
payload: TxEnvelopeTempo.getSignPayload(transaction),
|
|
@@ -396,7 +399,7 @@ async function approval(account: Account.MultisigAccount, signers: readonly Acco
|
|
|
396
399
|
.sort((a, b) => a.address.toLowerCase().localeCompare(b.address.toLowerCase()))
|
|
397
400
|
.map(async (owner) => {
|
|
398
401
|
const signature = SignatureEnvelope.from(await owner.sign({ hash }))
|
|
399
|
-
if (signature.type === '
|
|
402
|
+
if (signature.type === 'configurable' || signature.type === 'keychain')
|
|
400
403
|
throw new Error('Expected a primitive owner.')
|
|
401
404
|
return signature
|
|
402
405
|
}),
|
|
@@ -418,7 +421,7 @@ function fixture(options: fixture.Options = {}) {
|
|
|
418
421
|
...(options.validate ? { validate: options.validate } : {}),
|
|
419
422
|
},
|
|
420
423
|
getClient: () => client,
|
|
421
|
-
|
|
424
|
+
accounts: { store },
|
|
422
425
|
})
|
|
423
426
|
async function response(method: string, params: readonly unknown[], chainId: number = chain.id) {
|
|
424
427
|
return (await (
|
|
@@ -438,7 +441,7 @@ function fixture(options: fixture.Options = {}) {
|
|
|
438
441
|
}
|
|
439
442
|
return {
|
|
440
443
|
operation: (hash: Hex.Hex) =>
|
|
441
|
-
rpc('
|
|
444
|
+
rpc('account_getOperation', [hash]) as Promise<AccountOperation.Rpc>,
|
|
442
445
|
response,
|
|
443
446
|
rpc,
|
|
444
447
|
store,
|
|
@@ -479,9 +482,9 @@ async function handoff(options: handoff.Options) {
|
|
|
479
482
|
|
|
480
483
|
declare namespace handoff {
|
|
481
484
|
type Options = {
|
|
482
|
-
/**
|
|
483
|
-
account: Account.
|
|
484
|
-
/** Owners whose approvals the
|
|
485
|
+
/** Configurable account the handoff is sent from. */
|
|
486
|
+
account: Account.ConfigurableAccount
|
|
487
|
+
/** Owners whose approvals the configurable signature carries. */
|
|
485
488
|
signers: readonly Accounts.Account[]
|
|
486
489
|
}
|
|
487
490
|
}
|
|
@@ -535,10 +538,10 @@ async function keyHandoff(options: handoff.Options) {
|
|
|
535
538
|
})
|
|
536
539
|
}
|
|
537
540
|
|
|
538
|
-
/** Returns a
|
|
541
|
+
/** Returns a configurable signature carrying `signers`' approvals of `payload` for `account`. */
|
|
539
542
|
async function approve(options: approve.Options) {
|
|
540
543
|
const { account, payload, signers } = options
|
|
541
|
-
const hash =
|
|
544
|
+
const hash = AccountConfig.getSignPayload({
|
|
542
545
|
account: account.address,
|
|
543
546
|
config: account.config!,
|
|
544
547
|
payload,
|
|
@@ -548,7 +551,7 @@ async function approve(options: approve.Options) {
|
|
|
548
551
|
.sort((a, b) => a.address.toLowerCase().localeCompare(b.address.toLowerCase()))
|
|
549
552
|
.map(async (owner) => {
|
|
550
553
|
const signature = SignatureEnvelope.from(await owner.sign({ hash }))
|
|
551
|
-
if (signature.type === '
|
|
554
|
+
if (signature.type === 'configurable' || signature.type === 'keychain')
|
|
552
555
|
throw new Error('Expected a primitive owner.')
|
|
553
556
|
return signature
|
|
554
557
|
}),
|
|
@@ -562,8 +565,8 @@ async function approve(options: approve.Options) {
|
|
|
562
565
|
|
|
563
566
|
declare namespace approve {
|
|
564
567
|
type Options = {
|
|
565
|
-
/**
|
|
566
|
-
account: Account.
|
|
568
|
+
/** Configurable account whose owners approve `payload`. */
|
|
569
|
+
account: Account.ConfigurableAccount
|
|
567
570
|
/** Sign payload the owners approve. */
|
|
568
571
|
payload: Hex.Hex
|
|
569
572
|
/** Owners whose approvals the signature carries. */
|
|
@@ -2,23 +2,23 @@ import { Store } from 'viem/tempo'
|
|
|
2
2
|
|
|
3
3
|
import type * as core_Store from '../../internal/Store.js'
|
|
4
4
|
|
|
5
|
-
/** Methods the relay answers through stored
|
|
5
|
+
/** Methods the relay answers through stored configurable account coordination when an account store is configured. */
|
|
6
6
|
export const methods = new Set([
|
|
7
7
|
'eth_getTransactionByHash',
|
|
8
8
|
'eth_getTransactionReceipt',
|
|
9
9
|
'eth_sendRawTransaction',
|
|
10
10
|
'eth_sendRawTransactionSync',
|
|
11
|
-
'
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
11
|
+
'account_approveKeyAuthorization',
|
|
12
|
+
'account_approveRawTransaction',
|
|
13
|
+
'account_approveRawTransactionSync',
|
|
14
|
+
'account_getConfig',
|
|
15
|
+
'account_getOperation',
|
|
16
16
|
])
|
|
17
17
|
|
|
18
|
-
/** Adapts Tempo API state to Viem's atomic
|
|
18
|
+
/** Adapts Tempo API state to Viem's atomic configurable account store. */
|
|
19
19
|
export function fromStore(store: core_Store.State): Store.Atomic {
|
|
20
20
|
const swap = store.swap?.bind(store)
|
|
21
|
-
if (!swap) throw new Error('
|
|
21
|
+
if (!swap) throw new Error('Configurable account coordination requires an atomic state store.')
|
|
22
22
|
|
|
23
23
|
return Store.from(
|
|
24
24
|
{
|
|
@@ -31,6 +31,6 @@ export function fromStore(store: core_Store.State): Store.Atomic {
|
|
|
31
31
|
removeItem: (key) => store.delete(key),
|
|
32
32
|
setItem: (key, value) => store.put(key, value),
|
|
33
33
|
},
|
|
34
|
-
{ key: '
|
|
34
|
+
{ key: 'accounts:v1' },
|
|
35
35
|
)
|
|
36
36
|
}
|