tapimo 0.15.1 → 0.18.1
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
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { Base64, Bytes, Hash, Hex } from 'ox'
|
|
2
|
+
import * as z from 'zod/mini'
|
|
3
|
+
|
|
4
|
+
import * as Id from './Id.js'
|
|
5
|
+
import type * as Store from './Store.js'
|
|
6
|
+
import * as Ttl from './Ttl.js'
|
|
7
|
+
|
|
8
|
+
/** Lifetime of a pending CLI authorization before the CLI must restart sign-in. */
|
|
9
|
+
export const authorizationTtl = Ttl.minutes(10)
|
|
10
|
+
|
|
11
|
+
/** Seconds a CLI waits between token polls. */
|
|
12
|
+
export const pollInterval = 5
|
|
13
|
+
|
|
14
|
+
/** Default lifetime of a CLI session. */
|
|
15
|
+
export const sessionTtl = Ttl.days(30)
|
|
16
|
+
|
|
17
|
+
/** API scopes selected by default when approving a CLI sign-in. */
|
|
18
|
+
export const defaultScopes = ['data:read', 'routes:read', 'routes:write', 'rpc-relay:read']
|
|
19
|
+
|
|
20
|
+
// Consonants only: codes never spell words and never mix up 0/O or 1/I.
|
|
21
|
+
const codeAlphabet = 'BCDFGHJKLMNPQRSTVWXZ'
|
|
22
|
+
const codeLength = 8
|
|
23
|
+
const tokenPrefix = 'tempo:cli:'
|
|
24
|
+
|
|
25
|
+
/** Storage schemas for pending authorizations and minted sessions. */
|
|
26
|
+
export namespace schema {
|
|
27
|
+
/** Client details the CLI reports so the approver can recognize the request. */
|
|
28
|
+
export const Client = z.object({
|
|
29
|
+
device: z.optional(z.string().check(z.minLength(1), z.maxLength(100))),
|
|
30
|
+
name: z.optional(z.string().check(z.minLength(1), z.maxLength(100))),
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
/** A PKCE S256 code challenge: base64url SHA-256, unpadded. */
|
|
34
|
+
export const CodeChallenge = z.string().check(z.regex(/^[A-Za-z0-9_-]{43}$/))
|
|
35
|
+
|
|
36
|
+
/** A PKCE code verifier (RFC 7636 section 4.1). */
|
|
37
|
+
export const CodeVerifier = z.string().check(z.regex(/^[A-Za-z0-9._~-]{43,128}$/))
|
|
38
|
+
|
|
39
|
+
/** A pending, approved, or denied CLI sign-in request. */
|
|
40
|
+
export const Authorization = z.object({
|
|
41
|
+
approvedAt: z.optional(z.string()),
|
|
42
|
+
client: Client,
|
|
43
|
+
code: z.string(),
|
|
44
|
+
codeChallenge: CodeChallenge,
|
|
45
|
+
createdAt: z.string(),
|
|
46
|
+
expiresAt: z.string(),
|
|
47
|
+
ip: z.optional(z.string()),
|
|
48
|
+
scopes: z.optional(z.array(z.string())),
|
|
49
|
+
status: z.enum(['approved', 'denied', 'pending']),
|
|
50
|
+
userId: z.optional(z.string()),
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
/** A minted CLI session, keyed by its token hash. */
|
|
54
|
+
export const Session = z.object({
|
|
55
|
+
client: Client,
|
|
56
|
+
createdAt: z.string(),
|
|
57
|
+
expiresAt: z.string(),
|
|
58
|
+
id: z.string(),
|
|
59
|
+
scopes: z.optional(z.array(z.string())),
|
|
60
|
+
userId: z.string(),
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Client details reported by the CLI. */
|
|
65
|
+
export type Client = z.output<typeof schema.Client>
|
|
66
|
+
|
|
67
|
+
/** A stored CLI sign-in request. */
|
|
68
|
+
export type Authorization = z.output<typeof schema.Authorization>
|
|
69
|
+
|
|
70
|
+
/** A stored CLI session. */
|
|
71
|
+
export type Session = z.output<typeof schema.Session>
|
|
72
|
+
|
|
73
|
+
/** Generates a human-typeable authorization code (8 consonants, stored without a separator). */
|
|
74
|
+
export function generateCode(): string {
|
|
75
|
+
let code = ''
|
|
76
|
+
while (code.length < codeLength)
|
|
77
|
+
for (const byte of Bytes.random(codeLength)) {
|
|
78
|
+
// Rejection sampling keeps every letter equally likely (240 = 12 * 20).
|
|
79
|
+
if (byte >= 240 || code.length === codeLength) continue
|
|
80
|
+
code += codeAlphabet[byte % codeAlphabet.length]
|
|
81
|
+
}
|
|
82
|
+
return code
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Normalizes user- or URL-supplied code input (case, dashes, spaces), or `undefined` when malformed. */
|
|
86
|
+
export function normalizeCode(value: string): string | undefined {
|
|
87
|
+
const code = value.toUpperCase().replace(/[\s-]/g, '')
|
|
88
|
+
if (code.length !== codeLength) return undefined
|
|
89
|
+
for (const character of code) if (!codeAlphabet.includes(character)) return undefined
|
|
90
|
+
return code
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Formats a stored code for display (`BCDF-GHJK`). */
|
|
94
|
+
export function formatCode(code: string): string {
|
|
95
|
+
return `${code.slice(0, 4)}-${code.slice(4)}`
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Derives the PKCE S256 challenge for a code verifier. */
|
|
99
|
+
export function challengeFrom(verifier: string): string {
|
|
100
|
+
return Base64.fromBytes(Hash.sha256(Bytes.fromString(verifier)), { pad: false, url: true })
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Generates a CLI session token (`tempo:cli:` + 64 lowercase hex chars). */
|
|
104
|
+
export function generateToken(): string {
|
|
105
|
+
return `${tokenPrefix}${Hex.random(32).slice(2)}`
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Whether a credential is a CLI session token rather than an API key. */
|
|
109
|
+
export function isToken(value: string): boolean {
|
|
110
|
+
return value.startsWith(tokenPrefix)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Masks CLI session tokens embedded in text so they never reach logs. */
|
|
114
|
+
export function redact(text: string): string {
|
|
115
|
+
return text.replace(/tempo:cli:[a-f0-9]{64}/g, `${tokenPrefix}…`)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Stores a new pending authorization for a CLI that holds the matching code verifier. */
|
|
119
|
+
export async function authorize(store: Store.State, options: authorize.Options) {
|
|
120
|
+
const { client, codeChallenge, ip } = options
|
|
121
|
+
const now = Date.now()
|
|
122
|
+
// A collision in a 20^8 space is vanishingly rare; skip occupied codes instead of overwriting them.
|
|
123
|
+
const code = await (async () => {
|
|
124
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
125
|
+
const candidate = generateCode()
|
|
126
|
+
if ((await store.get(authorizationKey(candidate))) === null) return candidate
|
|
127
|
+
}
|
|
128
|
+
throw new Error('Could not allocate a CLI authorization code')
|
|
129
|
+
})()
|
|
130
|
+
const authorization: Authorization = {
|
|
131
|
+
client,
|
|
132
|
+
code,
|
|
133
|
+
codeChallenge,
|
|
134
|
+
createdAt: new Date(now).toISOString(),
|
|
135
|
+
expiresAt: new Date(now + authorizationTtl).toISOString(),
|
|
136
|
+
...(ip ? { ip } : {}),
|
|
137
|
+
status: 'pending',
|
|
138
|
+
}
|
|
139
|
+
await store.put(authorizationKey(code), JSON.stringify(authorization), { ttl: authorizationTtl })
|
|
140
|
+
return authorization
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export declare namespace authorize {
|
|
144
|
+
/** Options for {@link authorize}. */
|
|
145
|
+
type Options = {
|
|
146
|
+
/** Client details shown to the approver. */
|
|
147
|
+
client: Client
|
|
148
|
+
/** PKCE S256 challenge derived from the CLI's code verifier. */
|
|
149
|
+
codeChallenge: string
|
|
150
|
+
/** Caller IP address shown to the approver, when known. */
|
|
151
|
+
ip?: string | undefined
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Reads an unexpired authorization by its normalized code. */
|
|
156
|
+
export async function getAuthorization(store: Store.State, code: string) {
|
|
157
|
+
const value = await store.get(authorizationKey(code))
|
|
158
|
+
if (value === null) return undefined
|
|
159
|
+
const authorization = schema.Authorization.parse(JSON.parse(value))
|
|
160
|
+
// KV expiry is eventual; the stored deadline is authoritative.
|
|
161
|
+
if (Date.parse(authorization.expiresAt) <= Date.now()) return undefined
|
|
162
|
+
return authorization
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Approves a pending authorization for a user; approving it again as the same user is a no-op. */
|
|
166
|
+
export async function approve(store: Store.State, options: approve.Options) {
|
|
167
|
+
const { code, scopes = defaultScopes, userId } = options
|
|
168
|
+
const authorization = await getAuthorization(store, code)
|
|
169
|
+
if (!authorization) return { status: 'not_found' } as const
|
|
170
|
+
if (authorization.status === 'approved' && authorization.userId === userId)
|
|
171
|
+
return { authorization, status: 'approved' } as const
|
|
172
|
+
if (authorization.status !== 'pending') return { status: 'conflict' } as const
|
|
173
|
+
const approved: Authorization = {
|
|
174
|
+
...authorization,
|
|
175
|
+
approvedAt: new Date().toISOString(),
|
|
176
|
+
scopes: [...scopes],
|
|
177
|
+
status: 'approved',
|
|
178
|
+
userId,
|
|
179
|
+
}
|
|
180
|
+
await write(store, approved)
|
|
181
|
+
return { authorization: approved, status: 'approved' } as const
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export declare namespace approve {
|
|
185
|
+
/** Options for {@link approve}. */
|
|
186
|
+
type Options = {
|
|
187
|
+
/** Normalized authorization code. */
|
|
188
|
+
code: string
|
|
189
|
+
/** API scopes approved for this device. Defaults to {@link defaultScopes}. */
|
|
190
|
+
scopes?: readonly string[] | undefined
|
|
191
|
+
/** User the CLI session will act as. */
|
|
192
|
+
userId: string
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Denies a pending authorization so the waiting CLI stops polling. */
|
|
197
|
+
export async function deny(store: Store.State, code: string) {
|
|
198
|
+
const authorization = await getAuthorization(store, code)
|
|
199
|
+
if (!authorization) return { status: 'not_found' } as const
|
|
200
|
+
if (authorization.status === 'denied') return { status: 'denied' } as const
|
|
201
|
+
if (authorization.status !== 'pending') return { status: 'conflict' } as const
|
|
202
|
+
await write(store, { ...authorization, status: 'denied' })
|
|
203
|
+
return { status: 'denied' } as const
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Exchanges an authorization for a CLI session once approved. Returns `undefined`
|
|
208
|
+
* when the code is unknown, expired, or the verifier does not match, so callers
|
|
209
|
+
* cannot probe for live codes.
|
|
210
|
+
*/
|
|
211
|
+
export async function redeem(store: Store.State, options: redeem.Options) {
|
|
212
|
+
const { code, codeVerifier, ttl = sessionTtl } = options
|
|
213
|
+
const authorization = await getAuthorization(store, code)
|
|
214
|
+
if (!authorization) return undefined
|
|
215
|
+
if (!timingSafeEqual(challengeFrom(codeVerifier), authorization.codeChallenge)) return undefined
|
|
216
|
+
if (authorization.status === 'pending') return { status: 'pending' } as const
|
|
217
|
+
// Settled authorizations are single use; KV lacks compare-and-delete, so a
|
|
218
|
+
// concurrent redeem by the same verifier holder may mint a second session.
|
|
219
|
+
const consumed = await store.delete(authorizationKey(code)).then(
|
|
220
|
+
() => true,
|
|
221
|
+
() => false,
|
|
222
|
+
)
|
|
223
|
+
// KV rejects a second write to a key within a second (a poll right after the decision); the next poll retries.
|
|
224
|
+
if (!consumed) return { status: 'pending' } as const
|
|
225
|
+
if (authorization.status === 'denied' || !authorization.userId)
|
|
226
|
+
return { status: 'denied' } as const
|
|
227
|
+
const { session, token } = await mint(store, {
|
|
228
|
+
client: authorization.client,
|
|
229
|
+
scopes: authorization.scopes ?? [],
|
|
230
|
+
ttl,
|
|
231
|
+
userId: authorization.userId,
|
|
232
|
+
})
|
|
233
|
+
return { session, status: 'approved', token } as const
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export declare namespace redeem {
|
|
237
|
+
/** Options for {@link redeem}. */
|
|
238
|
+
type Options = {
|
|
239
|
+
/** Normalized authorization code. */
|
|
240
|
+
code: string
|
|
241
|
+
/** PKCE code verifier whose S256 challenge was stored at authorization. */
|
|
242
|
+
codeVerifier: string
|
|
243
|
+
/** Session lifetime in milliseconds. Defaults to {@link sessionTtl}. */
|
|
244
|
+
ttl?: number | undefined
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/** Mints a CLI session for a user, returning the plaintext token once. */
|
|
249
|
+
export async function mint(store: Store.State, options: mint.Options) {
|
|
250
|
+
const { client, scopes, ttl = sessionTtl, userId } = options
|
|
251
|
+
const now = Date.now()
|
|
252
|
+
const token = generateToken()
|
|
253
|
+
const session: Session = {
|
|
254
|
+
client,
|
|
255
|
+
createdAt: new Date(now).toISOString(),
|
|
256
|
+
expiresAt: new Date(now + ttl).toISOString(),
|
|
257
|
+
id: Id.generate('cli'),
|
|
258
|
+
...(scopes ? { scopes: [...scopes] } : {}),
|
|
259
|
+
userId,
|
|
260
|
+
}
|
|
261
|
+
await store.put(sessionKey(token), JSON.stringify(session), { ttl })
|
|
262
|
+
return { session, token }
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export declare namespace mint {
|
|
266
|
+
/** Options for {@link mint}. */
|
|
267
|
+
type Options = {
|
|
268
|
+
/** Client details recorded on the session. */
|
|
269
|
+
client: Client
|
|
270
|
+
/** API scopes approved for this device; absent on legacy sessions. */
|
|
271
|
+
scopes?: readonly string[] | undefined
|
|
272
|
+
/** Session lifetime in milliseconds. Defaults to {@link sessionTtl}. */
|
|
273
|
+
ttl?: number | undefined
|
|
274
|
+
/** User the session acts as. */
|
|
275
|
+
userId: string
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** Resolves an unexpired CLI session by its plaintext token. */
|
|
280
|
+
export async function resolve(store: Store.State, token: string) {
|
|
281
|
+
if (!isToken(token)) return undefined
|
|
282
|
+
const value = await store.get(sessionKey(token))
|
|
283
|
+
if (value === null) return undefined
|
|
284
|
+
const session = schema.Session.parse(JSON.parse(value))
|
|
285
|
+
if (Date.parse(session.expiresAt) <= Date.now()) return undefined
|
|
286
|
+
return session
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/** Revokes a CLI session by its plaintext token. */
|
|
290
|
+
export async function revoke(store: Store.State, token: string) {
|
|
291
|
+
if (!isToken(token)) return
|
|
292
|
+
await store.delete(sessionKey(token))
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function authorizationKey(code: string) {
|
|
296
|
+
return `cli:authorization:${code}`
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function sessionKey(token: string) {
|
|
300
|
+
// Tokens are stored by hash so a KV read never exposes a usable credential.
|
|
301
|
+
return `cli:session:${Hash.sha256(Hex.fromString(token)).slice(2)}`
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Rewrites an authorization with its remaining lifetime. Cloudflare KV rejects
|
|
305
|
+
// TTLs under a minute, so storage may outlive `expiresAt`, which reads enforce.
|
|
306
|
+
async function write(store: Store.State, authorization: Authorization) {
|
|
307
|
+
const ttl = Date.parse(authorization.expiresAt) - Date.now()
|
|
308
|
+
await store.put(authorizationKey(authorization.code), JSON.stringify(authorization), {
|
|
309
|
+
ttl: Math.max(ttl, Ttl.minutes(1)),
|
|
310
|
+
})
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function timingSafeEqual(left: string, right: string): boolean {
|
|
314
|
+
if (left.length !== right.length) return false
|
|
315
|
+
let difference = 0
|
|
316
|
+
for (let index = 0; index < left.length; index++)
|
|
317
|
+
difference |= left.charCodeAt(index) ^ right.charCodeAt(index)
|
|
318
|
+
return difference === 0
|
|
319
|
+
}
|
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
ContractFunctionExecutionError,
|
|
4
4
|
ContractFunctionRevertedError,
|
|
5
5
|
ContractFunctionZeroDataError,
|
|
6
|
+
RpcRequestError,
|
|
7
|
+
getContractError,
|
|
6
8
|
parseAbi,
|
|
7
9
|
} from 'viem'
|
|
8
10
|
|
|
@@ -36,6 +38,29 @@ describe('timestamps', () => {
|
|
|
36
38
|
})
|
|
37
39
|
|
|
38
40
|
describe('isUnavailable', () => {
|
|
41
|
+
test.each([
|
|
42
|
+
{ code: -32000, message: 'historical state is not available', unavailable: true },
|
|
43
|
+
{ code: -32001, message: 'historical state is not available', unavailable: true },
|
|
44
|
+
{ code: -32000, message: 'historical state unavailable', unavailable: true },
|
|
45
|
+
{ code: -32000, message: 'state at block 123 has been pruned', unavailable: true },
|
|
46
|
+
{ code: -32000, message: 'missing trie node', unavailable: true },
|
|
47
|
+
{ code: -32001, message: 'no state available for block 123', unavailable: true },
|
|
48
|
+
{ code: -32000, message: 'RPC request timed out', unavailable: false },
|
|
49
|
+
{ code: -32001, message: 'header not found', unavailable: false },
|
|
50
|
+
{ code: -32000, message: 'rate limit exceeded', unavailable: false },
|
|
51
|
+
{ code: 429, message: 'historical state unavailable', unavailable: false },
|
|
52
|
+
])('classifies RPC $code: $message', ({ code, message, unavailable }) => {
|
|
53
|
+
const error = getContractError(
|
|
54
|
+
new RpcRequestError({
|
|
55
|
+
body: { method: 'eth_call', params: [] },
|
|
56
|
+
error: { code, message },
|
|
57
|
+
url: 'https://rpc.example',
|
|
58
|
+
}),
|
|
59
|
+
{ abi, args: [1n], functionName: 'previewRedeem' },
|
|
60
|
+
)
|
|
61
|
+
expect(EarnSharePrices.isUnavailable(error)).toBe(unavailable)
|
|
62
|
+
})
|
|
63
|
+
|
|
39
64
|
test('accepts only contract execution failures that prove a quote is unavailable', () => {
|
|
40
65
|
expect([
|
|
41
66
|
EarnSharePrices.isUnavailable(
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
ContractFunctionExecutionError,
|
|
4
4
|
ContractFunctionRevertedError,
|
|
5
5
|
ContractFunctionZeroDataError,
|
|
6
|
+
RpcRequestError,
|
|
6
7
|
} from 'viem'
|
|
7
8
|
|
|
8
9
|
import type * as Tidx from './Tidx.js'
|
|
@@ -109,14 +110,20 @@ export declare namespace timestamps {
|
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
112
|
|
|
112
|
-
/** Returns whether
|
|
113
|
+
/** Returns whether contract execution or missing historical state makes a quote unavailable. */
|
|
113
114
|
export function isUnavailable(error: unknown): boolean {
|
|
114
115
|
if (!(error instanceof ContractFunctionExecutionError)) return false
|
|
115
116
|
return Boolean(
|
|
116
117
|
error.walk(
|
|
117
118
|
(cause) =>
|
|
118
119
|
cause instanceof ContractFunctionRevertedError ||
|
|
119
|
-
cause instanceof ContractFunctionZeroDataError
|
|
120
|
+
cause instanceof ContractFunctionZeroDataError ||
|
|
121
|
+
// These RPC codes also cover transient failures; require explicit missing-state evidence.
|
|
122
|
+
(cause instanceof RpcRequestError &&
|
|
123
|
+
(cause.code === -32000 || cause.code === -32001) &&
|
|
124
|
+
/\b(?:historical state|state at block)\b.*\b(?:not available|unavailable|pruned)\b|\bmissing trie node\b|\bno state available for block\b/i.test(
|
|
125
|
+
cause.details ?? '',
|
|
126
|
+
)),
|
|
120
127
|
),
|
|
121
128
|
)
|
|
122
129
|
}
|
|
@@ -6,6 +6,7 @@ import * as Runtime from '../../test/runtime.js'
|
|
|
6
6
|
import * as TestViem from '../../test/Viem.js'
|
|
7
7
|
import * as Zones from '../apps/Zones.js'
|
|
8
8
|
import * as EarnVaults from './EarnVaults.js'
|
|
9
|
+
import * as Store from './Store.js'
|
|
9
10
|
import * as Viem from './Viem.js'
|
|
10
11
|
|
|
11
12
|
const vaultAddress = '0xF4ae63687d6753A78e7f551d2EDA1D0d31A5ea3A'
|
|
@@ -227,6 +228,72 @@ describe('resolve', () => {
|
|
|
227
228
|
)
|
|
228
229
|
})
|
|
229
230
|
|
|
231
|
+
describe('resolve with hints', () => {
|
|
232
|
+
test.runIf(Runtime.get().mode === 'testnet')(
|
|
233
|
+
'reuses cached vault facts and replaces them when the engine no longer matches',
|
|
234
|
+
async () => {
|
|
235
|
+
const hints = Store.memory()
|
|
236
|
+
const resolve = () =>
|
|
237
|
+
EarnVaults.resolve({
|
|
238
|
+
getClient: Viem.createGetClient({ defaultChainId: tempoTestnet.id, rpc: TestViem.rpc }),
|
|
239
|
+
hints,
|
|
240
|
+
input: { chainId: tempoTestnet.id, vaultAddress },
|
|
241
|
+
zones: [],
|
|
242
|
+
})
|
|
243
|
+
const facts = (discovery: EarnVaults.Discovery) => ({
|
|
244
|
+
access: discovery.access,
|
|
245
|
+
assetToken: discovery.assetToken,
|
|
246
|
+
capabilities: discovery.capabilities,
|
|
247
|
+
engine: discovery.engine,
|
|
248
|
+
shareToken: discovery.shareToken,
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
// A full read stores one hint; a hinted miss must describe the same vault.
|
|
252
|
+
const full = await resolve()
|
|
253
|
+
const [key] = (await hints.list({ prefix: 'earn-vault:hint:' })).keys.map(({ name }) => name)
|
|
254
|
+
expect(key).toBeDefined()
|
|
255
|
+
if (!key) return
|
|
256
|
+
expect(facts(await resolve())).toStrictEqual(facts(full))
|
|
257
|
+
|
|
258
|
+
// Hints are read and written the way the resolver does, through memoize.
|
|
259
|
+
type StoredHint = { engine: string }
|
|
260
|
+
const cached = () =>
|
|
261
|
+
Store.memoize<StoredHint>(async () => ({ engine: '' }), { key, store: hints, ttl: 60_000 })
|
|
262
|
+
const replace = async (hint: StoredHint) => {
|
|
263
|
+
await hints.delete(key)
|
|
264
|
+
await Store.memoize(async () => hint, { key, store: hints, ttl: 60_000 })
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// A hint naming another engine falls back to a full read and is replaced.
|
|
268
|
+
await replace({ ...(await cached()), engine: `0x${'11'.repeat(20)}` })
|
|
269
|
+
expect(facts(await resolve())).toStrictEqual(facts(full))
|
|
270
|
+
expect((await cached()).engine.toLowerCase()).toBe(full.engine.address)
|
|
271
|
+
|
|
272
|
+
// A corrupt hint reads as a miss.
|
|
273
|
+
await hints.put(key, 'not json')
|
|
274
|
+
expect(facts(await resolve())).toStrictEqual(facts(full))
|
|
275
|
+
},
|
|
276
|
+
60_000,
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
test.runIf(Runtime.get().mode === 'testnet')(
|
|
280
|
+
'writes no hint when the request asks not to store',
|
|
281
|
+
async () => {
|
|
282
|
+
const hints = Store.memory()
|
|
283
|
+
await EarnVaults.resolve({
|
|
284
|
+
getClient: Viem.createGetClient({ defaultChainId: tempoTestnet.id, rpc: TestViem.rpc }),
|
|
285
|
+
hints: Store.withRequest(hints, {
|
|
286
|
+
header: (name) => (name === 'cache-control' ? 'no-store' : undefined),
|
|
287
|
+
}),
|
|
288
|
+
input: { chainId: tempoTestnet.id, vaultAddress },
|
|
289
|
+
zones: [],
|
|
290
|
+
})
|
|
291
|
+
expect((await hints.list({ prefix: 'earn-vault:hint:' })).keys).toStrictEqual([])
|
|
292
|
+
},
|
|
293
|
+
60_000,
|
|
294
|
+
)
|
|
295
|
+
})
|
|
296
|
+
|
|
230
297
|
describe('resolveZoneRoutes', () => {
|
|
231
298
|
test.runIf(Runtime.get().mode === 'testnet')(
|
|
232
299
|
'verifies immutable router bindings and derives private tokens',
|