tapimo 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +12457 -10365
- 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 -549
- 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 +159 -7
- 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 +88 -88
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +3 -3
- 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 +129 -69
- 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 +364 -34
- 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 +37 -37
- 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 +5 -0
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +31 -19
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +125 -0
- 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/rpc.d.ts +507 -33
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +266 -156
- 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 +28 -12
- 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 +30 -30
- package/dist/apps/data/routes/verified-tokens.d.ts +9 -9
- 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 +613 -176
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +291 -195
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- 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 +3763 -3385
- 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 +106 -4
- 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 +77 -2
- 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 +4 -4
- 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 +18 -2
- 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 +4 -4
- 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 +2 -2
- package/dist/apps/management/routes/webhooks.d.ts +280 -214
- 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.js +7 -7
- package/dist/apps/mcp.js.map +1 -1
- 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 +7 -7
- 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 +19 -16
- 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 +379 -74
- 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 +1030 -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/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 +48 -12
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +603 -175
- 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 +8 -3
- package/src/admin/apps/verified-tokens.ts +3 -3
- 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/routeTree.gen.ts +63 -0
- package/src/admin/ui/src/routes/__root.tsx +12 -1
- 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_.$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.generated.ts +144 -69
- 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 +154 -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 +224 -0
- package/src/apps/data/routes/fee-amm.ts +191 -160
- 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 +352 -8
- package/src/apps/data/routes/rpc.ts +407 -219
- 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.test.ts +645 -83
- package/src/apps/data/routes/webhooks.ts +1089 -857
- 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/webhooks.test.ts +49 -26
- package/src/apps/management/routes/webhooks.ts +78 -22
- package/src/apps/mcp.test.ts +6 -6
- package/src/apps/mcp.ts +7 -7
- 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 +1476 -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} +316 -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/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 +1564 -9
- package/src/internal/Auth.ts +833 -239
- 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 +165 -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/src/ApiKeys.ts
CHANGED
|
@@ -3,20 +3,36 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Records are keyed by token hash (`ApiKey.keyFor`) — the plaintext token is
|
|
5
5
|
* never stored — and validated against the scope catalog on read; unknown,
|
|
6
|
-
* corrupt, expired, or invalid records resolve to `null`.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
6
|
+
* corrupt, expired, or invalid records resolve to `null`. Mutable billing
|
|
7
|
+
* snapshots persist separately so reconciliation cannot overwrite newer key
|
|
8
|
+
* metadata. An `id → recordKey` index makes revoke-by-id O(1). The persisted
|
|
9
|
+
* {@link Record}/{@link MintInput} shapes live here (derived from
|
|
10
|
+
* `ApiKey.schema` so they cannot drift from the resolved shape), while the
|
|
11
|
+
* shared credential primitives (token format/generation, storage-key
|
|
12
|
+
* derivation, redaction) live in `./ApiKey.js`.
|
|
12
13
|
*/
|
|
13
14
|
|
|
14
15
|
import * as z from 'zod/mini'
|
|
15
16
|
|
|
16
17
|
import * as ApiKey from './ApiKey.js'
|
|
17
|
-
import type * as
|
|
18
|
+
import type * as Db from './db/Db.js'
|
|
19
|
+
import * as ApiKeyAdmissions from './db/tables/apiKeyAdmissions.js'
|
|
20
|
+
import * as ApiKeyOwnerTombstones from './db/tables/apiKeyOwnerTombstones.js'
|
|
21
|
+
import * as ApiKeyRevocations from './db/tables/apiKeyRevocations.js'
|
|
22
|
+
import * as Store from './internal/Store.js'
|
|
18
23
|
import * as Scope from './Scope.js'
|
|
19
24
|
|
|
25
|
+
const billingSnapshotSchema = z.object({
|
|
26
|
+
active: z.boolean().check(z.describe('Whether billing is active.')),
|
|
27
|
+
orgId: z.string().check(z.describe('Organization that produced the snapshot.')),
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
/** Maximum live API keys attributed to one organization. */
|
|
31
|
+
export const maxLiveKeysPerOrganization = 100
|
|
32
|
+
|
|
33
|
+
/** Maximum legacy organization-index entries examined during one admission attempt. */
|
|
34
|
+
export const maxLegacyAdmissionIndexes = 1_000
|
|
35
|
+
|
|
20
36
|
/** Zod schemas owned by the API-keys module. */
|
|
21
37
|
export namespace schema {
|
|
22
38
|
/**
|
|
@@ -29,10 +45,14 @@ export namespace schema {
|
|
|
29
45
|
.optional(z.string())
|
|
30
46
|
.check(z.describe('Identity creating the key (e.g. admin email), recorded for audit.')),
|
|
31
47
|
expiresAt: z
|
|
32
|
-
.optional(z.
|
|
48
|
+
.optional(z.iso.datetime({ offset: true }))
|
|
33
49
|
.check(z.describe('ISO 8601 expiry timestamp. Omit for a non-expiring key.')),
|
|
34
50
|
// TODO: make required once orgs exist.
|
|
35
51
|
orgId: z.optional(z.string()).check(z.describe('Owning organization id.')),
|
|
52
|
+
scopes: z.readonly(z.array(z.string().check(z.minLength(1)))).check(
|
|
53
|
+
z.refine((scopes) => new Set(scopes).size === scopes.length),
|
|
54
|
+
z.describe("Granted scopes. '*' grants all scopes; duplicate scopes are rejected."),
|
|
55
|
+
),
|
|
36
56
|
})
|
|
37
57
|
|
|
38
58
|
/**
|
|
@@ -86,23 +106,27 @@ export async function mint(
|
|
|
86
106
|
input: MintInput,
|
|
87
107
|
options: mint.Options = {},
|
|
88
108
|
): Promise<MintResult> {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
109
|
+
return mintValidated(state, validateMintInput(input, options), ApiKey.generateId())
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function mintValidated(
|
|
113
|
+
state: Store.State,
|
|
114
|
+
data: z.output<typeof schema.MintInput>,
|
|
115
|
+
id: string,
|
|
116
|
+
): Promise<MintResult> {
|
|
117
|
+
const orgId = data.orgId ?? id
|
|
118
|
+
if (await isOwnerDeleted(state, { orgId, projectId: data.projectId }))
|
|
119
|
+
throw new OwnerDeletedError()
|
|
94
120
|
|
|
95
121
|
const time = new Date()
|
|
96
122
|
const token = ApiKey.generateToken(data.environment)
|
|
97
123
|
const recordKey = ApiKey.keyFor(token)
|
|
98
|
-
const id = ApiKey.generateId()
|
|
99
124
|
const record: Record = {
|
|
100
125
|
allowedIps: data.allowedIps,
|
|
101
126
|
createdAt: time.toISOString(),
|
|
102
127
|
environment: data.environment,
|
|
103
128
|
id,
|
|
104
|
-
|
|
105
|
-
orgId: data.orgId ?? id,
|
|
129
|
+
orgId,
|
|
106
130
|
scopes: data.scopes,
|
|
107
131
|
tokenLast4: token.slice(-4),
|
|
108
132
|
...(data.billingActive === undefined ? {} : { billingActive: data.billingActive }),
|
|
@@ -129,6 +153,57 @@ export async function mint(
|
|
|
129
153
|
return { record, token }
|
|
130
154
|
}
|
|
131
155
|
|
|
156
|
+
/** Mints an attributed key after atomically reserving an organization-wide live-key slot. */
|
|
157
|
+
export async function mintBounded(
|
|
158
|
+
db: Db.Db,
|
|
159
|
+
state: Store.State,
|
|
160
|
+
input: MintInput,
|
|
161
|
+
options: mint.Options = {},
|
|
162
|
+
): Promise<MintResult> {
|
|
163
|
+
if (input.orgId === undefined) return mint(state, input, options)
|
|
164
|
+
const orgId = input.orgId
|
|
165
|
+
const data = validateMintInput(input, options)
|
|
166
|
+
const id = ApiKey.generateId()
|
|
167
|
+
const result = await db.transaction(async (tx) => {
|
|
168
|
+
const owner = { orgId, projectId: data.projectId }
|
|
169
|
+
if (!(await ApiKeyOwnerTombstones.lockActive(tx, owner))) throw new OwnerDeletedError()
|
|
170
|
+
await ApiKeyAdmissions.lockOrganization(tx, orgId)
|
|
171
|
+
const legacy = (await ApiKeyAdmissions.isBootstrapped(tx, orgId))
|
|
172
|
+
? { complete: true, records: [] }
|
|
173
|
+
: await admissionRecordsForOrg(state, orgId, options)
|
|
174
|
+
const admitted = await ApiKeyAdmissions.admit(tx, {
|
|
175
|
+
expiresAt: data.expiresAt ?? null,
|
|
176
|
+
id,
|
|
177
|
+
limit: maxLiveKeysPerOrganization,
|
|
178
|
+
legacy: legacy.records,
|
|
179
|
+
legacyComplete: legacy.complete,
|
|
180
|
+
orgId,
|
|
181
|
+
projectId: data.projectId ?? null,
|
|
182
|
+
})
|
|
183
|
+
return admitted ? mintValidated(state, data, id) : null
|
|
184
|
+
})
|
|
185
|
+
if (!result) throw new LiveKeyLimitError(maxLiveKeysPerOrganization)
|
|
186
|
+
return result
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Durably fences key use before deleting its organization or project. The idempotent fence remains on failure so concurrent attempts cannot reopen the owner. */
|
|
190
|
+
export async function markOwnerDeleting(
|
|
191
|
+
state: Store.State,
|
|
192
|
+
owner: markOwnerDeleting.Owner,
|
|
193
|
+
): Promise<void> {
|
|
194
|
+
await state.put(ownerDeletedKey(owner), 'deleting')
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export declare namespace markOwnerDeleting {
|
|
198
|
+
/** API-key owner being deleted. */
|
|
199
|
+
type Owner = {
|
|
200
|
+
/** Owning organization id. */
|
|
201
|
+
orgId: string
|
|
202
|
+
/** Project id when deleting only one project. */
|
|
203
|
+
projectId?: string | undefined
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
132
207
|
export declare namespace mint {
|
|
133
208
|
/** Options for {@link mint}. */
|
|
134
209
|
type Options = {
|
|
@@ -152,7 +227,14 @@ export async function resolve(
|
|
|
152
227
|
token: string,
|
|
153
228
|
options: resolve.Options = {},
|
|
154
229
|
): Promise<ApiKey.ApiKey | null> {
|
|
155
|
-
|
|
230
|
+
const record = await read(
|
|
231
|
+
state,
|
|
232
|
+
ApiKey.keyFor(token),
|
|
233
|
+
Date.now(),
|
|
234
|
+
options.scopeCatalog ?? Scope.catalog,
|
|
235
|
+
)
|
|
236
|
+
if (!record || (await isOwnerDeleted(state, record))) return null
|
|
237
|
+
return record
|
|
156
238
|
}
|
|
157
239
|
|
|
158
240
|
export declare namespace resolve {
|
|
@@ -202,11 +284,20 @@ export async function list(
|
|
|
202
284
|
options: list.Options = {},
|
|
203
285
|
): Promise<readonly Record[]> {
|
|
204
286
|
const { keys } = await state.list({ prefix: ApiKey.recordPrefix })
|
|
205
|
-
const
|
|
287
|
+
const values = await Store.getMany(
|
|
288
|
+
state,
|
|
289
|
+
keys.map(({ name }) => name),
|
|
290
|
+
)
|
|
291
|
+
const now = Date.now()
|
|
292
|
+
const scopeCatalog = options.scopeCatalog ?? Scope.catalog
|
|
293
|
+
const entries: applyBillingOverrides.Entry[] = []
|
|
206
294
|
for (const { name } of keys) {
|
|
207
|
-
const record =
|
|
208
|
-
if (record && (!options.orgId || record.orgId === options.orgId))
|
|
295
|
+
const record = parse(values.get(name) ?? null, now, scopeCatalog)
|
|
296
|
+
if (record && (!options.orgId || record.orgId === options.orgId))
|
|
297
|
+
entries.push({ record, recordKey: name })
|
|
209
298
|
}
|
|
299
|
+
const overrides = await applyBillingOverrides(state, entries)
|
|
300
|
+
const records = [...overrides.values()].filter((record) => record !== null)
|
|
210
301
|
// Newest first; ids are random, so sort by creation time.
|
|
211
302
|
return records.sort((a, b) => b.createdAt.localeCompare(a.createdAt))
|
|
212
303
|
}
|
|
@@ -236,21 +327,83 @@ export async function listByOrg(
|
|
|
236
327
|
orgId: string,
|
|
237
328
|
options: listByOrg.Options = {},
|
|
238
329
|
): Promise<readonly Record[]> {
|
|
239
|
-
|
|
330
|
+
return (
|
|
331
|
+
await listByOrgPage(state, orgId, {
|
|
332
|
+
...options,
|
|
333
|
+
limit: maxLiveKeysPerOrganization,
|
|
334
|
+
})
|
|
335
|
+
).records
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/** Reads one bounded page through an organization's key index. */
|
|
339
|
+
export async function listByOrgPage(
|
|
340
|
+
state: Store.State,
|
|
341
|
+
orgId: string,
|
|
342
|
+
options: listByOrgPage.Options,
|
|
343
|
+
): Promise<listByOrgPage.Result> {
|
|
344
|
+
const page = await state.list({
|
|
345
|
+
...(options.cursor === undefined ? {} : { cursor: options.cursor }),
|
|
346
|
+
limit: options.limit,
|
|
347
|
+
prefix: `${orgPrefix}${orgId}:`,
|
|
348
|
+
})
|
|
349
|
+
const { keys } = page
|
|
350
|
+
const index = await Store.getMany(
|
|
351
|
+
state,
|
|
352
|
+
keys.map(({ name }) => name),
|
|
353
|
+
)
|
|
354
|
+
const recordKeys = keys.flatMap(({ name }) => {
|
|
355
|
+
const recordKey = index.get(name)
|
|
356
|
+
return recordKey ? [recordKey] : []
|
|
357
|
+
})
|
|
358
|
+
const values = await Store.getMany(state, recordKeys)
|
|
359
|
+
const now = Date.now()
|
|
360
|
+
const scopeCatalog = options.scopeCatalog ?? Scope.catalog
|
|
361
|
+
const entries = recordKeys.flatMap((recordKey) => {
|
|
362
|
+
const record = parse(values.get(recordKey) ?? null, now, scopeCatalog)
|
|
363
|
+
return record ? [{ record, recordKey }] : []
|
|
364
|
+
})
|
|
365
|
+
const overrides = await applyBillingOverrides(state, entries)
|
|
240
366
|
const records: Record[] = []
|
|
241
367
|
for (const { name } of keys) {
|
|
242
|
-
const recordKey =
|
|
243
|
-
const record = recordKey
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if (!record) {
|
|
247
|
-
await state.delete(name)
|
|
368
|
+
const recordKey = index.get(name)
|
|
369
|
+
const record = recordKey ? (overrides.get(recordKey) ?? null) : null
|
|
370
|
+
if (!record || record.orgId !== orgId) {
|
|
371
|
+
if (options.cleanupDangling !== false) await state.delete(name)
|
|
248
372
|
continue
|
|
249
373
|
}
|
|
250
374
|
if (options.environment && record.environment !== options.environment) continue
|
|
251
375
|
if (!options.projectId || record.projectId === options.projectId) records.push(record)
|
|
252
376
|
}
|
|
253
|
-
return
|
|
377
|
+
return {
|
|
378
|
+
...(page.cursor === undefined ? {} : { cursor: page.cursor }),
|
|
379
|
+
indexCount: keys.length,
|
|
380
|
+
listComplete: page.listComplete ?? true,
|
|
381
|
+
records: records.sort((a, b) => b.createdAt.localeCompare(a.createdAt)),
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export declare namespace listByOrgPage {
|
|
386
|
+
/** Bounded organization-key page inputs. */
|
|
387
|
+
type Options = listByOrg.Options & {
|
|
388
|
+
/** Whether dangling index entries should be deleted while reading. */
|
|
389
|
+
cleanupDangling?: boolean | undefined
|
|
390
|
+
/** Continue after a previous page. */
|
|
391
|
+
cursor?: string | undefined
|
|
392
|
+
/** Maximum index entries to read. */
|
|
393
|
+
limit: number
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/** Bounded organization-key page. */
|
|
397
|
+
type Result = {
|
|
398
|
+
/** Cursor for the following page, when present. */
|
|
399
|
+
cursor?: string | undefined
|
|
400
|
+
/** Number of index entries examined in this page. */
|
|
401
|
+
indexCount: number
|
|
402
|
+
/** Whether every matching index was returned. */
|
|
403
|
+
listComplete: boolean
|
|
404
|
+
/** Valid key records in this page. */
|
|
405
|
+
records: readonly Record[]
|
|
406
|
+
}
|
|
254
407
|
}
|
|
255
408
|
|
|
256
409
|
export declare namespace listByOrg {
|
|
@@ -286,14 +439,41 @@ export async function revoke(state: Store.State, id: string): Promise<boolean> {
|
|
|
286
439
|
}
|
|
287
440
|
})()
|
|
288
441
|
await state.delete(recordKey)
|
|
442
|
+
await state.delete(billingKeyFor(recordKey))
|
|
289
443
|
await state.delete(idKeyFor(id))
|
|
290
444
|
if (orgId) await state.delete(orgKeyFor(orgId, id))
|
|
291
445
|
return true
|
|
292
446
|
}
|
|
293
447
|
|
|
448
|
+
/** Fences and revokes a key, then idempotently removes its authoritative live-key slot. */
|
|
449
|
+
export async function revokeBounded(db: Db.Db, state: Store.State, id: string): Promise<boolean> {
|
|
450
|
+
const fenced = await db.transaction(async (tx) => {
|
|
451
|
+
await ApiKeyAdmissions.lock(tx, id)
|
|
452
|
+
const [admission, record] = await Promise.all([ApiKeyAdmissions.get(tx, id), get(state, id)])
|
|
453
|
+
const orgId = admission?.orgId ?? record?.orgId ?? null
|
|
454
|
+
const projectId = admission?.projectId ?? record?.projectId ?? undefined
|
|
455
|
+
const active =
|
|
456
|
+
orgId === null ||
|
|
457
|
+
(await ApiKeyOwnerTombstones.lockActive(tx, {
|
|
458
|
+
orgId,
|
|
459
|
+
...(projectId === undefined || projectId === null ? {} : { projectId }),
|
|
460
|
+
}))
|
|
461
|
+
if ((record || admission) && active) await ApiKeyRevocations.markPending(tx, id, orgId)
|
|
462
|
+
return { found: record !== null || admission !== undefined, orgId }
|
|
463
|
+
})
|
|
464
|
+
const revoked = await revoke(state, id)
|
|
465
|
+
if (revoked)
|
|
466
|
+
await db.transaction(async (tx) => {
|
|
467
|
+
await ApiKeyAdmissions.lock(tx, id)
|
|
468
|
+
await ApiKeyRevocations.mark(tx, id, fenced.orgId)
|
|
469
|
+
await ApiKeyAdmissions.release(tx, id)
|
|
470
|
+
})
|
|
471
|
+
return revoked || fenced.found
|
|
472
|
+
}
|
|
473
|
+
|
|
294
474
|
/**
|
|
295
|
-
* Updates a key's IP allowlist, display name, and attribution,
|
|
296
|
-
* record in place and moving the org index entry when the org changes.
|
|
475
|
+
* Updates a key's IP allowlist, display name, quotas, scopes, and attribution,
|
|
476
|
+
* rewriting its record in place and moving the org index entry when the org changes.
|
|
297
477
|
*
|
|
298
478
|
* @param state - The KV state store holding key records.
|
|
299
479
|
* @param id - The key id (`key_…`).
|
|
@@ -311,28 +491,122 @@ export async function update(
|
|
|
311
491
|
const valid = ApiKey.schema.AllowedIps.safeParse(input.allowedIps)
|
|
312
492
|
if (!valid.success) throw new Error(`invalid API key input: ${z.prettifyError(valid.error)}`)
|
|
313
493
|
}
|
|
494
|
+
if (input.rateLimits !== undefined) {
|
|
495
|
+
const valid = ApiKey.schema.ApiKey.shape.rateLimits.safeParse(input.rateLimits)
|
|
496
|
+
if (!valid.success) throw new Error(`invalid API key input: ${z.prettifyError(valid.error)}`)
|
|
497
|
+
}
|
|
498
|
+
if (
|
|
499
|
+
input.scopes !== undefined &&
|
|
500
|
+
(!validScopes(input.scopes, options.scopeCatalog ?? Scope.catalog) ||
|
|
501
|
+
new Set(input.scopes).size !== input.scopes.length)
|
|
502
|
+
)
|
|
503
|
+
throw new Error('invalid API key input: invalid scopes')
|
|
314
504
|
const recordKey = await state.get(idKeyFor(id))
|
|
315
505
|
if (!recordKey) return null
|
|
316
506
|
const record = await read(state, recordKey, Date.now(), options.scopeCatalog ?? Scope.catalog)
|
|
317
507
|
if (!record) return null
|
|
508
|
+
const owner = {
|
|
509
|
+
orgId: input.orgId ?? record.orgId,
|
|
510
|
+
projectId: input.projectId ?? record.projectId,
|
|
511
|
+
}
|
|
512
|
+
if (
|
|
513
|
+
(input.orgId !== undefined || input.projectId !== undefined) &&
|
|
514
|
+
(await isOwnerDeleted(state, owner))
|
|
515
|
+
)
|
|
516
|
+
throw new OwnerDeletedError()
|
|
517
|
+
const reassigning = input.orgId !== undefined && input.orgId !== record.orgId
|
|
518
|
+
const recordWithoutBilling = { ...record }
|
|
519
|
+
delete recordWithoutBilling.billingActive
|
|
318
520
|
|
|
319
521
|
const updated: Record = {
|
|
320
|
-
...record,
|
|
522
|
+
...(reassigning ? recordWithoutBilling : record),
|
|
321
523
|
...(input.allowedIps === undefined ? {} : { allowedIps: input.allowedIps }),
|
|
322
524
|
...(input.name === undefined ? {} : { name: input.name }),
|
|
323
525
|
...(input.orgId === undefined ? {} : { orgId: input.orgId }),
|
|
324
526
|
...(input.projectId === undefined ? {} : { projectId: input.projectId }),
|
|
527
|
+
...(input.rateLimits === undefined ? {} : { rateLimits: input.rateLimits }),
|
|
528
|
+
...(input.scopes === undefined ? {} : { scopes: input.scopes }),
|
|
325
529
|
}
|
|
326
530
|
const ttl =
|
|
327
531
|
updated.expiresAt === undefined
|
|
328
532
|
? undefined
|
|
329
533
|
: Math.max(1, Date.parse(updated.expiresAt) - Date.now())
|
|
330
534
|
await state.put(recordKey, JSON.stringify(updated), { ttl })
|
|
331
|
-
if (
|
|
535
|
+
if (reassigning) {
|
|
536
|
+
await state.delete(billingKeyFor(recordKey))
|
|
537
|
+
await state.delete(orgKeyFor(record.orgId, id))
|
|
538
|
+
}
|
|
332
539
|
await state.put(orgKeyFor(updated.orgId, id), recordKey, { ttl })
|
|
333
540
|
return updated
|
|
334
541
|
}
|
|
335
542
|
|
|
543
|
+
/** Updates a key while atomically enforcing owner fences and admission accounting. */
|
|
544
|
+
export async function updateBounded(
|
|
545
|
+
db: Db.Db,
|
|
546
|
+
state: Store.State,
|
|
547
|
+
id: string,
|
|
548
|
+
input: update.Input,
|
|
549
|
+
options: updateBounded.Options = {},
|
|
550
|
+
): Promise<Record | null> {
|
|
551
|
+
const result = await db.transaction(async (tx) => {
|
|
552
|
+
await ApiKeyAdmissions.lock(tx, id)
|
|
553
|
+
const record = await get(state, id, options)
|
|
554
|
+
if (!record) return { type: 'missing' } as const
|
|
555
|
+
if (
|
|
556
|
+
options.expectedOwner &&
|
|
557
|
+
(record.orgId !== options.expectedOwner.orgId ||
|
|
558
|
+
record.projectId !== options.expectedOwner.projectId)
|
|
559
|
+
)
|
|
560
|
+
return { type: 'missing' } as const
|
|
561
|
+
if (input.orgId === undefined && input.projectId === undefined)
|
|
562
|
+
return { type: 'updated', updated: await update(state, id, input, options) } as const
|
|
563
|
+
const owner = {
|
|
564
|
+
orgId: input.orgId ?? record.orgId,
|
|
565
|
+
projectId: input.projectId ?? record.projectId,
|
|
566
|
+
}
|
|
567
|
+
const owners = [owner]
|
|
568
|
+
if (record.orgId !== record.id)
|
|
569
|
+
owners.push({ orgId: record.orgId, projectId: record.projectId })
|
|
570
|
+
if (!(await ApiKeyOwnerTombstones.lockActiveMany(tx, owners))) throw new OwnerDeletedError()
|
|
571
|
+
await ApiKeyAdmissions.lockOrganization(tx, owner.orgId)
|
|
572
|
+
const legacy = (await ApiKeyAdmissions.isBootstrapped(tx, owner.orgId))
|
|
573
|
+
? { complete: true, records: [] }
|
|
574
|
+
: await admissionRecordsForOrg(state, owner.orgId, options)
|
|
575
|
+
const admitted = await ApiKeyAdmissions.admit(tx, {
|
|
576
|
+
currentOrgId: record.orgId === record.id ? undefined : record.orgId,
|
|
577
|
+
expiresAt: normalizeExpiresAt(record.expiresAt),
|
|
578
|
+
id,
|
|
579
|
+
limit: maxLiveKeysPerOrganization,
|
|
580
|
+
legacy: legacy.records,
|
|
581
|
+
legacyComplete: legacy.complete,
|
|
582
|
+
orgId: owner.orgId,
|
|
583
|
+
projectId: owner.projectId ?? null,
|
|
584
|
+
})
|
|
585
|
+
if (!admitted) return { type: 'limit' } as const
|
|
586
|
+
const updated = await update(state, id, input, options)
|
|
587
|
+
if (!updated) await ApiKeyAdmissions.release(tx, id)
|
|
588
|
+
return { type: 'updated', updated } as const
|
|
589
|
+
})
|
|
590
|
+
if (result.type === 'limit') throw new LiveKeyLimitError(maxLiveKeysPerOrganization)
|
|
591
|
+
return result.type === 'missing' ? null : result.updated
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
export declare namespace updateBounded {
|
|
595
|
+
/** Options for an admission-accounted key update. */
|
|
596
|
+
type Options = update.Options & {
|
|
597
|
+
/** Owner the locked record must still belong to. */
|
|
598
|
+
expectedOwner?: Owner | undefined
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/** Expected owner checked under the per-key lock. */
|
|
602
|
+
type Owner = {
|
|
603
|
+
/** Owning organization id (`org_…`). */
|
|
604
|
+
orgId: string
|
|
605
|
+
/** Attributed project id, or absent for an organization key. */
|
|
606
|
+
projectId?: string | undefined
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
336
610
|
export declare namespace update {
|
|
337
611
|
/** Metadata applied by {@link update}; omitted fields keep their current value. */
|
|
338
612
|
type Input = {
|
|
@@ -344,6 +618,10 @@ export declare namespace update {
|
|
|
344
618
|
orgId?: string | undefined
|
|
345
619
|
/** New attributed project id (`prj_…`). */
|
|
346
620
|
projectId?: string | undefined
|
|
621
|
+
/** Replacement per-key quota overrides. */
|
|
622
|
+
rateLimits?: ApiKey.ApiKey['rateLimits'] | undefined
|
|
623
|
+
/** Replacement granted scopes. */
|
|
624
|
+
scopes?: readonly Scope.Id[] | undefined
|
|
347
625
|
}
|
|
348
626
|
|
|
349
627
|
/** Options for {@link update}. */
|
|
@@ -382,9 +660,9 @@ export declare namespace attribute {
|
|
|
382
660
|
/**
|
|
383
661
|
* Stamps `billingActive` onto every key an organization owns in an environment,
|
|
384
662
|
* re-syncing the snapshot the auth path reads when billing flips (activation or
|
|
385
|
-
* lapse).
|
|
386
|
-
*
|
|
387
|
-
* untouched.
|
|
663
|
+
* lapse). The snapshot is stored separately so this background writer never
|
|
664
|
+
* overwrites newer key metadata. Records already carrying the target value are
|
|
665
|
+
* left untouched.
|
|
388
666
|
*
|
|
389
667
|
* @param state - The KV state store holding key records.
|
|
390
668
|
* @param options - Owner, environment, and the new billing-active value.
|
|
@@ -395,19 +673,29 @@ export async function setBillingActive(
|
|
|
395
673
|
options: setBillingActive.Options,
|
|
396
674
|
): Promise<number> {
|
|
397
675
|
const { active, environment, orgId, scopeCatalog } = options
|
|
398
|
-
const records = await listByOrg(state, orgId, { environment, scopeCatalog })
|
|
399
676
|
let updated = 0
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
const
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
677
|
+
let cursor: string | undefined
|
|
678
|
+
for (;;) {
|
|
679
|
+
const page = await listByOrgPage(state, orgId, {
|
|
680
|
+
cursor,
|
|
681
|
+
environment,
|
|
682
|
+
limit: maxLiveKeysPerOrganization,
|
|
683
|
+
scopeCatalog,
|
|
684
|
+
})
|
|
685
|
+
for (const record of page.records) {
|
|
686
|
+
if (record.billingActive === active) continue
|
|
687
|
+
const recordKey = await state.get(idKeyFor(record.id))
|
|
688
|
+
if (!recordKey) continue
|
|
689
|
+
const ttl =
|
|
690
|
+
record.expiresAt === undefined
|
|
691
|
+
? undefined
|
|
692
|
+
: Math.max(1, Date.parse(record.expiresAt) - Date.now())
|
|
693
|
+
await state.put(billingKeyFor(recordKey), JSON.stringify({ active, orgId }), { ttl })
|
|
694
|
+
updated += 1
|
|
695
|
+
}
|
|
696
|
+
if (page.listComplete) break
|
|
697
|
+
if (page.cursor === undefined) throw new Error('API-key list page is missing a cursor.')
|
|
698
|
+
cursor = page.cursor
|
|
411
699
|
}
|
|
412
700
|
return updated
|
|
413
701
|
}
|
|
@@ -481,7 +769,13 @@ async function read(
|
|
|
481
769
|
now: number,
|
|
482
770
|
scopeCatalog: Scope.Catalog,
|
|
483
771
|
): Promise<Record | null> {
|
|
484
|
-
const
|
|
772
|
+
const record = parse(await state.get(key), now, scopeCatalog)
|
|
773
|
+
if (!record) return null
|
|
774
|
+
const overrides = await applyBillingOverrides(state, [{ record, recordKey: key }])
|
|
775
|
+
return overrides.get(key) ?? null
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
function parse(raw: null | string, now: number, scopeCatalog: Scope.Catalog): Record | null {
|
|
485
779
|
if (!raw) return null
|
|
486
780
|
const value = (() => {
|
|
487
781
|
try {
|
|
@@ -499,6 +793,49 @@ async function read(
|
|
|
499
793
|
return record
|
|
500
794
|
}
|
|
501
795
|
|
|
796
|
+
/** Applies separately persisted billing snapshots in one store read. */
|
|
797
|
+
async function applyBillingOverrides(
|
|
798
|
+
state: Store.State,
|
|
799
|
+
entries: readonly applyBillingOverrides.Entry[],
|
|
800
|
+
): Promise<ReadonlyMap<string, Record | null>> {
|
|
801
|
+
const values = await Store.getMany(
|
|
802
|
+
state,
|
|
803
|
+
entries.map(({ recordKey }) => billingKeyFor(recordKey)),
|
|
804
|
+
)
|
|
805
|
+
return new Map(
|
|
806
|
+
entries.map(({ record, recordKey }) => {
|
|
807
|
+
const raw = values.get(billingKeyFor(recordKey)) ?? null
|
|
808
|
+
if (raw === null) return [recordKey, record]
|
|
809
|
+
const value = (() => {
|
|
810
|
+
try {
|
|
811
|
+
return JSON.parse(raw) as unknown
|
|
812
|
+
} catch {
|
|
813
|
+
return undefined
|
|
814
|
+
}
|
|
815
|
+
})()
|
|
816
|
+
const snapshot = billingSnapshotSchema.safeParse(value)
|
|
817
|
+
if (snapshot.success)
|
|
818
|
+
return [
|
|
819
|
+
recordKey,
|
|
820
|
+
snapshot.data.orgId === record.orgId
|
|
821
|
+
? { ...record, billingActive: snapshot.data.active }
|
|
822
|
+
: record,
|
|
823
|
+
]
|
|
824
|
+
// Boolean snapshots predate organization reassignment and remain valid until rewritten.
|
|
825
|
+
return [recordKey, typeof value === 'boolean' ? { ...record, billingActive: value } : null]
|
|
826
|
+
}),
|
|
827
|
+
)
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
declare namespace applyBillingOverrides {
|
|
831
|
+
type Entry = {
|
|
832
|
+
/** Parsed primary API-key record. */
|
|
833
|
+
record: Record
|
|
834
|
+
/** Storage key for the primary record. */
|
|
835
|
+
recordKey: string
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
|
|
502
839
|
namespace StoredRecord {
|
|
503
840
|
type UnknownRecord = { [key: string]: unknown }
|
|
504
841
|
|
|
@@ -526,6 +863,64 @@ namespace StoredRecord {
|
|
|
526
863
|
}
|
|
527
864
|
}
|
|
528
865
|
|
|
866
|
+
/** Validates and normalizes API-key mint input. */
|
|
867
|
+
function validateMintInput(
|
|
868
|
+
input: MintInput,
|
|
869
|
+
options: mint.Options,
|
|
870
|
+
): z.output<typeof schema.MintInput> {
|
|
871
|
+
const valid = schema.MintInput.safeParse(input)
|
|
872
|
+
if (!valid.success) throw new Error(`invalid API key input: ${z.prettifyError(valid.error)}`)
|
|
873
|
+
if (!validScopes(valid.data.scopes, options.scopeCatalog ?? Scope.catalog))
|
|
874
|
+
throw new Error('invalid API key input: unknown scope')
|
|
875
|
+
return {
|
|
876
|
+
...valid.data,
|
|
877
|
+
...(valid.data.expiresAt === undefined
|
|
878
|
+
? {}
|
|
879
|
+
: { expiresAt: new Date(valid.data.expiresAt).toISOString() }),
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
/** Maps bounded live KV records into the authoritative bootstrap shape. */
|
|
884
|
+
function admissionRecords(records: readonly Record[]) {
|
|
885
|
+
return records.map((record) => ({
|
|
886
|
+
expiresAt: normalizeExpiresAt(record.expiresAt),
|
|
887
|
+
id: record.id,
|
|
888
|
+
projectId: record.projectId ?? null,
|
|
889
|
+
}))
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
/** Reconciles bounded index pages until 100 live legacy keys or index exhaustion. */
|
|
893
|
+
async function admissionRecordsForOrg(state: Store.State, orgId: string, options: get.Options) {
|
|
894
|
+
const records: Record[] = []
|
|
895
|
+
let indexes = 0
|
|
896
|
+
let cursor: string | undefined
|
|
897
|
+
for (;;) {
|
|
898
|
+
const limit = Math.min(maxLiveKeysPerOrganization, maxLegacyAdmissionIndexes - indexes)
|
|
899
|
+
const page = await listByOrgPage(state, orgId, {
|
|
900
|
+
cleanupDangling: false,
|
|
901
|
+
cursor,
|
|
902
|
+
limit,
|
|
903
|
+
scopeCatalog: options.scopeCatalog,
|
|
904
|
+
})
|
|
905
|
+
indexes += page.indexCount
|
|
906
|
+
records.push(...page.records.slice(0, maxLiveKeysPerOrganization - records.length))
|
|
907
|
+
if (page.listComplete) return { complete: true, records: admissionRecords(records) }
|
|
908
|
+
if (records.length === maxLiveKeysPerOrganization)
|
|
909
|
+
return { complete: false, records: admissionRecords(records) }
|
|
910
|
+
if (indexes >= maxLegacyAdmissionIndexes)
|
|
911
|
+
throw new LiveKeyLimitError(maxLiveKeysPerOrganization)
|
|
912
|
+
if (page.cursor === undefined) throw new Error('API-key list page is missing a cursor.')
|
|
913
|
+
cursor = page.cursor
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
/** Normalizes a stored expiry for lexicographic database comparison. */
|
|
918
|
+
function normalizeExpiresAt(expiresAt: string | undefined): string | null {
|
|
919
|
+
if (expiresAt === undefined) return null
|
|
920
|
+
const time = new Date(expiresAt)
|
|
921
|
+
return Number.isNaN(time.getTime()) ? null : time.toISOString()
|
|
922
|
+
}
|
|
923
|
+
|
|
529
924
|
/** Returns whether every granted scope belongs to the configured catalog. */
|
|
530
925
|
function validScopes(scopes: readonly string[], scopeCatalog: Scope.Catalog): boolean {
|
|
531
926
|
return scopes.every((scope) => scope === Scope.wildcard || Scope.includes(scopeCatalog, scope))
|
|
@@ -546,3 +941,49 @@ const orgPrefix = 'apikey_org:'
|
|
|
546
941
|
function orgKeyFor(orgId: string, id: string): string {
|
|
547
942
|
return `${orgPrefix}${orgId}:${id}`
|
|
548
943
|
}
|
|
944
|
+
|
|
945
|
+
/** Storage-key prefix for durable owner deletion markers. */
|
|
946
|
+
const ownerDeletedPrefix = 'apikey_owner_deleted:'
|
|
947
|
+
|
|
948
|
+
/** Returns whether the organization or attributed project has been deleted. */
|
|
949
|
+
export async function isOwnerDeleted(
|
|
950
|
+
state: Store.State,
|
|
951
|
+
owner: isOwnerDeleted.Owner,
|
|
952
|
+
): Promise<boolean> {
|
|
953
|
+
if (await state.get(ownerDeletedKey({ orgId: owner.orgId }))) return true
|
|
954
|
+
return owner.projectId === undefined ? false : (await state.get(ownerDeletedKey(owner))) !== null
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
export declare namespace isOwnerDeleted {
|
|
958
|
+
/** API-key owner whose deletion state is checked. */
|
|
959
|
+
type Owner = markOwnerDeleting.Owner
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/** Storage key for one organization or project deletion marker. */
|
|
963
|
+
function ownerDeletedKey(owner: markOwnerDeleting.Owner): string {
|
|
964
|
+
return `${ownerDeletedPrefix}${owner.orgId}${owner.projectId ? `:${owner.projectId}` : ''}`
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
/** Storage-key prefix for mutable billing snapshots. */
|
|
968
|
+
const billingPrefix = 'apikey_billing:'
|
|
969
|
+
|
|
970
|
+
/** Storage key under which a key's current billing snapshot is persisted. */
|
|
971
|
+
function billingKeyFor(recordKey: string): string {
|
|
972
|
+
return `${billingPrefix}${recordKey}`
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/** Thrown when an API key owner is being deleted or is already deleted. */
|
|
976
|
+
export class OwnerDeletedError extends Error {
|
|
977
|
+
override name = 'ApiKeys.OwnerDeletedError'
|
|
978
|
+
constructor() {
|
|
979
|
+
super('API key owner is deleted')
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
/** Thrown when an organization has reached its live API-key cap. */
|
|
984
|
+
export class LiveKeyLimitError extends Error {
|
|
985
|
+
override name = 'ApiKeys.LiveKeyLimitError'
|
|
986
|
+
constructor(limit: number) {
|
|
987
|
+
super(`Organization has reached its ${limit} live API-key limit`)
|
|
988
|
+
}
|
|
989
|
+
}
|