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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Hono, type Context } from 'hono'
|
|
2
2
|
import { AbiEvent, AbiParameters, Hash, type Hex } from 'ox'
|
|
3
|
+
import { zeroAddress } from 'viem'
|
|
3
4
|
import { Abis, Addresses } from 'viem/tempo'
|
|
4
5
|
import * as z from 'zod/mini'
|
|
5
6
|
|
|
@@ -7,6 +8,7 @@ import type * as App from '../../../App.js'
|
|
|
7
8
|
import * as Auth from '../../../internal/Auth.js'
|
|
8
9
|
import * as Cache from '../../../internal/Cache.js'
|
|
9
10
|
import * as Cursor from '../../../internal/Cursor.js'
|
|
11
|
+
import type * as Log from '../../../internal/Log.js'
|
|
10
12
|
import * as OpenApi from '../../../internal/OpenApi.js'
|
|
11
13
|
import * as Response from '../../../internal/Response.js'
|
|
12
14
|
import * as Schema from '../../../internal/Schema.js'
|
|
@@ -319,7 +321,15 @@ export function feeAmm() {
|
|
|
319
321
|
return new Hono<App.Environment>()
|
|
320
322
|
.get(
|
|
321
323
|
'/v1/fee-amm/pools',
|
|
322
|
-
Auth.policy({
|
|
324
|
+
Auth.policy({
|
|
325
|
+
apiKey: {
|
|
326
|
+
bucket: 'fee-amm-pools',
|
|
327
|
+
rateLimit: { limit: 1, period: 'minute' },
|
|
328
|
+
scopes: ['data:read'],
|
|
329
|
+
},
|
|
330
|
+
mpp: { bucket: 'fee-amm-pools', rateLimit: { limit: 1, period: 'minute' } },
|
|
331
|
+
public: { bucket: 'fee-amm-pools', rateLimit: { limit: 1, period: 'minute' } },
|
|
332
|
+
}),
|
|
323
333
|
OpenApi.validate('query', schema.getFeeAmmPools.Query, {
|
|
324
334
|
code: 'query_invalid',
|
|
325
335
|
message: 'Invalid query parameters',
|
|
@@ -344,7 +354,7 @@ export function feeAmm() {
|
|
|
344
354
|
tags: ['Fee AMM'],
|
|
345
355
|
}),
|
|
346
356
|
Cache.response<App.Environment>({
|
|
347
|
-
cacheControl: Cache.policies.
|
|
357
|
+
cacheControl: Cache.policies.noStore,
|
|
348
358
|
name: 'tempo-api:fee-amm-pools:v2',
|
|
349
359
|
key: (c) => Cache.urlKey(c, schema.getFeeAmmPools.Query),
|
|
350
360
|
}),
|
|
@@ -687,35 +697,16 @@ declare namespace listPools {
|
|
|
687
697
|
}
|
|
688
698
|
}
|
|
689
699
|
|
|
690
|
-
/**
|
|
691
|
-
* The set of token addresses usable to pay transaction fees on a chain: the
|
|
692
|
-
* curated verified tokens that have at least one Fee AMM pool (i.e. appear as a
|
|
693
|
-
* `userToken` / topic2 in the FeeManager's `Mint` logs), plus the protocol
|
|
694
|
-
* default fee token (`pathUSD`), which pays fees without needing a pool.
|
|
695
|
-
* Addresses are lowercased to match the indexer's stored casing.
|
|
696
|
-
*
|
|
697
|
-
* The set is intentionally gated to the verified list rather than every pooled
|
|
698
|
-
* token: anyone can mint a single-mint spam pool, so the raw set of pool
|
|
699
|
-
* `userToken`s is unbounded (tens of thousands on busy chains) and those
|
|
700
|
-
* liquidity-less pools can't actually settle fees. Restricting to verified
|
|
701
|
-
* tokens keeps the set small (a handful of USD stablecoins), bounds the scan
|
|
702
|
-
* (the `topic2 IN (…)` candidate list is the verified list), and matches the
|
|
703
|
-
* tokens fees are realistically paid in.
|
|
704
|
-
*
|
|
705
|
-
* Memoized per chain and verified-snapshot version (the only inputs), so
|
|
706
|
-
* callers — e.g. the address balances endpoint — can flag which holdings are
|
|
707
|
-
* fee-usable without a second `/fee-amm/pools` query.
|
|
708
|
-
*/
|
|
700
|
+
/** Returns lowercased verified tokens currently usable for transaction fees. The protocol default (`pathUSD`) is always included. */
|
|
709
701
|
export async function feeTokenSet(
|
|
710
702
|
c: Context<App.Environment>,
|
|
711
703
|
chainId: z.output<typeof Schema.ChainId>,
|
|
712
704
|
): Promise<Set<string>> {
|
|
713
705
|
const store = c.get('store')
|
|
714
|
-
const tidx = c.get('getTidx')(chainId)
|
|
715
706
|
const snapshot = await VerifiedTokens.snapshot(c, chainId)
|
|
716
707
|
// pathUSD is always fee-usable; the verified tokens are the only other
|
|
717
708
|
// candidates we probe for a pool. With no verified candidates there is
|
|
718
|
-
// nothing to query
|
|
709
|
+
// nothing to query, so pathUSD stands alone.
|
|
719
710
|
const candidates = snapshot.list.map((token) => token.address.toLowerCase())
|
|
720
711
|
if (candidates.length === 0) return new Set([pathUsd])
|
|
721
712
|
|
|
@@ -725,36 +716,106 @@ export async function feeTokenSet(
|
|
|
725
716
|
Store.memoize(
|
|
726
717
|
async () => {
|
|
727
718
|
const tokens = new Set<string>([pathUsd])
|
|
728
|
-
|
|
729
|
-
//
|
|
730
|
-
//
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
query: `
|
|
737
|
-
SELECT 1 AS present
|
|
738
|
-
FROM logs
|
|
739
|
-
WHERE address = '${feeManager}' AND selector IN ('${mintTopic}', '${legacyMintTopic}')
|
|
740
|
-
AND topic2 = '${topic}'
|
|
741
|
-
LIMIT 1
|
|
742
|
-
` as string,
|
|
719
|
+
const validatorTokens = await getValidatorTokens(c, { chainId })
|
|
720
|
+
// Verified candidates prevent permissionless spam pools from expanding
|
|
721
|
+
// the lookup. Small batches also bound RPC fan-out for Zone clients.
|
|
722
|
+
const probes = candidates
|
|
723
|
+
.filter((address) => {
|
|
724
|
+
if (!validatorTokens.includes(address)) return true
|
|
725
|
+
tokens.add(address)
|
|
726
|
+
return false
|
|
743
727
|
})
|
|
744
|
-
|
|
728
|
+
.flatMap((userToken) =>
|
|
729
|
+
validatorTokens.map((validatorToken) => ({ userToken, validatorToken })),
|
|
730
|
+
)
|
|
731
|
+
const unresolved = new Map<string, unknown>()
|
|
732
|
+
for (let index = 0; index < probes.length; index += 8) {
|
|
733
|
+
const group = probes.slice(index, index + 8)
|
|
734
|
+
const results = await Promise.allSettled(
|
|
735
|
+
group.map(({ userToken, validatorToken }) =>
|
|
736
|
+
readPoolReserves(c, {
|
|
737
|
+
chainId,
|
|
738
|
+
userToken: userToken as z.output<typeof Schema.Address>,
|
|
739
|
+
validatorToken: validatorToken as z.output<typeof Schema.Address>,
|
|
740
|
+
}),
|
|
741
|
+
),
|
|
742
|
+
)
|
|
743
|
+
for (const [offset, result] of results.entries()) {
|
|
744
|
+
const userToken = group[offset]!.userToken
|
|
745
|
+
if (result.status === 'rejected') {
|
|
746
|
+
unresolved.set(userToken, result.reason)
|
|
747
|
+
continue
|
|
748
|
+
}
|
|
749
|
+
if (BigInt(result.value.userToken) > 0n && BigInt(result.value.validatorToken) > 0n) {
|
|
750
|
+
tokens.add(userToken)
|
|
751
|
+
unresolved.delete(userToken)
|
|
752
|
+
}
|
|
753
|
+
}
|
|
745
754
|
}
|
|
755
|
+
const failure = Array.from(unresolved).find(([address]) => !tokens.has(address))
|
|
756
|
+
if (failure) throw failure[1]
|
|
746
757
|
return Array.from(tokens)
|
|
747
758
|
},
|
|
748
759
|
{
|
|
749
|
-
key: `feeamm:
|
|
760
|
+
key: `feeamm:v3:${chainId}:fee-token-set:v:${snapshot.version}`,
|
|
750
761
|
store,
|
|
751
|
-
ttl: Ttl.
|
|
762
|
+
ttl: Ttl.seconds(30),
|
|
752
763
|
},
|
|
753
764
|
),
|
|
754
|
-
)
|
|
765
|
+
).catch((cause) => {
|
|
766
|
+
const failure = {
|
|
767
|
+
chainId,
|
|
768
|
+
failure: 'unknown',
|
|
769
|
+
id: 'rpc',
|
|
770
|
+
operation: 'feeTokenSet',
|
|
771
|
+
} satisfies Log.ProviderFailure
|
|
772
|
+
c.set('providerFailures', [...(c.get('providerFailures') ?? []), failure])
|
|
773
|
+
throw cause
|
|
774
|
+
})
|
|
755
775
|
return new Set(addresses)
|
|
756
776
|
}
|
|
757
777
|
|
|
778
|
+
/** Resolves the distinct fee tokens preferred by active validators. */
|
|
779
|
+
async function getValidatorTokens(
|
|
780
|
+
c: Context<App.Environment>,
|
|
781
|
+
options: getValidatorTokens.Options,
|
|
782
|
+
) {
|
|
783
|
+
const { chainId } = options
|
|
784
|
+
const client = c.get('getClient')(chainId)
|
|
785
|
+
const validators = await client.readContract({
|
|
786
|
+
abi: Abis.validatorConfig,
|
|
787
|
+
address: Addresses.validator,
|
|
788
|
+
functionName: 'getValidators',
|
|
789
|
+
})
|
|
790
|
+
const active = validators.filter((validator) => validator.active)
|
|
791
|
+
if (active.length === 0) return [pathUsd]
|
|
792
|
+
const preferred = await Promise.all(
|
|
793
|
+
active.map((validator) =>
|
|
794
|
+
client.readContract({
|
|
795
|
+
abi: Abis.feeManager,
|
|
796
|
+
address: Addresses.feeManager,
|
|
797
|
+
args: [validator.validatorAddress],
|
|
798
|
+
functionName: 'validatorTokens',
|
|
799
|
+
}),
|
|
800
|
+
),
|
|
801
|
+
)
|
|
802
|
+
return Array.from(
|
|
803
|
+
new Set(
|
|
804
|
+
preferred.map((address) =>
|
|
805
|
+
address.toLowerCase() === zeroAddress ? pathUsd : address.toLowerCase(),
|
|
806
|
+
),
|
|
807
|
+
),
|
|
808
|
+
)
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
declare namespace getValidatorTokens {
|
|
812
|
+
/** Options for resolving active validators' preferred fee tokens. */
|
|
813
|
+
type Options = {
|
|
814
|
+
/** Chain whose validator preferences should be read. */
|
|
815
|
+
chainId: z.output<typeof Schema.ChainId>
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
|
|
758
819
|
/**
|
|
759
820
|
* Reads a pool's current on-chain reserves via `FeeManager.getPool`, memoized
|
|
760
821
|
* briefly per pool. Reserves are best-effort decoration on the pool listing:
|
|
@@ -767,28 +828,37 @@ function getPoolReserves(
|
|
|
767
828
|
options: getPoolReserves.Options,
|
|
768
829
|
): Promise<getPoolReserves.Reserves | null> {
|
|
769
830
|
const { chainId, userToken, validatorToken } = options
|
|
770
|
-
const client = c.get('getClient')(chainId)
|
|
771
831
|
const store = c.get('store')
|
|
772
832
|
|
|
773
|
-
return Store.memoize(
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
833
|
+
return Store.memoize(() => readPoolReserves(c, { chainId, userToken, validatorToken }), {
|
|
834
|
+
key: `feeamm:v1:${chainId}:pool:${userToken}:${validatorToken}:reserves`,
|
|
835
|
+
store,
|
|
836
|
+
ttl: Ttl.seconds(30),
|
|
837
|
+
}).catch(() => null)
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/** Reads a pool's current on-chain reserves and propagates RPC failures. */
|
|
841
|
+
async function readPoolReserves(
|
|
842
|
+
c: Context<App.Environment>,
|
|
843
|
+
options: readPoolReserves.Options,
|
|
844
|
+
): Promise<getPoolReserves.Reserves> {
|
|
845
|
+
const { chainId, userToken, validatorToken } = options
|
|
846
|
+
const client = c.get('getClient')(chainId)
|
|
847
|
+
const pool = await client.readContract({
|
|
848
|
+
abi: Abis.feeAmm,
|
|
849
|
+
address: Addresses.feeManager,
|
|
850
|
+
args: [userToken, validatorToken],
|
|
851
|
+
functionName: 'getPool',
|
|
852
|
+
})
|
|
853
|
+
return {
|
|
854
|
+
userToken: pool.reserveUserToken.toString(),
|
|
855
|
+
validatorToken: pool.reserveValidatorToken.toString(),
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
declare namespace readPoolReserves {
|
|
860
|
+
/** Options for reading one fee pool. */
|
|
861
|
+
type Options = getPoolReserves.Options
|
|
792
862
|
}
|
|
793
863
|
|
|
794
864
|
declare namespace getPoolReserves {
|
|
@@ -346,18 +346,30 @@ async function findRecentTransactionHash() {
|
|
|
346
346
|
}
|
|
347
347
|
|
|
348
348
|
describe('GET /transactions/receipts?address=…', () => {
|
|
349
|
-
|
|
349
|
+
let account: string
|
|
350
|
+
|
|
351
|
+
beforeAll(async () => {
|
|
350
352
|
const client = TestApp.client()
|
|
351
|
-
//
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
353
|
+
// A replica can briefly return an empty head page. Require an indexed receipt before testing address filters.
|
|
354
|
+
account = await vi.waitFor(
|
|
355
|
+
async () => {
|
|
356
|
+
const response = await client.v1.transactions.receipts.$get(
|
|
357
|
+
{ query: { limit: '5' } },
|
|
358
|
+
{ headers: { ...TestApp.auth.headers, 'cache-control': 'no-store' } },
|
|
359
|
+
)
|
|
360
|
+
const body = await TestApp.json(response, Receipts.schema.getReceipts.Response)
|
|
361
|
+
expect(response.status).toBe(200)
|
|
362
|
+
expect(body.data.length).toBeGreaterThan(0)
|
|
363
|
+
const sender = body.data[0]!.sender
|
|
364
|
+
expect(sender).toMatch(/^0x[0-9a-f]{40}$/)
|
|
365
|
+
return sender
|
|
366
|
+
},
|
|
367
|
+
{ interval: 1_000, timeout: 30_000 },
|
|
355
368
|
)
|
|
356
|
-
|
|
357
|
-
expect(seedResponse.status).toBe(200)
|
|
358
|
-
const account = seed.data[0]!.sender
|
|
359
|
-
expect(account).toMatch(/^0x[0-9a-f]{40}$/)
|
|
369
|
+
})
|
|
360
370
|
|
|
371
|
+
test('returns receipts involving an address', async () => {
|
|
372
|
+
const client = TestApp.client()
|
|
361
373
|
const baseResponse = await client.v1.transactions.receipts.$get(
|
|
362
374
|
{ query: { address: account, limit: '5' } },
|
|
363
375
|
TestApp.auth,
|
|
@@ -390,15 +402,6 @@ describe('GET /transactions/receipts?address=…', () => {
|
|
|
390
402
|
|
|
391
403
|
test('narrows receipts by execution status', async () => {
|
|
392
404
|
const client = TestApp.client()
|
|
393
|
-
const seedResponse = await client.v1.transactions.receipts.$get(
|
|
394
|
-
{ query: { limit: '5' } },
|
|
395
|
-
TestApp.auth,
|
|
396
|
-
)
|
|
397
|
-
const seed = await TestApp.json(seedResponse, Receipts.schema.getReceipts.Response)
|
|
398
|
-
expect(seedResponse.status).toBe(200)
|
|
399
|
-
const account = seed.data[0]!.sender
|
|
400
|
-
expect(account).toMatch(/^0x[0-9a-f]{40}$/)
|
|
401
|
-
|
|
402
405
|
const response = await client.v1.transactions.receipts.$get(
|
|
403
406
|
{ query: { address: account, limit: '5', status: 'success' } },
|
|
404
407
|
TestApp.auth,
|
|
@@ -144,6 +144,38 @@ describe('POST /rpc', () => {
|
|
|
144
144
|
}
|
|
145
145
|
})
|
|
146
146
|
|
|
147
|
+
test('rejects oversized anonymous requests before proxying upstream', async () => {
|
|
148
|
+
const requests: Request[] = []
|
|
149
|
+
const server = await Relay.createServer(
|
|
150
|
+
RequestListener.fromFetchHandler((request) => {
|
|
151
|
+
requests.push(request)
|
|
152
|
+
return Response.json({ id: 1, jsonrpc: '2.0', result: '0x1' })
|
|
153
|
+
}),
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
const app = TestApp.create({ rpc: { url: server.url } })
|
|
158
|
+
const request = new Request('http://tempo-api.test/rpc', {
|
|
159
|
+
body: JSON.stringify({
|
|
160
|
+
id: 1,
|
|
161
|
+
jsonrpc: '2.0',
|
|
162
|
+
method: 'eth_call',
|
|
163
|
+
params: [`0x${'ab'.repeat(32_768)}`, 'latest'],
|
|
164
|
+
}),
|
|
165
|
+
method: 'POST',
|
|
166
|
+
})
|
|
167
|
+
expect(request.headers.get('content-length')).toBeNull()
|
|
168
|
+
|
|
169
|
+
const response = await app.fetch(request)
|
|
170
|
+
|
|
171
|
+
expect(response.status).toBe(413)
|
|
172
|
+
expect(await response.json()).toMatchObject({ error: { code: 'payload_too_large' } })
|
|
173
|
+
expect(requests).toHaveLength(0)
|
|
174
|
+
} finally {
|
|
175
|
+
await server.closeAsync()
|
|
176
|
+
}
|
|
177
|
+
})
|
|
178
|
+
|
|
147
179
|
test('routes by principal: a resolver sees the request principal and routes accordingly', async () => {
|
|
148
180
|
const fetch = mockRpc()
|
|
149
181
|
// A resolver that routes API-key principals to the private upstream and
|
|
@@ -1198,7 +1230,7 @@ describe('POST /rpc', () => {
|
|
|
1198
1230
|
{
|
|
1199
1231
|
"error": {
|
|
1200
1232
|
"code": "api_key_forbidden",
|
|
1201
|
-
"message": "API key missing required
|
|
1233
|
+
"message": "API key is missing required permissions: data:read. Use an API key with these scopes.",
|
|
1202
1234
|
},
|
|
1203
1235
|
}
|
|
1204
1236
|
`)
|
|
@@ -1499,7 +1531,7 @@ describe('POST /rpc/relay', () => {
|
|
|
1499
1531
|
{
|
|
1500
1532
|
"error": {
|
|
1501
1533
|
"code": "api_key_forbidden",
|
|
1502
|
-
"message": "API key missing required
|
|
1534
|
+
"message": "API key is missing required permissions: rpc-relay:read. Use an API key with these scopes.",
|
|
1503
1535
|
},
|
|
1504
1536
|
}
|
|
1505
1537
|
`)
|
|
@@ -278,9 +278,8 @@ async function handleRpc(c: Context<App.Environment>) {
|
|
|
278
278
|
const zoneToken = getZoneToken(c)
|
|
279
279
|
const apiKeyRequired = requiresApiKey(c)
|
|
280
280
|
const inspectBody = apiKeyRequired || Boolean(zone)
|
|
281
|
-
const inspection = inspectBody ? await
|
|
281
|
+
const inspection = inspectBody ? await inspectRpcRequest(c.req.raw) : undefined
|
|
282
282
|
if (inspection && inspection.result === undefined) {
|
|
283
|
-
await inspection.body?.cancel()
|
|
284
283
|
return Response.error(c, {
|
|
285
284
|
code: 'payload_too_large',
|
|
286
285
|
message: 'RPC requests requiring method inspection must not exceed 64 KiB.',
|
|
@@ -469,6 +468,38 @@ async function inspectNotificationOnly(request: Request): Promise<boolean> {
|
|
|
469
468
|
}
|
|
470
469
|
}
|
|
471
470
|
|
|
471
|
+
async function inspectRpcRequest(request: Request): Promise<RpcInspection> {
|
|
472
|
+
const contentLength = Number(request.headers.get('content-length'))
|
|
473
|
+
if (Number.isFinite(contentLength) && contentLength > maxRpcInspectionBytes) {
|
|
474
|
+
await request.body?.cancel()
|
|
475
|
+
return { body: null, result: undefined }
|
|
476
|
+
}
|
|
477
|
+
if (!request.body) return { body: null, result: { empty: true, ok: false } }
|
|
478
|
+
|
|
479
|
+
const reader = request.body.getReader()
|
|
480
|
+
const chunks: Uint8Array<ArrayBuffer>[] = []
|
|
481
|
+
let size = 0
|
|
482
|
+
while (size <= maxRpcInspectionBytes) {
|
|
483
|
+
const read = await reader.read()
|
|
484
|
+
if (read.done) break
|
|
485
|
+
size += read.value.byteLength
|
|
486
|
+
if (size > maxRpcInspectionBytes) {
|
|
487
|
+
await reader.cancel()
|
|
488
|
+
return { body: null, result: undefined }
|
|
489
|
+
}
|
|
490
|
+
chunks.push(read.value)
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const bytes = joinChunks(chunks, size)
|
|
494
|
+
const body = new ReadableStream<Uint8Array<ArrayBuffer>>({
|
|
495
|
+
start(controller) {
|
|
496
|
+
controller.enqueue(bytes)
|
|
497
|
+
controller.close()
|
|
498
|
+
},
|
|
499
|
+
})
|
|
500
|
+
return { body, result: parseRpcBody(bytes) }
|
|
501
|
+
}
|
|
502
|
+
|
|
472
503
|
function hasZoneWriteScope(c: Context<App.Environment>, chainId: number): boolean {
|
|
473
504
|
const principal = Auth.getPrincipal(c)
|
|
474
505
|
if (principal?.type !== 'api_key') return false
|
|
@@ -712,20 +743,26 @@ async function inspectRpcBody(response: Request | globalThis.Response): Promise<
|
|
|
712
743
|
})
|
|
713
744
|
if (!complete || size > maxRpcInspectionBytes) return { body, result: undefined }
|
|
714
745
|
|
|
746
|
+
const bytes = joinChunks(chunks, size)
|
|
747
|
+
return { body, result: parseRpcBody(bytes) }
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
function joinChunks(chunks: readonly Uint8Array<ArrayBuffer>[], size: number) {
|
|
715
751
|
const bytes = new Uint8Array(size)
|
|
716
752
|
let offset = 0
|
|
717
753
|
for (const chunk of chunks) {
|
|
718
754
|
bytes.set(chunk, offset)
|
|
719
755
|
offset += chunk.byteLength
|
|
720
756
|
}
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
|
|
757
|
+
return bytes
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
function parseRpcBody(bytes: Uint8Array<ArrayBuffer>): RpcInspection['result'] {
|
|
761
|
+
try {
|
|
762
|
+
return { ok: true, value: JSON.parse(new TextDecoder().decode(bytes)) as unknown }
|
|
763
|
+
} catch {
|
|
764
|
+
return { empty: bytes.byteLength === 0, ok: false }
|
|
765
|
+
}
|
|
729
766
|
}
|
|
730
767
|
|
|
731
768
|
function rpcProviderFailure(cause: unknown, chainId: number): Log.ProviderFailure {
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import * as fs from 'node:fs'
|
|
2
|
+
import {
|
|
3
|
+
GenericContainer,
|
|
4
|
+
Network,
|
|
5
|
+
type StartedNetwork,
|
|
6
|
+
type StartedTestContainer,
|
|
7
|
+
Wait,
|
|
8
|
+
} from 'testcontainers'
|
|
9
|
+
import { encodeAbiParameters, encodeEventTopics, parseAbi, zeroAddress, zeroHash } from 'viem'
|
|
10
|
+
|
|
11
|
+
import * as TestApp from '../../../../test/App.js'
|
|
12
|
+
import * as Runtime from '../../../../test/runtime.js'
|
|
13
|
+
import * as Tokens from './tokens.js'
|
|
14
|
+
|
|
15
|
+
const abi = parseAbi([
|
|
16
|
+
'event TokenCreated(address indexed token, string name, string symbol, string currency, address quoteToken, address admin, bytes32 salt)',
|
|
17
|
+
])
|
|
18
|
+
const attacker = '0x1111111111111111111111111111111111111111'
|
|
19
|
+
const token = '0x20c0000000000000000000000000000000000001'
|
|
20
|
+
|
|
21
|
+
let url: string
|
|
22
|
+
|
|
23
|
+
describe.runIf(Runtime.get().mode === 'testnet')('Token provenance', () => {
|
|
24
|
+
let app: ReturnType<typeof TestApp.create>
|
|
25
|
+
let clickhouse: StartedTestContainer
|
|
26
|
+
let indexer: StartedTestContainer
|
|
27
|
+
let network: StartedNetwork
|
|
28
|
+
let postgres: StartedTestContainer
|
|
29
|
+
|
|
30
|
+
beforeAll(async () => {
|
|
31
|
+
const compose = fs.readFileSync(
|
|
32
|
+
new URL('../../../../docker-compose.yml', import.meta.url),
|
|
33
|
+
'utf8',
|
|
34
|
+
)
|
|
35
|
+
const image = compose.match(/TEMPO_API_TIDX_IMAGE:-([^}]+)}/)?.[1]
|
|
36
|
+
const image_clickhouse = compose.match(/TEMPO_API_CLICKHOUSE_IMAGE:-([^}]+)}/)?.[1]
|
|
37
|
+
const image_postgres = compose.match(/TEMPO_API_POSTGRES_IMAGE:-([^}]+)}/)?.[1]
|
|
38
|
+
if (!image || !image_clickhouse || !image_postgres)
|
|
39
|
+
throw new Error('Missing pinned database images.')
|
|
40
|
+
network = await new Network().start()
|
|
41
|
+
postgres = await new GenericContainer(image_postgres)
|
|
42
|
+
.withEnvironment({ POSTGRES_PASSWORD: 'postgres' })
|
|
43
|
+
.withNetwork(network)
|
|
44
|
+
.withNetworkAliases('postgres')
|
|
45
|
+
.withExposedPorts(5432)
|
|
46
|
+
.withWaitStrategy(Wait.forLogMessage(/database system is ready to accept connections/, 2))
|
|
47
|
+
.start()
|
|
48
|
+
clickhouse = await new GenericContainer(image_clickhouse)
|
|
49
|
+
.withEnvironment({ CLICKHOUSE_PASSWORD: 'clickhouse', CLICKHOUSE_USER: 'clickhouse' })
|
|
50
|
+
.withNetwork(network)
|
|
51
|
+
.withNetworkAliases('clickhouse')
|
|
52
|
+
.withExposedPorts(8123)
|
|
53
|
+
.withWaitStrategy(Wait.forHttp('/ping', 8123))
|
|
54
|
+
.start()
|
|
55
|
+
url = `http://${clickhouse.getHost()}:${clickhouse.getMappedPort(8123)}`
|
|
56
|
+
indexer = await new GenericContainer(image)
|
|
57
|
+
.withPlatform('linux/amd64')
|
|
58
|
+
.withNetwork(network)
|
|
59
|
+
.withCopyContentToContainer([
|
|
60
|
+
{
|
|
61
|
+
content: `
|
|
62
|
+
[http]
|
|
63
|
+
enabled = true
|
|
64
|
+
port = 8080
|
|
65
|
+
bind = "0.0.0.0"
|
|
66
|
+
[prometheus]
|
|
67
|
+
enabled = false
|
|
68
|
+
[[chains]]
|
|
69
|
+
name = "token-provenance"
|
|
70
|
+
chain_id = 42431
|
|
71
|
+
rpc_url = "http://127.0.0.1:1"
|
|
72
|
+
pg_url = "postgres://postgres:postgres@postgres:5432/postgres"
|
|
73
|
+
backfill = false
|
|
74
|
+
[chains.clickhouse]
|
|
75
|
+
enabled = true
|
|
76
|
+
url = "http://clickhouse:8123"
|
|
77
|
+
user = "clickhouse"
|
|
78
|
+
password_env = "CLICKHOUSE_PASSWORD"
|
|
79
|
+
repair_derived_on_startup = false
|
|
80
|
+
`,
|
|
81
|
+
target: '/tmp/config.toml',
|
|
82
|
+
},
|
|
83
|
+
])
|
|
84
|
+
.withEnvironment({ CLICKHOUSE_PASSWORD: 'clickhouse' })
|
|
85
|
+
.withCommand(['up', '--config', '/tmp/config.toml'])
|
|
86
|
+
.withExposedPorts(8080)
|
|
87
|
+
.withWaitStrategy(Wait.forListeningPorts())
|
|
88
|
+
.withStartupTimeout(120_000)
|
|
89
|
+
.start()
|
|
90
|
+
await vi.waitFor(
|
|
91
|
+
async () => {
|
|
92
|
+
const response = await query(
|
|
93
|
+
"SELECT count() FROM system.tables WHERE database = 'tidx_42431' AND name = 'logs'",
|
|
94
|
+
)
|
|
95
|
+
expect(response.trim()).toBe('1')
|
|
96
|
+
},
|
|
97
|
+
{ timeout: 60_000 },
|
|
98
|
+
)
|
|
99
|
+
app = TestApp.create({
|
|
100
|
+
auth: false,
|
|
101
|
+
cache: { edge: false },
|
|
102
|
+
rpc: { url: 'http://127.0.0.1:1' },
|
|
103
|
+
tidx: { baseUrl: `http://${indexer.getHost()}:${indexer.getMappedPort(8080)}` },
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
afterAll(async () => {
|
|
108
|
+
await indexer?.stop()
|
|
109
|
+
await clickhouse?.stop()
|
|
110
|
+
await postgres?.stop()
|
|
111
|
+
await network?.stop()
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
test('excludes TokenCreated logs from non-factory emitters', async () => {
|
|
115
|
+
await insertForgedToken()
|
|
116
|
+
|
|
117
|
+
const response = await app.request('/v1/tokens?chainId=42431&limit=5')
|
|
118
|
+
expect(response.status, await response.clone().text()).toBe(200)
|
|
119
|
+
const body = await TestApp.json(response, Tokens.schema.getTokens.Response)
|
|
120
|
+
expect(body).toEqual({ data: [], nextCursor: null })
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
async function query(sql: string) {
|
|
125
|
+
const response = await fetch(url, {
|
|
126
|
+
body: sql,
|
|
127
|
+
headers: { Authorization: `Basic ${btoa('clickhouse:clickhouse')}` },
|
|
128
|
+
method: 'POST',
|
|
129
|
+
})
|
|
130
|
+
const body = await response.text()
|
|
131
|
+
if (!response.ok) throw new Error(body)
|
|
132
|
+
return body
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function insertForgedToken() {
|
|
136
|
+
const [selector, topic1] = encodeEventTopics({
|
|
137
|
+
abi,
|
|
138
|
+
args: { token },
|
|
139
|
+
eventName: 'TokenCreated',
|
|
140
|
+
})
|
|
141
|
+
if (typeof selector !== 'string' || typeof topic1 !== 'string')
|
|
142
|
+
throw new Error('Invalid TokenCreated event topics.')
|
|
143
|
+
const data = encodeAbiParameters(
|
|
144
|
+
[
|
|
145
|
+
{ type: 'string' },
|
|
146
|
+
{ type: 'string' },
|
|
147
|
+
{ type: 'string' },
|
|
148
|
+
{ type: 'address' },
|
|
149
|
+
{ type: 'address' },
|
|
150
|
+
{ type: 'bytes32' },
|
|
151
|
+
],
|
|
152
|
+
['Forged USD', 'FUSD', 'USD', zeroAddress, attacker, zeroHash],
|
|
153
|
+
)
|
|
154
|
+
await query(`INSERT INTO tidx_42431.logs
|
|
155
|
+
(block_num, block_timestamp, log_idx, tx_idx, tx_hash, address, selector, topic0, topic1, data)
|
|
156
|
+
VALUES (100, '2026-01-01 00:00:00', 0, 0, '${zeroHash}', '${attacker}', '${selector}', '${selector}', '${topic1}', '${data}')`)
|
|
157
|
+
}
|
|
@@ -19,7 +19,7 @@ function app(options: TestApp.create.Options = {}) {
|
|
|
19
19
|
return TestApp.client({ db, ...options })
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
const verifiedTokenCount =
|
|
22
|
+
const verifiedTokenCount = 7
|
|
23
23
|
|
|
24
24
|
describe('getTokenMetadata', () => {
|
|
25
25
|
const address = '0x20c0000000000000000000000000000000000001'
|
|
@@ -914,14 +914,14 @@ describe('GET /tokens?verified=true', () => {
|
|
|
914
914
|
|
|
915
915
|
test('paginates the verified list via limit + cursor', async () => {
|
|
916
916
|
const client = app({ assetsPath: false })
|
|
917
|
-
// Full list for comparison (
|
|
917
|
+
// Full list for comparison (7 verified tokens on the test chain).
|
|
918
918
|
const full = await TestApp.json(
|
|
919
919
|
await client.v1.tokens.$get({ query: { verified: 'true' } }, TestApp.auth),
|
|
920
920
|
Tokens.schema.getTokens.Response,
|
|
921
921
|
)
|
|
922
922
|
|
|
923
923
|
// First page: a bounded slice with a cursor to the next page (`minLimit` is
|
|
924
|
-
// 5, and the test chain has
|
|
924
|
+
// 5, and the test chain has 7 verified tokens, so a page of 5 leaves 2).
|
|
925
925
|
const first = await TestApp.json(
|
|
926
926
|
await client.v1.tokens.$get({ query: { verified: 'true', limit: '5' } }, TestApp.auth),
|
|
927
927
|
Tokens.schema.getTokens.Response,
|
|
@@ -937,7 +937,7 @@ describe('GET /tokens?verified=true', () => {
|
|
|
937
937
|
),
|
|
938
938
|
Tokens.schema.getTokens.Response,
|
|
939
939
|
)
|
|
940
|
-
expect(second.data.length).toBe(
|
|
940
|
+
expect(second.data.length).toBe(verifiedTokenCount - 5)
|
|
941
941
|
expect(second.nextCursor).toBeNull()
|
|
942
942
|
|
|
943
943
|
// The two pages reconstruct the full list in order, with no overlap.
|