tapimo 0.15.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +896 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +33 -33
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +454 -1
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +10 -4
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +24 -4
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +99 -103
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +5 -5
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +1 -19
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +93 -56
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +10 -10
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/rpc.js +45 -11
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +12 -12
- package/dist/apps/data/routes/valuation.d.ts +30 -30
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +1 -1
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +18 -11
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +3 -3
- package/dist/apps/management/App.d.ts +3043 -2198
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +16 -4
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +24 -24
- package/dist/apps/management/routes/invite-links.d.ts +66 -66
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +20 -20
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +76 -76
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +7 -9
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +119 -119
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +16 -3
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +90 -0
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +187 -135
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +418 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
- package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.js +65 -44
- package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +73 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +212 -85
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +4 -1
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +353 -42
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/apps/verified-tokens.test.ts +32 -0
- package/src/admin/apps/verified-tokens.ts +30 -4
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/__root.tsx +1 -1
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +35 -4
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
- package/src/admin/ui.generated.ts +99 -104
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/App.test.ts +26 -0
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +153 -2
- package/src/apps/data/routes/fee-amm.ts +132 -62
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +34 -2
- package/src/apps/data/routes/rpc.ts +47 -10
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
- package/src/apps/data/routes/webhooks.test.ts +18 -3
- package/src/apps/data/routes/webhooks.ts +27 -13
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
- package/src/apps/management/routes/verified-token-requests.ts +7 -10
- package/src/apps/mcp.test.ts +108 -25
- package/src/apps/mcp.ts +15 -3
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +507 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +133 -0
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
- package/src/db/tables/verifiedTokenRequests.ts +80 -44
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +383 -8
- package/src/internal/Auth.ts +272 -99
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1299 -18
- package/src/internal/routes/providers/relay.ts +424 -39
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import type { Address } from 'viem'
|
|
2
|
+
import * as z from 'zod/mini'
|
|
3
|
+
|
|
4
|
+
import * as EarnSharePrices from './EarnSharePrices.js'
|
|
5
|
+
import * as Schema from './Schema.js'
|
|
6
|
+
import type * as Tidx from './Tidx.js'
|
|
7
|
+
import type * as Viem from './Viem.js'
|
|
8
|
+
|
|
9
|
+
/** Reads outgoing shares not already accounted for by the wallet's own vault exits. */
|
|
10
|
+
export async function read(tidx: Tidx.Client, options: read.Options) {
|
|
11
|
+
const result = await tidx.fetch({
|
|
12
|
+
engine: 'clickhouse',
|
|
13
|
+
// Dynamic addresses and bounds are validated by the owning route and registry.
|
|
14
|
+
// Aggregate each branch to avoid row truncation without exceeding TIDX's query-nesting limit.
|
|
15
|
+
query: `
|
|
16
|
+
WITH candidates AS (
|
|
17
|
+
SELECT DISTINCT tx_hash FROM token_transfers
|
|
18
|
+
WHERE token = '${options.shareToken.toLowerCase()}'
|
|
19
|
+
AND "from" = '${options.account}' AND "to" != '${options.account}'
|
|
20
|
+
AND toUInt256(amount) > 0
|
|
21
|
+
AND block_num > ${options.startBlockNumber} AND block_num <= ${options.blockNumber}
|
|
22
|
+
)
|
|
23
|
+
SELECT toJSONString(groupArray(tuple('transfer', tx_hash, log_idx, "from", "to",
|
|
24
|
+
toString(toUInt256(amount)), '0', block_num))) AS events
|
|
25
|
+
FROM token_transfers
|
|
26
|
+
WHERE token = '${options.shareToken.toLowerCase()}' AND tx_hash IN (SELECT tx_hash FROM candidates)
|
|
27
|
+
AND toUInt256(amount) > 0
|
|
28
|
+
AND block_num > ${options.startBlockNumber} AND block_num <= ${options.blockNumber}
|
|
29
|
+
UNION ALL
|
|
30
|
+
SELECT toJSONString(groupArray(tuple('withdrawal', tx_hash, log_idx, caller, receiver,
|
|
31
|
+
toString(toUInt256(earnShares)), toString(toUInt256(assets)), block_num))) AS events
|
|
32
|
+
FROM Redeemed
|
|
33
|
+
WHERE address = '${options.vault}'
|
|
34
|
+
AND tx_hash IN (SELECT tx_hash FROM candidates)
|
|
35
|
+
AND block_num > ${options.startBlockNumber} AND block_num <= ${options.blockNumber}
|
|
36
|
+
UNION ALL
|
|
37
|
+
SELECT toJSONString(groupArray(tuple('withdrawal', tx_hash, log_idx, caller, receiver,
|
|
38
|
+
toString(toUInt256(earnSharesBurned)), toString(toUInt256(assets)), block_num))) AS events
|
|
39
|
+
FROM WithdrewExact
|
|
40
|
+
WHERE address = '${options.vault}'
|
|
41
|
+
AND tx_hash IN (SELECT tx_hash FROM candidates)
|
|
42
|
+
AND block_num > ${options.startBlockNumber} AND block_num <= ${options.blockNumber}
|
|
43
|
+
UNION ALL
|
|
44
|
+
SELECT toJSONString(groupArray(tuple('request', tx_hash, log_idx, requester, receiver,
|
|
45
|
+
toString(toUInt256(earnShares)), '0', block_num))) AS events
|
|
46
|
+
FROM RedeemRequested
|
|
47
|
+
WHERE address = '${options.vault}' AND requester = '${options.account}'
|
|
48
|
+
AND tx_hash IN (SELECT tx_hash FROM candidates)
|
|
49
|
+
AND block_num > ${options.startBlockNumber} AND block_num <= ${options.blockNumber}
|
|
50
|
+
` as string,
|
|
51
|
+
signatures: [
|
|
52
|
+
'event Redeemed(address indexed caller,address indexed receiver,uint256 earnShares,uint256 assets)',
|
|
53
|
+
'event WithdrewExact(address indexed caller,address indexed receiver,uint256 assets,uint256 earnSharesBurned)',
|
|
54
|
+
'event RedeemRequested(bytes32 indexed requestId,address indexed requester,address indexed receiver,uint256 earnShares)',
|
|
55
|
+
],
|
|
56
|
+
})
|
|
57
|
+
if (result.rows.length !== 4) throw new Error('TIDX returned incomplete Earn withdrawal history.')
|
|
58
|
+
const tuples = result.rows.flatMap((row) =>
|
|
59
|
+
z.array(schema.Event).parse(JSON.parse(String(row['events']))),
|
|
60
|
+
)
|
|
61
|
+
return classify({
|
|
62
|
+
...options,
|
|
63
|
+
events: tuples.map(
|
|
64
|
+
([kind, transactionHash, logIndex, sender, receiver, shares, assets, blockNumber]) => ({
|
|
65
|
+
assets: BigInt(assets),
|
|
66
|
+
blockNumber,
|
|
67
|
+
kind,
|
|
68
|
+
logIndex,
|
|
69
|
+
receiver,
|
|
70
|
+
sender,
|
|
71
|
+
shares: BigInt(shares),
|
|
72
|
+
transactionHash,
|
|
73
|
+
}),
|
|
74
|
+
),
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export declare namespace read {
|
|
79
|
+
/** Scope of one wallet's indexed share history. */
|
|
80
|
+
type Options = {
|
|
81
|
+
/** Wallet whose shares fund withdrawals. */
|
|
82
|
+
account: Address
|
|
83
|
+
/** Inclusive indexed upper bound. */
|
|
84
|
+
blockNumber: number
|
|
85
|
+
/** Share token belonging to the vault. */
|
|
86
|
+
shareToken: Address
|
|
87
|
+
/** Exclusive indexed lower bound. */
|
|
88
|
+
startBlockNumber: number
|
|
89
|
+
/** Vault emitting withdrawal events. */
|
|
90
|
+
vault: Address
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Values transfers at historical redemption quotes, retaining actual proceeds for proven vault exits. */
|
|
95
|
+
export async function value(client: Viem.getClient.ReturnType, options: value.Options) {
|
|
96
|
+
let total = 0n
|
|
97
|
+
// Bound archive RPC fan-out; missing quotes must never silently become zero withdrawals.
|
|
98
|
+
for (let index = 0; index < options.withdrawals.length; index += 4) {
|
|
99
|
+
const amounts = await Promise.all(
|
|
100
|
+
options.withdrawals.slice(index, index + 4).map(async (withdrawal) => {
|
|
101
|
+
if (withdrawal.assets !== undefined) return withdrawal.assets
|
|
102
|
+
try {
|
|
103
|
+
return await client.earn.getRedeemQuote({
|
|
104
|
+
blockNumber: BigInt(withdrawal.blockNumber),
|
|
105
|
+
shareAmount: withdrawal.shares,
|
|
106
|
+
vault: options.vault,
|
|
107
|
+
})
|
|
108
|
+
} catch (error) {
|
|
109
|
+
if (EarnSharePrices.isUnavailable(error)) return undefined
|
|
110
|
+
throw error
|
|
111
|
+
}
|
|
112
|
+
}),
|
|
113
|
+
)
|
|
114
|
+
for (const amount of amounts) {
|
|
115
|
+
if (amount === undefined) return undefined
|
|
116
|
+
total += amount
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return total
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export declare namespace value {
|
|
123
|
+
/** Withdrawals and the vault used for historical asset valuation. */
|
|
124
|
+
type Options = {
|
|
125
|
+
/** Vault owning the transferred shares. */
|
|
126
|
+
vault: Address
|
|
127
|
+
/** Outgoing shares, with actual proceeds when unambiguous. */
|
|
128
|
+
withdrawals: readonly classify.Withdrawal[]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Separates already-accounted protocol exits from recipient-independent wallet withdrawals. */
|
|
133
|
+
export function classify(options: match.Options) {
|
|
134
|
+
const transactions = new Map<string, match.Event[]>()
|
|
135
|
+
for (const event of options.events) {
|
|
136
|
+
if (event.shares === 0n || (event.kind === 'transfer' && event.sender === event.receiver))
|
|
137
|
+
continue
|
|
138
|
+
const events = transactions.get(event.transactionHash) ?? []
|
|
139
|
+
events.push(event)
|
|
140
|
+
transactions.set(event.transactionHash, events)
|
|
141
|
+
}
|
|
142
|
+
const withdrawals: classify.Withdrawal[] = []
|
|
143
|
+
for (const events of transactions.values()) {
|
|
144
|
+
const outgoing = events
|
|
145
|
+
.filter((event) => event.kind === 'transfer' && event.sender === options.account)
|
|
146
|
+
.sort((a, b) => a.logIndex - b.logIndex)
|
|
147
|
+
const accounted = new Set<number>()
|
|
148
|
+
// Direct exits and async requests are accounted by protocol history, including later finalization or cancellation.
|
|
149
|
+
for (const exit of events
|
|
150
|
+
.filter((event) => event.kind !== 'transfer' && event.sender === options.account)
|
|
151
|
+
.sort((a, b) => a.logIndex - b.logIndex)) {
|
|
152
|
+
const transfer = outgoing.findLast(
|
|
153
|
+
(event) =>
|
|
154
|
+
event.receiver === options.vault &&
|
|
155
|
+
event.shares === exit.shares &&
|
|
156
|
+
event.logIndex < exit.logIndex &&
|
|
157
|
+
!accounted.has(event.logIndex),
|
|
158
|
+
)
|
|
159
|
+
if (transfer) accounted.add(transfer.logIndex)
|
|
160
|
+
}
|
|
161
|
+
const matched = match({ ...options, events })
|
|
162
|
+
for (const transfer of outgoing) {
|
|
163
|
+
if (accounted.has(transfer.logIndex)) continue
|
|
164
|
+
withdrawals.push({
|
|
165
|
+
assets: matched.find((exit) => exit.logIndex === transfer.logIndex)?.assets,
|
|
166
|
+
blockNumber: transfer.blockNumber,
|
|
167
|
+
logIndex: transfer.logIndex,
|
|
168
|
+
shares: transfer.shares,
|
|
169
|
+
transactionHash: transfer.transactionHash,
|
|
170
|
+
})
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return withdrawals
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export declare namespace classify {
|
|
177
|
+
/** Outgoing share value not already included in protocol withdrawal totals. */
|
|
178
|
+
type Withdrawal = Pick<match.Event, 'blockNumber' | 'logIndex' | 'shares' | 'transactionHash'> & {
|
|
179
|
+
/** Actual proceeds when matched; otherwise use a historical quote. */
|
|
180
|
+
assets: bigint | undefined
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Matches actual proceeds for single-funder, single-exit routes without a spender allowlist. */
|
|
185
|
+
export function match(options: match.Options) {
|
|
186
|
+
const matched: match.Withdrawal[] = []
|
|
187
|
+
for (const exit of options.events) {
|
|
188
|
+
if (exit.kind !== 'withdrawal') continue
|
|
189
|
+
if (exit.sender === options.account || exit.sender === options.vault) continue
|
|
190
|
+
// Zero-value transfers cannot fund an exit and must not make a valid route ambiguous.
|
|
191
|
+
const events = options.events.filter(
|
|
192
|
+
(event) => event.transactionHash === exit.transactionHash && event.shares > 0n,
|
|
193
|
+
)
|
|
194
|
+
if (
|
|
195
|
+
events.filter((event) => event.kind === 'withdrawal' && event.sender === exit.sender)
|
|
196
|
+
.length !== 1
|
|
197
|
+
)
|
|
198
|
+
continue
|
|
199
|
+
const received = events.filter(
|
|
200
|
+
(event) => event.kind === 'transfer' && event.receiver === exit.sender,
|
|
201
|
+
)
|
|
202
|
+
const sent = events.filter((event) => event.kind === 'transfer' && event.sender === exit.sender)
|
|
203
|
+
// Requiring exactly two share movements prevents attributing another funder's or a batched exit's assets to this wallet.
|
|
204
|
+
if (received.length !== 1 || sent.length !== 1) continue
|
|
205
|
+
const incoming = received[0]!
|
|
206
|
+
const outgoing = sent[0]!
|
|
207
|
+
if (
|
|
208
|
+
incoming.sender !== options.account ||
|
|
209
|
+
outgoing.receiver !== options.vault ||
|
|
210
|
+
incoming.shares === 0n ||
|
|
211
|
+
incoming.shares !== exit.shares ||
|
|
212
|
+
outgoing.shares !== exit.shares ||
|
|
213
|
+
incoming.logIndex >= outgoing.logIndex ||
|
|
214
|
+
outgoing.logIndex >= exit.logIndex
|
|
215
|
+
)
|
|
216
|
+
continue
|
|
217
|
+
matched.push({
|
|
218
|
+
assets: exit.assets,
|
|
219
|
+
logIndex: incoming.logIndex,
|
|
220
|
+
transactionHash: exit.transactionHash,
|
|
221
|
+
})
|
|
222
|
+
}
|
|
223
|
+
return matched
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export declare namespace match {
|
|
227
|
+
/** A decoded event scoped to the selected share token or vault. */
|
|
228
|
+
type Event = {
|
|
229
|
+
/** Assets paid by a vault exit; zero for share transfers. */
|
|
230
|
+
assets: bigint
|
|
231
|
+
/** Indexed block used for historical share valuation. */
|
|
232
|
+
blockNumber: number
|
|
233
|
+
/** Decoded event family. */
|
|
234
|
+
kind: 'transfer' | 'withdrawal' | 'request'
|
|
235
|
+
/** Transaction-local log position. */
|
|
236
|
+
logIndex: number
|
|
237
|
+
/** Transfer recipient or withdrawal receiver. */
|
|
238
|
+
receiver: Address
|
|
239
|
+
/** Share sender or withdrawal caller. */
|
|
240
|
+
sender: Address
|
|
241
|
+
/** Shares transferred or burned. */
|
|
242
|
+
shares: bigint
|
|
243
|
+
/** Transaction containing this event. */
|
|
244
|
+
transactionHash: z.output<typeof Schema.Hash>
|
|
245
|
+
}
|
|
246
|
+
/** Matched wallet debit and corresponding withdrawal proceeds. */
|
|
247
|
+
type Withdrawal = Pick<Event, 'assets' | 'logIndex' | 'transactionHash'>
|
|
248
|
+
/** Complete candidate transactions for one wallet and vault. */
|
|
249
|
+
type Options = Pick<read.Options, 'account' | 'vault'> & {
|
|
250
|
+
/** All share transfers and vault exits in candidate transactions. */
|
|
251
|
+
events: readonly Event[]
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
namespace schema {
|
|
256
|
+
export const Event = z.tuple([
|
|
257
|
+
z.union([z.literal('transfer'), z.literal('withdrawal'), z.literal('request')]),
|
|
258
|
+
Schema.Hash,
|
|
259
|
+
z.number().check(z.int(), z.nonnegative()),
|
|
260
|
+
Schema.Address,
|
|
261
|
+
Schema.Address,
|
|
262
|
+
Schema.DecimalString,
|
|
263
|
+
Schema.DecimalString,
|
|
264
|
+
z.number().check(z.int(), z.nonnegative()),
|
|
265
|
+
])
|
|
266
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Context as hono_Context } from 'hono'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns the request's `waitUntil` where the runtime provides an execution
|
|
5
|
+
* context, so background work outlives the response; `undefined` elsewhere,
|
|
6
|
+
* where callers either await the work or let it run unattended.
|
|
7
|
+
*/
|
|
8
|
+
export function waitUntil(c: waitUntil.Context): waitUntil.ReturnType {
|
|
9
|
+
// `c.executionCtx` throws in runtimes without one.
|
|
10
|
+
try {
|
|
11
|
+
const context = c.executionCtx
|
|
12
|
+
return context ? context.waitUntil.bind(context) : undefined
|
|
13
|
+
} catch {
|
|
14
|
+
return undefined
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export declare namespace waitUntil {
|
|
19
|
+
/** A Hono context, or any holder of an optional Workers execution context. */
|
|
20
|
+
type Context =
|
|
21
|
+
| Pick<hono_Context, 'executionCtx'>
|
|
22
|
+
| { executionCtx?: ExecutionContext | undefined }
|
|
23
|
+
|
|
24
|
+
/** The bound `waitUntil`, or `undefined` where the runtime has none. */
|
|
25
|
+
type ReturnType = ((promise: Promise<unknown>) => void) | undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** The subset of a Workers execution context this module relies on. */
|
|
29
|
+
type ExecutionContext = {
|
|
30
|
+
waitUntil(promise: Promise<unknown>): void
|
|
31
|
+
}
|
package/src/internal/Log.test.ts
CHANGED
|
@@ -20,6 +20,149 @@ function stable(entry: Log.Entry) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
describe('middleware', () => {
|
|
23
|
+
test.each([
|
|
24
|
+
['/v1/tokenlist', '/v1/tokenlist'],
|
|
25
|
+
['/v1/routes/transfers/:id', '/v1/routes/transfers/transfer_123'],
|
|
26
|
+
])('attributes early errors to the matched %s route', async (route, path) => {
|
|
27
|
+
const entries: Log.Entry[] = []
|
|
28
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
29
|
+
api.use('*', async (c) =>
|
|
30
|
+
Response.error(c, { code: 'request_timeout', message: 'Request timed out', status: 504 }),
|
|
31
|
+
)
|
|
32
|
+
api.get(route, (c) => c.json({ ok: true }))
|
|
33
|
+
|
|
34
|
+
const response = await api.request(path)
|
|
35
|
+
|
|
36
|
+
expect(response.status).toMatchInlineSnapshot(`504`)
|
|
37
|
+
expect(entries.map((entry) => entry.route)).toEqual([route])
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
test.each([
|
|
41
|
+
['/rpc/relay', '/rpc/relay'],
|
|
42
|
+
['/rpc/relay/:chainId', '/rpc/relay/4217'],
|
|
43
|
+
['/rpc/sponsor', '/rpc/sponsor'],
|
|
44
|
+
['/rpc/sponsor/:chainId', '/rpc/sponsor/4217'],
|
|
45
|
+
])('attributes early errors to the ALL endpoint %s', async (route, path) => {
|
|
46
|
+
const entries: Log.Entry[] = []
|
|
47
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
48
|
+
api.use('*', async (c) =>
|
|
49
|
+
Response.error(c, { code: 'request_timeout', message: 'Request timed out', status: 504 }),
|
|
50
|
+
)
|
|
51
|
+
api.all(route, (c) => c.json({ ok: true }))
|
|
52
|
+
|
|
53
|
+
const response = await api.request(path, { method: 'POST' })
|
|
54
|
+
|
|
55
|
+
expect(response.status).toMatchInlineSnapshot(`504`)
|
|
56
|
+
expect(entries.map((entry) => entry.route)).toEqual([route])
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
test.each([
|
|
60
|
+
{ basePath: '/', method: 'GET' },
|
|
61
|
+
{ basePath: '/', method: 'POST' },
|
|
62
|
+
{ basePath: '/api', method: 'GET' },
|
|
63
|
+
{ basePath: '/api', method: 'POST' },
|
|
64
|
+
])(
|
|
65
|
+
'attributes early $method errors to wildcard endpoints mounted at $basePath',
|
|
66
|
+
async ({ basePath, method }) => {
|
|
67
|
+
const entries: Log.Entry[] = []
|
|
68
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
69
|
+
api.use('*', async (c) =>
|
|
70
|
+
Response.error(c, { code: 'request_timeout', message: 'Request timed out', status: 504 }),
|
|
71
|
+
)
|
|
72
|
+
const auth = new Hono()
|
|
73
|
+
.use('*', (_c, next) => next())
|
|
74
|
+
.use('/v1/auth/*', (_c, next) => next())
|
|
75
|
+
.on(['GET', 'POST'], '/v1/auth/*', (c) => c.text('auth'))
|
|
76
|
+
api.route(basePath, auth)
|
|
77
|
+
const prefix = basePath === '/' ? '' : basePath
|
|
78
|
+
|
|
79
|
+
const response = await api.request(`${prefix}/v1/auth/get-session`, { method })
|
|
80
|
+
|
|
81
|
+
expect(response.status).toMatchInlineSnapshot(`504`)
|
|
82
|
+
expect(entries.map((entry) => entry.route)).toEqual([`${prefix}/v1/auth/*`])
|
|
83
|
+
},
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
test('prefers an earlier wildcard endpoint to an unreached concrete endpoint', async () => {
|
|
87
|
+
const entries: Log.Entry[] = []
|
|
88
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
89
|
+
api.use('*', async (c) =>
|
|
90
|
+
Response.error(c, { code: 'request_timeout', message: 'Request timed out', status: 504 }),
|
|
91
|
+
)
|
|
92
|
+
api.post('/v1/auth/*', (c) => c.text('auth'))
|
|
93
|
+
api.all('/v1/auth/get-session', (c) => c.text('later endpoint'))
|
|
94
|
+
|
|
95
|
+
const response = await api.request('/v1/auth/get-session', { method: 'POST' })
|
|
96
|
+
|
|
97
|
+
expect(response.status).toMatchInlineSnapshot(`504`)
|
|
98
|
+
expect(entries.map((entry) => entry.route)).toMatchInlineSnapshot(`
|
|
99
|
+
[
|
|
100
|
+
"/v1/auth/*",
|
|
101
|
+
]
|
|
102
|
+
`)
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
test.each([
|
|
106
|
+
{ early: false, fallback: '*', method: 'GET', route: '/v1/tokenlist' },
|
|
107
|
+
{ early: true, fallback: '*', method: 'GET', route: '/v1/tokenlist' },
|
|
108
|
+
{ early: false, fallback: '/v1/auth/*', method: 'POST', route: '/v1/auth/siwe/challenge' },
|
|
109
|
+
{ early: true, fallback: '/v1/auth/*', method: 'POST', route: '/v1/auth/siwe/challenge' },
|
|
110
|
+
])(
|
|
111
|
+
'preserves $route before $fallback with early=$early',
|
|
112
|
+
async ({ early, fallback, method, route }) => {
|
|
113
|
+
const entries: Log.Entry[] = []
|
|
114
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
115
|
+
if (early)
|
|
116
|
+
api.use('*', async (c) =>
|
|
117
|
+
Response.error(c, { code: 'request_timeout', message: 'Request timed out', status: 504 }),
|
|
118
|
+
)
|
|
119
|
+
api.on(method, route, (c) => c.json({ ok: true }))
|
|
120
|
+
api.route(
|
|
121
|
+
'/',
|
|
122
|
+
new Hono().on(method, fallback, (c) => c.text('fallback')),
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
const response = await api.request(route, { method })
|
|
126
|
+
|
|
127
|
+
expect(response.status).toBe(early ? 504 : 200)
|
|
128
|
+
expect(entries.map((entry) => entry.route)).toEqual([route])
|
|
129
|
+
},
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
test('uses the responding endpoint after an earlier route calls next', async () => {
|
|
133
|
+
const entries: Log.Entry[] = []
|
|
134
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
135
|
+
api.get('/things/:id', (_c, next) => next())
|
|
136
|
+
api.get('/things/special', (c) => c.text('special'))
|
|
137
|
+
api.get('*', (c) => c.text('fallback'))
|
|
138
|
+
|
|
139
|
+
await api.request('/things/special')
|
|
140
|
+
|
|
141
|
+
expect(entries.map((entry) => entry.route)).toMatchInlineSnapshot(`
|
|
142
|
+
[
|
|
143
|
+
"/things/special",
|
|
144
|
+
]
|
|
145
|
+
`)
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
test.each(['GET', 'ALL'])(
|
|
149
|
+
'preserves a %s wildcard that actually handles the request',
|
|
150
|
+
async (method) => {
|
|
151
|
+
const entries: Log.Entry[] = []
|
|
152
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
153
|
+
api.get('/things/:id', (_c, next) => next())
|
|
154
|
+
api.on(method, '/things/*', (c) => c.text('fallback'))
|
|
155
|
+
|
|
156
|
+
await api.request('/things/example')
|
|
157
|
+
|
|
158
|
+
expect(entries.map((entry) => entry.route)).toMatchInlineSnapshot(`
|
|
159
|
+
[
|
|
160
|
+
"/things/*",
|
|
161
|
+
]
|
|
162
|
+
`)
|
|
163
|
+
},
|
|
164
|
+
)
|
|
165
|
+
|
|
23
166
|
test('reports recovered request errors without changing the response', async () => {
|
|
24
167
|
const causes: Error[] = []
|
|
25
168
|
const entries: Log.Entry[] = []
|
|
@@ -187,6 +330,73 @@ describe('middleware', () => {
|
|
|
187
330
|
`)
|
|
188
331
|
})
|
|
189
332
|
|
|
333
|
+
test('includes the presented credential before a principal resolves', async () => {
|
|
334
|
+
const entries: Log.Entry[] = []
|
|
335
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
336
|
+
api.use('*', async (c, next) => {
|
|
337
|
+
c.set('credential', 'api_key')
|
|
338
|
+
await next()
|
|
339
|
+
})
|
|
340
|
+
api.get('/secure', (c) =>
|
|
341
|
+
Response.error(c, { code: 'request_timeout', message: 'Request timed out', status: 504 }),
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
await api.request('/secure')
|
|
345
|
+
|
|
346
|
+
expect(stable(entries[0]!)).toMatchInlineSnapshot(`
|
|
347
|
+
{
|
|
348
|
+
"credential": "api_key",
|
|
349
|
+
"errorCode": "request_timeout",
|
|
350
|
+
"level": "error",
|
|
351
|
+
"method": "GET",
|
|
352
|
+
"path": "/secure",
|
|
353
|
+
"route": "/secure",
|
|
354
|
+
"status": 504,
|
|
355
|
+
}
|
|
356
|
+
`)
|
|
357
|
+
})
|
|
358
|
+
|
|
359
|
+
test('emits one canceled entry when the client disconnects first', async () => {
|
|
360
|
+
const entries: Log.Entry[] = []
|
|
361
|
+
const api = app({ emit: (entry) => void entries.push(entry) })
|
|
362
|
+
const controller = new AbortController()
|
|
363
|
+
const release = Promise.withResolvers<void>()
|
|
364
|
+
api.use('*', async (c, next) => {
|
|
365
|
+
c.set('credential', 'api_key')
|
|
366
|
+
await next()
|
|
367
|
+
})
|
|
368
|
+
api.get('/slow', async (c) => {
|
|
369
|
+
await Timing.time(c, 'auth_key', () => release.promise)
|
|
370
|
+
return c.json({ ok: true }, 200)
|
|
371
|
+
})
|
|
372
|
+
|
|
373
|
+
const response = api.request('/slow', { signal: controller.signal })
|
|
374
|
+
await Promise.resolve()
|
|
375
|
+
controller.abort()
|
|
376
|
+
const [canceled] = entries.map(stable)
|
|
377
|
+
release.resolve()
|
|
378
|
+
await response
|
|
379
|
+
|
|
380
|
+
expect(entries).toHaveLength(1)
|
|
381
|
+
expect({
|
|
382
|
+
...canceled,
|
|
383
|
+
pendingTimings: Object.keys(canceled?.pendingTimings ?? {}),
|
|
384
|
+
}).toMatchInlineSnapshot(`
|
|
385
|
+
{
|
|
386
|
+
"credential": "api_key",
|
|
387
|
+
"errorCode": "client_canceled",
|
|
388
|
+
"level": "warn",
|
|
389
|
+
"method": "GET",
|
|
390
|
+
"path": "/slow",
|
|
391
|
+
"pendingTimings": [
|
|
392
|
+
"auth_key",
|
|
393
|
+
],
|
|
394
|
+
"route": "/slow",
|
|
395
|
+
"status": 499,
|
|
396
|
+
}
|
|
397
|
+
`)
|
|
398
|
+
})
|
|
399
|
+
|
|
190
400
|
test('includes the MPP payment reason for paid calls', async () => {
|
|
191
401
|
const entries: Log.Entry[] = []
|
|
192
402
|
const api = app({ emit: (entry) => void entries.push(entry) })
|