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
|
@@ -9,6 +9,7 @@ import * as Deposit from '../../internal/routes/Deposit.js'
|
|
|
9
9
|
import * as DepositAddress from '../../internal/routes/DepositAddress.js'
|
|
10
10
|
import * as Transfer from '../../internal/routes/Transfer.js'
|
|
11
11
|
import * as Db from '../Db.js'
|
|
12
|
+
import * as ApiKeyOwnerTombstones from './apiKeyOwnerTombstones.js'
|
|
12
13
|
import * as EnabledBillingSources from './enabledBillingSources.js'
|
|
13
14
|
import * as Memberships from './memberships.js'
|
|
14
15
|
import * as Organizations from './organizations.js'
|
|
@@ -665,48 +666,52 @@ describe('deleteOrganization', () => {
|
|
|
665
666
|
await db.close()
|
|
666
667
|
})
|
|
667
668
|
|
|
668
|
-
test(
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
669
|
+
test.each([Viem.chainId.mainnet, 421700001])(
|
|
670
|
+
'behavior: preserves billable sponsorships on chain %s',
|
|
671
|
+
async (chainId) => {
|
|
672
|
+
const db = create()
|
|
673
|
+
await db.migrate()
|
|
674
|
+
await Organizations.create(db, { id: 'org_1', name: 'One' })
|
|
675
|
+
await StripeCustomers.create(db, {
|
|
676
|
+
orgId: 'org_1',
|
|
677
|
+
stripeCustomerId: 'cus_org_1',
|
|
678
|
+
})
|
|
679
|
+
await EnabledBillingSources.add(db, {
|
|
680
|
+
createdBy: 'admin@tempo.xyz',
|
|
681
|
+
orgId: 'org_1',
|
|
682
|
+
source: 'stripe',
|
|
683
|
+
})
|
|
684
|
+
await SponsoredTransactions.upsert(db, {
|
|
685
|
+
apiKeyId: 'key_1',
|
|
686
|
+
billable: true,
|
|
687
|
+
chainId,
|
|
688
|
+
environment: 'production',
|
|
689
|
+
orgId: 'org_1',
|
|
690
|
+
projectId: 'prj_1',
|
|
691
|
+
signPayload: `0x${'bb'.repeat(32)}`,
|
|
692
|
+
transaction: `0x76${'cc'.repeat(16)}`,
|
|
693
|
+
transactionHash: `0x${'aa'.repeat(32)}`,
|
|
694
|
+
})
|
|
692
695
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
696
|
+
expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(true)
|
|
697
|
+
await expect(Organizations.deleteOrganization(db, 'org_1')).rejects.toThrow(
|
|
698
|
+
Organizations.UnreportedMeteredUsageError,
|
|
699
|
+
)
|
|
700
|
+
expect(await Organizations.get(db, 'org_1')).toBeDefined()
|
|
701
|
+
expect(await EnabledBillingSources.isEnabled(db, { orgId: 'org_1', source: 'stripe' })).toBe(
|
|
702
|
+
true,
|
|
703
|
+
)
|
|
704
|
+
expect(await StripeCustomers.get(db, 'org_1')).toBeDefined()
|
|
705
|
+
expect(await ApiKeyOwnerTombstones.isDeleted(db, { orgId: 'org_1' })).toBe(false)
|
|
706
|
+
await db.close()
|
|
707
|
+
},
|
|
708
|
+
)
|
|
704
709
|
|
|
705
|
-
test('behavior: deletes an org with only
|
|
710
|
+
test('behavior: deletes an org with only reported or non-billable sponsorships', async () => {
|
|
706
711
|
const db = create()
|
|
707
712
|
await db.migrate()
|
|
708
713
|
await Organizations.create(db, { id: 'org_1', name: 'One' })
|
|
709
|
-
const
|
|
714
|
+
const reported = await SponsoredTransactions.upsert(db, {
|
|
710
715
|
apiKeyId: 'key_1',
|
|
711
716
|
billable: true,
|
|
712
717
|
chainId: Viem.chainId.mainnet,
|
|
@@ -717,10 +722,14 @@ describe('deleteOrganization', () => {
|
|
|
717
722
|
transaction: `0x76${'cc'.repeat(16)}`,
|
|
718
723
|
transactionHash: `0x${'aa'.repeat(32)}`,
|
|
719
724
|
})
|
|
720
|
-
await SponsoredTransactions.
|
|
725
|
+
await SponsoredTransactions.finalize(db, reported.id, {
|
|
726
|
+
feeAmount: '100',
|
|
727
|
+
finalizedAt: '2026-01-01T00:00:00.000Z',
|
|
728
|
+
})
|
|
729
|
+
await SponsoredTransactions.markReported(db, reported.id, '2026-01-01T00:00:01.000Z')
|
|
721
730
|
const testnet = await SponsoredTransactions.upsert(db, {
|
|
722
731
|
apiKeyId: 'key_1',
|
|
723
|
-
billable:
|
|
732
|
+
billable: false,
|
|
724
733
|
chainId: Viem.chainId.testnet,
|
|
725
734
|
environment: 'production',
|
|
726
735
|
orgId: 'org_1',
|
|
@@ -878,6 +887,51 @@ describe('deleteOrganization', () => {
|
|
|
878
887
|
await db.close()
|
|
879
888
|
})
|
|
880
889
|
|
|
890
|
+
test('behavior: deletion waits for an in-flight sponsorship and preserves its billing identity', async () => {
|
|
891
|
+
const schema = `t_${nanoid()}`
|
|
892
|
+
const db = Db.postgres({ connectionString: Runtime.postgresUrl, schema })
|
|
893
|
+
const concurrent = Db.postgres({ connectionString: Runtime.postgresUrl, schema })
|
|
894
|
+
await db.migrate()
|
|
895
|
+
await settleRouteRollout(db)
|
|
896
|
+
await Organizations.create(db, { id: 'org_1', name: 'One' })
|
|
897
|
+
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_org_1' })
|
|
898
|
+
const recorded = Promise.withResolvers<void>()
|
|
899
|
+
const release = Promise.withResolvers<void>()
|
|
900
|
+
const sponsorship = db.transaction(async (tx) => {
|
|
901
|
+
await SponsoredTransactions.upsert(tx, {
|
|
902
|
+
apiKeyId: 'key_1',
|
|
903
|
+
billable: true,
|
|
904
|
+
chainId: 421700001,
|
|
905
|
+
environment: 'production',
|
|
906
|
+
orgId: 'org_1',
|
|
907
|
+
signPayload: `0x${'bb'.repeat(32)}`,
|
|
908
|
+
transaction: `0x76${'cc'.repeat(16)}`,
|
|
909
|
+
})
|
|
910
|
+
recorded.resolve()
|
|
911
|
+
await release.promise
|
|
912
|
+
})
|
|
913
|
+
await recorded.promise
|
|
914
|
+
const deletion = Organizations.deleteOrganization(concurrent, 'org_1')
|
|
915
|
+
try {
|
|
916
|
+
expect(
|
|
917
|
+
await Promise.race([
|
|
918
|
+
deletion.then(
|
|
919
|
+
() => 'deleted',
|
|
920
|
+
() => 'rejected',
|
|
921
|
+
),
|
|
922
|
+
new Promise((resolve) => setTimeout(() => resolve('waiting'), 100)),
|
|
923
|
+
]),
|
|
924
|
+
).toBe('waiting')
|
|
925
|
+
} finally {
|
|
926
|
+
release.resolve()
|
|
927
|
+
}
|
|
928
|
+
await sponsorship
|
|
929
|
+
await expect(deletion).rejects.toThrow(Organizations.UnreportedMeteredUsageError)
|
|
930
|
+
expect(await StripeCustomers.get(db, 'org_1')).toBeDefined()
|
|
931
|
+
expect(await ApiKeyOwnerTombstones.isDeleted(db, { orgId: 'org_1' })).toBe(false)
|
|
932
|
+
await Promise.all([db.close(), concurrent.close()])
|
|
933
|
+
})
|
|
934
|
+
|
|
881
935
|
test('behavior: serializes deletion with subsidy liability persistence', async () => {
|
|
882
936
|
const schema = `t_${nanoid()}`
|
|
883
937
|
const db = Db.postgres({ connectionString: Runtime.postgresUrl, schema })
|
|
@@ -984,54 +1038,64 @@ describe('deleteOrganization', () => {
|
|
|
984
1038
|
await db.close()
|
|
985
1039
|
})
|
|
986
1040
|
|
|
987
|
-
test(
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1041
|
+
test.each([undefined, `0x${'aa'.repeat(32)}`])(
|
|
1042
|
+
'behavior: preserves a failed sponsorship with hash %s',
|
|
1043
|
+
async (transactionHash) => {
|
|
1044
|
+
const db = create()
|
|
1045
|
+
await db.migrate()
|
|
1046
|
+
await Organizations.create(db, { id: 'org_1', name: 'One' })
|
|
1047
|
+
const failed = await SponsoredTransactions.upsert(db, {
|
|
1048
|
+
apiKeyId: 'key_1',
|
|
1049
|
+
billable: true,
|
|
1050
|
+
chainId: Viem.chainId.mainnet,
|
|
1051
|
+
environment: 'production',
|
|
1052
|
+
orgId: 'org_1',
|
|
1053
|
+
projectId: 'prj_1',
|
|
1054
|
+
signPayload: `0x${'bb'.repeat(32)}`,
|
|
1055
|
+
transaction: `0x76${'cc'.repeat(16)}`,
|
|
1056
|
+
transactionHash,
|
|
1057
|
+
})
|
|
1058
|
+
await SponsoredTransactions.fail(db, failed.id, new Date().toISOString())
|
|
1002
1059
|
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1060
|
+
expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(true)
|
|
1061
|
+
await expect(Organizations.deleteOrganization(db, 'org_1')).rejects.toThrow(
|
|
1062
|
+
Organizations.UnreportedMeteredUsageError,
|
|
1063
|
+
)
|
|
1064
|
+
expect(await Organizations.get(db, 'org_1')).toBeDefined()
|
|
1065
|
+
await db.close()
|
|
1066
|
+
},
|
|
1067
|
+
)
|
|
1010
1068
|
|
|
1011
|
-
test(
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1069
|
+
test.each([undefined, `0x${'aa'.repeat(32)}`])(
|
|
1070
|
+
'behavior: recovery expiry cannot clear a signed liability with hash %s',
|
|
1071
|
+
async (transactionHash) => {
|
|
1072
|
+
const db = create()
|
|
1073
|
+
await db.migrate()
|
|
1074
|
+
await Organizations.create(db, { id: 'org_1', name: 'One' })
|
|
1075
|
+
const failed = await SponsoredTransactions.upsert(db, {
|
|
1076
|
+
apiKeyId: 'key_1',
|
|
1077
|
+
billable: true,
|
|
1078
|
+
chainId: Viem.chainId.mainnet,
|
|
1079
|
+
environment: 'production',
|
|
1080
|
+
orgId: 'org_1',
|
|
1081
|
+
projectId: 'prj_1',
|
|
1082
|
+
signPayload: `0x${'bb'.repeat(32)}`,
|
|
1083
|
+
transaction: `0x76${'cc'.repeat(16)}`,
|
|
1084
|
+
transactionHash,
|
|
1085
|
+
})
|
|
1086
|
+
await SponsoredTransactions.fail(
|
|
1087
|
+
db,
|
|
1088
|
+
failed.id,
|
|
1089
|
+
new Date(Date.now() - SponsoredTransactions.failedIntentRecoveryTtlMs - 1).toISOString(),
|
|
1090
|
+
)
|
|
1030
1091
|
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1092
|
+
expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(true)
|
|
1093
|
+
await expect(Organizations.deleteOrganization(db, 'org_1')).rejects.toThrow(
|
|
1094
|
+
Organizations.UnreportedMeteredUsageError,
|
|
1095
|
+
)
|
|
1096
|
+
await db.close()
|
|
1097
|
+
},
|
|
1098
|
+
)
|
|
1035
1099
|
|
|
1036
1100
|
test('behavior: deletes enabled billing sources', async () => {
|
|
1037
1101
|
const db = create()
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { sql, type
|
|
1
|
+
import { sql, type Selectable } from 'kysely'
|
|
2
2
|
|
|
3
3
|
import * as Id from '../../internal/Id.js'
|
|
4
|
-
import * as Viem from '../../internal/Viem.js'
|
|
5
4
|
import * as ApiKeyAdmissions from './apiKeyAdmissions.js'
|
|
6
5
|
import * as ApiKeyOwnerTombstones from './apiKeyOwnerTombstones.js'
|
|
7
6
|
import * as AuthAccounts from './authAccounts.js'
|
|
@@ -9,7 +8,6 @@ import * as RoutesDepositAddresses from './routesDepositAddresses.js'
|
|
|
9
8
|
import * as RoutesDeposits from './routesDeposits.js'
|
|
10
9
|
import * as RoutesIdempotency from './routesIdempotency.js'
|
|
11
10
|
import * as RoutesTransfers from './routesTransfers.js'
|
|
12
|
-
import * as SponsoredTransactions from './sponsoredTransactions.js'
|
|
13
11
|
import * as Users from './users.js'
|
|
14
12
|
import type * as Db from '../Db.js'
|
|
15
13
|
import type * as db_Schema from '../Schema.js'
|
|
@@ -139,7 +137,7 @@ export declare namespace createOwned {
|
|
|
139
137
|
*
|
|
140
138
|
* @param db - The database.
|
|
141
139
|
* @param id - The organization id (`org_…`).
|
|
142
|
-
* @param options -
|
|
140
|
+
* @param options - Deletion lifecycle hooks.
|
|
143
141
|
* @returns Whether the organization existed and was deleted.
|
|
144
142
|
*/
|
|
145
143
|
export async function deleteOrganization(
|
|
@@ -149,25 +147,9 @@ export async function deleteOrganization(
|
|
|
149
147
|
): Promise<boolean> {
|
|
150
148
|
const result = await RoutesDeposits.withSubsidySettlement(db, {
|
|
151
149
|
fn: async (tx) => {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
)
|
|
155
|
-
const unreportedSponsorship = await tx.kysely
|
|
156
|
-
.selectFrom('sponsored_transactions')
|
|
157
|
-
.select('id')
|
|
158
|
-
.where('orgId', '=', id)
|
|
159
|
-
.where('billable', '=', true)
|
|
160
|
-
.where('chainId', '=', Viem.chainId.mainnet)
|
|
161
|
-
.where('meterReportedAt', 'is', null)
|
|
162
|
-
.where(unreportedSponsorshipStatus(failedSince))
|
|
163
|
-
.limit(1)
|
|
164
|
-
.executeTakeFirst()
|
|
165
|
-
const [unreportedDepositSubsidy, unreportedTransferSubsidy] = await Promise.all([
|
|
166
|
-
RoutesDeposits.hasUnreportedSubsidies(tx, { orgId: id }),
|
|
167
|
-
RoutesTransfers.hasUnreportedSubsidies(tx, id),
|
|
168
|
-
])
|
|
169
|
-
if (unreportedSponsorship || unreportedDepositSubsidy || unreportedTransferSubsidy)
|
|
170
|
-
throw new UnreportedMeteredUsageError()
|
|
150
|
+
// Fence new commitments before checking liabilities; a rejected deletion rolls back the fence.
|
|
151
|
+
await ApiKeyOwnerTombstones.markDeleted(tx, { orgId: id })
|
|
152
|
+
if (await hasUnreportedMeteredUsage(tx, id)) throw new UnreportedMeteredUsageError()
|
|
171
153
|
if (await RoutesIdempotency.hasUnattributedInFlightClaim(tx))
|
|
172
154
|
throw new IrrevocableDepositAddressError()
|
|
173
155
|
if (await RoutesIdempotency.hasInFlightDepositAddress(tx, id))
|
|
@@ -180,7 +162,6 @@ export async function deleteOrganization(
|
|
|
180
162
|
now: new Date().toISOString(),
|
|
181
163
|
orgId: id,
|
|
182
164
|
})
|
|
183
|
-
await ApiKeyOwnerTombstones.markDeleted(tx, { orgId: id })
|
|
184
165
|
await ApiKeyAdmissions.releaseOwner(tx, { orgId: id })
|
|
185
166
|
await tx.kysely
|
|
186
167
|
.deleteFrom('webhook_subscriptions')
|
|
@@ -201,6 +182,8 @@ export async function deleteOrganization(
|
|
|
201
182
|
.deleteFrom('organizations')
|
|
202
183
|
.where('id', '=', id)
|
|
203
184
|
.executeTakeFirst()
|
|
185
|
+
// Publish external deletion fences before committing the irreversible owner removal.
|
|
186
|
+
if (result.numDeletedRows > 0n) await options.beforeCommit?.()
|
|
204
187
|
const deactivatedById = new Map(deactivated.map((record) => [record.id, record]))
|
|
205
188
|
return {
|
|
206
189
|
deactivated: previous.flatMap((previous) => {
|
|
@@ -218,8 +201,10 @@ export async function deleteOrganization(
|
|
|
218
201
|
}
|
|
219
202
|
|
|
220
203
|
export declare namespace deleteOrganization {
|
|
221
|
-
/**
|
|
204
|
+
/** Organization deletion hooks. */
|
|
222
205
|
type Options = {
|
|
206
|
+
/** Publishes the KV owner fence before commit; failure rolls back deletion. */
|
|
207
|
+
beforeCommit?: (() => Promise<void>) | undefined
|
|
223
208
|
/** Receives committed deposit-address deactivation transitions. */
|
|
224
209
|
onDepositAddressesDeactivated?:
|
|
225
210
|
| ((transitions: readonly DepositAddressDeactivation[]) => Promise<void> | void)
|
|
@@ -237,17 +222,13 @@ export declare namespace deleteOrganization {
|
|
|
237
222
|
|
|
238
223
|
/** Whether an organization has metered usage awaiting Stripe settlement. */
|
|
239
224
|
export async function hasUnreportedMeteredUsage(db: Db.Db, id: string): Promise<boolean> {
|
|
240
|
-
|
|
241
|
-
Date.now() - SponsoredTransactions.failedIntentRecoveryTtlMs,
|
|
242
|
-
).toISOString()
|
|
225
|
+
// Timeouts and recovery cutoffs do not revoke signatures. Only acknowledged billing clears a billable commitment, on any chain.
|
|
243
226
|
const sponsorship = await db.kysely
|
|
244
227
|
.selectFrom('sponsored_transactions')
|
|
245
228
|
.select('id')
|
|
246
229
|
.where('orgId', '=', id)
|
|
247
230
|
.where('billable', '=', true)
|
|
248
|
-
.where('chainId', '=', Viem.chainId.mainnet)
|
|
249
231
|
.where('meterReportedAt', 'is', null)
|
|
250
|
-
.where(unreportedSponsorshipStatus(failedSince))
|
|
251
232
|
.limit(1)
|
|
252
233
|
.executeTakeFirst()
|
|
253
234
|
if (sponsorship) return true
|
|
@@ -585,19 +566,6 @@ export declare namespace upsert {
|
|
|
585
566
|
}
|
|
586
567
|
}
|
|
587
568
|
|
|
588
|
-
/** Blocks rows that can still settle or recover into billable mainnet spend. */
|
|
589
|
-
function unreportedSponsorshipStatus(failedSince: string) {
|
|
590
|
-
return (eb: ExpressionBuilder<Db.Database, 'sponsored_transactions'>) =>
|
|
591
|
-
eb.or([
|
|
592
|
-
eb('status', '!=', 'failed'),
|
|
593
|
-
eb.and([
|
|
594
|
-
eb('status', '=', 'failed'),
|
|
595
|
-
eb('transactionHash', 'is', null),
|
|
596
|
-
eb('finalizedAt', '>=', failedSince),
|
|
597
|
-
]),
|
|
598
|
-
])
|
|
599
|
-
}
|
|
600
|
-
|
|
601
569
|
/** Organization deletion is blocked by a provider subsidy that cannot be revoked. */
|
|
602
570
|
export class IrrevocableDepositAddressError extends Error {
|
|
603
571
|
override name = 'Organizations.IrrevocableDepositAddressError'
|
|
@@ -27,6 +27,7 @@ export type MeterEventTable = {
|
|
|
27
27
|
deltaCount: Count
|
|
28
28
|
environment: Environment
|
|
29
29
|
error: string | null
|
|
30
|
+
eventTimestamp: string | null
|
|
30
31
|
firstAttemptedAt: string
|
|
31
32
|
identifier: string
|
|
32
33
|
orgId: string
|
|
@@ -135,6 +136,7 @@ export async function insertPending(db: Db.Db, input: insertPending.Input): Prom
|
|
|
135
136
|
deltaCount: input.deltaCount,
|
|
136
137
|
environment: input.environment,
|
|
137
138
|
error: null,
|
|
139
|
+
eventTimestamp: input.eventTimestamp,
|
|
138
140
|
firstAttemptedAt: now,
|
|
139
141
|
identifier: input.identifier,
|
|
140
142
|
orgId: input.orgId,
|
|
@@ -159,6 +161,8 @@ export declare namespace insertPending {
|
|
|
159
161
|
deltaCount: number
|
|
160
162
|
/** Environment the requests were served under. */
|
|
161
163
|
environment: Environment
|
|
164
|
+
/** Timestamp sent with this frozen Stripe meter event (ISO 8601). */
|
|
165
|
+
eventTimestamp: string
|
|
162
166
|
/** Deterministic id; also the Stripe identifier and idempotency key. */
|
|
163
167
|
identifier: string
|
|
164
168
|
/** Organization id (`org_…`). */
|
|
@@ -211,7 +215,8 @@ export function settle(db: Db.Db, identifier: string, at: string): Promise<boole
|
|
|
211
215
|
}
|
|
212
216
|
|
|
213
217
|
/**
|
|
214
|
-
* Records
|
|
218
|
+
* Records failure detail on a pending event; it stays visible for retry or
|
|
219
|
+
* manual reconciliation.
|
|
215
220
|
*
|
|
216
221
|
* @param db - The database.
|
|
217
222
|
* @param identifier - The event identifier.
|
|
@@ -233,5 +238,11 @@ function toBucket(row: Selectable<BucketTable>): Bucket {
|
|
|
233
238
|
|
|
234
239
|
/** Maps a meter-event row to its domain record. */
|
|
235
240
|
function toMeterEvent(row: Selectable<MeterEventTable>): MeterEvent {
|
|
236
|
-
|
|
241
|
+
const { eventTimestamp, ...record } = row
|
|
242
|
+
return {
|
|
243
|
+
...record,
|
|
244
|
+
deltaCount: Number(row.deltaCount),
|
|
245
|
+
...(eventTimestamp === null ? {} : { eventTimestamp }),
|
|
246
|
+
sequence: Number(row.sequence),
|
|
247
|
+
}
|
|
237
248
|
}
|
|
@@ -1360,6 +1360,140 @@ describe('reward execution fencing and transaction journal', () => {
|
|
|
1360
1360
|
})
|
|
1361
1361
|
})
|
|
1362
1362
|
|
|
1363
|
+
describe('latestDelivered', () => {
|
|
1364
|
+
test('returns the newest delivered run among several', async () => {
|
|
1365
|
+
const db = TestApp.database()
|
|
1366
|
+
const runs = await seedRunSequence(db)
|
|
1367
|
+
await deliver(db, runs[0])
|
|
1368
|
+
await deliver(db, runs[1])
|
|
1369
|
+
|
|
1370
|
+
const latest = await RewardRuns.latestDelivered(db, { chainId: 4217, vaultAddress })
|
|
1371
|
+
|
|
1372
|
+
expect(latest?.endsAt).toBe('2000000400')
|
|
1373
|
+
})
|
|
1374
|
+
})
|
|
1375
|
+
|
|
1376
|
+
describe('latestSummary', () => {
|
|
1377
|
+
test('returns the run with the newest start whatever its phase', async () => {
|
|
1378
|
+
const db = TestApp.database()
|
|
1379
|
+
const runs = await seedRunSequence(db)
|
|
1380
|
+
await deliver(db, runs[0])
|
|
1381
|
+
|
|
1382
|
+
const latest = await RewardRuns.latestSummary(db, { chainId: 4217, vaultAddress })
|
|
1383
|
+
|
|
1384
|
+
expect([latest?.id, latest?.phase]).toEqual([runs[2].id, 'indexing'])
|
|
1385
|
+
})
|
|
1386
|
+
})
|
|
1387
|
+
|
|
1388
|
+
describe('latestForIntent', () => {
|
|
1389
|
+
test('returns the newest attempt among equally ranked states', async () => {
|
|
1390
|
+
const db = TestApp.database()
|
|
1391
|
+
await seedCampaign(db)
|
|
1392
|
+
const run = await RewardRuns.ensure(db, {
|
|
1393
|
+
chainId: 4217,
|
|
1394
|
+
config,
|
|
1395
|
+
endsAt: 2_000_000_300,
|
|
1396
|
+
startsAfter: 2_000_000_000,
|
|
1397
|
+
vaultAddress,
|
|
1398
|
+
})
|
|
1399
|
+
const signerIntent = targetYieldIntent()
|
|
1400
|
+
const intentId = Signer.id(signerIntent)
|
|
1401
|
+
const expireAttempt = async (options: { nonce: string; replacementOf?: string }) => {
|
|
1402
|
+
const attempt = await RewardTransactionAttempts.create(db, {
|
|
1403
|
+
chainId: 4217,
|
|
1404
|
+
intent: { id: intentId, operation: 'targetYield', payload: signerIntent },
|
|
1405
|
+
replacementOf: options.replacementOf,
|
|
1406
|
+
runId: run.id,
|
|
1407
|
+
signer,
|
|
1408
|
+
vaultAddress,
|
|
1409
|
+
})
|
|
1410
|
+
await RewardTransactionAttempts.recordSignature(db, {
|
|
1411
|
+
expiresAt: '2026-01-01T00:00:00.000Z',
|
|
1412
|
+
id: attempt.id,
|
|
1413
|
+
nonce: options.nonce,
|
|
1414
|
+
signedBytes: '0x01',
|
|
1415
|
+
transactionHash: `0x${options.nonce.repeat(64)}`,
|
|
1416
|
+
})
|
|
1417
|
+
await RewardTransactionAttempts.expire(db, attempt.id)
|
|
1418
|
+
return attempt
|
|
1419
|
+
}
|
|
1420
|
+
const older = await expireAttempt({ nonce: '1' })
|
|
1421
|
+
const newer = await expireAttempt({ nonce: '2', replacementOf: older.id })
|
|
1422
|
+
await setCreatedAt(db, {
|
|
1423
|
+
[older.id]: '2026-01-01T00:00:00.000Z',
|
|
1424
|
+
[newer.id]: '2026-01-02T00:00:00.000Z',
|
|
1425
|
+
})
|
|
1426
|
+
|
|
1427
|
+
await expect(
|
|
1428
|
+
RewardTransactionAttempts.latestForIntent(db, { intentId, runId: run.id }),
|
|
1429
|
+
).resolves.toMatchObject({ id: newer.id, state: 'expired' })
|
|
1430
|
+
})
|
|
1431
|
+
})
|
|
1432
|
+
|
|
1433
|
+
describe('latestRecoverable', () => {
|
|
1434
|
+
test('returns the newest recoverable attempt for a run operation', async () => {
|
|
1435
|
+
const db = TestApp.database()
|
|
1436
|
+
await seedCampaign(db)
|
|
1437
|
+
const run = await RewardRuns.ensure(db, {
|
|
1438
|
+
chainId: 4217,
|
|
1439
|
+
config,
|
|
1440
|
+
endsAt: 2_000_000_300,
|
|
1441
|
+
startsAfter: 2_000_000_000,
|
|
1442
|
+
vaultAddress,
|
|
1443
|
+
})
|
|
1444
|
+
const signerIntent = targetYieldIntent()
|
|
1445
|
+
const [older, newer] = await Promise.all(
|
|
1446
|
+
[`0x${'11'.repeat(32)}` as const, `0x${'22'.repeat(32)}` as const].map((id) =>
|
|
1447
|
+
RewardTransactionAttempts.create(db, {
|
|
1448
|
+
chainId: 4217,
|
|
1449
|
+
intent: { id, operation: 'targetYield', payload: signerIntent },
|
|
1450
|
+
runId: run.id,
|
|
1451
|
+
signer,
|
|
1452
|
+
vaultAddress,
|
|
1453
|
+
}),
|
|
1454
|
+
),
|
|
1455
|
+
)
|
|
1456
|
+
if (!older || !newer) throw new Error('Expected two attempts.')
|
|
1457
|
+
await setCreatedAt(db, {
|
|
1458
|
+
[older.id]: '2026-01-01T00:00:00.000Z',
|
|
1459
|
+
[newer.id]: '2026-01-02T00:00:00.000Z',
|
|
1460
|
+
})
|
|
1461
|
+
|
|
1462
|
+
await expect(
|
|
1463
|
+
RewardTransactionAttempts.latestRecoverable(db, { operation: 'targetYield', runId: run.id }),
|
|
1464
|
+
).resolves.toMatchObject({ id: newer.id, state: 'created' })
|
|
1465
|
+
})
|
|
1466
|
+
})
|
|
1467
|
+
|
|
1468
|
+
function targetYieldIntent() {
|
|
1469
|
+
return {
|
|
1470
|
+
controller: '0x7000000000000000000000000000000000000007',
|
|
1471
|
+
domain: {
|
|
1472
|
+
chainId: 4217,
|
|
1473
|
+
earnShare: shareAddress,
|
|
1474
|
+
earnVault: vaultAddress,
|
|
1475
|
+
factory: '0x8000000000000000000000000000000000000008',
|
|
1476
|
+
treasury: '0x0000000000000000000000000000000000000000',
|
|
1477
|
+
},
|
|
1478
|
+
funders: [funder],
|
|
1479
|
+
maxEarnShareSupply: '100',
|
|
1480
|
+
operation: 'targetYield' as const,
|
|
1481
|
+
requestedAssets: ['5'],
|
|
1482
|
+
} satisfies Signer.Request['intent']
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
async function setCreatedAt(
|
|
1486
|
+
db: ReturnType<typeof TestApp.database>,
|
|
1487
|
+
createdAt: { [id: string]: string },
|
|
1488
|
+
) {
|
|
1489
|
+
for (const [id, value] of Object.entries(createdAt))
|
|
1490
|
+
await db.kysely
|
|
1491
|
+
.updateTable('reward_transaction_attempts')
|
|
1492
|
+
.set({ createdAt: value })
|
|
1493
|
+
.where('id', '=', id)
|
|
1494
|
+
.execute()
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1363
1497
|
async function seedCampaign(db: ReturnType<typeof TestApp.database>) {
|
|
1364
1498
|
await seedVault(db)
|
|
1365
1499
|
return RewardCampaigns.upsert(db, {
|
|
@@ -1386,3 +1520,32 @@ async function seedVault(db: ReturnType<typeof TestApp.database>) {
|
|
|
1386
1520
|
zones: [],
|
|
1387
1521
|
})
|
|
1388
1522
|
}
|
|
1523
|
+
|
|
1524
|
+
/** Seeds three consecutive runs, advancing the campaign boundary between them. */
|
|
1525
|
+
async function seedRunSequence(db: ReturnType<typeof TestApp.database>) {
|
|
1526
|
+
await seedCampaign(db)
|
|
1527
|
+
const runs = []
|
|
1528
|
+
for (const startsAfter of [2_000_000_000, 2_000_000_200, 2_000_000_400]) {
|
|
1529
|
+
runs.push(
|
|
1530
|
+
await RewardRuns.ensure(db, {
|
|
1531
|
+
chainId: 4217,
|
|
1532
|
+
config,
|
|
1533
|
+
endsAt: startsAfter + 200,
|
|
1534
|
+
startsAfter,
|
|
1535
|
+
vaultAddress,
|
|
1536
|
+
}),
|
|
1537
|
+
)
|
|
1538
|
+
if (startsAfter === 2_000_000_400) break
|
|
1539
|
+
await RewardCampaigns.advance(db, {
|
|
1540
|
+
chainId: 4217,
|
|
1541
|
+
deliveredThrough: startsAfter + 200,
|
|
1542
|
+
expectedDeliveredThrough: startsAfter,
|
|
1543
|
+
vaultAddress,
|
|
1544
|
+
})
|
|
1545
|
+
}
|
|
1546
|
+
return runs as [RewardRuns.Record, RewardRuns.Record, RewardRuns.Record]
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
async function deliver(db: ReturnType<typeof TestApp.database>, run: RewardRuns.Record) {
|
|
1550
|
+
await RewardRuns.transition(db, { fence: run.fence, id: run.id, patch: {}, phase: 'delivered' })
|
|
1551
|
+
}
|
|
@@ -14,6 +14,20 @@ const input = {
|
|
|
14
14
|
walletAddress: Schema.Address.parse(`0x${'Bb'.repeat(20)}`),
|
|
15
15
|
} as const satisfies RewardEligibilityAssociations.upsert.Options
|
|
16
16
|
|
|
17
|
+
describe('get', () => {
|
|
18
|
+
test('normalizes addresses and scopes registration by chain, vault, and wallet', async () => {
|
|
19
|
+
const db = TestApp.database()
|
|
20
|
+
const { record } = await RewardEligibilityAssociations.upsert(db, input)
|
|
21
|
+
await expect(RewardEligibilityAssociations.get(db, input)).resolves.toEqual(record)
|
|
22
|
+
for (const selector of [
|
|
23
|
+
{ ...input, chainId: 42431 },
|
|
24
|
+
{ ...input, vaultAddress: input.walletAddress },
|
|
25
|
+
{ ...input, walletAddress: input.vaultAddress },
|
|
26
|
+
])
|
|
27
|
+
await expect(RewardEligibilityAssociations.get(db, selector)).resolves.toBeUndefined()
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
|
|
17
31
|
describe('upsert', () => {
|
|
18
32
|
test('creates a normalized association and refreshes its latest registration', async () => {
|
|
19
33
|
vi.useFakeTimers()
|
|
@@ -22,6 +22,30 @@ export type Table = Omit<
|
|
|
22
22
|
/** A stored reward eligibility association. */
|
|
23
23
|
export type Record = db_Schema.RewardEligibilityAssociation
|
|
24
24
|
|
|
25
|
+
/** Reads one wallet's eligibility registration for a vault. */
|
|
26
|
+
export async function get(db: Db.Db, options: get.Options): Promise<Record | undefined> {
|
|
27
|
+
const row = await db.kysely
|
|
28
|
+
.selectFrom('reward_eligibility_associations')
|
|
29
|
+
.selectAll()
|
|
30
|
+
.where('chainId', '=', String(options.chainId))
|
|
31
|
+
.where('vaultAddress', '=', normalize(options.vaultAddress))
|
|
32
|
+
.where('walletAddress', '=', normalize(options.walletAddress))
|
|
33
|
+
.executeTakeFirst()
|
|
34
|
+
return row ? toRecord(row) : undefined
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export declare namespace get {
|
|
38
|
+
/** One vault and wallet registration selector. */
|
|
39
|
+
type Options = {
|
|
40
|
+
/** Chain containing the vault. */
|
|
41
|
+
chainId: number
|
|
42
|
+
/** Earn vault address. */
|
|
43
|
+
vaultAddress: Address
|
|
44
|
+
/** Wallet whose eligibility is read. */
|
|
45
|
+
walletAddress: Address
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
25
49
|
/** Inserts or refreshes one eligibility association. */
|
|
26
50
|
export async function upsert(db: Db.Db, options: upsert.Options): Promise<upsert.Result> {
|
|
27
51
|
const now = new Date().toISOString()
|