tapimo 0.15.1 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +893 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +70 -70
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +529 -76
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +157 -157
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +205 -201
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +357 -357
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +125 -125
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +109 -127
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +83 -54
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +43 -43
- package/dist/apps/data/routes/receipts.d.ts +235 -235
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +77 -77
- package/dist/apps/data/routes/valuation.d.ts +32 -32
- package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +1 -1
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +31 -31
- package/dist/apps/management/App.d.ts +2909 -2064
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +257 -245
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +138 -138
- package/dist/apps/management/routes/invite-links.d.ts +172 -172
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +104 -104
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +125 -125
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
- package/dist/apps/management/routes/webhooks.d.ts +485 -485
- package/dist/apps/mpp/App.d.ts +44 -44
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/chains.d.ts +25 -25
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +171 -81
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +532 -480
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +413 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +57 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +182 -78
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +3 -0
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +352 -41
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +1 -0
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
- package/src/admin/ui.generated.ts +258 -202
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +134 -2
- package/src/apps/data/routes/fee-amm.ts +122 -60
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +2 -2
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.test.ts +12 -3
- package/src/apps/data/routes/webhooks.ts +2 -1
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +498 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +66 -5
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +291 -8
- package/src/internal/Auth.ts +227 -96
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1263 -41
- package/src/internal/routes/providers/relay.ts +423 -38
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
|
@@ -12,10 +12,24 @@ import { Abis, Addresses } from 'viem/tempo'
|
|
|
12
12
|
import * as z from 'zod/mini'
|
|
13
13
|
|
|
14
14
|
import * as Schema from './Schema.js'
|
|
15
|
+
import * as Store from './Store.js'
|
|
15
16
|
import * as Viem from './Viem.js'
|
|
16
17
|
|
|
17
18
|
/** Zod schemas owned by the Earn vault resolver. */
|
|
18
19
|
export namespace schema {
|
|
20
|
+
/** Per-vault counterparties recognized by earnings accounting. */
|
|
21
|
+
export const Earnings = z.strictObject({
|
|
22
|
+
rewardDistributors: z
|
|
23
|
+
.array(Schema.Address)
|
|
24
|
+
.check(
|
|
25
|
+
z.maxLength(100),
|
|
26
|
+
z.describe(
|
|
27
|
+
'Additional dedicated reward distributors, combined with recorded campaign history. Incoming shares count as earnings; exclude spenders and refund handlers.',
|
|
28
|
+
),
|
|
29
|
+
z.meta({ examples: [[]] }),
|
|
30
|
+
),
|
|
31
|
+
})
|
|
32
|
+
|
|
19
33
|
const access = z
|
|
20
34
|
.strictObject({
|
|
21
35
|
status: z
|
|
@@ -244,11 +258,28 @@ export namespace schema {
|
|
|
244
258
|
),
|
|
245
259
|
})
|
|
246
260
|
.check(z.describe('Live state resolved from an Earn vault.'))
|
|
261
|
+
|
|
262
|
+
/** Schema for cached vault facts reused by later discovery misses. */
|
|
263
|
+
export const Hint = z
|
|
264
|
+
.strictObject({
|
|
265
|
+
assetToken: metadata,
|
|
266
|
+
engine: Schema.Address.check(z.describe('Engine the facts were read from.')),
|
|
267
|
+
engineAsset: Schema.Address.check(z.describe('Asset the engine accounts in.')),
|
|
268
|
+
engineType,
|
|
269
|
+
shareToken: metadata,
|
|
270
|
+
syncRedeem: z.boolean().check(z.describe('Whether the engine redeems synchronously.')),
|
|
271
|
+
venue: z
|
|
272
|
+
.nullable(Schema.Address)
|
|
273
|
+
.check(z.describe('Yield venue bound to the engine, or null when it exposes none.')),
|
|
274
|
+
})
|
|
275
|
+
.check(z.describe('Cached Earn vault facts, valid while the vault keeps the same engine.'))
|
|
247
276
|
}
|
|
248
277
|
|
|
249
278
|
/** Live state resolved from an Earn vault. */
|
|
250
279
|
export type Discovery = z.output<typeof schema.Discovery>
|
|
251
280
|
|
|
281
|
+
type Hint = z.output<typeof schema.Hint>
|
|
282
|
+
|
|
252
283
|
/** Onchain identity of an Earn vault. */
|
|
253
284
|
export type ResolveInput = z.output<typeof schema.ResolveInput>
|
|
254
285
|
|
|
@@ -401,7 +432,12 @@ export async function resolve(
|
|
|
401
432
|
const input = parseInput(options.input)
|
|
402
433
|
const include = 'include' in options ? options.include : fullInclude
|
|
403
434
|
const zones = options.zones.filter((zone) => zone.sourceId === input.chainId)
|
|
404
|
-
return resolveOnchain(options.getClient(input.chainId), {
|
|
435
|
+
return resolveOnchain(options.getClient(input.chainId), {
|
|
436
|
+
hints: options.hints,
|
|
437
|
+
include,
|
|
438
|
+
input,
|
|
439
|
+
zones,
|
|
440
|
+
})
|
|
405
441
|
}
|
|
406
442
|
|
|
407
443
|
export declare namespace resolve {
|
|
@@ -420,6 +456,8 @@ export declare namespace resolve {
|
|
|
420
456
|
type Options = {
|
|
421
457
|
/** Resolves the onchain client used to read the vault. */
|
|
422
458
|
getClient: Viem.GetClient
|
|
459
|
+
/** Cache for vault facts that cut discovery to two round trips; every use is checked against live reads. */
|
|
460
|
+
hints?: Store.Store | undefined
|
|
423
461
|
/** Chain and vault identity to resolve. */
|
|
424
462
|
input: unknown
|
|
425
463
|
/** Private zones available to Earn routers. */
|
|
@@ -566,6 +604,66 @@ export declare namespace resolveZoneRoutes {
|
|
|
566
604
|
}
|
|
567
605
|
}
|
|
568
606
|
|
|
607
|
+
/** Discovers a router's configured Zone and first code-bearing parent block. */
|
|
608
|
+
export async function discoverZoneRoute(options: discoverZoneRoute.Options): Promise<ZoneRoute> {
|
|
609
|
+
const client = options.getClient(options.discovery.chainId)
|
|
610
|
+
const bindings = await readZoneRouteBindings(client, { earnRouter: options.earnRouter }).catch(
|
|
611
|
+
(error) => {
|
|
612
|
+
if (!isMissingOptionalFunctionError(error)) throw error
|
|
613
|
+
throw new InvalidRegistryError('Earn router does not expose the required bindings.')
|
|
614
|
+
},
|
|
615
|
+
)
|
|
616
|
+
const zone = options.zones.find(
|
|
617
|
+
(candidate) =>
|
|
618
|
+
candidate.sourceId === options.discovery.chainId &&
|
|
619
|
+
deriveZoneId(candidate.id) === bindings.allowedZoneId,
|
|
620
|
+
)
|
|
621
|
+
if (!zone) throw new InvalidRegistryError(`Zone ${bindings.allowedZoneId} is not configured.`)
|
|
622
|
+
|
|
623
|
+
const tip = await client.getBlockNumber()
|
|
624
|
+
const codeAt = async (blockNumber: bigint) => {
|
|
625
|
+
try {
|
|
626
|
+
return await client.getCode({ address: options.earnRouter, blockNumber })
|
|
627
|
+
} catch {
|
|
628
|
+
throw new InvalidRegistryError(
|
|
629
|
+
'Parent RPC cannot read historical code; configure an archive RPC to add this router.',
|
|
630
|
+
)
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
const tipCode = await codeAt(tip)
|
|
634
|
+
if (!tipCode || tipCode === '0x')
|
|
635
|
+
throw new InvalidRegistryError('Earn router has no code on the parent chain.')
|
|
636
|
+
let lower = 0n
|
|
637
|
+
let upper = tip
|
|
638
|
+
while (lower < upper) {
|
|
639
|
+
const middle = (lower + upper) / 2n
|
|
640
|
+
const code = await codeAt(middle)
|
|
641
|
+
if (code && code !== '0x') upper = middle
|
|
642
|
+
else lower = middle + 1n
|
|
643
|
+
}
|
|
644
|
+
if (lower > BigInt(Number.MAX_SAFE_INTEGER))
|
|
645
|
+
throw new InvalidRegistryError('Earn router deployment block exceeds the supported range.')
|
|
646
|
+
return {
|
|
647
|
+
chainId: zone.id,
|
|
648
|
+
deploymentBlock: Number(lower),
|
|
649
|
+
earnRouter: options.earnRouter,
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
export declare namespace discoverZoneRoute {
|
|
654
|
+
/** Inputs for discovering one parent-chain Earn router. */
|
|
655
|
+
type Options = {
|
|
656
|
+
/** Verified vault bound to the router. */
|
|
657
|
+
discovery: Discovery
|
|
658
|
+
/** Parent-chain client resolver. */
|
|
659
|
+
getClient: Viem.GetClient
|
|
660
|
+
/** Parent-chain router address. */
|
|
661
|
+
earnRouter: Address
|
|
662
|
+
/** Configured private Zones. */
|
|
663
|
+
zones: readonly Chain[]
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
569
667
|
/** Infers the supported engine type from its capability fingerprint. */
|
|
570
668
|
export function classifyEngineType(
|
|
571
669
|
options: classifyEngineType.Options,
|
|
@@ -589,9 +687,7 @@ export declare namespace classifyEngineType {
|
|
|
589
687
|
}
|
|
590
688
|
|
|
591
689
|
async function resolveOnchain(client: Client, options: resolveOnchain.Options): Promise<Discovery> {
|
|
592
|
-
const { include, input, zones } = options
|
|
593
|
-
const includeAccess = include.includes('access')
|
|
594
|
-
const includeCapabilities = include.includes('capabilities')
|
|
690
|
+
const { hints, include, input, zones } = options
|
|
595
691
|
const actualChainId = await getChainId(client)
|
|
596
692
|
if (actualChainId === undefined) throw new VerificationError(unavailable())
|
|
597
693
|
if (actualChainId !== input.chainId)
|
|
@@ -607,6 +703,41 @@ async function resolveOnchain(client: Client, options: resolveOnchain.Options):
|
|
|
607
703
|
status: 'unavailable',
|
|
608
704
|
})
|
|
609
705
|
|
|
706
|
+
if (!hints) return (await resolveFully(client, { include, input, zones })).discovery
|
|
707
|
+
|
|
708
|
+
// The hint is memoized with the full read as its fetch, so request cache
|
|
709
|
+
// directives, timeouts, and background persistence apply to it.
|
|
710
|
+
const fresh: Discovery[] = []
|
|
711
|
+
const readHint = () =>
|
|
712
|
+
Store.memoize(
|
|
713
|
+
async () => {
|
|
714
|
+
const result = await resolveFully(client, { include, input, zones })
|
|
715
|
+
fresh.push(result.discovery)
|
|
716
|
+
return result.hint
|
|
717
|
+
},
|
|
718
|
+
{ key: hintKey(input), store: hints, ttl: hintTtl },
|
|
719
|
+
)
|
|
720
|
+
const hint = schema.Hint.safeParse(await readHint())
|
|
721
|
+
if (fresh[0]) return fresh[0]
|
|
722
|
+
if (hint.success) {
|
|
723
|
+
const discovery = await resolveWithHint(client, { hint: hint.data, include, input, zones })
|
|
724
|
+
if (discovery) return discovery
|
|
725
|
+
}
|
|
726
|
+
// A stale or malformed hint is dropped and refilled by a full read.
|
|
727
|
+
await hints.delete(hintKey(input)).catch(() => {})
|
|
728
|
+
await readHint()
|
|
729
|
+
if (fresh[0]) return fresh[0]
|
|
730
|
+
return (await resolveFully(client, { include, input, zones })).discovery
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/** Reads every field from the chain, returning the facts later misses may reuse. */
|
|
734
|
+
async function resolveFully(
|
|
735
|
+
client: Client,
|
|
736
|
+
options: resolveFully.Options,
|
|
737
|
+
): Promise<resolveFully.ReturnType> {
|
|
738
|
+
const { include, input, zones } = options
|
|
739
|
+
const includeAccess = include.includes('access')
|
|
740
|
+
const includeCapabilities = include.includes('capabilities')
|
|
610
741
|
const vault = await readVaultBindings(client, input.vaultAddress).catch(async (error) => {
|
|
611
742
|
if (isMissingContractError(error) && !(await client.getCode({ address: input.vaultAddress })))
|
|
612
743
|
throw new NotFoundError(
|
|
@@ -642,6 +773,139 @@ async function resolveOnchain(client: Client, options: resolveOnchain.Options):
|
|
|
642
773
|
readTokenMetadata(client, vault.shareToken),
|
|
643
774
|
])
|
|
644
775
|
const { asset: engineAsset, venue } = bindings
|
|
776
|
+
return {
|
|
777
|
+
discovery: assemble({
|
|
778
|
+
access,
|
|
779
|
+
asset,
|
|
780
|
+
engineAsset,
|
|
781
|
+
engineType,
|
|
782
|
+
includeCapabilities,
|
|
783
|
+
input,
|
|
784
|
+
routerCapabilities,
|
|
785
|
+
shareQuote,
|
|
786
|
+
shareToken,
|
|
787
|
+
vault,
|
|
788
|
+
venue,
|
|
789
|
+
withdrawable,
|
|
790
|
+
}),
|
|
791
|
+
hint: {
|
|
792
|
+
assetToken: { address: vault.asset, ...asset },
|
|
793
|
+
engine: vault.engine,
|
|
794
|
+
engineAsset,
|
|
795
|
+
engineType,
|
|
796
|
+
shareToken: { address: vault.shareToken, ...shareToken },
|
|
797
|
+
syncRedeem: vault.capabilities.syncRedeem,
|
|
798
|
+
venue,
|
|
799
|
+
},
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
declare namespace resolveFully {
|
|
804
|
+
/** Vault identity, requested fields, and Zones, without a hint cache. */
|
|
805
|
+
type Options = Omit<resolveOnchain.Options, 'hints'>
|
|
806
|
+
|
|
807
|
+
/** A complete discovery and the facts later misses may reuse. */
|
|
808
|
+
type ReturnType = {
|
|
809
|
+
/** Discovery resolved entirely from the chain. */
|
|
810
|
+
discovery: Discovery
|
|
811
|
+
/** Vault facts to cache for later misses. */
|
|
812
|
+
hint: Hint
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/** Resolves from a hint in two round trips, or returns `undefined` when the live vault no longer matches it. */
|
|
817
|
+
async function resolveWithHint(
|
|
818
|
+
client: Client,
|
|
819
|
+
options: resolveWithHint.Options,
|
|
820
|
+
): Promise<Discovery | undefined> {
|
|
821
|
+
const { hint, include, input, zones } = options
|
|
822
|
+
const includeCapabilities = include.includes('capabilities')
|
|
823
|
+
// Issued in one synchronous block so viem batches them into the vault read's first multicall.
|
|
824
|
+
const reads = {
|
|
825
|
+
access: include.includes('access')
|
|
826
|
+
? readTransferPolicyId(client, hint.shareToken.address).then((transferPolicyId) =>
|
|
827
|
+
readAccess(client, transferPolicyId),
|
|
828
|
+
)
|
|
829
|
+
: Promise.resolve(undefined),
|
|
830
|
+
routerCapabilities: includeCapabilities
|
|
831
|
+
? readRouterCapabilities(client, { chainId: input.chainId, zones })
|
|
832
|
+
: Promise.resolve({ deposit: false, redeem: false }),
|
|
833
|
+
shareQuote: readShareQuote(client, {
|
|
834
|
+
syncRedeem: hint.syncRedeem,
|
|
835
|
+
vaultAddress: input.vaultAddress,
|
|
836
|
+
}),
|
|
837
|
+
vault: readVaultBindings(client, input.vaultAddress),
|
|
838
|
+
withdrawable:
|
|
839
|
+
hint.engineType === 'erc4626' && hint.venue
|
|
840
|
+
? readVenueLiquidity(client, { owner: hint.engine, venue: hint.venue })
|
|
841
|
+
: Promise.resolve(undefined),
|
|
842
|
+
}
|
|
843
|
+
// Mark every speculative read handled now; each is still awaited below when used.
|
|
844
|
+
for (const read of Object.values(reads)) read.catch(() => {})
|
|
845
|
+
const vault = await reads.vault.catch(() => undefined)
|
|
846
|
+
// The engine can be migrated; its asset and venue are immutable, so a matching engine proves them.
|
|
847
|
+
if (
|
|
848
|
+
!vault ||
|
|
849
|
+
!isAddressEqual(vault.engine, hint.engine) ||
|
|
850
|
+
!isAddressEqual(vault.asset, hint.assetToken.address) ||
|
|
851
|
+
!isAddressEqual(vault.shareToken, hint.shareToken.address) ||
|
|
852
|
+
vault.capabilities.syncRedeem !== hint.syncRedeem ||
|
|
853
|
+
classifyEngineType(vault.capabilities) !== hint.engineType
|
|
854
|
+
)
|
|
855
|
+
return undefined
|
|
856
|
+
const [access, routerCapabilities, shareQuote, withdrawable] = await Promise.all([
|
|
857
|
+
reads.access,
|
|
858
|
+
reads.routerCapabilities,
|
|
859
|
+
reads.shareQuote,
|
|
860
|
+
reads.withdrawable,
|
|
861
|
+
])
|
|
862
|
+
return assemble({
|
|
863
|
+
access,
|
|
864
|
+
asset: hint.assetToken,
|
|
865
|
+
engineAsset: hint.engineAsset,
|
|
866
|
+
engineType: hint.engineType,
|
|
867
|
+
includeCapabilities,
|
|
868
|
+
input,
|
|
869
|
+
routerCapabilities,
|
|
870
|
+
shareQuote,
|
|
871
|
+
shareToken: hint.shareToken,
|
|
872
|
+
vault,
|
|
873
|
+
venue: hint.venue,
|
|
874
|
+
withdrawable,
|
|
875
|
+
})
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
declare namespace resolveWithHint {
|
|
879
|
+
/** Full-read options plus the cached facts to check. */
|
|
880
|
+
type Options = resolveFully.Options & {
|
|
881
|
+
/** Cached vault facts, checked against the live vault before use. */
|
|
882
|
+
hint: Hint
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/** How long cached vault facts live; every use still checks them against the live vault. */
|
|
887
|
+
const hintTtl = 24 * 60 * 60 * 1_000
|
|
888
|
+
|
|
889
|
+
function hintKey(input: ResolveInput): string {
|
|
890
|
+
return `earn-vault:hint:v1:${input.chainId}:${input.vaultAddress.toLowerCase()}`
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
/** Builds and verifies a discovery from its onchain parts. */
|
|
894
|
+
function assemble(options: assemble.Options): Discovery {
|
|
895
|
+
const {
|
|
896
|
+
access,
|
|
897
|
+
asset,
|
|
898
|
+
engineAsset,
|
|
899
|
+
engineType,
|
|
900
|
+
includeCapabilities,
|
|
901
|
+
input,
|
|
902
|
+
routerCapabilities,
|
|
903
|
+
shareQuote,
|
|
904
|
+
shareToken,
|
|
905
|
+
vault,
|
|
906
|
+
venue,
|
|
907
|
+
withdrawable,
|
|
908
|
+
} = options
|
|
645
909
|
const assetToken = {
|
|
646
910
|
address: vault.asset,
|
|
647
911
|
currency: asset.currency,
|
|
@@ -724,8 +988,39 @@ async function resolveOnchain(client: Client, options: resolveOnchain.Options):
|
|
|
724
988
|
})
|
|
725
989
|
}
|
|
726
990
|
|
|
991
|
+
declare namespace assemble {
|
|
992
|
+
/** Onchain parts of one discovery. */
|
|
993
|
+
type Options = {
|
|
994
|
+
/** Share-token access, when requested. */
|
|
995
|
+
access: Discovery['access'] | undefined
|
|
996
|
+
/** Asset token metadata. */
|
|
997
|
+
asset: TokenMetadata
|
|
998
|
+
/** Asset the engine accounts in, checked against the vault asset. */
|
|
999
|
+
engineAsset: Address
|
|
1000
|
+
/** Engine type inferred from its capabilities. */
|
|
1001
|
+
engineType: classifyEngineType.ReturnType
|
|
1002
|
+
/** Whether to report vault capabilities. */
|
|
1003
|
+
includeCapabilities: boolean
|
|
1004
|
+
/** Vault identity. */
|
|
1005
|
+
input: ResolveInput
|
|
1006
|
+
/** Private-routing support of the configured Earn router. */
|
|
1007
|
+
routerCapabilities: RouterCapabilities
|
|
1008
|
+
/** Assets returned for the quoted share amount, when the engine can quote. */
|
|
1009
|
+
shareQuote: bigint | undefined
|
|
1010
|
+
/** Share token metadata. */
|
|
1011
|
+
shareToken: TokenMetadata
|
|
1012
|
+
/** Live vault bindings and state. */
|
|
1013
|
+
vault: VaultBindings
|
|
1014
|
+
/** Yield venue bound to the engine, when it exposes one. */
|
|
1015
|
+
venue: Address | null
|
|
1016
|
+
/** Assets the venue would release now, when it reports a limit. */
|
|
1017
|
+
withdrawable: bigint | undefined
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
|
|
727
1021
|
declare namespace resolveOnchain {
|
|
728
1022
|
type Options = {
|
|
1023
|
+
hints: Store.Store | undefined
|
|
729
1024
|
include: readonly resolve.Include[]
|
|
730
1025
|
input: ResolveInput
|
|
731
1026
|
zones: readonly Chain[]
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import * as EarnWithdrawals from './EarnWithdrawals.js'
|
|
2
|
+
import * as Tidx from './Tidx.js'
|
|
3
|
+
import * as Viem from './Viem.js'
|
|
4
|
+
|
|
5
|
+
describe('match', () => {
|
|
6
|
+
test('attributes assets, not shares, and preserves the wallet debit identity', () => {
|
|
7
|
+
expect(EarnWithdrawals.match(input())).toMatchInlineSnapshot(`
|
|
8
|
+
[
|
|
9
|
+
{
|
|
10
|
+
"assets": 1000000n,
|
|
11
|
+
"logIndex": 0,
|
|
12
|
+
"transactionHash": "0xe1089b1668337e65bd642dbe0f3e9d37f379d78243a3a766d9954629e8524d8c",
|
|
13
|
+
},
|
|
14
|
+
]
|
|
15
|
+
`)
|
|
16
|
+
const options = input()
|
|
17
|
+
expect(EarnWithdrawals.match({ ...options, events: [...options.events].reverse() })).toEqual(
|
|
18
|
+
EarnWithdrawals.match(options),
|
|
19
|
+
)
|
|
20
|
+
expect(EarnWithdrawals.match({ ...options, account: options.events[2]!.receiver })).toEqual([])
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('rejects missing, mismatched, cross-transaction, or reordered legs', () => {
|
|
24
|
+
const options = input()
|
|
25
|
+
for (let index = 0; index < options.events.length; index++) {
|
|
26
|
+
expect(
|
|
27
|
+
EarnWithdrawals.match({
|
|
28
|
+
...options,
|
|
29
|
+
events: options.events.filter((_, i) => i !== index),
|
|
30
|
+
}),
|
|
31
|
+
).toEqual([])
|
|
32
|
+
expect(
|
|
33
|
+
EarnWithdrawals.match({
|
|
34
|
+
...options,
|
|
35
|
+
events: options.events.map((event, i) =>
|
|
36
|
+
i === index ? { ...event, shares: event.shares + 1n } : event,
|
|
37
|
+
),
|
|
38
|
+
}),
|
|
39
|
+
).toEqual([])
|
|
40
|
+
expect(
|
|
41
|
+
EarnWithdrawals.match({
|
|
42
|
+
...options,
|
|
43
|
+
events: options.events.map((event, i) =>
|
|
44
|
+
i === index ? { ...event, transactionHash: `0x${'bb'.repeat(32)}` as const } : event,
|
|
45
|
+
),
|
|
46
|
+
}),
|
|
47
|
+
).toEqual([])
|
|
48
|
+
}
|
|
49
|
+
expect(
|
|
50
|
+
EarnWithdrawals.match({
|
|
51
|
+
...options,
|
|
52
|
+
events: options.events.map((event) => ({ ...event, logIndex: 10 - event.logIndex })),
|
|
53
|
+
}),
|
|
54
|
+
).toEqual([])
|
|
55
|
+
expect(EarnWithdrawals.match({ ...options, vault: options.account })).toEqual([])
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
test('does not credit shared-funder, duplicate-exit, or refund batches', () => {
|
|
59
|
+
const options = input()
|
|
60
|
+
for (const extra of [
|
|
61
|
+
{ ...options.events[0]!, sender: options.events[2]!.receiver, logIndex: 1 },
|
|
62
|
+
{ ...options.events[1]!, receiver: options.account, logIndex: 9 },
|
|
63
|
+
{ ...options.events[2]!, logIndex: 12 },
|
|
64
|
+
])
|
|
65
|
+
expect(EarnWithdrawals.match({ ...options, events: [...options.events, extra] })).toEqual([])
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test('ignores zero-value share movements without accepting nonzero extra funders', () => {
|
|
69
|
+
const options = input()
|
|
70
|
+
const extra = { ...options.events[0]!, logIndex: 1, sender: options.events[2]!.receiver }
|
|
71
|
+
expect(
|
|
72
|
+
EarnWithdrawals.match({ ...options, events: [...options.events, { ...extra, shares: 0n }] }),
|
|
73
|
+
).toEqual([
|
|
74
|
+
{ assets: 1_000_000n, logIndex: 0, transactionHash: options.events[0]!.transactionHash },
|
|
75
|
+
])
|
|
76
|
+
expect(
|
|
77
|
+
EarnWithdrawals.match({ ...options, events: [...options.events, { ...extra, shares: 1n }] }),
|
|
78
|
+
).toEqual([])
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
describe('classify', () => {
|
|
83
|
+
test('counts gifts to arbitrary recipients and ignores self and zero transfers', () => {
|
|
84
|
+
const options = input()
|
|
85
|
+
const transfer = options.events[0]!
|
|
86
|
+
const gift = { ...transfer, receiver: options.events[2]!.receiver }
|
|
87
|
+
expect(
|
|
88
|
+
EarnWithdrawals.classify({
|
|
89
|
+
...options,
|
|
90
|
+
events: [
|
|
91
|
+
gift,
|
|
92
|
+
{ ...transfer, logIndex: 1, receiver: options.account },
|
|
93
|
+
{ ...transfer, logIndex: 2, shares: 0n },
|
|
94
|
+
],
|
|
95
|
+
}),
|
|
96
|
+
).toEqual([
|
|
97
|
+
{
|
|
98
|
+
assets: undefined,
|
|
99
|
+
blockNumber: 39_097_691,
|
|
100
|
+
logIndex: 0,
|
|
101
|
+
shares: 499_897n,
|
|
102
|
+
transactionHash: gift.transactionHash,
|
|
103
|
+
},
|
|
104
|
+
])
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
test.each(['withdrawal', 'request'] as const)('excludes a direct %s exactly once', (kind) => {
|
|
108
|
+
const options = input()
|
|
109
|
+
const transfer = { ...options.events[0]!, receiver: options.vault }
|
|
110
|
+
const exit = { ...options.events[2]!, sender: options.account, kind }
|
|
111
|
+
expect(EarnWithdrawals.classify({ ...options, events: [transfer, exit] })).toEqual([])
|
|
112
|
+
const second = { ...transfer, logIndex: 1 }
|
|
113
|
+
expect(EarnWithdrawals.classify({ ...options, events: [transfer, second, exit] })).toEqual([
|
|
114
|
+
{
|
|
115
|
+
assets: undefined,
|
|
116
|
+
blockNumber: transfer.blockNumber,
|
|
117
|
+
logIndex: 0,
|
|
118
|
+
shares: transfer.shares,
|
|
119
|
+
transactionHash: transfer.transactionHash,
|
|
120
|
+
},
|
|
121
|
+
])
|
|
122
|
+
expect(
|
|
123
|
+
EarnWithdrawals.classify({
|
|
124
|
+
...options,
|
|
125
|
+
events: [transfer, second, exit, { ...exit, logIndex: 12 }],
|
|
126
|
+
}),
|
|
127
|
+
).toEqual([])
|
|
128
|
+
const extra = { ...transfer, logIndex: 11 }
|
|
129
|
+
expect(EarnWithdrawals.classify({ ...options, events: [extra, exit, transfer] })).toEqual([
|
|
130
|
+
{
|
|
131
|
+
assets: undefined,
|
|
132
|
+
blockNumber: 39_097_691,
|
|
133
|
+
logIndex: 11,
|
|
134
|
+
shares: 499_897n,
|
|
135
|
+
transactionHash: transfer.transactionHash,
|
|
136
|
+
},
|
|
137
|
+
])
|
|
138
|
+
for (const unmatched of [
|
|
139
|
+
{ ...exit, logIndex: 0 },
|
|
140
|
+
{ ...exit, shares: exit.shares + 1n },
|
|
141
|
+
{ ...exit, transactionHash: `0x${'bb'.repeat(32)}` as const },
|
|
142
|
+
])
|
|
143
|
+
expect(EarnWithdrawals.classify({ ...options, events: [transfer, unmatched] })).toHaveLength(
|
|
144
|
+
1,
|
|
145
|
+
)
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
test('values mediated async and ambiguous batches without crediting another funder’s proceeds', () => {
|
|
149
|
+
const options = input()
|
|
150
|
+
for (const events of [
|
|
151
|
+
options.events.map((event) =>
|
|
152
|
+
event.kind === 'withdrawal' ? { ...event, kind: 'request' as const } : event,
|
|
153
|
+
),
|
|
154
|
+
[
|
|
155
|
+
...options.events,
|
|
156
|
+
{ ...options.events[0]!, sender: options.events[2]!.receiver, logIndex: 1 },
|
|
157
|
+
],
|
|
158
|
+
[...options.events, { ...options.events[2]!, logIndex: 12 }],
|
|
159
|
+
])
|
|
160
|
+
expect(EarnWithdrawals.classify({ ...options, events })).toEqual([
|
|
161
|
+
{
|
|
162
|
+
assets: undefined,
|
|
163
|
+
blockNumber: 39_097_691,
|
|
164
|
+
logIndex: 0,
|
|
165
|
+
shares: 499_897n,
|
|
166
|
+
transactionHash: options.events[0]!.transactionHash,
|
|
167
|
+
},
|
|
168
|
+
])
|
|
169
|
+
expect(EarnWithdrawals.classify(options)[0]?.assets).toBe(1_000_000n)
|
|
170
|
+
})
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
describe('value', () => {
|
|
174
|
+
test('uses each transfer block’s quote and actual proceeds before quotes', async () => {
|
|
175
|
+
const client = Viem.getClient({ chainId: 4217 })
|
|
176
|
+
const options = input()
|
|
177
|
+
const withdrawal = EarnWithdrawals.classify(options)[0]!
|
|
178
|
+
// Fixed archive observations: 499,897 shares quote to 1,000,001 and 999,963 asset units at these blocks.
|
|
179
|
+
expect(
|
|
180
|
+
await EarnWithdrawals.value(client, {
|
|
181
|
+
vault: options.vault,
|
|
182
|
+
withdrawals: [
|
|
183
|
+
{ ...withdrawal, assets: undefined },
|
|
184
|
+
{ ...withdrawal, assets: undefined, blockNumber: 39_000_000 },
|
|
185
|
+
withdrawal,
|
|
186
|
+
],
|
|
187
|
+
}),
|
|
188
|
+
).toBe(2_999_964n)
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
test('does not turn an unavailable historical quote into a zero withdrawal', async () => {
|
|
192
|
+
const client = Viem.getClient({ chainId: 4217 })
|
|
193
|
+
const options = input()
|
|
194
|
+
const withdrawal = EarnWithdrawals.classify(options)[0]!
|
|
195
|
+
expect(
|
|
196
|
+
await EarnWithdrawals.value(client, {
|
|
197
|
+
vault: options.account,
|
|
198
|
+
withdrawals: [{ ...withdrawal, assets: undefined }],
|
|
199
|
+
}),
|
|
200
|
+
).toBeUndefined()
|
|
201
|
+
expect(
|
|
202
|
+
await EarnWithdrawals.value(client, { vault: options.account, withdrawals: [withdrawal] }),
|
|
203
|
+
).toBe(1_000_000n)
|
|
204
|
+
})
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
describe('read', () => {
|
|
208
|
+
test('reads and values a plain multi-recipient transfer batch without any vault exit', async () => {
|
|
209
|
+
const tidx = Tidx.getClient({
|
|
210
|
+
chainId: 4217,
|
|
211
|
+
tidx: {
|
|
212
|
+
auth: process.env.TIDX_AUTH,
|
|
213
|
+
baseUrl: Viem.resolveUrl(process.env.TIDX_URL, 4217) ?? Tidx.url[4217],
|
|
214
|
+
},
|
|
215
|
+
})
|
|
216
|
+
const vault = input().vault
|
|
217
|
+
const withdrawals = await EarnWithdrawals.read(tidx, {
|
|
218
|
+
account: '0xa65c6ed737b52543123817977d8d2c0e554bfc2d',
|
|
219
|
+
blockNumber: 37_539_309,
|
|
220
|
+
shareToken: '0x20c000000000000000000000baac91f6ca72f768',
|
|
221
|
+
startBlockNumber: 37_539_308,
|
|
222
|
+
vault,
|
|
223
|
+
})
|
|
224
|
+
expect(
|
|
225
|
+
withdrawals.map(({ assets, logIndex, shares }) => ({ assets, logIndex, shares })),
|
|
226
|
+
).toEqual(
|
|
227
|
+
[91n, 92n, 181n, 1813n, 313n, 90n, 86n, 72n].map((shares, index) => ({
|
|
228
|
+
assets: undefined,
|
|
229
|
+
logIndex: 16 + index,
|
|
230
|
+
shares,
|
|
231
|
+
})),
|
|
232
|
+
)
|
|
233
|
+
expect(
|
|
234
|
+
await EarnWithdrawals.value(Viem.getClient({ chainId: 4217 }), { vault, withdrawals }),
|
|
235
|
+
).toBe(5467n)
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
test('reads card withdrawals without configuration and respects the block window', async () => {
|
|
239
|
+
const tidx = Tidx.getClient({
|
|
240
|
+
chainId: 4217,
|
|
241
|
+
tidx: {
|
|
242
|
+
auth: process.env.TIDX_AUTH,
|
|
243
|
+
baseUrl: Viem.resolveUrl(process.env.TIDX_URL, 4217) ?? Tidx.url[4217],
|
|
244
|
+
},
|
|
245
|
+
})
|
|
246
|
+
const options = {
|
|
247
|
+
...input(),
|
|
248
|
+
blockNumber: 39_097_691,
|
|
249
|
+
shareToken: '0x20c000000000000000000000baac91f6ca72f768' as const,
|
|
250
|
+
startBlockNumber: 39_097_690,
|
|
251
|
+
}
|
|
252
|
+
expect(await EarnWithdrawals.read(tidx, options)).toEqual([
|
|
253
|
+
{
|
|
254
|
+
assets: 1_000_000n,
|
|
255
|
+
blockNumber: 39_097_691,
|
|
256
|
+
logIndex: 0,
|
|
257
|
+
shares: 499_897n,
|
|
258
|
+
transactionHash: '0xe1089b1668337e65bd642dbe0f3e9d37f379d78243a3a766d9954629e8524d8c',
|
|
259
|
+
},
|
|
260
|
+
])
|
|
261
|
+
expect(
|
|
262
|
+
(await EarnWithdrawals.read(tidx, { ...options, vault: options.account }))[0]?.assets,
|
|
263
|
+
).toBeUndefined()
|
|
264
|
+
expect(
|
|
265
|
+
await EarnWithdrawals.read(tidx, { ...options, startBlockNumber: options.blockNumber }),
|
|
266
|
+
).toEqual([])
|
|
267
|
+
expect(
|
|
268
|
+
await EarnWithdrawals.read(tidx, { ...options, blockNumber: options.startBlockNumber }),
|
|
269
|
+
).toEqual([])
|
|
270
|
+
})
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
function input(): EarnWithdrawals.match.Options {
|
|
274
|
+
const account = '0x504a128461f2ee15b52a9d33812769e8cc31bc0d'
|
|
275
|
+
const spender = '0x3f58d4356cc5785de7962c274c48a748648fddf1'
|
|
276
|
+
const vault = '0xd730394f3bb85a4828e35fc5e361dcc9f894fa4f'
|
|
277
|
+
const transactionHash = '0xe1089b1668337e65bd642dbe0f3e9d37f379d78243a3a766d9954629e8524d8c'
|
|
278
|
+
// Captured receipt: 499,897 share units redeemed for 1,000,000 asset units, through a distinct receiver.
|
|
279
|
+
return {
|
|
280
|
+
account,
|
|
281
|
+
vault,
|
|
282
|
+
events: [
|
|
283
|
+
{
|
|
284
|
+
assets: 0n,
|
|
285
|
+
blockNumber: 39_097_691,
|
|
286
|
+
kind: 'transfer',
|
|
287
|
+
logIndex: 0,
|
|
288
|
+
receiver: spender,
|
|
289
|
+
sender: account,
|
|
290
|
+
shares: 499_897n,
|
|
291
|
+
transactionHash,
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
assets: 0n,
|
|
295
|
+
blockNumber: 39_097_691,
|
|
296
|
+
kind: 'transfer',
|
|
297
|
+
logIndex: 7,
|
|
298
|
+
receiver: vault,
|
|
299
|
+
sender: spender,
|
|
300
|
+
shares: 499_897n,
|
|
301
|
+
transactionHash,
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
assets: 1_000_000n,
|
|
305
|
+
blockNumber: 39_097_691,
|
|
306
|
+
kind: 'withdrawal',
|
|
307
|
+
logIndex: 10,
|
|
308
|
+
receiver: '0x39aaffa434a319393c45ba1571bff602086e7808',
|
|
309
|
+
sender: spender,
|
|
310
|
+
shares: 499_897n,
|
|
311
|
+
transactionHash,
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
}
|
|
315
|
+
}
|