tapimo 0.15.0 → 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 +896 -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 +33 -33
- 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 +454 -1
- 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 +10 -4
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +24 -4
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- 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 +99 -103
- 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 +5 -5
- 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/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 +1 -19
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +93 -56
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +10 -10
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/rpc.js +45 -11
- package/dist/apps/data/routes/rpc.js.map +1 -1
- 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 +12 -12
- package/dist/apps/data/routes/valuation.d.ts +30 -30
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +1 -1
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +18 -11
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +3 -3
- package/dist/apps/management/App.d.ts +3043 -2198
- 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 +16 -4
- 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 +24 -24
- package/dist/apps/management/routes/invite-links.d.ts +66 -66
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +20 -20
- 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 +76 -76
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +7 -9
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +119 -119
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +16 -3
- package/dist/apps/mcp.js.map +1 -1
- 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/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 +90 -0
- 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 +187 -135
- 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 +418 -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/db/tables/verifiedTokenRequests.d.ts +21 -4
- package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.js +65 -44
- package/dist/db/tables/verifiedTokenRequests.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 +73 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +212 -85
- 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 +4 -1
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +353 -42
- 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/apps/verified-tokens.test.ts +32 -0
- package/src/admin/apps/verified-tokens.ts +30 -4
- 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/lib/verified-tokens.ts +24 -9
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/__root.tsx +1 -1
- 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 +35 -4
- 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 +65 -20
- package/src/admin/ui.generated.ts +99 -104
- 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/App.test.ts +26 -0
- 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 +153 -2
- package/src/apps/data/routes/fee-amm.ts +132 -62
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +34 -2
- package/src/apps/data/routes/rpc.ts +47 -10
- 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.scan.test.ts +29 -0
- package/src/apps/data/routes/webhooks.test.ts +18 -3
- package/src/apps/data/routes/webhooks.ts +27 -13
- 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/management/routes/verified-token-requests.test.ts +16 -2
- package/src/apps/management/routes/verified-token-requests.ts +7 -10
- package/src/apps/mcp.test.ts +108 -25
- package/src/apps/mcp.ts +15 -3
- 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 +507 -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 +133 -0
- 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/db/tables/verifiedTokenRequests.test.ts +39 -20
- package/src/db/tables/verifiedTokenRequests.ts +80 -44
- 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 +383 -8
- package/src/internal/Auth.ts +272 -99
- 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 +1299 -18
- package/src/internal/routes/providers/relay.ts +424 -39
- 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/README.md
CHANGED
|
@@ -135,6 +135,143 @@ token.symbol
|
|
|
135
135
|
|
|
136
136
|
## Development
|
|
137
137
|
|
|
138
|
+
### Local API with local Horcrux
|
|
139
|
+
|
|
140
|
+
Clone the Horcrux backend as a sibling checkout (the checkout must include the
|
|
141
|
+
`horcrux dev` local-signing backend), then prepare this checkout:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
git clone https://github.com/tempoxyz/horcrux.git ../horcrux
|
|
145
|
+
pnpm setup:env
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Set these values in the ignored repo-root `.env`:
|
|
149
|
+
|
|
150
|
+
```dotenv
|
|
151
|
+
HORCRUX_URL=http://127.0.0.1:3040
|
|
152
|
+
HORCRUX_ACCESS_CLIENT_ID=
|
|
153
|
+
HORCRUX_ACCESS_CLIENT_SECRET=
|
|
154
|
+
HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
|
|
155
|
+
ROUTES_SUBSIDY_MAX_AMOUNT=0.10
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Start the opt-in stack with `docker compose --profile subsidies up -d --build`.
|
|
159
|
+
Set `TEMPO_API_HORCRUX_SOURCE` if the sibling checkout is elsewhere. Compose mounts
|
|
160
|
+
the public `seeds/horcrux-wallets.json` fixture read-only and starts `horcrux dev`
|
|
161
|
+
with `HORCRUX_DEV_WALLETS=/etc/horcrux/wallets.json`. To customize the preinitialized
|
|
162
|
+
wallets, copy the manifest, preserve its schema, use stable UUIDs, and set
|
|
163
|
+
`TEMPO_API_HORCRUX_WALLETS` to that host path. Horcrux atomically initializes the
|
|
164
|
+
fixed development team/grant and refuses metadata, key, ID, address, or grant
|
|
165
|
+
conflicts. It preserves wallets, signed history, and replay state on restart; do not
|
|
166
|
+
delete its database volume as a routine reinitialization step.
|
|
167
|
+
|
|
168
|
+
The fixture contains EVM, Tron, and Solana wallets and uses only publicly compromised
|
|
169
|
+
developer keys. Never use these keys for real credentials or send real funds to any
|
|
170
|
+
derived address. The EVM wallet is public Anvil account 0. API route subsidies still
|
|
171
|
+
use only that EVM address through the normal Horcrux viem SDK; local Horcrux does not
|
|
172
|
+
add API-managed Tron or Solana subsidies. Direct Horcrux HTTP clients identify all
|
|
173
|
+
wallet families by the manifest UUID, while the viem integration can look up its EVM
|
|
174
|
+
wallet by address. The dev backend exposes the normal EVM/Tempo, Solana, Tron, and
|
|
175
|
+
hash signing APIs without policies or broadcasting.
|
|
176
|
+
|
|
177
|
+
Horcrux shares the API container's network namespace and listens only on loopback;
|
|
178
|
+
unauthenticated SDK access is accepted only by an API with
|
|
179
|
+
`ENVIRONMENT=development`, a loopback HTTP(S) URL, and both Cloudflare credentials
|
|
180
|
+
absent. After changing `.env` or the manifest,
|
|
181
|
+
run `docker compose restart api horcrux`. This profile starts a signer only: it does
|
|
182
|
+
not start bridges, Tron, Solana, Base/Ethereum forks, or other chains. Point the
|
|
183
|
+
relevant RPC URLs at disposable nodes yourself. Signing locally does not change
|
|
184
|
+
where the API broadcasts. Fund the EVM address with disposable destination tokens
|
|
185
|
+
and fee funds on the tested chain only when exercising settlement.
|
|
186
|
+
`ROUTES_SUBSIDY_MAX_AMOUNT` is a per-subsidy cap, not a total spending budget.
|
|
187
|
+
|
|
188
|
+
Developers not exercising Routes subsidies can leave
|
|
189
|
+
`HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS` empty and run the API without Horcrux
|
|
190
|
+
access. Fee sponsorship keeps its existing setup; there is no private-key fallback
|
|
191
|
+
for Routes subsidies.
|
|
192
|
+
|
|
193
|
+
### Hosted Routes subsidy wallets
|
|
194
|
+
|
|
195
|
+
Set `HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS` to a comma-separated list of EVM
|
|
196
|
+
wallet addresses registered in Horcrux. The first address funds new commitments;
|
|
197
|
+
retain retiring addresses until their existing commitments settle. Address-based
|
|
198
|
+
`horcruxAccount` construction is synchronous and requires no discovery request.
|
|
199
|
+
These wallets need the destination token and transaction fee funds on each
|
|
200
|
+
supported destination chain. Fee sponsorship, MPP settlement, and rewards signing
|
|
201
|
+
remain separate.
|
|
202
|
+
|
|
203
|
+
The first EVM wallet also signs inbound Tempo deposit subsidies through Horcrux
|
|
204
|
+
sign-hash. Fund it with pathUSD and its selected fee token on Tempo. Transfer
|
|
205
|
+
reservations do not count deposit top-ups, so monitor the shared Tempo balance for
|
|
206
|
+
both obligations. Relay fixed-rate deposit addresses use Relay's 1:1 subsidy.
|
|
207
|
+
|
|
208
|
+
The SDK is pinned to `@zygis-tempo/horcrux-viem@0.1.0` on npm, aliased as
|
|
209
|
+
`@horcrux/viem`. The SDK owns the Horcrux signing protocol; the API still owns
|
|
210
|
+
inventory checks, nonce reservations, transaction persistence, and broadcast.
|
|
211
|
+
|
|
212
|
+
For production, `apps/api/wrangler.background.jsonc` owns `HORCRUX_URL` and
|
|
213
|
+
`HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS`. CI and `pnpm -C apps/api deploy` run
|
|
214
|
+
`apps/api/scripts/prepare:production.ts` to copy only those values into the HTTP
|
|
215
|
+
Worker's generated `wrangler.deploy.jsonc`. The shared `wrangler.jsonc` has no
|
|
216
|
+
production Horcrux defaults, so local development and previews cannot inherit them.
|
|
217
|
+
The HTTP deployment keeps queue producers but leaves consumers, cron, and the
|
|
218
|
+
reward signer binding on `api-background`.
|
|
219
|
+
|
|
220
|
+
Keep `HORCRUX_ACCESS_CLIENT_ID` and `HORCRUX_ACCESS_CLIENT_SECRET` as Cloudflare
|
|
221
|
+
secrets on both production Workers before rollout. They are not stored in Wrangler
|
|
222
|
+
configuration or read from GitHub Actions. If the URL or wallet list was previously
|
|
223
|
+
stored as a Cloudflare secret, remove that secret binding before deploying the
|
|
224
|
+
same name as a plain-text Wrangler variable.
|
|
225
|
+
|
|
226
|
+
For PR and main-tracking previews, configure these once in the API repository's
|
|
227
|
+
GitHub Actions settings. CI uploads them to each preview Worker under the same
|
|
228
|
+
names without the `_DEV` suffix; no manual Worker configuration is needed.
|
|
229
|
+
|
|
230
|
+
| GitHub Actions setting | Name | Value |
|
|
231
|
+
| ---------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
232
|
+
| Secret or variable | `HORCRUX_URL_DEV` | Cloudflare-accessible runtime API base URL of the Horcrux instance containing the dev wallet (not its admin URL) |
|
|
233
|
+
| Secret or variable | `HORCRUX_ROUTES_TRANSFER_SUBSIDY_WALLETS_DEV` | Comma-separated EVM wallet addresses, active first, not UUIDs |
|
|
234
|
+
| Secret or variable | `HORCRUX_ROUTES_TRANSFER_SUBSIDY_TRON_WALLETS_DEV` | Comma-separated Tron address and Horcrux UUID pairs, active first |
|
|
235
|
+
| Secret | `HORCRUX_ACCESS_CLIENT_ID_DEV` | Dev Cloudflare Access client ID |
|
|
236
|
+
| Secret | `HORCRUX_ACCESS_CLIENT_SECRET_DEV` | Dev Cloudflare Access client secret |
|
|
237
|
+
|
|
238
|
+
Secrets take precedence when both a secret and variable have the same name.
|
|
239
|
+
The credential pair must be complete or absent. Setting a wallet list requires
|
|
240
|
+
the URL and both credentials. Removing both wallet settings disables transfer
|
|
241
|
+
subsidies on the next preview deployment; drain pending commitments first.
|
|
242
|
+
Absent credentials leave existing Worker credentials unchanged. Use only dev
|
|
243
|
+
wallets and an identity authorized for those wallets. CI's disposable local signer
|
|
244
|
+
needs none of these settings.
|
|
245
|
+
|
|
246
|
+
Grant the workload access to each subsidy wallet and permit its destination-chain
|
|
247
|
+
ERC-20 transfers. `ROUTES_SUBSIDY_MAX_AMOUNT` remains the operational USD limit.
|
|
248
|
+
An empty wallet list disables transfer subsidies; enabled subsidies with incomplete
|
|
249
|
+
Horcrux credentials fail closed. There is no private-key fallback.
|
|
250
|
+
|
|
251
|
+
For Tempo USDT0 to Tron USDT, set `HORCRUX_ROUTES_TRANSFER_SUBSIDY_TRON_WALLETS`
|
|
252
|
+
to comma-separated `TronAddress:HorcruxWalletUUID` pairs, active first. Fund those
|
|
253
|
+
wallets with Tron USDT and TRX. Set `ROUTES_TRON_SUBSIDY_FEE_LIMIT_SUN` to the
|
|
254
|
+
maximum native fee reserved for each TRC-20 transfer. The API persists Tron
|
|
255
|
+
transaction bytes before Horcrux signing and reuses the same signature and
|
|
256
|
+
transaction on retries. Keep retiring wallets configured until their pending
|
|
257
|
+
transfers settle. The production wallet mapping belongs in
|
|
258
|
+
`apps/api/wrangler.background.jsonc`; the deploy script copies it into the HTTP
|
|
259
|
+
Worker when present. An empty mapping leaves Tron transfer subsidies disabled.
|
|
260
|
+
|
|
261
|
+
This replaces `ROUTES_TRANSFER_SUBSIDY_ACCOUNT` and
|
|
262
|
+
`ROUTES_TRANSFER_SUBSIDY_PRIVATE_KEY`. For migration, register the existing wallets
|
|
263
|
+
in Horcrux or drain their unsigned commitments before switching addresses. After
|
|
264
|
+
cutover, remove the unused private-key secrets from Cloudflare and GitHub;
|
|
265
|
+
deployment workflows no longer upload them. Persisted signed transactions still
|
|
266
|
+
replay through the existing nonce and settlement records. Token top-up billing
|
|
267
|
+
is unchanged; destination gas remains paid by Tempo.
|
|
268
|
+
|
|
269
|
+
Run the configuration tests with disposable local infrastructure:
|
|
270
|
+
|
|
271
|
+
```sh
|
|
272
|
+
pnpm test:local apps/api/src/RoutesTransferSubsidies.test.ts --run
|
|
273
|
+
```
|
|
274
|
+
|
|
138
275
|
### Quickprompt
|
|
139
276
|
|
|
140
277
|
Paste into your agent:
|
package/dist/ApiKey.d.ts
CHANGED
|
@@ -46,6 +46,7 @@ export type ApiKey = z.output<typeof schema.ApiKey>;
|
|
|
46
46
|
* never reach logs. Apply to anything that may embed a credential — error
|
|
47
47
|
* stacks, request dumps, and the values of the `tempo-api-key` and
|
|
48
48
|
* `Authorization` headers (whose tokens match the issued-token pattern).
|
|
49
|
+
* CLI session tokens are masked too.
|
|
49
50
|
*/
|
|
50
51
|
export declare function redact(text: string): string;
|
|
51
52
|
/**
|
package/dist/ApiKey.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKey.d.ts","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"ApiKey.d.ts","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAO7B,+CAA+C;AAC/C,yBAAiB,MAAM,CAAC;IACtB,gEAAgE;IACzD,MAAM,UAAU,4DAepB,CAAA;IAEH;;;;;OAKG;IACI,MAAM,MAAM;;;;;;;;;;;;;;;;qBAiCjB,CAAA;CACH;AAED,mDAAmD;AACnD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AAEnD;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3C;AAiCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,GAAE,MAAM,CAAC,aAAa,CAAgB,GAAG,MAAM,CAEvF;AAED,mDAAmD;AACnD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,qFAAqF;AACrF,eAAO,MAAM,YAAY,YAAY,CAAA;AAErC,oFAAoF;AACpF,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C"}
|
package/dist/ApiKey.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { Hash, Hex } from 'ox';
|
|
14
14
|
import * as z from 'zod/mini';
|
|
15
|
+
import * as CliAuth from './internal/CliAuth.js';
|
|
15
16
|
import * as Id from './internal/Id.js';
|
|
16
17
|
import * as IpAllowlist from './internal/IpAllowlist.js';
|
|
17
18
|
import * as RateLimit from './internal/RateLimit.js';
|
|
@@ -57,11 +58,12 @@ export var schema;
|
|
|
57
58
|
* never reach logs. Apply to anything that may embed a credential — error
|
|
58
59
|
* stacks, request dumps, and the values of the `tempo-api-key` and
|
|
59
60
|
* `Authorization` headers (whose tokens match the issued-token pattern).
|
|
61
|
+
* CLI session tokens are masked too.
|
|
60
62
|
*/
|
|
61
63
|
export function redact(text) {
|
|
62
|
-
return text
|
|
64
|
+
return CliAuth.redact(text
|
|
63
65
|
.replace(tokenPattern(), (match) => `${match.split('sk:')[0]}sk:…`)
|
|
64
|
-
.replace(legacyTokenPattern(), 'tempo_…');
|
|
66
|
+
.replace(legacyTokenPattern(), 'tempo_…'));
|
|
65
67
|
}
|
|
66
68
|
/**
|
|
67
69
|
* Token prefix per environment. The prefix encodes the environment so a leaked
|
package/dist/ApiKey.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKey.js","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,WAAW,MAAM,2BAA2B,CAAA;AACxD,OAAO,KAAK,SAAS,MAAM,yBAAyB,CAAA;AAEpD,+CAA+C;AAC/C,MAAM,KAAW,MAAM,CA2DtB;AA3DD,WAAiB,MAAM;IACrB,gEAAgE;IACnD,iBAAU,GAAG,CAAC;SACxB,QAAQ,CACP,CAAC,CAAC,KAAK,CACL,CAAC;SACE,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,EACf,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAC5B,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC,CACxD,CACJ,CACF;SACA,KAAK,CACJ,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAChB,CAAC,CAAC,QAAQ,CAAC,0EAA0E,CAAC,CACvF,CAAA;IAEH;;;;;OAKG;IACU,aAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QAC7B,UAAU,EAAE,CAAC;aACV,QAAQ,CAAC,iBAAU,EAAE,EAAE,CAAC;aACxB,KAAK,CACJ,CAAC,CAAC,QAAQ,CACR,uGAAuG,CACxG,EACD,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAC1D;QACH,aAAa,EAAE,CAAC;aACb,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aACrB,KAAK,CACJ,CAAC,CAAC,QAAQ,CACR,6TAA6T,CAC9T,CACF;QACH,WAAW,EAAE,CAAC;aACX,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC;aACzD,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAClD,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QAC9D,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;QACvF,UAAU,EAAE,CAAC;aACV,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACtD,KAAK,CACJ,CAAC,CAAC,QAAQ,CACR,+LAA+L,CAChM,CACF;QACH,MAAM,EAAE,CAAC;aACN,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACnD,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC;KAC/D,CAAC,CAAA;AACJ,CAAC,EA3DgB,MAAM,KAAN,MAAM,QA2DtB;AAKD
|
|
1
|
+
{"version":3,"file":"ApiKey.js","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"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"}
|
package/dist/ApiKeys.d.ts
CHANGED
|
@@ -28,6 +28,10 @@ export declare namespace schema {
|
|
|
28
28
|
* scope identifiers against its configured catalog.
|
|
29
29
|
*/
|
|
30
30
|
const MintInput: z.ZodMiniObject<{
|
|
31
|
+
createdBy: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
32
|
+
expiresAt: z.ZodMiniOptional<z.ZodMiniISODateTime>;
|
|
33
|
+
orgId: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
34
|
+
scopes: z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>;
|
|
31
35
|
allowedIps: z.ZodMiniDefault<z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>>;
|
|
32
36
|
billingActive: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
|
|
33
37
|
environment: z.ZodMiniDefault<z.ZodMiniEnum<{
|
|
@@ -40,10 +44,6 @@ export declare namespace schema {
|
|
|
40
44
|
limit: z.ZodMiniNumber<number>;
|
|
41
45
|
period: z.ZodMiniUnion<readonly [z.ZodMiniLiteral<"minute">, z.ZodMiniLiteral<"second">]>;
|
|
42
46
|
}, z.core.$strip>>>;
|
|
43
|
-
createdBy: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
44
|
-
expiresAt: z.ZodMiniOptional<z.ZodMiniISODateTime>;
|
|
45
|
-
orgId: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
46
|
-
scopes: z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>;
|
|
47
47
|
}, z.core.$strip>;
|
|
48
48
|
/**
|
|
49
49
|
* A persisted API-key record: the resolved `ApiKey.schema` plus
|
|
@@ -51,6 +51,10 @@ export declare namespace schema {
|
|
|
51
51
|
* and persisted shapes in lockstep.
|
|
52
52
|
*/
|
|
53
53
|
const Record: z.ZodMiniObject<{
|
|
54
|
+
createdAt: z.ZodMiniString<string>;
|
|
55
|
+
createdBy: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
56
|
+
expiresAt: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
57
|
+
tokenLast4: z.ZodMiniString<string>;
|
|
54
58
|
allowedIps: z.ZodMiniDefault<z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>>;
|
|
55
59
|
billingActive: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
|
|
56
60
|
environment: z.ZodMiniDefault<z.ZodMiniEnum<{
|
|
@@ -66,10 +70,6 @@ export declare namespace schema {
|
|
|
66
70
|
period: z.ZodMiniUnion<readonly [z.ZodMiniLiteral<"minute">, z.ZodMiniLiteral<"second">]>;
|
|
67
71
|
}, z.core.$strip>>>;
|
|
68
72
|
scopes: z.ZodMiniReadonly<z.ZodMiniArray<z.ZodMiniString<string>>>;
|
|
69
|
-
createdAt: z.ZodMiniString<string>;
|
|
70
|
-
createdBy: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
71
|
-
expiresAt: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
72
|
-
tokenLast4: z.ZodMiniString<string>;
|
|
73
73
|
}, z.core.$strip>;
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
@@ -104,9 +104,18 @@ export type MintResult = {
|
|
|
104
104
|
*/
|
|
105
105
|
export declare function mint(state: Store.State, input: MintInput, options?: mint.Options): Promise<MintResult>;
|
|
106
106
|
/** Mints an attributed key after atomically reserving an organization-wide live-key slot. */
|
|
107
|
-
export declare function mintBounded(db: Db.Db, state: Store.State, input: MintInput, options?:
|
|
108
|
-
|
|
107
|
+
export declare function mintBounded(db: Db.Db, state: Store.State, input: MintInput, options?: mintBounded.Options): Promise<MintResult>;
|
|
108
|
+
export declare namespace mintBounded {
|
|
109
|
+
/** Options for {@link mintBounded}. */
|
|
110
|
+
type Options = mint.Options & {
|
|
111
|
+
/** Scopes the locked policy-source key must authorize before issuance. */
|
|
112
|
+
sourceScopes?: readonly Scope.Id[] | undefined;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** Durably fences key use before deleting its organization or project. Reconcile failed deletions against committed SQL state before removing the fence. */
|
|
109
116
|
export declare function markOwnerDeleting(state: Store.State, owner: markOwnerDeleting.Owner): Promise<void>;
|
|
117
|
+
/** Removes an aborted deletion's KV fence while holding the SQL owner lock against concurrent deletion. */
|
|
118
|
+
export declare function reconcileOwnerDeletion(db: Db.Db, state: Store.State, owner: markOwnerDeleting.Owner): Promise<void>;
|
|
110
119
|
export declare namespace markOwnerDeleting {
|
|
111
120
|
/** API-key owner being deleted. */
|
|
112
121
|
type Owner = {
|
|
@@ -121,6 +130,8 @@ export declare namespace mint {
|
|
|
121
130
|
type Options = {
|
|
122
131
|
/** Scope catalog accepted while minting the key. */
|
|
123
132
|
scopeCatalog?: Scope.Catalog | undefined;
|
|
133
|
+
/** Existing key whose explicit route-policy overrides are copied to this replacement. */
|
|
134
|
+
policySourceApiKeyId?: string | undefined;
|
|
124
135
|
};
|
|
125
136
|
}
|
|
126
137
|
/**
|
|
@@ -222,7 +233,7 @@ export declare namespace listByOrg {
|
|
|
222
233
|
};
|
|
223
234
|
}
|
|
224
235
|
/**
|
|
225
|
-
* Revokes a key by id,
|
|
236
|
+
* Revokes a key by id with a durable KV marker, then deletes its record and index entries.
|
|
226
237
|
*
|
|
227
238
|
* @param state - The KV state store holding key records.
|
|
228
239
|
* @param id - The key id (`key_…`).
|
|
@@ -345,6 +356,21 @@ export declare namespace backfill {
|
|
|
345
356
|
scanned: number;
|
|
346
357
|
};
|
|
347
358
|
}
|
|
359
|
+
/** Returns whether a key is revoked or its organization or project is being deleted, in one bulk read. */
|
|
360
|
+
export declare function isFenced(state: Store.State, key: isFenced.Key): Promise<boolean>;
|
|
361
|
+
export declare namespace isFenced {
|
|
362
|
+
/** Key identity the fences apply to. */
|
|
363
|
+
type Key = {
|
|
364
|
+
/** Key id (`key_…`). */
|
|
365
|
+
id: string;
|
|
366
|
+
/** Owning organization id. */
|
|
367
|
+
orgId: string;
|
|
368
|
+
/** Owning project id, when project-attributed. */
|
|
369
|
+
projectId?: string | undefined;
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
/** Returns whether a key has a durable KV revocation marker. */
|
|
373
|
+
export declare function isRevoked(state: Store.State, id: string): Promise<boolean>;
|
|
348
374
|
/** Returns whether the organization or attributed project has been deleted. */
|
|
349
375
|
export declare function isOwnerDeleted(state: Store.State, owner: isOwnerDeleted.Owner): Promise<boolean>;
|
|
350
376
|
export declare namespace isOwnerDeleted {
|
package/dist/ApiKeys.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKeys.d.ts","sourceRoot":"","sources":["../src/ApiKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"ApiKeys.d.ts","sourceRoot":"","sources":["../src/ApiKeys.ts"],"names":[],"mappings":"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"}
|
package/dist/ApiKeys.js
CHANGED
|
@@ -16,6 +16,9 @@ import * as ApiKey from './ApiKey.js';
|
|
|
16
16
|
import * as ApiKeyAdmissions from './db/tables/apiKeyAdmissions.js';
|
|
17
17
|
import * as ApiKeyOwnerTombstones from './db/tables/apiKeyOwnerTombstones.js';
|
|
18
18
|
import * as ApiKeyRevocations from './db/tables/apiKeyRevocations.js';
|
|
19
|
+
import * as Organizations from './db/tables/organizations.js';
|
|
20
|
+
import * as RoutesPolicies from './db/tables/routesPolicies.js';
|
|
21
|
+
import * as RoutesSubsidies from './db/tables/routesSubsidies.js';
|
|
19
22
|
import * as Store from './internal/Store.js';
|
|
20
23
|
import * as Scope from './Scope.js';
|
|
21
24
|
const billingSnapshotSchema = z.object({
|
|
@@ -108,15 +111,54 @@ async function mintValidated(state, data, id) {
|
|
|
108
111
|
}
|
|
109
112
|
/** Mints an attributed key after atomically reserving an organization-wide live-key slot. */
|
|
110
113
|
export async function mintBounded(db, state, input, options = {}) {
|
|
111
|
-
if (
|
|
114
|
+
if (options.sourceScopes && !options.policySourceApiKeyId)
|
|
115
|
+
throw new RoutesPolicies.InvalidScopeError();
|
|
116
|
+
if (input.orgId === undefined) {
|
|
117
|
+
if (options.policySourceApiKeyId)
|
|
118
|
+
throw new RoutesPolicies.InvalidScopeError();
|
|
112
119
|
return mint(state, input, options);
|
|
120
|
+
}
|
|
113
121
|
const orgId = input.orgId;
|
|
114
|
-
const
|
|
122
|
+
const validated = validateMintInput(input, options);
|
|
115
123
|
const id = ApiKey.generateId();
|
|
116
124
|
const result = await db.transaction(async (tx) => {
|
|
125
|
+
const data = await (async () => {
|
|
126
|
+
if (!options.policySourceApiKeyId)
|
|
127
|
+
return validated;
|
|
128
|
+
// Match reassignment/revocation lock order and retain the source lock
|
|
129
|
+
// through the policy copy. The admission ledger also fences stale KV.
|
|
130
|
+
await ApiKeyAdmissions.lock(tx, options.policySourceApiKeyId);
|
|
131
|
+
const source = await get(state, options.policySourceApiKeyId, options);
|
|
132
|
+
if (!source ||
|
|
133
|
+
source.orgId !== orgId ||
|
|
134
|
+
source.projectId !== validated.projectId ||
|
|
135
|
+
source.environment !== validated.environment ||
|
|
136
|
+
(options.sourceScopes !== undefined &&
|
|
137
|
+
!options.sourceScopes.every((scope) => source.scopes.includes(scope) || source.scopes.includes(Scope.wildcard))) ||
|
|
138
|
+
!(await ApiKeyAdmissions.matches(tx, source)))
|
|
139
|
+
throw new RoutesPolicies.InvalidScopeError();
|
|
140
|
+
// The locked source, not the caller's earlier snapshot, bounds every copied restriction.
|
|
141
|
+
const { allowedIps: _allowedIps, expiresAt, rateLimits: _rateLimits, ...rest } = validated;
|
|
142
|
+
const expiry = [expiresAt, source.expiresAt]
|
|
143
|
+
.filter((value) => value !== undefined)
|
|
144
|
+
.sort((a, b) => Date.parse(a) - Date.parse(b))[0];
|
|
145
|
+
return {
|
|
146
|
+
...rest,
|
|
147
|
+
allowedIps: source.allowedIps,
|
|
148
|
+
...(expiry === undefined ? {} : { expiresAt: expiry }),
|
|
149
|
+
...(source.rateLimits === undefined ? {} : { rateLimits: source.rateLimits }),
|
|
150
|
+
};
|
|
151
|
+
})();
|
|
152
|
+
// Policy copies share deletion's subsidy-before-owner lock order.
|
|
153
|
+
if (options.policySourceApiKeyId)
|
|
154
|
+
await RoutesSubsidies.lockOrganization(tx, orgId);
|
|
117
155
|
const owner = { orgId, projectId: data.projectId };
|
|
118
156
|
if (!(await ApiKeyOwnerTombstones.lockActive(tx, owner)))
|
|
119
157
|
throw new OwnerDeletedError();
|
|
158
|
+
// A rotated one-off keeps its synthetic owner and policies. Materialize
|
|
159
|
+
// that owner before the replacement loses the original key's self-owner fallback.
|
|
160
|
+
if (options.policySourceApiKeyId === orgId && !(await Organizations.get(tx, orgId)))
|
|
161
|
+
await Organizations.create(tx, { id: orgId, name: orgId });
|
|
120
162
|
await ApiKeyAdmissions.lockOrganization(tx, orgId);
|
|
121
163
|
const legacy = (await ApiKeyAdmissions.isBootstrapped(tx, orgId))
|
|
122
164
|
? { complete: true, records: [] }
|
|
@@ -130,16 +172,65 @@ export async function mintBounded(db, state, input, options = {}) {
|
|
|
130
172
|
orgId,
|
|
131
173
|
projectId: data.projectId ?? null,
|
|
132
174
|
});
|
|
133
|
-
|
|
175
|
+
if (!admitted)
|
|
176
|
+
return null;
|
|
177
|
+
await ApiKeyAdmissions.setPendingScopes(tx, id, data.scopes);
|
|
178
|
+
// Keep the credential unprivileged until its policy copy commits. KV cannot
|
|
179
|
+
// participate in the database transaction, so publishing the requested
|
|
180
|
+
// scopes here could leave a broadened key behind when copy/commit fails.
|
|
181
|
+
const minted = await mintValidated(state, { ...data, scopes: [] }, id);
|
|
182
|
+
if (options.policySourceApiKeyId)
|
|
183
|
+
await RoutesPolicies.copyKeyIn(tx, {
|
|
184
|
+
destination: {
|
|
185
|
+
apiKeyId: minted.record.id,
|
|
186
|
+
environment: minted.record.environment,
|
|
187
|
+
orgId: minted.record.orgId,
|
|
188
|
+
...(minted.record.projectId === undefined ? {} : { projectId: minted.record.projectId }),
|
|
189
|
+
},
|
|
190
|
+
source: {
|
|
191
|
+
apiKeyId: options.policySourceApiKeyId,
|
|
192
|
+
environment: minted.record.environment,
|
|
193
|
+
orgId: minted.record.orgId,
|
|
194
|
+
...(minted.record.projectId === undefined ? {} : { projectId: minted.record.projectId }),
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
return minted;
|
|
134
198
|
});
|
|
135
199
|
if (!result)
|
|
136
200
|
throw new LiveKeyLimitError(maxLiveKeysPerOrganization);
|
|
137
|
-
|
|
201
|
+
try {
|
|
202
|
+
const record = await publishScopes(db, state, result.record.id, options);
|
|
203
|
+
if (!record)
|
|
204
|
+
throw new Error('minted API key missing while publishing scopes');
|
|
205
|
+
return { ...result, record };
|
|
206
|
+
}
|
|
207
|
+
catch (cause) {
|
|
208
|
+
// The caller never received this credential. Fence even ambiguous KV writes before freeing its slot.
|
|
209
|
+
await db.transaction(async (tx) => {
|
|
210
|
+
await ApiKeyAdmissions.lock(tx, result.record.id);
|
|
211
|
+
await ApiKeyRevocations.markPending(tx, result.record.id, orgId);
|
|
212
|
+
await ApiKeyAdmissions.release(tx, result.record.id);
|
|
213
|
+
});
|
|
214
|
+
try {
|
|
215
|
+
await revokeBounded(db, state, result.record.id);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Failed KV cleanup leaves the non-expiring SQL fence intact; preserve the publication error.
|
|
219
|
+
}
|
|
220
|
+
throw cause;
|
|
221
|
+
}
|
|
138
222
|
}
|
|
139
|
-
/** Durably fences key use before deleting its organization or project.
|
|
223
|
+
/** Durably fences key use before deleting its organization or project. Reconcile failed deletions against committed SQL state before removing the fence. */
|
|
140
224
|
export async function markOwnerDeleting(state, owner) {
|
|
141
225
|
await state.put(ownerDeletedKey(owner), 'deleting');
|
|
142
226
|
}
|
|
227
|
+
/** Removes an aborted deletion's KV fence while holding the SQL owner lock against concurrent deletion. */
|
|
228
|
+
export async function reconcileOwnerDeletion(db, state, owner) {
|
|
229
|
+
await db.transaction(async (tx) => {
|
|
230
|
+
if (await ApiKeyOwnerTombstones.lockActive(tx, owner))
|
|
231
|
+
await state.delete(ownerDeletedKey(owner));
|
|
232
|
+
});
|
|
233
|
+
}
|
|
143
234
|
/**
|
|
144
235
|
* Resolves a plaintext API key token to its metadata, or `null`. Expiry is
|
|
145
236
|
* enforced on read — not just via the store's native TTL — so it holds on
|
|
@@ -152,7 +243,7 @@ export async function markOwnerDeleting(state, owner) {
|
|
|
152
243
|
*/
|
|
153
244
|
export async function resolve(state, token, options = {}) {
|
|
154
245
|
const record = await read(state, ApiKey.keyFor(token), Date.now(), options.scopeCatalog ?? Scope.catalog);
|
|
155
|
-
if (!record || (await
|
|
246
|
+
if (!record || (await isFenced(state, record)))
|
|
156
247
|
return null;
|
|
157
248
|
return record;
|
|
158
249
|
}
|
|
@@ -253,13 +344,15 @@ export async function listByOrgPage(state, orgId, options) {
|
|
|
253
344
|
};
|
|
254
345
|
}
|
|
255
346
|
/**
|
|
256
|
-
* Revokes a key by id,
|
|
347
|
+
* Revokes a key by id with a durable KV marker, then deletes its record and index entries.
|
|
257
348
|
*
|
|
258
349
|
* @param state - The KV state store holding key records.
|
|
259
350
|
* @param id - The key id (`key_…`).
|
|
260
351
|
* @returns Whether a matching record was deleted.
|
|
261
352
|
*/
|
|
262
353
|
export async function revoke(state, id) {
|
|
354
|
+
// The ID index can be missing while the token record survives. Keep its fence permanently, even when cleanup cannot find the record.
|
|
355
|
+
await state.put(`${revokedPrefix}${id}`, '1');
|
|
263
356
|
const recordKey = await state.get(idKeyFor(id));
|
|
264
357
|
if (!recordKey)
|
|
265
358
|
return false;
|
|
@@ -369,6 +462,7 @@ export async function update(state, id, input, options = {}) {
|
|
|
369
462
|
}
|
|
370
463
|
/** Updates a key while atomically enforcing owner fences and admission accounting. */
|
|
371
464
|
export async function updateBounded(db, state, id, input, options = {}) {
|
|
465
|
+
let reassigning = false;
|
|
372
466
|
const result = await db.transaction(async (tx) => {
|
|
373
467
|
await ApiKeyAdmissions.lock(tx, id);
|
|
374
468
|
const record = await get(state, id, options);
|
|
@@ -378,8 +472,14 @@ export async function updateBounded(db, state, id, input, options = {}) {
|
|
|
378
472
|
(record.orgId !== options.expectedOwner.orgId ||
|
|
379
473
|
record.projectId !== options.expectedOwner.projectId))
|
|
380
474
|
return { type: 'missing' };
|
|
381
|
-
|
|
475
|
+
const pendingScopes = (await ApiKeyAdmissions.get(tx, id))?.pendingScopes;
|
|
476
|
+
// An explicit scope edit supersedes every earlier deferred publication,
|
|
477
|
+
// including an intentional empty grant. Never revive it from a stale caller.
|
|
478
|
+
if (input.orgId === undefined && input.projectId === undefined) {
|
|
479
|
+
if (input.scopes !== undefined)
|
|
480
|
+
await ApiKeyAdmissions.setPendingScopes(tx, id, null);
|
|
382
481
|
return { type: 'updated', updated: await update(state, id, input, options) };
|
|
482
|
+
}
|
|
383
483
|
const owner = {
|
|
384
484
|
orgId: input.orgId ?? record.orgId,
|
|
385
485
|
projectId: input.projectId ?? record.projectId,
|
|
@@ -387,6 +487,12 @@ export async function updateBounded(db, state, id, input, options = {}) {
|
|
|
387
487
|
const owners = [owner];
|
|
388
488
|
if (record.orgId !== record.id)
|
|
389
489
|
owners.push({ orgId: record.orgId, projectId: record.projectId });
|
|
490
|
+
reassigning = owner.orgId !== record.orgId || owner.projectId !== record.projectId;
|
|
491
|
+
if (reassigning)
|
|
492
|
+
await RoutesPolicies.lockKeyOrganizations(tx, {
|
|
493
|
+
apiKeyId: id,
|
|
494
|
+
orgIds: [record.orgId, owner.orgId],
|
|
495
|
+
});
|
|
390
496
|
if (!(await ApiKeyOwnerTombstones.lockActiveMany(tx, owners)))
|
|
391
497
|
throw new OwnerDeletedError();
|
|
392
498
|
await ApiKeyAdmissions.lockOrganization(tx, owner.orgId);
|
|
@@ -405,14 +511,45 @@ export async function updateBounded(db, state, id, input, options = {}) {
|
|
|
405
511
|
});
|
|
406
512
|
if (!admitted)
|
|
407
513
|
return { type: 'limit' };
|
|
408
|
-
|
|
514
|
+
if (reassigning) {
|
|
515
|
+
// Fail closed across the KV/SQL boundary. The key remains scope-less if
|
|
516
|
+
// clearing, reassignment, or the eventual SQL commit fails.
|
|
517
|
+
await ApiKeyAdmissions.setPendingScopes(tx, id, input.scopes ?? pendingScopes ?? record.scopes);
|
|
518
|
+
const disabled = await update(state, id, { scopes: [] }, options);
|
|
519
|
+
if (!disabled)
|
|
520
|
+
return { type: 'missing' };
|
|
521
|
+
await RoutesPolicies.clearKeyIn(tx, { apiKeyId: id });
|
|
522
|
+
}
|
|
523
|
+
else if (input.scopes !== undefined)
|
|
524
|
+
await ApiKeyAdmissions.setPendingScopes(tx, id, null);
|
|
525
|
+
const transactionalInput = reassigning ? { ...input, scopes: [] } : input;
|
|
526
|
+
const updated = await update(state, id, transactionalInput, options);
|
|
409
527
|
if (!updated)
|
|
410
528
|
await ApiKeyAdmissions.release(tx, id);
|
|
411
529
|
return { type: 'updated', updated };
|
|
412
530
|
});
|
|
413
531
|
if (result.type === 'limit')
|
|
414
532
|
throw new LiveKeyLimitError(maxLiveKeysPerOrganization);
|
|
415
|
-
|
|
533
|
+
if (result.type === 'missing')
|
|
534
|
+
return null;
|
|
535
|
+
if (!result.updated || !reassigning)
|
|
536
|
+
return result.updated;
|
|
537
|
+
return publishScopes(db, state, id, options);
|
|
538
|
+
}
|
|
539
|
+
/** Publishes only the latest committed scope intent, serialized with key edits and revocation. */
|
|
540
|
+
async function publishScopes(db, state, id, options) {
|
|
541
|
+
return db.transaction(async (tx) => {
|
|
542
|
+
await ApiKeyAdmissions.lock(tx, id);
|
|
543
|
+
const record = await get(state, id, options);
|
|
544
|
+
if (!record || !(await ApiKeyAdmissions.matches(tx, record)))
|
|
545
|
+
return null;
|
|
546
|
+
const pending = (await ApiKeyAdmissions.get(tx, id))?.pendingScopes;
|
|
547
|
+
if (pending == null)
|
|
548
|
+
return record;
|
|
549
|
+
const updated = await update(state, id, { scopes: pending }, options);
|
|
550
|
+
await ApiKeyAdmissions.setPendingScopes(tx, id, null);
|
|
551
|
+
return updated;
|
|
552
|
+
});
|
|
416
553
|
}
|
|
417
554
|
/**
|
|
418
555
|
* Re-attributes a key while preserving the existing public API.
|
|
@@ -650,6 +787,22 @@ const orgPrefix = 'apikey_org:';
|
|
|
650
787
|
function orgKeyFor(orgId, id) {
|
|
651
788
|
return `${orgPrefix}${orgId}:${id}`;
|
|
652
789
|
}
|
|
790
|
+
/** Storage-key prefix for durable key revocation markers. */
|
|
791
|
+
const revokedPrefix = 'apikey_revoked:';
|
|
792
|
+
/** Returns whether a key is revoked or its organization or project is being deleted, in one bulk read. */
|
|
793
|
+
export async function isFenced(state, key) {
|
|
794
|
+
const revoked = `${revokedPrefix}${key.id}`;
|
|
795
|
+
const org = ownerDeletedKey({ orgId: key.orgId });
|
|
796
|
+
const project = key.projectId === undefined ? undefined : ownerDeletedKey(key);
|
|
797
|
+
const values = await Store.getMany(state, project ? [revoked, org, project] : [revoked, org]);
|
|
798
|
+
return (values.get(revoked) != null ||
|
|
799
|
+
Boolean(values.get(org)) ||
|
|
800
|
+
(project !== undefined && values.get(project) != null));
|
|
801
|
+
}
|
|
802
|
+
/** Returns whether a key has a durable KV revocation marker. */
|
|
803
|
+
export async function isRevoked(state, id) {
|
|
804
|
+
return (await state.get(`${revokedPrefix}${id}`)) !== null;
|
|
805
|
+
}
|
|
653
806
|
/** Storage-key prefix for durable owner deletion markers. */
|
|
654
807
|
const ownerDeletedPrefix = 'apikey_owner_deleted:';
|
|
655
808
|
/** Returns whether the organization or attributed project has been deleted. */
|