tapimo 0.15.1 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +893 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +70 -70
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +529 -76
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +157 -157
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +205 -201
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +357 -357
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +125 -125
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +109 -127
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +83 -54
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +43 -43
- package/dist/apps/data/routes/receipts.d.ts +235 -235
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +77 -77
- package/dist/apps/data/routes/valuation.d.ts +32 -32
- package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +1 -1
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +31 -31
- package/dist/apps/management/App.d.ts +2909 -2064
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +257 -245
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +138 -138
- package/dist/apps/management/routes/invite-links.d.ts +172 -172
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +104 -104
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +125 -125
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
- package/dist/apps/management/routes/webhooks.d.ts +485 -485
- package/dist/apps/mpp/App.d.ts +44 -44
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/chains.d.ts +25 -25
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +171 -81
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +532 -480
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +413 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +57 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +182 -78
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +3 -0
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +352 -41
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +1 -0
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
- package/src/admin/ui.generated.ts +258 -202
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +134 -2
- package/src/apps/data/routes/fee-amm.ts +122 -60
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +2 -2
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.test.ts +12 -3
- package/src/apps/data/routes/webhooks.ts +2 -1
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +498 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +66 -5
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +291 -8
- package/src/internal/Auth.ts +227 -96
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1263 -41
- package/src/internal/routes/providers/relay.ts +423 -38
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
|
@@ -13,6 +13,7 @@ import * as Response from '../../../internal/Response.js'
|
|
|
13
13
|
import * as Schema from '../../../internal/Schema.js'
|
|
14
14
|
import * as Store from '../../../internal/Store.js'
|
|
15
15
|
import * as Tidx from '../../../internal/Tidx.js'
|
|
16
|
+
import * as Timeout from '../../../internal/Timeout.js'
|
|
16
17
|
import * as Timing from '../../../internal/Timing.js'
|
|
17
18
|
import * as Ttl from '../../../internal/Ttl.js'
|
|
18
19
|
import * as Value from '../../../internal/Value.js'
|
|
@@ -1072,8 +1073,8 @@ export function getTransactions(c: Context<App.Environment>, options: getTransac
|
|
|
1072
1073
|
|
|
1073
1074
|
return Timing.time(c, 'transactions', () =>
|
|
1074
1075
|
Store.memoize(
|
|
1075
|
-
async () => {
|
|
1076
|
-
const page = await scanTransactions({ tidx }, options)
|
|
1076
|
+
async (signal) => {
|
|
1077
|
+
const page = await scanTransactions({ signal, tidx }, options)
|
|
1077
1078
|
return {
|
|
1078
1079
|
data: page.items.map((item) => item.data),
|
|
1079
1080
|
nextCursor: page.nextCursor,
|
|
@@ -1115,7 +1116,7 @@ export async function scanTransactions(
|
|
|
1115
1116
|
toBlock,
|
|
1116
1117
|
toTimestamp,
|
|
1117
1118
|
} = options
|
|
1118
|
-
const { tidx } = deps
|
|
1119
|
+
const { signal: flight, tidx } = deps
|
|
1119
1120
|
const sortDirection = order === 'asc' ? 'ASC' : 'DESC'
|
|
1120
1121
|
// Keyset pagination: anchor the page below the previous row's `(block, idx)`
|
|
1121
1122
|
// position instead of a numeric offset, so rows arriving at the head can't
|
|
@@ -1177,35 +1178,43 @@ export async function scanTransactions(
|
|
|
1177
1178
|
feePayer !== undefined ||
|
|
1178
1179
|
feeToken !== undefined
|
|
1179
1180
|
const fetchRows = async (where: readonly string[]) => {
|
|
1181
|
+
// Raw-table query (no signature-decoded CTE), so the inline SQL is cast
|
|
1182
|
+
// to `string`.
|
|
1183
|
+
const query = (block: string) =>
|
|
1184
|
+
`
|
|
1185
|
+
SELECT ${transactionColumns}
|
|
1186
|
+
FROM txs
|
|
1187
|
+
${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
|
|
1188
|
+
ORDER BY ${block} ${sortDirection}, idx ${sortDirection}
|
|
1189
|
+
LIMIT ${queryLimit}${skip}
|
|
1190
|
+
` as string
|
|
1191
|
+
if (!filtered)
|
|
1192
|
+
return await tidx.fetch({
|
|
1193
|
+
chainId,
|
|
1194
|
+
query: query('block_num'),
|
|
1195
|
+
...(flight ? { signal: flight } : {}),
|
|
1196
|
+
})
|
|
1197
|
+
// TIDX reports statement kills as 408 timeouts, which the client retries until
|
|
1198
|
+
// the deadline; half the deadline bounds the walk so the fenced retry still runs.
|
|
1199
|
+
const timeout = AbortSignal.timeout(Timeout.duration / 2)
|
|
1180
1200
|
try {
|
|
1181
1201
|
return await tidx.fetch({
|
|
1182
1202
|
chainId,
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
query: `
|
|
1186
|
-
SELECT ${transactionColumns}
|
|
1187
|
-
FROM txs
|
|
1188
|
-
${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
|
|
1189
|
-
ORDER BY block_num ${sortDirection}, idx ${sortDirection}
|
|
1190
|
-
LIMIT ${queryLimit}${skip}
|
|
1191
|
-
` as string,
|
|
1203
|
+
query: query('block_num'),
|
|
1204
|
+
signal: flight ? AbortSignal.any([flight, timeout]) : timeout,
|
|
1192
1205
|
})
|
|
1193
1206
|
} catch (error) {
|
|
1207
|
+
// An expired flight means the memoized caller already gave up.
|
|
1208
|
+
if (flight?.aborted) throw error
|
|
1194
1209
|
// Planner mis-selectivity turns these top-N scans into a block-ordered
|
|
1195
1210
|
// walk that times out when matches sit far from the scan boundary;
|
|
1196
1211
|
// `block_num + 0` blocks that walk, forcing the filter index plus a sort.
|
|
1197
|
-
if (!
|
|
1212
|
+
if (!timeout.aborted && !Tidx.isQueryTimeout(error) && !Tidx.isDeterministicError(error))
|
|
1213
|
+
throw error
|
|
1198
1214
|
return await tidx.fetch({
|
|
1199
1215
|
chainId,
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
query: `
|
|
1203
|
-
SELECT ${transactionColumns}
|
|
1204
|
-
FROM txs
|
|
1205
|
-
${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
|
|
1206
|
-
ORDER BY block_num + 0 ${sortDirection}, idx ${sortDirection}
|
|
1207
|
-
LIMIT ${queryLimit}${skip}
|
|
1208
|
-
` as string,
|
|
1216
|
+
query: query('block_num + 0'),
|
|
1217
|
+
...(flight ? { signal: flight } : {}),
|
|
1209
1218
|
})
|
|
1210
1219
|
}
|
|
1211
1220
|
}
|
|
@@ -1395,6 +1404,8 @@ export declare namespace countTransactions {
|
|
|
1395
1404
|
export declare namespace scanTransactions {
|
|
1396
1405
|
/** Dependencies for {@link scanTransactions}. */
|
|
1397
1406
|
type Deps = {
|
|
1407
|
+
/** Optional deadline signal bounding every TIDX read in the scan. */
|
|
1408
|
+
signal?: AbortSignal | undefined
|
|
1398
1409
|
/** TIDX query client for the target chain. */
|
|
1399
1410
|
tidx: Tidx.Client
|
|
1400
1411
|
}
|
|
@@ -307,10 +307,19 @@ describe('CRUD lifecycle', () => {
|
|
|
307
307
|
},
|
|
308
308
|
as(webhookWriter),
|
|
309
309
|
)
|
|
310
|
-
|
|
310
|
+
expect(response.status).toMatchInlineSnapshot(`403`)
|
|
311
|
+
if (response.status !== 403) throw new Error('Expected a forbidden response')
|
|
312
|
+
const { requestId, ...body } = await response.json()
|
|
311
313
|
|
|
312
|
-
expect(
|
|
313
|
-
expect(body
|
|
314
|
+
expect(requestId).toBeDefined()
|
|
315
|
+
expect(body).toMatchInlineSnapshot(`
|
|
316
|
+
{
|
|
317
|
+
"error": {
|
|
318
|
+
"code": "api_key_forbidden",
|
|
319
|
+
"message": "API key is missing required permissions: routes:read. Use an API key with these scopes.",
|
|
320
|
+
},
|
|
321
|
+
}
|
|
322
|
+
`)
|
|
314
323
|
})
|
|
315
324
|
|
|
316
325
|
test('captures route transfer ownership scope without reading the RPC head', async () => {
|
|
@@ -1670,7 +1670,8 @@ export function webhooks(options: webhooks.Options = {}) {
|
|
|
1670
1670
|
)
|
|
1671
1671
|
return Response.error(c, {
|
|
1672
1672
|
code: 'api_key_forbidden',
|
|
1673
|
-
message:
|
|
1673
|
+
message:
|
|
1674
|
+
'API key is missing required permissions: routes:read. Use an API key with these scopes.',
|
|
1674
1675
|
status: 403,
|
|
1675
1676
|
})
|
|
1676
1677
|
}
|
|
@@ -7,6 +7,7 @@ import * as Metadata from '../metadata.js'
|
|
|
7
7
|
|
|
8
8
|
import { apiKeys } from './routes/api-keys.js'
|
|
9
9
|
import { billing } from './routes/billing.js'
|
|
10
|
+
import { cli } from './routes/cli.js'
|
|
10
11
|
import { faucet } from './routes/faucet.js'
|
|
11
12
|
import { invitations } from './routes/invitations.js'
|
|
12
13
|
import { inviteLinks } from './routes/invite-links.js'
|
|
@@ -75,6 +76,7 @@ export function management(options: management.Options = {}) {
|
|
|
75
76
|
})
|
|
76
77
|
.route('/', apiKeys({ enabled: options.apiKeys !== false }))
|
|
77
78
|
.route('/', billing())
|
|
79
|
+
.route('/', cli({ consoleUrl: options.consoleUrl }))
|
|
78
80
|
.route('/', faucet())
|
|
79
81
|
.route('/', invitations())
|
|
80
82
|
.route('/', inviteLinks())
|
|
@@ -96,6 +98,8 @@ export declare namespace management {
|
|
|
96
98
|
apiKeys?: boolean | undefined
|
|
97
99
|
/** Stripe billing capability; omit to disable billing routes (501) and keep production sponsorship closed. */
|
|
98
100
|
billing?: Billing | undefined
|
|
101
|
+
/** Console origin hosting the CLI sign-in approval page. @default 'https://console.tempo.xyz' */
|
|
102
|
+
consoleUrl?: string | undefined
|
|
99
103
|
/** Legacy group-level transactional email sender. Prefer `App.create({ email })`. */
|
|
100
104
|
email?: Email.Sender | undefined
|
|
101
105
|
/** Webhook capability shared with the data group and host poller; omit or pass false to disable management. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { nanoid } from 'nanoid'
|
|
2
|
-
import
|
|
2
|
+
import Stripe from 'stripe'
|
|
3
3
|
|
|
4
4
|
import * as Runtime from '../../../test/runtime.js'
|
|
5
5
|
import * as ApiKeys from '../../ApiKeys.js'
|
|
@@ -33,16 +33,23 @@ const input = {
|
|
|
33
33
|
/** Inserts and finalizes one billable row; `seed` derives a unique sign payload. */
|
|
34
34
|
async function finalized(
|
|
35
35
|
db: Db.Db,
|
|
36
|
-
options: {
|
|
36
|
+
options: {
|
|
37
|
+
chainId?: number
|
|
38
|
+
feeAmount: string
|
|
39
|
+
finalizedAt?: string
|
|
40
|
+
orgId?: string
|
|
41
|
+
seed: string
|
|
42
|
+
},
|
|
37
43
|
): Promise<SponsoredTransactions.Record> {
|
|
38
44
|
const row = await SponsoredTransactions.upsert(db, {
|
|
39
45
|
...input,
|
|
46
|
+
...(options.chainId === undefined ? {} : { chainId: options.chainId }),
|
|
40
47
|
...(options.orgId ? { orgId: options.orgId } : {}),
|
|
41
48
|
signPayload: `0x${options.seed.repeat(32)}`,
|
|
42
49
|
})
|
|
43
50
|
await SponsoredTransactions.finalize(db, row.id, {
|
|
44
51
|
feeAmount: options.feeAmount,
|
|
45
|
-
finalizedAt: new Date().toISOString(),
|
|
52
|
+
finalizedAt: options.finalizedAt ?? new Date().toISOString(),
|
|
46
53
|
})
|
|
47
54
|
return row
|
|
48
55
|
}
|
|
@@ -178,6 +185,7 @@ type StubSubscription = {
|
|
|
178
185
|
* item/subscription creation are captured for assertions.
|
|
179
186
|
*/
|
|
180
187
|
function stubStripe(options: {
|
|
188
|
+
createdAt?: number | undefined
|
|
181
189
|
meterEvent?: ((params: { identifier: string }) => void) | undefined
|
|
182
190
|
subscriptions?: readonly StubSubscription[] | undefined
|
|
183
191
|
subscriptionsList?: (() => Promise<void>) | undefined
|
|
@@ -239,7 +247,7 @@ function stubStripe(options: {
|
|
|
239
247
|
subscriptionItems: {
|
|
240
248
|
create: async (params: { price: string; subscription: string }) => {
|
|
241
249
|
itemsCreated.push(params)
|
|
242
|
-
return { created: Math.floor(Date.now() / 1_000) }
|
|
250
|
+
return { created: options.createdAt ?? Math.floor(Date.now() / 1_000) }
|
|
243
251
|
},
|
|
244
252
|
},
|
|
245
253
|
subscriptions: {
|
|
@@ -248,7 +256,7 @@ function stubStripe(options: {
|
|
|
248
256
|
return {
|
|
249
257
|
items: {
|
|
250
258
|
data: params.items.map(({ price }) => ({
|
|
251
|
-
created: Math.floor(Date.now() / 1_000),
|
|
259
|
+
created: options.createdAt ?? Math.floor(Date.now() / 1_000),
|
|
252
260
|
price: { id: price },
|
|
253
261
|
})),
|
|
254
262
|
},
|
|
@@ -315,6 +323,89 @@ describe('status', () => {
|
|
|
315
323
|
})
|
|
316
324
|
|
|
317
325
|
describe('createReporter', () => {
|
|
326
|
+
test('retries an explicitly rejected Stripe event after its configuration is corrected', async () => {
|
|
327
|
+
const db = create()
|
|
328
|
+
await db.migrate()
|
|
329
|
+
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
|
|
330
|
+
const row = await finalized(db, { feeAmount: '100000', seed: '42' })
|
|
331
|
+
let reject = true
|
|
332
|
+
const { meterEvents, stripe } = stubStripe({
|
|
333
|
+
meterEvent: () => {
|
|
334
|
+
if (reject)
|
|
335
|
+
throw new Stripe.errors.StripeInvalidRequestError({
|
|
336
|
+
message: 'Meter configuration is invalid.',
|
|
337
|
+
statusCode: 400,
|
|
338
|
+
type: 'invalid_request_error',
|
|
339
|
+
})
|
|
340
|
+
},
|
|
341
|
+
subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
|
|
342
|
+
})
|
|
343
|
+
const reporter = Billing.createReporter({ db, stripe })
|
|
344
|
+
expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
345
|
+
expect((await SponsoredTransactions.get(db, row.id))?.meterEventFirstAttemptedAt).toBeNull()
|
|
346
|
+
|
|
347
|
+
reject = false
|
|
348
|
+
expect(await reporter.tick()).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
|
|
349
|
+
expect(meterEvents.map(({ identifier }) => identifier)).toStrictEqual([row.id])
|
|
350
|
+
await db.close()
|
|
351
|
+
})
|
|
352
|
+
|
|
353
|
+
test('stops an uncertain Stripe resend after its identifier window', async () => {
|
|
354
|
+
const db = create()
|
|
355
|
+
await db.migrate()
|
|
356
|
+
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
|
|
357
|
+
const row = await finalized(db, { feeAmount: '100000', seed: '41' })
|
|
358
|
+
await SponsoredTransactions.beginMeterEvent(
|
|
359
|
+
db,
|
|
360
|
+
row.id,
|
|
361
|
+
new Date(Date.now() - 24 * 60 * 60 * 1_000).toISOString(),
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
const { meterEvents, stripe } = stubStripe({
|
|
365
|
+
subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
|
|
366
|
+
})
|
|
367
|
+
expect(await Billing.createReporter({ db, stripe }).tick()).toStrictEqual({
|
|
368
|
+
failed: 1,
|
|
369
|
+
reported: 0,
|
|
370
|
+
skipped: 0,
|
|
371
|
+
})
|
|
372
|
+
expect(meterEvents).toHaveLength(0)
|
|
373
|
+
expect((await SponsoredTransactions.get(db, row.id))?.meterReportedAt).toBeNull()
|
|
374
|
+
await db.close()
|
|
375
|
+
})
|
|
376
|
+
|
|
377
|
+
test('rotates unavailable sponsorships behind healthy rows', async () => {
|
|
378
|
+
const db = create()
|
|
379
|
+
await db.migrate()
|
|
380
|
+
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
|
|
381
|
+
const unavailable = await finalized(db, {
|
|
382
|
+
feeAmount: '100000',
|
|
383
|
+
finalizedAt: '2026-01-01T00:00:00.000Z',
|
|
384
|
+
orgId: 'org_missing',
|
|
385
|
+
seed: '39',
|
|
386
|
+
})
|
|
387
|
+
const healthy = await finalized(db, {
|
|
388
|
+
chainId: 421700099,
|
|
389
|
+
feeAmount: '250000',
|
|
390
|
+
finalizedAt: '2026-01-02T00:00:00.000Z',
|
|
391
|
+
seed: '40',
|
|
392
|
+
})
|
|
393
|
+
|
|
394
|
+
const { meterEvents, stripe } = stubStripe({
|
|
395
|
+
subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
|
|
396
|
+
})
|
|
397
|
+
const reporter = Billing.createReporter({ batchSize: 1, db, stripe })
|
|
398
|
+
expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
399
|
+
expect(await reporter.tick()).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
|
|
400
|
+
expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
401
|
+
expect(meterEvents.map(({ identifier }) => identifier)).toStrictEqual([healthy.id])
|
|
402
|
+
expect(
|
|
403
|
+
(await SponsoredTransactions.get(db, unavailable.id))?.meterEventFirstAttemptedAt,
|
|
404
|
+
).toBeNull()
|
|
405
|
+
expect((await SponsoredTransactions.get(db, unavailable.id))?.meterReportedAt).toBeNull()
|
|
406
|
+
await db.close()
|
|
407
|
+
})
|
|
408
|
+
|
|
318
409
|
test('behavior: a poisoned row never stalls the queue', async () => {
|
|
319
410
|
const db = create()
|
|
320
411
|
await db.migrate()
|
|
@@ -387,6 +478,7 @@ describe('createReporter', () => {
|
|
|
387
478
|
skipped: 0,
|
|
388
479
|
})
|
|
389
480
|
expect((await SponsoredTransactions.get(db, row.id))?.meterReportedAt).not.toBeNull()
|
|
481
|
+
expect((await SponsoredTransactions.get(db, row.id))?.meterEventFirstAttemptedAt).not.toBeNull()
|
|
390
482
|
expect(await Billing.createReporter({ db, stripe }).tick()).toStrictEqual({
|
|
391
483
|
failed: 0,
|
|
392
484
|
reported: 0,
|
|
@@ -395,24 +487,35 @@ describe('createReporter', () => {
|
|
|
395
487
|
await db.close()
|
|
396
488
|
})
|
|
397
489
|
|
|
398
|
-
test('
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
490
|
+
test.each(['canceled', 'missing'] as const)(
|
|
491
|
+
'behavior: retains sponsorship liability for %s customers',
|
|
492
|
+
async (status) => {
|
|
493
|
+
const db = create()
|
|
494
|
+
await db.migrate()
|
|
495
|
+
if (status === 'canceled') {
|
|
496
|
+
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
|
|
497
|
+
await StripeCustomers.setStatus(db, 'org_1', 'canceled')
|
|
498
|
+
}
|
|
499
|
+
const row = await finalized(db, { feeAmount: '100000', seed: '03' })
|
|
500
|
+
|
|
501
|
+
// No provider call is needed until a billing identity is available.
|
|
502
|
+
const stripe = new Stripe('sk_test_unavailable_customer', { maxNetworkRetries: 0 })
|
|
503
|
+
const reporter = Billing.createReporter({ db, stripe })
|
|
504
|
+
expect(await reporter.tick()).toStrictEqual({
|
|
505
|
+
failed: 1,
|
|
506
|
+
reported: 0,
|
|
507
|
+
skipped: 0,
|
|
508
|
+
})
|
|
509
|
+
expect((await SponsoredTransactions.get(db, row.id))?.meterReportedAt).toBeNull()
|
|
510
|
+
expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
511
|
+
expect(
|
|
512
|
+
(await SponsoredTransactions.listUnreported(db, { chainIds: [Viem.chainId.mainnet] })).map(
|
|
513
|
+
({ id }) => id,
|
|
514
|
+
),
|
|
515
|
+
).toEqual([row.id])
|
|
516
|
+
await db.close()
|
|
517
|
+
},
|
|
518
|
+
)
|
|
416
519
|
|
|
417
520
|
test('behavior: ensures the metered subscription once and stamps its backlog at now', async () => {
|
|
418
521
|
const db = create()
|
|
@@ -779,7 +882,8 @@ describe('createRequestUsageReporter', () => {
|
|
|
779
882
|
|
|
780
883
|
// Tick 1: fresh customer, initial seal of 5. The just-created item bills at
|
|
781
884
|
// now (no backdate).
|
|
782
|
-
const
|
|
885
|
+
const createdAt = Math.floor(now() / 1_000)
|
|
886
|
+
const first = stubStripe({ createdAt, subscriptions: [] })
|
|
783
887
|
const reporter1 = Billing.createRequestUsageReporter({
|
|
784
888
|
db,
|
|
785
889
|
now,
|
|
@@ -788,9 +892,9 @@ describe('createRequestUsageReporter', () => {
|
|
|
788
892
|
})
|
|
789
893
|
expect(await reporter1.tick()).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
|
|
790
894
|
expect(first.meterEvents).toEqual([
|
|
791
|
-
{ event_name: 'api_request_count', identifier: expect.any(String), payload: expect.objectContaining({ value: '5' }) }, // prettier-ignore
|
|
895
|
+
{ event_name: 'api_request_count', identifier: expect.any(String), payload: expect.objectContaining({ value: '5' }), timestamp: createdAt }, // prettier-ignore
|
|
792
896
|
])
|
|
793
|
-
expect(first.meterEvents[0]!.timestamp).
|
|
897
|
+
expect(first.meterEvents[0]!.timestamp).toBe(createdAt)
|
|
794
898
|
expect((await RequestUsage.getBucket(db, { bucketStart, environment: 'production', orgId: 'org_1' }))?.reportedCount).toBe(5) // prettier-ignore
|
|
795
899
|
|
|
796
900
|
// Tick 2: count grows to 8; only the delta of 3 bills, backdated (item exists).
|
|
@@ -824,6 +928,30 @@ describe('createRequestUsageReporter', () => {
|
|
|
824
928
|
await db.close()
|
|
825
929
|
})
|
|
826
930
|
|
|
931
|
+
test('behavior: clamps initial backlog to an item provisioned by another reporter', async () => {
|
|
932
|
+
const db = create()
|
|
933
|
+
await db.migrate()
|
|
934
|
+
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
|
|
935
|
+
await StripeCustomers.setStatus(db, 'org_1', 'active')
|
|
936
|
+
const createdAt = Math.floor(Date.parse('2026-01-01T18:00:00.000Z') / 1_000)
|
|
937
|
+
const { meterEvents, stripe } = stubStripe({
|
|
938
|
+
subscriptions: [
|
|
939
|
+
{ createdAt, items: ['feePayerSpend', 'routeSubsidy', 'apiRequests'], status: 'active' },
|
|
940
|
+
],
|
|
941
|
+
})
|
|
942
|
+
|
|
943
|
+
expect(
|
|
944
|
+
await Billing.createRequestUsageReporter({
|
|
945
|
+
db,
|
|
946
|
+
now,
|
|
947
|
+
readCounts: async () => [{ bucketStart, count: 5, orgId: 'org_1' }],
|
|
948
|
+
stripe,
|
|
949
|
+
}).tick(),
|
|
950
|
+
).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
|
|
951
|
+
expect(meterEvents[0]?.timestamp).toBe(createdAt)
|
|
952
|
+
await db.close()
|
|
953
|
+
})
|
|
954
|
+
|
|
827
955
|
test('behavior: overlapping ticks cannot claim the same observed watermark twice', async () => {
|
|
828
956
|
const db = create()
|
|
829
957
|
await db.migrate()
|
|
@@ -941,6 +1069,7 @@ describe('createRequestUsageReporter', () => {
|
|
|
941
1069
|
bucketStart,
|
|
942
1070
|
deltaCount: 6,
|
|
943
1071
|
environment: 'production',
|
|
1072
|
+
eventTimestamp: bucketStart,
|
|
944
1073
|
identifier: 'rq_production_deadbeef0001_0_0',
|
|
945
1074
|
orgId: 'org_1',
|
|
946
1075
|
sequence: 0,
|
|
@@ -969,11 +1098,12 @@ describe('createRequestUsageReporter', () => {
|
|
|
969
1098
|
await db.migrate()
|
|
970
1099
|
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
|
|
971
1100
|
await StripeCustomers.setStatus(db, 'org_1', 'active')
|
|
1101
|
+
const createdAt = Math.floor(Date.parse('2026-01-01T18:00:00.000Z') / 1_000)
|
|
972
1102
|
const { stripe } = stubStripe({
|
|
973
1103
|
meterEvent() {
|
|
974
1104
|
throw new Error('Stripe unavailable')
|
|
975
1105
|
},
|
|
976
|
-
subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
|
|
1106
|
+
subscriptions: [{ createdAt, items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
|
|
977
1107
|
})
|
|
978
1108
|
const reporter = Billing.createRequestUsageReporter({
|
|
979
1109
|
db,
|
|
@@ -990,6 +1120,102 @@ describe('createRequestUsageReporter', () => {
|
|
|
990
1120
|
oldestPendingAgeSeconds: expect.any(Number),
|
|
991
1121
|
},
|
|
992
1122
|
])
|
|
1123
|
+
|
|
1124
|
+
const pending = (await RequestUsage.listPending(db, 'production'))[0]!
|
|
1125
|
+
await db.kysely
|
|
1126
|
+
.updateTable('request_usage_meter_events')
|
|
1127
|
+
.set({ eventTimestamp: pending.firstAttemptedAt })
|
|
1128
|
+
.where('identifier', '=', pending.identifier)
|
|
1129
|
+
.execute()
|
|
1130
|
+
const retryAt = new Date(pending.firstAttemptedAt).getTime() + 23 * 60 * 60 * 1_000
|
|
1131
|
+
const failedRetry = stubStripe({ subscriptions: [] })
|
|
1132
|
+
expect(
|
|
1133
|
+
await Billing.createRequestUsageReporter({
|
|
1134
|
+
db,
|
|
1135
|
+
now: () => retryAt,
|
|
1136
|
+
readCounts: async () => [],
|
|
1137
|
+
stripe: failedRetry.stripe,
|
|
1138
|
+
}).tick(),
|
|
1139
|
+
).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
1140
|
+
expect(failedRetry.meterEvents).toHaveLength(0)
|
|
1141
|
+
expect(await RequestUsage.listPending(db, 'production')).toHaveLength(1)
|
|
1142
|
+
expect(await reporter.pending()).toMatchObject([{ count: 1, environment: 'production' }])
|
|
1143
|
+
|
|
1144
|
+
const retry = stubStripe({ subscriptions: [] })
|
|
1145
|
+
expect(
|
|
1146
|
+
await Billing.createRequestUsageReporter({
|
|
1147
|
+
db,
|
|
1148
|
+
now: () => retryAt + 24 * 60 * 60 * 1_000,
|
|
1149
|
+
readCounts: async () => [],
|
|
1150
|
+
stripe: retry.stripe,
|
|
1151
|
+
}).tick(),
|
|
1152
|
+
).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
1153
|
+
expect(retry.meterEvents).toHaveLength(0)
|
|
1154
|
+
await db.close()
|
|
1155
|
+
})
|
|
1156
|
+
|
|
1157
|
+
test('behavior: stops retrying a legacy event after identifier uniqueness expires', async () => {
|
|
1158
|
+
const db = create()
|
|
1159
|
+
await db.migrate()
|
|
1160
|
+
await RequestUsage.insertPending(db, {
|
|
1161
|
+
bucketStart,
|
|
1162
|
+
deltaCount: 6,
|
|
1163
|
+
environment: 'production',
|
|
1164
|
+
eventTimestamp: new Date().toISOString(),
|
|
1165
|
+
identifier: 'rq_production_deadbeef0003_0_0',
|
|
1166
|
+
orgId: 'org_1',
|
|
1167
|
+
sequence: 0,
|
|
1168
|
+
stripeCustomerId: 'cus_1',
|
|
1169
|
+
})
|
|
1170
|
+
await db.kysely
|
|
1171
|
+
.updateTable('request_usage_meter_events')
|
|
1172
|
+
.set({ eventTimestamp: null })
|
|
1173
|
+
.where('identifier', '=', 'rq_production_deadbeef0003_0_0')
|
|
1174
|
+
.execute()
|
|
1175
|
+
const pending = (await RequestUsage.listPending(db, 'production'))[0]!
|
|
1176
|
+
expect(pending).not.toHaveProperty('eventTimestamp')
|
|
1177
|
+
const stripe = stubStripe({ subscriptions: [] })
|
|
1178
|
+
expect(
|
|
1179
|
+
await Billing.createRequestUsageReporter({
|
|
1180
|
+
db,
|
|
1181
|
+
now: () => new Date(pending.firstAttemptedAt).getTime() + 23 * 60 * 60 * 1_000,
|
|
1182
|
+
readCounts: async () => [],
|
|
1183
|
+
stripe: stripe.stripe,
|
|
1184
|
+
}).tick(),
|
|
1185
|
+
).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
1186
|
+
expect(stripe.meterEvents).toHaveLength(0)
|
|
1187
|
+
expect(await RequestUsage.listPending(db, 'production')).toHaveLength(1)
|
|
1188
|
+
await db.close()
|
|
1189
|
+
})
|
|
1190
|
+
|
|
1191
|
+
test('behavior: settles a retry when Stripe confirms the identifier already exists', async () => {
|
|
1192
|
+
const db = create()
|
|
1193
|
+
await db.migrate()
|
|
1194
|
+
await RequestUsage.insertPending(db, {
|
|
1195
|
+
bucketStart,
|
|
1196
|
+
deltaCount: 6,
|
|
1197
|
+
environment: 'production',
|
|
1198
|
+
eventTimestamp: bucketStart,
|
|
1199
|
+
identifier: 'rq_production_deadbeef0002_0_0',
|
|
1200
|
+
orgId: 'org_1',
|
|
1201
|
+
sequence: 0,
|
|
1202
|
+
stripeCustomerId: 'cus_1',
|
|
1203
|
+
})
|
|
1204
|
+
const { stripe } = stubStripe({
|
|
1205
|
+
meterEvent({ identifier }) {
|
|
1206
|
+
throw new Error(`An event already exists with identifier ${identifier}.`)
|
|
1207
|
+
},
|
|
1208
|
+
subscriptions: [],
|
|
1209
|
+
})
|
|
1210
|
+
expect(
|
|
1211
|
+
await Billing.createRequestUsageReporter({
|
|
1212
|
+
db,
|
|
1213
|
+
now,
|
|
1214
|
+
readCounts: async () => [],
|
|
1215
|
+
stripe,
|
|
1216
|
+
}).tick(),
|
|
1217
|
+
).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
|
|
1218
|
+
expect((await RequestUsage.getBucket(db, { bucketStart, environment: 'production', orgId: 'org_1' }))?.reportedCount).toBe(6) // prettier-ignore
|
|
993
1219
|
await db.close()
|
|
994
1220
|
})
|
|
995
1221
|
})
|