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
|
@@ -190,6 +190,18 @@ export namespace schema {
|
|
|
190
190
|
),
|
|
191
191
|
z.meta({ examples: ['relay', 'stargate'] }),
|
|
192
192
|
),
|
|
193
|
+
recipient: z
|
|
194
|
+
.optional(z.string().check(z.minLength(1), z.maxLength(128)))
|
|
195
|
+
.check(
|
|
196
|
+
z.describe('Destination account.'),
|
|
197
|
+
z.meta({ examples: ['0x1111111111111111111111111111111111111111'] }),
|
|
198
|
+
),
|
|
199
|
+
sender: z
|
|
200
|
+
.optional(z.string().check(z.minLength(1), z.maxLength(128)))
|
|
201
|
+
.check(
|
|
202
|
+
z.describe('Source account that will execute the swap.'),
|
|
203
|
+
z.meta({ examples: ['0x2222222222222222222222222222222222222222'] }),
|
|
204
|
+
),
|
|
193
205
|
sourceAmount: PositiveDecimal.check(
|
|
194
206
|
z.describe('Positive source token amount. Base units by default, so 1 USDC is `1000000`.'),
|
|
195
207
|
z.meta({ examples: ['1000000'] }),
|
|
@@ -207,7 +219,7 @@ export namespace schema {
|
|
|
207
219
|
sourceToken: z.string().check(
|
|
208
220
|
z.minLength(1),
|
|
209
221
|
z.describe(
|
|
210
|
-
'Source token symbol,
|
|
222
|
+
'Source token symbol, address, or token key, scoped to `sourceChain`. Non-EVM addresses are case-sensitive. Unknown tokens return HTTP 400 with `route_unavailable`.',
|
|
211
223
|
),
|
|
212
224
|
z.meta({
|
|
213
225
|
examples: ['usdc', 'usdce', '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'],
|
|
@@ -222,6 +234,23 @@ export namespace schema {
|
|
|
222
234
|
/** Machine-readable provider quote quality tier. */
|
|
223
235
|
export const QualityTier = z.enum(['liquid', 'thin', 'unknown', 'unavailable'])
|
|
224
236
|
|
|
237
|
+
/** Public reasons a matching route cannot return a quote. */
|
|
238
|
+
export const UnavailableReason = z
|
|
239
|
+
.enum([
|
|
240
|
+
'identity_required',
|
|
241
|
+
'insufficient_liquidity',
|
|
242
|
+
'invalid_identity',
|
|
243
|
+
'price_unavailable',
|
|
244
|
+
'recipient_not_allowed',
|
|
245
|
+
'recipient_unsupported',
|
|
246
|
+
'route_unavailable',
|
|
247
|
+
'sender_not_allowed',
|
|
248
|
+
])
|
|
249
|
+
.check(
|
|
250
|
+
z.describe('Reason the matching route could not return a quote.'),
|
|
251
|
+
z.meta({ examples: ['sender_not_allowed'] }),
|
|
252
|
+
)
|
|
253
|
+
|
|
225
254
|
/** Quote data returned by a route provider. */
|
|
226
255
|
export const GetQuoteResult = Schema.describe(
|
|
227
256
|
z.object({
|
|
@@ -236,6 +265,7 @@ export namespace schema {
|
|
|
236
265
|
tier: z.optional(QualityTier),
|
|
237
266
|
}),
|
|
238
267
|
),
|
|
268
|
+
reason: z.optional(UnavailableReason),
|
|
239
269
|
sampledAt: z.iso.datetime(),
|
|
240
270
|
status: QuoteStatus,
|
|
241
271
|
}),
|
|
@@ -277,6 +307,9 @@ export namespace schema {
|
|
|
277
307
|
checkEndpoint: z
|
|
278
308
|
.optional(z.string())
|
|
279
309
|
.check(z.describe('Provider status endpoint for the original address request.')),
|
|
310
|
+
fixedRate: z
|
|
311
|
+
.optional(z.literal('1:1'))
|
|
312
|
+
.check(z.describe('Provider-guaranteed normalized delivery rate.')),
|
|
280
313
|
requestId: z
|
|
281
314
|
.string()
|
|
282
315
|
.check(z.minLength(1), z.describe('Provider-issued address request identifier.')),
|
|
@@ -559,9 +592,21 @@ export declare namespace verifyDestinationDelivery {
|
|
|
559
592
|
|
|
560
593
|
/** Destination delivery verification outcome. */
|
|
561
594
|
type ReturnType =
|
|
595
|
+
| {
|
|
596
|
+
/** Recovery information for an operator when automatic delivery cannot continue. */
|
|
597
|
+
statusReason: Transfer.StatusReason
|
|
598
|
+
/** Delivery requires manual recovery. */
|
|
599
|
+
type: 'action-required'
|
|
600
|
+
}
|
|
562
601
|
| { type: 'invalid' }
|
|
563
|
-
| { type: 'pending' }
|
|
564
602
|
| {
|
|
603
|
+
/** Updated private index cursor to persist before the next delivery check. */
|
|
604
|
+
providerState?: Transfer.ProviderState | undefined
|
|
605
|
+
type: 'pending'
|
|
606
|
+
}
|
|
607
|
+
| {
|
|
608
|
+
/** Exact destination amount proven by the provider delivery, when it differs from the quote. */
|
|
609
|
+
destinationAmount?: string | undefined
|
|
565
610
|
/** Verified destination transaction reference. */
|
|
566
611
|
transactionHash: string
|
|
567
612
|
/** The destination delivery matches the stored transfer terms. */
|
|
@@ -625,6 +670,8 @@ export declare namespace createDepositAddress {
|
|
|
625
670
|
refundAddress: string
|
|
626
671
|
/** Whether Tempo guarantees normalized 1:1 delivery. */
|
|
627
672
|
subsidize: boolean
|
|
673
|
+
/** Maximum provider fee sponsorship in decimal USD. */
|
|
674
|
+
subsidyMaxAmount?: string | undefined
|
|
628
675
|
}
|
|
629
676
|
|
|
630
677
|
/** Reusable address and private provider correlation. */
|
|
@@ -964,6 +1011,8 @@ export type ProviderAttempt =
|
|
|
964
1011
|
|
|
965
1012
|
/** Bounded result for one provider attempt. */
|
|
966
1013
|
export type ProviderAttemptResult = {
|
|
1014
|
+
/** Shared cooldown applied after an upstream rate-limit response. */
|
|
1015
|
+
cooldownMs?: number | undefined
|
|
967
1016
|
/** Wall-clock duration of the provider attempt in milliseconds. */
|
|
968
1017
|
durationMs: number
|
|
969
1018
|
/** Failure class, present only when the provider attempt failed. */
|
|
@@ -974,6 +1023,8 @@ export type ProviderAttemptResult = {
|
|
|
974
1023
|
operation: ProviderOperation
|
|
975
1024
|
/** Provider attempt outcome. */
|
|
976
1025
|
outcome: ProviderAttempt['outcome']
|
|
1026
|
+
/** Whether a rate-limit failure originated locally or upstream. */
|
|
1027
|
+
rateLimitSource?: 'local' | 'upstream' | undefined
|
|
977
1028
|
}
|
|
978
1029
|
|
|
979
1030
|
/** A provider failure retained for bounded request diagnostics. */
|
|
@@ -1104,6 +1155,8 @@ export async function getQuotes(options: getQuotes.Options) {
|
|
|
1104
1155
|
destinationChain: options.destinationChain,
|
|
1105
1156
|
destinationToken: options.destinationToken,
|
|
1106
1157
|
provider: options.provider,
|
|
1158
|
+
recipient: options.recipient,
|
|
1159
|
+
sender: options.sender,
|
|
1107
1160
|
sourceAmount: options.sourceAmount,
|
|
1108
1161
|
sourceAmountUnits: options.sourceAmountUnits,
|
|
1109
1162
|
sourceChain: options.sourceChain,
|
|
@@ -1117,7 +1170,7 @@ export async function getQuotes(options: getQuotes.Options) {
|
|
|
1117
1170
|
outcome: result.outcome,
|
|
1118
1171
|
provider,
|
|
1119
1172
|
})
|
|
1120
|
-
return
|
|
1173
|
+
return result
|
|
1121
1174
|
} catch (cause) {
|
|
1122
1175
|
attempts.set(index, {
|
|
1123
1176
|
cause,
|
|
@@ -1142,8 +1195,16 @@ export async function getQuotes(options: getQuotes.Options) {
|
|
|
1142
1195
|
}
|
|
1143
1196
|
}
|
|
1144
1197
|
const quotes = results.flatMap((result) =>
|
|
1145
|
-
result.status === 'fulfilled' && result.value ? [result.value] : [],
|
|
1198
|
+
result.status === 'fulfilled' && result.value.quote ? [result.value.quote] : [],
|
|
1146
1199
|
)
|
|
1200
|
+
for (const result of results)
|
|
1201
|
+
if (result.status === 'fulfilled' && result.value.unavailable) {
|
|
1202
|
+
try {
|
|
1203
|
+
options.onUnavailable?.(result.value.unavailable)
|
|
1204
|
+
} catch {
|
|
1205
|
+
// Observer failures must not discard completed quotes or skip outcome reporting.
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1147
1208
|
const failures = results.flatMap((result, index) =>
|
|
1148
1209
|
result.status === 'rejected'
|
|
1149
1210
|
? [
|
|
@@ -1249,6 +1310,8 @@ export declare namespace getQuotes {
|
|
|
1249
1310
|
onAttempt?: ((attempt: ProviderAttempt) => void) | undefined
|
|
1250
1311
|
/** Receives the bounded request-level quote result. */
|
|
1251
1312
|
onResult?: ((result: QuoteRequestResult) => void) | undefined
|
|
1313
|
+
/** Receives a provider-neutral reason for each unavailable quote. */
|
|
1314
|
+
onUnavailable?: ((reason: z.output<typeof schema.UnavailableReason>) => void) | undefined
|
|
1252
1315
|
/** Stable non-secret tenant identity for provider-local fairness. */
|
|
1253
1316
|
quotaKey?: string | undefined
|
|
1254
1317
|
/** Per-provider quote timeout in milliseconds. */
|
|
@@ -1262,8 +1325,7 @@ const defaultPrepareTimeoutMs = 10_000
|
|
|
1262
1325
|
const defaultQuoteTtlMs = 60_000
|
|
1263
1326
|
|
|
1264
1327
|
/**
|
|
1265
|
-
* Provisions
|
|
1266
|
-
* capability-enabled provider. Returns `undefined` when no route is enabled.
|
|
1328
|
+
* Provisions a reusable address through the first eligible provider. Returns `undefined` without an eligible route; throws `ProviderUnavailableError` when the current quote is unavailable.
|
|
1267
1329
|
*/
|
|
1268
1330
|
export async function createDepositAddress(
|
|
1269
1331
|
options: createDepositAddress.Options,
|
|
@@ -1285,6 +1347,7 @@ export async function createDepositAddress(
|
|
|
1285
1347
|
recipient: selected.recipient,
|
|
1286
1348
|
refundAddress: selected.refundAddress,
|
|
1287
1349
|
subsidize: options.subsidize,
|
|
1350
|
+
subsidyMaxAmount: options.subsidyMaxAmount,
|
|
1288
1351
|
},
|
|
1289
1352
|
signal,
|
|
1290
1353
|
),
|
|
@@ -1332,7 +1395,7 @@ export async function createDepositAddress(
|
|
|
1332
1395
|
} catch {
|
|
1333
1396
|
// Observability hooks never alter provisioning behavior.
|
|
1334
1397
|
}
|
|
1335
|
-
if (cause instanceof ProviderUnavailableError)
|
|
1398
|
+
if (cause instanceof ProviderUnavailableError) throw cause
|
|
1336
1399
|
throw new ProviderQuoteError([{ cause, operation, provider: selected.provider }], [attempt])
|
|
1337
1400
|
}
|
|
1338
1401
|
}
|
|
@@ -1393,6 +1456,8 @@ export declare namespace createDepositAddress {
|
|
|
1393
1456
|
refundAddress: string
|
|
1394
1457
|
/** Whether Tempo guarantees normalized 1:1 delivery. */
|
|
1395
1458
|
subsidize: boolean
|
|
1459
|
+
/** Maximum provider fee sponsorship in decimal USD. */
|
|
1460
|
+
subsidyMaxAmount?: string | undefined
|
|
1396
1461
|
}
|
|
1397
1462
|
|
|
1398
1463
|
/** Selected provider route and its reusable address. */
|
|
@@ -1464,20 +1529,27 @@ export async function prepareTransfer(
|
|
|
1464
1529
|
basisPointScale
|
|
1465
1530
|
if (BigInt(result.destinationAmountMin) < minimumAllowed) throw new ProviderPayloadError()
|
|
1466
1531
|
}
|
|
1467
|
-
if (result.action.type === 'evm:calls')
|
|
1532
|
+
if (result.action.type === 'evm:calls' || result.action.type === 'tron:calls')
|
|
1468
1533
|
try {
|
|
1534
|
+
if (
|
|
1535
|
+
result.action.type === 'tron:calls' &&
|
|
1536
|
+
(candidate.sourceChain.kind !== 'tron' || !provider.validateTransferAction)
|
|
1537
|
+
)
|
|
1538
|
+
throw new ProviderPayloadError()
|
|
1469
1539
|
const constraints = provider.validateTransferAction?.({
|
|
1470
1540
|
...parameters,
|
|
1471
1541
|
action: result.action,
|
|
1472
1542
|
destinationAmountMin: result.destinationAmountMin,
|
|
1473
1543
|
})
|
|
1474
|
-
|
|
1475
|
-
action: result.action,
|
|
1544
|
+
const bounds = {
|
|
1476
1545
|
nativeValues: constraints?.nativeValues,
|
|
1477
1546
|
sourceAmount: candidate.sourceAmount.amount,
|
|
1478
1547
|
sourceTokenAddress: candidate.sourceToken.address,
|
|
1479
1548
|
tokenApprovals: constraints?.tokenApprovals,
|
|
1480
|
-
}
|
|
1549
|
+
}
|
|
1550
|
+
if (result.action.type === 'tron:calls')
|
|
1551
|
+
Action.validateTronCalls({ ...bounds, action: result.action })
|
|
1552
|
+
else Action.validateEvmCalls({ ...bounds, action: result.action })
|
|
1481
1553
|
} catch (cause) {
|
|
1482
1554
|
if (cause instanceof Action.InvalidActionError) throw new ProviderPayloadError()
|
|
1483
1555
|
throw cause
|
|
@@ -1536,14 +1608,19 @@ export async function prepareTransfer(
|
|
|
1536
1608
|
throw new ProviderQuoteError(failures, attempts)
|
|
1537
1609
|
}
|
|
1538
1610
|
|
|
1611
|
+
const eligible = options.accept
|
|
1612
|
+
? prepared.filter(({ candidate, result }) => options.accept!(candidate, result))
|
|
1613
|
+
: prepared
|
|
1614
|
+
if (eligible.length === 0) return undefined
|
|
1615
|
+
|
|
1539
1616
|
// Deterministic selection: highest guaranteed minimum, then provider id.
|
|
1540
|
-
|
|
1617
|
+
eligible.sort((a, b) => {
|
|
1541
1618
|
const delta = BigInt(b.result.destinationAmountMin) - BigInt(a.result.destinationAmountMin)
|
|
1542
1619
|
if (delta !== 0n) return delta > 0n ? 1 : -1
|
|
1543
1620
|
return a.provider.id < b.provider.id ? -1 : 1
|
|
1544
1621
|
})
|
|
1545
|
-
const selected =
|
|
1546
|
-
const bestDestinationAmount =
|
|
1622
|
+
const selected = eligible[0]!
|
|
1623
|
+
const bestDestinationAmount = eligible.reduce(
|
|
1547
1624
|
(best, entry) =>
|
|
1548
1625
|
BigInt(entry.result.destinationAmount) > BigInt(best) ? entry.result.destinationAmount : best,
|
|
1549
1626
|
selected.result.destinationAmount,
|
|
@@ -1551,7 +1628,7 @@ export async function prepareTransfer(
|
|
|
1551
1628
|
return {
|
|
1552
1629
|
...selected,
|
|
1553
1630
|
bestDestinationAmount,
|
|
1554
|
-
preparedCount:
|
|
1631
|
+
preparedCount: eligible.length,
|
|
1555
1632
|
recipient,
|
|
1556
1633
|
sender,
|
|
1557
1634
|
}
|
|
@@ -1560,6 +1637,8 @@ export async function prepareTransfer(
|
|
|
1560
1637
|
export declare namespace prepareTransfer {
|
|
1561
1638
|
/** Options for preparing one executable transfer. */
|
|
1562
1639
|
type Options = getPrepareCandidates.Options & {
|
|
1640
|
+
/** Tests request-specific eligibility after provider validation, before ranking. */
|
|
1641
|
+
accept?: ((candidate: QuoteCandidate, result: ReturnType) => boolean) | undefined
|
|
1563
1642
|
/** Receives one bounded observation for every provider attempt. */
|
|
1564
1643
|
onAttempt?: ((attempt: ProviderAttempt) => void) | undefined
|
|
1565
1644
|
/** Per-provider preparation timeout in milliseconds. */
|
|
@@ -1727,7 +1806,7 @@ export function failure(options: ProviderFailure): failure.Result {
|
|
|
1727
1806
|
const code = errorCode(cause.body)
|
|
1728
1807
|
return {
|
|
1729
1808
|
...(code === undefined ? {} : { code }),
|
|
1730
|
-
failure: 'http',
|
|
1809
|
+
failure: cause.status === 429 ? 'rate_limit' : 'http',
|
|
1731
1810
|
id: provider.id,
|
|
1732
1811
|
operation,
|
|
1733
1812
|
status: cause.status,
|
|
@@ -1794,10 +1873,28 @@ export async function requestJson(url: URL, options: requestJson.Options) {
|
|
|
1794
1873
|
return text
|
|
1795
1874
|
}
|
|
1796
1875
|
})()
|
|
1797
|
-
if (!response.ok)
|
|
1876
|
+
if (!response.ok)
|
|
1877
|
+
throw new ProviderResponseError(
|
|
1878
|
+
response.status,
|
|
1879
|
+
body,
|
|
1880
|
+
retryAfterMilliseconds(response.headers.get('retry-after')),
|
|
1881
|
+
)
|
|
1798
1882
|
return body
|
|
1799
1883
|
}
|
|
1800
1884
|
|
|
1885
|
+
function retryAfterMilliseconds(value: string | null) {
|
|
1886
|
+
if (value === null) return undefined
|
|
1887
|
+
const normalized = value.trim()
|
|
1888
|
+
if (/^\d+$/.test(normalized)) {
|
|
1889
|
+
const seconds = Number(normalized)
|
|
1890
|
+
const milliseconds = seconds * 1_000
|
|
1891
|
+
return Number.isSafeInteger(milliseconds) ? milliseconds : undefined
|
|
1892
|
+
}
|
|
1893
|
+
const date = Date.parse(normalized)
|
|
1894
|
+
if (Number.isNaN(date)) return undefined
|
|
1895
|
+
return Math.max(0, date - Date.now())
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1801
1898
|
export declare namespace requestJson {
|
|
1802
1899
|
/** Provider request options. */
|
|
1803
1900
|
type Options = {
|
|
@@ -1822,6 +1919,7 @@ export function unavailableResult(options: unavailableResult.Options): getQuote.
|
|
|
1822
1919
|
sourceDetail: `${options.detail}:${options.message}`,
|
|
1823
1920
|
tier: 'unavailable',
|
|
1824
1921
|
},
|
|
1922
|
+
...(options.reason ? { reason: options.reason } : {}),
|
|
1825
1923
|
sampledAt: options.now.toISOString(),
|
|
1826
1924
|
status: 'unavailable',
|
|
1827
1925
|
}
|
|
@@ -1836,6 +1934,8 @@ export declare namespace unavailableResult {
|
|
|
1836
1934
|
message: string
|
|
1837
1935
|
/** Quote sample time. */
|
|
1838
1936
|
now: Date
|
|
1937
|
+
/** Provider-neutral reason safe to explain to the caller. */
|
|
1938
|
+
reason?: z.output<typeof schema.UnavailableReason> | undefined
|
|
1839
1939
|
/** Liquidity signal source. */
|
|
1840
1940
|
source: string
|
|
1841
1941
|
}
|
|
@@ -1883,7 +1983,11 @@ async function quoteCandidate(
|
|
|
1883
1983
|
)
|
|
1884
1984
|
if (!result.success) throw new ProviderPayloadError()
|
|
1885
1985
|
const quote = result.data
|
|
1886
|
-
if (quote.status === 'unavailable')
|
|
1986
|
+
if (quote.status === 'unavailable')
|
|
1987
|
+
return {
|
|
1988
|
+
outcome: quote.status,
|
|
1989
|
+
unavailable: quote.reason ?? 'route_unavailable',
|
|
1990
|
+
}
|
|
1887
1991
|
if (
|
|
1888
1992
|
(quote.status !== 'available' && quote.status !== 'thin') ||
|
|
1889
1993
|
quote.destinationAmount === undefined ||
|
|
@@ -2084,20 +2188,28 @@ function errorCode(input: unknown) {
|
|
|
2084
2188
|
|
|
2085
2189
|
/** Formats one provider attempt for logs and aggregate metrics. */
|
|
2086
2190
|
export function formatAttempt(attempt: ProviderAttempt): ProviderAttemptResult {
|
|
2191
|
+
const details =
|
|
2192
|
+
attempt.outcome === 'failed'
|
|
2193
|
+
? failure({
|
|
2194
|
+
cause: attempt.cause,
|
|
2195
|
+
operation: attempt.operation,
|
|
2196
|
+
provider: attempt.provider,
|
|
2197
|
+
})
|
|
2198
|
+
: undefined
|
|
2199
|
+
const responseError =
|
|
2200
|
+
attempt.outcome === 'failed' && attempt.cause instanceof ProviderResponseError
|
|
2201
|
+
? attempt.cause
|
|
2202
|
+
: undefined
|
|
2087
2203
|
return {
|
|
2204
|
+
...(responseError?.cooldownMs === undefined ? {} : { cooldownMs: responseError.cooldownMs }),
|
|
2088
2205
|
durationMs: attempt.durationMs,
|
|
2089
|
-
...(
|
|
2090
|
-
? {
|
|
2091
|
-
failure: failure({
|
|
2092
|
-
cause: attempt.cause,
|
|
2093
|
-
operation: attempt.operation,
|
|
2094
|
-
provider: attempt.provider,
|
|
2095
|
-
}).failure,
|
|
2096
|
-
}
|
|
2097
|
-
: {}),
|
|
2206
|
+
...(details === undefined ? {} : { failure: details.failure }),
|
|
2098
2207
|
id: attempt.provider.id,
|
|
2099
2208
|
operation: attempt.operation,
|
|
2100
2209
|
outcome: attempt.outcome,
|
|
2210
|
+
...(details?.failure === 'rate_limit'
|
|
2211
|
+
? { rateLimitSource: responseError?.status === 429 ? 'upstream' : 'local' }
|
|
2212
|
+
: {}),
|
|
2101
2213
|
}
|
|
2102
2214
|
}
|
|
2103
2215
|
|
|
@@ -2276,6 +2388,11 @@ export class ProviderUnavailableError extends Error {
|
|
|
2276
2388
|
override name = 'RoutesProvider.ProviderUnavailableError'
|
|
2277
2389
|
}
|
|
2278
2390
|
|
|
2391
|
+
/** Error thrown when the requested deposit amount cannot cover route fees. */
|
|
2392
|
+
export class AmountTooLowError extends ProviderUnavailableError {
|
|
2393
|
+
override name = 'RoutesProvider.AmountTooLowError'
|
|
2394
|
+
}
|
|
2395
|
+
|
|
2279
2396
|
/** Error thrown internally when a provider exceeds its quote timeout. */
|
|
2280
2397
|
export class ProviderTimeoutError extends Error {
|
|
2281
2398
|
override name = 'RoutesProvider.ProviderTimeoutError'
|
|
@@ -2290,11 +2407,16 @@ export class ProviderRateLimitError extends Error {
|
|
|
2290
2407
|
export class ProviderResponseError extends Error {
|
|
2291
2408
|
override name = 'RoutesProvider.ProviderResponseError'
|
|
2292
2409
|
|
|
2410
|
+
/** Effective shared cooldown applied after this response. */
|
|
2411
|
+
cooldownMs?: number
|
|
2412
|
+
|
|
2293
2413
|
constructor(
|
|
2294
2414
|
/** Provider response status. */
|
|
2295
2415
|
readonly status: number,
|
|
2296
2416
|
/** Parsed provider response body. */
|
|
2297
2417
|
readonly body: unknown,
|
|
2418
|
+
/** Upstream retry delay parsed from `Retry-After`, when supplied. */
|
|
2419
|
+
readonly retryAfterMs?: number,
|
|
2298
2420
|
) {
|
|
2299
2421
|
super(`Provider request failed with status ${status}`)
|
|
2300
2422
|
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import * as Store from '../Store.js'
|
|
2
|
+
import * as RoutesProvider from './Provider.js'
|
|
3
|
+
import * as ProviderQuota from './Quota.js'
|
|
4
|
+
|
|
5
|
+
describe('check', () => {
|
|
6
|
+
test('preserves a cooldown installed while a successful check is pending', async () => {
|
|
7
|
+
const store = Store.memory()
|
|
8
|
+
const now = new Date('2026-09-24T12:00:00.000Z')
|
|
9
|
+
const options = { key: 'quota', now }
|
|
10
|
+
|
|
11
|
+
await Promise.all([
|
|
12
|
+
ProviderQuota.check(store, options),
|
|
13
|
+
ProviderQuota.block(store, { ...options, durationMs: 60_000, windowMs: 1_000 }),
|
|
14
|
+
])
|
|
15
|
+
|
|
16
|
+
await expect(
|
|
17
|
+
ProviderQuota.check(store, { ...options, now: new Date(now.getTime() + 1) }),
|
|
18
|
+
).rejects.toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
|
|
19
|
+
await expect(
|
|
20
|
+
ProviderQuota.check(store, { ...options, now: new Date(now.getTime() + 60_000) }),
|
|
21
|
+
).resolves.toBeUndefined()
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
describe('consume', () => {
|
|
26
|
+
test.each([10, 20])('accepts the full quota of %i under contention', async (limit) => {
|
|
27
|
+
const store = Store.memory()
|
|
28
|
+
const options = {
|
|
29
|
+
key: 'quota',
|
|
30
|
+
limit,
|
|
31
|
+
now: new Date('2026-09-24T12:00:00.000Z'),
|
|
32
|
+
windowMs: 1_000,
|
|
33
|
+
}
|
|
34
|
+
const results = await Promise.allSettled(
|
|
35
|
+
Array.from({ length: limit + 5 }, () => ProviderQuota.consume(store, options)),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
expect(results.filter((result) => result.status === 'fulfilled')).toHaveLength(limit)
|
|
39
|
+
const rejected = results.filter((result) => result.status === 'rejected')
|
|
40
|
+
expect(rejected).toHaveLength(5)
|
|
41
|
+
for (const result of rejected)
|
|
42
|
+
expect(result.reason).toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
|
|
43
|
+
expect(JSON.parse((await store.get(options.key))!).count).toBe(limit)
|
|
44
|
+
|
|
45
|
+
// A rejected reservation must not prevent the next window from proceeding.
|
|
46
|
+
await ProviderQuota.consume(store, {
|
|
47
|
+
...options,
|
|
48
|
+
now: new Date(options.now.getTime() + options.windowMs),
|
|
49
|
+
})
|
|
50
|
+
expect(JSON.parse((await store.get(options.key))!).count).toBe(1)
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
describe('block', () => {
|
|
55
|
+
test('persists the longest cooldown under contention', async () => {
|
|
56
|
+
const store = Store.memory()
|
|
57
|
+
const options = {
|
|
58
|
+
key: 'quota',
|
|
59
|
+
now: new Date('2026-09-24T12:00:00.000Z'),
|
|
60
|
+
windowMs: 1_000,
|
|
61
|
+
}
|
|
62
|
+
const results = await Promise.allSettled(
|
|
63
|
+
Array.from({ length: 20 }, (_, index) =>
|
|
64
|
+
ProviderQuota.block(store, { ...options, durationMs: (index + 1) * 1_000 }),
|
|
65
|
+
),
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
expect(results.filter((result) => result.status === 'fulfilled')).toHaveLength(20)
|
|
69
|
+
expect(JSON.parse((await store.get(options.key))!).blockedUntil).toBe(
|
|
70
|
+
options.now.getTime() + 20_000,
|
|
71
|
+
)
|
|
72
|
+
await expect(
|
|
73
|
+
ProviderQuota.consume(store, {
|
|
74
|
+
...options,
|
|
75
|
+
limit: 10,
|
|
76
|
+
now: new Date(options.now.getTime() + 19_999),
|
|
77
|
+
}),
|
|
78
|
+
).rejects.toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
|
|
79
|
+
await expect(
|
|
80
|
+
ProviderQuota.consume(store, {
|
|
81
|
+
...options,
|
|
82
|
+
limit: 10,
|
|
83
|
+
now: new Date(options.now.getTime() + 20_000),
|
|
84
|
+
}),
|
|
85
|
+
).resolves.toBeUndefined()
|
|
86
|
+
})
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
describe('durableObject', () => {
|
|
90
|
+
test('uses one native RPC for quota state transitions', async () => {
|
|
91
|
+
const calls: string[] = []
|
|
92
|
+
let consumeAllowed = true
|
|
93
|
+
const namespace = {
|
|
94
|
+
getByName(name: string) {
|
|
95
|
+
expect(name).toBe('routes:relay:quota')
|
|
96
|
+
return {
|
|
97
|
+
async routesQuotaBlock() {
|
|
98
|
+
calls.push('block')
|
|
99
|
+
},
|
|
100
|
+
async routesQuotaCheck() {
|
|
101
|
+
calls.push('check')
|
|
102
|
+
return true
|
|
103
|
+
},
|
|
104
|
+
async routesQuotaConsume() {
|
|
105
|
+
calls.push('consume')
|
|
106
|
+
return consumeAllowed
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
} as unknown as Store.durableObject.Namespace
|
|
111
|
+
const store = ProviderQuota.durableObject(namespace, { name: 'routes:relay:quota' })
|
|
112
|
+
const now = new Date('2026-09-24T12:00:00.000Z')
|
|
113
|
+
|
|
114
|
+
await ProviderQuota.consume(store, {
|
|
115
|
+
key: 'routes:relay:quote-v2',
|
|
116
|
+
limit: 10,
|
|
117
|
+
now,
|
|
118
|
+
windowMs: 1_000,
|
|
119
|
+
})
|
|
120
|
+
await ProviderQuota.check(store, { key: 'routes:relay:adaptive', now })
|
|
121
|
+
await ProviderQuota.check(store, { key: 'routes:relay:adaptive', now })
|
|
122
|
+
await ProviderQuota.block(store, {
|
|
123
|
+
durationMs: 2_000,
|
|
124
|
+
key: 'routes:relay:adaptive',
|
|
125
|
+
now,
|
|
126
|
+
windowMs: 1_000,
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
expect(calls).toEqual(['consume', 'check', 'block'])
|
|
130
|
+
await expect(
|
|
131
|
+
ProviderQuota.check(store, {
|
|
132
|
+
key: 'routes:relay:adaptive',
|
|
133
|
+
now: new Date(now.getTime() + 1_000),
|
|
134
|
+
}),
|
|
135
|
+
).rejects.toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
|
|
136
|
+
expect(calls).toEqual(['consume', 'check', 'block'])
|
|
137
|
+
|
|
138
|
+
consumeAllowed = false
|
|
139
|
+
await expect(
|
|
140
|
+
ProviderQuota.consume(store, {
|
|
141
|
+
key: 'routes:relay:quote-v2',
|
|
142
|
+
limit: 10,
|
|
143
|
+
now,
|
|
144
|
+
windowMs: 1_000,
|
|
145
|
+
}),
|
|
146
|
+
).rejects.toBeInstanceOf(RoutesProvider.ProviderRateLimitError)
|
|
147
|
+
expect(calls).toEqual(['consume', 'check', 'block', 'consume'])
|
|
148
|
+
})
|
|
149
|
+
})
|