tapimo 0.15.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +896 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +33 -33
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +454 -1
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +10 -4
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +24 -4
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +99 -103
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +5 -5
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +1 -19
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +93 -56
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +10 -10
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/rpc.js +45 -11
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +12 -12
- package/dist/apps/data/routes/valuation.d.ts +30 -30
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +1 -1
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +18 -11
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +3 -3
- package/dist/apps/management/App.d.ts +3043 -2198
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +16 -4
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +24 -24
- package/dist/apps/management/routes/invite-links.d.ts +66 -66
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +20 -20
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +76 -76
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +7 -9
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +119 -119
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +16 -3
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +90 -0
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +187 -135
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +418 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
- package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.js +65 -44
- package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +73 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +212 -85
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +4 -1
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +353 -42
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/apps/verified-tokens.test.ts +32 -0
- package/src/admin/apps/verified-tokens.ts +30 -4
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/__root.tsx +1 -1
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +35 -4
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
- package/src/admin/ui.generated.ts +99 -104
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/App.test.ts +26 -0
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +153 -2
- package/src/apps/data/routes/fee-amm.ts +132 -62
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +34 -2
- package/src/apps/data/routes/rpc.ts +47 -10
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
- package/src/apps/data/routes/webhooks.test.ts +18 -3
- package/src/apps/data/routes/webhooks.ts +27 -13
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
- package/src/apps/management/routes/verified-token-requests.ts +7 -10
- package/src/apps/mcp.test.ts +108 -25
- package/src/apps/mcp.ts +15 -3
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +507 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +133 -0
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
- package/src/db/tables/verifiedTokenRequests.ts +80 -44
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +383 -8
- package/src/internal/Auth.ts +272 -99
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1299 -18
- package/src/internal/routes/providers/relay.ts +424 -39
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Hono } from 'hono'
|
|
2
2
|
import * as z from 'zod/mini'
|
|
3
|
-
import { base, mainnet } from 'viem/chains'
|
|
4
3
|
import { tempo } from 'viem/tempo/chains'
|
|
5
4
|
|
|
6
5
|
import * as Db from '../../db/Db.js'
|
|
7
6
|
import * as OpenApi from '../../internal/OpenApi.js'
|
|
8
7
|
import * as RoutesCatalog from '../../internal/routes/Catalog.js'
|
|
8
|
+
import * as RoutesTransferSubsidy from '../../internal/routes/TransferSubsidy.js'
|
|
9
9
|
import type * as App from '../App.js'
|
|
10
10
|
|
|
11
11
|
/** Zod schemas owned by the admin route support matrix. */
|
|
@@ -159,6 +159,7 @@ function summarize(routes: readonly RoutesCatalog.ProviderRoute[]) {
|
|
|
159
159
|
const rows = new Map<string, Row>()
|
|
160
160
|
for (const providerRoute of routes) {
|
|
161
161
|
const { capabilities, providerId, route } = providerRoute
|
|
162
|
+
if (!isPartnerRoute(route)) continue
|
|
162
163
|
const id = `${route.source.chain.id}/${route.source.slug}-${route.destination.chain.id}/${route.destination.slug}`
|
|
163
164
|
const row = rows.get(id) ?? {
|
|
164
165
|
depositAddressProviders: [],
|
|
@@ -183,8 +184,11 @@ function summarize(routes: readonly RoutesCatalog.ProviderRoute[]) {
|
|
|
183
184
|
row.walletTransferProviders.push({ modes: [...capabilities.transfer.modes], providerId })
|
|
184
185
|
row.subsidies.walletTransfer ||=
|
|
185
186
|
capabilities.transfer.modes.includes('exactSource') &&
|
|
186
|
-
|
|
187
|
-
|
|
187
|
+
RoutesTransferSubsidy.supportsRoute({
|
|
188
|
+
destinationChainId: route.destination.chain.id,
|
|
189
|
+
sourceChainId: route.source.chain.id,
|
|
190
|
+
tempoChainId: tempo.id,
|
|
191
|
+
}) &&
|
|
188
192
|
usdPair
|
|
189
193
|
}
|
|
190
194
|
rows.set(id, row)
|
|
@@ -192,6 +196,42 @@ function summarize(routes: readonly RoutesCatalog.ProviderRoute[]) {
|
|
|
192
196
|
return [...rows.values()]
|
|
193
197
|
}
|
|
194
198
|
|
|
199
|
+
function isPartnerRoute(route: RoutesCatalog.ProviderRoute['route']) {
|
|
200
|
+
const { destination, source } = route
|
|
201
|
+
if (destination.chain.slug === 'tempo') {
|
|
202
|
+
if (source.chain.slug === 'tempo') return false
|
|
203
|
+
if (source.slug === 'usdc') {
|
|
204
|
+
if (['pathusd', 'whishusd'].includes(destination.slug)) return true
|
|
205
|
+
return (
|
|
206
|
+
['base', 'ethereum', 'solana'].includes(source.chain.slug) &&
|
|
207
|
+
['ousd', 'usdce', 'usdt0'].includes(destination.slug)
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
return (
|
|
211
|
+
source.chain.slug === 'tron' &&
|
|
212
|
+
source.slug === 'usdt' &&
|
|
213
|
+
['ousd', 'pathusd', 'usdce', 'usdt0', 'whishusd'].includes(destination.slug)
|
|
214
|
+
)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (source.chain.slug !== 'tempo') return false
|
|
218
|
+
if (destination.chain.slug === 'tempo') return false
|
|
219
|
+
if (destination.slug === 'usdc') {
|
|
220
|
+
if (['pathusd', 'whishusd'].includes(source.slug)) return true
|
|
221
|
+
if (source.slug === 'usdt0')
|
|
222
|
+
return ['base', 'ethereum', 'solana'].includes(destination.chain.slug)
|
|
223
|
+
return (
|
|
224
|
+
['ousd', 'usdce'].includes(source.slug) &&
|
|
225
|
+
['base', 'ethereum', 'solana'].includes(destination.chain.slug)
|
|
226
|
+
)
|
|
227
|
+
}
|
|
228
|
+
return (
|
|
229
|
+
destination.chain.slug === 'tron' &&
|
|
230
|
+
destination.slug === 'usdt' &&
|
|
231
|
+
['ousd', 'pathusd', 'usdce', 'usdt0', 'whishusd'].includes(source.slug)
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
|
|
195
235
|
function pickChain(chain: RoutesCatalog.ProviderRoute['route']['source']['chain']) {
|
|
196
236
|
return { id: chain.id, name: chain.name, slug: chain.slug }
|
|
197
237
|
}
|
|
@@ -137,6 +137,127 @@ describe('GET /routes/transfers/:id', () => {
|
|
|
137
137
|
])
|
|
138
138
|
expect(body).not.toHaveProperty('providerState')
|
|
139
139
|
})
|
|
140
|
+
|
|
141
|
+
test.each([
|
|
142
|
+
{ provider: 'relay', requestId: `0x${'ab'.repeat(32)}`, expected: [`0x${'ab'.repeat(32)}`] },
|
|
143
|
+
{ provider: 'stargate', requestId: `0x${'ab'.repeat(32)}`, expected: [] },
|
|
144
|
+
{ provider: 'relay', requestId: undefined, expected: [] },
|
|
145
|
+
{ provider: 'relay', requestId: 42, expected: [] },
|
|
146
|
+
])(
|
|
147
|
+
'exposes only Relay request identifiers: $provider/$requestId',
|
|
148
|
+
async ({ provider, requestId, expected }) => {
|
|
149
|
+
const { client, db } = TestAdmin.setup()
|
|
150
|
+
const { organization, project } = await seedAttribution(db)
|
|
151
|
+
const record = await Transfer.create(db, {
|
|
152
|
+
apiKeyId: 'key_admin_routes',
|
|
153
|
+
environment: 'production',
|
|
154
|
+
orgId: organization.id,
|
|
155
|
+
projectId: project.id,
|
|
156
|
+
providerState: { checkEndpoint: '/private/check', requestId, secret: 'hidden' },
|
|
157
|
+
snapshot: TestRoutes.transferSnapshot({ provider: { id: provider, name: provider } }),
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
const response = await client.routes.transfers[':id'].$get({ param: { id: record.id } })
|
|
161
|
+
const body = await response.json()
|
|
162
|
+
expect(response.status).toBe(200)
|
|
163
|
+
expect(body).toHaveProperty('providerRequestIds', expected)
|
|
164
|
+
expect(body).not.toHaveProperty('providerState')
|
|
165
|
+
expect(JSON.stringify(body)).not.toContain('/private/check')
|
|
166
|
+
expect(JSON.stringify(body)).not.toContain('hidden')
|
|
167
|
+
},
|
|
168
|
+
)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
describe('POST /routes/transfers/:id/retry', () => {
|
|
172
|
+
test('returns an action-required transfer to processing and records the event', async () => {
|
|
173
|
+
const { client, db } = TestAdmin.setup()
|
|
174
|
+
const { organization, project } = await seedAttribution(db)
|
|
175
|
+
const record = await seedActionRequiredTransfer(db, organization.id, project.id)
|
|
176
|
+
|
|
177
|
+
const response = await client.routes.transfers[':id'].retry.$post({
|
|
178
|
+
json: { version: record.version },
|
|
179
|
+
param: { id: record.id },
|
|
180
|
+
})
|
|
181
|
+
const body = await TestApp.json(response, AdminRoutes.schema.retryRoutesTransfer.Response)
|
|
182
|
+
|
|
183
|
+
expect(response.status).toBe(200)
|
|
184
|
+
expect(body).toMatchObject({ id: record.id, status: 'processing', version: record.version + 1 })
|
|
185
|
+
expect(body).not.toHaveProperty('statusReason')
|
|
186
|
+
const detail = await client.routes.transfers[':id'].$get({ param: { id: record.id } })
|
|
187
|
+
const { events } = await TestApp.json(detail, AdminRoutes.schema.getRoutesTransfer.Response)
|
|
188
|
+
expect(events.map(({ status }) => status)).toEqual([
|
|
189
|
+
'awaiting-source',
|
|
190
|
+
'processing',
|
|
191
|
+
'action-required',
|
|
192
|
+
'processing',
|
|
193
|
+
])
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
test('rejects a stale version', async () => {
|
|
197
|
+
const { client, db } = TestAdmin.setup()
|
|
198
|
+
const { organization, project } = await seedAttribution(db)
|
|
199
|
+
const record = await seedActionRequiredTransfer(db, organization.id, project.id)
|
|
200
|
+
|
|
201
|
+
const response = await client.routes.transfers[':id'].retry.$post({
|
|
202
|
+
json: { version: record.version - 1 },
|
|
203
|
+
param: { id: record.id },
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
expect(response.status).toBe(409)
|
|
207
|
+
expect(await response.json()).toMatchObject({ error: { code: 'version_conflict' } })
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
test('rejects a transfer that is not action-required', async () => {
|
|
211
|
+
const { client, db } = TestAdmin.setup()
|
|
212
|
+
const { organization, project } = await seedAttribution(db)
|
|
213
|
+
const { record } = await seedTransfer(db, organization.id, project.id)
|
|
214
|
+
|
|
215
|
+
const response = await client.routes.transfers[':id'].retry.$post({
|
|
216
|
+
json: { version: record.version + 1 },
|
|
217
|
+
param: { id: record.id },
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
expect(response.status).toBe(409)
|
|
221
|
+
expect(await response.json()).toMatchObject({
|
|
222
|
+
error: { code: 'routes_transfer_not_retryable' },
|
|
223
|
+
})
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
test.each([
|
|
227
|
+
{ providerState: { transferSubsidy: { hash: `0x${'cd'.repeat(32)}` } } },
|
|
228
|
+
{ providerState: { solanaTransferSubsidyPrepared: '{}' } },
|
|
229
|
+
{ providerState: { tronTransferSubsidyPrepared: '{}' } },
|
|
230
|
+
])(
|
|
231
|
+
'rejects a transfer with a prepared or signed subsidy: $providerState',
|
|
232
|
+
async ({ providerState }) => {
|
|
233
|
+
const { client, db } = TestAdmin.setup()
|
|
234
|
+
const { organization, project } = await seedAttribution(db)
|
|
235
|
+
const record = await seedActionRequiredTransfer(db, organization.id, project.id, {
|
|
236
|
+
providerState,
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
const response = await client.routes.transfers[':id'].retry.$post({
|
|
240
|
+
json: { version: record.version },
|
|
241
|
+
param: { id: record.id },
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
expect(response.status).toBe(409)
|
|
245
|
+
expect(await response.json()).toMatchObject({
|
|
246
|
+
error: { code: 'routes_transfer_subsidy_pending' },
|
|
247
|
+
})
|
|
248
|
+
},
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
test('returns 404 for an unknown transfer', async () => {
|
|
252
|
+
const { client } = TestAdmin.setup()
|
|
253
|
+
|
|
254
|
+
const response = await client.routes.transfers[':id'].retry.$post({
|
|
255
|
+
json: { version: 1 },
|
|
256
|
+
param: { id: 'rtr_001785792000000_2ZPE2gvateYEQ0dQslgvkhjx' },
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
expect(response.status).toBe(404)
|
|
260
|
+
})
|
|
140
261
|
})
|
|
141
262
|
|
|
142
263
|
describe('GET /routes/deposit-addresses', () => {
|
|
@@ -371,6 +492,35 @@ async function seedTransfer(db: Db.Db, orgId: string, projectId: string) {
|
|
|
371
492
|
return { record, transactionRef }
|
|
372
493
|
}
|
|
373
494
|
|
|
495
|
+
async function seedActionRequiredTransfer(
|
|
496
|
+
db: Db.Db,
|
|
497
|
+
orgId: string,
|
|
498
|
+
projectId: string,
|
|
499
|
+
options: seedActionRequiredTransfer.Options = {},
|
|
500
|
+
) {
|
|
501
|
+
const { record } = await seedTransfer(db, orgId, projectId)
|
|
502
|
+
const result = await Transfer.transition(db, {
|
|
503
|
+
expectedVersion: record.version + 1,
|
|
504
|
+
id: record.id,
|
|
505
|
+
...(options.providerState ? { providerState: options.providerState } : {}),
|
|
506
|
+
status: 'action-required',
|
|
507
|
+
statusReason: {
|
|
508
|
+
code: 'subsidy_failed',
|
|
509
|
+
message: 'Destination subsidy settlement is unavailable.',
|
|
510
|
+
},
|
|
511
|
+
})
|
|
512
|
+
if (result.type !== 'applied') throw new Error('Failed to seed action-required transfer.')
|
|
513
|
+
return result.record
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
declare namespace seedActionRequiredTransfer {
|
|
517
|
+
/** Private state attached while entering `action-required`. */
|
|
518
|
+
type Options = {
|
|
519
|
+
/** Replacement provider state, such as a persisted subsidy transaction. */
|
|
520
|
+
providerState?: Transfer.ProviderState | undefined
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
374
524
|
async function seedDeposit(
|
|
375
525
|
db: Db.Db,
|
|
376
526
|
orgId: string,
|
package/src/admin/apps/routes.ts
CHANGED
|
@@ -13,6 +13,7 @@ import * as Cursor from '../../internal/Cursor.js'
|
|
|
13
13
|
import * as Deposit from '../../internal/routes/Deposit.js'
|
|
14
14
|
import * as DepositAddress from '../../internal/routes/DepositAddress.js'
|
|
15
15
|
import * as Provider from '../../internal/routes/Provider.js'
|
|
16
|
+
import * as Observability from '../../internal/routes/Observability.js'
|
|
16
17
|
import * as Transfer from '../../internal/routes/Transfer.js'
|
|
17
18
|
import * as OpenApi from '../../internal/OpenApi.js'
|
|
18
19
|
import * as Response from '../../internal/Response.js'
|
|
@@ -323,6 +324,7 @@ export namespace schema {
|
|
|
323
324
|
}),
|
|
324
325
|
)
|
|
325
326
|
.check(z.describe('Material lifecycle events, oldest first.')),
|
|
327
|
+
providerRequestIds: correlationIds,
|
|
326
328
|
transactions: z
|
|
327
329
|
.array(
|
|
328
330
|
z.object({
|
|
@@ -344,6 +346,24 @@ export namespace schema {
|
|
|
344
346
|
)
|
|
345
347
|
}
|
|
346
348
|
|
|
349
|
+
/** Schemas for retrying one stuck route transfer. */
|
|
350
|
+
export namespace retryRoutesTransfer {
|
|
351
|
+
/** Transfer path parameters. */
|
|
352
|
+
export const Params = getRoutesTransfer.Params
|
|
353
|
+
|
|
354
|
+
/** Expected transfer version. */
|
|
355
|
+
export const Body = z
|
|
356
|
+
.strictObject({
|
|
357
|
+
version: z
|
|
358
|
+
.number()
|
|
359
|
+
.check(z.int(), z.minimum(1), z.describe('Transfer version the operator reviewed.'), z.meta({ examples: [22] })), // prettier-ignore
|
|
360
|
+
})
|
|
361
|
+
.check(z.describe('Route transfer retry request.'))
|
|
362
|
+
|
|
363
|
+
/** Retried route transfer, back in `processing`. */
|
|
364
|
+
export const Response = RoutesTransfer
|
|
365
|
+
}
|
|
366
|
+
|
|
347
367
|
/** Schemas for listing deposit addresses. */
|
|
348
368
|
export namespace listRoutesDepositAddresses {
|
|
349
369
|
/** Deposit-address filters and pagination. */
|
|
@@ -438,7 +458,7 @@ export namespace schema {
|
|
|
438
458
|
}
|
|
439
459
|
}
|
|
440
460
|
|
|
441
|
-
/**
|
|
461
|
+
/** Routes operations for authenticated administrators. */
|
|
442
462
|
export function routes() {
|
|
443
463
|
return new Hono<App.Environment>()
|
|
444
464
|
.get(
|
|
@@ -601,6 +621,12 @@ export function routes() {
|
|
|
601
621
|
...(event.snapshot.statusReason ? { statusReason: event.snapshot.statusReason } : {}),
|
|
602
622
|
version: event.version,
|
|
603
623
|
})),
|
|
624
|
+
providerRequestIds:
|
|
625
|
+
record.snapshot.provider.id === 'relay' &&
|
|
626
|
+
typeof record.providerState?.['requestId'] === 'string' &&
|
|
627
|
+
record.providerState['requestId'].length > 0
|
|
628
|
+
? [record.providerState['requestId']]
|
|
629
|
+
: [],
|
|
604
630
|
transactions: transactions.map(({ chainId, createdAt, role, transactionRef }) => ({
|
|
605
631
|
chainId,
|
|
606
632
|
createdAt,
|
|
@@ -612,6 +638,76 @@ export function routes() {
|
|
|
612
638
|
)
|
|
613
639
|
},
|
|
614
640
|
)
|
|
641
|
+
.post(
|
|
642
|
+
'/transfers/:id/retry',
|
|
643
|
+
OpenApi.validate('param', schema.retryRoutesTransfer.Params, {
|
|
644
|
+
code: 'param_invalid',
|
|
645
|
+
message: 'Invalid path parameters',
|
|
646
|
+
}),
|
|
647
|
+
OpenApi.validate('json', schema.retryRoutesTransfer.Body, {
|
|
648
|
+
code: 'body_invalid',
|
|
649
|
+
message: 'Invalid request body',
|
|
650
|
+
}),
|
|
651
|
+
OpenApi.describeRoute({
|
|
652
|
+
operationId: 'retryAdminRoutesTransfer',
|
|
653
|
+
responses: OpenApi.responses({
|
|
654
|
+
errors: {
|
|
655
|
+
404: 'Route transfer not found.',
|
|
656
|
+
409: 'Route transfer changed or cannot be retried.',
|
|
657
|
+
},
|
|
658
|
+
success: {
|
|
659
|
+
description: 'The retried route transfer.',
|
|
660
|
+
schema: schema.retryRoutesTransfer.Response,
|
|
661
|
+
},
|
|
662
|
+
}),
|
|
663
|
+
summary: 'Retry route transfer',
|
|
664
|
+
tags: ['Routes'],
|
|
665
|
+
}),
|
|
666
|
+
async (c) => {
|
|
667
|
+
const db = Db.get(c.get('db'))
|
|
668
|
+
// The worker's reconciliation sweep dispatches every `processing` transfer on its next tick.
|
|
669
|
+
const result = await Transfer.retry(db, {
|
|
670
|
+
expectedVersion: c.req.valid('json').version,
|
|
671
|
+
id: c.req.valid('param').id,
|
|
672
|
+
})
|
|
673
|
+
if (result.type === 'not_found')
|
|
674
|
+
return Response.error(c, {
|
|
675
|
+
code: 'routes_transfer_not_found',
|
|
676
|
+
message: 'Route transfer not found.',
|
|
677
|
+
status: 404,
|
|
678
|
+
})
|
|
679
|
+
if (result.type === 'stale')
|
|
680
|
+
return Response.error(c, {
|
|
681
|
+
code: 'version_conflict',
|
|
682
|
+
message: 'Route transfer version is stale.',
|
|
683
|
+
status: 409,
|
|
684
|
+
})
|
|
685
|
+
if (result.type === 'invalid')
|
|
686
|
+
return Response.error(c, {
|
|
687
|
+
code: 'routes_transfer_not_retryable',
|
|
688
|
+
message: 'Only action-required transfers can be retried.',
|
|
689
|
+
status: 409,
|
|
690
|
+
})
|
|
691
|
+
if (result.type === 'subsidy_pending')
|
|
692
|
+
return Response.error(c, {
|
|
693
|
+
code: 'routes_transfer_subsidy_pending',
|
|
694
|
+
message: 'Route transfer has a prepared or signed subsidy; verify it on chain first.',
|
|
695
|
+
status: 409,
|
|
696
|
+
})
|
|
697
|
+
Observability.recordTransfer(c.get('metrics'), {
|
|
698
|
+
previous: result.previous,
|
|
699
|
+
record: result.record,
|
|
700
|
+
})
|
|
701
|
+
const attribution = await loadAttribution(db, [result.record])
|
|
702
|
+
return c.json(
|
|
703
|
+
Response.validated(
|
|
704
|
+
schema.retryRoutesTransfer.Response,
|
|
705
|
+
serializeTransfer(result.record, attribution),
|
|
706
|
+
),
|
|
707
|
+
200,
|
|
708
|
+
)
|
|
709
|
+
},
|
|
710
|
+
)
|
|
615
711
|
.get(
|
|
616
712
|
'/deposit-addresses',
|
|
617
713
|
OpenApi.validate('query', schema.listRoutesDepositAddresses.Query, {
|
|
@@ -55,7 +55,7 @@ describe('GET /scopes', () => {
|
|
|
55
55
|
"selfServe": false,
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
|
-
"description": "
|
|
58
|
+
"description": "Register wallet and Earn vault reward eligibility associations.",
|
|
59
59
|
"scope": "rewards:write",
|
|
60
60
|
"selfServe": false,
|
|
61
61
|
},
|
|
@@ -390,6 +390,38 @@ describe('GET /verified-tokens/requests', () => {
|
|
|
390
390
|
const reviewedBody = await TestApp.json(reviewed, Verified.schema.listVerifiedTokenRequests.Response) // prettier-ignore
|
|
391
391
|
expect(reviewedBody.data.map(({ id }) => id)).toEqual([denied!.id])
|
|
392
392
|
})
|
|
393
|
+
|
|
394
|
+
test('paginates maximum-size queue rows five at a time', async () => {
|
|
395
|
+
const { client, db } = TestAdmin.setup()
|
|
396
|
+
const logo = `<svg>${'x'.repeat(256 * 1024 - 11)}</svg>`
|
|
397
|
+
for (let index = 1; index <= 6; index++)
|
|
398
|
+
await VerifiedTokenRequests.create(db, {
|
|
399
|
+
...requestInput,
|
|
400
|
+
address: `0x${index.toString(16).padStart(40, '0')}`,
|
|
401
|
+
logo,
|
|
402
|
+
symbol: `T${index}`,
|
|
403
|
+
})
|
|
404
|
+
|
|
405
|
+
const firstResponse = await client['verified-tokens'].requests.$get({ query: { limit: '50' } })
|
|
406
|
+
const first = await TestApp.json(
|
|
407
|
+
firstResponse,
|
|
408
|
+
Verified.schema.listVerifiedTokenRequests.Response,
|
|
409
|
+
)
|
|
410
|
+
expect(first.data).toHaveLength(5)
|
|
411
|
+
expect(first.data.every((request) => request.logo?.length === 256 * 1024)).toBe(true)
|
|
412
|
+
expect(first.nextCursor).toEqual(expect.any(String))
|
|
413
|
+
|
|
414
|
+
const secondResponse = await client['verified-tokens'].requests.$get({
|
|
415
|
+
query: { cursor: first.nextCursor!, limit: '50' },
|
|
416
|
+
})
|
|
417
|
+
const second = await TestApp.json(
|
|
418
|
+
secondResponse,
|
|
419
|
+
Verified.schema.listVerifiedTokenRequests.Response,
|
|
420
|
+
)
|
|
421
|
+
expect(second.data).toHaveLength(1)
|
|
422
|
+
expect(second.nextCursor).toBeNull()
|
|
423
|
+
expect(new Set([...first.data, ...second.data].map(({ id }) => id)).size).toBe(6)
|
|
424
|
+
})
|
|
393
425
|
})
|
|
394
426
|
|
|
395
427
|
describe('POST /verified-tokens/requests/:requestId/approve', () => {
|
|
@@ -2,6 +2,7 @@ import { type Context, Hono } from 'hono'
|
|
|
2
2
|
import * as z from 'zod/mini'
|
|
3
3
|
|
|
4
4
|
import * as AssetResponse from '../../internal/AssetResponse.js'
|
|
5
|
+
import * as Cursor from '../../internal/Cursor.js'
|
|
5
6
|
import * as OpenApi from '../../internal/OpenApi.js'
|
|
6
7
|
import * as Response from '../../internal/Response.js'
|
|
7
8
|
import * as Schema from '../../internal/Schema.js'
|
|
@@ -15,6 +16,8 @@ import type * as App from '../App.js'
|
|
|
15
16
|
|
|
16
17
|
/** Required `chainId` query: admin mutations always address a chain explicitly. */
|
|
17
18
|
const ChainIdQuery = Schema.ChainId
|
|
19
|
+
/** Maximum rows per review-queue response, bounding inline SVG payloads to 1.25 MiB. */
|
|
20
|
+
const maxRequestPage = 5
|
|
18
21
|
|
|
19
22
|
/** Zod schemas owned by the admin verified-tokens handler. */
|
|
20
23
|
export namespace schema {
|
|
@@ -157,6 +160,16 @@ export namespace schema {
|
|
|
157
160
|
/** Query parameters for the request queue. */
|
|
158
161
|
export const Query = z
|
|
159
162
|
.strictObject({
|
|
163
|
+
cursor: Schema.Cursor,
|
|
164
|
+
limit: z
|
|
165
|
+
.pipe(
|
|
166
|
+
Schema.Limit,
|
|
167
|
+
z.transform((value) => Math.min(value, maxRequestPage)),
|
|
168
|
+
)
|
|
169
|
+
.check(
|
|
170
|
+
z.describe(`How many requests to return (5 maximum, default ${maxRequestPage}).`),
|
|
171
|
+
z.meta({ examples: [maxRequestPage] }),
|
|
172
|
+
),
|
|
160
173
|
status: z
|
|
161
174
|
._default(z.enum(['approved', 'denied', 'pending']), 'pending')
|
|
162
175
|
.check(z.describe('Review status to filter by.')),
|
|
@@ -167,8 +180,9 @@ export namespace schema {
|
|
|
167
180
|
export const Response = Schema.describe(
|
|
168
181
|
z.object({
|
|
169
182
|
data: z.array(Request).check(z.describe('Requests in the selected status, oldest first.')),
|
|
183
|
+
nextCursor: Schema.NextCursor,
|
|
170
184
|
}),
|
|
171
|
-
'
|
|
185
|
+
'A page of verified-token requests in review-queue order.',
|
|
172
186
|
)
|
|
173
187
|
}
|
|
174
188
|
|
|
@@ -558,14 +572,26 @@ export function verifiedTokens() {
|
|
|
558
572
|
}),
|
|
559
573
|
async (c) => {
|
|
560
574
|
const db = Db.get(c.get('db'))
|
|
561
|
-
const { status } = c.req.valid('query')
|
|
562
|
-
const
|
|
575
|
+
const { cursor, limit, status } = c.req.valid('query')
|
|
576
|
+
const decoded = cursor ? Cursor.decode(cursor, ['timestamp', 'id']) : undefined
|
|
577
|
+
const records = await VerifiedTokenRequests.listByStatus(db, status, {
|
|
578
|
+
...(decoded
|
|
579
|
+
? { cursor: { createdAt: String(decoded[0]), id: String(decoded[1]) } }
|
|
580
|
+
: {}),
|
|
581
|
+
limit: limit + 1,
|
|
582
|
+
})
|
|
583
|
+
const page = Cursor.paginate({
|
|
584
|
+
key: (record) => [record.createdAt, record.id],
|
|
585
|
+
limit,
|
|
586
|
+
rows: records,
|
|
587
|
+
})
|
|
563
588
|
return c.json(
|
|
564
589
|
Response.validated(schema.listVerifiedTokenRequests.Response, {
|
|
565
|
-
data:
|
|
590
|
+
data: page.rows.map((record) => ({
|
|
566
591
|
...VerifiedTokenRequests.toRequest(record),
|
|
567
592
|
orgName: record.orgName,
|
|
568
593
|
})),
|
|
594
|
+
nextCursor: page.nextCursor,
|
|
569
595
|
}),
|
|
570
596
|
)
|
|
571
597
|
},
|
package/src/admin/index.ts
CHANGED
package/src/admin/ui/plugin.ts
CHANGED
|
@@ -23,7 +23,8 @@ const outFile = path.join(here, '..', 'ui.generated.ts')
|
|
|
23
23
|
// Total gzipped budget for the whole UI; the React + TanStack + Regen baseline
|
|
24
24
|
// is heavier than a hand-rolled SPA, so fail loudly before it bloats the
|
|
25
25
|
// package. Raise deliberately (and revisit code-splitting) if it trips.
|
|
26
|
-
|
|
26
|
+
// Includes the independently added route-policy and route-support screens.
|
|
27
|
+
const maxGzipBytes = 500_000
|
|
27
28
|
|
|
28
29
|
const contentTypes: Record<string, string> = {
|
|
29
30
|
'.css': 'text/css; charset=utf-8',
|
|
@@ -9,7 +9,7 @@ function Popup(props: { children: ReactNode; className?: string | undefined }) {
|
|
|
9
9
|
<Base.Backdrop className="fixed inset-0 z-40 bg-black/60 transition-opacity duration-150 data-[ending-style]:opacity-0 data-[starting-style]:opacity-0" />
|
|
10
10
|
<Base.Popup
|
|
11
11
|
className={cx(
|
|
12
|
-
'fixed left-1/2 top-1/2 z-50 w-[calc(100vw-2rem)] max-w-
|
|
12
|
+
'fixed left-1/2 top-1/2 z-50 w-[calc(100vw-2rem)] max-w-3xl -translate-x-1/2 -translate-y-1/2 border border-border bg-surface p-6 shadow-lg outline-none transition-opacity duration-150 data-[ending-style]:opacity-0 data-[starting-style]:opacity-0',
|
|
13
13
|
props.className,
|
|
14
14
|
)}
|
|
15
15
|
>
|
|
@@ -30,6 +30,51 @@ export function EarnVaultForm(options: EarnVaultForm.Props) {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
export namespace EarnVaultForm {
|
|
33
|
+
/** Per-vault incoming reward counterparties. */
|
|
34
|
+
export function Earnings(options: Earnings.Props) {
|
|
35
|
+
return (
|
|
36
|
+
<fieldset className="group flex min-w-0 flex-col gap-3 border-t border-border pt-5 max-sm:[&_textarea]:text-copy-16">
|
|
37
|
+
<legend className="text-label-14 text-foreground">Earnings accounting</legend>
|
|
38
|
+
<label className="flex items-center gap-2 text-label-13 text-foreground">
|
|
39
|
+
<input
|
|
40
|
+
className="size-5 shrink-0 sm:size-4"
|
|
41
|
+
defaultChecked={options.value === null}
|
|
42
|
+
name="inheritEarnings"
|
|
43
|
+
type="checkbox"
|
|
44
|
+
/>
|
|
45
|
+
Use recorded campaign distributors only
|
|
46
|
+
</label>
|
|
47
|
+
<p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
|
|
48
|
+
Recorded campaign distributors are always included. Outgoing shares count as withdrawals
|
|
49
|
+
for every recipient or spender, with no configuration required.
|
|
50
|
+
</p>
|
|
51
|
+
<div className="flex flex-col gap-3 group-has-checked:hidden">
|
|
52
|
+
<p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
|
|
53
|
+
Add dedicated reward distributors for this vault. You do not need to copy recorded
|
|
54
|
+
campaign distributors, including historical ones.
|
|
55
|
+
</p>
|
|
56
|
+
<Textarea
|
|
57
|
+
defaultValue={options.value?.rewardDistributors.join('\n')}
|
|
58
|
+
label="Additional reward distributors"
|
|
59
|
+
name="rewardDistributors"
|
|
60
|
+
placeholder="One address per line"
|
|
61
|
+
rows={5}
|
|
62
|
+
spellCheck={false}
|
|
63
|
+
/>
|
|
64
|
+
<p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
|
|
65
|
+
Shares received from these addresses count as earnings. Do not add card spenders or
|
|
66
|
+
refund handlers: returned shares could be incorrectly counted as rewards.
|
|
67
|
+
</p>
|
|
68
|
+
</div>
|
|
69
|
+
</fieldset>
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export namespace Earnings {
|
|
74
|
+
/** Saved settings, or null for campaign defaults. */
|
|
75
|
+
export type Props = { value: EarnVaults.Vault['earnings'] }
|
|
76
|
+
}
|
|
77
|
+
|
|
33
78
|
/** Props for the verified-vault form shell. */
|
|
34
79
|
export type Props = {
|
|
35
80
|
/** Primary form action. */
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import { Button, Select, cx } from 'regen-ui'
|
|
3
|
+
|
|
4
|
+
import * as Policies from '../lib/route-policies.js'
|
|
5
|
+
|
|
6
|
+
/** Adds complete catalog routes through mutually filtered network, token, and provider choices. */
|
|
7
|
+
export function RoutePicker(options: RoutePicker.Props) {
|
|
8
|
+
const [selection, setSelection] = useState<Policies.RouteSelection>({})
|
|
9
|
+
const rule = selection.providerId ? Policies.selectedRoute(selection) : undefined
|
|
10
|
+
const duplicate =
|
|
11
|
+
rule &&
|
|
12
|
+
options.selected.some((selected) =>
|
|
13
|
+
fields.every(({ field }) => selected[field] === rule[field]),
|
|
14
|
+
)
|
|
15
|
+
return (
|
|
16
|
+
<fieldset
|
|
17
|
+
aria-label={`Add ${options.label.toLowerCase()} route`}
|
|
18
|
+
className={cx('@container flex min-w-0 flex-col gap-3', options.className)}
|
|
19
|
+
>
|
|
20
|
+
<div className="grid gap-3 @sm:grid-cols-2 @3xl:grid-cols-5">
|
|
21
|
+
{fields.map(({ field, label, placeholder }) => (
|
|
22
|
+
<label
|
|
23
|
+
className="flex min-w-0 flex-col gap-2 text-label-12 text-foreground-secondary"
|
|
24
|
+
key={field}
|
|
25
|
+
>
|
|
26
|
+
{label}
|
|
27
|
+
<Select
|
|
28
|
+
aria-label={label}
|
|
29
|
+
className="w-full min-w-0"
|
|
30
|
+
items={[
|
|
31
|
+
{ label: placeholder, value: '' },
|
|
32
|
+
...Policies.routeOptions(options.routes, selection, field),
|
|
33
|
+
]}
|
|
34
|
+
onChange={(value) =>
|
|
35
|
+
setSelection((current) => ({ ...current, [field]: value || undefined }))
|
|
36
|
+
}
|
|
37
|
+
value={selection[field] ?? ''}
|
|
38
|
+
/>
|
|
39
|
+
</label>
|
|
40
|
+
))}
|
|
41
|
+
</div>
|
|
42
|
+
<div className="flex flex-wrap items-center justify-between gap-3">
|
|
43
|
+
<p className="text-copy-16 text-foreground-secondary sm:text-copy-14">
|
|
44
|
+
{duplicate
|
|
45
|
+
? 'This route is already included.'
|
|
46
|
+
: 'Choose in any order. Clear a field to broaden the other choices.'}
|
|
47
|
+
</p>
|
|
48
|
+
<Button
|
|
49
|
+
disabled={!rule || duplicate}
|
|
50
|
+
onClick={() => {
|
|
51
|
+
if (!rule) return
|
|
52
|
+
options.onAdd(rule)
|
|
53
|
+
}}
|
|
54
|
+
type="button"
|
|
55
|
+
>
|
|
56
|
+
Add route
|
|
57
|
+
</Button>
|
|
58
|
+
</div>
|
|
59
|
+
</fieldset>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
declare namespace RoutePicker {
|
|
64
|
+
type Props = {
|
|
65
|
+
className?: string | undefined
|
|
66
|
+
label: string
|
|
67
|
+
onAdd: (rule: Policies.Rule) => void
|
|
68
|
+
routes: Policies.Payload['routes']
|
|
69
|
+
selected: readonly Policies.Rule[]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const fields = [
|
|
74
|
+
{ field: 'sourceChainId', label: 'Source network', placeholder: 'Choose network' },
|
|
75
|
+
{ field: 'sourceTokenId', label: 'Source token', placeholder: 'Choose token' },
|
|
76
|
+
{ field: 'destinationChainId', label: 'Destination network', placeholder: 'Choose network' },
|
|
77
|
+
{ field: 'destinationTokenId', label: 'Destination token', placeholder: 'Choose token' },
|
|
78
|
+
{ field: 'providerId', label: 'Provider', placeholder: 'Choose provider' },
|
|
79
|
+
] as const
|
|
@@ -18,7 +18,7 @@ export type Vault = DetailResponse &
|
|
|
18
18
|
type ListResponse = Omit<BaseListResponse, 'data'> & { data: readonly Vault[] }
|
|
19
19
|
|
|
20
20
|
type InsertRequest = InferRequestType<(typeof client)['earn']['verified-vaults']['$put']>['json']
|
|
21
|
-
const include = 'access,capabilities,zone' as const
|
|
21
|
+
const include = 'access,capabilities,zone,zones' as const
|
|
22
22
|
|
|
23
23
|
/** A chain id managed by the Earn registry UI. */
|
|
24
24
|
export type ChainId = typeof mainnet.id | typeof testnet.id
|