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
|
@@ -5,7 +5,7 @@ import { Hash, Hex, Secp256k1 } from 'ox'
|
|
|
5
5
|
import { ZoneRpcAuthentication } from 'ox/tempo'
|
|
6
6
|
import { createClient, http } from 'viem'
|
|
7
7
|
import { prepareTransactionRequest, sendRawTransactionSync, signTransaction } from 'viem/actions'
|
|
8
|
-
import { Account as TempoAccount, Actions, Transaction, withRelay } from 'viem/tempo'
|
|
8
|
+
import { Account as TempoAccount, Actions, Addresses, Transaction, withRelay } from 'viem/tempo'
|
|
9
9
|
|
|
10
10
|
import * as TestApp from '../../../test/App.js'
|
|
11
11
|
import * as Containers from '../../../test/containers.js'
|
|
@@ -25,6 +25,7 @@ import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js
|
|
|
25
25
|
import * as StripeCustomers from '../../db/tables/stripeCustomers.js'
|
|
26
26
|
import * as core_Billing from '../management/Billing.js'
|
|
27
27
|
import * as RequestListener from '../../handlers/internal/requestListener.js'
|
|
28
|
+
import * as Store from '../../internal/Store.js'
|
|
28
29
|
import * as Tidx from '../../internal/Tidx.js'
|
|
29
30
|
import * as Viem from '../../internal/Viem.js'
|
|
30
31
|
import * as Sponsorships from './Sponsorships.js'
|
|
@@ -125,6 +126,36 @@ const keys = [
|
|
|
125
126
|
},
|
|
126
127
|
] as const satisfies readonly TestApp.kvStore.Key[]
|
|
127
128
|
|
|
129
|
+
describe('behavior: multisig coordination', () => {
|
|
130
|
+
test('uses configured state and reports coordinator failures', async () => {
|
|
131
|
+
const entries: Log.Entry[] = []
|
|
132
|
+
const store = Store.memory()
|
|
133
|
+
const app = TestApp.create({
|
|
134
|
+
auth: { keys },
|
|
135
|
+
logger: (entry) => void entries.push(entry),
|
|
136
|
+
relay: { multisig: { store } },
|
|
137
|
+
})
|
|
138
|
+
const hash = Hex.random(32)
|
|
139
|
+
const request = async () => {
|
|
140
|
+
const response = await app.request('/rpc/relay', {
|
|
141
|
+
body: JSON.stringify({
|
|
142
|
+
id: 1,
|
|
143
|
+
jsonrpc: '2.0',
|
|
144
|
+
method: 'multisig_getOperation',
|
|
145
|
+
params: [hash],
|
|
146
|
+
}),
|
|
147
|
+
headers: { 'content-type': 'application/json', 'tempo-api-key': 'secret_unscoped' },
|
|
148
|
+
method: 'POST',
|
|
149
|
+
})
|
|
150
|
+
return response.json()
|
|
151
|
+
}
|
|
152
|
+
expect(await request()).toMatchObject({ result: null })
|
|
153
|
+
await store.put(`multisig:v2:multisig:operation:${hash}`, 'invalid')
|
|
154
|
+
expect(await request()).toMatchObject({ error: { code: -32603 } })
|
|
155
|
+
expect(entries.at(-1)?.rpc).toMatchObject({ serverErrors: 1 })
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
|
|
128
159
|
describe('behavior: Zone chain routing', () => {
|
|
129
160
|
const zoneSelectors = [
|
|
130
161
|
['relay', 'path'],
|
|
@@ -712,6 +743,8 @@ describe.skipIf(runtime.mode !== 'localnet')('behavior: sponsorship', () => {
|
|
|
712
743
|
"finalizationAttemptedAt": null,
|
|
713
744
|
"finalizedAt": null,
|
|
714
745
|
"id": "<id>",
|
|
746
|
+
"meterEventFirstAttemptedAt": null,
|
|
747
|
+
"meterReportAttemptedAt": null,
|
|
715
748
|
"meterReportedAt": null,
|
|
716
749
|
"orgId": "org_1",
|
|
717
750
|
"projectId": "prj_1",
|
|
@@ -720,6 +753,7 @@ describe.skipIf(runtime.mode !== 'localnet')('behavior: sponsorship', () => {
|
|
|
720
753
|
"status": "pending",
|
|
721
754
|
"transaction": "<hex>",
|
|
722
755
|
"transactionHash": "<hash>",
|
|
756
|
+
"transactionHashReconciled": false,
|
|
723
757
|
}
|
|
724
758
|
`)
|
|
725
759
|
})
|
|
@@ -1239,6 +1273,56 @@ describe('behavior: mainnet billing gate', () => {
|
|
|
1239
1273
|
await TestApp.verifiedSeed(db, Viem.chainId.mainnet)
|
|
1240
1274
|
}
|
|
1241
1275
|
|
|
1276
|
+
test('behavior: uses the same sponsor fee token for each authenticated organization', async () => {
|
|
1277
|
+
const db = TestApp.database()
|
|
1278
|
+
const ousd = '0x20c0000000000000000000006a37DA5C996874BE'
|
|
1279
|
+
await activate(db, 'org_1')
|
|
1280
|
+
await activate(db, 'org_2')
|
|
1281
|
+
await TestApp.verifiedSeed(db, Viem.chainId.mainnet, {
|
|
1282
|
+
tokens: [Addresses.pathUsd, ousd].map((address) => ({
|
|
1283
|
+
address,
|
|
1284
|
+
currency: 'USD',
|
|
1285
|
+
decimals: 6,
|
|
1286
|
+
name: address === ousd ? 'OUSD' : 'pathUSD',
|
|
1287
|
+
symbol: address === ousd ? 'OUSD' : 'pathUSD',
|
|
1288
|
+
})),
|
|
1289
|
+
})
|
|
1290
|
+
const app = TestApp.create({
|
|
1291
|
+
auth: { keys },
|
|
1292
|
+
db,
|
|
1293
|
+
relay: {
|
|
1294
|
+
feePayer: {
|
|
1295
|
+
account: feePayerAccount,
|
|
1296
|
+
resolveFeeToken: ({ chainId }) => {
|
|
1297
|
+
expect(chainId).toBe(Viem.chainId.mainnet)
|
|
1298
|
+
return ousd
|
|
1299
|
+
},
|
|
1300
|
+
},
|
|
1301
|
+
},
|
|
1302
|
+
supportedChainIds: [Viem.chainId.mainnet],
|
|
1303
|
+
})
|
|
1304
|
+
|
|
1305
|
+
for (const [nonce, { orgId, token }] of [
|
|
1306
|
+
{ orgId: 'org_1', token: 'secret_sponsor_prod' },
|
|
1307
|
+
{ orgId: 'org_2', token: 'secret_wildcard_prod' },
|
|
1308
|
+
{ orgId: 'org_1', token: 'secret_sponsor_prod' },
|
|
1309
|
+
].entries()) {
|
|
1310
|
+
const body = await relayRequest(app, {
|
|
1311
|
+
method: 'eth_signRawTransaction',
|
|
1312
|
+
params: [await signSponsorable({ chainId: Viem.chainId.mainnet, nonce })],
|
|
1313
|
+
token,
|
|
1314
|
+
})
|
|
1315
|
+
expect(body.error).toBeUndefined()
|
|
1316
|
+
const signed = Transaction.deserialize(body.result as `0x76${string}`)
|
|
1317
|
+
expect(signed.feeToken?.toString().toLowerCase()).toBe(ousd.toLowerCase())
|
|
1318
|
+
const row = (await SponsoredTransactions.listPending(db)).find(
|
|
1319
|
+
(row) => row.transactionHash === Hash.keccak256(body.result!),
|
|
1320
|
+
)
|
|
1321
|
+
expect(row?.orgId).toBe(orgId)
|
|
1322
|
+
expect(row?.feeToken?.toLowerCase()).toBe(ousd.toLowerCase())
|
|
1323
|
+
}
|
|
1324
|
+
})
|
|
1325
|
+
|
|
1242
1326
|
/** Configures one attributed project for Tempo-funded sponsorship. */
|
|
1243
1327
|
async function configureSubsidy(db: ReturnType<typeof TestApp.database>) {
|
|
1244
1328
|
await Organizations.create(db, { id: 'org_1', name: 'Privy' })
|
package/src/apps/relay/App.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Hono } from 'hono'
|
|
|
2
2
|
import { createMiddleware } from 'hono/factory'
|
|
3
3
|
import { Hash, Hex, RpcResponse } from 'ox'
|
|
4
4
|
import { ZoneRpcAuthentication } from 'ox/tempo'
|
|
5
|
+
import type { Address } from 'viem'
|
|
5
6
|
import { Addresses, TokenId, Transaction } from 'viem/tempo'
|
|
6
7
|
|
|
7
8
|
import type * as App from '../../App.js'
|
|
@@ -75,10 +76,19 @@ export declare namespace relay {
|
|
|
75
76
|
NonNullable<Handler.relay.Options['feePayer']>,
|
|
76
77
|
'account' | 'feeToken' | 'name' | 'url'
|
|
77
78
|
> & {
|
|
79
|
+
/** Resolves the sponsor's fee token using the transaction chain. */
|
|
80
|
+
resolveFeeToken?:
|
|
81
|
+
| ((options: {
|
|
82
|
+
/** Transaction chain id. */
|
|
83
|
+
chainId: number
|
|
84
|
+
}) => Address | undefined)
|
|
85
|
+
| undefined
|
|
78
86
|
/** Per-transaction fee cap (decimal USD string); orgs tighten it, never loosen. @default '1.00' */
|
|
79
87
|
txFeeLimit?: string | undefined
|
|
80
88
|
})
|
|
81
89
|
| undefined
|
|
90
|
+
/** Native multisig coordination backed by authoritative atomic storage. */
|
|
91
|
+
multisig?: Handler.relay.Options['multisig'] | undefined
|
|
82
92
|
}
|
|
83
93
|
}
|
|
84
94
|
|
|
@@ -151,11 +161,18 @@ function middleware(options: middleware.Options) {
|
|
|
151
161
|
principal?.type === 'api_key' &&
|
|
152
162
|
(principal.apiKey.scopes.includes('rpc-relay:sponsor') ||
|
|
153
163
|
principal.apiKey.scopes.includes(Scope.wildcard))
|
|
154
|
-
//
|
|
155
|
-
|
|
164
|
+
// Resolve against the transaction chain because one app serves mainnet,
|
|
165
|
+
// testnet, and hosted Zones concurrently.
|
|
166
|
+
const feeToken_sponsor = (chainId: number) => {
|
|
167
|
+
return (
|
|
168
|
+
options.feePayer?.resolveFeeToken?.({ chainId }) ??
|
|
169
|
+
options.feePayer?.feeToken ??
|
|
170
|
+
Addresses.pathUsd
|
|
171
|
+
)
|
|
172
|
+
}
|
|
156
173
|
return {
|
|
157
174
|
...options.feePayer,
|
|
158
|
-
|
|
175
|
+
resolveFeeToken: feeToken_sponsor,
|
|
159
176
|
validate: async (transaction) => {
|
|
160
177
|
// Allowlist the chains this deployment serves rather than denylisting
|
|
161
178
|
// only mainnet: the relay resolves chainId from the request body, so
|
|
@@ -230,7 +247,7 @@ function middleware(options: middleware.Options) {
|
|
|
230
247
|
}
|
|
231
248
|
const feeToken = (() => {
|
|
232
249
|
try {
|
|
233
|
-
return TokenId.toAddress(transaction.feeToken ?? feeToken_sponsor)
|
|
250
|
+
return TokenId.toAddress(transaction.feeToken ?? feeToken_sponsor(id))
|
|
234
251
|
} catch {
|
|
235
252
|
return undefined
|
|
236
253
|
}
|
|
@@ -388,6 +405,12 @@ function middleware(options: middleware.Options) {
|
|
|
388
405
|
: await SponsoredTransactions.reserve(db, input, billingLimit)
|
|
389
406
|
return { subsidized: !record.billable }
|
|
390
407
|
} catch (error) {
|
|
408
|
+
if (error instanceof SponsoredTransactions.OrganizationDeletedError)
|
|
409
|
+
rejectSponsorship({
|
|
410
|
+
chainId: event.chainId,
|
|
411
|
+
message: 'Organization no longer exists.',
|
|
412
|
+
reason: 'billing_required',
|
|
413
|
+
})
|
|
391
414
|
if (error instanceof SponsoredTransactions.AttributionConflictError)
|
|
392
415
|
rejectSponsorship({
|
|
393
416
|
chainId: event.chainId,
|
|
@@ -466,6 +489,7 @@ function middleware(options: middleware.Options) {
|
|
|
466
489
|
cache: c.get('store'),
|
|
467
490
|
...(options.features ? { features: options.features } : {}),
|
|
468
491
|
getClient,
|
|
492
|
+
...(options.multisig ? { multisig: options.multisig } : {}),
|
|
469
493
|
onRequest: async (request) => {
|
|
470
494
|
const method = sponsorshipMethod(request.method)
|
|
471
495
|
const params = 'params' in request && Array.isArray(request.params) ? request.params : []
|
|
@@ -339,6 +339,29 @@ describe('reconcile', () => {
|
|
|
339
339
|
await db.close()
|
|
340
340
|
})
|
|
341
341
|
|
|
342
|
+
test('behavior: replaces an unresolved recorded hash by sign payload', async () => {
|
|
343
|
+
const db = create()
|
|
344
|
+
await db.migrate()
|
|
345
|
+
const sponsorship = await SponsoredTransactions.upsert(db, {
|
|
346
|
+
...input,
|
|
347
|
+
signPayload,
|
|
348
|
+
transactionHash: `0x${'cc'.repeat(32)}`,
|
|
349
|
+
})
|
|
350
|
+
|
|
351
|
+
const result = await Sponsorships.reconcile(db, {
|
|
352
|
+
feePayer: '0xFee0000000000000000000000000000000000000',
|
|
353
|
+
getClient: () => rpc,
|
|
354
|
+
getTidx: () => tidx([{ from: sender, hash: minedHash }]),
|
|
355
|
+
})
|
|
356
|
+
|
|
357
|
+
expect(result).toMatchObject({ matched: 1 })
|
|
358
|
+
expect(await SponsoredTransactions.get(db, sponsorship.id)).toMatchObject({
|
|
359
|
+
status: 'pending',
|
|
360
|
+
transactionHash: minedHash,
|
|
361
|
+
})
|
|
362
|
+
await db.close()
|
|
363
|
+
})
|
|
364
|
+
|
|
342
365
|
test('behavior: recovers recently failed intents by sign payload', async () => {
|
|
343
366
|
const db = create()
|
|
344
367
|
await db.migrate()
|
|
@@ -373,6 +396,44 @@ describe('reconcile', () => {
|
|
|
373
396
|
await db.close()
|
|
374
397
|
})
|
|
375
398
|
|
|
399
|
+
test('behavior: recovers a failed recorded hash by sign payload without duplicating spend', async () => {
|
|
400
|
+
const db = create()
|
|
401
|
+
await db.migrate()
|
|
402
|
+
await Organizations.create(db, { id: 'org_1', name: 'One' })
|
|
403
|
+
const recordedHash = `0x${'cc'.repeat(32)}`
|
|
404
|
+
const sponsorship = await SponsoredTransactions.upsert(db, {
|
|
405
|
+
...input,
|
|
406
|
+
signPayload,
|
|
407
|
+
transactionHash: recordedHash,
|
|
408
|
+
})
|
|
409
|
+
await SponsoredTransactions.fail(db, sponsorship.id, '2026-01-01T00:00:00.000Z')
|
|
410
|
+
|
|
411
|
+
vi.useFakeTimers({ now: new Date('2026-01-01T00:01:00.000Z') })
|
|
412
|
+
try {
|
|
413
|
+
const options = {
|
|
414
|
+
feePayer: '0xFee0000000000000000000000000000000000000' as const,
|
|
415
|
+
getClient: () => rpc,
|
|
416
|
+
getTidx: () => tidx([{ block_num: 1, from: sender, hash: minedHash, idx: 0 }]),
|
|
417
|
+
}
|
|
418
|
+
expect(await Sponsorships.reconcile(db, options)).toMatchObject({ matched: 1 })
|
|
419
|
+
expect(
|
|
420
|
+
await Sponsorships.finalize(db, {
|
|
421
|
+
getClient: () => client({ [minedHash]: { effectiveGasPrice: '0x3', gasUsed: '0x5208' } }),
|
|
422
|
+
}),
|
|
423
|
+
).toMatchObject({ finalized: 1 })
|
|
424
|
+
expect(await Sponsorships.reconcile(db, options)).toMatchObject({ matched: 0 })
|
|
425
|
+
} finally {
|
|
426
|
+
vi.useRealTimers()
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
expect(await SponsoredTransactions.get(db, sponsorship.id)).toMatchObject({
|
|
430
|
+
status: 'finalized',
|
|
431
|
+
transactionHash: minedHash,
|
|
432
|
+
})
|
|
433
|
+
expect(await SponsoredTransactions.list(db, { limit: 10 })).toHaveLength(1)
|
|
434
|
+
await db.close()
|
|
435
|
+
})
|
|
436
|
+
|
|
376
437
|
test('behavior: spend-limit refusals are not operational errors', async () => {
|
|
377
438
|
const db = create()
|
|
378
439
|
await db.migrate()
|
|
@@ -460,6 +521,41 @@ describe('reconcile', () => {
|
|
|
460
521
|
await db.close()
|
|
461
522
|
})
|
|
462
523
|
|
|
524
|
+
test('behavior: scans fill intents and submitted hashes from independent windows', async () => {
|
|
525
|
+
const db = create()
|
|
526
|
+
await db.migrate()
|
|
527
|
+
vi.useFakeTimers({ now: new Date('2026-01-01T00:00:00.000Z') })
|
|
528
|
+
try {
|
|
529
|
+
await SponsoredTransactions.upsert(db, {
|
|
530
|
+
...input,
|
|
531
|
+
signPayload: `0x${'ee'.repeat(32)}`,
|
|
532
|
+
})
|
|
533
|
+
vi.setSystemTime(new Date('2026-01-01T01:00:00.000Z'))
|
|
534
|
+
const { transactionHash: _, ...intent } = input
|
|
535
|
+
await SponsoredTransactions.upsert(db, { ...intent, signPayload })
|
|
536
|
+
const queries: string[] = []
|
|
537
|
+
|
|
538
|
+
await Sponsorships.reconcile(db, {
|
|
539
|
+
feePayer: '0xFee0000000000000000000000000000000000000',
|
|
540
|
+
getClient: () => rpc,
|
|
541
|
+
getTidx: () =>
|
|
542
|
+
({
|
|
543
|
+
fetch: async (options: { query: string }) => {
|
|
544
|
+
queries.push(options.query)
|
|
545
|
+
return { rows: [] }
|
|
546
|
+
},
|
|
547
|
+
}) as never,
|
|
548
|
+
})
|
|
549
|
+
|
|
550
|
+
expect(queries).toHaveLength(2)
|
|
551
|
+
expect(queries[0]).toContain("block_timestamp >= '2026-01-01 00:58:00'")
|
|
552
|
+
expect(queries[1]).toContain("block_timestamp >= '2025-12-31 23:58:00'")
|
|
553
|
+
} finally {
|
|
554
|
+
vi.useRealTimers()
|
|
555
|
+
await db.close()
|
|
556
|
+
}
|
|
557
|
+
})
|
|
558
|
+
|
|
463
559
|
test('behavior: an indexer error leaves intents for the next pass', async () => {
|
|
464
560
|
const db = create()
|
|
465
561
|
await db.migrate()
|
|
@@ -483,7 +579,7 @@ describe('reconcile', () => {
|
|
|
483
579
|
"scanned": 0,
|
|
484
580
|
}
|
|
485
581
|
`)
|
|
486
|
-
expect(await SponsoredTransactions.
|
|
582
|
+
expect(await SponsoredTransactions.listReconciliationCandidates(db)).toHaveLength(1)
|
|
487
583
|
await db.close()
|
|
488
584
|
})
|
|
489
585
|
})
|
|
@@ -53,7 +53,9 @@ export async function finalize(db: Db.Db, options: finalize.Options): Promise<fi
|
|
|
53
53
|
// here only the TTL can settle them.
|
|
54
54
|
if (row.transactionHash === null) {
|
|
55
55
|
if (Date.parse(row.createdAt) + pendingTtlMs <= now().getTime()) {
|
|
56
|
-
await SponsoredTransactions.fail(db, row.id, now().toISOString()
|
|
56
|
+
await SponsoredTransactions.fail(db, row.id, now().toISOString(), {
|
|
57
|
+
transactionHash: row.transactionHash,
|
|
58
|
+
})
|
|
57
59
|
result.failed++
|
|
58
60
|
} else result.pending++
|
|
59
61
|
continue
|
|
@@ -70,7 +72,9 @@ export async function finalize(db: Db.Db, options: finalize.Options): Promise<fi
|
|
|
70
72
|
else {
|
|
71
73
|
result.errors++
|
|
72
74
|
if (Date.parse(row.createdAt) + receiptErrorTtlMs <= now().getTime()) {
|
|
73
|
-
await SponsoredTransactions.fail(db, row.id, now().toISOString()
|
|
75
|
+
await SponsoredTransactions.fail(db, row.id, now().toISOString(), {
|
|
76
|
+
transactionHash: row.transactionHash,
|
|
77
|
+
})
|
|
74
78
|
result.failed++
|
|
75
79
|
} else result.pending++
|
|
76
80
|
continue
|
|
@@ -83,10 +87,13 @@ export async function finalize(db: Db.Db, options: finalize.Options): Promise<fi
|
|
|
83
87
|
await SponsoredTransactions.finalize(db, row.id, {
|
|
84
88
|
feeAmount: feeAmount.toString(),
|
|
85
89
|
finalizedAt: now().toISOString(),
|
|
90
|
+
transactionHash: row.transactionHash,
|
|
86
91
|
})
|
|
87
92
|
result.finalized++
|
|
88
93
|
} else if (Date.parse(row.createdAt) + pendingTtlMs <= now().getTime()) {
|
|
89
|
-
await SponsoredTransactions.fail(db, row.id, now().toISOString()
|
|
94
|
+
await SponsoredTransactions.fail(db, row.id, now().toISOString(), {
|
|
95
|
+
transactionHash: row.transactionHash,
|
|
96
|
+
})
|
|
90
97
|
result.failed++
|
|
91
98
|
} else result.pending++
|
|
92
99
|
}
|
|
@@ -123,11 +130,9 @@ export declare namespace finalize {
|
|
|
123
130
|
}
|
|
124
131
|
|
|
125
132
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* matching intents' hashes so the receipt pass can finalize them. Query or
|
|
130
|
-
* candidate errors leave intents for the next pass.
|
|
133
|
+
* Reconciles pending fill intents and recently failed sponsorships against
|
|
134
|
+
* on-chain fee-payer sign payloads. Matches update their transaction hashes;
|
|
135
|
+
* errors leave sponsorships for the next pass.
|
|
131
136
|
*
|
|
132
137
|
* @param db - The database holding `sponsored_transactions`.
|
|
133
138
|
* @param options - Reconciliation options.
|
|
@@ -147,74 +152,80 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
|
|
|
147
152
|
const failedSince = new Date(Date.now() - failedIntentTtlMs).toISOString()
|
|
148
153
|
// Old failed intents must not move the active scan behind its candidate cap.
|
|
149
154
|
const [intents, recoveryWindows] = await Promise.all([
|
|
150
|
-
SponsoredTransactions.
|
|
155
|
+
SponsoredTransactions.listReconciliationCandidates(db, { limit: batchSize }),
|
|
151
156
|
SponsoredTransactions.listRecoveryWindows(db, { failedSince }),
|
|
152
157
|
])
|
|
153
158
|
const result = { errors: 0, matched: 0, scanned: 0 }
|
|
154
159
|
if (intents.length === 0 && recoveryWindows.length === 0) return result
|
|
155
160
|
|
|
156
|
-
const groups =
|
|
157
|
-
|
|
158
|
-
|
|
161
|
+
const groups = [
|
|
162
|
+
new Map<number, SponsoredTransactions.Record[]>(),
|
|
163
|
+
new Map<number, SponsoredTransactions.Record[]>(),
|
|
164
|
+
]
|
|
165
|
+
for (const intent of intents) {
|
|
166
|
+
const group = groups[intent.transactionHash === null ? 0 : 1]!
|
|
167
|
+
group.set(intent.chainId, [...(group.get(intent.chainId) ?? []), intent])
|
|
168
|
+
}
|
|
159
169
|
|
|
160
|
-
for (const
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
170
|
+
for (const group of groups)
|
|
171
|
+
for (const [chainId, rows] of group) {
|
|
172
|
+
if (candidateCap <= 0) continue
|
|
173
|
+
const bySignPayload = new Map(rows.map((row) => [row.signPayload, row]))
|
|
174
|
+
const since = formatTidxTimestamp(
|
|
175
|
+
Math.min(...rows.map((row) => Date.parse(row.createdAt))) - skewMs,
|
|
176
|
+
)
|
|
166
177
|
|
|
167
|
-
|
|
168
|
-
try {
|
|
169
|
-
// Dynamic filter values; the tidx client's query type wants literals.
|
|
170
|
-
const fetched = await getTidx(chainId).fetch({
|
|
171
|
-
chainId,
|
|
172
|
-
query:
|
|
173
|
-
`SELECT hash, "from" FROM txs WHERE fee_payer = '${feePayer.toLowerCase()}' AND block_timestamp >= '${since}' ORDER BY block_timestamp ASC LIMIT ${candidateCap}` as string,
|
|
174
|
-
})
|
|
175
|
-
candidates = fetched.rows
|
|
176
|
-
} catch {
|
|
177
|
-
// Indexer outage must not fail intents; retry on the next pass.
|
|
178
|
-
result.errors++
|
|
179
|
-
continue
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
for (const candidate of candidates) {
|
|
183
|
-
if (bySignPayload.size === 0) break
|
|
184
|
-
const hash = candidate['hash'] as Hex.Hex | undefined
|
|
185
|
-
const sender = candidate['from'] as Address | undefined
|
|
186
|
-
if (!hash || !sender) continue
|
|
187
|
-
result.scanned++
|
|
178
|
+
let candidates: readonly globalThis.Record<string, unknown>[]
|
|
188
179
|
try {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
180
|
+
// Dynamic filter values; the tidx client's query type wants literals.
|
|
181
|
+
const fetched = await getTidx(chainId).fetch({
|
|
182
|
+
chainId,
|
|
183
|
+
query:
|
|
184
|
+
`SELECT hash, "from" FROM txs WHERE fee_payer = '${feePayer.toLowerCase()}' AND block_timestamp >= '${since}' ORDER BY block_timestamp ASC LIMIT ${candidateCap}` as string,
|
|
185
|
+
})
|
|
186
|
+
candidates = fetched.rows
|
|
187
|
+
} catch {
|
|
188
|
+
// Indexer outage must not fail sponsorships; retry on the next pass.
|
|
189
|
+
result.errors++
|
|
190
|
+
continue
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
for (const candidate of candidates) {
|
|
194
|
+
if (bySignPayload.size === 0) break
|
|
195
|
+
const hash = candidate['hash'] as Hex.Hex | undefined
|
|
196
|
+
const sender = candidate['from'] as Address | undefined
|
|
197
|
+
if (!hash || !sender) continue
|
|
198
|
+
result.scanned++
|
|
199
|
+
try {
|
|
200
|
+
const serialized = await getRawTransaction(getClient(chainId), hash)
|
|
201
|
+
if (!serialized) {
|
|
202
|
+
result.errors++
|
|
203
|
+
continue
|
|
204
|
+
}
|
|
205
|
+
if (!serialized.startsWith(TxEnvelopeTempo.serializedType)) continue
|
|
206
|
+
const signPayload = TxEnvelopeTempo.getFeePayerSignPayload(
|
|
207
|
+
TxEnvelopeTempo.deserialize(serialized as TxEnvelopeTempo.Serialized),
|
|
208
|
+
{ sender },
|
|
209
|
+
)
|
|
210
|
+
const intent = bySignPayload.get(signPayload)
|
|
211
|
+
if (!intent) continue
|
|
212
|
+
await SponsoredTransactions.assignTransactionHash(
|
|
213
|
+
db,
|
|
214
|
+
intent.id,
|
|
215
|
+
hash,
|
|
216
|
+
await options.limitFor?.(intent),
|
|
217
|
+
)
|
|
218
|
+
bySignPayload.delete(signPayload)
|
|
219
|
+
result.matched++
|
|
220
|
+
} catch (error) {
|
|
221
|
+
// Spend-limit enforcement is an expected policy refusal; dependency,
|
|
222
|
+
// lookup, and malformed-envelope failures remain operational errors.
|
|
223
|
+
if (!(error instanceof SponsoredTransactions.PeriodSpendLimitError)) result.errors++
|
|
193
224
|
}
|
|
194
|
-
if (!serialized.startsWith(TxEnvelopeTempo.serializedType)) continue
|
|
195
|
-
const signPayload = TxEnvelopeTempo.getFeePayerSignPayload(
|
|
196
|
-
TxEnvelopeTempo.deserialize(serialized as TxEnvelopeTempo.Serialized),
|
|
197
|
-
{ sender },
|
|
198
|
-
)
|
|
199
|
-
const intent = bySignPayload.get(signPayload)
|
|
200
|
-
if (!intent) continue
|
|
201
|
-
await SponsoredTransactions.assignTransactionHash(
|
|
202
|
-
db,
|
|
203
|
-
intent.id,
|
|
204
|
-
hash,
|
|
205
|
-
await options.limitFor?.(intent),
|
|
206
|
-
)
|
|
207
|
-
bySignPayload.delete(signPayload)
|
|
208
|
-
result.matched++
|
|
209
|
-
} catch (error) {
|
|
210
|
-
// Spend-limit enforcement is an expected policy refusal; dependency,
|
|
211
|
-
// lookup, and malformed-envelope failures remain operational errors.
|
|
212
|
-
if (!(error instanceof SponsoredTransactions.PeriodSpendLimitError)) result.errors++
|
|
213
225
|
}
|
|
226
|
+
// A truncated active scan cannot prove that the remaining sponsorships were never mined.
|
|
227
|
+
if (candidates.length === candidateCap && bySignPayload.size > 0) result.errors++
|
|
214
228
|
}
|
|
215
|
-
// A truncated active scan cannot prove that the remaining intents were never mined.
|
|
216
|
-
if (candidates.length === candidateCap && bySignPayload.size > 0) result.errors++
|
|
217
|
-
}
|
|
218
229
|
|
|
219
230
|
const feePayer_lower = feePayer.toLowerCase() as Address
|
|
220
231
|
for (const window of recoveryWindows) {
|
|
@@ -353,7 +364,7 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
|
|
|
353
364
|
export declare namespace reconcile {
|
|
354
365
|
/** Options for {@link reconcile}. */
|
|
355
366
|
type Options = {
|
|
356
|
-
/** Maximum
|
|
367
|
+
/** Maximum pending sponsorships per transaction-hash state considered per pass. @default 100 */
|
|
357
368
|
batchSize?: number | undefined
|
|
358
369
|
/** Maximum candidates per chain in each active or recovery scan. @default 500 */
|
|
359
370
|
candidateCap?: number | undefined
|