tapimo 0.15.1 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +893 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +70 -70
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +529 -76
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +157 -157
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +205 -201
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +357 -357
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +125 -125
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +109 -127
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +83 -54
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +43 -43
- package/dist/apps/data/routes/receipts.d.ts +235 -235
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +77 -77
- package/dist/apps/data/routes/valuation.d.ts +32 -32
- package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +1 -1
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +31 -31
- package/dist/apps/management/App.d.ts +2909 -2064
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +257 -245
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +138 -138
- package/dist/apps/management/routes/invite-links.d.ts +172 -172
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +104 -104
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +125 -125
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
- package/dist/apps/management/routes/webhooks.d.ts +485 -485
- package/dist/apps/mpp/App.d.ts +44 -44
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/chains.d.ts +25 -25
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +171 -81
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +532 -480
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +413 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +57 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +182 -78
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +3 -0
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +352 -41
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +1 -0
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
- package/src/admin/ui.generated.ts +258 -202
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +134 -2
- package/src/apps/data/routes/fee-amm.ts +122 -60
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +2 -2
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.test.ts +12 -3
- package/src/apps/data/routes/webhooks.ts +2 -1
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +498 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +66 -5
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +291 -8
- package/src/internal/Auth.ts +227 -96
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1263 -41
- package/src/internal/routes/providers/relay.ts +423 -38
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { Base58, Hash, Hex } from 'ox'
|
|
2
|
+
import { createClient as core_createClient, custom, fallback } from 'viem'
|
|
3
|
+
import type { Client as core_Client, FallbackTransport } from 'viem'
|
|
4
|
+
import * as z from 'zod/mini'
|
|
5
|
+
|
|
6
|
+
/** Converts a checksummed Tron address into its 20-byte ABI address. */
|
|
7
|
+
export function toEvmAddress(address: string): Hex.Hex {
|
|
8
|
+
if (!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(address)) throw new InvalidAddressError()
|
|
9
|
+
const value = Base58.toHex(address)
|
|
10
|
+
const payload = Hex.slice(value, 0, 21)
|
|
11
|
+
if (
|
|
12
|
+
Hex.size(value) !== 25 ||
|
|
13
|
+
Hex.slice(payload, 0, 1) !== '0x41' ||
|
|
14
|
+
Hex.slice(value, 21) !== Hex.slice(Hash.sha256(Hash.sha256(payload)), 0, 4)
|
|
15
|
+
)
|
|
16
|
+
throw new InvalidAddressError()
|
|
17
|
+
return Hex.slice(payload, 1)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Encodes a 20-byte ABI address as a checksummed Tron address. */
|
|
21
|
+
export function fromEvmAddress(address: Hex.Hex): string {
|
|
22
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(address)) throw new InvalidAddressError()
|
|
23
|
+
const payload = Hex.concat('0x41', address)
|
|
24
|
+
return Base58.fromHex(Hex.concat(payload, Hex.slice(Hash.sha256(Hash.sha256(payload)), 0, 4)))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Validated native Tron response contracts used by funding providers. */
|
|
28
|
+
export namespace schema {
|
|
29
|
+
const bytes = z
|
|
30
|
+
.string()
|
|
31
|
+
.check(z.regex(/^(?:[0-9a-fA-F]{2})*$/), z.describe('Unprefixed hexadecimal bytes.'))
|
|
32
|
+
const hash = z
|
|
33
|
+
.string()
|
|
34
|
+
.check(z.regex(/^[0-9a-fA-F]{64}$/), z.describe('Unprefixed transaction hash.'))
|
|
35
|
+
const address = z
|
|
36
|
+
.string()
|
|
37
|
+
.check(z.regex(/^41[0-9a-fA-F]{40}$/), z.describe('Network-prefixed Tron address.'))
|
|
38
|
+
const integer = z
|
|
39
|
+
.number()
|
|
40
|
+
.check(
|
|
41
|
+
z.int(),
|
|
42
|
+
z.nonnegative(),
|
|
43
|
+
z.maximum(Number.MAX_SAFE_INTEGER),
|
|
44
|
+
z.describe('Nonnegative safe integer.'),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
/** Constant-call response; TVM execution failures remain distinguishable from successful RPC delivery. */
|
|
48
|
+
export const Call = z
|
|
49
|
+
.object({
|
|
50
|
+
constant_result: z.optional(z.array(bytes)),
|
|
51
|
+
result: z.object({ message: z.optional(z.string()), result: z.boolean() }),
|
|
52
|
+
transaction: z.optional(
|
|
53
|
+
z.object({ ret: z.optional(z.array(z.object({ ret: z.optional(z.string()) }))) }),
|
|
54
|
+
),
|
|
55
|
+
})
|
|
56
|
+
.check(z.describe('Constant contract simulation response.'))
|
|
57
|
+
|
|
58
|
+
/** Solidified block metadata. */
|
|
59
|
+
export const Block = z
|
|
60
|
+
.object({
|
|
61
|
+
blockID: hash,
|
|
62
|
+
block_header: z.object({ raw_data: z.object({ number: integer, timestamp: integer }) }),
|
|
63
|
+
})
|
|
64
|
+
.check(z.describe('Solidified Tron block.'))
|
|
65
|
+
|
|
66
|
+
/** Solidified transaction receipt with native hexadecimal event fields. */
|
|
67
|
+
export const Receipt = z
|
|
68
|
+
.object({
|
|
69
|
+
blockNumber: integer,
|
|
70
|
+
blockTimeStamp: integer,
|
|
71
|
+
id: hash,
|
|
72
|
+
log: z.optional(
|
|
73
|
+
z.array(
|
|
74
|
+
z.object({
|
|
75
|
+
address: z.string().check(z.regex(/^[0-9a-fA-F]{40}$/)),
|
|
76
|
+
data: bytes,
|
|
77
|
+
topics: z.array(hash),
|
|
78
|
+
}),
|
|
79
|
+
),
|
|
80
|
+
),
|
|
81
|
+
receipt: z.object({ result: z.optional(z.string()) }),
|
|
82
|
+
result: z.optional(z.string()),
|
|
83
|
+
})
|
|
84
|
+
.check(z.describe('Solidified Tron execution receipt.'))
|
|
85
|
+
|
|
86
|
+
/** Solidified smart-contract transaction and source call evidence. */
|
|
87
|
+
export const Transaction = z
|
|
88
|
+
.object({
|
|
89
|
+
raw_data: z.object({
|
|
90
|
+
contract: z
|
|
91
|
+
.array(
|
|
92
|
+
z.object({
|
|
93
|
+
parameter: z.object({
|
|
94
|
+
value: z.object({
|
|
95
|
+
call_value: z.optional(integer),
|
|
96
|
+
contract_address: address,
|
|
97
|
+
data: bytes,
|
|
98
|
+
owner_address: address,
|
|
99
|
+
}),
|
|
100
|
+
}),
|
|
101
|
+
type: z.literal('TriggerSmartContract'),
|
|
102
|
+
}),
|
|
103
|
+
)
|
|
104
|
+
.check(z.minLength(1)),
|
|
105
|
+
}),
|
|
106
|
+
ret: z.array(z.object({ contractRet: z.string() })).check(z.minLength(1)),
|
|
107
|
+
txID: hash,
|
|
108
|
+
})
|
|
109
|
+
.check(z.describe('Solidified Tron smart-contract transaction.'))
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Creates a read-only Tron client with bounded endpoint fallback and cancellation. */
|
|
113
|
+
export function createClient(options: createClient.Options): createClient.ReturnType {
|
|
114
|
+
if (!options.urls.length) throw new RequestError('At least one Tron endpoint is required.')
|
|
115
|
+
const client = core_createClient({
|
|
116
|
+
transport: fallback(
|
|
117
|
+
options.urls.map((url) =>
|
|
118
|
+
custom(
|
|
119
|
+
{
|
|
120
|
+
async request(parameters: { method: string; params?: readonly unknown[] }) {
|
|
121
|
+
options.signal?.throwIfAborted()
|
|
122
|
+
if (!/^wallet(?:solidity)?\/[a-z]+$/.test(parameters.method))
|
|
123
|
+
throw new RequestError('Unsupported Tron method.')
|
|
124
|
+
const response = await (options.fetch ?? globalThis.fetch)(
|
|
125
|
+
`${url.replace(/\/$/, '')}/${parameters.method}`,
|
|
126
|
+
{
|
|
127
|
+
body: JSON.stringify(parameters.params?.[0] ?? {}),
|
|
128
|
+
headers: { 'content-type': 'application/json' },
|
|
129
|
+
method: 'POST',
|
|
130
|
+
signal: AbortSignal.any([
|
|
131
|
+
AbortSignal.timeout(10_000),
|
|
132
|
+
...(options.signal ? [options.signal] : []),
|
|
133
|
+
]),
|
|
134
|
+
},
|
|
135
|
+
)
|
|
136
|
+
if (!response.ok)
|
|
137
|
+
throw new RequestError(`Tron endpoint returned HTTP ${response.status}.`)
|
|
138
|
+
const value: unknown = await response.json()
|
|
139
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
140
|
+
throw new RequestError('Invalid Tron response.')
|
|
141
|
+
if ('Error' in value || 'ErrorCode' in value || 'error' in value)
|
|
142
|
+
throw new RequestError('Tron endpoint rejected the request.')
|
|
143
|
+
return value
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
{ retryCount: 0 },
|
|
147
|
+
),
|
|
148
|
+
),
|
|
149
|
+
{ retryCount: 0 },
|
|
150
|
+
),
|
|
151
|
+
})
|
|
152
|
+
const actions = {
|
|
153
|
+
async call(options: call.Options): Promise<Hex.Hex> {
|
|
154
|
+
toEvmAddress(options.to)
|
|
155
|
+
if (options.from) toEvmAddress(options.from)
|
|
156
|
+
if (!/^0x(?:[0-9a-fA-F]{2})+$/.test(options.data))
|
|
157
|
+
throw new RequestError('Invalid contract calldata.')
|
|
158
|
+
const value = options.value ?? 0n
|
|
159
|
+
if (value < 0n || value > BigInt(Number.MAX_SAFE_INTEGER))
|
|
160
|
+
throw new RequestError('TRX call value exceeds the supported range.')
|
|
161
|
+
const result = schema.Call.parse(
|
|
162
|
+
await client.request({
|
|
163
|
+
method: 'wallet/triggerconstantcontract',
|
|
164
|
+
params: [
|
|
165
|
+
{
|
|
166
|
+
call_value: Number(value),
|
|
167
|
+
contract_address: options.to,
|
|
168
|
+
data: options.data.slice(2),
|
|
169
|
+
owner_address: options.from ?? options.to,
|
|
170
|
+
visible: true,
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
} as never),
|
|
174
|
+
)
|
|
175
|
+
if (
|
|
176
|
+
!result.result.result ||
|
|
177
|
+
result.transaction?.ret?.some(
|
|
178
|
+
(entry) => entry.ret !== undefined && entry.ret !== 'SUCCESS',
|
|
179
|
+
) ||
|
|
180
|
+
result.constant_result?.length !== 1
|
|
181
|
+
)
|
|
182
|
+
throw new RequestError('Tron constant call failed.')
|
|
183
|
+
return `0x${result.constant_result[0]}`
|
|
184
|
+
},
|
|
185
|
+
async getBlock() {
|
|
186
|
+
return schema.Block.parse(
|
|
187
|
+
await client.request({ method: 'walletsolidity/getnowblock' } as never),
|
|
188
|
+
)
|
|
189
|
+
},
|
|
190
|
+
async getTransaction(options: getTransaction.Options) {
|
|
191
|
+
const result = await client.request({
|
|
192
|
+
method: 'walletsolidity/gettransactionbyid',
|
|
193
|
+
params: [{ value: internal.hash(options.hash) }],
|
|
194
|
+
} as never)
|
|
195
|
+
if (Object.keys(result as object).length === 0) return undefined
|
|
196
|
+
const transaction = schema.Transaction.parse(result)
|
|
197
|
+
if (transaction.txID.toLowerCase() !== internal.hash(options.hash))
|
|
198
|
+
throw new RequestError('Tron transaction hash mismatch.')
|
|
199
|
+
return transaction
|
|
200
|
+
},
|
|
201
|
+
async getTransactionReceipt(options: getTransaction.Options) {
|
|
202
|
+
const result = await client.request({
|
|
203
|
+
method: 'walletsolidity/gettransactioninfobyid',
|
|
204
|
+
params: [{ value: internal.hash(options.hash) }],
|
|
205
|
+
} as never)
|
|
206
|
+
if (Object.keys(result as object).length === 0) return undefined
|
|
207
|
+
const receipt = schema.Receipt.parse(result)
|
|
208
|
+
if (receipt.id.toLowerCase() !== internal.hash(options.hash))
|
|
209
|
+
throw new RequestError('Tron receipt hash mismatch.')
|
|
210
|
+
return receipt
|
|
211
|
+
},
|
|
212
|
+
}
|
|
213
|
+
// viem protects Ethereum action names, so native Tron actions extend a separate namespace.
|
|
214
|
+
const { tron, ...extended } = client.extend(() => ({ tron: actions }))
|
|
215
|
+
return { ...extended, ...tron }
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export declare namespace createClient {
|
|
219
|
+
/** Read-only Tron actions backed by a viem fallback client. */
|
|
220
|
+
type ReturnType = core_Client<FallbackTransport, undefined, undefined> & {
|
|
221
|
+
/** Simulates an ABI-encoded contract call. */
|
|
222
|
+
call: (options: call.Options) => Promise<Hex.Hex>
|
|
223
|
+
/** Reads the latest solidified block. */
|
|
224
|
+
getBlock: () => Promise<z.output<typeof schema.Block>>
|
|
225
|
+
/** Reads solidified source transaction evidence. */
|
|
226
|
+
getTransaction: (
|
|
227
|
+
options: getTransaction.Options,
|
|
228
|
+
) => Promise<z.output<typeof schema.Transaction> | undefined>
|
|
229
|
+
/** Reads the solidified execution receipt. */
|
|
230
|
+
getTransactionReceipt: (
|
|
231
|
+
options: getTransaction.Options,
|
|
232
|
+
) => Promise<z.output<typeof schema.Receipt> | undefined>
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Ordered native HTTP endpoints and request cancellation. */
|
|
236
|
+
type Options = {
|
|
237
|
+
/** Fetch implementation used for requests. */
|
|
238
|
+
fetch?: typeof globalThis.fetch | undefined
|
|
239
|
+
/** Cancellation signal shared by all requests. */
|
|
240
|
+
signal?: AbortSignal | undefined
|
|
241
|
+
/** Ordered Tron native HTTP API endpoint URLs. */
|
|
242
|
+
urls: readonly string[]
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** Contract-call parameter types. */
|
|
247
|
+
export declare namespace call {
|
|
248
|
+
/** ABI-encoded constant-call parameters. */
|
|
249
|
+
type Options = {
|
|
250
|
+
/** Full ABI-encoded calldata. */
|
|
251
|
+
data: Hex.Hex
|
|
252
|
+
/** Optional checksummed caller address. */
|
|
253
|
+
from?: string | undefined
|
|
254
|
+
/** Checksummed Tron contract address. */
|
|
255
|
+
to: string
|
|
256
|
+
/** TRX value in sun. */
|
|
257
|
+
value?: bigint | undefined
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** Transaction lookup parameter types. */
|
|
262
|
+
export declare namespace getTransaction {
|
|
263
|
+
/** Native Tron transaction identifier. */
|
|
264
|
+
type Options = {
|
|
265
|
+
/** Transaction hash, with or without the hexadecimal prefix. */
|
|
266
|
+
hash: string
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
namespace internal {
|
|
271
|
+
export function hash(value: string) {
|
|
272
|
+
const hash = value.replace(/^0x/, '').toLowerCase()
|
|
273
|
+
if (!/^[0-9a-f]{64}$/.test(hash)) throw new RequestError('Invalid Tron transaction hash.')
|
|
274
|
+
return hash
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** Invalid Tron address or Base58Check checksum. */
|
|
279
|
+
export class InvalidAddressError extends Error {
|
|
280
|
+
override name = 'Tron.InvalidAddressError'
|
|
281
|
+
constructor() {
|
|
282
|
+
super('Invalid Tron address.')
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** Native Tron endpoint or contract execution failure. */
|
|
287
|
+
export class RequestError extends Error {
|
|
288
|
+
override name = 'Tron.RequestError'
|
|
289
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as http from 'node:http'
|
|
2
|
+
import type * as net from 'node:net'
|
|
3
|
+
import { getChainId } from 'viem/actions'
|
|
4
|
+
|
|
5
|
+
import * as Viem from './Viem.js'
|
|
6
|
+
|
|
7
|
+
describe('createEvmClient', () => {
|
|
8
|
+
test.each([
|
|
9
|
+
{ auth: 'rpc-key', authorization: 'Bearer rpc-key' },
|
|
10
|
+
{
|
|
11
|
+
auth: { 4217: 'wrong-key', 42431: 'user:password' },
|
|
12
|
+
authorization: 'Basic dXNlcjpwYXNzd29yZA==',
|
|
13
|
+
},
|
|
14
|
+
])(
|
|
15
|
+
'authenticates the configured endpoint with $authorization',
|
|
16
|
+
async ({ auth, authorization }) => {
|
|
17
|
+
const headers: (string | undefined)[] = []
|
|
18
|
+
const server = http.createServer(async (request, response) => {
|
|
19
|
+
headers.push(request.headers.authorization)
|
|
20
|
+
let body = ''
|
|
21
|
+
for await (const chunk of request) body += chunk
|
|
22
|
+
response.setHeader('content-type', 'application/json')
|
|
23
|
+
response.end(JSON.stringify({ id: JSON.parse(body).id, jsonrpc: '2.0', result: '0xa5bf' }))
|
|
24
|
+
})
|
|
25
|
+
await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve))
|
|
26
|
+
try {
|
|
27
|
+
const url = `http://127.0.0.1:${(server.address() as net.AddressInfo).port}`
|
|
28
|
+
const client = Viem.createEvmClient({
|
|
29
|
+
chainId: 42431,
|
|
30
|
+
fetch,
|
|
31
|
+
rpc: { auth, url: { 42431: url } },
|
|
32
|
+
urls: ['http://127.0.0.1:1'],
|
|
33
|
+
})
|
|
34
|
+
expect(await getChainId(client)).toBe(42431)
|
|
35
|
+
expect(headers).toEqual([authorization])
|
|
36
|
+
} finally {
|
|
37
|
+
server.closeAllConnections()
|
|
38
|
+
await new Promise<void>((resolve) => server.close(() => resolve()))
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
test('does not forward credentials to redirects or fallback endpoints', async () => {
|
|
44
|
+
const requests: { authorization: string | undefined; path: string | undefined }[] = []
|
|
45
|
+
const server = http.createServer(async (request, response) => {
|
|
46
|
+
requests.push({ authorization: request.headers.authorization, path: request.url })
|
|
47
|
+
if (request.url === '/primary') {
|
|
48
|
+
response.writeHead(302, { location: '/redirect' })
|
|
49
|
+
response.end()
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
let body = ''
|
|
53
|
+
for await (const chunk of request) body += chunk
|
|
54
|
+
response.setHeader('content-type', 'application/json')
|
|
55
|
+
response.end(JSON.stringify({ id: JSON.parse(body).id, jsonrpc: '2.0', result: '0xa5bf' }))
|
|
56
|
+
})
|
|
57
|
+
await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve))
|
|
58
|
+
try {
|
|
59
|
+
const url = `http://127.0.0.1:${(server.address() as net.AddressInfo).port}`
|
|
60
|
+
const client = Viem.createEvmClient({
|
|
61
|
+
chainId: 42431,
|
|
62
|
+
fetch,
|
|
63
|
+
rpc: { auth: 'rpc-key', url: `${url}/primary` },
|
|
64
|
+
urls: [`${url}/fallback`],
|
|
65
|
+
})
|
|
66
|
+
expect(await getChainId(client)).toBe(42431)
|
|
67
|
+
expect(requests).toEqual([
|
|
68
|
+
{ authorization: 'Bearer rpc-key', path: '/primary' },
|
|
69
|
+
{ authorization: undefined, path: '/fallback' },
|
|
70
|
+
])
|
|
71
|
+
} finally {
|
|
72
|
+
server.closeAllConnections()
|
|
73
|
+
await new Promise<void>((resolve) => server.close(() => resolve()))
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
})
|
package/src/internal/Viem.ts
CHANGED
|
@@ -73,14 +73,33 @@ export type ZoneHeaders = Record<string, string>
|
|
|
73
73
|
|
|
74
74
|
/** Creates a generic EVM client with ordered RPC endpoint fallback. */
|
|
75
75
|
export function createEvmClient(options: createEvmClient.Options): createEvmClient.ReturnType {
|
|
76
|
+
const resolved =
|
|
77
|
+
options.rpc && options.chainId !== undefined
|
|
78
|
+
? resolveRpc(options.rpc, { chainId: options.chainId as ChainId, principal: null })
|
|
79
|
+
: undefined
|
|
80
|
+
const urls = [...new Set([...(resolved?.url ? [resolved.url] : []), ...options.urls])]
|
|
76
81
|
const fallback_transport = fallback(
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
urls.map((url) => {
|
|
83
|
+
const authorization =
|
|
84
|
+
url !== resolved?.url
|
|
85
|
+
? undefined
|
|
86
|
+
: resolved.basicAuth
|
|
87
|
+
? `Basic ${btoa(resolved.basicAuth)}`
|
|
88
|
+
: resolved.bearerAuth
|
|
89
|
+
? `Bearer ${resolved.bearerAuth}`
|
|
90
|
+
: undefined
|
|
91
|
+
return http(url, {
|
|
79
92
|
fetchFn: options.fetch,
|
|
80
|
-
|
|
93
|
+
fetchOptions: {
|
|
94
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
95
|
+
// Credentials belong only to the configured endpoint, never its redirects or catalog fallbacks.
|
|
96
|
+
...(authorization
|
|
97
|
+
? { headers: { Authorization: authorization }, redirect: 'manual' }
|
|
98
|
+
: {}),
|
|
99
|
+
},
|
|
81
100
|
retryCount: 0,
|
|
82
|
-
})
|
|
83
|
-
),
|
|
101
|
+
})
|
|
102
|
+
}),
|
|
84
103
|
)
|
|
85
104
|
const chainId = options.chainId
|
|
86
105
|
const transport: FallbackTransport = (parameters) => {
|
|
@@ -98,16 +117,20 @@ export function createEvmClient(options: createEvmClient.Options): createEvmClie
|
|
|
98
117
|
},
|
|
99
118
|
}
|
|
100
119
|
}
|
|
101
|
-
return core_createClient({ transport })
|
|
120
|
+
return core_createClient({ batch: options.batch, transport })
|
|
102
121
|
}
|
|
103
122
|
|
|
104
123
|
export declare namespace createEvmClient {
|
|
105
124
|
/** Generic EVM RPC client configuration. */
|
|
106
125
|
type Options = {
|
|
126
|
+
/** Contract read batching configuration. */
|
|
127
|
+
batch?: core_Client['batch'] | undefined
|
|
107
128
|
/** EIP-155 chain id attached to request failures. */
|
|
108
129
|
chainId?: number | undefined
|
|
109
130
|
/** Fetch implementation used for RPC requests. */
|
|
110
131
|
fetch: typeof globalThis.fetch
|
|
132
|
+
/** Trusted RPC configuration resolved using the client chain id. */
|
|
133
|
+
rpc?: getClient.Rpc | undefined
|
|
111
134
|
/** Optional request cancellation signal. */
|
|
112
135
|
signal?: AbortSignal | undefined
|
|
113
136
|
/** Ordered RPC endpoint URLs. */
|
|
@@ -4,6 +4,7 @@ import type { Address } from 'viem'
|
|
|
4
4
|
import * as TestApp from '../../../test/App.js'
|
|
5
5
|
import * as RewardAccounts from '../../db/tables/rewardAccounts.js'
|
|
6
6
|
import * as RewardCampaigns from '../../db/tables/rewardCampaigns.js'
|
|
7
|
+
import * as RewardEligibilityAssociations from '../../db/tables/rewardEligibilityAssociations.js'
|
|
7
8
|
import * as RewardRuns from '../../db/tables/rewardRuns.js'
|
|
8
9
|
import * as core_EarnVaults from '../../db/tables/earnVaults.js'
|
|
9
10
|
import * as Campaigns from './Campaigns.js'
|
|
@@ -31,6 +32,114 @@ const config = {
|
|
|
31
32
|
} satisfies Campaigns.Config
|
|
32
33
|
|
|
33
34
|
describe('Earn rewards reads', () => {
|
|
35
|
+
test.each([
|
|
36
|
+
{ balance: '30000000', baseNet: '0.02', name: 'fresh deposit', qualifiedShares: undefined },
|
|
37
|
+
{ balance: '30000000', baseNet: '0.02', name: 'zero qualification', qualifiedShares: '0' },
|
|
38
|
+
{ balance: '0', baseNet: '0.02', name: 'zero balance', qualifiedShares: undefined },
|
|
39
|
+
{ balance: '30000000', baseNet: '0.08', name: 'base above target', qualifiedShares: undefined },
|
|
40
|
+
])(
|
|
41
|
+
'exposes the registered boost target for $name without increasing net APY',
|
|
42
|
+
async (options) => {
|
|
43
|
+
vi.useFakeTimers({ now: (config.boostRewards.startTimestamp + 1) * 1_000, toFake: ['Date'] })
|
|
44
|
+
try {
|
|
45
|
+
const db = TestApp.database()
|
|
46
|
+
await seedCampaign(db)
|
|
47
|
+
await RewardEligibilityAssociations.upsert(db, {
|
|
48
|
+
chainId: 4217,
|
|
49
|
+
vaultAddress,
|
|
50
|
+
walletAddress: recipient,
|
|
51
|
+
})
|
|
52
|
+
if (options.qualifiedShares !== undefined)
|
|
53
|
+
await seedAccount(db, { qualifiedShares: options.qualifiedShares })
|
|
54
|
+
const apy = await Read.positionApy({
|
|
55
|
+
assetDecimals: 6,
|
|
56
|
+
baseNet: options.baseNet,
|
|
57
|
+
chainId: 4217,
|
|
58
|
+
db,
|
|
59
|
+
excludedAddresses: [],
|
|
60
|
+
recipient,
|
|
61
|
+
shareBalance: options.balance,
|
|
62
|
+
value: options.balance,
|
|
63
|
+
vaultAddress,
|
|
64
|
+
})
|
|
65
|
+
expect(apy?.breakdown[0]).toMatchInlineSnapshot(`
|
|
66
|
+
{
|
|
67
|
+
"assetAmount": {
|
|
68
|
+
"baseUnits": "0",
|
|
69
|
+
"decimals": 6,
|
|
70
|
+
"formatted": "0",
|
|
71
|
+
},
|
|
72
|
+
"net": "0.0700",
|
|
73
|
+
"type": "boost",
|
|
74
|
+
}
|
|
75
|
+
`)
|
|
76
|
+
expect(apy?.breakdown).toHaveLength(2)
|
|
77
|
+
expect(apy?.breakdown[1]).toMatchObject({
|
|
78
|
+
assetAmount: { baseUnits: options.balance },
|
|
79
|
+
net: options.baseNet,
|
|
80
|
+
type: 'base',
|
|
81
|
+
})
|
|
82
|
+
expect(apy?.net).toBe(options.baseNet)
|
|
83
|
+
} finally {
|
|
84
|
+
vi.useRealTimers()
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
test.each([
|
|
90
|
+
{ enabled: true, excluded: false, name: 'unregistered wallet', offset: 1, registered: false },
|
|
91
|
+
{ enabled: false, excluded: false, name: 'disabled campaign', offset: 1, registered: true },
|
|
92
|
+
{ enabled: true, excluded: false, name: 'future campaign', offset: -1, registered: true },
|
|
93
|
+
{ enabled: true, excluded: false, name: 'ended campaign', offset: 600, registered: true },
|
|
94
|
+
{ enabled: true, excluded: true, name: 'excluded wallet', offset: 1, registered: true },
|
|
95
|
+
])('omits a zero-amount boost for $name', async (options) => {
|
|
96
|
+
vi.useFakeTimers({
|
|
97
|
+
now: (config.boostRewards.startTimestamp + options.offset) * 1_000,
|
|
98
|
+
toFake: ['Date'],
|
|
99
|
+
})
|
|
100
|
+
try {
|
|
101
|
+
const db = TestApp.database()
|
|
102
|
+
await seedCampaign(db, {
|
|
103
|
+
config: { boostRewards: { ...config.boostRewards, enabled: options.enabled } },
|
|
104
|
+
})
|
|
105
|
+
if (options.registered)
|
|
106
|
+
await RewardEligibilityAssociations.upsert(db, {
|
|
107
|
+
chainId: 4217,
|
|
108
|
+
vaultAddress,
|
|
109
|
+
walletAddress: recipient,
|
|
110
|
+
})
|
|
111
|
+
const apy = await Read.positionApy({
|
|
112
|
+
assetDecimals: 6,
|
|
113
|
+
baseNet: '0.02',
|
|
114
|
+
chainId: 4217,
|
|
115
|
+
db,
|
|
116
|
+
excludedAddresses: options.excluded ? [recipient] : [],
|
|
117
|
+
recipient,
|
|
118
|
+
shareBalance: '30000000',
|
|
119
|
+
value: '30000000',
|
|
120
|
+
vaultAddress,
|
|
121
|
+
})
|
|
122
|
+
expect(apy).toMatchInlineSnapshot(`
|
|
123
|
+
{
|
|
124
|
+
"breakdown": [
|
|
125
|
+
{
|
|
126
|
+
"assetAmount": {
|
|
127
|
+
"baseUnits": "30000000",
|
|
128
|
+
"decimals": 6,
|
|
129
|
+
"formatted": "30",
|
|
130
|
+
},
|
|
131
|
+
"net": "0.02",
|
|
132
|
+
"type": "base",
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
"net": "0.02",
|
|
136
|
+
}
|
|
137
|
+
`)
|
|
138
|
+
} finally {
|
|
139
|
+
vi.useRealTimers()
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
|
|
34
143
|
test('calculates wallet APY below, at, and above the qualified cap', async () => {
|
|
35
144
|
vi.useFakeTimers({ now: (config.boostRewards.startTimestamp + 1) * 1_000, toFake: ['Date'] })
|
|
36
145
|
try {
|
|
@@ -4,6 +4,7 @@ import { Value as core_Value } from 'ox'
|
|
|
4
4
|
import * as Db from '../../db/Db.js'
|
|
5
5
|
import * as RewardAccounts from '../../db/tables/rewardAccounts.js'
|
|
6
6
|
import * as RewardCampaigns from '../../db/tables/rewardCampaigns.js'
|
|
7
|
+
import * as RewardEligibilityAssociations from '../../db/tables/rewardEligibilityAssociations.js'
|
|
7
8
|
import * as RewardRuns from '../../db/tables/rewardRuns.js'
|
|
8
9
|
import * as Campaigns from './Campaigns.js'
|
|
9
10
|
import type * as Viem from '../Viem.js'
|
|
@@ -64,7 +65,7 @@ export type Recipient = {
|
|
|
64
65
|
|
|
65
66
|
/** Effective APY combining live position amounts with the latest delivered reward qualification. */
|
|
66
67
|
export type PositionApy = {
|
|
67
|
-
/** Position amounts
|
|
68
|
+
/** Position amounts by annual rate, including an eligible boost target with zero qualified amount. */
|
|
68
69
|
breakdown: readonly {
|
|
69
70
|
/** Position amount in vault asset units. */
|
|
70
71
|
assetAmount: {
|
|
@@ -77,7 +78,7 @@ export type PositionApy = {
|
|
|
77
78
|
}
|
|
78
79
|
/** Annual rate applied to this amount, as a decimal ratio. */
|
|
79
80
|
net: string
|
|
80
|
-
/**
|
|
81
|
+
/** Base rate or eligible boost target; zero boost amount does not imply earned rewards. */
|
|
81
82
|
type: 'base' | 'boost'
|
|
82
83
|
}[]
|
|
83
84
|
/** Balance-weighted annual rate for the wallet's position, as a decimal ratio. */
|
|
@@ -238,9 +239,16 @@ export async function positionApy(options: positionApy.Options): Promise<Positio
|
|
|
238
239
|
if (amounts === undefined || amounts.shareBalance < 0n || amounts.value < 0n) return null
|
|
239
240
|
|
|
240
241
|
const db = Db.get(options.db)
|
|
241
|
-
|
|
242
|
+
// Registration is a keyed lookup, so it loads with the other rows rather
|
|
243
|
+
// than as a dependent round trip once qualification proves absent.
|
|
244
|
+
const [account, campaign, eligible] = await Promise.all([
|
|
242
245
|
RewardAccounts.get(db, options),
|
|
243
246
|
RewardCampaigns.get(db, options),
|
|
247
|
+
RewardEligibilityAssociations.get(db, {
|
|
248
|
+
chainId: options.chainId,
|
|
249
|
+
vaultAddress: getAddress(options.vaultAddress),
|
|
250
|
+
walletAddress: getAddress(options.recipient),
|
|
251
|
+
}),
|
|
244
252
|
])
|
|
245
253
|
// Stored qualification applies only while the campaign is active and the recipient is eligible.
|
|
246
254
|
const now = Math.floor(Date.now() / 1_000)
|
|
@@ -282,7 +290,8 @@ export async function positionApy(options: positionApy.Options): Promise<Positio
|
|
|
282
290
|
const baseAmount = value - boostAmount
|
|
283
291
|
const breakdown: PositionApy['breakdown'][number][] = []
|
|
284
292
|
const assetDecimals = campaign?.assetDecimals ?? options.assetDecimals
|
|
285
|
-
|
|
293
|
+
// Registration exposes the target before qualification arrives, without changing the weighted position rate.
|
|
294
|
+
if ((boostAmount > 0n || eligible) && boostRate !== undefined && boostNet !== undefined)
|
|
286
295
|
breakdown.push({
|
|
287
296
|
assetAmount: {
|
|
288
297
|
baseUnits: boostAmount.toString(),
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { AbiFunction } from 'ox'
|
|
2
|
+
|
|
3
|
+
import * as Tron from '../Tron.js'
|
|
1
4
|
import * as Action from './Action.js'
|
|
2
5
|
|
|
3
6
|
const sourceToken = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'
|
|
@@ -225,3 +228,70 @@ describe('validateEvmCalls', () => {
|
|
|
225
228
|
).toThrow(Action.InvalidActionError)
|
|
226
229
|
})
|
|
227
230
|
})
|
|
231
|
+
|
|
232
|
+
describe('validateTronCalls', () => {
|
|
233
|
+
const token = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'
|
|
234
|
+
const executor = 'TJRabPrwbZy45sbavfcjinPJC18kjpRTv8'
|
|
235
|
+
const approve = AbiFunction.from('function approve(address spender, uint256 amount)')
|
|
236
|
+
const calls = [
|
|
237
|
+
{
|
|
238
|
+
data: AbiFunction.encodeData(approve, [Tron.toEvmAddress(executor), 1_000_000n]),
|
|
239
|
+
to: token,
|
|
240
|
+
value: '0x0',
|
|
241
|
+
},
|
|
242
|
+
{ data: '0x12345678', to: executor, value: '0x64' },
|
|
243
|
+
]
|
|
244
|
+
|
|
245
|
+
test('accepts bounded approvals and exact SUN fees', () => {
|
|
246
|
+
expect(() =>
|
|
247
|
+
Action.validateTronCalls({
|
|
248
|
+
action: { calls, type: 'tron:calls' },
|
|
249
|
+
nativeValues: [{ to: executor, value: '0x64' }],
|
|
250
|
+
sourceAmount: '1000000',
|
|
251
|
+
sourceTokenAddress: token,
|
|
252
|
+
}),
|
|
253
|
+
).not.toThrow()
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
test('rejects native fees outside provider allowances', () => {
|
|
257
|
+
expect(() =>
|
|
258
|
+
Action.validateTronCalls({
|
|
259
|
+
action: { calls, type: 'tron:calls' },
|
|
260
|
+
nativeValues: [{ to: executor, value: '0x65' }],
|
|
261
|
+
sourceAmount: '1000000',
|
|
262
|
+
sourceTokenAddress: token,
|
|
263
|
+
}),
|
|
264
|
+
).toThrowErrorMatchingInlineSnapshot(
|
|
265
|
+
`[Routes.Action.InvalidActionError: Native value must match a validated provider fee.]`,
|
|
266
|
+
)
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
test('rejects approvals above the source amount', () => {
|
|
270
|
+
expect(() =>
|
|
271
|
+
Action.validateTronCalls({
|
|
272
|
+
action: { calls, type: 'tron:calls' },
|
|
273
|
+
nativeValues: [{ to: executor, value: '0x64' }],
|
|
274
|
+
sourceAmount: '999999',
|
|
275
|
+
sourceTokenAddress: token,
|
|
276
|
+
}),
|
|
277
|
+
).toThrowErrorMatchingInlineSnapshot(
|
|
278
|
+
`[Routes.Action.InvalidActionError: Approval must stay bounded to the route amount.]`,
|
|
279
|
+
)
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
test('rejects a malformed Base58 checksum', () => {
|
|
283
|
+
expect(() =>
|
|
284
|
+
Action.validateTronCalls({
|
|
285
|
+
action: {
|
|
286
|
+
calls: [{ ...calls[0]!, to: `${token.slice(0, -1)}u` }, calls[1]!],
|
|
287
|
+
type: 'tron:calls',
|
|
288
|
+
},
|
|
289
|
+
nativeValues: [{ to: executor, value: '0x64' }],
|
|
290
|
+
sourceAmount: '1000000',
|
|
291
|
+
sourceTokenAddress: token,
|
|
292
|
+
}),
|
|
293
|
+
).toThrowErrorMatchingInlineSnapshot(
|
|
294
|
+
`[Routes.Action.InvalidActionError: Malformed Tron calls or allowances.]`,
|
|
295
|
+
)
|
|
296
|
+
})
|
|
297
|
+
})
|