tapimo 0.14.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/dist/ApiKey.js +1 -1
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +95 -14
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +360 -49
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12466 -10374
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +300 -22
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +2 -1
- package/dist/Assets.js.map +1 -1
- package/dist/Handler.d.ts +0 -1
- package/dist/Handler.d.ts.map +1 -1
- package/dist/Handler.js +0 -1
- package/dist/Handler.js.map +1 -1
- package/dist/Scope.d.ts +13 -5
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +16 -5
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.js +1 -1
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +3057 -546
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +26 -5
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +179 -27
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +95 -43
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +1398 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +463 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +267 -15
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +241 -25
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/routes-support.d.ts +95 -0
- package/dist/admin/apps/routes-support.d.ts.map +1 -0
- package/dist/admin/apps/routes-support.js +151 -0
- package/dist/admin/apps/routes-support.js.map +1 -0
- package/dist/admin/apps/routes.d.ts +2764 -0
- package/dist/admin/apps/routes.d.ts.map +1 -0
- package/dist/admin/apps/routes.js +728 -0
- package/dist/admin/apps/routes.js.map +1 -0
- package/dist/admin/apps/subsidies.d.ts +501 -0
- package/dist/admin/apps/subsidies.d.ts.map +1 -0
- package/dist/admin/apps/subsidies.js +384 -0
- package/dist/admin/apps/subsidies.js.map +1 -0
- package/dist/admin/apps/verified-tokens.d.ts +166 -160
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +27 -7
- package/dist/admin/apps/verified-tokens.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 +201 -149
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +5 -2
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +31 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +2 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +10 -1
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/analytics/tables/routesLifecycleIntervals.d.ts +72 -0
- package/dist/analytics/tables/routesLifecycleIntervals.d.ts.map +1 -0
- package/dist/analytics/tables/routesLifecycleIntervals.js +56 -0
- package/dist/analytics/tables/routesLifecycleIntervals.js.map +1 -0
- package/dist/apps/Zones.d.ts +21 -12526
- package/dist/apps/Zones.d.ts.map +1 -1
- package/dist/apps/Zones.js +37 -5
- package/dist/apps/Zones.js.map +1 -1
- package/dist/apps/data/App.d.ts +3971 -2595
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +76 -21
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +629 -299
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +495 -190
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +72 -0
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +116 -116
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +47 -21
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +1450 -337
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +1226 -144
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +113 -108
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +41 -21
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +142 -17
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +83 -27
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +235 -235
- package/dist/apps/data/routes/rpc.d.ts +507 -33
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +309 -165
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +47 -15
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +68 -11
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +2 -0
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +26 -14
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +93 -77
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +9 -7
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +32 -32
- package/dist/apps/data/routes/verified-tokens.d.ts +88 -88
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +64 -20
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +614 -177
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +308 -205
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +31 -31
- package/dist/apps/data/routes/zones.d.ts.map +1 -1
- package/dist/apps/data/routes/zones.js +20 -12
- package/dist/apps/data/routes/zones.js.map +1 -1
- package/dist/apps/docs/reference.js +2 -2
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/index.d.ts +1 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +1 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +3780 -3402
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +5 -14
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +48 -7
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +204 -25
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +317 -215
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +43 -15
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +290 -4
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +274 -49
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +6 -6
- package/dist/apps/management/routes/faucet.js +1 -1
- package/dist/apps/management/routes/faucet.js.map +1 -1
- package/dist/apps/management/routes/invitations.d.ts +213 -138
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +117 -13
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +166 -166
- package/dist/apps/management/routes/me.d.ts.map +1 -1
- package/dist/apps/management/routes/me.js +6 -2
- package/dist/apps/management/routes/me.js.map +1 -1
- package/dist/apps/management/routes/members.d.ts +30 -30
- package/dist/apps/management/routes/orgs.d.ts +103 -87
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +52 -12
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +125 -125
- package/dist/apps/management/routes/projects.d.ts.map +1 -1
- package/dist/apps/management/routes/projects.js +6 -1
- package/dist/apps/management/routes/projects.js.map +1 -1
- package/dist/apps/management/routes/scopes.d.ts.map +1 -1
- package/dist/apps/management/routes/scopes.js +4 -1
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +24 -24
- package/dist/apps/management/routes/usage.js +21 -4
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +95 -95
- 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 +682 -616
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +58 -12
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mcp.d.ts +1 -1
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +23 -10
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +44 -44
- package/dist/apps/mpp/App.d.ts.map +1 -1
- package/dist/apps/mpp/App.js +35 -7
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +2 -0
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Adapter.js +30 -1
- package/dist/apps/mpp/internal/Adapter.js.map +1 -1
- package/dist/apps/mpp/internal/Policy.d.ts +22 -4
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +24 -6
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts +3 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -3
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +2 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +134 -75
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +5 -3
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +209 -28
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/{funding → routes}/Access.d.ts +4 -4
- package/dist/apps/routes/Access.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/Access.js +4 -4
- package/dist/apps/routes/Access.js.map +1 -0
- package/dist/apps/{funding → routes}/App.d.ts +418 -124
- package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
- package/dist/apps/{funding → routes}/App.js +16 -16
- package/dist/apps/routes/App.js.map +1 -0
- package/dist/apps/routes/Inventory.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/Inventory.js +2 -2
- package/dist/apps/routes/Inventory.js.map +1 -0
- package/dist/apps/routes/index.d.ts +2 -0
- package/dist/apps/routes/index.d.ts.map +1 -0
- package/dist/apps/routes/index.js +2 -0
- package/dist/apps/routes/index.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/chains.d.ts +32 -32
- package/dist/apps/routes/routes/chains.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/routes/chains.js +25 -25
- package/dist/apps/routes/routes/chains.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/deposit-addresses.d.ts +107 -43
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/routes/deposit-addresses.js +497 -222
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/providers.d.ts +8 -8
- package/dist/apps/routes/routes/providers.d.ts.map +1 -0
- package/dist/apps/routes/routes/providers.js +57 -0
- package/dist/apps/routes/routes/providers.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/quotes.d.ts +106 -103
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/routes/quotes.js +55 -38
- package/dist/apps/routes/routes/quotes.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/transfers.d.ts +733 -428
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -0
- package/dist/apps/routes/routes/transfers.js +1140 -0
- package/dist/apps/routes/routes/transfers.js.map +1 -0
- package/dist/cli/Cli.d.ts +30 -0
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/commands/admin.d.ts +36 -0
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/admin.js +273 -0
- package/dist/cli/commands/admin.js.map +1 -1
- package/dist/cloudflare.d.ts +16 -14
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +26 -21
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +63 -21
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +1035 -15
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +780 -133
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +575 -162
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts +4 -0
- package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts.map +1 -0
- package/dist/db/tables/apiKeyAdmissionBootstraps.js +2 -0
- package/dist/db/tables/apiKeyAdmissionBootstraps.js.map +1 -0
- package/dist/db/tables/apiKeyAdmissions.d.ts +73 -0
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -0
- package/dist/db/tables/apiKeyAdmissions.js +142 -0
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -0
- package/dist/db/tables/apiKeyOwnerAdmissions.d.ts +4 -0
- package/dist/db/tables/apiKeyOwnerAdmissions.d.ts.map +1 -0
- package/dist/db/tables/apiKeyOwnerAdmissions.js +2 -0
- package/dist/db/tables/apiKeyOwnerAdmissions.js.map +1 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +20 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -0
- package/dist/db/tables/apiKeyOwnerTombstones.js +57 -0
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -0
- package/dist/db/tables/apiKeyRevocations.d.ts +21 -0
- package/dist/db/tables/apiKeyRevocations.d.ts.map +1 -0
- package/dist/db/tables/apiKeyRevocations.js +98 -0
- package/dist/db/tables/apiKeyRevocations.js.map +1 -0
- package/dist/db/tables/authAccounts.d.ts +47 -0
- package/dist/db/tables/authAccounts.d.ts.map +1 -0
- package/dist/db/tables/authAccounts.js +72 -0
- package/dist/db/tables/authAccounts.js.map +1 -0
- package/dist/db/tables/authSessions.d.ts +12 -0
- package/dist/db/tables/authSessions.d.ts.map +1 -0
- package/dist/db/tables/authSessions.js +2 -0
- package/dist/db/tables/authSessions.js.map +1 -0
- package/dist/db/tables/authVerifications.d.ts +12 -0
- package/dist/db/tables/authVerifications.d.ts.map +1 -0
- package/dist/db/tables/authVerifications.js +2 -0
- package/dist/db/tables/authVerifications.js.map +1 -0
- package/dist/db/tables/invitations.d.ts +17 -1
- package/dist/db/tables/invitations.d.ts.map +1 -1
- package/dist/db/tables/invitations.js +123 -43
- package/dist/db/tables/invitations.js.map +1 -1
- package/dist/db/tables/memberships.d.ts +8 -0
- package/dist/db/tables/memberships.d.ts.map +1 -1
- package/dist/db/tables/memberships.js +51 -2
- package/dist/db/tables/memberships.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +32 -10
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +110 -49
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +2 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +12 -3
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardAccounts.d.ts +86 -0
- package/dist/db/tables/rewardAccounts.d.ts.map +1 -0
- package/dist/db/tables/rewardAccounts.js +88 -0
- package/dist/db/tables/rewardAccounts.js.map +1 -0
- package/dist/db/tables/rewardCampaignDistributors.d.ts +36 -0
- package/dist/db/tables/rewardCampaignDistributors.d.ts.map +1 -0
- package/dist/db/tables/rewardCampaignDistributors.js +30 -0
- package/dist/db/tables/rewardCampaignDistributors.js.map +1 -0
- package/dist/db/tables/rewardCampaigns.d.ts +171 -0
- package/dist/db/tables/rewardCampaigns.d.ts.map +1 -0
- package/dist/db/tables/rewardCampaigns.js +392 -0
- package/dist/db/tables/rewardCampaigns.js.map +1 -0
- package/dist/db/tables/rewardCredits.d.ts +53 -0
- package/dist/db/tables/rewardCredits.d.ts.map +1 -0
- package/dist/db/tables/rewardCredits.js +63 -0
- package/dist/db/tables/rewardCredits.js.map +1 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +61 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -0
- package/dist/db/tables/rewardEligibilityAssociations.js +103 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -0
- package/dist/db/tables/rewardRuns.d.ts +188 -0
- package/dist/db/tables/rewardRuns.d.ts.map +1 -0
- package/dist/db/tables/rewardRuns.js +278 -0
- package/dist/db/tables/rewardRuns.js.map +1 -0
- package/dist/db/tables/rewardTransactionAttempts.d.ts +100 -0
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -0
- package/dist/db/tables/rewardTransactionAttempts.js +163 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -0
- package/dist/db/tables/routesCatalog.d.ts +58 -0
- package/dist/db/tables/routesCatalog.d.ts.map +1 -0
- package/dist/db/tables/{fundingCatalog.js → routesCatalog.js} +19 -19
- package/dist/db/tables/routesCatalog.js.map +1 -0
- package/dist/db/tables/routesDepositAddresses.d.ts +476 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/routesDepositAddresses.js +587 -0
- package/dist/db/tables/routesDepositAddresses.js.map +1 -0
- package/dist/db/tables/{fundingDepositRequestObservations.d.ts → routesDepositRequestObservations.d.ts} +6 -6
- package/dist/db/tables/routesDepositRequestObservations.d.ts.map +1 -0
- package/dist/db/tables/{fundingDepositRequestObservations.js → routesDepositRequestObservations.js} +6 -6
- package/dist/db/tables/routesDepositRequestObservations.js.map +1 -0
- package/dist/db/tables/{fundingDeposits.d.ts → routesDeposits.d.ts} +210 -22
- package/dist/db/tables/routesDeposits.d.ts.map +1 -0
- package/dist/db/tables/routesDeposits.js +576 -0
- package/dist/db/tables/routesDeposits.js.map +1 -0
- package/dist/db/tables/routesIdempotency.d.ts +166 -0
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -0
- package/dist/db/tables/routesIdempotency.js +330 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -0
- package/dist/db/tables/routesSubsidies.d.ts +27 -0
- package/dist/db/tables/routesSubsidies.d.ts.map +1 -0
- package/dist/db/tables/routesSubsidies.js +45 -0
- package/dist/db/tables/routesSubsidies.js.map +1 -0
- package/dist/db/tables/{fundingTransferEvents.d.ts → routesTransferEvents.d.ts} +3 -3
- package/dist/db/tables/routesTransferEvents.d.ts.map +1 -0
- package/dist/db/tables/{fundingTransferEvents.js → routesTransferEvents.js} +3 -3
- package/dist/db/tables/routesTransferEvents.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +19 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.js +17 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts +51 -0
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -0
- package/dist/db/tables/routesTransferSubsidyNonces.js +82 -0
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -0
- package/dist/db/tables/routesTransferTransactions.d.ts +77 -0
- package/dist/db/tables/routesTransferTransactions.d.ts.map +1 -0
- package/dist/db/tables/{fundingTransferTransactions.js → routesTransferTransactions.js} +31 -13
- package/dist/db/tables/routesTransferTransactions.js.map +1 -0
- package/dist/db/tables/routesTransfers.d.ts +319 -0
- package/dist/db/tables/routesTransfers.d.ts.map +1 -0
- package/dist/db/tables/routesTransfers.js +372 -0
- package/dist/db/tables/routesTransfers.js.map +1 -0
- package/dist/db/tables/sponsoredTransactions.d.ts +75 -20
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +124 -54
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/sponsorshipAttributions.d.ts +69 -0
- package/dist/db/tables/sponsorshipAttributions.d.ts.map +1 -0
- package/dist/db/tables/sponsorshipAttributions.js +77 -0
- package/dist/db/tables/sponsorshipAttributions.js.map +1 -0
- package/dist/db/tables/sponsorshipReconciliationCursors.d.ts +22 -0
- package/dist/db/tables/sponsorshipReconciliationCursors.d.ts.map +1 -0
- package/dist/db/tables/sponsorshipReconciliationCursors.js +45 -0
- package/dist/db/tables/sponsorshipReconciliationCursors.js.map +1 -0
- package/dist/db/tables/stripeCustomers.d.ts +11 -0
- package/dist/db/tables/stripeCustomers.d.ts.map +1 -1
- package/dist/db/tables/stripeCustomers.js +13 -0
- package/dist/db/tables/stripeCustomers.js.map +1 -1
- package/dist/db/tables/users.d.ts +17 -1
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +47 -2
- 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/db/tables/webhookQueueEvents.d.ts.map +1 -1
- package/dist/db/tables/webhookQueueEvents.js +5 -1
- package/dist/db/tables/webhookQueueEvents.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +19 -11
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +45 -13
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/internal/executionError.d.ts +2 -2
- package/dist/handlers/internal/executionError.d.ts.map +1 -1
- package/dist/handlers/internal/executionError.js +1 -2
- package/dist/handlers/internal/executionError.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +4 -232
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +11 -537
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/internal/sponsorship.d.ts +19 -8
- package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
- package/dist/handlers/internal/sponsorship.js +13 -9
- package/dist/handlers/internal/sponsorship.js.map +1 -1
- package/dist/handlers/relay.d.ts +9 -12
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +81 -85
- package/dist/handlers/relay.js.map +1 -1
- package/dist/index.d.ts +0 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -17
- package/dist/index.js.map +1 -1
- package/dist/internal/AssetResponse.d.ts +12 -0
- package/dist/internal/AssetResponse.d.ts.map +1 -0
- package/dist/internal/AssetResponse.js +21 -0
- package/dist/internal/AssetResponse.js.map +1 -0
- package/dist/internal/Auth.d.ts +64 -12
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +631 -180
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +1488 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -0
- package/dist/internal/BetterAuth.js +253 -0
- package/dist/internal/BetterAuth.js.map +1 -0
- package/dist/internal/Cache.d.ts +2 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +2 -0
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/EarnRates.d.ts +26 -3
- package/dist/internal/EarnRates.d.ts.map +1 -1
- package/dist/internal/EarnRates.js +84 -19
- package/dist/internal/EarnRates.js.map +1 -1
- package/dist/internal/EarnSharePrices.d.ts +120 -0
- package/dist/internal/EarnSharePrices.d.ts.map +1 -0
- package/dist/internal/EarnSharePrices.js +179 -0
- package/dist/internal/EarnSharePrices.js.map +1 -0
- package/dist/internal/EarnVaults.d.ts +4 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +27 -10
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/Email.d.ts +37 -0
- package/dist/internal/Email.d.ts.map +1 -0
- package/dist/internal/Email.js +16 -0
- package/dist/internal/Email.js.map +1 -0
- package/dist/internal/Log.d.ts +32 -28
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +18 -11
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts +3 -0
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +67 -8
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/Mpp.d.ts.map +1 -1
- package/dist/internal/Mpp.js +20 -25
- package/dist/internal/Mpp.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +26 -3
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +25 -10
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Provider.d.ts +1 -1
- package/dist/internal/Provider.d.ts.map +1 -1
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +13 -1
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +16 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +59 -8
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +9 -2
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +78 -11
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Timing.d.ts +26 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +63 -5
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/VercelOidc.d.ts +94 -0
- package/dist/internal/VercelOidc.d.ts.map +1 -0
- package/dist/internal/VercelOidc.js +128 -0
- package/dist/internal/VercelOidc.js.map +1 -0
- package/dist/internal/VerifiedTokens.d.ts +2 -8
- package/dist/internal/VerifiedTokens.d.ts.map +1 -1
- package/dist/internal/VerifiedTokens.js +24 -24
- package/dist/internal/VerifiedTokens.js.map +1 -1
- package/dist/internal/Viem.d.ts +30 -2067
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +167 -17
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +12 -4
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +9 -3
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/ZoneRpc.d.ts +7 -0
- package/dist/internal/ZoneRpc.d.ts.map +1 -0
- package/dist/internal/ZoneRpc.js +49 -0
- package/dist/internal/ZoneRpc.js.map +1 -0
- package/dist/internal/index.d.ts +3 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +3 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/rewards/Audit.d.ts +88 -0
- package/dist/internal/rewards/Audit.d.ts.map +1 -0
- package/dist/internal/rewards/Audit.js +134 -0
- package/dist/internal/rewards/Audit.js.map +1 -0
- package/dist/internal/rewards/Campaigns.d.ts +572 -0
- package/dist/internal/rewards/Campaigns.d.ts.map +1 -0
- package/dist/internal/rewards/Campaigns.js +531 -0
- package/dist/internal/rewards/Campaigns.js.map +1 -0
- package/dist/internal/rewards/Credits.d.ts +76 -0
- package/dist/internal/rewards/Credits.d.ts.map +1 -0
- package/dist/internal/rewards/Credits.js +95 -0
- package/dist/internal/rewards/Credits.js.map +1 -0
- package/dist/internal/rewards/Events.d.ts +100 -0
- package/dist/internal/rewards/Events.d.ts.map +1 -0
- package/dist/internal/rewards/Events.js +340 -0
- package/dist/internal/rewards/Events.js.map +1 -0
- package/dist/internal/rewards/Projection.d.ts +237 -0
- package/dist/internal/rewards/Projection.d.ts.map +1 -0
- package/dist/internal/rewards/Projection.js +616 -0
- package/dist/internal/rewards/Projection.js.map +1 -0
- package/dist/internal/rewards/Rates.d.ts +44 -0
- package/dist/internal/rewards/Rates.d.ts.map +1 -0
- package/dist/internal/rewards/Rates.js +60 -0
- package/dist/internal/rewards/Rates.js.map +1 -0
- package/dist/internal/rewards/Read.d.ts +158 -0
- package/dist/internal/rewards/Read.d.ts.map +1 -0
- package/dist/internal/rewards/Read.js +292 -0
- package/dist/internal/rewards/Read.js.map +1 -0
- package/dist/internal/rewards/Runner.d.ts +164 -0
- package/dist/internal/rewards/Runner.d.ts.map +1 -0
- package/dist/internal/rewards/Runner.js +1778 -0
- package/dist/internal/rewards/Runner.js.map +1 -0
- package/dist/internal/rewards/Signer.d.ts +224 -0
- package/dist/internal/rewards/Signer.d.ts.map +1 -0
- package/dist/internal/rewards/Signer.js +135 -0
- package/dist/internal/rewards/Signer.js.map +1 -0
- package/dist/internal/rewards/index.d.ts +15 -0
- package/dist/internal/rewards/index.d.ts.map +1 -0
- package/dist/internal/rewards/index.js +15 -0
- package/dist/internal/rewards/index.js.map +1 -0
- package/dist/internal/{funding → routes}/Action.d.ts +12 -1
- package/dist/internal/routes/Action.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Action.js +17 -9
- package/dist/internal/routes/Action.js.map +1 -0
- package/dist/internal/{funding → routes}/Catalog.d.ts +20 -20
- package/dist/internal/routes/Catalog.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Catalog.js +29 -29
- package/dist/internal/routes/Catalog.js.map +1 -0
- package/dist/internal/{funding → routes}/Chain.d.ts +10 -10
- package/dist/internal/routes/Chain.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Chain.js +3 -3
- package/dist/internal/routes/Chain.js.map +1 -0
- package/dist/internal/{funding → routes}/Deposit.d.ts +45 -23
- package/dist/internal/routes/Deposit.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Deposit.js +60 -27
- package/dist/internal/routes/Deposit.js.map +1 -0
- package/dist/internal/{funding → routes}/DepositAddress.d.ts +56 -27
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/DepositAddress.js +95 -33
- package/dist/internal/routes/DepositAddress.js.map +1 -0
- package/dist/internal/{funding → routes}/DepositWebhook.d.ts +4 -4
- package/dist/internal/routes/DepositWebhook.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/DepositWebhook.js +4 -4
- package/dist/internal/routes/DepositWebhook.js.map +1 -0
- package/dist/internal/routes/Economics.d.ts +25 -0
- package/dist/internal/routes/Economics.d.ts.map +1 -0
- package/dist/internal/routes/Economics.js +28 -0
- package/dist/internal/routes/Economics.js.map +1 -0
- package/dist/internal/{funding → routes}/Evidence.d.ts +3 -3
- package/dist/internal/routes/Evidence.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Evidence.js +7 -7
- package/dist/internal/routes/Evidence.js.map +1 -0
- package/dist/internal/routes/Observability.d.ts +154 -0
- package/dist/internal/routes/Observability.d.ts.map +1 -0
- package/dist/internal/routes/Observability.js +389 -0
- package/dist/internal/routes/Observability.js.map +1 -0
- package/dist/internal/{funding → routes}/Provider.d.ts +311 -105
- package/dist/internal/routes/Provider.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Provider.js +229 -98
- package/dist/internal/routes/Provider.js.map +1 -0
- package/dist/internal/{funding → routes}/Reconciliation.d.ts +11 -6
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Reconciliation.js +408 -158
- package/dist/internal/routes/Reconciliation.js.map +1 -0
- package/dist/internal/routes/Route.d.ts +21 -0
- package/dist/internal/routes/Route.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Route.js +1 -1
- package/dist/internal/routes/Route.js.map +1 -0
- package/dist/internal/{funding → routes}/SourceObservation.d.ts +6 -6
- package/dist/internal/routes/SourceObservation.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/SourceObservation.js +8 -8
- package/dist/internal/routes/SourceObservation.js.map +1 -0
- package/dist/internal/{funding → routes}/Subsidy.d.ts +48 -3
- package/dist/internal/routes/Subsidy.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Subsidy.js +43 -3
- package/dist/internal/routes/Subsidy.js.map +1 -0
- package/dist/internal/{funding → routes}/Token.d.ts +4 -4
- package/dist/internal/routes/Token.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Token.js +3 -3
- package/dist/internal/routes/Token.js.map +1 -0
- package/dist/internal/{funding → routes}/Transfer.d.ts +241 -46
- package/dist/internal/routes/Transfer.d.ts.map +1 -0
- package/dist/internal/routes/Transfer.js +728 -0
- package/dist/internal/routes/Transfer.js.map +1 -0
- package/dist/internal/{funding → routes}/TransferReconciliation.d.ts +13 -10
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -0
- package/dist/internal/routes/TransferReconciliation.js +422 -0
- package/dist/internal/routes/TransferReconciliation.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +201 -0
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TransferSubsidy.js +256 -0
- package/dist/internal/routes/TransferSubsidy.js.map +1 -0
- package/dist/internal/{funding → routes}/TransferWebhook.d.ts +5 -5
- package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/TransferWebhook.js +3 -3
- package/dist/internal/routes/TransferWebhook.js.map +1 -0
- package/dist/internal/{funding → routes}/index.d.ts +2 -0
- package/dist/internal/routes/index.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/index.js +2 -0
- package/dist/internal/routes/index.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/across.d.ts +4 -4
- package/dist/internal/routes/providers/across.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/across.js +13 -13
- package/dist/internal/routes/providers/across.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/relay.d.ts +21 -12
- package/dist/internal/routes/providers/relay.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/relay.js +194 -110
- package/dist/internal/routes/providers/relay.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/rhino.d.ts +4 -4
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/rhino.js +10 -10
- package/dist/internal/routes/providers/rhino.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/squid.d.ts +4 -4
- package/dist/internal/routes/providers/squid.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/squid.js +14 -14
- package/dist/internal/routes/providers/squid.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/stargate.d.ts +46 -18
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -0
- package/dist/internal/routes/providers/stargate.js +898 -0
- package/dist/internal/routes/providers/stargate.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/symbiosis.d.ts +4 -4
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/symbiosis.js +30 -20
- package/dist/internal/routes/providers/symbiosis.js.map +1 -0
- package/dist/internal/webhookDestinations/slack.js +12 -12
- package/dist/internal/webhookDestinations/slack.js.map +1 -1
- package/dist/providers/index.d.ts +12 -12
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +12 -12
- package/dist/providers/index.js.map +1 -1
- package/dist/server.d.ts +19 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +19 -0
- package/dist/server.js.map +1 -0
- package/package.json +15 -4
- package/src/ApiKey.ts +1 -1
- package/src/ApiKeys.test.ts +1033 -3
- package/src/ApiKeys.ts +489 -48
- package/src/App.test-d.ts +1 -1
- package/src/App.test.ts +216 -25
- package/src/App.ts +334 -31
- package/src/Assets.test.ts +2 -2
- package/src/Assets.ts +3 -1
- package/src/Auth.test-d.ts +1 -1
- package/src/Client.test-d.ts +539 -110
- package/src/Handler.ts +0 -1
- package/src/OpenApi.contract.test.ts +195 -0
- package/src/Scope.ts +17 -5
- package/src/Webhooks.ts +1 -1
- package/src/admin/App.test.ts +30 -2
- package/src/admin/App.ts +42 -6
- package/src/admin/apps/api-keys.test.ts +267 -5
- package/src/admin/apps/api-keys.ts +100 -50
- package/src/admin/apps/earn-vaults.test.ts +158 -0
- package/src/admin/apps/earn-vaults.ts +679 -6
- package/src/admin/apps/organizations.test.ts +306 -17
- package/src/admin/apps/organizations.ts +299 -24
- package/src/admin/apps/routes-support.test.ts +200 -0
- package/src/admin/apps/routes-support.ts +201 -0
- package/src/admin/apps/routes.test.ts +450 -0
- package/src/admin/apps/routes.ts +896 -0
- package/src/admin/apps/scopes.test.ts +15 -5
- package/src/admin/apps/subsidies.test.ts +306 -0
- package/src/admin/apps/subsidies.ts +457 -0
- package/src/admin/apps/verified-tokens.test.ts +40 -3
- package/src/admin/apps/verified-tokens.ts +33 -7
- package/src/admin/ui/plugin.ts +1 -2
- package/src/admin/ui/src/components/RewardCampaignForm.tsx +1009 -0
- package/src/admin/ui/src/lib/config.ts +11 -2
- package/src/admin/ui/src/lib/earn-vaults.ts +2 -2
- package/src/admin/ui/src/lib/organizations.test.ts +83 -50
- package/src/admin/ui/src/lib/organizations.ts +106 -25
- package/src/admin/ui/src/lib/query-client.ts +1 -1
- package/src/admin/ui/src/lib/reward-campaigns.ts +136 -0
- package/src/admin/ui/src/lib/routes.test.ts +88 -0
- package/src/admin/ui/src/lib/routes.ts +304 -0
- package/src/admin/ui/src/lib/subsidies.ts +75 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
- package/src/admin/ui/src/routeTree.gen.ts +63 -0
- package/src/admin/ui/src/routes/__root.tsx +13 -2
- package/src/admin/ui/src/routes/api-keys.tsx +196 -84
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +105 -70
- package/src/admin/ui/src/routes/organizations.tsx +34 -4
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +239 -23
- package/src/admin/ui/src/routes/routes.tsx +1615 -0
- package/src/admin/ui/src/routes/routes_.support.tsx +248 -0
- package/src/admin/ui/src/routes/subsidies.tsx +799 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +64 -20
- package/src/admin/ui.generated.ts +202 -188
- package/src/analytics/Analytics.test.ts +108 -18
- package/src/analytics/Analytics.ts +38 -6
- package/src/analytics/tables/requestEvents.test.ts +100 -0
- package/src/analytics/tables/requestEvents.ts +10 -1
- package/src/analytics/tables/routesLifecycleIntervals.ts +140 -0
- package/src/apps/Zones.test.ts +15 -0
- package/src/apps/Zones.ts +52 -5
- package/src/apps/composition.test.ts +68 -60
- package/src/apps/data/App.test.ts +180 -2
- package/src/apps/data/App.ts +88 -28
- package/src/apps/data/routes/activities.test.ts +419 -7
- package/src/apps/data/routes/activities.ts +683 -216
- package/src/apps/data/routes/balances.test.ts +2 -2
- package/src/apps/data/routes/blocks.test.ts +46 -1
- package/src/apps/data/routes/coingecko.test.ts +419 -1
- package/src/apps/data/routes/coingecko.ts +309 -253
- package/src/apps/data/routes/earn.discovery.test.ts +274 -0
- package/src/apps/data/routes/earn.test.ts +1294 -17
- package/src/apps/data/routes/earn.ts +1838 -321
- package/src/apps/data/routes/exchanges.test.ts +12 -15
- package/src/apps/data/routes/fee-amm.test.ts +243 -0
- package/src/apps/data/routes/fee-amm.ts +201 -162
- package/src/apps/data/routes/indexer.test.ts +389 -0
- package/src/apps/data/routes/indexer.ts +165 -69
- package/src/apps/data/routes/receipts.test.ts +1 -1
- package/src/apps/data/routes/rpc.test.ts +384 -8
- package/src/apps/data/routes/rpc.ts +452 -227
- package/src/apps/data/routes/rpc.zone.test.ts +340 -0
- package/src/apps/data/routes/tokenlist.test.ts +285 -0
- package/src/apps/data/routes/tokenlist.ts +173 -88
- package/src/apps/data/routes/tokens.test.ts +93 -3
- package/src/apps/data/routes/tokens.ts +39 -23
- package/src/apps/data/routes/transactions.test.ts +1 -1
- package/src/apps/data/routes/transfers.test.ts +56 -24
- package/src/apps/data/routes/transfers.ts +19 -8
- package/src/apps/data/routes/valuation.test.ts +1 -1
- package/src/apps/data/routes/verified-tokens.test.ts +345 -0
- package/src/apps/data/routes/verified-tokens.ts +99 -29
- package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
- package/src/apps/data/routes/webhooks.test.ts +651 -83
- package/src/apps/data/routes/webhooks.ts +1113 -868
- package/src/apps/data/routes/zones.test.ts +148 -71
- package/src/apps/data/routes/zones.ts +71 -55
- package/src/apps/docs/reference.ts +2 -2
- package/src/apps/index.ts +1 -1
- package/src/apps/management/App.ts +9 -51
- package/src/apps/management/Billing.test.ts +375 -14
- package/src/apps/management/Billing.ts +265 -29
- package/src/apps/management/routes/api-keys.test.ts +269 -7
- package/src/apps/management/routes/api-keys.ts +61 -20
- package/src/apps/management/routes/billing.test.ts +477 -15
- package/src/apps/management/routes/billing.ts +377 -50
- package/src/apps/management/routes/faucet.test.ts +1 -1
- package/src/apps/management/routes/faucet.ts +1 -1
- package/src/apps/management/routes/invitations.test.ts +270 -3
- package/src/apps/management/routes/invitations.ts +185 -15
- package/src/apps/management/routes/invoicePreview.test.ts +549 -0
- package/src/apps/management/routes/me.test.ts +246 -5
- package/src/apps/management/routes/me.ts +7 -2
- package/src/apps/management/routes/members.test.ts +108 -0
- package/src/apps/management/routes/orgs.test.ts +191 -3
- package/src/apps/management/routes/orgs.ts +58 -11
- package/src/apps/management/routes/projects.test.ts +33 -3
- package/src/apps/management/routes/projects.ts +6 -1
- package/src/apps/management/routes/scopes.test.ts +30 -2
- package/src/apps/management/routes/scopes.ts +4 -1
- package/src/apps/management/routes/usage.test.ts +32 -0
- package/src/apps/management/routes/usage.ts +22 -4
- 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/management/routes/webhooks.test.ts +49 -26
- package/src/apps/management/routes/webhooks.ts +78 -22
- package/src/apps/mcp.test.ts +113 -30
- package/src/apps/mcp.ts +22 -10
- package/src/apps/mpp/App.ts +37 -7
- package/src/apps/mpp/Mpp.test.ts +49 -8
- package/src/apps/mpp/Mpp.zone.test.ts +219 -0
- package/src/apps/mpp/internal/Adapter.ts +34 -0
- package/src/apps/mpp/internal/Policy.test.ts +86 -31
- package/src/apps/mpp/internal/Policy.ts +49 -7
- package/src/apps/mpp/internal/Sponsorship.test.ts +207 -0
- package/src/apps/mpp/internal/Sponsorship.ts +9 -3
- package/src/apps/relay/App.test.ts +839 -64
- package/src/apps/relay/App.ts +148 -81
- package/src/apps/relay/App.zone-billing.test.ts +257 -0
- package/src/apps/relay/Sponsorships.test.ts +67 -4
- package/src/apps/relay/Sponsorships.ts +233 -32
- package/src/apps/relay/Sponsorships.zone.test.ts +102 -0
- package/src/apps/{funding → routes}/Access.ts +6 -6
- package/src/apps/routes/App.test.ts +165 -0
- package/src/apps/routes/App.ts +96 -0
- package/src/apps/{funding → routes}/Inventory.ts +2 -2
- package/src/apps/routes/index.ts +1 -0
- package/src/apps/{funding → routes}/routes/chains.test.ts +66 -66
- package/src/apps/{funding → routes}/routes/chains.ts +23 -23
- package/src/apps/{funding → routes}/routes/deposit-addresses.test.ts +1358 -458
- package/src/apps/{funding → routes}/routes/deposit-addresses.ts +566 -246
- package/src/apps/{funding → routes}/routes/providers.test.ts +27 -33
- package/src/apps/{funding → routes}/routes/providers.ts +23 -23
- package/src/apps/{funding → routes}/routes/quotes.test.ts +298 -41
- package/src/apps/{funding → routes}/routes/quotes.ts +57 -40
- package/src/apps/{funding → routes}/routes/transfers.test.ts +1100 -353
- package/src/apps/routes/routes/transfers.ts +1332 -0
- package/src/cli/Cli.test.ts +1 -1
- package/src/cli/commands/admin.test.ts +748 -1
- package/src/cli/commands/admin.ts +278 -0
- package/src/cloudflare.ts +52 -47
- package/src/db/Db.test.ts +245 -2
- package/src/db/Db.ts +1485 -34
- package/src/db/Schema.ts +729 -228
- package/src/db/tables/apiKeyAdmissionBootstraps.ts +4 -0
- package/src/db/tables/apiKeyAdmissions.ts +218 -0
- package/src/db/tables/apiKeyOwnerAdmissions.ts +4 -0
- package/src/db/tables/apiKeyOwnerTombstones.ts +81 -0
- package/src/db/tables/apiKeyRevocations.test.ts +74 -0
- package/src/db/tables/apiKeyRevocations.ts +121 -0
- package/src/db/tables/authAccounts.ts +105 -0
- package/src/db/tables/authSessions.ts +13 -0
- package/src/db/tables/authVerifications.ts +13 -0
- package/src/db/tables/invitations.ts +142 -45
- package/src/db/tables/memberships.ts +79 -3
- package/src/db/tables/organizations.test.ts +690 -13
- package/src/db/tables/organizations.ts +139 -55
- package/src/db/tables/projects.test.ts +16 -0
- package/src/db/tables/projects.ts +13 -3
- package/src/db/tables/requestUsage.ts +4 -1
- package/src/db/tables/rewardAccounts.ts +178 -0
- package/src/db/tables/rewardCampaignDistributors.ts +68 -0
- package/src/db/tables/rewardCampaigns.test.ts +1388 -0
- package/src/db/tables/rewardCampaigns.ts +647 -0
- package/src/db/tables/rewardCredits.ts +110 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +271 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +184 -0
- package/src/db/tables/rewardRuns.ts +514 -0
- package/src/db/tables/rewardTransactionAttempts.ts +272 -0
- package/src/db/tables/routesCatalog.test.ts +185 -0
- package/src/db/tables/routesCatalog.ts +163 -0
- package/src/db/tables/routesDepositAddresses.test.ts +1048 -0
- package/src/db/tables/routesDepositAddresses.ts +1008 -0
- package/src/db/tables/{fundingDepositRequestObservations.test.ts → routesDepositRequestObservations.test.ts} +13 -14
- package/src/db/tables/{fundingDepositRequestObservations.ts → routesDepositRequestObservations.ts} +10 -10
- package/src/db/tables/{fundingDeposits.test.ts → routesDeposits.test.ts} +388 -46
- package/src/db/tables/routesDeposits.ts +1062 -0
- package/src/db/tables/routesIdempotency.test.ts +796 -0
- package/src/db/tables/routesIdempotency.ts +496 -0
- package/src/db/tables/routesSubsidies.test.ts +120 -0
- package/src/db/tables/routesSubsidies.ts +71 -0
- package/src/db/tables/{fundingTransferEvents.ts → routesTransferEvents.ts} +4 -4
- package/src/db/tables/routesTransferSubsidies.ts +38 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +124 -0
- package/src/db/tables/routesTransferTransactions.test.ts +195 -0
- package/src/db/tables/{fundingTransferTransactions.ts → routesTransferTransactions.ts} +63 -18
- package/src/db/tables/routesTransfers.test.ts +338 -0
- package/src/db/tables/routesTransfers.ts +662 -0
- package/src/db/tables/sponsoredTransactions.test.ts +269 -45
- package/src/db/tables/sponsoredTransactions.ts +225 -65
- package/src/db/tables/sponsorshipAttributions.test.ts +160 -0
- package/src/db/tables/sponsorshipAttributions.ts +168 -0
- package/src/db/tables/sponsorshipReconciliationCursors.test.ts +115 -0
- package/src/db/tables/sponsorshipReconciliationCursors.ts +67 -0
- package/src/db/tables/stripeCustomers.test.ts +85 -0
- package/src/db/tables/stripeCustomers.ts +24 -0
- package/src/db/tables/users.test.ts +129 -0
- package/src/db/tables/users.ts +49 -3
- package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
- package/src/db/tables/verifiedTokenRequests.ts +80 -44
- package/src/db/tables/webhookQueueEvents.ts +8 -1
- package/src/db/tables/webhookSubscriptions.ts +95 -20
- package/src/handlers/internal/executionError.ts +3 -4
- package/src/handlers/internal/multisig.ts +13 -816
- package/src/handlers/internal/sponsorship.ts +26 -10
- package/src/handlers/relay.test-d.ts +9 -1
- package/src/handlers/relay.test.ts +823 -3
- package/src/handlers/relay.ts +127 -107
- package/src/index.test-d.ts +7 -0
- package/src/index.ts +0 -17
- package/src/internal/AssetResponse.ts +26 -0
- package/src/internal/Auth.test.ts +1656 -9
- package/src/internal/Auth.ts +880 -244
- package/src/internal/BetterAuth.test.ts +242 -0
- package/src/internal/BetterAuth.ts +349 -0
- package/src/internal/Cache.ts +2 -0
- package/src/internal/EarnRates.test.ts +17 -0
- package/src/internal/EarnRates.ts +124 -31
- package/src/internal/EarnSharePrices.test.ts +182 -0
- package/src/internal/EarnSharePrices.ts +313 -0
- package/src/internal/EarnVaults.test.ts +21 -0
- package/src/internal/EarnVaults.ts +33 -11
- package/src/internal/Email.ts +54 -0
- package/src/internal/Idempotency.test.ts +2 -2
- package/src/internal/Log.test-d.ts +8 -7
- package/src/internal/Log.test.ts +114 -16
- package/src/internal/Log.ts +53 -40
- package/src/internal/MetricSink.test.ts +313 -26
- package/src/internal/MetricSink.ts +73 -8
- package/src/internal/Mpp.test.ts +31 -0
- package/src/internal/Mpp.ts +21 -24
- package/src/internal/OpenApi.ts +45 -12
- package/src/internal/Provider.test.ts +1 -1
- package/src/internal/Provider.ts +1 -1
- package/src/internal/RateLimit.test.ts +21 -3
- package/src/internal/RateLimit.ts +12 -1
- package/src/internal/Store.test-d.ts +1 -1
- package/src/internal/Store.test.ts +151 -8
- package/src/internal/Store.ts +76 -9
- package/src/internal/Tidx.test.ts +59 -8
- package/src/internal/Tidx.ts +86 -14
- package/src/internal/Timing.test.ts +77 -0
- package/src/internal/Timing.ts +83 -6
- package/src/internal/VercelOidc.test.ts +188 -0
- package/src/internal/VercelOidc.ts +193 -0
- package/src/internal/VerifiedTokens.test.ts +60 -6
- package/src/internal/VerifiedTokens.ts +21 -24
- package/src/internal/Viem.batch.test.ts +80 -0
- package/src/internal/Viem.test.ts +201 -2
- package/src/internal/Viem.ts +221 -25
- package/src/internal/Webhooks.test.ts +85 -6
- package/src/internal/Webhooks.ts +22 -4
- package/src/internal/ZoneRpc.ts +50 -0
- package/src/internal/exchange/Provider.test.ts +2 -2
- package/src/internal/index.test.ts +3 -1
- package/src/internal/index.ts +3 -1
- package/src/internal/rewards/Audit.ts +231 -0
- package/src/internal/rewards/Campaigns.test.ts +1234 -0
- package/src/internal/rewards/Campaigns.ts +1205 -0
- package/src/internal/rewards/Credits.ts +165 -0
- package/src/internal/rewards/Events.local.test.ts +113 -0
- package/src/internal/rewards/Events.test.ts +152 -0
- package/src/internal/rewards/Events.ts +468 -0
- package/src/internal/rewards/Projection.test.ts +681 -0
- package/src/internal/rewards/Projection.ts +987 -0
- package/src/internal/rewards/Rates.test.ts +171 -0
- package/src/internal/rewards/Rates.ts +110 -0
- package/src/internal/rewards/Read.test.ts +501 -0
- package/src/internal/rewards/Read.ts +476 -0
- package/src/internal/rewards/Runner.checkpoint.test.ts +80 -0
- package/src/internal/rewards/Runner.states.test.ts +188 -0
- package/src/internal/rewards/Runner.test.ts +90 -0
- package/src/internal/rewards/Runner.ts +2229 -0
- package/src/internal/rewards/Signer.test.ts +79 -0
- package/src/internal/rewards/Signer.ts +180 -0
- package/src/internal/rewards/index.ts +14 -0
- package/src/internal/{funding → routes}/Action.test.ts +63 -14
- package/src/internal/{funding → routes}/Action.ts +35 -8
- package/src/internal/{funding → routes}/Catalog.test.ts +3 -3
- package/src/internal/{funding → routes}/Catalog.ts +39 -39
- package/src/internal/{funding → routes}/Chain.test.ts +1 -1
- package/src/internal/{funding → routes}/Chain.ts +11 -11
- package/src/internal/{funding → routes}/Deposit.test.ts +1 -1
- package/src/internal/{funding → routes}/Deposit.ts +93 -45
- package/src/internal/{funding → routes}/DepositAddress.test.ts +11 -3
- package/src/internal/{funding → routes}/DepositAddress.ts +132 -53
- package/src/internal/{funding → routes}/DepositWebhook.test.ts +61 -18
- package/src/internal/{funding → routes}/DepositWebhook.ts +9 -9
- package/src/internal/routes/Economics.test.ts +42 -0
- package/src/internal/routes/Economics.ts +47 -0
- package/src/internal/{funding → routes}/Evidence.test.ts +6 -6
- package/src/internal/{funding → routes}/Evidence.ts +9 -9
- package/src/internal/routes/Observability.test.ts +636 -0
- package/src/internal/routes/Observability.ts +668 -0
- package/src/internal/{funding → routes}/Provider.test.ts +489 -153
- package/src/internal/{funding → routes}/Provider.ts +489 -186
- package/src/internal/{funding → routes}/Reconciliation.local.test.ts +84 -12
- package/src/internal/{funding → routes}/Reconciliation.test.ts +1213 -279
- package/src/internal/{funding → routes}/Reconciliation.ts +501 -203
- package/src/internal/routes/Reconciliation.unattributed.test.ts +250 -0
- package/src/internal/{funding → routes}/Route.ts +7 -7
- package/src/internal/{funding → routes}/SourceObservation.test.ts +13 -14
- package/src/internal/{funding → routes}/SourceObservation.ts +13 -13
- package/src/internal/{funding → routes}/Subsidy.local.test.ts +7 -7
- package/src/internal/routes/Subsidy.test.ts +169 -0
- package/src/internal/{funding → routes}/Subsidy.ts +86 -6
- package/src/internal/{funding → routes}/Token.test.ts +1 -1
- package/src/internal/{funding → routes}/Token.ts +5 -5
- package/src/internal/routes/Transfer.test.ts +1199 -0
- package/src/internal/routes/Transfer.ts +1206 -0
- package/src/internal/routes/TransferReconciliation.test.ts +731 -0
- package/src/internal/routes/TransferReconciliation.ts +527 -0
- package/src/internal/routes/TransferSubsidy.test.ts +172 -0
- package/src/internal/routes/TransferSubsidy.ts +447 -0
- package/src/internal/{funding → routes}/TransferWebhook.test.ts +13 -13
- package/src/internal/{funding → routes}/TransferWebhook.ts +7 -7
- package/src/internal/{funding → routes}/index.test.ts +5 -3
- package/src/internal/{funding → routes}/index.ts +2 -0
- package/src/internal/{funding → routes}/providers/across.ts +16 -16
- package/src/internal/{funding → routes}/providers/index.test.ts +157 -44
- package/src/internal/{funding → routes}/providers/relay.test.ts +224 -32
- package/src/internal/{funding → routes}/providers/relay.ts +228 -121
- package/src/internal/{funding → routes}/providers/rhino.ts +16 -16
- package/src/internal/{funding → routes}/providers/squid.ts +17 -17
- package/src/internal/routes/providers/stargate.test.ts +728 -0
- package/src/internal/routes/providers/stargate.ts +1276 -0
- package/src/internal/{funding → routes}/providers/symbiosis.ts +64 -24
- package/src/internal/webhookDestinations/slack.ts +10 -10
- package/src/providers/index.ts +13 -13
- package/src/server.ts +18 -0
- package/dist/apps/funding/Access.d.ts.map +0 -1
- package/dist/apps/funding/Access.js.map +0 -1
- package/dist/apps/funding/App.js.map +0 -1
- package/dist/apps/funding/Inventory.d.ts.map +0 -1
- package/dist/apps/funding/Inventory.js.map +0 -1
- package/dist/apps/funding/ProviderAttempts.d.ts +0 -5
- package/dist/apps/funding/ProviderAttempts.d.ts.map +0 -1
- package/dist/apps/funding/ProviderAttempts.js +0 -24
- package/dist/apps/funding/ProviderAttempts.js.map +0 -1
- package/dist/apps/funding/index.d.ts +0 -2
- package/dist/apps/funding/index.d.ts.map +0 -1
- package/dist/apps/funding/index.js +0 -2
- package/dist/apps/funding/index.js.map +0 -1
- package/dist/apps/funding/routes/chains.d.ts.map +0 -1
- package/dist/apps/funding/routes/chains.js.map +0 -1
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +0 -1
- package/dist/apps/funding/routes/deposit-addresses.js.map +0 -1
- package/dist/apps/funding/routes/providers.d.ts.map +0 -1
- package/dist/apps/funding/routes/providers.js +0 -57
- package/dist/apps/funding/routes/providers.js.map +0 -1
- package/dist/apps/funding/routes/quotes.d.ts.map +0 -1
- package/dist/apps/funding/routes/quotes.js.map +0 -1
- package/dist/apps/funding/routes/transfers.d.ts.map +0 -1
- package/dist/apps/funding/routes/transfers.js +0 -828
- package/dist/apps/funding/routes/transfers.js.map +0 -1
- package/dist/db/tables/fundingCatalog.d.ts +0 -58
- package/dist/db/tables/fundingCatalog.d.ts.map +0 -1
- package/dist/db/tables/fundingCatalog.js.map +0 -1
- package/dist/db/tables/fundingDepositAddresses.d.ts +0 -192
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +0 -1
- package/dist/db/tables/fundingDepositAddresses.js +0 -235
- package/dist/db/tables/fundingDepositAddresses.js.map +0 -1
- package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +0 -1
- package/dist/db/tables/fundingDepositRequestObservations.js.map +0 -1
- package/dist/db/tables/fundingDeposits.d.ts.map +0 -1
- package/dist/db/tables/fundingDeposits.js +0 -295
- package/dist/db/tables/fundingDeposits.js.map +0 -1
- package/dist/db/tables/fundingIdempotency.d.ts +0 -91
- package/dist/db/tables/fundingIdempotency.d.ts.map +0 -1
- package/dist/db/tables/fundingIdempotency.js +0 -103
- package/dist/db/tables/fundingIdempotency.js.map +0 -1
- package/dist/db/tables/fundingTransferEvents.d.ts.map +0 -1
- package/dist/db/tables/fundingTransferEvents.js.map +0 -1
- package/dist/db/tables/fundingTransferTransactions.d.ts +0 -53
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
- package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
- package/dist/db/tables/fundingTransfers.d.ts +0 -99
- package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
- package/dist/db/tables/fundingTransfers.js +0 -110
- package/dist/db/tables/fundingTransfers.js.map +0 -1
- package/dist/internal/funding/Action.d.ts.map +0 -1
- package/dist/internal/funding/Action.js.map +0 -1
- package/dist/internal/funding/Catalog.d.ts.map +0 -1
- package/dist/internal/funding/Catalog.js.map +0 -1
- package/dist/internal/funding/Chain.d.ts.map +0 -1
- package/dist/internal/funding/Chain.js.map +0 -1
- package/dist/internal/funding/Deposit.d.ts.map +0 -1
- package/dist/internal/funding/Deposit.js.map +0 -1
- package/dist/internal/funding/DepositAddress.d.ts.map +0 -1
- package/dist/internal/funding/DepositAddress.js.map +0 -1
- package/dist/internal/funding/DepositWebhook.d.ts.map +0 -1
- package/dist/internal/funding/DepositWebhook.js.map +0 -1
- package/dist/internal/funding/Evidence.d.ts.map +0 -1
- package/dist/internal/funding/Evidence.js.map +0 -1
- package/dist/internal/funding/Provider.d.ts.map +0 -1
- package/dist/internal/funding/Provider.js.map +0 -1
- package/dist/internal/funding/Reconciliation.d.ts.map +0 -1
- package/dist/internal/funding/Reconciliation.js.map +0 -1
- package/dist/internal/funding/Route.d.ts +0 -21
- package/dist/internal/funding/Route.d.ts.map +0 -1
- package/dist/internal/funding/Route.js.map +0 -1
- package/dist/internal/funding/SourceObservation.d.ts.map +0 -1
- package/dist/internal/funding/SourceObservation.js.map +0 -1
- package/dist/internal/funding/Subsidy.d.ts.map +0 -1
- package/dist/internal/funding/Subsidy.js.map +0 -1
- package/dist/internal/funding/Token.d.ts.map +0 -1
- package/dist/internal/funding/Token.js.map +0 -1
- package/dist/internal/funding/Transfer.d.ts.map +0 -1
- package/dist/internal/funding/Transfer.js +0 -462
- package/dist/internal/funding/Transfer.js.map +0 -1
- package/dist/internal/funding/TransferReconciliation.d.ts.map +0 -1
- package/dist/internal/funding/TransferReconciliation.js +0 -192
- package/dist/internal/funding/TransferReconciliation.js.map +0 -1
- package/dist/internal/funding/TransferWebhook.d.ts.map +0 -1
- package/dist/internal/funding/TransferWebhook.js.map +0 -1
- package/dist/internal/funding/index.d.ts.map +0 -1
- package/dist/internal/funding/index.js.map +0 -1
- package/dist/internal/funding/providers/across.d.ts.map +0 -1
- package/dist/internal/funding/providers/across.js.map +0 -1
- package/dist/internal/funding/providers/relay.d.ts.map +0 -1
- package/dist/internal/funding/providers/relay.js.map +0 -1
- package/dist/internal/funding/providers/rhino.d.ts.map +0 -1
- package/dist/internal/funding/providers/rhino.js.map +0 -1
- package/dist/internal/funding/providers/squid.d.ts.map +0 -1
- package/dist/internal/funding/providers/squid.js.map +0 -1
- package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
- package/dist/internal/funding/providers/stargate.js +0 -579
- package/dist/internal/funding/providers/stargate.js.map +0 -1
- package/dist/internal/funding/providers/symbiosis.d.ts.map +0 -1
- package/dist/internal/funding/providers/symbiosis.js.map +0 -1
- package/src/apps/funding/App.test.ts +0 -78
- package/src/apps/funding/App.ts +0 -88
- package/src/apps/funding/ProviderAttempts.ts +0 -26
- package/src/apps/funding/index.ts +0 -1
- package/src/apps/funding/routes/transfers.ts +0 -987
- package/src/db/tables/fundingCatalog.test.ts +0 -122
- package/src/db/tables/fundingCatalog.ts +0 -163
- package/src/db/tables/fundingDepositAddresses.test.ts +0 -608
- package/src/db/tables/fundingDepositAddresses.ts +0 -443
- package/src/db/tables/fundingDeposits.ts +0 -572
- package/src/db/tables/fundingIdempotency.test.ts +0 -182
- package/src/db/tables/fundingIdempotency.ts +0 -180
- package/src/db/tables/fundingTransferTransactions.test.ts +0 -112
- package/src/db/tables/fundingTransfers.test.ts +0 -115
- package/src/db/tables/fundingTransfers.ts +0 -189
- package/src/handlers/internal/multisig.test.ts +0 -818
- package/src/internal/funding/Subsidy.test.ts +0 -75
- package/src/internal/funding/Transfer.test.ts +0 -524
- package/src/internal/funding/Transfer.ts +0 -762
- package/src/internal/funding/TransferReconciliation.test.ts +0 -147
- package/src/internal/funding/TransferReconciliation.ts +0 -264
- package/src/internal/funding/providers/stargate.test.ts +0 -328
- package/src/internal/funding/providers/stargate.ts +0 -856
- /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
- /package/src/internal/{funding → routes}/Route.test.ts +0 -0
package/dist/internal/Auth.js
CHANGED
|
@@ -1,35 +1,71 @@
|
|
|
1
1
|
import * as Accounts from 'accounts/server';
|
|
2
|
+
import { splitSetCookieHeader } from 'better-auth/cookies';
|
|
2
3
|
import { Hono } from 'hono';
|
|
4
|
+
import { deleteCookie, getCookie, setCookie } from 'hono/cookie';
|
|
3
5
|
import { createMiddleware } from 'hono/factory';
|
|
4
6
|
import { matchedRoutes } from 'hono/route';
|
|
5
7
|
import { findTargetHandler } from 'hono/utils/handler';
|
|
8
|
+
import * as jose from 'jose';
|
|
9
|
+
import { sql } from 'kysely';
|
|
6
10
|
import { Challenge, Credential } from 'mppx';
|
|
7
11
|
import { Mppx, tempo } from 'mppx/hono';
|
|
12
|
+
import { Address, Hex } from 'ox';
|
|
8
13
|
import { Addresses } from 'viem/tempo';
|
|
9
14
|
import { tempoMainnet } from 'viem/tempo/chains';
|
|
10
15
|
import * as z from 'zod/mini';
|
|
11
16
|
import * as ApiKey from '../ApiKey.js';
|
|
12
17
|
import * as ApiKeys from '../ApiKeys.js';
|
|
18
|
+
import * as ApiKeyAdmissions from '../db/tables/apiKeyAdmissions.js';
|
|
19
|
+
import * as ApiKeyOwnerTombstones from '../db/tables/apiKeyOwnerTombstones.js';
|
|
20
|
+
import * as AuthAccounts from '../db/tables/authAccounts.js';
|
|
21
|
+
import * as BetterAuth from './BetterAuth.js';
|
|
13
22
|
import * as Db from '../db/Db.js';
|
|
14
23
|
import * as Memberships from '../db/tables/memberships.js';
|
|
15
24
|
import * as IpAllowlist from './IpAllowlist.js';
|
|
16
25
|
import * as Metadata from '../apps/metadata.js';
|
|
17
26
|
import * as OpenApi from './OpenApi.js';
|
|
18
27
|
import * as Organizations from '../db/tables/organizations.js';
|
|
28
|
+
import * as Path from './Path.js';
|
|
19
29
|
import * as Projects from '../db/tables/projects.js';
|
|
20
30
|
import * as RateLimit from './RateLimit.js';
|
|
21
31
|
import * as Response from './Response.js';
|
|
22
32
|
import * as Schema from './Schema.js';
|
|
23
33
|
import * as Scope from '../Scope.js';
|
|
34
|
+
import * as Timing from './Timing.js';
|
|
24
35
|
import * as Users from '../db/tables/users.js';
|
|
25
36
|
const policySymbol = Symbol('tempo-api.auth.policy');
|
|
26
37
|
const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management');
|
|
38
|
+
const trustedClientIps = new WeakMap();
|
|
27
39
|
const defaultApiKeyRateLimit = { limit: 10_000, period: 'minute' };
|
|
40
|
+
const defaultIdentitySessionTtl = 24 * 60 * 60;
|
|
28
41
|
const defaultMppRateLimit = { limit: 100, period: 'minute' };
|
|
42
|
+
const defaultPublicRateLimit = { limit: 60, period: 'minute' };
|
|
43
|
+
const identityCookieName = 'tempo_identity';
|
|
44
|
+
const walletIdentityIssuer = 'https://wallet.tempo.xyz/api/oidc';
|
|
45
|
+
function isIdentityTokenError(error) {
|
|
46
|
+
return (error instanceof jose.errors.JOSEAlgNotAllowed ||
|
|
47
|
+
error instanceof jose.errors.JOSENotSupported ||
|
|
48
|
+
error instanceof jose.errors.JWSInvalid ||
|
|
49
|
+
error instanceof jose.errors.JWKSNoMatchingKey ||
|
|
50
|
+
error instanceof jose.errors.JWSSignatureVerificationFailed ||
|
|
51
|
+
error instanceof jose.errors.JWTClaimValidationFailed ||
|
|
52
|
+
error instanceof jose.errors.JWTExpired ||
|
|
53
|
+
error instanceof jose.errors.JWTInvalid ||
|
|
54
|
+
(error instanceof Error && error.message === 'email not verified'));
|
|
55
|
+
}
|
|
29
56
|
/** Reads the authenticated principal from a Hono context. */
|
|
30
57
|
export function getPrincipal(c) {
|
|
31
58
|
return c.get('principal') ?? null;
|
|
32
59
|
}
|
|
60
|
+
/** Resolves the caller IP from configured trusted metadata. */
|
|
61
|
+
export function getTrustedClientIp(c) {
|
|
62
|
+
const auth = c.get('auth');
|
|
63
|
+
return auth ? trustedClientIp(c, auth) : resolveTrustedClientIp(c.req.raw, undefined);
|
|
64
|
+
}
|
|
65
|
+
/** Marks a synthesized in-process request with its trusted caller IP address. */
|
|
66
|
+
export function trustClientIp(request, address) {
|
|
67
|
+
trustedClientIps.set(request, address);
|
|
68
|
+
}
|
|
33
69
|
/**
|
|
34
70
|
* Guards `:orgId` routes and resolves the organization. Sessions require membership, API keys require ownership, and the super admin bypasses ownership.
|
|
35
71
|
*/
|
|
@@ -265,6 +301,13 @@ export function paidAccessError(c) {
|
|
|
265
301
|
}
|
|
266
302
|
/** Creates auth middleware for protected OpenAPI routes. */
|
|
267
303
|
export function middleware(options) {
|
|
304
|
+
const resolve = createApiKeyResolver({
|
|
305
|
+
apiKey: options.apiKey,
|
|
306
|
+
scopeCatalog: options.scopeCatalog,
|
|
307
|
+
});
|
|
308
|
+
return createAuthMiddleware(options, resolve);
|
|
309
|
+
}
|
|
310
|
+
function createAuthMiddleware(options, resolve) {
|
|
268
311
|
const { rateLimit: mppRateLimit = defaultMppRateLimit, session: session_ = {}, sessionChainIds, ...mpp } = options.mpp === false ? {} : (options.mpp ?? {});
|
|
269
312
|
const secretKey = resolveMppSecretKey(mpp.secretKey);
|
|
270
313
|
const defaults = laneDefaults(options);
|
|
@@ -278,24 +321,13 @@ export function middleware(options) {
|
|
|
278
321
|
// keyed by token sha256) so hot keys skip the backend read on the auth path
|
|
279
322
|
// of every request. Pass `apiKey.cache: false` when immediate key updates
|
|
280
323
|
// matter more than the per-request read.
|
|
281
|
-
const resolve = (() => {
|
|
282
|
-
const uncached = (c, token) => {
|
|
283
|
-
const kv = contextKv(c);
|
|
284
|
-
return kv
|
|
285
|
-
? ApiKeys.resolve(kv.store, token, { scopeCatalog: options.scopeCatalog })
|
|
286
|
-
: Promise.resolve(null);
|
|
287
|
-
};
|
|
288
|
-
if (options.apiKey === false || options.apiKey?.cache === false)
|
|
289
|
-
return uncached;
|
|
290
|
-
return cachedResolve(uncached, options.apiKey?.cache ?? {});
|
|
291
|
-
})();
|
|
292
324
|
const auth = {
|
|
293
325
|
...(options.apiKey === false
|
|
294
326
|
? {}
|
|
295
327
|
: {
|
|
296
328
|
apiKey: {
|
|
297
329
|
...(options.apiKey?.rateLimits ? { rateLimits: options.apiKey.rateLimits } : {}),
|
|
298
|
-
resolve,
|
|
330
|
+
resolve: resolve.resolve,
|
|
299
331
|
},
|
|
300
332
|
}),
|
|
301
333
|
// The throttle ceiling for sandbox keys without active billing, so
|
|
@@ -336,33 +368,92 @@ export function middleware(options) {
|
|
|
336
368
|
: {}),
|
|
337
369
|
};
|
|
338
370
|
return createMiddleware((c, next) => {
|
|
339
|
-
const
|
|
340
|
-
if (!
|
|
371
|
+
const resolved = resolveRequestPolicy(c, { base, defaults, options });
|
|
372
|
+
if (!resolved)
|
|
341
373
|
return next();
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
const routePolicies = policies(c);
|
|
345
|
-
const configuredOverride = (() => {
|
|
346
|
-
const configured = overrides?.[key];
|
|
347
|
-
if (configured !== undefined)
|
|
348
|
-
return configured;
|
|
349
|
-
const inheritedMethod = routePolicies.find((policy) => policy.inheritOverridesFrom)?.inheritOverridesFrom;
|
|
350
|
-
if (inheritedMethod === undefined)
|
|
351
|
-
return undefined;
|
|
352
|
-
const inheritedKey = `${inheritedMethod.toUpperCase()} ${key.slice(key.indexOf(' ') + 1)}`;
|
|
353
|
-
return overrides?.[inheritedKey];
|
|
354
|
-
})();
|
|
355
|
-
const routeOverride = management && configuredOverride ? { mpp: configuredOverride.mpp } : configuredOverride;
|
|
356
|
-
const endpointPolicy = bindMppScope(resolvePolicy(base, defaults, [...routePolicies, routeOverride], description), scope);
|
|
357
|
-
if (!endpointPolicy)
|
|
374
|
+
c.set('auth', auth);
|
|
375
|
+
if (!resolved.policy)
|
|
358
376
|
return next();
|
|
359
|
-
if (management && (!auth.mpp || !
|
|
377
|
+
if (resolved.management && (!auth.mpp || !resolved.policy.mpp))
|
|
360
378
|
return next();
|
|
361
|
-
|
|
362
|
-
return require(endpointPolicy)(c, next);
|
|
379
|
+
return require(resolved.policy)(c, next);
|
|
363
380
|
});
|
|
364
381
|
}
|
|
365
|
-
|
|
382
|
+
function resolveRequestPolicy(c, options) {
|
|
383
|
+
const route = openApiRoute(c);
|
|
384
|
+
if (!route)
|
|
385
|
+
return undefined;
|
|
386
|
+
const { key, description, management, scope } = route;
|
|
387
|
+
const overrides = options.options.overrides;
|
|
388
|
+
const routePolicies = policies(c);
|
|
389
|
+
const configuredOverride = (() => {
|
|
390
|
+
const configured = overrides?.[key];
|
|
391
|
+
if (configured !== undefined)
|
|
392
|
+
return configured;
|
|
393
|
+
const inheritedMethod = routePolicies.find((routePolicy) => routePolicy !== false && routePolicy.inheritOverridesFrom !== undefined)?.inheritOverridesFrom;
|
|
394
|
+
if (inheritedMethod === undefined)
|
|
395
|
+
return undefined;
|
|
396
|
+
const inheritedKey = `${inheritedMethod.toUpperCase()} ${key.slice(key.indexOf(' ') + 1)}`;
|
|
397
|
+
return overrides?.[inheritedKey];
|
|
398
|
+
})();
|
|
399
|
+
// Generated management routes already materialize the GET's MPP contract.
|
|
400
|
+
// Reapplying its override would also copy GET-only quota controls.
|
|
401
|
+
const routeOverride = management ? undefined : configuredOverride;
|
|
402
|
+
return {
|
|
403
|
+
management,
|
|
404
|
+
policy: bindMppScope(resolvePolicy(options.base, options.defaults, [...routePolicies, routeOverride], description), scope),
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
function createApiKeyResolver(options) {
|
|
408
|
+
const requests = new WeakMap();
|
|
409
|
+
const uncached = (c, token) => {
|
|
410
|
+
const kv = contextKv(c);
|
|
411
|
+
return kv
|
|
412
|
+
? ApiKeys.resolve(kv.store, token, { scopeCatalog: options.scopeCatalog })
|
|
413
|
+
: Promise.resolve(null);
|
|
414
|
+
};
|
|
415
|
+
const cache = options.apiKey === false || options.apiKey?.cache === false
|
|
416
|
+
? { invalidate: () => { }, peek: () => undefined, resolve: uncached }
|
|
417
|
+
: cachedResolve(uncached, options.apiKey?.cache ?? {});
|
|
418
|
+
return {
|
|
419
|
+
peek: (c, token) => {
|
|
420
|
+
const tokenHash = ApiKey.hash(token);
|
|
421
|
+
const existing = requests.get(c);
|
|
422
|
+
if (existing?.tokenHash === tokenHash)
|
|
423
|
+
return existing.apiKey;
|
|
424
|
+
return cache.peek(token);
|
|
425
|
+
},
|
|
426
|
+
resolve: async (c, token) => {
|
|
427
|
+
const tokenHash = ApiKey.hash(token);
|
|
428
|
+
const existing = requests.get(c);
|
|
429
|
+
if (existing?.tokenHash === tokenHash)
|
|
430
|
+
return existing.apiKey;
|
|
431
|
+
const cached = await cache.resolve(c, token);
|
|
432
|
+
const kv = contextKv(c);
|
|
433
|
+
const apiKey = cached &&
|
|
434
|
+
((kv && (await ApiKeys.isOwnerDeleted(kv.store, cached))) ||
|
|
435
|
+
!(await apiKeyOwnerExists(cached, options.db)))
|
|
436
|
+
? null
|
|
437
|
+
: cached;
|
|
438
|
+
if (cached && !apiKey)
|
|
439
|
+
cache.invalidate(token);
|
|
440
|
+
requests.set(c, { apiKey, tokenHash });
|
|
441
|
+
return apiKey;
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
/** Rejects attributed keys fenced by a committed owner deletion. */
|
|
446
|
+
async function apiKeyOwnerExists(apiKey, source) {
|
|
447
|
+
if (!source)
|
|
448
|
+
return true;
|
|
449
|
+
const db = Db.get(source);
|
|
450
|
+
if (!(await ApiKeyAdmissions.matches(db, apiKey)))
|
|
451
|
+
return false;
|
|
452
|
+
if (await ApiKeyOwnerTombstones.isDeleted(db, apiKey))
|
|
453
|
+
return false;
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
/** Zod schemas documenting the session sign-in surface. */
|
|
366
457
|
var schema;
|
|
367
458
|
(function (schema) {
|
|
368
459
|
const siweMessage = 'api.tempo.xyz wants you to sign in with your Ethereum account:\n0x0000000000000000000000000000000000000000\n\nURI: https://api.tempo.xyz\nVersion: 1\nChain ID: 0\nNonce: 3D0sZfnHqTBmc9tKR\nIssued At: 2026-01-01T00:00:00.000Z\nExpiration Time: 2026-01-01T00:10:00.000Z';
|
|
@@ -379,19 +470,19 @@ var schema;
|
|
|
379
470
|
let challenge;
|
|
380
471
|
(function (challenge) {
|
|
381
472
|
/** Request body. Accepted fields beyond this document pass through to the SDK handler. */
|
|
382
|
-
challenge.Body = z.object({});
|
|
473
|
+
challenge.Body = OpenApi.component(z.object({}), 'SiweChallengeRequest');
|
|
383
474
|
/** Response body. */
|
|
384
|
-
challenge.Response = z.object({
|
|
475
|
+
challenge.Response = OpenApi.component(z.object({
|
|
385
476
|
message: z
|
|
386
477
|
.string()
|
|
387
478
|
.check(z.describe('Single-use EIP-4361 (SIWE) message to sign and submit for verification.'), z.meta({ examples: [siweMessage] })),
|
|
388
|
-
});
|
|
479
|
+
}), 'SiweChallengeResponse');
|
|
389
480
|
})(challenge = schema.challenge || (schema.challenge = {}));
|
|
390
481
|
/** Schemas for `POST /v1/auth/siwe` (verify). */
|
|
391
482
|
let verify;
|
|
392
483
|
(function (verify) {
|
|
393
484
|
/** Request body. */
|
|
394
|
-
verify.Body = z.object({
|
|
485
|
+
verify.Body = OpenApi.component(z.object({
|
|
395
486
|
address: z
|
|
396
487
|
.string()
|
|
397
488
|
.check(z.describe('Wallet address that signed the message; becomes the session subject.'), z.meta({ examples: ['0x0000000000000000000000000000000000000001'] })),
|
|
@@ -407,14 +498,26 @@ var schema;
|
|
|
407
498
|
signature: z
|
|
408
499
|
.string()
|
|
409
500
|
.check(z.describe('Signature over the challenge message (or the key-authorization digest).'), z.meta({ examples: [`0x${'aa'.repeat(65)}`] })),
|
|
410
|
-
});
|
|
501
|
+
}), 'SiweVerifyRequest');
|
|
411
502
|
/** Response body. */
|
|
412
|
-
verify.Response = z.object({
|
|
503
|
+
verify.Response = OpenApi.component(z.object({
|
|
413
504
|
token: z
|
|
414
505
|
.optional(z.string())
|
|
415
506
|
.check(z.describe('Bearer session token; present only when `returnToken` is true.'), z.meta({ examples: ['aa'.repeat(32)] })),
|
|
416
|
-
});
|
|
507
|
+
}), 'SiweVerifyResponse');
|
|
417
508
|
})(verify = schema.verify || (schema.verify = {}));
|
|
509
|
+
/** Schemas for `POST /v1/auth/identity`. */
|
|
510
|
+
let identity;
|
|
511
|
+
(function (identity) {
|
|
512
|
+
/** Request body. */
|
|
513
|
+
identity.Body = OpenApi.component(z.object({
|
|
514
|
+
idToken: z
|
|
515
|
+
.string()
|
|
516
|
+
.check(z.describe('Wallet-issued OpenID Connect identity token.'), z.meta({ examples: ['eyJhbGciOiJFZERTQSJ9.eyJzdWIiOiIweDAwMDAifQ.c2lnbmF0dXJl'] })),
|
|
517
|
+
}), 'IdentitySignInRequest');
|
|
518
|
+
/** Response body. */
|
|
519
|
+
identity.Response = OpenApi.component(z.object({}), 'IdentitySignInResponse');
|
|
520
|
+
})(identity = schema.identity || (schema.identity = {}));
|
|
418
521
|
})(schema || (schema = {}));
|
|
419
522
|
/** `{ error }` response for a sign-in handler failure status. */
|
|
420
523
|
function handlerError(description) {
|
|
@@ -431,17 +534,34 @@ function handlerError(description) {
|
|
|
431
534
|
*/
|
|
432
535
|
export function install(options) {
|
|
433
536
|
const { db, kv, scopeCatalog } = options;
|
|
434
|
-
const { session: options_session, ...options_middleware } = options.auth === false ? {} : (options.auth ?? {});
|
|
537
|
+
const { edgeRateLimit: options_edgeRateLimit, session: options_session, ...options_middleware } = options.auth === false ? {} : (options.auth ?? {});
|
|
538
|
+
const publicClientIp = typeof options_middleware.public === 'object' ? options_middleware.public.clientIp : undefined;
|
|
435
539
|
if (options_session && !kv)
|
|
436
540
|
throw new Error('`auth.session` requires the `kv` state store: sessions and sign-in challenges persist there.'); // prettier-ignore
|
|
541
|
+
const options_betterAuth = options_session
|
|
542
|
+
? {
|
|
543
|
+
basePath: Path.join(options.basePath, 'v1/auth'),
|
|
544
|
+
clientIp: (request) => resolveTrustedClientIp(request, publicClientIp),
|
|
545
|
+
db,
|
|
546
|
+
get email() {
|
|
547
|
+
return options.email();
|
|
548
|
+
},
|
|
549
|
+
rateLimit: RateLimit.memory(options_middleware.rateLimit),
|
|
550
|
+
secret: options_session.secret,
|
|
551
|
+
...(options_session.google ? { google: options_session.google } : {}),
|
|
552
|
+
...(options_session.trustedOrigins
|
|
553
|
+
? { trustedOrigins: options_session.trustedOrigins }
|
|
554
|
+
: {}),
|
|
555
|
+
}
|
|
556
|
+
: undefined;
|
|
437
557
|
// Session sign-in surface (challenge, verify, logout — SIWE wallet sign-in
|
|
438
558
|
// today) plus the capability the session lane resolves through. Public but
|
|
439
559
|
// policy-gated: the hidden describeRoute engages the middleware for the
|
|
440
560
|
// mounted sub-app, and the public lane rate-limits challenge-store writes.
|
|
441
561
|
const app = (() => {
|
|
442
|
-
if (!options_session || !kv)
|
|
562
|
+
if (!options_betterAuth || !options_session || !kv)
|
|
443
563
|
return undefined;
|
|
444
|
-
const { issuer, origin, requireEmail, ttl } =
|
|
564
|
+
const { issuer, origin, requireEmail, ttl } = options_session.wallet ?? {};
|
|
445
565
|
const handler = Accounts.Handler.auth({
|
|
446
566
|
getClient: options.getClient,
|
|
447
567
|
...(issuer || requireEmail
|
|
@@ -476,30 +596,108 @@ export function install(options) {
|
|
|
476
596
|
},
|
|
477
597
|
...(ttl ? { ttl } : {}),
|
|
478
598
|
});
|
|
599
|
+
const identity = options_session.identity;
|
|
600
|
+
const identitySessionTtl = identity?.ttl ?? defaultIdentitySessionTtl;
|
|
601
|
+
const identitySessionKey = (token) => `identity:session:${token}`;
|
|
602
|
+
async function resolveWallet(payload) {
|
|
603
|
+
const database = Db.get(db);
|
|
604
|
+
const verifiedEmail = payload.email?.trim().toLowerCase();
|
|
605
|
+
return database.kysely.transaction().execute(async (kysely) => {
|
|
606
|
+
const tx = { ...database, kysely };
|
|
607
|
+
// Organization creation locks the same address row before resolving
|
|
608
|
+
// the wallet owner, serializing resource writes with reconciliation.
|
|
609
|
+
const addressUser = await Users.getByAddressForUpdate(tx, payload.address);
|
|
610
|
+
if (!addressUser)
|
|
611
|
+
return null;
|
|
612
|
+
if (verifiedEmail)
|
|
613
|
+
await sql `SELECT pg_advisory_xact_lock(hashtextextended(${verifiedEmail}, 0))`.execute(kysely);
|
|
614
|
+
const linkedUserId = await AuthAccounts.getWalletUserId(tx, payload.address);
|
|
615
|
+
const linkedUser = linkedUserId ? await Users.get(tx, linkedUserId) : undefined;
|
|
616
|
+
const emailUser = verifiedEmail ? await Users.getByEmail(tx, verifiedEmail) : undefined;
|
|
617
|
+
const walletUser = linkedUser ?? addressUser;
|
|
618
|
+
const walletHasResources = emailUser && walletUser.id !== emailUser.id
|
|
619
|
+
? await Memberships.existsForUser(tx, walletUser.id)
|
|
620
|
+
: false;
|
|
621
|
+
// A verified email reconciles a provisional email-less wallet link.
|
|
622
|
+
// Keep a provisional owner when changing it would orphan its access.
|
|
623
|
+
const user = walletHasResources ? walletUser : (emailUser ?? walletUser);
|
|
624
|
+
if (linkedUser?.id !== user.id)
|
|
625
|
+
await AuthAccounts.setWalletUser(tx, { address: payload.address, userId: user.id });
|
|
626
|
+
if (verifiedEmail && (user.email !== verifiedEmail || !user.emailVerified))
|
|
627
|
+
await Users.setEmail(tx, user.id, verifiedEmail);
|
|
628
|
+
return { email: verifiedEmail ?? user.email ?? undefined, user };
|
|
629
|
+
});
|
|
630
|
+
}
|
|
479
631
|
const session = {
|
|
480
632
|
resolve: async (c) => {
|
|
481
|
-
const
|
|
482
|
-
|
|
633
|
+
const [betterAuth, identitySession, wallet] = await Promise.all([
|
|
634
|
+
(async () => {
|
|
635
|
+
const auth = BetterAuth.fromContext(c, options_betterAuth);
|
|
636
|
+
const request = BetterAuth.request(c, options_betterAuth);
|
|
637
|
+
const result = await auth.api.getSession({ headers: request.headers });
|
|
638
|
+
if (!result)
|
|
639
|
+
return null;
|
|
640
|
+
const provider = 'provider' in result.session && typeof result.session.provider === 'string'
|
|
641
|
+
? result.session.provider
|
|
642
|
+
: undefined;
|
|
643
|
+
if (!provider ||
|
|
644
|
+
!result.user.email ||
|
|
645
|
+
(provider === 'email' && !options_betterAuth.email))
|
|
646
|
+
return null;
|
|
647
|
+
return {
|
|
648
|
+
email: result.user.email,
|
|
649
|
+
id: result.user.id,
|
|
650
|
+
identity: { provider, subject: result.user.email },
|
|
651
|
+
type: 'session',
|
|
652
|
+
};
|
|
653
|
+
})(),
|
|
654
|
+
(async () => {
|
|
655
|
+
if (!identity)
|
|
656
|
+
return null;
|
|
657
|
+
const token = getCookie(c, identityCookieName);
|
|
658
|
+
if (!token)
|
|
659
|
+
return null;
|
|
660
|
+
const value = await kv.store.get(identitySessionKey(token));
|
|
661
|
+
if (value === null)
|
|
662
|
+
return null;
|
|
663
|
+
const payload = JSON.parse(value);
|
|
664
|
+
if (payload.expiresAt <= Math.floor(Date.now() / 1_000))
|
|
665
|
+
return null;
|
|
666
|
+
const user = await resolveWallet(payload);
|
|
667
|
+
if (!user)
|
|
668
|
+
return null;
|
|
669
|
+
return {
|
|
670
|
+
...(user.email ? { email: user.email } : {}),
|
|
671
|
+
id: user.user.id,
|
|
672
|
+
identity: { provider: 'wallet', subject: payload.address },
|
|
673
|
+
type: 'session',
|
|
674
|
+
};
|
|
675
|
+
})(),
|
|
676
|
+
(async () => {
|
|
677
|
+
const payload = await handler.getSession(c.req.raw);
|
|
678
|
+
if (!payload)
|
|
679
|
+
return null;
|
|
680
|
+
const user = await resolveWallet(payload);
|
|
681
|
+
if (!user)
|
|
682
|
+
return null;
|
|
683
|
+
return {
|
|
684
|
+
...(user.email ? { email: user.email } : {}),
|
|
685
|
+
id: user.user.id,
|
|
686
|
+
identity: { provider: 'wallet', subject: payload.address },
|
|
687
|
+
type: 'session',
|
|
688
|
+
};
|
|
689
|
+
})(),
|
|
690
|
+
]);
|
|
691
|
+
if (betterAuth && identitySession && betterAuth.id !== identitySession.id)
|
|
483
692
|
return null;
|
|
484
|
-
|
|
485
|
-
const user = await Users.getByAddress(database, payload.address);
|
|
486
|
-
if (!user)
|
|
693
|
+
if (betterAuth && wallet && betterAuth.id !== wallet.id)
|
|
487
694
|
return null;
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
await Users.setEmail(database, user.id, payload.email);
|
|
492
|
-
const email = payload.email ?? user.email ?? undefined;
|
|
493
|
-
return {
|
|
494
|
-
...(email ? { email } : {}),
|
|
495
|
-
id: user.id,
|
|
496
|
-
identity: { provider: 'wallet', subject: payload.address },
|
|
497
|
-
type: 'session',
|
|
498
|
-
};
|
|
695
|
+
if (identitySession && wallet && identitySession.id !== wallet.id)
|
|
696
|
+
return null;
|
|
697
|
+
return betterAuth ?? identitySession ?? wallet;
|
|
499
698
|
},
|
|
500
699
|
};
|
|
501
700
|
const policy_public = policy({ public: true });
|
|
502
|
-
const policy_session = policy({ public: true, session: true });
|
|
503
701
|
const describe = OpenApi.describeRoute({ hide: true });
|
|
504
702
|
const app = new Hono()
|
|
505
703
|
.use('/v1/auth/siwe', policy_public, describe)
|
|
@@ -507,10 +705,7 @@ export function install(options) {
|
|
|
507
705
|
// Documented operations: pre-routes carrying the OpenAPI metadata and the
|
|
508
706
|
// envelope-shaped body validation; the mounted handler owns behavior.
|
|
509
707
|
// Statement form keeps them off the app type (`hc` surface).
|
|
510
|
-
app.post('/v1/auth/siwe/challenge', policy_public, OpenApi.
|
|
511
|
-
code: 'body_invalid',
|
|
512
|
-
message: 'Invalid request body',
|
|
513
|
-
}), OpenApi.describeRoute({
|
|
708
|
+
app.post('/v1/auth/siwe/challenge', policy_public, OpenApi.documentJsonRequest(schema.challenge.Body), validateJsonRequest(schema.challenge.Body), OpenApi.describeRoute({
|
|
514
709
|
description: 'Issues a single-use SIWE challenge message to sign. The challenge expires after a short TTL.',
|
|
515
710
|
// Overrides the surface-wide hidden mount guard for this documented route.
|
|
516
711
|
hide: false,
|
|
@@ -528,10 +723,7 @@ export function install(options) {
|
|
|
528
723
|
summary: 'Create challenge (SIWE)',
|
|
529
724
|
tags: ['Authentication'],
|
|
530
725
|
}));
|
|
531
|
-
app.post('/v1/auth/siwe', policy_public, OpenApi.
|
|
532
|
-
code: 'body_invalid',
|
|
533
|
-
message: 'Invalid request body',
|
|
534
|
-
}), OpenApi.describeRoute({
|
|
726
|
+
app.post('/v1/auth/siwe', policy_public, OpenApi.documentJsonRequest(schema.verify.Body), validateJsonRequest(schema.verify.Body), OpenApi.describeRoute({
|
|
535
727
|
description: 'Verifies the signed challenge and establishes a session. Sets a session cookie by default; pass `returnToken` to receive a bearer token instead.',
|
|
536
728
|
hide: false,
|
|
537
729
|
operationId: 'verifySiwe',
|
|
@@ -557,35 +749,257 @@ export function install(options) {
|
|
|
557
749
|
summary: 'Authenticate (SIWE)',
|
|
558
750
|
tags: ['Authentication'],
|
|
559
751
|
}));
|
|
560
|
-
|
|
561
|
-
|
|
752
|
+
if (identity)
|
|
753
|
+
app.post('/v1/auth/identity', policy_public, OpenApi.documentJsonRequest(schema.identity.Body), validateJsonRequest(schema.identity.Body), OpenApi.describeRoute({
|
|
754
|
+
description: 'Verifies a Wallet-issued OpenID Connect identity token and establishes a session.',
|
|
755
|
+
hide: false,
|
|
756
|
+
operationId: 'verifyIdentity',
|
|
757
|
+
responses: {
|
|
758
|
+
200: {
|
|
759
|
+
content: {
|
|
760
|
+
'application/json': { schema: OpenApi.resolver(schema.identity.Response) },
|
|
761
|
+
},
|
|
762
|
+
description: 'Session established.',
|
|
763
|
+
headers: {
|
|
764
|
+
...OpenApi.successHeaders,
|
|
765
|
+
'Set-Cookie': {
|
|
766
|
+
description: `Session cookie (${identityCookieName}).`,
|
|
767
|
+
schema: { type: 'string' },
|
|
768
|
+
},
|
|
769
|
+
},
|
|
770
|
+
},
|
|
771
|
+
400: OpenApi.standardError(400, 'Malformed request body.', ['body_invalid']),
|
|
772
|
+
401: OpenApi.standardError(401, 'Identity verification failed.', ['identity_invalid']),
|
|
773
|
+
429: OpenApi.standardError(429, 'Rate limited.'),
|
|
774
|
+
500: OpenApi.standardError(500, 'Internal server error.'),
|
|
775
|
+
},
|
|
776
|
+
summary: 'Authenticate identity',
|
|
777
|
+
tags: ['Authentication'],
|
|
778
|
+
}), async (c) => {
|
|
779
|
+
const { idToken } = schema.identity.Body.parse(await c.req.json());
|
|
780
|
+
const claims = await Accounts.Identity.verify(idToken, {
|
|
781
|
+
audience: identity.audience,
|
|
782
|
+
issuer: identity.issuer ?? walletIdentityIssuer,
|
|
783
|
+
}).catch((error) => {
|
|
784
|
+
// Issuer and network failures must reach the request error signal.
|
|
785
|
+
if (isIdentityTokenError(error))
|
|
786
|
+
return undefined;
|
|
787
|
+
throw error;
|
|
788
|
+
});
|
|
789
|
+
if (!claims || !Address.validate(claims.subject, { strict: false }))
|
|
790
|
+
return Response.error(c, {
|
|
791
|
+
code: 'identity_invalid',
|
|
792
|
+
message: 'Invalid identity token',
|
|
793
|
+
status: 401,
|
|
794
|
+
});
|
|
795
|
+
const address = Address.checksum(claims.subject);
|
|
796
|
+
await Users.upsertByAddress(Db.get(db), { address });
|
|
797
|
+
const issuedAt = Math.floor(Date.now() / 1_000);
|
|
798
|
+
const token = Hex.fromBytes(crypto.getRandomValues(new Uint8Array(32))).slice(2);
|
|
799
|
+
await kv.store.put(identitySessionKey(token), JSON.stringify({
|
|
800
|
+
address,
|
|
801
|
+
...(claims.email ? { email: claims.email } : {}),
|
|
802
|
+
expiresAt: issuedAt + identitySessionTtl,
|
|
803
|
+
issuedAt,
|
|
804
|
+
}), { ttl: identitySessionTtl * 1_000 });
|
|
805
|
+
setCookie(c, identityCookieName, token, {
|
|
806
|
+
httpOnly: true,
|
|
807
|
+
maxAge: identitySessionTtl,
|
|
808
|
+
path: '/',
|
|
809
|
+
sameSite: 'Lax',
|
|
810
|
+
secure: new URL(c.req.url).protocol === 'https:',
|
|
811
|
+
});
|
|
812
|
+
return c.json({}, 200);
|
|
813
|
+
});
|
|
814
|
+
app.post('/v1/auth/logout', policy(false), createMiddleware(async (c, next) => {
|
|
815
|
+
const auth = c.get('auth');
|
|
816
|
+
const principal = principalFromPublic(c, auth);
|
|
817
|
+
const result = await consumeRateLimit(auth, {
|
|
818
|
+
key: `public:${principal.id}`,
|
|
819
|
+
limit: auth.publicRateLimit ?? defaultPublicRateLimit,
|
|
820
|
+
});
|
|
821
|
+
if (result) {
|
|
822
|
+
setRateLimitHeaders(c, result);
|
|
823
|
+
if (!result.allowed)
|
|
824
|
+
return rateLimitExceeded(c, result);
|
|
825
|
+
}
|
|
826
|
+
c.set('principal', principal);
|
|
827
|
+
await next();
|
|
828
|
+
return undefined;
|
|
829
|
+
}), OpenApi.describeRoute({
|
|
830
|
+
description: 'Revokes auth sessions and clears their cookies.',
|
|
562
831
|
hide: false,
|
|
563
|
-
operationId: '
|
|
832
|
+
operationId: 'logout',
|
|
564
833
|
responses: {
|
|
565
|
-
204: { description: '
|
|
834
|
+
204: { description: 'Sessions revoked and cookies cleared.' },
|
|
566
835
|
429: OpenApi.standardError(429, 'Rate limited.'),
|
|
567
|
-
500: OpenApi.standardError(500, '
|
|
836
|
+
500: OpenApi.standardError(500, 'Session logout failed.', ['session_logout_failed']),
|
|
568
837
|
},
|
|
569
838
|
summary: 'Sign out',
|
|
570
839
|
tags: ['Authentication'],
|
|
571
|
-
}))
|
|
840
|
+
}), async (c) => {
|
|
841
|
+
const walletHeaders = (() => {
|
|
842
|
+
const authorization = c.req.header('authorization');
|
|
843
|
+
const cookie = c.req.header('cookie');
|
|
844
|
+
if (!authorization?.match(/^Bearer\s+.+$/i) || !cookie?.match(/(?:^|;\s*)accounts_auth=/))
|
|
845
|
+
return [c.req.raw.headers];
|
|
846
|
+
const bearer = new Headers(c.req.raw.headers);
|
|
847
|
+
bearer.delete('cookie');
|
|
848
|
+
const cookie_ = new Headers(c.req.raw.headers);
|
|
849
|
+
cookie_.delete('authorization');
|
|
850
|
+
return [bearer, cookie_];
|
|
851
|
+
})();
|
|
852
|
+
const [betterAuth, identityLogout, ...accounts] = await Promise.allSettled([
|
|
853
|
+
BetterAuth.fromContext(c, options_betterAuth).api.signOut({
|
|
854
|
+
headers: c.req.raw.headers,
|
|
855
|
+
returnHeaders: true,
|
|
856
|
+
}),
|
|
857
|
+
(async () => {
|
|
858
|
+
const token = getCookie(c, identityCookieName);
|
|
859
|
+
deleteCookie(c, identityCookieName, { path: '/' });
|
|
860
|
+
if (token)
|
|
861
|
+
await kv.store.delete(identitySessionKey(token));
|
|
862
|
+
})(),
|
|
863
|
+
...walletHeaders.map((headers) => handler.request(new Request(new URL('/logout', c.req.url), {
|
|
864
|
+
headers,
|
|
865
|
+
method: 'POST',
|
|
866
|
+
}))),
|
|
867
|
+
]);
|
|
868
|
+
if (betterAuth.status === 'fulfilled')
|
|
869
|
+
for (const cookie of splitSetCookieHeader(betterAuth.value.headers.get('Set-Cookie') ?? ''))
|
|
870
|
+
c.header('Set-Cookie', cookie, { append: true });
|
|
871
|
+
for (const result of accounts)
|
|
872
|
+
if (result.status === 'fulfilled')
|
|
873
|
+
for (const cookie of splitSetCookieHeader(result.value.headers.get('Set-Cookie') ?? ''))
|
|
874
|
+
c.header('Set-Cookie', cookie, { append: true });
|
|
875
|
+
const error = (() => {
|
|
876
|
+
const rejected = [betterAuth, identityLogout, ...accounts].find((result) => result.status === 'rejected');
|
|
877
|
+
if (rejected?.status === 'rejected')
|
|
878
|
+
return rejected.reason instanceof Error
|
|
879
|
+
? rejected.reason
|
|
880
|
+
: new Error('Session logout failed', { cause: rejected.reason });
|
|
881
|
+
const failed = accounts.find((result) => result.status === 'fulfilled' && !result.value.ok);
|
|
882
|
+
if (failed?.status === 'fulfilled')
|
|
883
|
+
return new Error(`Accounts session logout failed with status ${failed.value.status}`);
|
|
884
|
+
return undefined;
|
|
885
|
+
})();
|
|
886
|
+
if (error) {
|
|
887
|
+
c.error = error;
|
|
888
|
+
return Response.error(c, {
|
|
889
|
+
code: 'session_logout_failed',
|
|
890
|
+
message: 'Session logout failed',
|
|
891
|
+
status: 500,
|
|
892
|
+
});
|
|
893
|
+
}
|
|
894
|
+
return c.body(null, 204);
|
|
895
|
+
});
|
|
896
|
+
app.route('/v1/auth/siwe', handler);
|
|
897
|
+
app.on(['GET', 'POST'], '/v1/auth/*', policy_public, describe, async (c, next) => {
|
|
898
|
+
if (c.req.method === 'POST' &&
|
|
899
|
+
stripBasePath(c.req.path, basePath(c)) === '/v1/auth/email-otp/send-verification-otp') {
|
|
900
|
+
const body = await c.req.raw
|
|
901
|
+
.clone()
|
|
902
|
+
.json()
|
|
903
|
+
.catch(() => undefined);
|
|
904
|
+
if (body && typeof body === 'object' && 'type' in body && body.type !== 'sign-in')
|
|
905
|
+
return Response.error(c, {
|
|
906
|
+
code: 'body_invalid',
|
|
907
|
+
message: 'Only sign-in OTPs are supported',
|
|
908
|
+
status: 400,
|
|
909
|
+
});
|
|
910
|
+
}
|
|
911
|
+
const response = await BetterAuth.fromContext(c, options_betterAuth).handler(BetterAuth.request(c, options_betterAuth));
|
|
912
|
+
// Leave unmatched paths available to auth providers mounted by the host app.
|
|
913
|
+
return response.status === 404 ? next() : response;
|
|
914
|
+
});
|
|
572
915
|
return Object.assign(
|
|
573
916
|
// The tag joins the `Management API` group at `management()`'s chosen slot;
|
|
574
917
|
// group listings filter to defined tags, so it drops out when unmounted.
|
|
575
|
-
Metadata.attach(app
|
|
918
|
+
Metadata.attach(app, {
|
|
919
|
+
securitySchemes: {
|
|
920
|
+
session: {
|
|
921
|
+
description: 'Session cookie established by email OTP, Wallet identity, or SIWE sign-in. Browsers send `tempo_auth.session_token`, `tempo_identity`, or `accounts_auth`; Accounts sessions may also use `Authorization: Bearer <token>`.', // prettier-ignore
|
|
922
|
+
in: 'header',
|
|
923
|
+
name: 'Cookie',
|
|
924
|
+
type: 'apiKey',
|
|
925
|
+
},
|
|
926
|
+
},
|
|
576
927
|
tags: [{ name: 'Authentication', description: 'Authenticate into the Tempo Platform.' }],
|
|
577
928
|
}), { session });
|
|
578
929
|
})();
|
|
930
|
+
const resolve = createApiKeyResolver({
|
|
931
|
+
apiKey: options_middleware.apiKey,
|
|
932
|
+
db: options.db,
|
|
933
|
+
scopeCatalog,
|
|
934
|
+
});
|
|
935
|
+
const defaults = laneDefaults(options_middleware);
|
|
936
|
+
const base = {};
|
|
937
|
+
const edgeRateLimit = (() => {
|
|
938
|
+
if (options.auth === false || !options_edgeRateLimit)
|
|
939
|
+
return undefined;
|
|
940
|
+
const superAdminTokenHash = options_middleware.superAdmin?.secret
|
|
941
|
+
? ApiKey.hash(options_middleware.superAdmin.secret)
|
|
942
|
+
: undefined;
|
|
943
|
+
return createMiddleware(async (c, next) => {
|
|
944
|
+
const credential = getApiKeyCredential(c);
|
|
945
|
+
const resolved = resolveRequestPolicy(c, { base, defaults, options: options_middleware });
|
|
946
|
+
const isSuperAdmin = credential &&
|
|
947
|
+
superAdminTokenHash !== undefined &&
|
|
948
|
+
ApiKey.hash(credential.token) === superAdminTokenHash;
|
|
949
|
+
const canUseApiKeyQuota = credential &&
|
|
950
|
+
!isSuperAdmin &&
|
|
951
|
+
!hasPaymentCredential(c) &&
|
|
952
|
+
options_middleware.apiKey !== false &&
|
|
953
|
+
resolved?.policy?.apiKey &&
|
|
954
|
+
(!resolved.management || (options_middleware.mpp !== false && resolved.policy.mpp));
|
|
955
|
+
const cached = canUseApiKeyQuota ? resolve.peek(c, credential.token) : undefined;
|
|
956
|
+
if (cached)
|
|
957
|
+
return next();
|
|
958
|
+
const response = await Timing.time(c, 'edge_rate_limit', () => options_edgeRateLimit(c.req.raw));
|
|
959
|
+
if (response)
|
|
960
|
+
return response;
|
|
961
|
+
if (canUseApiKeyQuota && cached === undefined)
|
|
962
|
+
await resolve.resolve(c, credential.token);
|
|
963
|
+
return next();
|
|
964
|
+
});
|
|
965
|
+
})();
|
|
579
966
|
const middleware_ = options.auth === false
|
|
580
967
|
? undefined
|
|
581
|
-
:
|
|
968
|
+
: createAuthMiddleware({
|
|
582
969
|
...options_middleware,
|
|
583
970
|
...(app ? { session: app.session } : {}),
|
|
584
971
|
scopeCatalog,
|
|
585
|
-
});
|
|
586
|
-
return { app, middleware: middleware_ };
|
|
972
|
+
}, resolve);
|
|
973
|
+
return { app, edgeRateLimit, middleware: middleware_ };
|
|
587
974
|
}
|
|
588
|
-
|
|
975
|
+
function validateJsonRequest(schema) {
|
|
976
|
+
return async (c, next) => {
|
|
977
|
+
if (!c.req.header('content-type')?.toLowerCase().startsWith('application/json'))
|
|
978
|
+
return Response.error(c, {
|
|
979
|
+
code: 'body_invalid',
|
|
980
|
+
message: 'Invalid request body',
|
|
981
|
+
status: 400,
|
|
982
|
+
});
|
|
983
|
+
const value = await (async () => {
|
|
984
|
+
try {
|
|
985
|
+
return await c.req.raw.clone().json();
|
|
986
|
+
}
|
|
987
|
+
catch {
|
|
988
|
+
return undefined;
|
|
989
|
+
}
|
|
990
|
+
})();
|
|
991
|
+
const result = schema.safeParse(value);
|
|
992
|
+
if (!result.success)
|
|
993
|
+
return Response.error(c, {
|
|
994
|
+
code: 'body_invalid',
|
|
995
|
+
details: Response.validationDetails(result.error.issues),
|
|
996
|
+
message: 'Invalid request body',
|
|
997
|
+
status: 400,
|
|
998
|
+
});
|
|
999
|
+
return next();
|
|
1000
|
+
};
|
|
1001
|
+
}
|
|
1002
|
+
/** Creates route middleware that contributes an auth policy override, or bypasses auth when passed `false`. */
|
|
589
1003
|
export function policy(options) {
|
|
590
1004
|
const middleware = createMiddleware((_, next) => next());
|
|
591
1005
|
middleware[policySymbol] = options;
|
|
@@ -601,7 +1015,7 @@ export function installMppManagementRoutes(app, options = {}) {
|
|
|
601
1015
|
continue;
|
|
602
1016
|
const target = targets.get(route.path) ?? { path: route.path };
|
|
603
1017
|
const override = policyFromRoute(route);
|
|
604
|
-
if (override
|
|
1018
|
+
if (override && override.mpp !== undefined)
|
|
605
1019
|
target.mpp = resolveMppLane(target.mpp, override.mpp, { session: {} });
|
|
606
1020
|
const spec = openApiSpec(route);
|
|
607
1021
|
if (spec) {
|
|
@@ -624,7 +1038,9 @@ export function installMppManagementRoutes(app, options = {}) {
|
|
|
624
1038
|
continue;
|
|
625
1039
|
if (postPaths.has(target.path))
|
|
626
1040
|
throw new Error(`MPP management POST conflicts with an existing route: ${target.path}`);
|
|
627
|
-
const management = policy({
|
|
1041
|
+
const management = policy({
|
|
1042
|
+
mpp: { session: mpp.session },
|
|
1043
|
+
});
|
|
628
1044
|
management[mppManagementSymbol] = { description: target.description };
|
|
629
1045
|
app.post(stripBasePath(target.path, options.basePath), management, OpenApi.describeRoute({ hide: true }));
|
|
630
1046
|
}
|
|
@@ -646,7 +1062,7 @@ function laneDefaults(options) {
|
|
|
646
1062
|
scopes: apiKey?.scopes ?? [Scope.wildcard],
|
|
647
1063
|
},
|
|
648
1064
|
mpp: { session: {} },
|
|
649
|
-
public: { rateLimit: public_?.rateLimit ??
|
|
1065
|
+
public: { rateLimit: public_?.rateLimit ?? defaultPublicRateLimit },
|
|
650
1066
|
session: true,
|
|
651
1067
|
};
|
|
652
1068
|
}
|
|
@@ -699,6 +1115,7 @@ function resolveApiKeyLane(current, override, default_) {
|
|
|
699
1115
|
return current ?? default_;
|
|
700
1116
|
const base = current ?? default_;
|
|
701
1117
|
return {
|
|
1118
|
+
bucket: override.bucket ?? base.bucket,
|
|
702
1119
|
rateLimit: override.rateLimit ?? base.rateLimit,
|
|
703
1120
|
scopes: override.scopes ?? base.scopes,
|
|
704
1121
|
};
|
|
@@ -712,6 +1129,7 @@ function resolveMppLane(current, override, default_) {
|
|
|
712
1129
|
return current ?? default_;
|
|
713
1130
|
const base = current ?? default_;
|
|
714
1131
|
return {
|
|
1132
|
+
bucket: override.bucket ?? base.bucket,
|
|
715
1133
|
rateLimit: override.rateLimit ?? base.rateLimit,
|
|
716
1134
|
session: { ...base.session, ...override.session },
|
|
717
1135
|
};
|
|
@@ -724,7 +1142,10 @@ function resolvePublicLane(current, override, default_) {
|
|
|
724
1142
|
if (override === true)
|
|
725
1143
|
return current ?? default_;
|
|
726
1144
|
const base = current ?? default_;
|
|
727
|
-
return {
|
|
1145
|
+
return {
|
|
1146
|
+
bucket: override.bucket ?? base.bucket,
|
|
1147
|
+
rateLimit: override.rateLimit ?? base.rateLimit,
|
|
1148
|
+
};
|
|
728
1149
|
}
|
|
729
1150
|
function resolveSessionLane(current, override, default_) {
|
|
730
1151
|
if (override === undefined)
|
|
@@ -796,7 +1217,7 @@ export function describeAccess(app) {
|
|
|
796
1217
|
if (typeof spec?.operationId === 'string')
|
|
797
1218
|
group.operationId = spec.operationId;
|
|
798
1219
|
const override = policyFromRoute(route);
|
|
799
|
-
if (override)
|
|
1220
|
+
if (override !== undefined)
|
|
800
1221
|
group.overrides.push(override);
|
|
801
1222
|
groups.set(key, group);
|
|
802
1223
|
}
|
|
@@ -809,7 +1230,12 @@ export function describeAccess(app) {
|
|
|
809
1230
|
let public_ = false;
|
|
810
1231
|
let mpp = false;
|
|
811
1232
|
let session = false;
|
|
1233
|
+
let bypass = false;
|
|
812
1234
|
for (const override of overrides) {
|
|
1235
|
+
if (override === false) {
|
|
1236
|
+
bypass = true;
|
|
1237
|
+
break;
|
|
1238
|
+
}
|
|
813
1239
|
if (override.apiKey !== undefined)
|
|
814
1240
|
apiKey = override.apiKey !== false;
|
|
815
1241
|
if (override.apiKey && override.apiKey !== true && override.apiKey.scopes)
|
|
@@ -821,7 +1247,14 @@ export function describeAccess(app) {
|
|
|
821
1247
|
if (override.session !== undefined)
|
|
822
1248
|
session = override.session !== false;
|
|
823
1249
|
}
|
|
824
|
-
access[operationId] = {
|
|
1250
|
+
access[operationId] = {
|
|
1251
|
+
apiKey,
|
|
1252
|
+
...(bypass ? { bypass: true } : {}),
|
|
1253
|
+
mpp,
|
|
1254
|
+
public: public_,
|
|
1255
|
+
scopes: apiKey ? scopes : [],
|
|
1256
|
+
session,
|
|
1257
|
+
};
|
|
825
1258
|
}
|
|
826
1259
|
return access;
|
|
827
1260
|
}
|
|
@@ -862,14 +1295,17 @@ export function require(policy) {
|
|
|
862
1295
|
const hasQueryApiKey = new URL(c.req.url).searchParams.has('key');
|
|
863
1296
|
// Auth owns `key`; strict route schemas must not validate it.
|
|
864
1297
|
stripApiKeyQuery(c);
|
|
865
|
-
// Reject unknown chains before MPP builds a chain-bound challenge. Route
|
|
866
|
-
// groups publish their supported chains into the shared app context.
|
|
867
1298
|
const chainId = explicitChainId(c);
|
|
868
1299
|
const supportedChainIds = c.var['supportedChainIds'];
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
1300
|
+
const unsupportedChain = (() => {
|
|
1301
|
+
if (chainId === undefined ||
|
|
1302
|
+
!(supportedChainIds instanceof Set) ||
|
|
1303
|
+
supportedChainIds.has(chainId))
|
|
1304
|
+
return undefined;
|
|
1305
|
+
return { chainId, supportedChainIds };
|
|
1306
|
+
})();
|
|
1307
|
+
if (unsupportedChain && !credential)
|
|
1308
|
+
return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
|
|
873
1309
|
const proceed = async () => {
|
|
874
1310
|
await next();
|
|
875
1311
|
// Query credential responses must not enter shared caches.
|
|
@@ -890,11 +1326,15 @@ export function require(policy) {
|
|
|
890
1326
|
// The super admin secret precedes key lookup: it is not a stored key.
|
|
891
1327
|
// It must never reach KV resolution or scope/quota checks.
|
|
892
1328
|
if (auth.superAdmin && ApiKey.hash(credential.token) === auth.superAdmin.tokenHash) {
|
|
1329
|
+
if (unsupportedChain)
|
|
1330
|
+
return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
|
|
893
1331
|
c.set('principal', { actor: 'super_admin', id: 'super_admin', type: 'super_admin' });
|
|
894
1332
|
return proceed();
|
|
895
1333
|
}
|
|
896
1334
|
const apiKey_resolved = await auth.apiKey?.resolve(c, credential.token);
|
|
897
1335
|
if (!apiKey_resolved) {
|
|
1336
|
+
if (unsupportedChain)
|
|
1337
|
+
return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
|
|
898
1338
|
// A bearer session token is indistinguishable from an API key at the
|
|
899
1339
|
// header, so a failed key lookup falls through to the session lane
|
|
900
1340
|
// before rejecting.
|
|
@@ -931,6 +1371,28 @@ export function require(policy) {
|
|
|
931
1371
|
message: 'API key not permitted for this route',
|
|
932
1372
|
status: 403,
|
|
933
1373
|
});
|
|
1374
|
+
// Non-paid requests consume API-key quota before rejection. Paid
|
|
1375
|
+
// requests use the MPP quota after access checks.
|
|
1376
|
+
const scope = policy.apiKey.scopes[0] ?? Scope.wildcard;
|
|
1377
|
+
const throttled = apiKey.environment === 'sandbox' && apiKey.billingActive !== true;
|
|
1378
|
+
const limit = throttled
|
|
1379
|
+
? (policy.public?.rateLimit ?? auth.publicRateLimit ?? { limit: 60, period: 'minute' })
|
|
1380
|
+
: resolveApiKeyLimit({ apiKey, auth, policy: policy.apiKey, scope });
|
|
1381
|
+
const paid = hasPayment && !throttled;
|
|
1382
|
+
const result = paid
|
|
1383
|
+
? null
|
|
1384
|
+
: await consumeRateLimit(auth, {
|
|
1385
|
+
key: rateLimitKey(`api_key:${apiKey.id}:scope:${scope}`, policy.apiKey.bucket),
|
|
1386
|
+
limit,
|
|
1387
|
+
});
|
|
1388
|
+
if (result) {
|
|
1389
|
+
setRateLimitHeaders(c, result);
|
|
1390
|
+
// Surface the bucket so callers can correlate a 429 with the exhausted
|
|
1391
|
+
// quota. MPP challenges own their headers and drop these by design.
|
|
1392
|
+
c.header('RateLimit-Scope', scope);
|
|
1393
|
+
}
|
|
1394
|
+
if (unsupportedChain)
|
|
1395
|
+
return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
|
|
934
1396
|
if (apiKey.allowedIps.length &&
|
|
935
1397
|
!(await IpAllowlist.allows(c, {
|
|
936
1398
|
address: trustedClientIp(c, auth),
|
|
@@ -958,53 +1420,25 @@ export function require(policy) {
|
|
|
958
1420
|
message: 'API key missing required scope',
|
|
959
1421
|
status: 403,
|
|
960
1422
|
});
|
|
961
|
-
|
|
962
|
-
// `billingActive` is snapshotted on the key record (stamped at mint,
|
|
963
|
-
// re-synced when billing changes), so this needs no billing read on the
|
|
964
|
-
// request path. Resolved before the paid lane so a payment credential
|
|
965
|
-
// can't buy past the throttle: sandbox is non-billable testnet.
|
|
966
|
-
const throttled = apiKey.environment === 'sandbox' && apiKey.billingActive !== true;
|
|
967
|
-
if (hasPayment && !throttled)
|
|
1423
|
+
if (paid)
|
|
968
1424
|
return requirePayment(c, proceed, {
|
|
969
1425
|
auth,
|
|
970
1426
|
payment: { reason: 'api_key_over_quota', type: 'mpp' },
|
|
971
1427
|
policy,
|
|
972
1428
|
principal,
|
|
973
1429
|
});
|
|
974
|
-
if (
|
|
975
|
-
// A
|
|
976
|
-
//
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
key: `api_key:${apiKey.id}:scope:${scope}`,
|
|
986
|
-
limit,
|
|
1430
|
+
if (result && !result.allowed) {
|
|
1431
|
+
// A throttled sandbox key gets a plain 429, never an MPP challenge. It
|
|
1432
|
+
// must activate billing to lift the ceiling, not pay per request.
|
|
1433
|
+
if (throttled)
|
|
1434
|
+
return rateLimitExceeded(c, result);
|
|
1435
|
+
return requirePaymentOrRateLimit(c, proceed, {
|
|
1436
|
+
auth,
|
|
1437
|
+
payment: { reason: 'api_key_over_quota', type: 'mpp' },
|
|
1438
|
+
policy,
|
|
1439
|
+
principal,
|
|
1440
|
+
rateLimit: result,
|
|
987
1441
|
});
|
|
988
|
-
if (result) {
|
|
989
|
-
setRateLimitHeaders(c, result);
|
|
990
|
-
// Surface the bucket so callers can correlate a 429 with the exhausted
|
|
991
|
-
// quota. Set before the over-quota branch so it rides the 429 (an MPP
|
|
992
|
-
// 402 challenge is owned by mppx and drops these headers — by design).
|
|
993
|
-
c.header('RateLimit-Scope', scope);
|
|
994
|
-
}
|
|
995
|
-
if (result && !result.allowed) {
|
|
996
|
-
// A throttled sandbox key gets a plain 429, never an MPP challenge —
|
|
997
|
-
// it must activate billing to lift the ceiling, not pay per request.
|
|
998
|
-
if (throttled)
|
|
999
|
-
return rateLimitExceeded(c, result);
|
|
1000
|
-
return requirePaymentOrRateLimit(c, proceed, {
|
|
1001
|
-
auth,
|
|
1002
|
-
payment: { reason: 'api_key_over_quota', type: 'mpp' },
|
|
1003
|
-
policy,
|
|
1004
|
-
principal,
|
|
1005
|
-
rateLimit: result,
|
|
1006
|
-
});
|
|
1007
|
-
}
|
|
1008
1442
|
}
|
|
1009
1443
|
return proceed();
|
|
1010
1444
|
}
|
|
@@ -1031,7 +1465,7 @@ export function require(policy) {
|
|
|
1031
1465
|
const limit = policy.public?.rateLimit;
|
|
1032
1466
|
if (limit) {
|
|
1033
1467
|
const result = await consumeRateLimit(auth, {
|
|
1034
|
-
key: `public:${publicPrincipal.id}`,
|
|
1468
|
+
key: rateLimitKey(`public:${publicPrincipal.id}`, policy.public?.bucket),
|
|
1035
1469
|
limit,
|
|
1036
1470
|
});
|
|
1037
1471
|
if (result)
|
|
@@ -1074,7 +1508,8 @@ export function require(policy) {
|
|
|
1074
1508
|
* server-side — we just stop waiting for it.
|
|
1075
1509
|
*/
|
|
1076
1510
|
const rateLimitConsumeTimeout = 300;
|
|
1077
|
-
|
|
1511
|
+
/** Consumes one quota and returns null when its counter is unavailable, allowing callers to fail open. */
|
|
1512
|
+
export function consumeRateLimit(auth, options) {
|
|
1078
1513
|
if (!auth.rateLimit)
|
|
1079
1514
|
return Promise.resolve(null);
|
|
1080
1515
|
// Fail open: a rate-limit store error (e.g. a lost Durable Object connection)
|
|
@@ -1157,15 +1592,19 @@ function getApiKeyCredential(c) {
|
|
|
1157
1592
|
return null;
|
|
1158
1593
|
}
|
|
1159
1594
|
function clientIp(c, auth) {
|
|
1160
|
-
return
|
|
1595
|
+
return (trustedClientIps.get(c.req.raw) ??
|
|
1596
|
+
(auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip')));
|
|
1161
1597
|
}
|
|
1162
1598
|
function trustedClientIp(c, auth) {
|
|
1163
|
-
|
|
1164
|
-
|
|
1599
|
+
return trustedClientIps.get(c.req.raw) ?? resolveTrustedClientIp(c.req.raw, auth.publicClientIp);
|
|
1600
|
+
}
|
|
1601
|
+
function resolveTrustedClientIp(request, resolve) {
|
|
1602
|
+
if (resolve)
|
|
1603
|
+
return resolve(request);
|
|
1165
1604
|
// Cloudflare supplies both the request metadata and this header.
|
|
1166
|
-
if (!('cf' in
|
|
1605
|
+
if (!('cf' in request))
|
|
1167
1606
|
return undefined;
|
|
1168
|
-
return
|
|
1607
|
+
return request.headers.get('cf-connecting-ip') ?? undefined;
|
|
1169
1608
|
}
|
|
1170
1609
|
/** Removes the reserved auth query parameter before route validation. */
|
|
1171
1610
|
function stripApiKeyQuery(c) {
|
|
@@ -1279,7 +1718,7 @@ function principalFromPublic(c, auth) {
|
|
|
1279
1718
|
async function requirePayment(c, next, options) {
|
|
1280
1719
|
if (hasPaymentCredential(c)) {
|
|
1281
1720
|
const result = await consumeRateLimit(options.auth, {
|
|
1282
|
-
key: `mpp:${options.principal.type}:${options.principal.id}`,
|
|
1721
|
+
key: rateLimitKey(`mpp:${options.principal.type}:${options.principal.id}`, options.policy.mpp?.bucket),
|
|
1283
1722
|
limit: options.policy.mpp?.rateLimit ?? options.auth.mpp?.rateLimit ?? defaultMppRateLimit,
|
|
1284
1723
|
});
|
|
1285
1724
|
if (result) {
|
|
@@ -1329,6 +1768,9 @@ function requirePaymentOrRateLimit(c, next, options) {
|
|
|
1329
1768
|
return requirePayment(c, next, options);
|
|
1330
1769
|
return rateLimitExceeded(c, options.rateLimit);
|
|
1331
1770
|
}
|
|
1771
|
+
function rateLimitKey(key, bucket) {
|
|
1772
|
+
return bucket === undefined ? key : `${key}:bucket:${bucket}`;
|
|
1773
|
+
}
|
|
1332
1774
|
/** Emits a `429` with a `Retry-After` derived from the window reset. */
|
|
1333
1775
|
function rateLimitExceeded(c, result) {
|
|
1334
1776
|
c.header('Retry-After', String(Math.max(result.reset - Math.ceil(Date.now() / 1_000), 1)));
|
|
@@ -1348,19 +1790,13 @@ function setRateLimitHeaders(c, result) {
|
|
|
1348
1790
|
function contextKv(c) {
|
|
1349
1791
|
return c.get('kv');
|
|
1350
1792
|
}
|
|
1351
|
-
// Resolve the session lane from the auth context's capability.
|
|
1352
|
-
//
|
|
1793
|
+
// Resolve the session lane from the auth context's capability. Dependency
|
|
1794
|
+
// failures propagate to the app error boundary instead of becoming a `401`.
|
|
1353
1795
|
async function resolveSession(c, auth) {
|
|
1354
1796
|
const session = auth.session;
|
|
1355
1797
|
if (!session)
|
|
1356
1798
|
return null;
|
|
1357
|
-
|
|
1358
|
-
return await session.resolve(c);
|
|
1359
|
-
}
|
|
1360
|
-
catch (error) {
|
|
1361
|
-
console.error('[auth] session resolve failed; treating as no session', error);
|
|
1362
|
-
return null;
|
|
1363
|
-
}
|
|
1799
|
+
return session.resolve(c);
|
|
1364
1800
|
}
|
|
1365
1801
|
/** Maximum resolve-cache entries held per isolate before eviction. */
|
|
1366
1802
|
const cachedMaxEntries = 10_000;
|
|
@@ -1377,39 +1813,54 @@ function cachedResolve(resolve, options) {
|
|
|
1377
1813
|
const { negativeTtl = 10_000, now = Date.now, ttl = 60_000 } = options;
|
|
1378
1814
|
const cells = new Map();
|
|
1379
1815
|
const flights = new Map();
|
|
1380
|
-
return
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1816
|
+
return {
|
|
1817
|
+
invalidate(token) {
|
|
1818
|
+
cells.delete(`v1:${ApiKey.hash(token)}`);
|
|
1819
|
+
},
|
|
1820
|
+
peek(token) {
|
|
1821
|
+
const key = `v1:${ApiKey.hash(token)}`;
|
|
1822
|
+
const cell = cells.get(key);
|
|
1823
|
+
if (!cell)
|
|
1824
|
+
return undefined;
|
|
1825
|
+
if (cell.expiresAt > now())
|
|
1826
|
+
return cell.value;
|
|
1387
1827
|
cells.delete(key);
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
const
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1828
|
+
return undefined;
|
|
1829
|
+
},
|
|
1830
|
+
async resolve(c, token) {
|
|
1831
|
+
// Versioned so a future record-shape change can't serve stale shapes.
|
|
1832
|
+
const key = `v1:${ApiKey.hash(token)}`;
|
|
1833
|
+
const cell = cells.get(key);
|
|
1834
|
+
if (cell && cell.expiresAt > now())
|
|
1835
|
+
return cell.value;
|
|
1836
|
+
if (cell)
|
|
1837
|
+
cells.delete(key);
|
|
1838
|
+
const existing = flights.get(key);
|
|
1839
|
+
if (existing)
|
|
1840
|
+
return existing;
|
|
1841
|
+
const flight = (async () => {
|
|
1842
|
+
const value = await resolve(c, token);
|
|
1843
|
+
// Bound the cache: random invalid tokens each add a (negative) entry,
|
|
1844
|
+
// so sweep expired cells at the cap and then drop the oldest.
|
|
1845
|
+
if (cells.size >= cachedMaxEntries) {
|
|
1846
|
+
const time = now();
|
|
1847
|
+
for (const [name, entry] of cells)
|
|
1848
|
+
if (entry.expiresAt <= time)
|
|
1849
|
+
cells.delete(name);
|
|
1850
|
+
while (cells.size >= cachedMaxEntries)
|
|
1851
|
+
cells.delete(cells.keys().next().value);
|
|
1852
|
+
}
|
|
1853
|
+
cells.set(key, { expiresAt: now() + (value ? ttl : negativeTtl), value });
|
|
1854
|
+
return value;
|
|
1855
|
+
})();
|
|
1856
|
+
flights.set(key, flight);
|
|
1857
|
+
try {
|
|
1858
|
+
return await flight;
|
|
1402
1859
|
}
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
try {
|
|
1408
|
-
return await flight;
|
|
1409
|
-
}
|
|
1410
|
-
finally {
|
|
1411
|
-
flights.delete(key);
|
|
1412
|
-
}
|
|
1860
|
+
finally {
|
|
1861
|
+
flights.delete(key);
|
|
1862
|
+
}
|
|
1863
|
+
},
|
|
1413
1864
|
};
|
|
1414
1865
|
}
|
|
1415
1866
|
/** Thrown when a rate-limit consume exceeds {@link rateLimitConsumeTimeout}. */
|