tapimo 0.15.1 → 0.18.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 +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +893 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +70 -70
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +529 -76
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +157 -157
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -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 +205 -201
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +357 -357
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +125 -125
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +109 -127
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +83 -54
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +43 -43
- package/dist/apps/data/routes/receipts.d.ts +235 -235
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +77 -77
- package/dist/apps/data/routes/valuation.d.ts +32 -32
- package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +1 -1
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +31 -31
- package/dist/apps/management/App.d.ts +2909 -2064
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +257 -245
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +138 -138
- package/dist/apps/management/routes/invite-links.d.ts +172 -172
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +104 -104
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +125 -125
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
- package/dist/apps/management/routes/webhooks.d.ts +485 -485
- package/dist/apps/mpp/App.d.ts +44 -44
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/chains.d.ts +25 -25
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +171 -81
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +532 -480
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +413 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +57 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +182 -78
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +3 -0
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +352 -41
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +1 -0
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
- package/src/admin/ui.generated.ts +258 -202
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +134 -2
- package/src/apps/data/routes/fee-amm.ts +122 -60
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +2 -2
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.test.ts +12 -3
- package/src/apps/data/routes/webhooks.ts +2 -1
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +498 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +66 -5
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +291 -8
- package/src/internal/Auth.ts +227 -96
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1263 -41
- package/src/internal/routes/providers/relay.ts +423 -38
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
package/src/Client.test-d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { Client } from 'tapimo'
|
|
2
2
|
import { Mpp as PublicMpp } from 'tapimo/mpp'
|
|
3
|
+
import { hc } from 'hono/client'
|
|
3
4
|
import type * as z from 'zod/mini'
|
|
4
5
|
|
|
6
|
+
import type * as Admin from './admin/App.js'
|
|
5
7
|
import * as Activities from './apps/data/routes/activities.js'
|
|
6
8
|
import * as ApiKeys from './apps/management/routes/api-keys.js'
|
|
7
9
|
import * as Balances from './apps/data/routes/balances.js'
|
|
8
10
|
import * as Billing from './apps/management/routes/billing.js'
|
|
9
11
|
import * as Blocks from './apps/data/routes/blocks.js'
|
|
12
|
+
import * as Cli from './apps/management/routes/cli.js'
|
|
10
13
|
import * as Earn from './apps/data/routes/earn.js'
|
|
11
14
|
import * as Exchanges from './apps/data/routes/exchanges.js'
|
|
12
15
|
import * as Faucet from './apps/management/routes/faucet.js'
|
|
@@ -83,6 +86,23 @@ test('returns typed client', async () => {
|
|
|
83
86
|
})
|
|
84
87
|
|
|
85
88
|
describe('narrows responses by status', () => {
|
|
89
|
+
test('PUT /earn/verified-vaults preserves per-vault earnings configuration', async () => {
|
|
90
|
+
const client = hc<ReturnType<typeof Admin.create>>('https://admin.example')
|
|
91
|
+
const res = await client.earn['verified-vaults'].$put({
|
|
92
|
+
json: {
|
|
93
|
+
chainId: 4217,
|
|
94
|
+
earnings: { rewardDistributors: [] },
|
|
95
|
+
vaultAddress: `0x${'11'.repeat(20)}`,
|
|
96
|
+
},
|
|
97
|
+
})
|
|
98
|
+
if (res.status === 200) {
|
|
99
|
+
const json = await res.json()
|
|
100
|
+
expectTypeOf(json.earnings).toEqualTypeOf<{
|
|
101
|
+
rewardDistributors: `0x${string}`[]
|
|
102
|
+
} | null>()
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
|
|
86
106
|
test('POST /v1/earn/rewards/eligibility', async () => {
|
|
87
107
|
const client = Client.create()
|
|
88
108
|
const res = await client.v1.earn.rewards.eligibility.$post({
|
|
@@ -576,6 +596,8 @@ describe('narrows responses by status', () => {
|
|
|
576
596
|
expectTypeOf(json.block?.timestamp).toEqualTypeOf<string | undefined>()
|
|
577
597
|
expectTypeOf(json.chainId).toEqualTypeOf<number>()
|
|
578
598
|
expectTypeOf(json.id).toEqualTypeOf<`0x${string}`>()
|
|
599
|
+
expectTypeOf(json.privateAssetBalance).toEqualTypeOf<string | undefined>()
|
|
600
|
+
expectTypeOf(json.privateAssetToken).toEqualTypeOf<`0x${string}` | undefined>()
|
|
579
601
|
expectTypeOf(json.shareAllowance).toEqualTypeOf<string>()
|
|
580
602
|
expectTypeOf(json.shareBalance).toEqualTypeOf<string>()
|
|
581
603
|
expectTypeOf(json.shareToken).toEqualTypeOf<`0x${string}`>()
|
|
@@ -666,6 +688,11 @@ describe('narrows responses by status', () => {
|
|
|
666
688
|
address: `0x${'bb'.repeat(20)}`,
|
|
667
689
|
vaultId: `0x${'aa'.repeat(20)}`,
|
|
668
690
|
},
|
|
691
|
+
query: {
|
|
692
|
+
end: '2026-09-18T00:00:00.000Z',
|
|
693
|
+
period: 'custom',
|
|
694
|
+
start: '2026-09-11T00:00:00.000Z',
|
|
695
|
+
},
|
|
669
696
|
})
|
|
670
697
|
|
|
671
698
|
expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 404 | 502 | PaidAccessStatus>()
|
|
@@ -677,7 +704,7 @@ describe('narrows responses by status', () => {
|
|
|
677
704
|
expectTypeOf(json.assetToken).toEqualTypeOf<`0x${string}`>()
|
|
678
705
|
expectTypeOf(json.currentValue).toEqualTypeOf<string>()
|
|
679
706
|
expectTypeOf(json.id).toEqualTypeOf<`0x${string}`>()
|
|
680
|
-
expectTypeOf(json.period).toEqualTypeOf<'30d' | 'active' | 'lifetime'>()
|
|
707
|
+
expectTypeOf(json.period).toEqualTypeOf<'7d' | '30d' | 'active' | 'custom' | 'lifetime'>()
|
|
681
708
|
expectTypeOf(json.status).toEqualTypeOf<
|
|
682
709
|
'complete' | 'incomplete_cost_basis' | 'pending_redemption'
|
|
683
710
|
>()
|
|
@@ -701,8 +728,11 @@ describe('narrows responses by status', () => {
|
|
|
701
728
|
totalDeposited: string
|
|
702
729
|
totalWithdrawn: string
|
|
703
730
|
}>()
|
|
704
|
-
if (json.
|
|
705
|
-
expectTypeOf(json.
|
|
731
|
+
if (json.period === '7d' || json.period === '30d' || json.period === 'custom') {
|
|
732
|
+
expectTypeOf(json.start).toEqualTypeOf<string>()
|
|
733
|
+
expectTypeOf(json.end).toEqualTypeOf<string>()
|
|
734
|
+
if (json.status === 'complete') expectTypeOf(json.windowEarnings).toEqualTypeOf<string>()
|
|
735
|
+
}
|
|
706
736
|
void json
|
|
707
737
|
return
|
|
708
738
|
}
|
|
@@ -1694,6 +1724,94 @@ describe('narrows responses by status', () => {
|
|
|
1694
1724
|
}
|
|
1695
1725
|
})
|
|
1696
1726
|
|
|
1727
|
+
test('POST /v1/cli/authorizations', async () => {
|
|
1728
|
+
const client = Client.create()
|
|
1729
|
+
const res = await client.v1.cli.authorizations.$post({
|
|
1730
|
+
json: { codeChallenge: 'E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM' },
|
|
1731
|
+
})
|
|
1732
|
+
|
|
1733
|
+
expectTypeOf(res.status).toEqualTypeOf<200 | 404 | 502 | PublicAccessStatus>()
|
|
1734
|
+
|
|
1735
|
+
switch (res.status) {
|
|
1736
|
+
case 200: {
|
|
1737
|
+
const json = await res.json()
|
|
1738
|
+
expectTypeOf(json).toEqualTypeOf<z.output<typeof Cli.schema.CreateResponse>>()
|
|
1739
|
+
return
|
|
1740
|
+
}
|
|
1741
|
+
case 404: {
|
|
1742
|
+
const json = await res.json()
|
|
1743
|
+
expectTypeOf(json.error.code).toEqualTypeOf<'cli_auth_not_enabled'>()
|
|
1744
|
+
return
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
})
|
|
1748
|
+
|
|
1749
|
+
test('GET /v1/cli/authorizations/:code', async () => {
|
|
1750
|
+
const client = Client.create()
|
|
1751
|
+
const res = await client.v1.cli.authorizations[':code{[A-Za-z -]+}'].$get({
|
|
1752
|
+
param: { code: 'BCDF-GHJK' },
|
|
1753
|
+
})
|
|
1754
|
+
|
|
1755
|
+
expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 401 | 403 | 404 | 502>()
|
|
1756
|
+
|
|
1757
|
+
switch (res.status) {
|
|
1758
|
+
case 200: {
|
|
1759
|
+
const json = await res.json()
|
|
1760
|
+
expectTypeOf(json.status).toEqualTypeOf<'approved' | 'denied' | 'pending'>()
|
|
1761
|
+
return
|
|
1762
|
+
}
|
|
1763
|
+
case 404: {
|
|
1764
|
+
const json = await res.json()
|
|
1765
|
+
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
1766
|
+
'cli_auth_not_enabled' | 'cli_authorization_not_found'
|
|
1767
|
+
>()
|
|
1768
|
+
return
|
|
1769
|
+
}
|
|
1770
|
+
}
|
|
1771
|
+
})
|
|
1772
|
+
|
|
1773
|
+
test('POST /v1/cli/authorizations/:code/approve', async () => {
|
|
1774
|
+
const client = Client.create()
|
|
1775
|
+
const res = await client.v1.cli.authorizations[':code{[A-Za-z -]+}'].approve.$post({
|
|
1776
|
+
json: {},
|
|
1777
|
+
param: { code: 'BCDF-GHJK' },
|
|
1778
|
+
})
|
|
1779
|
+
|
|
1780
|
+
expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 401 | 403 | 404 | 409 | 502>()
|
|
1781
|
+
|
|
1782
|
+
switch (res.status) {
|
|
1783
|
+
case 200: {
|
|
1784
|
+
const json = await res.json()
|
|
1785
|
+
expectTypeOf(json.status).toEqualTypeOf<'approved' | 'denied'>()
|
|
1786
|
+
return
|
|
1787
|
+
}
|
|
1788
|
+
case 409: {
|
|
1789
|
+
const json = await res.json()
|
|
1790
|
+
expectTypeOf(json.error.code).toEqualTypeOf<'cli_authorization_decided'>()
|
|
1791
|
+
return
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
})
|
|
1795
|
+
|
|
1796
|
+
test('POST /v1/cli/authorizations/:code/token', async () => {
|
|
1797
|
+
const client = Client.create()
|
|
1798
|
+
const res = await client.v1.cli.authorizations[':code{[A-Za-z -]+}'].token.$post({
|
|
1799
|
+
json: { codeVerifier: 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk' },
|
|
1800
|
+
param: { code: 'BCDF-GHJK' },
|
|
1801
|
+
})
|
|
1802
|
+
|
|
1803
|
+
expectTypeOf(res.status).toEqualTypeOf<200 | 404 | 502 | PublicAccessStatus>()
|
|
1804
|
+
|
|
1805
|
+
if (res.status === 200) {
|
|
1806
|
+
const json = await res.json()
|
|
1807
|
+
if (json.status === 'approved') expectTypeOf(json.token).toEqualTypeOf<string>()
|
|
1808
|
+
}
|
|
1809
|
+
if (res.status === 400) {
|
|
1810
|
+
const json = await res.json()
|
|
1811
|
+
expectTypeOf(json.error.code).toEqualTypeOf<Access400<'body_invalid' | 'param_invalid'>>()
|
|
1812
|
+
}
|
|
1813
|
+
})
|
|
1814
|
+
|
|
1697
1815
|
test('POST /v1/invitations/:invitationId/accept', async () => {
|
|
1698
1816
|
const client = Client.create()
|
|
1699
1817
|
const res = await client.v1.invitations[':invitationId{inv_[A-Za-z0-9_-]+}'].accept.$post({
|
|
@@ -2499,7 +2617,7 @@ describe('narrows responses by status', () => {
|
|
|
2499
2617
|
},
|
|
2500
2618
|
})
|
|
2501
2619
|
|
|
2502
|
-
expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 502 | PaidAccessStatus>()
|
|
2620
|
+
expectTypeOf(res.status).toEqualTypeOf<200 | 400 | 409 | 502 | PaidAccessStatus>()
|
|
2503
2621
|
|
|
2504
2622
|
switch (res.status) {
|
|
2505
2623
|
case 200: {
|
|
@@ -2543,7 +2661,13 @@ describe('narrows responses by status', () => {
|
|
|
2543
2661
|
}
|
|
2544
2662
|
case 400: {
|
|
2545
2663
|
const json = await res.json()
|
|
2546
|
-
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
2664
|
+
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
2665
|
+
Access400<'query_invalid' | 'route_unavailable'>
|
|
2666
|
+
>()
|
|
2667
|
+
expectTypeOf(json.error.details).toEqualTypeOf<
|
|
2668
|
+
| readonly { message: string; path?: readonly (number | string)[] | undefined }[]
|
|
2669
|
+
| undefined
|
|
2670
|
+
>()
|
|
2547
2671
|
expectTypeOf(json.error.message).toEqualTypeOf<string>()
|
|
2548
2672
|
void json
|
|
2549
2673
|
return
|
|
@@ -2651,6 +2775,14 @@ describe('narrows responses by status', () => {
|
|
|
2651
2775
|
void json
|
|
2652
2776
|
return
|
|
2653
2777
|
}
|
|
2778
|
+
case 400: {
|
|
2779
|
+
const json = await res.json()
|
|
2780
|
+
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
2781
|
+
'amount_too_low' | 'api_key_malformed' | 'body_invalid'
|
|
2782
|
+
>()
|
|
2783
|
+
void json
|
|
2784
|
+
return
|
|
2785
|
+
}
|
|
2654
2786
|
case 403: {
|
|
2655
2787
|
const json = await res.json()
|
|
2656
2788
|
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
@@ -2659,21 +2791,29 @@ describe('narrows responses by status', () => {
|
|
|
2659
2791
|
| 'billing_past_due'
|
|
2660
2792
|
| 'billing_required'
|
|
2661
2793
|
| 'routes_deposit_address_limit_exceeded'
|
|
2794
|
+
| 'routes_not_allowed'
|
|
2795
|
+
| 'routes_subsidy_not_allowed'
|
|
2662
2796
|
| 'routes_subsidy_not_enabled'
|
|
2797
|
+
| 'routes_suspended'
|
|
2663
2798
|
>()
|
|
2664
2799
|
void json
|
|
2665
2800
|
return
|
|
2666
2801
|
}
|
|
2667
2802
|
case 404: {
|
|
2668
2803
|
const json = await res.json()
|
|
2669
|
-
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
2804
|
+
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
2805
|
+
'deposit_address_not_available' | 'quote_not_available'
|
|
2806
|
+
>()
|
|
2670
2807
|
void json
|
|
2671
2808
|
return
|
|
2672
2809
|
}
|
|
2673
2810
|
case 409: {
|
|
2674
2811
|
const json = await res.json()
|
|
2675
2812
|
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
2676
|
-
|
|
2813
|
+
| 'idempotency_conflict'
|
|
2814
|
+
| 'idempotency_in_progress'
|
|
2815
|
+
| 'route_policy_changed'
|
|
2816
|
+
| 'route_policy_identity_conflict'
|
|
2677
2817
|
>()
|
|
2678
2818
|
void json
|
|
2679
2819
|
return
|
|
@@ -2888,7 +3028,6 @@ describe('narrows responses by status', () => {
|
|
|
2888
3028
|
provider: 'stargate',
|
|
2889
3029
|
recipient: `0x${'11'.repeat(20)}`,
|
|
2890
3030
|
sender: `0x${'22'.repeat(20)}`,
|
|
2891
|
-
sourceChain: 'eip155:8453',
|
|
2892
3031
|
sourceToken: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
|
|
2893
3032
|
} as const
|
|
2894
3033
|
// @ts-expect-error `Idempotency-Key` is required for route transfer creation.
|
|
@@ -2897,6 +3036,10 @@ describe('narrows responses by status', () => {
|
|
|
2897
3036
|
header: { 'idempotency-key': 'routes_01k1c5j8q8p0be6j5v9m6d1e4r' },
|
|
2898
3037
|
json,
|
|
2899
3038
|
})
|
|
3039
|
+
void client.v1.routes.transfers.$post({
|
|
3040
|
+
header: { 'idempotency-key': 'routes_explicit_source' },
|
|
3041
|
+
json: { ...json, sourceChain: 'eip155:4217' },
|
|
3042
|
+
})
|
|
2900
3043
|
|
|
2901
3044
|
expectTypeOf(res.status).toEqualTypeOf<
|
|
2902
3045
|
200 | 400 | 403 | 404 | 409 | 501 | 502 | 503 | PublicAccessStatus
|
|
@@ -2905,7 +3048,11 @@ describe('narrows responses by status', () => {
|
|
|
2905
3048
|
switch (res.status) {
|
|
2906
3049
|
case 200: {
|
|
2907
3050
|
const json = await res.json()
|
|
2908
|
-
expectTypeOf(json.action.type).toEqualTypeOf<'evm:calls'>()
|
|
3051
|
+
expectTypeOf(json.action.type).toEqualTypeOf<'evm:calls' | 'tron:calls'>()
|
|
3052
|
+
if (json.action.type === 'tron:calls') {
|
|
3053
|
+
expectTypeOf(json.action.calls[0]!.to).toEqualTypeOf<string>()
|
|
3054
|
+
expectTypeOf(json.action.calls[0]!.value).toEqualTypeOf<string>()
|
|
3055
|
+
}
|
|
2909
3056
|
expectTypeOf(json.id).toEqualTypeOf<string>()
|
|
2910
3057
|
expectTypeOf(json.status).toEqualTypeOf<
|
|
2911
3058
|
z.output<typeof RoutesTransfers.schema.createRoutesTransfer.Response>['status']
|
|
@@ -2922,7 +3069,7 @@ describe('narrows responses by status', () => {
|
|
|
2922
3069
|
case 409: {
|
|
2923
3070
|
const json = await res.json()
|
|
2924
3071
|
expectTypeOf(json.error.code).toEqualTypeOf<
|
|
2925
|
-
'idempotency_conflict' | 'idempotency_in_progress'
|
|
3072
|
+
'idempotency_conflict' | 'idempotency_in_progress' | 'route_policy_changed'
|
|
2926
3073
|
>()
|
|
2927
3074
|
void json
|
|
2928
3075
|
return
|
package/src/Client.test.ts
CHANGED
|
@@ -50,7 +50,7 @@ test('applies `apiKey` to canonical header over base headers', async () => {
|
|
|
50
50
|
"tempo-api-key": "key_option",
|
|
51
51
|
"user-agent": "tempo-api-test",
|
|
52
52
|
},
|
|
53
|
-
"url": "https://api.test/v1/blocks/latest
|
|
53
|
+
"url": "https://api.test/v1/blocks/latest",
|
|
54
54
|
},
|
|
55
55
|
]
|
|
56
56
|
`)
|
|
@@ -74,7 +74,7 @@ test('merges `apiKey` with dynamic base headers', async () => {
|
|
|
74
74
|
"authorization": "Payment proof",
|
|
75
75
|
"tempo-api-key": "key_option",
|
|
76
76
|
},
|
|
77
|
-
"url": "https://api.test/v1/blocks/latest
|
|
77
|
+
"url": "https://api.test/v1/blocks/latest",
|
|
78
78
|
},
|
|
79
79
|
]
|
|
80
80
|
`)
|
|
@@ -95,7 +95,7 @@ test('lets per-request headers override base `apiKey`', async () => {
|
|
|
95
95
|
"headers": {
|
|
96
96
|
"tempo-api-key": "key_request",
|
|
97
97
|
},
|
|
98
|
-
"url": "https://api.test/v1/blocks/latest
|
|
98
|
+
"url": "https://api.test/v1/blocks/latest",
|
|
99
99
|
},
|
|
100
100
|
]
|
|
101
101
|
`)
|
|
@@ -111,7 +111,7 @@ test('omits empty API keys', async () => {
|
|
|
111
111
|
[
|
|
112
112
|
{
|
|
113
113
|
"headers": {},
|
|
114
|
-
"url": "https://api.test/v1/blocks/latest
|
|
114
|
+
"url": "https://api.test/v1/blocks/latest",
|
|
115
115
|
},
|
|
116
116
|
]
|
|
117
117
|
`)
|
package/src/Scope.ts
CHANGED
|
@@ -73,8 +73,7 @@ export const catalog = [
|
|
|
73
73
|
selfServe: false,
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
|
-
description:
|
|
77
|
-
'Legacy reward eligibility write scope retained for existing keys; registration requires wildcard access.',
|
|
76
|
+
description: 'Register wallet and Earn vault reward eligibility associations.',
|
|
78
77
|
scope: 'rewards:write',
|
|
79
78
|
selfServe: false,
|
|
80
79
|
},
|
package/src/admin/App.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { apiKeys } from './apps/api-keys.js'
|
|
|
20
20
|
import { earlyAccess } from './apps/early-access.js'
|
|
21
21
|
import { earnVaults } from './apps/earn-vaults.js'
|
|
22
22
|
import { routes } from './apps/routes.js'
|
|
23
|
+
import { routePolicies } from './apps/route-policies.js'
|
|
23
24
|
import { routesSupport } from './apps/routes-support.js'
|
|
24
25
|
import { organizations } from './apps/organizations.js'
|
|
25
26
|
import { scopes } from './apps/scopes.js'
|
|
@@ -97,7 +98,7 @@ export function create(options: create.Options) {
|
|
|
97
98
|
c.set('metrics', options.metrics)
|
|
98
99
|
c.set('rateLimit', rateLimit)
|
|
99
100
|
c.set('zones', zones)
|
|
100
|
-
c.set('identity', await identify(c.req.raw))
|
|
101
|
+
c.set('identity', await identify(c.req.raw, c))
|
|
101
102
|
try {
|
|
102
103
|
return await next()
|
|
103
104
|
} finally {
|
|
@@ -161,6 +162,8 @@ export function create(options: create.Options) {
|
|
|
161
162
|
'/earn/verified-vaults/*',
|
|
162
163
|
'/routes',
|
|
163
164
|
'/routes/*',
|
|
165
|
+
'/route-policies',
|
|
166
|
+
'/route-policies/*',
|
|
164
167
|
'/organizations',
|
|
165
168
|
'/organizations/*',
|
|
166
169
|
'/scopes',
|
|
@@ -202,6 +205,7 @@ export function create(options: create.Options) {
|
|
|
202
205
|
.route('/earn/verified-vaults', earnVaults())
|
|
203
206
|
.route('/routes/support', routesSupport())
|
|
204
207
|
.route('/routes', routes())
|
|
208
|
+
.route('/route-policies', routePolicies())
|
|
205
209
|
.route('/organizations', organizations())
|
|
206
210
|
.route('/scopes', scopes())
|
|
207
211
|
.route('/subsidies', subsidies())
|
|
@@ -272,11 +276,13 @@ export declare namespace create {
|
|
|
272
276
|
/** Transactional email sender used for organization invitations. */
|
|
273
277
|
email?: Email.Sender | undefined
|
|
274
278
|
/**
|
|
275
|
-
* Extracts
|
|
276
|
-
*
|
|
277
|
-
* verified Access JWT, or a header set by a trusted proxy).
|
|
279
|
+
* Extracts an already-verified admin identity from the request or middleware
|
|
280
|
+
* context, or `null` to deny. Authentication middleware must run before this app.
|
|
278
281
|
*/
|
|
279
|
-
identify: (
|
|
282
|
+
identify: (
|
|
283
|
+
request: Request,
|
|
284
|
+
context: Context<Environment>,
|
|
285
|
+
) => Identity | null | Promise<Identity | null>
|
|
280
286
|
/**
|
|
281
287
|
* KV state store backing API-key records (shared with the main API's
|
|
282
288
|
* `kv` option), provisioned against by the `/api-keys` routes.
|
|
@@ -2,7 +2,10 @@ import * as ApiKey from '../../ApiKey.js'
|
|
|
2
2
|
import * as core_ApiKeys from '../../ApiKeys.js'
|
|
3
3
|
import * as Organizations from '../../db/tables/organizations.js'
|
|
4
4
|
import * as Projects from '../../db/tables/projects.js'
|
|
5
|
+
import * as RoutesDepositAddresses from '../../db/tables/routesDepositAddresses.js'
|
|
6
|
+
import * as RoutesPolicies from '../../db/tables/routesPolicies.js'
|
|
5
7
|
import * as Users from '../../db/tables/users.js'
|
|
8
|
+
import * as Policy from '../../internal/routes/Policy.js'
|
|
6
9
|
|
|
7
10
|
import * as TestAdmin from '../../../test/Admin.js'
|
|
8
11
|
import * as TestApp from '../../../test/App.js'
|
|
@@ -342,8 +345,69 @@ describe('DELETE /api-keys/:id', () => {
|
|
|
342
345
|
})
|
|
343
346
|
|
|
344
347
|
describe('POST /api-keys/:id/rotate', () => {
|
|
348
|
+
test('allows the replacement of an unused one-off key to claim a deposit address', async () => {
|
|
349
|
+
const { client, db, store } = await setup()
|
|
350
|
+
const { record: source } = await core_ApiKeys.mint(store, {
|
|
351
|
+
scopes: ['routes:read', 'routes:write'],
|
|
352
|
+
})
|
|
353
|
+
expect(await Organizations.get(db, source.orgId)).toBeUndefined()
|
|
354
|
+
const response = await client['api-keys'][':id'].rotate.$post({ param: { id: source.id } })
|
|
355
|
+
expect(response.status).toBe(200)
|
|
356
|
+
const replacement = await TestApp.json(response, ApiKeys.schema.rotateApiKey.Response)
|
|
357
|
+
expect(replacement.orgId).toBe(source.orgId)
|
|
358
|
+
// Exercise the same owner/capacity boundary as POST /v1/routes/deposit-addresses.
|
|
359
|
+
await expect(
|
|
360
|
+
RoutesDepositAddresses.claimCreation(db, {
|
|
361
|
+
orgId: replacement.orgId,
|
|
362
|
+
claim: {
|
|
363
|
+
apiKeyId: replacement.id,
|
|
364
|
+
irrevocable: false,
|
|
365
|
+
keyHash: 'ab'.repeat(32),
|
|
366
|
+
requestHash: 'cd'.repeat(32),
|
|
367
|
+
ttlMs: 60_000,
|
|
368
|
+
},
|
|
369
|
+
}),
|
|
370
|
+
).resolves.toMatchObject({ type: 'claimed' })
|
|
371
|
+
})
|
|
372
|
+
|
|
373
|
+
test('security: rotating a one-off key does not discard its route restrictions', async () => {
|
|
374
|
+
const { client, db, store } = await setup()
|
|
375
|
+
const { record: source } = await core_ApiKeys.mint(store, {
|
|
376
|
+
name: 'Restricted one-off',
|
|
377
|
+
scopes: ['routes:read', 'routes:write'],
|
|
378
|
+
})
|
|
379
|
+
// Deposit-address creation materializes the synthetic owner for one-off keys.
|
|
380
|
+
await Organizations.create(db, { id: source.orgId, name: 'One-off route owner' })
|
|
381
|
+
const scope = {
|
|
382
|
+
apiKeyId: source.id,
|
|
383
|
+
environment: source.environment,
|
|
384
|
+
orgId: source.orgId,
|
|
385
|
+
}
|
|
386
|
+
await RoutesPolicies.save(db, { scope, version: 0, policy: { access: [] } })
|
|
387
|
+
|
|
388
|
+
const response = await client['api-keys'][':id'].rotate.$post({ param: { id: source.id } })
|
|
389
|
+
expect(response.status).toBe(200)
|
|
390
|
+
const replacement = await TestApp.json(response, ApiKeys.schema.rotateApiKey.Response)
|
|
391
|
+
expect(replacement.orgId).toBe(source.orgId)
|
|
392
|
+
expect((await core_ApiKeys.resolve(store, replacement.token))?.scopes).toEqual(source.scopes)
|
|
393
|
+
const loaded = await RoutesPolicies.load(db, {
|
|
394
|
+
apiKeyId: replacement.id,
|
|
395
|
+
environment: replacement.environment,
|
|
396
|
+
orgId: replacement.orgId,
|
|
397
|
+
})
|
|
398
|
+
// Reproduce the runtime's default access for an owner with no org policy.
|
|
399
|
+
const effective = Policy.resolve({
|
|
400
|
+
layers: loaded.layers.map((layer) => layer.policy),
|
|
401
|
+
legacy: loaded.legacy,
|
|
402
|
+
...(loaded.layers[0]?.version === 0 ? { defaultAccess: null } : {}),
|
|
403
|
+
})
|
|
404
|
+
expect(effective.access).toMatchInlineSnapshot(`[]`)
|
|
405
|
+
})
|
|
406
|
+
|
|
345
407
|
test('mints a replacement with the source access and attribution', async () => {
|
|
346
|
-
const { client, store } = await setup()
|
|
408
|
+
const { client, db, store } = await setup()
|
|
409
|
+
await Organizations.create(db, { id: 'org_privy', name: 'Privy' })
|
|
410
|
+
await Projects.create(db, { id: 'prj_privy', name: 'Zones', orgId: 'org_privy' })
|
|
347
411
|
const { record: source, token: sourceToken } = await core_ApiKeys.mint(store, {
|
|
348
412
|
allowedIps: ['203.0.113.0/24'],
|
|
349
413
|
billingActive: true,
|
|
@@ -356,6 +420,16 @@ describe('POST /api-keys/:id/rotate', () => {
|
|
|
356
420
|
rateLimits: { '*': { limit: 10_000, period: 'minute' } },
|
|
357
421
|
scopes: ['zone:421700001:read', 'zone:421700001:write'],
|
|
358
422
|
})
|
|
423
|
+
await RoutesPolicies.save(db, {
|
|
424
|
+
policy: { maxAmount: '12' },
|
|
425
|
+
scope: {
|
|
426
|
+
apiKeyId: source.id,
|
|
427
|
+
environment: 'sandbox',
|
|
428
|
+
orgId: source.orgId,
|
|
429
|
+
projectId: source.projectId,
|
|
430
|
+
},
|
|
431
|
+
version: 0,
|
|
432
|
+
})
|
|
359
433
|
|
|
360
434
|
const response = await client['api-keys'][':id'].rotate.$post({
|
|
361
435
|
param: { id: source.id },
|
|
@@ -382,6 +456,14 @@ describe('POST /api-keys/:id/rotate', () => {
|
|
|
382
456
|
id: body.id,
|
|
383
457
|
scopes: source.scopes,
|
|
384
458
|
})
|
|
459
|
+
expect(
|
|
460
|
+
await RoutesPolicies.get(db, {
|
|
461
|
+
apiKeyId: body.id,
|
|
462
|
+
environment: 'sandbox',
|
|
463
|
+
orgId: source.orgId,
|
|
464
|
+
projectId: source.projectId,
|
|
465
|
+
}),
|
|
466
|
+
).toMatchObject({ policy: { maxAmount: '12' }, version: 1 })
|
|
385
467
|
})
|
|
386
468
|
|
|
387
469
|
test('unknown id → 404', async () => {
|
|
@@ -441,7 +523,7 @@ describe('POST /api-keys/:id/rotate', () => {
|
|
|
441
523
|
param: { id: source.id },
|
|
442
524
|
})
|
|
443
525
|
const replacement = await TestApp.json(rotateResponse, ApiKeys.schema.rotateApiKey.Response)
|
|
444
|
-
expect(replacement.orgId).toBe(
|
|
526
|
+
expect(replacement.orgId).toBe(source.orgId)
|
|
445
527
|
|
|
446
528
|
const updateResponse = await client['api-keys'][':id'].$patch({
|
|
447
529
|
json: { orgId: organization.id },
|
|
@@ -599,6 +681,16 @@ describe('PATCH /api-keys/:id', () => {
|
|
|
599
681
|
orgId: organization.id,
|
|
600
682
|
scopes: ['data:read'],
|
|
601
683
|
})
|
|
684
|
+
const originalScope = {
|
|
685
|
+
apiKeyId: record.id,
|
|
686
|
+
environment: record.environment,
|
|
687
|
+
orgId: organization.id,
|
|
688
|
+
} as const
|
|
689
|
+
await RoutesPolicies.save(db, {
|
|
690
|
+
policy: { maxAmount: '5' },
|
|
691
|
+
scope: originalScope,
|
|
692
|
+
version: 0,
|
|
693
|
+
})
|
|
602
694
|
const response = await client['api-keys'][':id'].$patch({
|
|
603
695
|
json: { orgId: other.id },
|
|
604
696
|
param: { id: record.id },
|
|
@@ -607,6 +699,10 @@ describe('PATCH /api-keys/:id', () => {
|
|
|
607
699
|
expect((await core_ApiKeys.resolve(store, token))?.orgId).toBe(other.id)
|
|
608
700
|
expect(await core_ApiKeys.listByOrg(store, organization.id)).toEqual([])
|
|
609
701
|
expect((await core_ApiKeys.listByOrg(store, other.id)).map(({ id }) => id)).toEqual([record.id])
|
|
702
|
+
expect(await RoutesPolicies.get(db, originalScope)).toMatchObject({ policy: {}, version: 2 })
|
|
703
|
+
|
|
704
|
+
await core_ApiKeys.updateBounded(db, store, record.id, { orgId: organization.id })
|
|
705
|
+
expect(await RoutesPolicies.get(db, originalScope)).toMatchObject({ policy: {}, version: 3 })
|
|
610
706
|
})
|
|
611
707
|
|
|
612
708
|
test('enforces the destination organization limit when changing attribution', async () => {
|
|
@@ -6,6 +6,7 @@ import * as ApiKeys from '../../ApiKeys.js'
|
|
|
6
6
|
import * as Db from '../../db/Db.js'
|
|
7
7
|
import * as Organizations from '../../db/tables/organizations.js'
|
|
8
8
|
import * as Projects from '../../db/tables/projects.js'
|
|
9
|
+
import * as RoutesPolicies from '../../db/tables/routesPolicies.js'
|
|
9
10
|
import * as Users from '../../db/tables/users.js'
|
|
10
11
|
import * as OpenApi from '../../internal/OpenApi.js'
|
|
11
12
|
import * as Response from '../../internal/Response.js'
|
|
@@ -377,20 +378,28 @@ export function apiKeys() {
|
|
|
377
378
|
})
|
|
378
379
|
|
|
379
380
|
try {
|
|
380
|
-
const { record, token } = await ApiKeys.mintBounded(
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
381
|
+
const { record, token } = await ApiKeys.mintBounded(
|
|
382
|
+
Db.get(c.get('db')),
|
|
383
|
+
store,
|
|
384
|
+
{
|
|
385
|
+
allowedIps: source.allowedIps,
|
|
386
|
+
createdBy: c.get('identity')!.email,
|
|
387
|
+
environment: source.environment,
|
|
388
|
+
scopes: [...new Set(source.scopes)],
|
|
389
|
+
...(source.billingActive === undefined
|
|
390
|
+
? {}
|
|
391
|
+
: { billingActive: source.billingActive }),
|
|
392
|
+
...(source.expiresAt === undefined ? {} : { expiresAt: source.expiresAt }),
|
|
393
|
+
...(source.name === undefined ? {} : { name: source.name }),
|
|
394
|
+
orgId: source.orgId,
|
|
395
|
+
...(source.projectId === undefined ? {} : { projectId: source.projectId }),
|
|
396
|
+
...(source.rateLimits === undefined ? {} : { rateLimits: source.rateLimits }),
|
|
397
|
+
},
|
|
398
|
+
{ policySourceApiKeyId: source.id },
|
|
399
|
+
)
|
|
392
400
|
return c.json(Response.validated(schema.rotateApiKey.Response, { ...record, token }), 200)
|
|
393
401
|
} catch (cause) {
|
|
402
|
+
if (cause instanceof RoutesPolicies.InvalidScopeError) return ownerNotFound(c)
|
|
394
403
|
if (cause instanceof ApiKeys.OwnerDeletedError) return ownerNotFound(c)
|
|
395
404
|
if (cause instanceof ApiKeys.LiveKeyLimitError) return keyLimitReached(c)
|
|
396
405
|
return Response.upstream(c, cause)
|