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,619 @@
|
|
|
1
|
+
import { AbiFunction, Address, Hash, Hex, Secp256k1, Signature } from 'ox'
|
|
2
|
+
import * as z from 'zod/mini'
|
|
3
|
+
|
|
4
|
+
import * as Tron from '../Tron.js'
|
|
5
|
+
import type * as Chain from './Chain.js'
|
|
6
|
+
|
|
7
|
+
const balanceOf = AbiFunction.from('function balanceOf(address account) view returns (uint256)')
|
|
8
|
+
const transfer = AbiFunction.from('function transfer(address to, uint256 amount) returns (bool)')
|
|
9
|
+
const transferTopic = Hash.keccak256(Hex.fromString('Transfer(address,address,uint256)')).slice(2)
|
|
10
|
+
const minimumPreparationWindowMs = 30_000
|
|
11
|
+
|
|
12
|
+
namespace schema {
|
|
13
|
+
const address = z.string().check(z.regex(/^41[0-9a-fA-F]{40}$/))
|
|
14
|
+
const bytes = z.string().check(z.regex(/^(?:[0-9a-fA-F]{2})+$/))
|
|
15
|
+
const integer = z.number().check(z.int(), z.nonnegative(), z.maximum(Number.MAX_SAFE_INTEGER))
|
|
16
|
+
|
|
17
|
+
/** Native Tron transaction fields required for exact signing and broadcast. */
|
|
18
|
+
export const UnsignedTransaction = z
|
|
19
|
+
.object({
|
|
20
|
+
raw_data: z.object({
|
|
21
|
+
contract: z
|
|
22
|
+
.array(
|
|
23
|
+
z.object({
|
|
24
|
+
parameter: z.object({
|
|
25
|
+
value: z.object({
|
|
26
|
+
call_value: z.optional(integer),
|
|
27
|
+
contract_address: address,
|
|
28
|
+
data: bytes,
|
|
29
|
+
owner_address: address,
|
|
30
|
+
}),
|
|
31
|
+
}),
|
|
32
|
+
type: z.literal('TriggerSmartContract'),
|
|
33
|
+
}),
|
|
34
|
+
)
|
|
35
|
+
.check(z.minLength(1), z.maxLength(1)),
|
|
36
|
+
expiration: integer,
|
|
37
|
+
fee_limit: integer,
|
|
38
|
+
ref_block_bytes: z.string().check(z.regex(/^[0-9a-fA-F]{4}$/)),
|
|
39
|
+
ref_block_hash: z.string().check(z.regex(/^[0-9a-fA-F]{16}$/)),
|
|
40
|
+
timestamp: integer,
|
|
41
|
+
}),
|
|
42
|
+
raw_data_hex: bytes,
|
|
43
|
+
txID: z.string().check(z.regex(/^[0-9a-fA-F]{64}$/)),
|
|
44
|
+
})
|
|
45
|
+
.check(z.describe('Unsigned Tron smart-contract transaction.'))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** An immutable Tron transaction prepared before requesting a Horcrux signature. */
|
|
49
|
+
export type Prepared = {
|
|
50
|
+
/** Base58Check address of the destination subsidy wallet. */
|
|
51
|
+
account: string
|
|
52
|
+
/** Destination token amount supplied by Tempo. */
|
|
53
|
+
amount: string
|
|
54
|
+
/** Destination chain CAIP-2 identifier. */
|
|
55
|
+
chainId: string
|
|
56
|
+
/** Native TRX fee limit reserved in SUN. */
|
|
57
|
+
nativeAmount: string
|
|
58
|
+
/** Full node's unsigned transaction, retained for exact broadcast. */
|
|
59
|
+
transaction: Record<string, unknown>
|
|
60
|
+
/** Horcrux request body retained unchanged for ambiguous signing retries. */
|
|
61
|
+
request: {
|
|
62
|
+
network: 'tron:mainnet'
|
|
63
|
+
transaction: {
|
|
64
|
+
raw_data: {
|
|
65
|
+
contract: readonly [
|
|
66
|
+
{
|
|
67
|
+
contract_address: string
|
|
68
|
+
data: string
|
|
69
|
+
owner_address: string
|
|
70
|
+
type: 'TriggerSmartContract'
|
|
71
|
+
},
|
|
72
|
+
]
|
|
73
|
+
expiration: number
|
|
74
|
+
fee_limit: number
|
|
75
|
+
ref_block_bytes: string
|
|
76
|
+
ref_block_hash: string
|
|
77
|
+
timestamp: number
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** SHA-256 of the exact raw protobuf bytes signed by Horcrux. */
|
|
82
|
+
hash: Hex.Hex
|
|
83
|
+
/** Unprefixed protobuf serialization of the prepared raw transaction. */
|
|
84
|
+
rawDataHex: string
|
|
85
|
+
/** Original Tron expiration in Unix milliseconds. */
|
|
86
|
+
expiresAt: number
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** A Horcrux-signed transaction, persisted before broadcast. */
|
|
90
|
+
export type Signed = Prepared & {
|
|
91
|
+
/** Exact 65-byte secp256k1 signature returned by Horcrux. */
|
|
92
|
+
signature: string
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Read-only destination inventory check for a Tron subsidy wallet. */
|
|
96
|
+
export type Inventory = {
|
|
97
|
+
/** Base58Check subsidy wallet address. */
|
|
98
|
+
account: string
|
|
99
|
+
/** Verifies TRC-20 and TRX capacity including outstanding reservations. */
|
|
100
|
+
check: (options: create.CheckOptions) => Promise<{ nativeAmount: string }>
|
|
101
|
+
/** Operational maximum destination subsidy. */
|
|
102
|
+
policy: { maxAmount: string }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Prepares, signs, broadcasts, and verifies one Tron destination subsidy. */
|
|
106
|
+
export type Settler = Inventory & {
|
|
107
|
+
/** Broadcasts exactly the persisted signed transaction. */
|
|
108
|
+
broadcast: (options: { chain: Chain.Chain; signed: Signed }) => Promise<void>
|
|
109
|
+
/** Constructs an unsigned transaction without contacting Horcrux. */
|
|
110
|
+
prepare: (options: create.PrepareOptions) => Promise<Prepared>
|
|
111
|
+
/** Signs a previously persisted immutable request through Horcrux. */
|
|
112
|
+
sign: (options: { idempotencyKey: string; prepared: Prepared }) => Promise<Signed>
|
|
113
|
+
/** Reads a solidified execution receipt and matching TRC-20 transfer log. */
|
|
114
|
+
status: (options: create.StatusOptions) => Promise<'pending' | 'reverted' | 'success'>
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Validates an unsigned transaction restored from private route state. */
|
|
118
|
+
export function readPrepared(value: unknown): Prepared | undefined {
|
|
119
|
+
if (typeof value === 'string') {
|
|
120
|
+
try {
|
|
121
|
+
value = JSON.parse(value)
|
|
122
|
+
} catch {
|
|
123
|
+
return undefined
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!isObject(value)) return undefined
|
|
127
|
+
const request = value['request']
|
|
128
|
+
const transaction = value['transaction']
|
|
129
|
+
const raw =
|
|
130
|
+
isObject(request) && isObject(request['transaction'])
|
|
131
|
+
? request['transaction']['raw_data']
|
|
132
|
+
: undefined
|
|
133
|
+
const contracts = isObject(raw) ? raw['contract'] : undefined
|
|
134
|
+
const contract = Array.isArray(contracts) ? contracts[0] : undefined
|
|
135
|
+
if (
|
|
136
|
+
typeof value['account'] !== 'string' ||
|
|
137
|
+
typeof value['amount'] !== 'string' ||
|
|
138
|
+
!/^\d+$/.test(value['amount']) ||
|
|
139
|
+
value['chainId'] !== 'tron:0x2b6653dc' ||
|
|
140
|
+
typeof value['nativeAmount'] !== 'string' ||
|
|
141
|
+
!/^[1-9]\d*$/.test(value['nativeAmount']) ||
|
|
142
|
+
!isObject(transaction) ||
|
|
143
|
+
!isObject(request) ||
|
|
144
|
+
request['network'] !== 'tron:mainnet' ||
|
|
145
|
+
!isObject(raw) ||
|
|
146
|
+
!Array.isArray(contracts) ||
|
|
147
|
+
contracts.length !== 1 ||
|
|
148
|
+
!isObject(contract) ||
|
|
149
|
+
contract['type'] !== 'TriggerSmartContract' ||
|
|
150
|
+
typeof contract['owner_address'] !== 'string' ||
|
|
151
|
+
typeof contract['contract_address'] !== 'string' ||
|
|
152
|
+
typeof contract['data'] !== 'string' ||
|
|
153
|
+
!/^41[0-9a-fA-F]{40}$/.test(contract['owner_address']) ||
|
|
154
|
+
!/^41[0-9a-fA-F]{40}$/.test(contract['contract_address']) ||
|
|
155
|
+
!/^(?:[0-9a-fA-F]{2})+$/.test(contract['data']) ||
|
|
156
|
+
typeof raw['ref_block_bytes'] !== 'string' ||
|
|
157
|
+
!/^[0-9a-fA-F]{4}$/.test(raw['ref_block_bytes']) ||
|
|
158
|
+
typeof raw['ref_block_hash'] !== 'string' ||
|
|
159
|
+
!/^[0-9a-fA-F]{16}$/.test(raw['ref_block_hash']) ||
|
|
160
|
+
typeof raw['timestamp'] !== 'number' ||
|
|
161
|
+
!Number.isSafeInteger(raw['timestamp']) ||
|
|
162
|
+
typeof raw['expiration'] !== 'number' ||
|
|
163
|
+
!Number.isSafeInteger(raw['expiration']) ||
|
|
164
|
+
raw['expiration'] <= raw['timestamp'] ||
|
|
165
|
+
value['expiresAt'] !== raw['expiration'] ||
|
|
166
|
+
typeof raw['fee_limit'] !== 'number' ||
|
|
167
|
+
!Number.isSafeInteger(raw['fee_limit']) ||
|
|
168
|
+
String(raw['fee_limit']) !== value['nativeAmount'] ||
|
|
169
|
+
typeof value['rawDataHex'] !== 'string' ||
|
|
170
|
+
!/^(?:[0-9a-fA-F]{2})+$/.test(value['rawDataHex']) ||
|
|
171
|
+
typeof value['hash'] !== 'string' ||
|
|
172
|
+
!/^0x[0-9a-fA-F]{64}$/.test(value['hash']) ||
|
|
173
|
+
transaction['raw_data_hex'] !== value['rawDataHex'] ||
|
|
174
|
+
typeof transaction['txID'] !== 'string' ||
|
|
175
|
+
transaction['txID'].toLowerCase() !== value['hash'].slice(2).toLowerCase()
|
|
176
|
+
)
|
|
177
|
+
return undefined
|
|
178
|
+
try {
|
|
179
|
+
if (
|
|
180
|
+
Tron.toEvmAddress(value['account']).slice(2).toLowerCase() !==
|
|
181
|
+
contract['owner_address'].slice(2).toLowerCase()
|
|
182
|
+
)
|
|
183
|
+
return undefined
|
|
184
|
+
if (Hash.sha256(`0x${value['rawDataHex']}`).toLowerCase() !== value['hash'].toLowerCase())
|
|
185
|
+
return undefined
|
|
186
|
+
const decoded = AbiFunction.decodeData(transfer, `0x${contract['data']}`)
|
|
187
|
+
if (decoded[1] !== BigInt(value['amount'])) return undefined
|
|
188
|
+
} catch {
|
|
189
|
+
return undefined
|
|
190
|
+
}
|
|
191
|
+
return value as Prepared
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Validates a signed Tron transaction restored from private route state. */
|
|
195
|
+
export function readSigned(value: unknown): Signed | undefined {
|
|
196
|
+
const prepared = readPrepared(value)
|
|
197
|
+
if (!prepared || typeof (prepared as Signed).signature !== 'string') return undefined
|
|
198
|
+
const signature = (prepared as Signed).signature
|
|
199
|
+
if (!/^[0-9a-fA-F]{130}$/.test(signature)) return undefined
|
|
200
|
+
try {
|
|
201
|
+
const recovered = Secp256k1.recoverAddress({
|
|
202
|
+
payload: prepared.hash,
|
|
203
|
+
signature: Signature.from(`0x${signature}`),
|
|
204
|
+
})
|
|
205
|
+
if (!Address.isEqual(recovered, Tron.toEvmAddress(prepared.account))) return undefined
|
|
206
|
+
} catch {
|
|
207
|
+
return undefined
|
|
208
|
+
}
|
|
209
|
+
return prepared as Signed
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** Checks a persisted Tron transaction against freshly verified transfer terms. */
|
|
213
|
+
export function matchesTerms(prepared: Prepared, options: matchesTerms.Options): boolean {
|
|
214
|
+
if (
|
|
215
|
+
!readPrepared(prepared) ||
|
|
216
|
+
prepared.chainId !== options.chainId ||
|
|
217
|
+
prepared.account !== options.account ||
|
|
218
|
+
prepared.amount !== options.amount.toString()
|
|
219
|
+
)
|
|
220
|
+
return false
|
|
221
|
+
try {
|
|
222
|
+
const contract = prepared.request.transaction.raw_data.contract[0]
|
|
223
|
+
return (
|
|
224
|
+
contract.owner_address.toLowerCase() ===
|
|
225
|
+
`41${Tron.toEvmAddress(options.account).slice(2)}`.toLowerCase() &&
|
|
226
|
+
contract.contract_address.toLowerCase() ===
|
|
227
|
+
`41${Tron.toEvmAddress(options.token).slice(2)}`.toLowerCase() &&
|
|
228
|
+
contract.data.toLowerCase() ===
|
|
229
|
+
AbiFunction.encodeData(transfer, [Tron.toEvmAddress(options.recipient), options.amount])
|
|
230
|
+
.slice(2)
|
|
231
|
+
.toLowerCase()
|
|
232
|
+
)
|
|
233
|
+
} catch {
|
|
234
|
+
return false
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export declare namespace matchesTerms {
|
|
239
|
+
/** Exact destination subsidy terms verified independently of the persisted request. */
|
|
240
|
+
type Options = {
|
|
241
|
+
/** Base58Check Tron subsidy wallet. */
|
|
242
|
+
account: string
|
|
243
|
+
/** Destination amount in token base units. */
|
|
244
|
+
amount: bigint
|
|
245
|
+
/** Destination chain CAIP-2 identifier. */
|
|
246
|
+
chainId: string
|
|
247
|
+
/** Base58Check recipient. */
|
|
248
|
+
recipient: string
|
|
249
|
+
/** Base58Check TRC-20 contract. */
|
|
250
|
+
token: string
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Creates a Tron inventory checker and transaction signer for one Horcrux wallet. */
|
|
255
|
+
export function create(options: create.Options): Settler {
|
|
256
|
+
if (!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(options.account))
|
|
257
|
+
throw new ConfigurationError('Invalid Tron subsidy account.')
|
|
258
|
+
Tron.toEvmAddress(options.account)
|
|
259
|
+
if (!/^[0-9a-fA-F-]{36}$/.test(options.walletId))
|
|
260
|
+
throw new ConfigurationError('Invalid Horcrux wallet ID.')
|
|
261
|
+
if (!Number.isSafeInteger(options.feeLimitSun) || options.feeLimitSun <= 0)
|
|
262
|
+
throw new ConfigurationError('Invalid Tron fee limit.')
|
|
263
|
+
const horcruxUrl = new URL(options.horcrux.url)
|
|
264
|
+
if (
|
|
265
|
+
!['https:', 'http:'].includes(horcruxUrl.protocol) ||
|
|
266
|
+
(horcruxUrl.protocol === 'http:' &&
|
|
267
|
+
!['localhost', '127.0.0.1', '[::1]'].includes(horcruxUrl.hostname)) ||
|
|
268
|
+
horcruxUrl.username ||
|
|
269
|
+
horcruxUrl.password ||
|
|
270
|
+
horcruxUrl.search ||
|
|
271
|
+
horcruxUrl.hash
|
|
272
|
+
)
|
|
273
|
+
throw new ConfigurationError('Horcrux requires HTTPS or loopback HTTP.')
|
|
274
|
+
if (
|
|
275
|
+
options.horcrux.auth.type === 'none' &&
|
|
276
|
+
!['localhost', '127.0.0.1', '[::1]'].includes(horcruxUrl.hostname)
|
|
277
|
+
)
|
|
278
|
+
throw new ConfigurationError('Unauthenticated Horcrux requires loopback.')
|
|
279
|
+
|
|
280
|
+
async function check(parameters: create.CheckOptions) {
|
|
281
|
+
assertChain(parameters.chain)
|
|
282
|
+
Tron.toEvmAddress(parameters.recipient)
|
|
283
|
+
Tron.toEvmAddress(parameters.token)
|
|
284
|
+
const client = Tron.createClient({ fetch: options.fetch, urls: parameters.chain.rpcUrls })
|
|
285
|
+
const balance = AbiFunction.decodeResult(
|
|
286
|
+
balanceOf,
|
|
287
|
+
await client.call({
|
|
288
|
+
data: AbiFunction.encodeData(balanceOf, [Tron.toEvmAddress(options.account)]),
|
|
289
|
+
to: parameters.token,
|
|
290
|
+
}),
|
|
291
|
+
)
|
|
292
|
+
if (balance < parameters.amount + parameters.reservations.tokenAmount)
|
|
293
|
+
throw new BalanceUnavailableError()
|
|
294
|
+
const account = await post(parameters.chain, 'wallet/getaccount', {
|
|
295
|
+
address: `41${Tron.toEvmAddress(options.account).slice(2)}`,
|
|
296
|
+
visible: false,
|
|
297
|
+
})
|
|
298
|
+
const nativeBalance = account['balance'] ?? 0
|
|
299
|
+
if (
|
|
300
|
+
typeof nativeBalance !== 'number' ||
|
|
301
|
+
!Number.isSafeInteger(nativeBalance) ||
|
|
302
|
+
nativeBalance < 0
|
|
303
|
+
)
|
|
304
|
+
throw new UpstreamError('Invalid Tron account balance.')
|
|
305
|
+
if (BigInt(nativeBalance) < BigInt(options.feeLimitSun) + parameters.reservations.nativeAmount)
|
|
306
|
+
throw new BalanceUnavailableError()
|
|
307
|
+
return { nativeAmount: String(options.feeLimitSun) }
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
async function prepare(parameters: create.PrepareOptions): Promise<Prepared> {
|
|
311
|
+
await check(parameters)
|
|
312
|
+
const data = AbiFunction.encodeData(transfer, [
|
|
313
|
+
Tron.toEvmAddress(parameters.recipient),
|
|
314
|
+
parameters.amount,
|
|
315
|
+
]).slice(2)
|
|
316
|
+
const account = `41${Tron.toEvmAddress(options.account).slice(2)}`
|
|
317
|
+
const token = `41${Tron.toEvmAddress(parameters.token).slice(2)}`
|
|
318
|
+
const result = await post(parameters.chain, 'wallet/triggersmartcontract', {
|
|
319
|
+
contract_address: token,
|
|
320
|
+
data,
|
|
321
|
+
fee_limit: options.feeLimitSun,
|
|
322
|
+
owner_address: account,
|
|
323
|
+
visible: false,
|
|
324
|
+
})
|
|
325
|
+
const transaction = result['transaction']
|
|
326
|
+
if (
|
|
327
|
+
!isObject(result['result']) ||
|
|
328
|
+
result['result']['result'] !== true ||
|
|
329
|
+
!isObject(transaction)
|
|
330
|
+
)
|
|
331
|
+
throw new UpstreamError('Tron refused subsidy transaction construction.')
|
|
332
|
+
// Validate a parsed copy while retaining the node's original transaction for broadcast.
|
|
333
|
+
const parsed = schema.UnsignedTransaction.safeParse(transaction)
|
|
334
|
+
if (!parsed.success) throw new UpstreamError('Malformed unsigned Tron subsidy transaction.')
|
|
335
|
+
const { raw_data: raw, raw_data_hex: rawDataHex, txID: txId } = parsed.data
|
|
336
|
+
const value = raw.contract[0]!.parameter.value
|
|
337
|
+
if (
|
|
338
|
+
raw.fee_limit !== options.feeLimitSun ||
|
|
339
|
+
raw.timestamp <= 0 ||
|
|
340
|
+
// Signing is a separate durable step, so refuse node transactions nearly at expiry.
|
|
341
|
+
raw.expiration <= Date.now() + minimumPreparationWindowMs ||
|
|
342
|
+
raw.expiration <= raw.timestamp
|
|
343
|
+
)
|
|
344
|
+
throw new UpstreamError('Malformed unsigned Tron subsidy transaction.')
|
|
345
|
+
if (
|
|
346
|
+
value.owner_address.toLowerCase() !== account.toLowerCase() ||
|
|
347
|
+
value.contract_address.toLowerCase() !== token.toLowerCase() ||
|
|
348
|
+
value.data.toLowerCase() !== data.toLowerCase() ||
|
|
349
|
+
(value.call_value !== undefined && value.call_value !== 0)
|
|
350
|
+
)
|
|
351
|
+
throw new UpstreamError('Tron changed the subsidy transaction terms.')
|
|
352
|
+
const hash = Hash.sha256(`0x${rawDataHex}`)
|
|
353
|
+
if (hash.slice(2).toLowerCase() !== txId.toLowerCase())
|
|
354
|
+
throw new UpstreamError('Tron transaction hash does not match its raw bytes.')
|
|
355
|
+
return {
|
|
356
|
+
account: options.account,
|
|
357
|
+
amount: parameters.amount.toString(),
|
|
358
|
+
chainId: parameters.chain.id,
|
|
359
|
+
expiresAt: raw.expiration,
|
|
360
|
+
hash,
|
|
361
|
+
nativeAmount: String(options.feeLimitSun),
|
|
362
|
+
rawDataHex,
|
|
363
|
+
request: {
|
|
364
|
+
network: 'tron:mainnet',
|
|
365
|
+
transaction: {
|
|
366
|
+
raw_data: {
|
|
367
|
+
contract: [
|
|
368
|
+
{
|
|
369
|
+
contract_address: token,
|
|
370
|
+
data,
|
|
371
|
+
owner_address: account,
|
|
372
|
+
type: 'TriggerSmartContract',
|
|
373
|
+
},
|
|
374
|
+
],
|
|
375
|
+
expiration: raw.expiration,
|
|
376
|
+
fee_limit: options.feeLimitSun,
|
|
377
|
+
ref_block_bytes: raw.ref_block_bytes,
|
|
378
|
+
ref_block_hash: raw.ref_block_hash,
|
|
379
|
+
timestamp: raw.timestamp,
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
transaction,
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
async function sign(parameters: { idempotencyKey: string; prepared: Prepared }): Promise<Signed> {
|
|
388
|
+
const { idempotencyKey, prepared } = parameters
|
|
389
|
+
if (!/^[\x21-\x7e]{1,256}$/.test(idempotencyKey))
|
|
390
|
+
throw new ConfigurationError('Invalid Horcrux idempotency key.')
|
|
391
|
+
if (prepared.account !== options.account || prepared.chainId !== 'tron:0x2b6653dc')
|
|
392
|
+
throw new ConfigurationError('Tron subsidy signer does not match the prepared transaction.')
|
|
393
|
+
const headers: Record<string, string> = {
|
|
394
|
+
'content-type': 'application/json',
|
|
395
|
+
'Idempotency-Key': idempotencyKey,
|
|
396
|
+
}
|
|
397
|
+
if (options.horcrux.auth.type === 'cloudflare-access') {
|
|
398
|
+
headers['CF-Access-Client-Id'] = options.horcrux.auth.clientId
|
|
399
|
+
headers['CF-Access-Client-Secret'] = options.horcrux.auth.clientSecret
|
|
400
|
+
}
|
|
401
|
+
const response = await options.fetch(
|
|
402
|
+
new URL(`/v1/wallets/${options.walletId}/sign`, horcruxUrl),
|
|
403
|
+
{
|
|
404
|
+
body: JSON.stringify(prepared.request),
|
|
405
|
+
headers,
|
|
406
|
+
method: 'POST',
|
|
407
|
+
redirect: 'manual',
|
|
408
|
+
signal: AbortSignal.timeout(10_000),
|
|
409
|
+
},
|
|
410
|
+
)
|
|
411
|
+
if (!response.ok) throw new SigningError(`Horcrux signing returned HTTP ${response.status}.`)
|
|
412
|
+
const result: unknown = await response.json()
|
|
413
|
+
if (!isObject(result) || typeof result['signed_transaction'] !== 'string')
|
|
414
|
+
throw new SigningError('Horcrux returned an invalid signing response.')
|
|
415
|
+
const bytes = result['signed_transaction']
|
|
416
|
+
if (
|
|
417
|
+
!/^(?:[0-9a-fA-F]{2})+$/.test(bytes) ||
|
|
418
|
+
bytes.length !== prepared.rawDataHex.length + 130 ||
|
|
419
|
+
bytes.slice(0, prepared.rawDataHex.length).toLowerCase() !== prepared.rawDataHex.toLowerCase()
|
|
420
|
+
)
|
|
421
|
+
throw new SigningError('Horcrux changed the signed Tron transaction.')
|
|
422
|
+
const signature = bytes.slice(-130)
|
|
423
|
+
const recovered = Secp256k1.recoverAddress({
|
|
424
|
+
payload: prepared.hash,
|
|
425
|
+
signature: Signature.from(`0x${signature}`),
|
|
426
|
+
})
|
|
427
|
+
if (!Address.isEqual(recovered, Tron.toEvmAddress(options.account)))
|
|
428
|
+
throw new SigningError('Horcrux signature does not belong to the subsidy wallet.')
|
|
429
|
+
return { ...prepared, signature }
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
async function broadcast(parameters: { chain: Chain.Chain; signed: Signed }): Promise<void> {
|
|
433
|
+
assertChain(parameters.chain)
|
|
434
|
+
const { signed } = parameters
|
|
435
|
+
const result = await post(parameters.chain, 'wallet/broadcasttransaction', {
|
|
436
|
+
...signed.transaction,
|
|
437
|
+
signature: [signed.signature],
|
|
438
|
+
})
|
|
439
|
+
const code =
|
|
440
|
+
result['code'] ?? (isObject(result['result']) ? result['result']['code'] : undefined)
|
|
441
|
+
// A duplicate response means this exact signed txID was already submitted.
|
|
442
|
+
if (code === 'DUP_TRANSACTION_ERROR') return
|
|
443
|
+
if (
|
|
444
|
+
result['result'] !== true ||
|
|
445
|
+
(typeof result['txid'] === 'string' &&
|
|
446
|
+
result['txid'].toLowerCase() !== signed.hash.slice(2).toLowerCase())
|
|
447
|
+
)
|
|
448
|
+
throw new BroadcastError(
|
|
449
|
+
'Tron rejected the subsidy transaction.',
|
|
450
|
+
typeof code === 'string' ? code : undefined,
|
|
451
|
+
)
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
async function status(
|
|
455
|
+
parameters: create.StatusOptions,
|
|
456
|
+
): Promise<'pending' | 'reverted' | 'success'> {
|
|
457
|
+
assertChain(parameters.chain)
|
|
458
|
+
const client = Tron.createClient({ fetch: options.fetch, urls: parameters.chain.rpcUrls })
|
|
459
|
+
const receipt = await client.getTransactionReceipt({ hash: parameters.signed.hash })
|
|
460
|
+
if (!receipt) return 'pending'
|
|
461
|
+
const transaction = await client.getTransaction({ hash: parameters.signed.hash })
|
|
462
|
+
if (!transaction) return 'pending'
|
|
463
|
+
const call = transaction.raw_data.contract[0]?.parameter.value
|
|
464
|
+
const expectedData = AbiFunction.encodeData(transfer, [
|
|
465
|
+
Tron.toEvmAddress(parameters.recipient),
|
|
466
|
+
BigInt(parameters.signed.amount),
|
|
467
|
+
]).slice(2)
|
|
468
|
+
if (
|
|
469
|
+
!call ||
|
|
470
|
+
call.owner_address.toLowerCase() !==
|
|
471
|
+
`41${Tron.toEvmAddress(parameters.signed.account).slice(2)}`.toLowerCase() ||
|
|
472
|
+
call.contract_address.toLowerCase() !==
|
|
473
|
+
`41${Tron.toEvmAddress(parameters.token).slice(2)}`.toLowerCase() ||
|
|
474
|
+
call.data.toLowerCase() !== expectedData.toLowerCase() ||
|
|
475
|
+
(call.call_value ?? 0) !== 0
|
|
476
|
+
)
|
|
477
|
+
return 'reverted'
|
|
478
|
+
if (
|
|
479
|
+
receipt.receipt.result !== 'SUCCESS' ||
|
|
480
|
+
receipt.result === 'FAILED' ||
|
|
481
|
+
transaction.ret.some(({ contractRet }) => contractRet !== 'SUCCESS')
|
|
482
|
+
)
|
|
483
|
+
return 'reverted'
|
|
484
|
+
const sender = Tron.toEvmAddress(parameters.signed.account).slice(2).toLowerCase()
|
|
485
|
+
const recipient = Tron.toEvmAddress(parameters.recipient).slice(2).toLowerCase()
|
|
486
|
+
const token = Tron.toEvmAddress(parameters.token).slice(2).toLowerCase()
|
|
487
|
+
const matched = receipt.log?.some(
|
|
488
|
+
(log) =>
|
|
489
|
+
log.address.toLowerCase() === token &&
|
|
490
|
+
log.topics.length === 3 &&
|
|
491
|
+
log.topics[0]?.toLowerCase() === transferTopic.toLowerCase() &&
|
|
492
|
+
log.topics[1]?.slice(24).toLowerCase() === sender &&
|
|
493
|
+
log.topics[2]?.slice(24).toLowerCase() === recipient &&
|
|
494
|
+
/^[0-9a-fA-F]{64}$/.test(log.data) &&
|
|
495
|
+
BigInt(`0x${log.data}`) === BigInt(parameters.signed.amount),
|
|
496
|
+
)
|
|
497
|
+
return matched ? 'success' : 'reverted'
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
async function post(
|
|
501
|
+
chain: Chain.Chain,
|
|
502
|
+
method: string,
|
|
503
|
+
body: object,
|
|
504
|
+
): Promise<Record<string, unknown>> {
|
|
505
|
+
assertChain(chain)
|
|
506
|
+
for (const url of chain.rpcUrls) {
|
|
507
|
+
try {
|
|
508
|
+
const response = await options.fetch(`${url.replace(/\/$/, '')}/${method}`, {
|
|
509
|
+
body: JSON.stringify(body),
|
|
510
|
+
headers: { 'content-type': 'application/json' },
|
|
511
|
+
method: 'POST',
|
|
512
|
+
signal: AbortSignal.timeout(10_000),
|
|
513
|
+
})
|
|
514
|
+
if (!response.ok) continue
|
|
515
|
+
const result: unknown = await response.json()
|
|
516
|
+
if (isObject(result)) return result
|
|
517
|
+
} catch {
|
|
518
|
+
// Try the next configured Tron endpoint.
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
throw new UpstreamError('Tron RPC is unavailable.')
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
return {
|
|
525
|
+
account: options.account,
|
|
526
|
+
broadcast,
|
|
527
|
+
check,
|
|
528
|
+
policy: options.policy,
|
|
529
|
+
prepare,
|
|
530
|
+
sign,
|
|
531
|
+
status,
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
export declare namespace create {
|
|
536
|
+
/** Horcrux and native Tron RPC dependencies. */
|
|
537
|
+
type Options = {
|
|
538
|
+
/** Base58Check subsidy wallet address. */
|
|
539
|
+
account: string
|
|
540
|
+
/** Maximum native fee reserved per transaction, in SUN. */
|
|
541
|
+
feeLimitSun: number
|
|
542
|
+
/** Fetch implementation for Horcrux and chain RPC. */
|
|
543
|
+
fetch: typeof globalThis.fetch
|
|
544
|
+
/** Horcrux connection and authentication. */
|
|
545
|
+
horcrux: {
|
|
546
|
+
auth: { type: 'none' } | { clientId: string; clientSecret: string; type: 'cloudflare-access' }
|
|
547
|
+
url: string
|
|
548
|
+
}
|
|
549
|
+
/** Horcrux Tron wallet UUID. */
|
|
550
|
+
walletId: string
|
|
551
|
+
/** Operational maximum destination subsidy. */
|
|
552
|
+
policy: { maxAmount: string }
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
/** Creation-time inventory request. */
|
|
556
|
+
type CheckOptions = {
|
|
557
|
+
amount: bigint
|
|
558
|
+
chain: Chain.Chain
|
|
559
|
+
recipient: string
|
|
560
|
+
reservations: { nativeAmount: bigint; tokenAmount: bigint }
|
|
561
|
+
token: string
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/** Unsigned transaction preparation request. */
|
|
565
|
+
type PrepareOptions = CheckOptions
|
|
566
|
+
|
|
567
|
+
/** Solidified receipt query and expected destination transfer. */
|
|
568
|
+
type StatusOptions = { chain: Chain.Chain; recipient: string; signed: Signed; token: string }
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
function assertChain(chain: Chain.Chain) {
|
|
572
|
+
if (chain.id !== 'tron:0x2b6653dc' || chain.kind !== 'tron' || chain.rpcUrls.length === 0)
|
|
573
|
+
throw new ConfigurationError('Unsupported Tron subsidy chain.')
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
function isObject(value: unknown): value is Record<string, unknown> {
|
|
577
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/** The Tron subsidy wallet lacks token inventory or native TRX. */
|
|
581
|
+
export class BalanceUnavailableError extends Error {
|
|
582
|
+
override name = 'Routes.TronTransferSubsidy.BalanceUnavailableError'
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/** The Tron subsidy signer or chain configuration is invalid. */
|
|
586
|
+
export class ConfigurationError extends Error {
|
|
587
|
+
override name = 'Routes.TronTransferSubsidy.ConfigurationError'
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/** Horcrux could not provide a verified Tron signature. */
|
|
591
|
+
export class SigningError extends Error {
|
|
592
|
+
override name = 'Routes.TronTransferSubsidy.SigningError'
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/** Tron reported a rejected broadcast. */
|
|
596
|
+
export class BroadcastError extends Error {
|
|
597
|
+
override name = 'Routes.TronTransferSubsidy.BroadcastError'
|
|
598
|
+
|
|
599
|
+
/** Native Tron broadcast rejection code, when supplied by the node. */
|
|
600
|
+
code: string | undefined
|
|
601
|
+
|
|
602
|
+
constructor(message: string, code?: string) {
|
|
603
|
+
super(message)
|
|
604
|
+
this.code = code
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/** Returns whether the signed transaction has a deterministic validation failure. */
|
|
609
|
+
export function isPermanentBroadcastError(cause: unknown): boolean {
|
|
610
|
+
return (
|
|
611
|
+
cause instanceof BroadcastError &&
|
|
612
|
+
['SIGERROR', 'CONTRACT_VALIDATE_ERROR', 'TOO_BIG_TRANSACTION_ERROR'].includes(cause.code ?? '')
|
|
613
|
+
)
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/** Tron RPC failed or returned incompatible transaction data. */
|
|
617
|
+
export class UpstreamError extends Error {
|
|
618
|
+
override name = 'Routes.TronTransferSubsidy.UpstreamError'
|
|
619
|
+
}
|
|
@@ -12,14 +12,17 @@ test('exports routes modules', () => {
|
|
|
12
12
|
"Evidence",
|
|
13
13
|
"Observability",
|
|
14
14
|
"Provider",
|
|
15
|
+
"Quota",
|
|
15
16
|
"Reconciliation",
|
|
16
17
|
"Route",
|
|
18
|
+
"SolanaTransferSubsidy",
|
|
17
19
|
"SourceObservation",
|
|
18
20
|
"Subsidy",
|
|
19
21
|
"Token",
|
|
20
22
|
"Transfer",
|
|
21
23
|
"TransferReconciliation",
|
|
22
24
|
"TransferSubsidy",
|
|
25
|
+
"TronTransferSubsidy",
|
|
23
26
|
]
|
|
24
27
|
`)
|
|
25
28
|
})
|
|
@@ -7,11 +7,14 @@ export * as DepositWebhook from './DepositWebhook.js'
|
|
|
7
7
|
export * as Evidence from './Evidence.js'
|
|
8
8
|
export * as Observability from './Observability.js'
|
|
9
9
|
export * as Provider from './Provider.js'
|
|
10
|
+
export * as Quota from './Quota.js'
|
|
10
11
|
export * as Reconciliation from './Reconciliation.js'
|
|
11
12
|
export * as Route from './Route.js'
|
|
13
|
+
export * as SolanaTransferSubsidy from './SolanaTransferSubsidy.js'
|
|
12
14
|
export * as SourceObservation from './SourceObservation.js'
|
|
13
15
|
export * as Subsidy from './Subsidy.js'
|
|
14
16
|
export * as Token from './Token.js'
|
|
15
17
|
export * as Transfer from './Transfer.js'
|
|
16
18
|
export * as TransferReconciliation from './TransferReconciliation.js'
|
|
17
19
|
export * as TransferSubsidy from './TransferSubsidy.js'
|
|
20
|
+
export * as TronTransferSubsidy from './TronTransferSubsidy.js'
|