tapimo 0.15.1 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +893 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +70 -70
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +529 -76
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +157 -157
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +205 -201
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +357 -357
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +125 -125
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +109 -127
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +83 -54
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +43 -43
- package/dist/apps/data/routes/receipts.d.ts +235 -235
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +77 -77
- package/dist/apps/data/routes/valuation.d.ts +32 -32
- package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +1 -1
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +31 -31
- package/dist/apps/management/App.d.ts +2909 -2064
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +257 -245
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +138 -138
- package/dist/apps/management/routes/invite-links.d.ts +172 -172
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +104 -104
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +125 -125
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
- package/dist/apps/management/routes/webhooks.d.ts +485 -485
- package/dist/apps/mpp/App.d.ts +44 -44
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/chains.d.ts +25 -25
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +171 -81
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +532 -480
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +413 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +57 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +182 -78
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +3 -0
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +352 -41
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +1 -0
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
- package/src/admin/ui.generated.ts +258 -202
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +134 -2
- package/src/apps/data/routes/fee-amm.ts +122 -60
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +2 -2
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.test.ts +12 -3
- package/src/apps/data/routes/webhooks.ts +2 -1
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +498 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +66 -5
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +291 -8
- package/src/internal/Auth.ts +227 -96
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1263 -41
- package/src/internal/routes/providers/relay.ts +423 -38
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { Hash, Hex } from 'ox'
|
|
1
2
|
import * as z from 'zod/mini'
|
|
2
3
|
|
|
4
|
+
import type * as Metrics from '../Metrics.js'
|
|
3
5
|
import * as Store from './Store.js'
|
|
4
6
|
|
|
5
7
|
/** Zod schemas owned by the rate-limit module. */
|
|
@@ -46,6 +48,10 @@ export namespace RateLimitStore {
|
|
|
46
48
|
key: string
|
|
47
49
|
/** Rate-limit policy. */
|
|
48
50
|
limit: Limit
|
|
51
|
+
/** Caller the quota belongs to, grouping its quotas on one object; defaults to the key. */
|
|
52
|
+
principal?: string | undefined
|
|
53
|
+
/** Keeps a deferred increment alive past the response; omitted, it runs unattended. */
|
|
54
|
+
waitUntil?: ((promise: Promise<unknown>) => void) | undefined
|
|
49
55
|
}
|
|
50
56
|
}
|
|
51
57
|
|
|
@@ -65,29 +71,199 @@ export function memory(options: memory.Options = {}): RateLimitStore {
|
|
|
65
71
|
return {
|
|
66
72
|
async consume(options) {
|
|
67
73
|
const time = now().getTime()
|
|
68
|
-
const
|
|
69
|
-
const bucket = Math.floor(time / window)
|
|
74
|
+
const { bucket, expiresAt, reset } = window(options.limit, time)
|
|
70
75
|
// The bucket isolates window counts if the backing store applies the TTL
|
|
71
76
|
// after the next window starts.
|
|
72
77
|
const count = await Store.increment(
|
|
73
78
|
store,
|
|
74
79
|
`ratelimit:${options.limit.period}:${bucket}:${options.key}`,
|
|
75
|
-
{
|
|
76
|
-
ttl: (bucket + 1) * window - time,
|
|
77
|
-
},
|
|
80
|
+
{ ttl: expiresAt - time },
|
|
78
81
|
)
|
|
79
|
-
|
|
82
|
+
return result(options.limit, count, reset)
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
}
|
|
80
86
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Creates a rate-limit store over quota Durable Objects, one object per
|
|
89
|
+
* principal holding a row per quota, so a caller's counters stay on one warm
|
|
90
|
+
* object across scopes and windows.
|
|
91
|
+
*/
|
|
92
|
+
export function durableObject(
|
|
93
|
+
namespace: durableObject.Namespace,
|
|
94
|
+
options: durableObject.Options = {},
|
|
95
|
+
): RateLimitStore {
|
|
96
|
+
const { metrics, name = (principal: string) => `tempo-api:rate-limiter:${principal}` } = options
|
|
97
|
+
// Last known count per object and quota for the current window, plus the
|
|
98
|
+
// increments this isolate has sent there and not yet heard back on.
|
|
99
|
+
const locals = new Map<string, Local>()
|
|
100
|
+
return {
|
|
101
|
+
async consume(options) {
|
|
102
|
+
const { bucket, reset } = window(options.limit, Date.now())
|
|
103
|
+
const object = name(options.principal ?? options.key)
|
|
104
|
+
const quota = `${options.limit.period}:${options.key}`
|
|
105
|
+
const local = localFor(locals, `${object}\n${quota}`, bucket)
|
|
106
|
+
// Unsettled increments may already be in the reported count; counting
|
|
107
|
+
// them again errs toward waiting, never toward admitting.
|
|
108
|
+
const known = (local.count ?? 0) + local.pending + 1
|
|
109
|
+
// Deferring needs a lifetime for the increment and fewer unanswered
|
|
110
|
+
// increments than the margin, which bounds any overshoot, even before
|
|
111
|
+
// the counter has reported a count for this window.
|
|
112
|
+
const deferred =
|
|
113
|
+
options.waitUntil !== undefined &&
|
|
114
|
+
local.pending < margin(options.limit) &&
|
|
115
|
+
defers(options.limit, known)
|
|
116
|
+
local.pending++
|
|
117
|
+
const start = performance.now()
|
|
118
|
+
// Stubs are request-scoped I/O objects in Workers, so resolve one per call.
|
|
119
|
+
const run = Store.durableObjectRetry(() =>
|
|
120
|
+
namespace.getByName(object).consume({ bucket, quota }),
|
|
121
|
+
).then(
|
|
122
|
+
(outcome) => {
|
|
123
|
+
if (local.count === undefined || outcome.count > local.count) local.count = outcome.count
|
|
124
|
+
// Best effort once the caller has stopped waiting: metrics buffer
|
|
125
|
+
// until the request flushes, so a late reply lands in a later flush
|
|
126
|
+
// or not at all.
|
|
127
|
+
metrics?.histogram('rate_limit_rpc_ms', performance.now() - start, { cold: outcome.cold })
|
|
128
|
+
metrics?.count('rate_limit_consume_count', 1, {
|
|
129
|
+
cold: outcome.cold,
|
|
130
|
+
deferred,
|
|
131
|
+
outcome: 'ok',
|
|
132
|
+
})
|
|
133
|
+
return outcome
|
|
134
|
+
},
|
|
135
|
+
(error: unknown) => {
|
|
136
|
+
// A fast rejection fails open upstream without the 300 ms timing
|
|
137
|
+
// marker, so it leaves its own signal here.
|
|
138
|
+
metrics?.count('rate_limit_consume_count', 1, { deferred, outcome: 'error' })
|
|
139
|
+
throw error
|
|
140
|
+
},
|
|
141
|
+
)
|
|
142
|
+
const settled = run
|
|
143
|
+
.catch(() => {})
|
|
144
|
+
.finally(() => {
|
|
145
|
+
local.pending--
|
|
146
|
+
})
|
|
147
|
+
if (!deferred) {
|
|
148
|
+
const outcome = await run
|
|
149
|
+
return result(options.limit, outcome.count, reset)
|
|
86
150
|
}
|
|
151
|
+
// Far from the limit the answer cannot change the response, so the
|
|
152
|
+
// request proceeds on the local estimate while the increment lands.
|
|
153
|
+
options.waitUntil?.(settled)
|
|
154
|
+
return result(options.limit, known, reset)
|
|
87
155
|
},
|
|
88
156
|
}
|
|
89
157
|
}
|
|
90
158
|
|
|
159
|
+
export declare namespace durableObject {
|
|
160
|
+
/** Quota Durable Object namespace. */
|
|
161
|
+
type Namespace = {
|
|
162
|
+
/** Gets the stub for one principal's object. */
|
|
163
|
+
getByName(name: string): Stub
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Quota Durable Object RPC surface. */
|
|
167
|
+
type Stub = {
|
|
168
|
+
/** Counts one request in the given window. */
|
|
169
|
+
consume(options: Stub.ConsumeOptions): Promise<Outcome>
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
namespace Stub {
|
|
173
|
+
/** Window selected by the caller, so the object needs no clock of its own. */
|
|
174
|
+
type ConsumeOptions = {
|
|
175
|
+
/** Fixed-window number; the object keeps only the newest it has seen per quota. */
|
|
176
|
+
bucket: number
|
|
177
|
+
/** Quota within the principal's object: the period plus the quota key. */
|
|
178
|
+
quota: string
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** One counted request. */
|
|
183
|
+
type Outcome = {
|
|
184
|
+
/** Whether the object was constructed to serve this call. */
|
|
185
|
+
cold: boolean
|
|
186
|
+
/** Requests counted in the window, including this one. */
|
|
187
|
+
count: number
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Options for creating a quota Durable Object store. */
|
|
191
|
+
type Options = {
|
|
192
|
+
/** Receives round-trip and cold-start metrics. */
|
|
193
|
+
metrics?: Metrics.Metrics | undefined
|
|
194
|
+
/** Maps a principal to its object name. */
|
|
195
|
+
name?: ((principal: string) => string) | undefined
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Limits at or below this always wait for the counter: one overshoot would be visible. */
|
|
200
|
+
const exactLimit = 10
|
|
201
|
+
|
|
202
|
+
/** Most unanswered increments one isolate may defer per quota before a consume waits for the counter. */
|
|
203
|
+
function margin(limit: Limit): number {
|
|
204
|
+
return Math.max(1, Math.ceil(limit.limit / 100))
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Whether a consume may proceed on the local estimate `known` (last known
|
|
209
|
+
* count plus unanswered increments plus this request) instead of waiting for
|
|
210
|
+
* the counter. Small limits and anything within the margin wait.
|
|
211
|
+
*/
|
|
212
|
+
export function defers(limit: Limit, known: number): boolean {
|
|
213
|
+
return limit.limit > exactLimit && known < limit.limit - margin(limit)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** Isolate-local view of one object's quota in the current window. */
|
|
217
|
+
type Local = {
|
|
218
|
+
/** Window the view belongs to. */
|
|
219
|
+
bucket: number
|
|
220
|
+
/** Largest count the counter has reported for the window; unknown until the first reply. */
|
|
221
|
+
count?: number | undefined
|
|
222
|
+
/** Increments sent and not yet settled. */
|
|
223
|
+
pending: number
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Cap on tracked identities per isolate; the oldest is dropped past it. */
|
|
227
|
+
const localsMax = 10_000
|
|
228
|
+
|
|
229
|
+
function localFor(locals: Map<string, Local>, identity: string, bucket: number): Local {
|
|
230
|
+
const existing = locals.get(identity)
|
|
231
|
+
if (existing?.bucket === bucket) return existing
|
|
232
|
+
if (!existing && locals.size >= localsMax) locals.delete(locals.keys().next().value as string)
|
|
233
|
+
const local: Local = { bucket, pending: 0 }
|
|
234
|
+
locals.set(identity, local)
|
|
235
|
+
return local
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** Fixed-window boundaries for one limit at one instant. */
|
|
239
|
+
export function window(limit: Limit, time: number): window.ReturnType {
|
|
240
|
+
const width = limit.period === 'second' ? 1_000 : 60_000
|
|
241
|
+
const bucket = Math.floor(time / width)
|
|
242
|
+
const expiresAt = (bucket + 1) * width
|
|
243
|
+
return { bucket, expiresAt, reset: Math.ceil(expiresAt / 1_000) }
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export declare namespace window {
|
|
247
|
+
/** One fixed window. */
|
|
248
|
+
type ReturnType = {
|
|
249
|
+
/** Window number since the epoch. */
|
|
250
|
+
bucket: number
|
|
251
|
+
/** Epoch milliseconds the window ends. */
|
|
252
|
+
expiresAt: number
|
|
253
|
+
/** Window end in Unix seconds, as published in `RateLimit-Reset`. */
|
|
254
|
+
reset: number
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function result(limit: Limit, count: number, reset: number): Result {
|
|
259
|
+
return {
|
|
260
|
+
allowed: count <= limit.limit,
|
|
261
|
+
limit: limit.limit,
|
|
262
|
+
remaining: Math.max(limit.limit - count, 0),
|
|
263
|
+
reset,
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
91
267
|
export declare namespace memory {
|
|
92
268
|
/** Options for creating an in-memory fixed-window rate-limit store. */
|
|
93
269
|
type Options = {
|
|
@@ -109,23 +285,68 @@ export type Binding = {
|
|
|
109
285
|
* when any configured layer denies; fails open when a binding errors.
|
|
110
286
|
*/
|
|
111
287
|
export async function edge(request: Request, options: edge.Options): Promise<Response | undefined> {
|
|
112
|
-
|
|
288
|
+
const check = async (run: () => Promise<{ success: boolean }>[]) => {
|
|
289
|
+
try {
|
|
290
|
+
const results = await Promise.all(run())
|
|
291
|
+
if (results.some((result) => !result.success))
|
|
292
|
+
return new Response('Rate limit exceeded', {
|
|
293
|
+
headers: { 'retry-after': '10' },
|
|
294
|
+
status: 429,
|
|
295
|
+
})
|
|
296
|
+
} catch (error) {
|
|
297
|
+
console.error('Edge rate limit check failed:', error)
|
|
298
|
+
}
|
|
299
|
+
return undefined
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (!options.resolvePartition)
|
|
303
|
+
return check(() => {
|
|
304
|
+
const checks: Promise<{ success: boolean }>[] = []
|
|
305
|
+
if (options.ip) checks.push(options.ip.limit({ key: clientKey(request) }))
|
|
306
|
+
const asn = clientAsn(request)
|
|
307
|
+
if (options.asn && asn !== undefined) checks.push(options.asn.limit({ key: `asn:${asn}` }))
|
|
308
|
+
if (options.global) checks.push(options.global.limit({ key: 'global' }))
|
|
309
|
+
return checks
|
|
310
|
+
})
|
|
311
|
+
|
|
312
|
+
const [global, network] = await Promise.all([
|
|
313
|
+
check(() => (options.global ? [options.global.limit({ key: 'global' })] : [])),
|
|
314
|
+
check(() => {
|
|
315
|
+
const checks: Promise<{ success: boolean }>[] = []
|
|
316
|
+
if (options.ip) checks.push(options.ip.limit({ key: clientKey(request) }))
|
|
317
|
+
const asn = clientAsn(request)
|
|
318
|
+
if (options.asn && asn !== undefined) checks.push(options.asn.limit({ key: `asn:${asn}` }))
|
|
319
|
+
return checks
|
|
320
|
+
}),
|
|
321
|
+
])
|
|
322
|
+
if (global) return global
|
|
323
|
+
if (!network) return undefined
|
|
324
|
+
|
|
325
|
+
// Credential lookups get a separate network budget so rotating invalid
|
|
326
|
+
// tokens cannot turn an exhausted transport bucket into backend fan-out.
|
|
327
|
+
const admission = await check(() => {
|
|
113
328
|
const checks: Promise<{ success: boolean }>[] = []
|
|
114
|
-
if (options.ip)
|
|
329
|
+
if (options.ip)
|
|
330
|
+
checks.push(options.ip.limit({ key: partitionKey(clientKey(request), 'credential-probe') }))
|
|
115
331
|
const asn = clientAsn(request)
|
|
116
|
-
if (options.asn && asn !== undefined)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
332
|
+
if (options.asn && asn !== undefined)
|
|
333
|
+
checks.push(options.asn.limit({ key: partitionKey(`asn:${asn}`, 'credential-probe') }))
|
|
334
|
+
return checks
|
|
335
|
+
})
|
|
336
|
+
if (admission) return network
|
|
337
|
+
|
|
338
|
+
const resolved = await options.resolvePartition()
|
|
339
|
+
if (resolved === undefined) return network
|
|
340
|
+
|
|
341
|
+
return check(() => {
|
|
342
|
+
const checks: Promise<{ success: boolean }>[] = []
|
|
343
|
+
if (options.ip)
|
|
344
|
+
checks.push(options.ip.limit({ key: partitionKey(clientKey(request), resolved) }))
|
|
345
|
+
const asn = clientAsn(request)
|
|
346
|
+
if (options.asn && asn !== undefined)
|
|
347
|
+
checks.push(options.asn.limit({ key: partitionKey(`asn:${asn}`, resolved) }))
|
|
348
|
+
return checks
|
|
349
|
+
})
|
|
129
350
|
}
|
|
130
351
|
|
|
131
352
|
export declare namespace edge {
|
|
@@ -137,12 +358,19 @@ export declare namespace edge {
|
|
|
137
358
|
global?: Binding | undefined
|
|
138
359
|
/** Per-client limit, keyed by IPv4 address or IPv6 /64 prefix. */
|
|
139
360
|
ip?: Binding | undefined
|
|
361
|
+
/** Resolves a confirmed credential partition when the shared network limit rejects. */
|
|
362
|
+
resolvePartition?: (() => Promise<string | undefined>) | undefined
|
|
140
363
|
}
|
|
141
364
|
}
|
|
142
365
|
|
|
143
366
|
/** Cloudflare-enriched request properties; absent outside Workers (tests, service bindings). */
|
|
144
367
|
type CfProperties = { asn?: number | undefined }
|
|
145
368
|
|
|
369
|
+
/** Hashes a network and credential partition into Cloudflare's 64-byte binding-key limit. */
|
|
370
|
+
function partitionKey(network: string, partition: string): string {
|
|
371
|
+
return Hash.sha256(Hex.fromString(`${network}:partition:${partition}`)).slice(2)
|
|
372
|
+
}
|
|
373
|
+
|
|
146
374
|
function clientAsn(request: Request): number | undefined {
|
|
147
375
|
const direct = (request as Request & { cf?: CfProperties }).cf?.asn
|
|
148
376
|
if (direct !== undefined) return direct
|
package/src/internal/Store.ts
CHANGED
|
@@ -891,12 +891,11 @@ function durableObjectStub(
|
|
|
891
891
|
}
|
|
892
892
|
|
|
893
893
|
/**
|
|
894
|
-
* Runs a Durable Object
|
|
895
|
-
* retryable
|
|
896
|
-
*
|
|
897
|
-
* stub: a stub that threw is disconnected.
|
|
894
|
+
* Runs a Durable Object call, retrying once when workerd marks the error
|
|
895
|
+
* retryable and not overloaded. Callers pass a thunk so the retry resolves a
|
|
896
|
+
* fresh stub: a stub that threw is disconnected.
|
|
898
897
|
*/
|
|
899
|
-
async function durableObjectRetry<value>(call: () => Promise<value>): Promise<value> {
|
|
898
|
+
export async function durableObjectRetry<value>(call: () => Promise<value>): Promise<value> {
|
|
900
899
|
try {
|
|
901
900
|
return await call()
|
|
902
901
|
} catch (error) {
|
|
@@ -97,3 +97,35 @@ describe('middleware', () => {
|
|
|
97
97
|
}
|
|
98
98
|
})
|
|
99
99
|
})
|
|
100
|
+
|
|
101
|
+
describe('record', () => {
|
|
102
|
+
test('adds observed durations under one metric', async () => {
|
|
103
|
+
const app = new Hono<{ Variables: Timing.Variables }>()
|
|
104
|
+
app.use('*', Timing.middleware())
|
|
105
|
+
app.get('/', async (c) => {
|
|
106
|
+
Timing.record('db', 12)
|
|
107
|
+
// Attribution survives awaited work inside the request.
|
|
108
|
+
await Promise.resolve()
|
|
109
|
+
Timing.record('db', 8)
|
|
110
|
+
return c.text('ok')
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
const response = await app.request('/')
|
|
114
|
+
const timing = response.headers.get('server-timing')
|
|
115
|
+
|
|
116
|
+
expect(timing?.match(/db/g)).toHaveLength(1)
|
|
117
|
+
expect(timing).toContain('db;dur=20.0')
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
test('ignores requests without timing middleware', async () => {
|
|
121
|
+
const app = new Hono<{ Variables: Timing.Variables }>()
|
|
122
|
+
app.get('/', (c) => {
|
|
123
|
+
Timing.record('db', 12)
|
|
124
|
+
return c.text('ok')
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
const response = await app.request('/')
|
|
128
|
+
|
|
129
|
+
expect(response.headers.get('server-timing')).toBeNull()
|
|
130
|
+
})
|
|
131
|
+
})
|
package/src/internal/Timing.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
1
2
|
import type { Context, MiddlewareHandler } from 'hono'
|
|
2
3
|
|
|
3
4
|
/** Hono variables used to collect Server-Timing metrics. */
|
|
@@ -49,6 +50,9 @@ export type Seed = {
|
|
|
49
50
|
|
|
50
51
|
const requestSeeds = new WeakMap<Request, Seed>()
|
|
51
52
|
|
|
53
|
+
/** Metrics of the request whose async continuation is currently running. */
|
|
54
|
+
const scopes = new AsyncLocalStorage<Metric[]>()
|
|
55
|
+
|
|
52
56
|
/** Seeds timings collected by an outer runtime onto the same request object. */
|
|
53
57
|
export function seed(request: Request, value: Seed): void {
|
|
54
58
|
requestSeeds.set(request, value)
|
|
@@ -69,7 +73,9 @@ export function middleware<
|
|
|
69
73
|
c.set('timingSums', new Map())
|
|
70
74
|
|
|
71
75
|
const start = performance.now()
|
|
72
|
-
|
|
76
|
+
// Downstream work runs inside the request's async scope so hooks without a
|
|
77
|
+
// context, such as database query observers, can still attribute to it.
|
|
78
|
+
await scopes.run(metrics, next)
|
|
73
79
|
metrics.push({ duration: performance.now() - start, name: 'request' })
|
|
74
80
|
for (const timing of outerActive) {
|
|
75
81
|
active.splice(active.indexOf(timing), 1)
|
|
@@ -144,6 +150,19 @@ export async function sum<environment extends Environment, value>(
|
|
|
144
150
|
}
|
|
145
151
|
}
|
|
146
152
|
|
|
153
|
+
/**
|
|
154
|
+
* Adds an already-measured duration to the current request's metric,
|
|
155
|
+
* accumulating repeats. Suits hooks that observe work they cannot wrap and
|
|
156
|
+
* have no request context of their own; a no-op outside a timed request.
|
|
157
|
+
*/
|
|
158
|
+
export function record(name: string, duration: number): void {
|
|
159
|
+
const metrics = scopes.getStore()
|
|
160
|
+
if (!metrics) return
|
|
161
|
+
const existing = metrics.find((metric) => metric.name === name)
|
|
162
|
+
if (existing) existing.duration += duration
|
|
163
|
+
else metrics.push({ duration, name })
|
|
164
|
+
}
|
|
165
|
+
|
|
147
166
|
function format(metrics: readonly Metric[]) {
|
|
148
167
|
return metrics
|
|
149
168
|
.map((metric) => `${name(metric.name)};dur=${metric.duration.toFixed(1)}`)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Hex } from 'ox'
|
|
2
|
+
import { describe, expectTypeOf, test } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import * as Tron from './Tron.js'
|
|
5
|
+
|
|
6
|
+
describe('createClient', () => {
|
|
7
|
+
test('exposes typed native Tron actions', () => {
|
|
8
|
+
const client = Tron.createClient({ urls: ['https://api.trongrid.io'] })
|
|
9
|
+
expectTypeOf(client.call).returns.toEqualTypeOf<Promise<Hex.Hex>>()
|
|
10
|
+
expectTypeOf(client.getTransactionReceipt).returns.resolves.toMatchTypeOf<
|
|
11
|
+
| {
|
|
12
|
+
blockNumber: number
|
|
13
|
+
id: string
|
|
14
|
+
receipt: { result?: string | undefined }
|
|
15
|
+
}
|
|
16
|
+
| undefined
|
|
17
|
+
>()
|
|
18
|
+
expectTypeOf(client.getBlock).returns.resolves.toMatchTypeOf<{
|
|
19
|
+
block_header: { raw_data: { number: number; timestamp: number } }
|
|
20
|
+
}>()
|
|
21
|
+
})
|
|
22
|
+
})
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Base58, Hash, Hex } from 'ox'
|
|
2
|
+
import { describe, expect, test } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import * as Tron from './Tron.js'
|
|
5
|
+
|
|
6
|
+
const usdt = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'
|
|
7
|
+
const address = '0xa614f803b6fd780986a42c78ec9c7f77e6ded13c'
|
|
8
|
+
|
|
9
|
+
describe('toEvmAddress', () => {
|
|
10
|
+
test('decodes the Tron USDT address without its network prefix', () => {
|
|
11
|
+
expect(Tron.toEvmAddress(usdt)).toMatchInlineSnapshot(
|
|
12
|
+
'"0xa614f803b6fd780986a42c78ec9c7f77e6ded13c"',
|
|
13
|
+
)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
test('rejects a changed checksum and ambiguous characters', () => {
|
|
17
|
+
expect(() => Tron.toEvmAddress(`${usdt.slice(0, -1)}k`)).toThrowErrorMatchingInlineSnapshot(
|
|
18
|
+
'[Tron.InvalidAddressError: Invalid Tron address.]',
|
|
19
|
+
)
|
|
20
|
+
expect(() =>
|
|
21
|
+
Tron.toEvmAddress('T0LAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj'),
|
|
22
|
+
).toThrowErrorMatchingInlineSnapshot('[Tron.InvalidAddressError: Invalid Tron address.]')
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('rejects a valid checksum for another network', () => {
|
|
26
|
+
const payload = Hex.concat('0x00', address)
|
|
27
|
+
const value = Base58.fromHex(
|
|
28
|
+
Hex.concat(payload, Hex.slice(Hash.sha256(Hash.sha256(payload)), 0, 4)),
|
|
29
|
+
)
|
|
30
|
+
expect(() => Tron.toEvmAddress(value)).toThrowErrorMatchingInlineSnapshot(
|
|
31
|
+
'[Tron.InvalidAddressError: Invalid Tron address.]',
|
|
32
|
+
)
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
describe('fromEvmAddress', () => {
|
|
37
|
+
test('encodes the Tron USDT address and zero address', () => {
|
|
38
|
+
expect(Tron.fromEvmAddress(address)).toMatchInlineSnapshot(
|
|
39
|
+
'"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"',
|
|
40
|
+
)
|
|
41
|
+
expect(Tron.fromEvmAddress(`0x${'00'.repeat(20)}`)).toMatchInlineSnapshot(
|
|
42
|
+
'"T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb"',
|
|
43
|
+
)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
test('rejects an ABI word in place of an address', () => {
|
|
47
|
+
expect(() => Tron.fromEvmAddress(`0x${'00'.repeat(32)}`)).toThrowErrorMatchingInlineSnapshot(
|
|
48
|
+
'[Tron.InvalidAddressError: Invalid Tron address.]',
|
|
49
|
+
)
|
|
50
|
+
})
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
describe('schema', () => {
|
|
54
|
+
test('validates source evidence with native network-prefixed addresses', () => {
|
|
55
|
+
const result = Tron.schema.Transaction.safeParse({
|
|
56
|
+
raw_data: {
|
|
57
|
+
contract: [
|
|
58
|
+
{
|
|
59
|
+
parameter: {
|
|
60
|
+
value: {
|
|
61
|
+
contract_address: `41${address.slice(2)}`,
|
|
62
|
+
data: 'a9059cbb',
|
|
63
|
+
owner_address: `41${'11'.repeat(20)}`,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
type: 'TriggerSmartContract',
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
ret: [{ contractRet: 'SUCCESS' }],
|
|
71
|
+
txID: 'aa'.repeat(32),
|
|
72
|
+
})
|
|
73
|
+
expect(result.success).toMatchInlineSnapshot('true')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
test('rejects missing evidence and malformed hexadecimal results', () => {
|
|
77
|
+
expect([
|
|
78
|
+
Tron.schema.Transaction.safeParse({}).success,
|
|
79
|
+
Tron.schema.Receipt.safeParse({}).success,
|
|
80
|
+
Tron.schema.Call.safeParse({ constant_result: ['xyz'], result: { result: true } }).success,
|
|
81
|
+
Tron.schema.Block.safeParse({
|
|
82
|
+
blockID: 'aa'.repeat(32),
|
|
83
|
+
block_header: { raw_data: { number: -1, timestamp: 100 } },
|
|
84
|
+
}).success,
|
|
85
|
+
]).toMatchInlineSnapshot(`
|
|
86
|
+
[
|
|
87
|
+
false,
|
|
88
|
+
false,
|
|
89
|
+
false,
|
|
90
|
+
false,
|
|
91
|
+
]
|
|
92
|
+
`)
|
|
93
|
+
})
|
|
94
|
+
})
|