tapimo 0.15.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +896 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +33 -33
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +454 -1
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +10 -4
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +24 -4
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +99 -103
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +5 -5
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +1 -19
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +93 -56
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +10 -10
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/rpc.js +45 -11
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +12 -12
- package/dist/apps/data/routes/valuation.d.ts +30 -30
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +1 -1
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +18 -11
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +3 -3
- package/dist/apps/management/App.d.ts +3043 -2198
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +16 -4
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +24 -24
- package/dist/apps/management/routes/invite-links.d.ts +66 -66
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +20 -20
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +76 -76
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +7 -9
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +119 -119
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +16 -3
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +90 -0
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +187 -135
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +418 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
- package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.js +65 -44
- package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +73 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +212 -85
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +4 -1
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +353 -42
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/apps/verified-tokens.test.ts +32 -0
- package/src/admin/apps/verified-tokens.ts +30 -4
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/__root.tsx +1 -1
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +35 -4
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
- package/src/admin/ui.generated.ts +99 -104
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/App.test.ts +26 -0
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +153 -2
- package/src/apps/data/routes/fee-amm.ts +132 -62
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +34 -2
- package/src/apps/data/routes/rpc.ts +47 -10
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
- package/src/apps/data/routes/webhooks.test.ts +18 -3
- package/src/apps/data/routes/webhooks.ts +27 -13
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
- package/src/apps/management/routes/verified-token-requests.ts +7 -10
- package/src/apps/mcp.test.ts +108 -25
- package/src/apps/mcp.ts +15 -3
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +507 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +133 -0
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
- package/src/db/tables/verifiedTokenRequests.ts +80 -44
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +383 -8
- package/src/internal/Auth.ts +272 -99
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1299 -18
- package/src/internal/routes/providers/relay.ts +424 -39
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
|
@@ -355,6 +355,7 @@ export async function latestSummary(
|
|
|
355
355
|
.where('chainId', '=', String(options.chainId))
|
|
356
356
|
.where('vaultAddress', '=', normalize(options.vaultAddress))
|
|
357
357
|
.orderBy('startsAfter', 'desc')
|
|
358
|
+
.limit(1)
|
|
358
359
|
.executeTakeFirst()
|
|
359
360
|
if (!row) return undefined
|
|
360
361
|
return {
|
|
@@ -399,6 +400,7 @@ export async function latestStatement(
|
|
|
399
400
|
]),
|
|
400
401
|
)
|
|
401
402
|
.orderBy('endsAt', 'desc')
|
|
403
|
+
.limit(1)
|
|
402
404
|
.executeTakeFirst()
|
|
403
405
|
if (!row) return undefined
|
|
404
406
|
const record = toRecord(row)
|
|
@@ -419,6 +421,8 @@ export async function latestDelivered(
|
|
|
419
421
|
.where('vaultAddress', '=', normalize(options.vaultAddress))
|
|
420
422
|
.where('phase', '=', 'delivered')
|
|
421
423
|
.orderBy('endsAt', 'desc')
|
|
424
|
+
// `executeTakeFirst` adds no LIMIT; without one Postgres returns every run.
|
|
425
|
+
.limit(1)
|
|
422
426
|
.executeTakeFirst()) as DeliveredSummary | undefined
|
|
423
427
|
}
|
|
424
428
|
|
|
@@ -200,6 +200,7 @@ export async function latestForIntent(
|
|
|
200
200
|
'asc',
|
|
201
201
|
)
|
|
202
202
|
.orderBy('createdAt', 'desc')
|
|
203
|
+
.limit(1)
|
|
203
204
|
.executeTakeFirst()
|
|
204
205
|
return row ? toRecord(row) : undefined
|
|
205
206
|
}
|
|
@@ -249,6 +250,7 @@ export async function latestRecoverable(
|
|
|
249
250
|
.where('state', 'in', ['created', 'signed', 'broadcast', 'confirmed'])
|
|
250
251
|
.where(sql<boolean>`intent ->> 'operation' = ${options.operation}`)
|
|
251
252
|
.orderBy('createdAt', 'desc')
|
|
253
|
+
.limit(1)
|
|
252
254
|
.executeTakeFirst()
|
|
253
255
|
return row ? toRecord(row) : undefined
|
|
254
256
|
}
|
|
@@ -75,7 +75,87 @@ describe('getByProviderAddress', () => {
|
|
|
75
75
|
})
|
|
76
76
|
})
|
|
77
77
|
|
|
78
|
+
describe('grandfatherLegacySponsored', () => {
|
|
79
|
+
test('preserves fixed-rate identity when pinning enterprise terms', async () => {
|
|
80
|
+
const record = await seed({
|
|
81
|
+
providerState: { fixedRate: '1:1', routePolicyKey: '["","1:1"]' },
|
|
82
|
+
snapshot: TestRoutes.depositAddressSnapshot({
|
|
83
|
+
provider: { id: 'fixed_rate_reviewed', name: 'Fixed rate reviewed' },
|
|
84
|
+
recipient: `0x${'93'.repeat(20)}`,
|
|
85
|
+
subsidize: true,
|
|
86
|
+
}),
|
|
87
|
+
})
|
|
88
|
+
await RoutesDepositAddresses.grandfatherLegacySponsored(db, {
|
|
89
|
+
addressIds: [record.id],
|
|
90
|
+
apply: true,
|
|
91
|
+
commitment: {
|
|
92
|
+
maxAmount: '0.05',
|
|
93
|
+
scope: { environment: 'production', orgId: record.orgId },
|
|
94
|
+
versions: [1],
|
|
95
|
+
},
|
|
96
|
+
})
|
|
97
|
+
const stored = await RoutesDepositAddresses.get(db, record.id)
|
|
98
|
+
expect(stored?.providerState).toMatchInlineSnapshot(`
|
|
99
|
+
{
|
|
100
|
+
"fixedRate": "1:1",
|
|
101
|
+
"routePolicy": {
|
|
102
|
+
"maxAmount": "0.05",
|
|
103
|
+
"scope": {
|
|
104
|
+
"environment": "production",
|
|
105
|
+
"orgId": "org_deposit_addresses",
|
|
106
|
+
},
|
|
107
|
+
"subsidyPayer": "enterprise",
|
|
108
|
+
"versions": [
|
|
109
|
+
1,
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
"routePolicyKey": "["[\\"enterprise\\",\\"0.050000\\"]","1:1"]",
|
|
113
|
+
}
|
|
114
|
+
`)
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
|
|
78
118
|
describe('routes migration', () => {
|
|
119
|
+
test('reports ambiguous legacy rows and only applies explicitly reviewed enterprise terms', async () => {
|
|
120
|
+
const reviewed = await seed({
|
|
121
|
+
snapshot: TestRoutes.depositAddressSnapshot({
|
|
122
|
+
provider: { id: 'legacy_reviewed', name: 'Legacy reviewed' },
|
|
123
|
+
recipient: `0x${'91'.repeat(20)}`,
|
|
124
|
+
subsidize: true,
|
|
125
|
+
}),
|
|
126
|
+
})
|
|
127
|
+
const ambiguous = await seed({
|
|
128
|
+
snapshot: TestRoutes.depositAddressSnapshot({
|
|
129
|
+
provider: { id: 'legacy_ambiguous', name: 'Legacy ambiguous' },
|
|
130
|
+
recipient: `0x${'92'.repeat(20)}`,
|
|
131
|
+
subsidize: true,
|
|
132
|
+
}),
|
|
133
|
+
})
|
|
134
|
+
const options = {
|
|
135
|
+
addressIds: [reviewed.id, 'rda_missing'],
|
|
136
|
+
commitment: {
|
|
137
|
+
maxAmount: '12.5',
|
|
138
|
+
scope: { environment: 'production', orgId: reviewed.orgId },
|
|
139
|
+
versions: [4] as number[],
|
|
140
|
+
},
|
|
141
|
+
} satisfies RoutesDepositAddresses.grandfatherLegacySponsored.Options
|
|
142
|
+
|
|
143
|
+
const dryRun = await RoutesDepositAddresses.grandfatherLegacySponsored(db, options)
|
|
144
|
+
expect(dryRun).toMatchObject({
|
|
145
|
+
ambiguous: expect.arrayContaining([ambiguous.id]),
|
|
146
|
+
applied: false,
|
|
147
|
+
grandfathered: [reviewed.id],
|
|
148
|
+
missing: ['rda_missing'],
|
|
149
|
+
})
|
|
150
|
+
await RoutesDepositAddresses.grandfatherLegacySponsored(db, { ...options, apply: true })
|
|
151
|
+
|
|
152
|
+
expect((await RoutesDepositAddresses.get(db, reviewed.id))?.providerState).toMatchObject({
|
|
153
|
+
routePolicy: { maxAmount: '12.5', subsidyPayer: 'enterprise', versions: [4] },
|
|
154
|
+
routePolicyKey: '["enterprise","12.500000"]',
|
|
155
|
+
})
|
|
156
|
+
expect((await RoutesDepositAddresses.get(db, ambiguous.id))?.providerState).toBeNull()
|
|
157
|
+
})
|
|
158
|
+
|
|
79
159
|
test('backfills canonical creator attribution for retained addresses', async () => {
|
|
80
160
|
const orgId = 'org_deposit_address_creator_backfill'
|
|
81
161
|
const userId = 'usr_deposit_address_creator_backfill'
|
|
@@ -726,6 +806,135 @@ describe('failPoll', () => {
|
|
|
726
806
|
})
|
|
727
807
|
|
|
728
808
|
describe('insertOrGet', () => {
|
|
809
|
+
test('keeps legacy reuse and provider state isolated from newer policy addresses', async () => {
|
|
810
|
+
const legacy = await seed({
|
|
811
|
+
providerState: { checkEndpoint: '/intents/status/v3?requestId=legacy' },
|
|
812
|
+
})
|
|
813
|
+
const match: RoutesDepositAddresses.Match = {
|
|
814
|
+
destinationTokenKey: legacy.destinationTokenKey,
|
|
815
|
+
environment: legacy.environment,
|
|
816
|
+
orgId: legacy.orgId,
|
|
817
|
+
recipient: legacy.recipient,
|
|
818
|
+
refundAddress: legacy.refundAddress,
|
|
819
|
+
sourceChainId: legacy.sourceChainId,
|
|
820
|
+
sourceTokenKey: legacy.sourceTokenKey,
|
|
821
|
+
subsidize: legacy.subsidize,
|
|
822
|
+
}
|
|
823
|
+
const pinned = {
|
|
824
|
+
...legacy,
|
|
825
|
+
address: `0x${'da'.repeat(20)}`,
|
|
826
|
+
id: DepositAddress.generateId(),
|
|
827
|
+
providerState: { routePolicyKey: '["tempo","0.150000"]' },
|
|
828
|
+
snapshot: { ...legacy.snapshot, address: `0x${'da'.repeat(20)}` },
|
|
829
|
+
}
|
|
830
|
+
await RoutesDepositAddresses.insertOrGet(db, {
|
|
831
|
+
match: { ...match, policyKey: '["tempo","0.150000"]', providerId: legacy.providerId },
|
|
832
|
+
record: pinned,
|
|
833
|
+
})
|
|
834
|
+
// A rolling legacy reader supplies neither policyKey nor providerId, even after provider configuration changes.
|
|
835
|
+
expect(await RoutesDepositAddresses.getMatching(db, match)).toEqual(legacy)
|
|
836
|
+
expect(
|
|
837
|
+
await RoutesDepositAddresses.insertOrGet(db, {
|
|
838
|
+
match,
|
|
839
|
+
record: {
|
|
840
|
+
...legacy,
|
|
841
|
+
address: `0x${'db'.repeat(20)}`,
|
|
842
|
+
id: DepositAddress.generateId(),
|
|
843
|
+
providerId: 'rotated_provider',
|
|
844
|
+
providerState: {},
|
|
845
|
+
},
|
|
846
|
+
}),
|
|
847
|
+
).toEqual(legacy)
|
|
848
|
+
expect(
|
|
849
|
+
await RoutesDepositAddresses.getMatching(db, {
|
|
850
|
+
...match,
|
|
851
|
+
policyKey: '["tempo","0.150000"]',
|
|
852
|
+
providerId: legacy.providerId,
|
|
853
|
+
}),
|
|
854
|
+
).toEqual(pinned)
|
|
855
|
+
expect(await RoutesDepositAddresses.get(db, legacy.id)).toEqual(legacy)
|
|
856
|
+
})
|
|
857
|
+
|
|
858
|
+
test('creates and independently reuses addresses with different pinned caps', async () => {
|
|
859
|
+
const first = await seed({
|
|
860
|
+
providerState: { routePolicyKey: '["tempo","0.050000"]' },
|
|
861
|
+
})
|
|
862
|
+
const record = {
|
|
863
|
+
...first,
|
|
864
|
+
address: `0x${'ed'.repeat(20)}`,
|
|
865
|
+
id: DepositAddress.generateId(new Date('2027-03-01')),
|
|
866
|
+
providerState: { routePolicyKey: '["tempo","0.150000"]' },
|
|
867
|
+
}
|
|
868
|
+
const match: RoutesDepositAddresses.Match = {
|
|
869
|
+
destinationTokenKey: record.destinationTokenKey,
|
|
870
|
+
environment: record.environment,
|
|
871
|
+
orgId: record.orgId,
|
|
872
|
+
policyKey: '["tempo","0.150000"]',
|
|
873
|
+
providerId: record.providerId,
|
|
874
|
+
recipient: record.recipient,
|
|
875
|
+
refundAddress: record.refundAddress,
|
|
876
|
+
sourceChainId: record.sourceChainId,
|
|
877
|
+
sourceTokenKey: record.sourceTokenKey,
|
|
878
|
+
subsidize: record.subsidize,
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
const results = await Promise.all([
|
|
882
|
+
RoutesDepositAddresses.insertOrGet(db, { match, record }),
|
|
883
|
+
RoutesDepositAddresses.insertOrGet(db, {
|
|
884
|
+
match,
|
|
885
|
+
record: {
|
|
886
|
+
...record,
|
|
887
|
+
address: `0x${'ee'.repeat(20)}`,
|
|
888
|
+
id: DepositAddress.generateId(new Date('2027-03-02')),
|
|
889
|
+
},
|
|
890
|
+
}),
|
|
891
|
+
])
|
|
892
|
+
expect(results[0]).toEqual(results[1])
|
|
893
|
+
expect(results[0]?.address).not.toBe(first.address)
|
|
894
|
+
expect(await RoutesDepositAddresses.getMatching(db, match)).toEqual(results[0])
|
|
895
|
+
expect(
|
|
896
|
+
await RoutesDepositAddresses.getMatching(db, {
|
|
897
|
+
...match,
|
|
898
|
+
policyKey: '["tempo","0.050000"]',
|
|
899
|
+
}),
|
|
900
|
+
).toEqual(first)
|
|
901
|
+
expect(await RoutesDepositAddresses.get(db, first.id)).toEqual(first)
|
|
902
|
+
})
|
|
903
|
+
|
|
904
|
+
test.each(['provider', 'policy'] as const)(
|
|
905
|
+
'reports a late %s conflict without assigning the wrong provider or physical address',
|
|
906
|
+
async (difference) => {
|
|
907
|
+
const first = await seed()
|
|
908
|
+
const record = {
|
|
909
|
+
...first,
|
|
910
|
+
address: difference === 'policy' ? first.address : `0x${'ef'.repeat(20)}`,
|
|
911
|
+
id: DepositAddress.generateId(new Date('2027-02-01')),
|
|
912
|
+
providerId: difference === 'provider' ? 'different_provider' : first.providerId,
|
|
913
|
+
providerState: difference === 'policy' ? { routePolicyKey: '["tempo","0.050000"]' } : {},
|
|
914
|
+
}
|
|
915
|
+
const match: RoutesDepositAddresses.Match = {
|
|
916
|
+
destinationTokenKey: record.destinationTokenKey,
|
|
917
|
+
environment: record.environment,
|
|
918
|
+
orgId: record.orgId,
|
|
919
|
+
policyKey: difference === 'policy' ? '["tempo","0.050000"]' : undefined,
|
|
920
|
+
providerId: record.providerId,
|
|
921
|
+
recipient: record.recipient,
|
|
922
|
+
refundAddress: record.refundAddress,
|
|
923
|
+
sourceChainId: record.sourceChainId,
|
|
924
|
+
sourceTokenKey: record.sourceTokenKey,
|
|
925
|
+
subsidize: record.subsidize,
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
// Both requests passed preflight; the winner is persisted before the loser's insert.
|
|
929
|
+
for (let attempt = 0; attempt < 2; attempt++)
|
|
930
|
+
await expect(
|
|
931
|
+
RoutesDepositAddresses.insertOrGet(db, { match, record }),
|
|
932
|
+
).rejects.toBeInstanceOf(RoutesDepositAddresses.IdentityConflictError)
|
|
933
|
+
expect(await RoutesDepositAddresses.get(db, record.id)).toBeUndefined()
|
|
934
|
+
expect(await RoutesDepositAddresses.get(db, first.id)).toEqual(first)
|
|
935
|
+
},
|
|
936
|
+
)
|
|
937
|
+
|
|
729
938
|
test('returns the existing address for an identical reusable identity', async () => {
|
|
730
939
|
const record = await seed()
|
|
731
940
|
const match: RoutesDepositAddresses.Match = {
|
|
@@ -1020,6 +1229,60 @@ describe('summarize', () => {
|
|
|
1020
1229
|
})
|
|
1021
1230
|
|
|
1022
1231
|
describe('checkpointPoll', () => {
|
|
1232
|
+
test.each([
|
|
1233
|
+
{
|
|
1234
|
+
routePolicy: { maxAmount: '0.05', scope: owner, subsidyPayer: 'tempo', versions: [1] },
|
|
1235
|
+
routePolicyKey: '["tempo","0.050000"]',
|
|
1236
|
+
},
|
|
1237
|
+
{ fixedRate: '1:1', routePolicyKey: '["","1:1"]' },
|
|
1238
|
+
{
|
|
1239
|
+
fixedRate: '1:1',
|
|
1240
|
+
routePolicy: {
|
|
1241
|
+
maxAmount: '0.05',
|
|
1242
|
+
scope: owner,
|
|
1243
|
+
subsidyPayer: 'enterprise',
|
|
1244
|
+
versions: [0, 0],
|
|
1245
|
+
},
|
|
1246
|
+
routePolicyKey: '["[\\"enterprise\\",\\"0.050000\\"]","1:1"]',
|
|
1247
|
+
},
|
|
1248
|
+
{ routePolicy: null, routePolicyKey: 'invalid' },
|
|
1249
|
+
{},
|
|
1250
|
+
])(
|
|
1251
|
+
'preserves financial terms across provider cursor replacement and completion: %j',
|
|
1252
|
+
async (providerState) => {
|
|
1253
|
+
const record = await seed({ providerState })
|
|
1254
|
+
const [claim] = await RoutesDepositAddresses.claimDue(db, {
|
|
1255
|
+
leaseUntil: '2027-01-01T00:01:00.000Z',
|
|
1256
|
+
limit: 1,
|
|
1257
|
+
now: '2027-01-01T00:00:00.000Z',
|
|
1258
|
+
providerId: record.providerId,
|
|
1259
|
+
})
|
|
1260
|
+
if (!claim) throw new Error('Expected a claimed address.')
|
|
1261
|
+
const checkpoint = await RoutesDepositAddresses.checkpointPoll(db, {
|
|
1262
|
+
id: record.id,
|
|
1263
|
+
pollLeaseVersion: claim.pollLeaseVersion,
|
|
1264
|
+
providerState: {
|
|
1265
|
+
cursor: 'next',
|
|
1266
|
+
fixedRate: '2:1',
|
|
1267
|
+
routePolicy: { subsidyPayer: 'enterprise' },
|
|
1268
|
+
routePolicyKey: 'replacement',
|
|
1269
|
+
},
|
|
1270
|
+
})
|
|
1271
|
+
expect(checkpoint?.providerState).toEqual({ ...providerState, cursor: 'next' })
|
|
1272
|
+
const completed = await RoutesDepositAddresses.completePoll(db, {
|
|
1273
|
+
id: record.id,
|
|
1274
|
+
pollLeaseVersion: claim.pollLeaseVersion,
|
|
1275
|
+
providerState: null,
|
|
1276
|
+
providerRequestIds: [],
|
|
1277
|
+
lastPolledAt: '2027-01-01T00:00:10.000Z',
|
|
1278
|
+
nextPollAt: '2027-01-01T00:01:10.000Z',
|
|
1279
|
+
})
|
|
1280
|
+
expect(completed?.providerState).toEqual(
|
|
1281
|
+
Object.keys(providerState).length ? providerState : null,
|
|
1282
|
+
)
|
|
1283
|
+
},
|
|
1284
|
+
)
|
|
1285
|
+
|
|
1023
1286
|
test('retains the lease while saving progress and rejects a stale fence', async () => {
|
|
1024
1287
|
const record = await seed()
|
|
1025
1288
|
const [claim] = await RoutesDepositAddresses.claimDue(db, {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { sql, type JSONColumnType, type Selectable } from 'kysely'
|
|
2
|
-
import * as pg from 'pg'
|
|
3
2
|
|
|
4
3
|
import type * as Db from '../Db.js'
|
|
5
4
|
import type * as db_Schema from '../Schema.js'
|
|
5
|
+
import * as Policy from '../../internal/routes/Policy.js'
|
|
6
6
|
import * as RoutesIdempotency from './routesIdempotency.js'
|
|
7
7
|
import * as RoutesSubsidies from './routesSubsidies.js'
|
|
8
8
|
|
|
@@ -15,6 +15,69 @@ export type Table = Omit<db_Schema.RoutesDepositAddress, 'providerRequestIds'> &
|
|
|
15
15
|
/** A stored route deposit address. */
|
|
16
16
|
export type Record = Selectable<Table>
|
|
17
17
|
|
|
18
|
+
/** Reviews and optionally pins explicitly approved legacy sponsored addresses. */
|
|
19
|
+
export async function grandfatherLegacySponsored(
|
|
20
|
+
db: Db.Db,
|
|
21
|
+
options: grandfatherLegacySponsored.Options,
|
|
22
|
+
): Promise<grandfatherLegacySponsored.Report> {
|
|
23
|
+
let query = db.kysely
|
|
24
|
+
.selectFrom('routes_deposit_addresses')
|
|
25
|
+
.select(['id', 'providerState'])
|
|
26
|
+
.where('orgId', '=', options.commitment.scope.orgId)
|
|
27
|
+
.where('environment', '=', options.commitment.scope.environment)
|
|
28
|
+
.where('subsidize', '=', true)
|
|
29
|
+
.where(sql<boolean>`provider_state->'routePolicy' IS NULL`)
|
|
30
|
+
.orderBy('id')
|
|
31
|
+
query =
|
|
32
|
+
options.commitment.scope.projectId === undefined
|
|
33
|
+
? query.where('projectId', 'is', null)
|
|
34
|
+
: query.where('projectId', '=', options.commitment.scope.projectId)
|
|
35
|
+
const legacy = await query.execute()
|
|
36
|
+
const known = new Set(options.addressIds)
|
|
37
|
+
const existing = new Set(legacy.map(({ id }) => id))
|
|
38
|
+
const grandfathered = legacy.filter(({ id }) => known.has(id)).map(({ id }) => id)
|
|
39
|
+
const ambiguous = legacy.filter(({ id }) => !known.has(id)).map(({ id }) => id)
|
|
40
|
+
const missing = options.addressIds.filter((id) => !existing.has(id))
|
|
41
|
+
if (options.apply === true && grandfathered.length > 0) {
|
|
42
|
+
const routePolicy = Policy.schema.Commitment.parse({
|
|
43
|
+
...options.commitment,
|
|
44
|
+
subsidyPayer: 'enterprise',
|
|
45
|
+
})
|
|
46
|
+
await db.kysely
|
|
47
|
+
.updateTable('routes_deposit_addresses')
|
|
48
|
+
.set({
|
|
49
|
+
providerState: sql`coalesce(provider_state, '{}'::jsonb) || jsonb_build_object(
|
|
50
|
+
'routePolicy', ${JSON.stringify(routePolicy)}::jsonb,
|
|
51
|
+
'routePolicyKey', CASE WHEN provider_state->>'fixedRate' = '1:1'
|
|
52
|
+
THEN ${Policy.depositKey({ fixedRate: '1:1', routePolicy })}::text
|
|
53
|
+
ELSE ${Policy.commitmentKey(routePolicy)}::text END
|
|
54
|
+
)`,
|
|
55
|
+
})
|
|
56
|
+
.where('id', 'in', grandfathered)
|
|
57
|
+
.where('subsidize', '=', true)
|
|
58
|
+
.where(sql<boolean>`provider_state->'routePolicy' IS NULL`)
|
|
59
|
+
.execute()
|
|
60
|
+
}
|
|
61
|
+
return { ambiguous, applied: options.apply === true, grandfathered, missing }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export declare namespace grandfatherLegacySponsored {
|
|
65
|
+
type Options = {
|
|
66
|
+
/** Explicitly reviewed, unambiguous legacy address ids. */
|
|
67
|
+
addressIds: readonly string[]
|
|
68
|
+
/** Current approved limits and provenance; payer is forced to enterprise. */
|
|
69
|
+
commitment: Omit<Policy.Commitment, 'subsidyPayer'>
|
|
70
|
+
/** Writes when true; omitted is a dry run. */
|
|
71
|
+
apply?: boolean | undefined
|
|
72
|
+
}
|
|
73
|
+
type Report = {
|
|
74
|
+
ambiguous: readonly string[]
|
|
75
|
+
applied: boolean
|
|
76
|
+
grandfathered: readonly string[]
|
|
77
|
+
missing: readonly string[]
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
18
81
|
/** Ownership filter derived from the authenticated API key. */
|
|
19
82
|
export type Owner = {
|
|
20
83
|
/** Key environment. */
|
|
@@ -27,6 +90,10 @@ export type Owner = {
|
|
|
27
90
|
|
|
28
91
|
/** Identity fields that make one reusable address match a caller request. */
|
|
29
92
|
export type Match = Owner & {
|
|
93
|
+
/** Stable immutable financial commitment identity (empty for legacy rows). */
|
|
94
|
+
policyKey?: string | undefined
|
|
95
|
+
/** Provider that provisioned the reusable address. */
|
|
96
|
+
providerId?: string | undefined
|
|
30
97
|
/** Customer destination token key. */
|
|
31
98
|
destinationTokenKey: string
|
|
32
99
|
/** Tempo account that receives completed deposits. */
|
|
@@ -123,6 +190,7 @@ export function validateCreationCapacity(
|
|
|
123
190
|
return db
|
|
124
191
|
.transaction(async (tx) => {
|
|
125
192
|
await RoutesSubsidies.lockOrganization(tx, options.orgId)
|
|
193
|
+
await options.checkPolicy?.(tx)
|
|
126
194
|
const organization = await getCapacityOwner(tx, options.orgId)
|
|
127
195
|
if (!organization) throw new OwnerNotFoundError()
|
|
128
196
|
await lockCapacityOwner(tx, organization)
|
|
@@ -143,6 +211,18 @@ export function validateCreationCapacity(
|
|
|
143
211
|
})
|
|
144
212
|
return { allowed: true, result: { record: matching, type: 'existing' } } as const
|
|
145
213
|
}
|
|
214
|
+
// Different commitments may provision new addresses; the same commitment cannot silently switch providers.
|
|
215
|
+
if (
|
|
216
|
+
await matchingIdentity(tx, options.match)
|
|
217
|
+
.where(
|
|
218
|
+
sql<string>`coalesce(provider_state->>'routePolicyKey', '')`,
|
|
219
|
+
'=',
|
|
220
|
+
options.match.policyKey ?? '',
|
|
221
|
+
)
|
|
222
|
+
.select('id')
|
|
223
|
+
.executeTakeFirst()
|
|
224
|
+
)
|
|
225
|
+
throw new IdentityConflictError()
|
|
146
226
|
// Old workers cannot prove a checkpoint's owner or match; exact same-key retries attribute it before this fence.
|
|
147
227
|
if (await RoutesIdempotency.hasUnattributedInFlightClaim(tx)) throw new MatchInProgressError()
|
|
148
228
|
const reservation = await RoutesIdempotency.reserveDepositAddressMatch(tx, {
|
|
@@ -172,6 +252,8 @@ export function validateCreationCapacity(
|
|
|
172
252
|
export declare namespace validateCreationCapacity {
|
|
173
253
|
/** Reusable identity and organization capacity bound. */
|
|
174
254
|
type Options = {
|
|
255
|
+
/** Validates fresh instructions under the same lock as capacity and reuse. */
|
|
256
|
+
checkPolicy?: ((db: Db.Db) => Promise<void>) | undefined
|
|
175
257
|
/** Pending claim released atomically when the creator-wide cap is full. */
|
|
176
258
|
claim: RoutesIdempotency.release.Input
|
|
177
259
|
/** Maximum durable and in-flight addresses for one canonical creator. */
|
|
@@ -312,35 +394,15 @@ export async function insertOrGet(db: Db.Db, options: insertOrGet.Options): Prom
|
|
|
312
394
|
...options.record,
|
|
313
395
|
providerRequestIds: JSON.stringify(options.record.providerRequestIds),
|
|
314
396
|
})
|
|
315
|
-
.
|
|
316
|
-
|
|
317
|
-
.columns([
|
|
318
|
-
'orgId',
|
|
319
|
-
'environment',
|
|
320
|
-
'projectId',
|
|
321
|
-
'sourceChainId',
|
|
322
|
-
'sourceTokenKey',
|
|
323
|
-
'destinationTokenKey',
|
|
324
|
-
'recipient',
|
|
325
|
-
'refundAddress',
|
|
326
|
-
'subsidize',
|
|
327
|
-
])
|
|
328
|
-
.doNothing(),
|
|
329
|
-
)
|
|
397
|
+
// Handle both financial-identity and physical-provider-address uniqueness without replacing either row.
|
|
398
|
+
.onConflict((oc) => oc.doNothing())
|
|
330
399
|
.returningAll()
|
|
331
400
|
.executeTakeFirst()
|
|
332
|
-
.catch((cause) => {
|
|
333
|
-
if (
|
|
334
|
-
cause instanceof pg.DatabaseError &&
|
|
335
|
-
cause.code === '23505' &&
|
|
336
|
-
cause.constraint === 'routes_deposit_addresses_provider_address_key'
|
|
337
|
-
)
|
|
338
|
-
throw new ConflictError()
|
|
339
|
-
throw cause
|
|
340
|
-
})
|
|
341
401
|
if (record) return record
|
|
342
402
|
const existing = await getMatching(db, options.match)
|
|
343
403
|
if (existing) return existing
|
|
404
|
+
if (await matchingIdentity(db, options.match).select('id').executeTakeFirst())
|
|
405
|
+
throw new IdentityConflictError()
|
|
344
406
|
throw new ConflictError()
|
|
345
407
|
}
|
|
346
408
|
|
|
@@ -707,9 +769,17 @@ export declare namespace summarize {
|
|
|
707
769
|
|
|
708
770
|
/** Gets the reusable address that matches one owner and route identity. */
|
|
709
771
|
export function getMatching(db: Db.Db, match: Match): Promise<Record | undefined> {
|
|
710
|
-
let query = db
|
|
711
|
-
.selectFrom('routes_deposit_addresses')
|
|
772
|
+
let query = matchingIdentity(db, match)
|
|
712
773
|
.selectAll()
|
|
774
|
+
.where(sql<string>`coalesce(provider_state->>'routePolicyKey', '')`, '=', match.policyKey ?? '')
|
|
775
|
+
if (match.providerId !== undefined) query = query.where('providerId', '=', match.providerId)
|
|
776
|
+
return query.executeTakeFirst()
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
/** Matches route ownership across financial commitments, including deactivated addresses. */
|
|
780
|
+
function matchingIdentity(db: Db.Db, match: Match) {
|
|
781
|
+
const query = db.kysely
|
|
782
|
+
.selectFrom('routes_deposit_addresses')
|
|
713
783
|
.where('destinationTokenKey', '=', match.destinationTokenKey)
|
|
714
784
|
.where('environment', '=', match.environment)
|
|
715
785
|
.where('orgId', '=', match.orgId)
|
|
@@ -718,11 +788,9 @@ export function getMatching(db: Db.Db, match: Match): Promise<Record | undefined
|
|
|
718
788
|
.where('sourceChainId', '=', match.sourceChainId)
|
|
719
789
|
.where('sourceTokenKey', '=', match.sourceTokenKey)
|
|
720
790
|
.where('subsidize', '=', match.subsidize)
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
: query.where('projectId', '=', match.projectId)
|
|
725
|
-
return query.executeTakeFirst()
|
|
791
|
+
return match.projectId === undefined
|
|
792
|
+
? query.where('projectId', 'is', null)
|
|
793
|
+
: query.where('projectId', '=', match.projectId)
|
|
726
794
|
}
|
|
727
795
|
|
|
728
796
|
/** Lists active provider addresses for one source-chain token. */
|
|
@@ -862,7 +930,7 @@ export declare namespace renewPoll {
|
|
|
862
930
|
export function checkpointPoll(db: Db.Db, options: checkpointPoll.Options) {
|
|
863
931
|
return db.kysely
|
|
864
932
|
.updateTable('routes_deposit_addresses')
|
|
865
|
-
.set({ providerState: options.providerState })
|
|
933
|
+
.set({ providerState: pollState(options.providerState) })
|
|
866
934
|
.where('id', '=', options.id)
|
|
867
935
|
.where('pollLeaseVersion', '=', options.pollLeaseVersion)
|
|
868
936
|
.returningAll()
|
|
@@ -887,7 +955,7 @@ export function completePoll(
|
|
|
887
955
|
pollFailureCount: 0,
|
|
888
956
|
pollLeaseUntil: null,
|
|
889
957
|
providerRequestIds: JSON.stringify(options.providerRequestIds),
|
|
890
|
-
providerState: options.providerState,
|
|
958
|
+
providerState: pollState(options.providerState),
|
|
891
959
|
})
|
|
892
960
|
.where('id', '=', options.id)
|
|
893
961
|
.where('pollLeaseVersion', '=', options.pollLeaseVersion)
|
|
@@ -895,6 +963,17 @@ export function completePoll(
|
|
|
895
963
|
.executeTakeFirst()
|
|
896
964
|
}
|
|
897
965
|
|
|
966
|
+
// Provider cursors may replace private state, but cannot change or erase financial terms.
|
|
967
|
+
function pollState(state: Record['providerState']) {
|
|
968
|
+
const encoded = state === null ? null : JSON.stringify(state)
|
|
969
|
+
return sql<Record['providerState']>`CASE
|
|
970
|
+
WHEN provider_state ?| ARRAY['fixedRate', 'routePolicy', 'routePolicyKey'] THEN
|
|
971
|
+
(coalesce(${encoded}::jsonb, '{}'::jsonb) - 'fixedRate' - 'routePolicy' - 'routePolicyKey') ||
|
|
972
|
+
(SELECT jsonb_object_agg(key, value) FROM jsonb_each(provider_state)
|
|
973
|
+
WHERE key IN ('fixedRate', 'routePolicy', 'routePolicyKey'))
|
|
974
|
+
ELSE (${encoded}::jsonb - 'fixedRate' - 'routePolicy' - 'routePolicyKey') END`
|
|
975
|
+
}
|
|
976
|
+
|
|
898
977
|
export declare namespace completePoll {
|
|
899
978
|
/** Successful reconciliation result guarded by the claimed lease version. */
|
|
900
979
|
type Options = {
|
|
@@ -984,6 +1063,11 @@ export class ConflictError extends Error {
|
|
|
984
1063
|
override name = 'RoutesDepositAddresses.ConflictError'
|
|
985
1064
|
}
|
|
986
1065
|
|
|
1066
|
+
/** The requested identity conflicts with an existing provider or physical address commitment. */
|
|
1067
|
+
export class IdentityConflictError extends Error {
|
|
1068
|
+
override name = 'RoutesDepositAddresses.IdentityConflictError'
|
|
1069
|
+
}
|
|
1070
|
+
|
|
987
1071
|
/** Organization deposit-address cap reached. */
|
|
988
1072
|
export class LimitExceededError extends Error {
|
|
989
1073
|
override name = 'RoutesDepositAddresses.LimitExceededError'
|