tapimo 0.7.1 → 0.8.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 +10 -7
- package/dist/ApiKey.d.ts +3 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +10 -0
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +29 -8
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +24 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +20680 -15487
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +250 -129
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +10 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +17 -4
- package/dist/Assets.js.map +1 -1
- package/dist/Scope.d.ts +19 -8
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +25 -9
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +1 -1
- package/dist/admin/App.d.ts +667 -76
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +12 -2
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +107 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +145 -32
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +1069 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
- package/dist/admin/apps/earn-vaults.js +409 -0
- package/dist/admin/apps/earn-vaults.js.map +1 -0
- package/dist/admin/apps/organizations.d.ts +2 -0
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +74 -74
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +99 -43
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +4 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +21 -2
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +22 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +59 -39
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/Zones.d.ts +8335 -0
- package/dist/apps/Zones.d.ts.map +1 -0
- package/dist/apps/Zones.js +38 -0
- package/dist/apps/Zones.js.map +1 -0
- package/dist/apps/data/App.d.ts +5666 -3934
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +90 -22
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FxOracle.d.ts +1 -1
- package/dist/apps/data/FxOracle.d.ts.map +1 -1
- package/dist/apps/data/index.d.ts +0 -1
- package/dist/apps/data/index.d.ts.map +1 -1
- package/dist/apps/data/index.js +0 -1
- package/dist/apps/data/index.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +56 -56
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +130 -65
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +65 -65
- package/dist/apps/data/routes/balances.d.ts +14 -14
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +39 -39
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +62 -35
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +2574 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +1574 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1626 -719
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +656 -193
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +108 -108
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +59 -8
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +35 -35
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +23 -3
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +33 -33
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +11 -11
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.d.ts +6 -6
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +214 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +39 -8
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +115 -87
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +194 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +54 -54
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +78 -39
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +76 -27
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +165 -67
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +42 -42
- package/dist/apps/data/routes/valuation.js +2 -2
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
- package/dist/apps/data/routes/webhooks.d.ts +370 -368
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +161 -59
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +281 -0
- package/dist/apps/data/routes/zones.d.ts.map +1 -0
- package/dist/apps/data/routes/zones.js +252 -0
- package/dist/apps/data/routes/zones.js.map +1 -0
- package/dist/apps/docs/reference.js +6 -5
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/funding/Access.d.ts +16 -0
- package/dist/apps/funding/Access.d.ts.map +1 -0
- package/dist/apps/funding/Access.js +22 -0
- package/dist/apps/funding/Access.js.map +1 -0
- package/dist/apps/funding/App.d.ts +3183 -0
- package/dist/apps/funding/App.d.ts.map +1 -0
- package/dist/apps/funding/App.js +46 -0
- package/dist/apps/funding/App.js.map +1 -0
- package/dist/apps/funding/Inventory.d.ts +5 -0
- package/dist/apps/funding/Inventory.d.ts.map +1 -0
- package/dist/apps/funding/Inventory.js +25 -0
- package/dist/apps/funding/Inventory.js.map +1 -0
- package/dist/apps/funding/ProviderAttempts.d.ts +5 -0
- package/dist/apps/funding/ProviderAttempts.d.ts.map +1 -0
- package/dist/apps/funding/ProviderAttempts.js +24 -0
- package/dist/apps/funding/ProviderAttempts.js.map +1 -0
- package/dist/apps/funding/index.d.ts +2 -0
- package/dist/apps/funding/index.d.ts.map +1 -0
- package/dist/apps/funding/index.js +2 -0
- package/dist/apps/funding/index.js.map +1 -0
- package/dist/apps/funding/routes/chains.d.ts +169 -0
- package/dist/apps/funding/routes/chains.d.ts.map +1 -0
- package/dist/apps/funding/routes/chains.js +80 -0
- package/dist/apps/funding/routes/chains.js.map +1 -0
- package/dist/apps/funding/routes/deposit-addresses.d.ts +2388 -0
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -0
- package/dist/apps/funding/routes/deposit-addresses.js +860 -0
- package/dist/apps/funding/routes/deposit-addresses.js.map +1 -0
- package/dist/apps/funding/routes/providers.d.ts +91 -0
- package/dist/apps/funding/routes/providers.d.ts.map +1 -0
- package/dist/apps/funding/routes/providers.js +56 -0
- package/dist/apps/funding/routes/providers.js.map +1 -0
- package/dist/apps/{data/routes/funding.d.ts → funding/routes/quotes.d.ts} +26 -396
- package/dist/apps/funding/routes/quotes.d.ts.map +1 -0
- package/dist/apps/funding/routes/quotes.js +188 -0
- package/dist/apps/funding/routes/quotes.js.map +1 -0
- package/dist/apps/funding/routes/transfers.d.ts +1999 -0
- package/dist/apps/funding/routes/transfers.d.ts.map +1 -0
- package/dist/apps/funding/routes/transfers.js +614 -0
- package/dist/apps/funding/routes/transfers.js.map +1 -0
- package/dist/apps/index.d.ts +3 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +3 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +839 -574
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/Billing.d.ts +8 -0
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +12 -0
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/Error.d.ts +12 -0
- package/dist/apps/management/Error.d.ts.map +1 -0
- package/dist/apps/management/Error.js +10 -0
- package/dist/apps/management/Error.js.map +1 -0
- package/dist/apps/management/routes/api-keys.d.ts +296 -19
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +77 -9
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +119 -119
- package/dist/apps/management/routes/faucet.d.ts +35 -35
- package/dist/apps/management/routes/invitations.d.ts +17 -17
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +4 -10
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +38 -38
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +69 -69
- package/dist/apps/management/routes/orgs.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +2 -8
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +19 -19
- package/dist/apps/management/routes/scopes.d.ts +1 -1
- package/dist/apps/management/routes/scopes.js +2 -2
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +72 -72
- package/dist/apps/management/routes/verified-token-requests.d.ts +18 -18
- package/dist/apps/management/routes/webhooks.d.ts +122 -122
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +15 -3
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mcp.d.ts +2 -3
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +16 -14
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/metadata.d.ts +4 -0
- package/dist/apps/metadata.d.ts.map +1 -1
- package/dist/apps/metadata.js +10 -0
- package/dist/apps/metadata.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +57 -58
- package/dist/apps/mpp/App.d.ts.map +1 -1
- package/dist/apps/mpp/App.js +192 -27
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/Mpp.d.ts +0 -20
- package/dist/apps/mpp/Mpp.d.ts.map +1 -1
- package/dist/apps/mpp/Mpp.js +0 -24
- package/dist/apps/mpp/Mpp.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Adapter.js +66 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -0
- package/dist/apps/mpp/internal/Error.d.ts +4 -0
- package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Error.js +41 -0
- package/dist/apps/mpp/internal/Error.js.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.js +28 -0
- package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
- package/dist/apps/mpp/internal/Policy.d.ts +46 -0
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Policy.js +57 -0
- package/dist/apps/mpp/internal/Policy.js.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.js +18 -0
- package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
- package/dist/apps/mpp/internal/Screening.d.ts +35 -0
- package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Screening.js +20 -0
- package/dist/apps/mpp/internal/Screening.js.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.js +103 -0
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
- package/dist/apps/mpp/internal/Utils.d.ts +7 -0
- package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Utils.js +24 -0
- package/dist/apps/mpp/internal/Utils.js.map +1 -0
- package/dist/apps/relay/App.js +183 -23
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +15 -6
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/cloudflare.d.ts +50 -0
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +178 -0
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +22 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +379 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +933 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +289 -1
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +68 -0
- package/dist/db/tables/earnVaults.d.ts.map +1 -0
- package/dist/db/tables/earnVaults.js +72 -0
- package/dist/db/tables/earnVaults.js.map +1 -0
- package/dist/db/tables/fundingCatalog.d.ts +56 -0
- package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
- package/dist/db/tables/fundingCatalog.js +85 -0
- package/dist/db/tables/fundingCatalog.js.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts +172 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +218 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDepositRequestObservations.d.ts +45 -0
- package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositRequestObservations.js +46 -0
- package/dist/db/tables/fundingDepositRequestObservations.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +171 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +182 -0
- package/dist/db/tables/fundingDeposits.js.map +1 -0
- package/dist/db/tables/fundingIdempotency.d.ts +91 -0
- package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
- package/dist/db/tables/fundingIdempotency.js +103 -0
- package/dist/db/tables/fundingIdempotency.js.map +1 -0
- package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
- package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferEvents.js +18 -0
- package/dist/db/tables/fundingTransferEvents.js.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.js +27 -0
- package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
- package/dist/db/tables/fundingTransfers.d.ts +82 -0
- package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
- package/dist/db/tables/fundingTransfers.js +89 -0
- package/dist/db/tables/fundingTransfers.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +8 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +16 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +8 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +16 -0
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +13 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +16 -0
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +1 -1
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +8 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +16 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokens.d.ts +14 -7
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokens.js +9 -7
- package/dist/db/tables/verifiedTokens.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +24 -3
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/relay.js +108 -108
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +37 -11
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +75 -16
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +17 -11
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/Cursor.js +1 -1
- package/dist/internal/Cursor.js.map +1 -1
- package/dist/internal/EarnRates.d.ts +89 -0
- package/dist/internal/EarnRates.d.ts.map +1 -0
- package/dist/internal/EarnRates.js +266 -0
- package/dist/internal/EarnRates.js.map +1 -0
- package/dist/internal/EarnVaults.d.ts +171 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -0
- package/dist/internal/EarnVaults.js +547 -0
- package/dist/internal/EarnVaults.js.map +1 -0
- package/dist/internal/EdgeCache.d.ts +10 -3
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +43 -11
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/Id.d.ts +11 -0
- package/dist/internal/Id.d.ts.map +1 -1
- package/dist/internal/Id.js +13 -0
- package/dist/internal/Id.js.map +1 -1
- package/dist/internal/Idempotency.d.ts +83 -0
- package/dist/internal/Idempotency.d.ts.map +1 -0
- package/dist/internal/Idempotency.js +113 -0
- package/dist/internal/Idempotency.js.map +1 -0
- package/dist/internal/IpAllowlist.d.ts +15 -0
- package/dist/internal/IpAllowlist.d.ts.map +1 -0
- package/dist/internal/IpAllowlist.js +27 -0
- package/dist/internal/IpAllowlist.js.map +1 -0
- package/dist/internal/Log.d.ts +64 -9
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +29 -7
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +47 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +2 -2
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +4 -1
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Provider.d.ts +14 -0
- package/dist/internal/Provider.d.ts.map +1 -0
- package/dist/internal/Provider.js +5 -0
- package/dist/internal/Provider.js.map +1 -0
- package/dist/internal/Schema.d.ts +6 -1
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +20 -11
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +35 -0
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +49 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +90 -12
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +90 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +90 -12
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/WebhookDestination.d.ts.map +1 -1
- package/dist/internal/WebhookDestination.js +34 -28
- package/dist/internal/WebhookDestination.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +9 -0
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +15 -10
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/exchange/Provider.d.ts +219 -0
- package/dist/internal/exchange/Provider.d.ts.map +1 -0
- package/dist/internal/exchange/Provider.js +117 -0
- package/dist/internal/exchange/Provider.js.map +1 -0
- package/dist/internal/exchange/index.d.ts +2 -0
- package/dist/internal/exchange/index.d.ts.map +1 -0
- package/dist/internal/exchange/index.js +2 -0
- package/dist/internal/exchange/index.js.map +1 -0
- package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
- package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
- package/dist/internal/exchange/providers/uniswap.js +553 -0
- package/dist/internal/exchange/providers/uniswap.js.map +1 -0
- package/dist/internal/funding/Action.d.ts +55 -0
- package/dist/internal/funding/Action.d.ts.map +1 -0
- package/dist/internal/funding/Action.js +74 -0
- package/dist/internal/funding/Action.js.map +1 -0
- package/dist/internal/funding/Catalog.d.ts +107 -0
- package/dist/internal/funding/Catalog.d.ts.map +1 -0
- package/dist/internal/funding/Catalog.js +270 -0
- package/dist/internal/funding/Catalog.js.map +1 -0
- package/dist/internal/funding/Chain.d.ts +76 -0
- package/dist/internal/funding/Chain.d.ts.map +1 -0
- package/dist/internal/funding/Chain.js +38 -0
- package/dist/internal/funding/Chain.js.map +1 -0
- package/dist/internal/funding/Deposit.d.ts +408 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +318 -0
- package/dist/internal/funding/Deposit.js.map +1 -0
- package/dist/internal/funding/DepositAddress.d.ts +345 -0
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
- package/dist/internal/funding/DepositAddress.js +189 -0
- package/dist/internal/funding/DepositAddress.js.map +1 -0
- package/dist/internal/funding/Evidence.d.ts +48 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +315 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1288 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1086 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +127 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +885 -0
- package/dist/internal/funding/Reconciliation.js.map +1 -0
- package/dist/internal/funding/Route.d.ts +21 -0
- package/dist/internal/funding/Route.d.ts.map +1 -0
- package/dist/internal/funding/Route.js +5 -0
- package/dist/internal/funding/Route.js.map +1 -0
- package/dist/internal/funding/SourceObservation.d.ts +108 -0
- package/dist/internal/funding/SourceObservation.d.ts.map +1 -0
- package/dist/internal/funding/SourceObservation.js +143 -0
- package/dist/internal/funding/SourceObservation.js.map +1 -0
- package/dist/internal/funding/Subsidy.d.ts +113 -0
- package/dist/internal/funding/Subsidy.d.ts.map +1 -0
- package/dist/internal/funding/Subsidy.js +138 -0
- package/dist/internal/funding/Subsidy.js.map +1 -0
- package/dist/internal/funding/Token.d.ts +41 -0
- package/dist/internal/funding/Token.d.ts.map +1 -0
- package/dist/internal/funding/Token.js +22 -0
- package/dist/internal/funding/Token.js.map +1 -0
- package/dist/internal/funding/Transfer.d.ts +643 -0
- package/dist/internal/funding/Transfer.d.ts.map +1 -0
- package/dist/internal/funding/Transfer.js +332 -0
- package/dist/internal/funding/Transfer.js.map +1 -0
- package/dist/internal/funding/index.d.ts +14 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +14 -0
- package/dist/internal/funding/index.js.map +1 -0
- package/dist/internal/funding/providers/across.d.ts +21 -0
- package/dist/internal/funding/providers/across.d.ts.map +1 -0
- package/dist/internal/funding/providers/across.js +117 -0
- package/dist/internal/funding/providers/across.js.map +1 -0
- package/dist/internal/funding/providers/relay.d.ts +88 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +871 -0
- package/dist/internal/funding/providers/relay.js.map +1 -0
- package/dist/internal/funding/providers/rhino.d.ts +15 -0
- package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
- package/dist/internal/funding/providers/rhino.js +116 -0
- package/dist/internal/funding/providers/rhino.js.map +1 -0
- package/dist/internal/funding/providers/squid.d.ts +19 -0
- package/dist/internal/funding/providers/squid.d.ts.map +1 -0
- package/dist/internal/funding/providers/squid.js +120 -0
- package/dist/internal/funding/providers/squid.js.map +1 -0
- package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
- package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
- package/dist/internal/funding/providers/symbiosis.js +176 -0
- package/dist/internal/funding/providers/symbiosis.js.map +1 -0
- package/dist/internal/index.d.ts +5 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +5 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/webhookDestinations/url.js +61 -57
- package/dist/internal/webhookDestinations/url.js.map +1 -1
- package/dist/providers/index.d.ts +43 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +10 -5
- package/src/ApiKey.test.ts +35 -0
- package/src/ApiKey.ts +27 -0
- package/src/ApiKeys.test.ts +40 -7
- package/src/ApiKeys.ts +46 -10
- package/src/App.test.ts +108 -15
- package/src/App.ts +296 -138
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +809 -37
- package/src/Scope.test.ts +19 -0
- package/src/Scope.ts +28 -11
- package/src/Webhooks.test.ts +25 -0
- package/src/Webhooks.ts +1 -1
- package/src/admin/App.test.ts +9 -2
- package/src/admin/App.ts +32 -9
- package/src/admin/apps/api-keys.test.ts +190 -22
- package/src/admin/apps/api-keys.ts +170 -28
- package/src/admin/apps/earn-vaults.test.ts +338 -0
- package/src/admin/apps/earn-vaults.ts +572 -0
- package/src/admin/apps/scopes.test.ts +16 -1
- package/src/admin/ui/plugin.ts +2 -2
- package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
- package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
- package/src/admin/ui/src/components/Page.tsx +1 -1
- package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
- package/src/admin/ui/src/lib/api-keys.ts +37 -7
- package/src/admin/ui/src/lib/client.ts +1 -1
- package/src/admin/ui/src/lib/config.ts +1 -1
- package/src/admin/ui/src/lib/early-access.ts +8 -9
- package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
- package/src/admin/ui/src/lib/format.ts +13 -0
- package/src/admin/ui/src/lib/organizations.test.ts +14 -4
- package/src/admin/ui/src/lib/organizations.ts +7 -1
- package/src/admin/ui/src/lib/response.ts +22 -0
- package/src/admin/ui/src/lib/scopes.test.ts +19 -11
- package/src/admin/ui/src/lib/scopes.ts +28 -7
- package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
- package/src/admin/ui/src/routeTree.gen.ts +70 -7
- package/src/admin/ui/src/router.tsx +2 -2
- package/src/admin/ui/src/routes/__root.tsx +9 -8
- package/src/admin/ui/src/routes/api-keys.tsx +475 -64
- package/src/admin/ui/src/routes/early-access.tsx +5 -12
- package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
- package/src/admin/ui/src/routes/organizations.tsx +4 -7
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
- package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
- package/src/admin/ui/vite.config.ts +4 -1
- package/src/admin/ui.generated.ts +113 -43
- package/src/analytics/Analytics.test.ts +69 -10
- package/src/analytics/Analytics.ts +24 -1
- package/src/analytics/tables/requestEvents.ts +79 -37
- package/src/apps/Zones.test.ts +33 -0
- package/src/apps/Zones.ts +40 -0
- package/src/apps/composition.test.ts +184 -3
- package/src/apps/data/App.test.ts +28 -23
- package/src/apps/data/App.ts +95 -36
- package/src/apps/data/FxOracle.ts +1 -1
- package/src/apps/data/index.ts +0 -1
- package/src/apps/data/routes/activities.test.ts +82 -6
- package/src/apps/data/routes/activities.ts +131 -71
- package/src/apps/data/routes/balances.test.ts +50 -37
- package/src/apps/data/routes/balances.ts +5 -5
- package/src/apps/data/routes/blocks.test.ts +2 -0
- package/src/apps/data/routes/coingecko.test.ts +22 -0
- package/src/apps/data/routes/coingecko.ts +84 -48
- package/src/apps/data/routes/earn.test.ts +1391 -0
- package/src/apps/data/routes/earn.ts +2188 -0
- package/src/apps/data/routes/exchanges.test.ts +82 -33
- package/src/apps/data/routes/exchanges.ts +842 -227
- package/src/apps/data/routes/fee-amm.test.ts +4 -6
- package/src/apps/data/routes/fee-amm.ts +69 -12
- package/src/apps/data/routes/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +21 -3
- package/src/apps/data/routes/receipts.test.ts +5 -3
- package/src/apps/data/routes/receipts.ts +13 -11
- package/src/apps/data/routes/rpc.test.ts +446 -28
- package/src/apps/data/routes/rpc.ts +245 -25
- package/src/apps/data/routes/tokenlist.ts +72 -19
- package/src/apps/data/routes/tokens.test.ts +6 -8
- package/src/apps/data/routes/tokens.ts +258 -86
- package/src/apps/data/routes/transactions.test.ts +2 -0
- package/src/apps/data/routes/transactions.ts +77 -42
- package/src/apps/data/routes/transfers.test.ts +166 -4
- package/src/apps/data/routes/transfers.ts +216 -78
- package/src/apps/data/routes/valuation.test.ts +62 -9
- package/src/apps/data/routes/valuation.ts +2 -2
- package/src/apps/data/routes/webhooks.test.ts +386 -43
- package/src/apps/data/routes/webhooks.ts +172 -71
- package/src/apps/data/routes/zones.test.ts +473 -0
- package/src/apps/data/routes/zones.ts +338 -0
- package/src/apps/docs/reference.ts +8 -6
- package/src/apps/funding/Access.ts +26 -0
- package/src/apps/funding/App.test.ts +78 -0
- package/src/apps/funding/App.ts +63 -0
- package/src/apps/funding/Inventory.ts +30 -0
- package/src/apps/funding/ProviderAttempts.ts +26 -0
- package/src/apps/funding/index.ts +1 -0
- package/src/apps/funding/routes/chains.test.ts +78 -0
- package/src/apps/funding/routes/chains.ts +101 -0
- package/src/apps/funding/routes/deposit-addresses.test.ts +1628 -0
- package/src/apps/funding/routes/deposit-addresses.ts +1015 -0
- package/src/apps/funding/routes/providers.test.ts +165 -0
- package/src/apps/funding/routes/providers.ts +73 -0
- package/src/apps/funding/routes/quotes.test.ts +511 -0
- package/src/apps/funding/routes/quotes.ts +205 -0
- package/src/apps/funding/routes/transfers.test.ts +1255 -0
- package/src/apps/funding/routes/transfers.ts +704 -0
- package/src/apps/index.ts +3 -1
- package/src/apps/management/Billing.test.ts +29 -0
- package/src/apps/management/Billing.ts +23 -0
- package/src/apps/management/Error.ts +12 -0
- package/src/apps/management/routes/api-keys.test.ts +103 -3
- package/src/apps/management/routes/api-keys.ts +98 -10
- package/src/apps/management/routes/invitations.ts +4 -11
- package/src/apps/management/routes/orgs.ts +2 -9
- package/src/apps/management/routes/scopes.test.ts +7 -2
- package/src/apps/management/routes/scopes.ts +2 -2
- package/src/apps/management/routes/webhooks.test.ts +6 -1
- package/src/apps/management/routes/webhooks.ts +15 -3
- package/src/apps/mcp.test.ts +17 -2
- package/src/apps/mcp.ts +18 -13
- package/src/apps/metadata.ts +12 -0
- package/src/apps/mpp/App.ts +276 -29
- package/src/apps/mpp/Mpp.test.ts +631 -26
- package/src/apps/mpp/Mpp.ts +0 -42
- package/src/apps/mpp/internal/Adapter.ts +108 -3
- package/src/apps/mpp/internal/Error.test.ts +33 -0
- package/src/apps/mpp/internal/Error.ts +44 -6
- package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
- package/src/apps/mpp/internal/Idempotency.ts +59 -5
- package/src/apps/mpp/internal/Policy.test.ts +128 -0
- package/src/apps/mpp/internal/Policy.ts +98 -0
- package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
- package/src/apps/mpp/internal/ScreenManager.ts +41 -0
- package/src/apps/mpp/internal/Screening.ts +40 -3
- package/src/apps/mpp/internal/Sponsorship.ts +144 -0
- package/src/apps/mpp/internal/Utils.ts +30 -0
- package/src/apps/relay/App.test.ts +493 -62
- package/src/apps/relay/App.ts +233 -23
- package/src/apps/relay/Sponsorships.test.ts +49 -0
- package/src/apps/relay/Sponsorships.ts +18 -6
- package/src/cloudflare.ts +279 -0
- package/src/db/Db.ts +501 -0
- package/src/db/Schema.ts +349 -2
- package/src/db/tables/earnVaults.test.ts +185 -0
- package/src/db/tables/earnVaults.ts +151 -0
- package/src/db/tables/fundingCatalog.test.ts +108 -0
- package/src/db/tables/fundingCatalog.ts +157 -0
- package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
- package/src/db/tables/fundingDepositAddresses.ts +404 -0
- package/src/db/tables/fundingDepositRequestObservations.test.ts +106 -0
- package/src/db/tables/fundingDepositRequestObservations.ts +99 -0
- package/src/db/tables/fundingDeposits.test.ts +399 -0
- package/src/db/tables/fundingDeposits.ts +373 -0
- package/src/db/tables/fundingIdempotency.test.ts +182 -0
- package/src/db/tables/fundingIdempotency.ts +180 -0
- package/src/db/tables/fundingTransferEvents.ts +28 -0
- package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
- package/src/db/tables/fundingTransferTransactions.ts +37 -0
- package/src/db/tables/fundingTransfers.test.ts +89 -0
- package/src/db/tables/fundingTransfers.ts +153 -0
- package/src/db/tables/organizations.ts +16 -0
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +11 -0
- package/src/db/tables/sponsoredTransactions.ts +3 -3
- package/src/db/tables/users.ts +16 -0
- package/src/db/tables/verifiedTokens.ts +19 -14
- package/src/db/tables/webhookSubscriptions.ts +58 -3
- package/src/handlers/relay.test.ts +2 -0
- package/src/handlers/relay.ts +95 -99
- package/src/internal/Auth.test.ts +225 -5
- package/src/internal/Auth.ts +109 -20
- package/src/internal/Cache.test.ts +37 -3
- package/src/internal/Cache.ts +14 -10
- package/src/internal/Cursor.test.ts +2 -2
- package/src/internal/Cursor.ts +1 -1
- package/src/internal/EarnRates.test.ts +125 -0
- package/src/internal/EarnRates.ts +409 -0
- package/src/internal/EarnVaults.test.ts +195 -0
- package/src/internal/EarnVaults.ts +876 -0
- package/src/internal/EdgeCache.test.ts +26 -7
- package/src/internal/EdgeCache.ts +48 -9
- package/src/internal/Id.ts +14 -0
- package/src/internal/Idempotency.test.ts +109 -0
- package/src/internal/Idempotency.ts +237 -0
- package/src/internal/IpAllowlist.test.ts +52 -0
- package/src/internal/IpAllowlist.ts +39 -0
- package/src/internal/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +196 -9
- package/src/internal/Log.ts +124 -17
- package/src/internal/MetricSink.test.ts +244 -4
- package/src/internal/MetricSink.ts +51 -1
- package/src/internal/OpenApi.ts +4 -1
- package/src/internal/Provider.test.ts +17 -0
- package/src/internal/Provider.ts +17 -0
- package/src/internal/Schema.ts +27 -17
- package/src/internal/Store.test.ts +25 -0
- package/src/internal/Store.ts +46 -0
- package/src/internal/Tidx.local.test.ts +78 -3
- package/src/internal/Tidx.test.ts +240 -18
- package/src/internal/Tidx.ts +129 -33
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +198 -17
- package/src/internal/Viem.ts +127 -28
- package/src/internal/WebhookDestination.ts +25 -23
- package/src/internal/Webhooks.test.ts +59 -0
- package/src/internal/Webhooks.ts +34 -10
- package/src/internal/exchange/Provider.test.ts +216 -0
- package/src/internal/exchange/Provider.ts +326 -0
- package/src/internal/exchange/index.test.ts +6 -0
- package/src/internal/exchange/index.ts +1 -0
- package/src/internal/exchange/providers/uniswap.test.ts +122 -0
- package/src/internal/exchange/providers/uniswap.ts +682 -0
- package/src/internal/funding/Action.test.ts +138 -0
- package/src/internal/funding/Action.ts +117 -0
- package/src/internal/funding/Catalog.test.ts +311 -0
- package/src/internal/funding/Catalog.ts +347 -0
- package/src/internal/funding/Chain.test.ts +79 -0
- package/src/internal/funding/Chain.ts +120 -0
- package/src/internal/funding/Deposit.test.ts +26 -0
- package/src/internal/funding/Deposit.ts +522 -0
- package/src/internal/funding/DepositAddress.test.ts +18 -0
- package/src/internal/funding/DepositAddress.ts +312 -0
- package/src/internal/funding/Evidence.test.ts +297 -0
- package/src/internal/funding/Evidence.ts +425 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1911 -0
- package/src/internal/funding/Reconciliation.local.test.ts +511 -0
- package/src/internal/funding/Reconciliation.test.ts +3037 -0
- package/src/internal/funding/Reconciliation.ts +1202 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -0
- package/src/internal/funding/SourceObservation.test.ts +301 -0
- package/src/internal/funding/SourceObservation.ts +267 -0
- package/src/internal/funding/Subsidy.local.test.ts +152 -0
- package/src/internal/funding/Subsidy.test.ts +75 -0
- package/src/internal/funding/Subsidy.ts +260 -0
- package/src/internal/funding/Token.test.ts +47 -0
- package/src/internal/funding/Token.ts +59 -0
- package/src/internal/funding/Transfer.test.ts +369 -0
- package/src/internal/funding/Transfer.ts +522 -0
- package/src/internal/funding/index.test.ts +21 -0
- package/src/internal/funding/index.ts +13 -0
- package/src/internal/funding/providers/across.ts +149 -0
- package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
- package/src/internal/funding/providers/relay.test.ts +564 -0
- package/src/internal/funding/providers/relay.ts +1060 -0
- package/src/internal/funding/providers/rhino.ts +139 -0
- package/src/internal/funding/providers/squid.ts +151 -0
- package/src/internal/funding/providers/symbiosis.ts +221 -0
- package/src/internal/index.test.ts +5 -1
- package/src/internal/index.ts +5 -1
- package/src/internal/webhookDestinations/url.ts +49 -45
- package/src/providers/index.test.ts +14 -0
- package/src/providers/index.ts +54 -0
- package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
- package/dist/apps/data/FundingQuoteProviders.js +0 -775
- package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
- package/dist/apps/data/routes/funding.d.ts.map +0 -1
- package/dist/apps/data/routes/funding.js +0 -410
- package/dist/apps/data/routes/funding.js.map +0 -1
- package/dist/internal/FundingQuotes.d.ts +0 -864
- package/dist/internal/FundingQuotes.d.ts.map +0 -1
- package/dist/internal/FundingQuotes.js +0 -672
- package/dist/internal/FundingQuotes.js.map +0 -1
- package/src/apps/data/FundingQuoteProviders.ts +0 -1043
- package/src/apps/data/routes/funding.test.ts +0 -503
- package/src/apps/data/routes/funding.ts +0 -604
- package/src/internal/FundingQuotes.test.ts +0 -456
- package/src/internal/FundingQuotes.ts +0 -944
|
@@ -21,6 +21,7 @@ import * as TestStore from '../../test/Store.js'
|
|
|
21
21
|
import * as Tempo from '../../test/Tempo.js'
|
|
22
22
|
|
|
23
23
|
const key = {
|
|
24
|
+
allowedIps: [],
|
|
24
25
|
environment: 'production',
|
|
25
26
|
id: 'key_test',
|
|
26
27
|
name: 'Test key',
|
|
@@ -295,6 +296,135 @@ describe('require', () => {
|
|
|
295
296
|
}
|
|
296
297
|
`)
|
|
297
298
|
})
|
|
299
|
+
|
|
300
|
+
test.each([
|
|
301
|
+
['tempo-api-key', '/protected', { 'tempo-api-key': token }],
|
|
302
|
+
['Bearer', '/protected', { authorization: `Bearer ${token}` }],
|
|
303
|
+
['x-api-key', '/protected', { 'x-api-key': token }],
|
|
304
|
+
['query key', `/protected?key=${token}`, {}],
|
|
305
|
+
] as const)('enforces an allowlist for the %s credential', async (_name, path, credential) => {
|
|
306
|
+
const app = createApp({
|
|
307
|
+
auth: {
|
|
308
|
+
apiKey: {
|
|
309
|
+
resolve: TestApp.resolver({
|
|
310
|
+
keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
|
|
311
|
+
}),
|
|
312
|
+
},
|
|
313
|
+
rateLimit: RateLimit.memory(),
|
|
314
|
+
},
|
|
315
|
+
})
|
|
316
|
+
const response = await app.request(path, {
|
|
317
|
+
headers: { ...credential, 'cf-connecting-ip': '198.51.100.7' },
|
|
318
|
+
})
|
|
319
|
+
|
|
320
|
+
expect(response.status).toBe(403)
|
|
321
|
+
expect(await response.json()).toMatchObject({ error: { code: 'api_key_ip_forbidden' } })
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
test('rejects a missing client IP', async () => {
|
|
325
|
+
const app = createApp({
|
|
326
|
+
auth: {
|
|
327
|
+
apiKey: {
|
|
328
|
+
resolve: TestApp.resolver({
|
|
329
|
+
keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
|
|
330
|
+
}),
|
|
331
|
+
},
|
|
332
|
+
rateLimit: RateLimit.memory(),
|
|
333
|
+
},
|
|
334
|
+
})
|
|
335
|
+
const response = await app.request('/protected', {
|
|
336
|
+
headers: { 'tempo-api-key': token },
|
|
337
|
+
})
|
|
338
|
+
|
|
339
|
+
expect(response.status).toBe(403)
|
|
340
|
+
expect(await response.json()).toMatchObject({ error: { code: 'api_key_ip_forbidden' } })
|
|
341
|
+
})
|
|
342
|
+
|
|
343
|
+
test('does not trust a Cloudflare IP header outside Cloudflare', async () => {
|
|
344
|
+
const app = createApp({
|
|
345
|
+
auth: {
|
|
346
|
+
apiKey: {
|
|
347
|
+
resolve: TestApp.resolver({
|
|
348
|
+
keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
|
|
349
|
+
}),
|
|
350
|
+
},
|
|
351
|
+
rateLimit: RateLimit.memory(),
|
|
352
|
+
},
|
|
353
|
+
})
|
|
354
|
+
const response = await app.request('/protected', {
|
|
355
|
+
headers: {
|
|
356
|
+
'cf-connecting-ip': '203.0.113.7',
|
|
357
|
+
'tempo-api-key': token,
|
|
358
|
+
},
|
|
359
|
+
})
|
|
360
|
+
|
|
361
|
+
expect(response.status).toBe(403)
|
|
362
|
+
expect(await response.json()).toMatchObject({ error: { code: 'api_key_ip_forbidden' } })
|
|
363
|
+
})
|
|
364
|
+
|
|
365
|
+
test('uses the Cloudflare IP header with Cloudflare request metadata', async () => {
|
|
366
|
+
const app = createApp({
|
|
367
|
+
auth: {
|
|
368
|
+
apiKey: {
|
|
369
|
+
resolve: TestApp.resolver({
|
|
370
|
+
keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
|
|
371
|
+
}),
|
|
372
|
+
},
|
|
373
|
+
rateLimit: RateLimit.memory(),
|
|
374
|
+
},
|
|
375
|
+
})
|
|
376
|
+
const request = Object.assign(
|
|
377
|
+
new Request('http://localhost/protected', {
|
|
378
|
+
headers: {
|
|
379
|
+
'cf-connecting-ip': '203.0.113.7',
|
|
380
|
+
'tempo-api-key': token,
|
|
381
|
+
},
|
|
382
|
+
}),
|
|
383
|
+
{ cf: {} },
|
|
384
|
+
)
|
|
385
|
+
const response = await app.fetch(request)
|
|
386
|
+
|
|
387
|
+
expect(response.status).toBe(200)
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
test('uses the configured trusted client-IP resolver', async () => {
|
|
391
|
+
const app = createApp({
|
|
392
|
+
auth: {
|
|
393
|
+
apiKey: {
|
|
394
|
+
resolve: TestApp.resolver({
|
|
395
|
+
keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
|
|
396
|
+
}),
|
|
397
|
+
},
|
|
398
|
+
publicClientIp: (request) => request.headers.get('x-real-ip') ?? undefined,
|
|
399
|
+
rateLimit: RateLimit.memory(),
|
|
400
|
+
},
|
|
401
|
+
})
|
|
402
|
+
const response = await app.request('/protected', {
|
|
403
|
+
headers: {
|
|
404
|
+
'cf-connecting-ip': '198.51.100.7',
|
|
405
|
+
'tempo-api-key': token,
|
|
406
|
+
'x-real-ip': '203.0.113.7',
|
|
407
|
+
},
|
|
408
|
+
})
|
|
409
|
+
|
|
410
|
+
expect(response.status).toBe(200)
|
|
411
|
+
})
|
|
412
|
+
|
|
413
|
+
test('treats an empty allowlist as unrestricted', async () => {
|
|
414
|
+
const app = createApp({
|
|
415
|
+
auth: {
|
|
416
|
+
apiKey: {
|
|
417
|
+
resolve: TestApp.resolver({ keys: [{ ...key, allowedIps: [], token }] }),
|
|
418
|
+
},
|
|
419
|
+
rateLimit: RateLimit.memory(),
|
|
420
|
+
},
|
|
421
|
+
})
|
|
422
|
+
const response = await app.request('/protected', {
|
|
423
|
+
headers: { 'tempo-api-key': token },
|
|
424
|
+
})
|
|
425
|
+
|
|
426
|
+
expect(response.status).toBe(200)
|
|
427
|
+
})
|
|
298
428
|
})
|
|
299
429
|
|
|
300
430
|
describe('session', () => {
|
|
@@ -383,6 +513,37 @@ describe('require', () => {
|
|
|
383
513
|
`)
|
|
384
514
|
})
|
|
385
515
|
|
|
516
|
+
test('applies the session-only route error before key restrictions', async () => {
|
|
517
|
+
const app = createApp({
|
|
518
|
+
auth: {
|
|
519
|
+
apiKey: {
|
|
520
|
+
resolve: TestApp.resolver({
|
|
521
|
+
keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
|
|
522
|
+
}),
|
|
523
|
+
},
|
|
524
|
+
publicClientIp: (request) => request.headers.get('x-real-ip') ?? undefined,
|
|
525
|
+
rateLimit: RateLimit.memory(),
|
|
526
|
+
},
|
|
527
|
+
policy: { session: true },
|
|
528
|
+
})
|
|
529
|
+
const response = await app.request('/protected', {
|
|
530
|
+
headers: {
|
|
531
|
+
'tempo-api-key': token,
|
|
532
|
+
'x-real-ip': '198.51.100.7',
|
|
533
|
+
},
|
|
534
|
+
})
|
|
535
|
+
|
|
536
|
+
expect(response.status).toBe(403)
|
|
537
|
+
expect(await response.json()).toMatchInlineSnapshot(`
|
|
538
|
+
{
|
|
539
|
+
"error": {
|
|
540
|
+
"code": "forbidden",
|
|
541
|
+
"message": "API key not permitted for this route",
|
|
542
|
+
},
|
|
543
|
+
}
|
|
544
|
+
`)
|
|
545
|
+
})
|
|
546
|
+
|
|
386
547
|
test('is not consulted on lane-less routes', async () => {
|
|
387
548
|
const app = createSessionApp({
|
|
388
549
|
policy: {},
|
|
@@ -1228,7 +1389,7 @@ describe('require', () => {
|
|
|
1228
1389
|
})
|
|
1229
1390
|
})
|
|
1230
1391
|
|
|
1231
|
-
test('
|
|
1392
|
+
test('tops up the channel before signing a voucher that exceeds its deposit', async () => {
|
|
1232
1393
|
const mpp = createMppServer()
|
|
1233
1394
|
const app = createApp({
|
|
1234
1395
|
auth: {
|
|
@@ -1243,14 +1404,25 @@ describe('require', () => {
|
|
|
1243
1404
|
})
|
|
1244
1405
|
const client = createMppClient(app)
|
|
1245
1406
|
|
|
1246
|
-
// The opening deposit covers one request
|
|
1247
|
-
//
|
|
1407
|
+
// The opening deposit covers one request. The client tops up the channel
|
|
1408
|
+
// before signing the second voucher.
|
|
1248
1409
|
const first = await client.fetch('http://tempo-api.test/protected')
|
|
1249
1410
|
const second = await client.fetch('http://tempo-api.test/protected')
|
|
1250
1411
|
|
|
1251
1412
|
expect(first.status).toBe(200)
|
|
1252
|
-
expect(second.status).toBe(
|
|
1253
|
-
|
|
1413
|
+
expect(second.status).toBe(200)
|
|
1414
|
+
|
|
1415
|
+
const receipt1 = sessionReceipt(first)
|
|
1416
|
+
const receipt2 = sessionReceipt(second)
|
|
1417
|
+
expect(receipt2).toMatchObject({
|
|
1418
|
+
channelId: receipt1.channelId,
|
|
1419
|
+
spent: '2000000',
|
|
1420
|
+
})
|
|
1421
|
+
|
|
1422
|
+
const state = await Actions.channel.getStates(Tempo.client, {
|
|
1423
|
+
channel: receipt1.channelId,
|
|
1424
|
+
})
|
|
1425
|
+
expect(state.deposit).toBe(2_000_000n)
|
|
1254
1426
|
})
|
|
1255
1427
|
|
|
1256
1428
|
test('rejects a malformed payment credential with a fresh challenge', async () => {
|
|
@@ -1889,6 +2061,54 @@ describe('ensureProject', () => {
|
|
|
1889
2061
|
})
|
|
1890
2062
|
})
|
|
1891
2063
|
|
|
2064
|
+
describe('parseCredential', () => {
|
|
2065
|
+
test('parses credentials keyed by chain id', () => {
|
|
2066
|
+
const credential = Auth.parseCredential(
|
|
2067
|
+
JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone:secret' }),
|
|
2068
|
+
)
|
|
2069
|
+
|
|
2070
|
+
expect(credential).toEqual({ 4217: 'mainnet:secret', 421700001: 'zone:secret' })
|
|
2071
|
+
})
|
|
2072
|
+
|
|
2073
|
+
test('supports a shared credential', () => {
|
|
2074
|
+
expect(Auth.parseCredential('shared:secret')).toBe('shared:secret')
|
|
2075
|
+
})
|
|
2076
|
+
|
|
2077
|
+
test('rejects malformed credential maps', () => {
|
|
2078
|
+
expect(() => Auth.parseCredential('{"4217":1}')).toThrowErrorMatchingInlineSnapshot(
|
|
2079
|
+
`[Error: Expected a credential or a chain-id-to-credential JSON object.]`,
|
|
2080
|
+
)
|
|
2081
|
+
})
|
|
2082
|
+
})
|
|
2083
|
+
|
|
2084
|
+
describe('resolveCredential', () => {
|
|
2085
|
+
test('infers Basic auth from a credential containing a colon', () => {
|
|
2086
|
+
expect(Auth.resolveCredential({ chainId: 4217, value: 'user:password' })).toEqual({
|
|
2087
|
+
basicAuth: 'user:password',
|
|
2088
|
+
})
|
|
2089
|
+
})
|
|
2090
|
+
|
|
2091
|
+
test('infers Bearer auth from a credential without a colon', () => {
|
|
2092
|
+
expect(Auth.resolveCredential({ chainId: 4217, value: 'bearer-token' })).toEqual({
|
|
2093
|
+
basicAuth: undefined,
|
|
2094
|
+
bearerAuth: 'bearer-token',
|
|
2095
|
+
})
|
|
2096
|
+
})
|
|
2097
|
+
|
|
2098
|
+
test('selects a credential by chain id', () => {
|
|
2099
|
+
const value = JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone-token' })
|
|
2100
|
+
|
|
2101
|
+
expect(Auth.resolveCredential({ chainId: 4217, value })).toEqual({
|
|
2102
|
+
basicAuth: 'mainnet:secret',
|
|
2103
|
+
})
|
|
2104
|
+
expect(Auth.resolveCredential({ chainId: 421700001, value })).toEqual({
|
|
2105
|
+
basicAuth: undefined,
|
|
2106
|
+
bearerAuth: 'zone-token',
|
|
2107
|
+
})
|
|
2108
|
+
expect(Auth.resolveCredential({ chainId: 42431, value })).toEqual({ basicAuth: undefined })
|
|
2109
|
+
})
|
|
2110
|
+
})
|
|
2111
|
+
|
|
1892
2112
|
function createScopedApp(options: {
|
|
1893
2113
|
auth?: Auth.Context | undefined
|
|
1894
2114
|
routes: readonly { path: string; policy: Auth.require.Policy }[]
|
package/src/internal/Auth.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { findTargetHandler } from 'hono/utils/handler'
|
|
|
9
9
|
import { Challenge, Credential, type Method } from 'mppx'
|
|
10
10
|
import { Mppx, tempo } from 'mppx/hono'
|
|
11
11
|
import { Addresses } from 'viem/tempo'
|
|
12
|
+
import { tempoMainnet } from 'viem/tempo/chains'
|
|
12
13
|
import * as z from 'zod/mini'
|
|
13
14
|
|
|
14
15
|
import type * as App from '../App.js'
|
|
@@ -17,6 +18,7 @@ import * as ApiKeys from '../ApiKeys.js'
|
|
|
17
18
|
import * as Db from '../db/Db.js'
|
|
18
19
|
import type * as Store from './Store.js'
|
|
19
20
|
import * as Memberships from '../db/tables/memberships.js'
|
|
21
|
+
import * as IpAllowlist from './IpAllowlist.js'
|
|
20
22
|
import * as Metadata from '../apps/metadata.js'
|
|
21
23
|
import * as OpenApi from './OpenApi.js'
|
|
22
24
|
import * as Organizations from '../db/tables/organizations.js'
|
|
@@ -26,7 +28,6 @@ import * as Response from './Response.js'
|
|
|
26
28
|
import * as Schema from './Schema.js'
|
|
27
29
|
import * as Scope from '../Scope.js'
|
|
28
30
|
import * as Users from '../db/tables/users.js'
|
|
29
|
-
import * as Viem from './Viem.js'
|
|
30
31
|
|
|
31
32
|
const policySymbol = Symbol('tempo-api.auth.policy')
|
|
32
33
|
const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management')
|
|
@@ -438,12 +439,16 @@ export function accessError(c: hono_Context) {
|
|
|
438
439
|
status: 401,
|
|
439
440
|
})
|
|
440
441
|
}
|
|
441
|
-
if (status === 403)
|
|
442
|
+
if (status === 403) {
|
|
443
|
+
const ipForbidden = c.req.header('tempo-narrow-access-code') === 'api_key_ip_forbidden'
|
|
442
444
|
return Response.error(c, {
|
|
443
|
-
code: 'api_key_forbidden',
|
|
444
|
-
message:
|
|
445
|
+
code: ipForbidden ? 'api_key_ip_forbidden' : 'api_key_forbidden',
|
|
446
|
+
message: ipForbidden
|
|
447
|
+
? 'API key not permitted from this IP address'
|
|
448
|
+
: 'API key missing required scope',
|
|
445
449
|
status: 403,
|
|
446
450
|
})
|
|
451
|
+
}
|
|
447
452
|
const code =
|
|
448
453
|
c.req.header('tempo-narrow-access-code') === 'rate_limit_exceeded'
|
|
449
454
|
? 'rate_limit_exceeded'
|
|
@@ -511,8 +516,8 @@ export function middleware<
|
|
|
511
516
|
// store is configured, every token resolves to `null` (closed).
|
|
512
517
|
// Resolution is cached per isolate by default (positive 60s / negative 10s,
|
|
513
518
|
// keyed by token sha256) so hot keys skip the backend read on the auth path
|
|
514
|
-
// of every request. Pass `apiKey.cache: false` when
|
|
515
|
-
//
|
|
519
|
+
// of every request. Pass `apiKey.cache: false` when immediate key updates
|
|
520
|
+
// matter more than the per-request read.
|
|
516
521
|
const resolve = (() => {
|
|
517
522
|
const uncached = (c: hono_Context, token: string) => {
|
|
518
523
|
const kv = contextKv(c)
|
|
@@ -606,8 +611,8 @@ export declare namespace middleware {
|
|
|
606
611
|
/**
|
|
607
612
|
* Resolve-cache tuning (per-isolate, positive 60s / negative 10s by
|
|
608
613
|
* default), or `false` to resolve uncached on every request — e.g.
|
|
609
|
-
* when
|
|
610
|
-
* read.
|
|
614
|
+
* when immediate key updates matter more than the per-request
|
|
615
|
+
* backend read.
|
|
611
616
|
*/
|
|
612
617
|
cache?: Cache | false | undefined
|
|
613
618
|
/** API-key quotas keyed by quota scope (reserved `'*'` is the config default). */
|
|
@@ -624,7 +629,7 @@ export declare namespace middleware {
|
|
|
624
629
|
/** Default public access policy. Pass false to disable anonymous access. */
|
|
625
630
|
public?:
|
|
626
631
|
| {
|
|
627
|
-
/** Resolves the client IP from trusted runtime or proxy metadata.
|
|
632
|
+
/** Resolves the client IP from trusted runtime or proxy metadata. Required outside Cloudflare for API-key allowlists. */
|
|
628
633
|
clientIp?: ((request: Request) => string | undefined) | undefined
|
|
629
634
|
/** Anonymous public quota for protected routes. */
|
|
630
635
|
rateLimit?: RateLimit.Limit | undefined
|
|
@@ -1448,10 +1453,32 @@ export function require<environment extends Environment = Environment>(
|
|
|
1448
1453
|
const principal = principalFromApiKey(apiKey)
|
|
1449
1454
|
c.set('principal', principal)
|
|
1450
1455
|
|
|
1456
|
+
// Default-deny: routes with no API-key lane allow only the super admin.
|
|
1457
|
+
// A valid key is authenticated but forbidden.
|
|
1458
|
+
if (!policy.apiKey)
|
|
1459
|
+
return jsonError(c, {
|
|
1460
|
+
code: 'forbidden',
|
|
1461
|
+
message: 'API key not permitted for this route',
|
|
1462
|
+
status: 403,
|
|
1463
|
+
})
|
|
1464
|
+
|
|
1465
|
+
if (
|
|
1466
|
+
apiKey.allowedIps.length &&
|
|
1467
|
+
!(await IpAllowlist.allows(c, {
|
|
1468
|
+
address: trustedClientIp(c, auth),
|
|
1469
|
+
rules: apiKey.allowedIps,
|
|
1470
|
+
}))
|
|
1471
|
+
)
|
|
1472
|
+
return jsonError(c, {
|
|
1473
|
+
code: 'api_key_ip_forbidden',
|
|
1474
|
+
message: 'API key not permitted from this IP address',
|
|
1475
|
+
status: 403,
|
|
1476
|
+
})
|
|
1477
|
+
|
|
1451
1478
|
if (
|
|
1452
1479
|
apiKey.environment === 'sandbox' &&
|
|
1453
1480
|
explicitChain !== undefined &&
|
|
1454
|
-
|
|
1481
|
+
explicitChain === tempoMainnet.id
|
|
1455
1482
|
)
|
|
1456
1483
|
return jsonError(c, {
|
|
1457
1484
|
code: 'api_key_forbidden',
|
|
@@ -1459,14 +1486,6 @@ export function require<environment extends Environment = Environment>(
|
|
|
1459
1486
|
status: 403,
|
|
1460
1487
|
})
|
|
1461
1488
|
|
|
1462
|
-
// Default-deny: routes with no API-key lane allow only the super admin.
|
|
1463
|
-
// A valid key is authenticated but forbidden.
|
|
1464
|
-
if (!policy.apiKey)
|
|
1465
|
-
return jsonError(c, {
|
|
1466
|
-
code: 'forbidden',
|
|
1467
|
-
message: 'API key not permitted for this route',
|
|
1468
|
-
status: 403,
|
|
1469
|
-
})
|
|
1470
1489
|
const missing = apiKey.scopes.includes(Scope.wildcard)
|
|
1471
1490
|
? []
|
|
1472
1491
|
: (policy.apiKey?.scopes.filter((scope) => !apiKey.scopes.includes(scope)) ?? [])
|
|
@@ -1644,6 +1663,65 @@ type RateLimitAccess = PaymentAccess & {
|
|
|
1644
1663
|
rateLimit: RateLimit.Result
|
|
1645
1664
|
}
|
|
1646
1665
|
|
|
1666
|
+
/** Shared or per-chain credentials. */
|
|
1667
|
+
export type ChainCredential = string | Record<number, string>
|
|
1668
|
+
|
|
1669
|
+
/** Parses shared or per-chain credentials from an environment value. */
|
|
1670
|
+
export function parseCredential(value: ChainCredential | undefined): parseCredential.ReturnType {
|
|
1671
|
+
if (!value) return undefined
|
|
1672
|
+
if (typeof value !== 'string') return value
|
|
1673
|
+
const credentials = (() => {
|
|
1674
|
+
try {
|
|
1675
|
+
return JSON.parse(value) as unknown
|
|
1676
|
+
} catch {
|
|
1677
|
+
return value
|
|
1678
|
+
}
|
|
1679
|
+
})()
|
|
1680
|
+
if (typeof credentials === 'string') return credentials
|
|
1681
|
+
if (
|
|
1682
|
+
!credentials ||
|
|
1683
|
+
typeof credentials !== 'object' ||
|
|
1684
|
+
Array.isArray(credentials) ||
|
|
1685
|
+
Object.values(credentials).some((credential) => typeof credential !== 'string')
|
|
1686
|
+
)
|
|
1687
|
+
throw new Error('Expected a credential or a chain-id-to-credential JSON object.')
|
|
1688
|
+
return credentials as Record<number, string>
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1691
|
+
export declare namespace parseCredential {
|
|
1692
|
+
/** Parsed shared or per-chain credentials. */
|
|
1693
|
+
type ReturnType = ChainCredential | undefined
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
/** Resolves a chain credential and infers its HTTP authorization scheme. */
|
|
1697
|
+
export function resolveCredential(
|
|
1698
|
+
options: resolveCredential.Options,
|
|
1699
|
+
): resolveCredential.ReturnType {
|
|
1700
|
+
const credentials = parseCredential(options.value)
|
|
1701
|
+
const credential = typeof credentials === 'string' ? credentials : credentials?.[options.chainId]
|
|
1702
|
+
if (!credential) return { basicAuth: undefined }
|
|
1703
|
+
if (credential.includes(':')) return { basicAuth: credential }
|
|
1704
|
+
return { basicAuth: undefined, bearerAuth: credential }
|
|
1705
|
+
}
|
|
1706
|
+
|
|
1707
|
+
export declare namespace resolveCredential {
|
|
1708
|
+
/** Options for resolving a chain credential. */
|
|
1709
|
+
type Options = {
|
|
1710
|
+
/** Chain id selecting a per-chain credential. */
|
|
1711
|
+
chainId: number
|
|
1712
|
+
/** Shared or per-chain credentials. */
|
|
1713
|
+
value?: ChainCredential | undefined
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
/** Resolved HTTP authorization credentials. */
|
|
1717
|
+
type ReturnType = {
|
|
1718
|
+
/** Basic credentials inferred from a value containing a colon. */
|
|
1719
|
+
basicAuth: string | undefined
|
|
1720
|
+
/** Bearer credential inferred from a value without a colon. */
|
|
1721
|
+
bearerAuth?: string | undefined
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1647
1725
|
/**
|
|
1648
1726
|
* How long to wait for the rate-limit counter before failing open. A hot
|
|
1649
1727
|
* counter backend (e.g. a single Durable Object serving one busy quota bucket)
|
|
@@ -1762,6 +1840,17 @@ function getApiKeyCredential(c: hono_Context): ApiKeyCredential | false | null {
|
|
|
1762
1840
|
return null
|
|
1763
1841
|
}
|
|
1764
1842
|
|
|
1843
|
+
function clientIp(c: hono_Context, auth: Context): string | undefined {
|
|
1844
|
+
return auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip')
|
|
1845
|
+
}
|
|
1846
|
+
|
|
1847
|
+
function trustedClientIp(c: hono_Context, auth: Context): string | undefined {
|
|
1848
|
+
if (auth.publicClientIp) return auth.publicClientIp(c.req.raw)
|
|
1849
|
+
// Cloudflare supplies both the request metadata and this header.
|
|
1850
|
+
if (!('cf' in c.req.raw)) return undefined
|
|
1851
|
+
return c.req.header('cf-connecting-ip')
|
|
1852
|
+
}
|
|
1853
|
+
|
|
1765
1854
|
/** Removes the reserved auth query parameter before route validation. */
|
|
1766
1855
|
function stripApiKeyQuery(c: hono_Context) {
|
|
1767
1856
|
const url = new URL(c.req.url)
|
|
@@ -1877,7 +1966,7 @@ function principalFromApiKey(apiKey: ApiKey.ApiKey): Principal {
|
|
|
1877
1966
|
}
|
|
1878
1967
|
|
|
1879
1968
|
function principalFromPublic(c: hono_Context, auth: Context): Principal {
|
|
1880
|
-
const ip =
|
|
1969
|
+
const ip = clientIp(c, auth)
|
|
1881
1970
|
return {
|
|
1882
1971
|
id: ip ? RateLimit.normalizeIp(ip) : 'anonymous',
|
|
1883
1972
|
type: 'public',
|
|
@@ -1997,7 +2086,7 @@ const cachedMaxEntries = 10_000
|
|
|
1997
2086
|
* (default 60s), negative for `negativeTtl` (default 10s) so a freshly minted
|
|
1998
2087
|
* key is usable quickly; concurrent misses for one token are single-flighted.
|
|
1999
2088
|
* Entries are keyed by the token's sha256 (`ApiKey.hash`) — never the
|
|
2000
|
-
* plaintext.
|
|
2089
|
+
* plaintext. Key updates may remain stale for up to `ttl`, the accepted
|
|
2001
2090
|
* trade-off for removing a backend read from the auth path.
|
|
2002
2091
|
*/
|
|
2003
2092
|
function cachedResolve(
|
|
@@ -52,7 +52,7 @@ describe('response', () => {
|
|
|
52
52
|
expect(etag(first)).toMatchInlineSnapshot(`"<etag>"`)
|
|
53
53
|
expect(first.headers.get('ratelimit-remaining')).toMatchInlineSnapshot(`"9"`)
|
|
54
54
|
expect(first.headers.get('vary')).toMatchInlineSnapshot(
|
|
55
|
-
`"Accept-Encoding, Authorization, Tempo-API-Key"`,
|
|
55
|
+
`"Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key"`,
|
|
56
56
|
)
|
|
57
57
|
|
|
58
58
|
expect(await second.json()).toMatchInlineSnapshot(`
|
|
@@ -66,7 +66,7 @@ describe('response', () => {
|
|
|
66
66
|
expect(second.headers.get('etag') === first.headers.get('etag')).toMatchInlineSnapshot(`true`)
|
|
67
67
|
expect(second.headers.get('ratelimit-remaining')).toMatchInlineSnapshot(`"8"`)
|
|
68
68
|
expect(second.headers.get('vary')).toMatchInlineSnapshot(
|
|
69
|
-
`"Accept-Encoding, Authorization, Tempo-API-Key"`,
|
|
69
|
+
`"Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key"`,
|
|
70
70
|
)
|
|
71
71
|
|
|
72
72
|
expect(third.status).toMatchInlineSnapshot(`304`)
|
|
@@ -77,11 +77,45 @@ describe('response', () => {
|
|
|
77
77
|
expect(third.headers.get('etag') === first.headers.get('etag')).toMatchInlineSnapshot(`true`)
|
|
78
78
|
expect(third.headers.get('ratelimit-remaining')).toMatchInlineSnapshot(`"8"`)
|
|
79
79
|
expect(third.headers.get('vary')).toMatchInlineSnapshot(
|
|
80
|
-
`"Accept-Encoding, Authorization, Tempo-API-Key"`,
|
|
80
|
+
`"Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key"`,
|
|
81
81
|
)
|
|
82
82
|
})
|
|
83
83
|
})
|
|
84
84
|
|
|
85
|
+
test('varies cached responses by the legacy API-key header', async () => {
|
|
86
|
+
await withCaches(async () => {
|
|
87
|
+
let calls = 0
|
|
88
|
+
const app = new Hono()
|
|
89
|
+
app.get('/', Cache.response({ key: (c) => c.req.url, name: 'test' }), (c) =>
|
|
90
|
+
c.json({ calls: ++calls, token: c.req.header('x-api-key') }),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
const first = await app.request('/', { headers: { 'x-api-key': 'one' } })
|
|
94
|
+
const second = await app.request('/', { headers: { 'x-api-key': 'two' } })
|
|
95
|
+
const hit = await app.request('/', { headers: { 'x-api-key': 'one' } })
|
|
96
|
+
|
|
97
|
+
expect(calls).toMatchInlineSnapshot(`2`)
|
|
98
|
+
expect(await first.json()).toMatchInlineSnapshot(`
|
|
99
|
+
{
|
|
100
|
+
"calls": 1,
|
|
101
|
+
"token": "one",
|
|
102
|
+
}
|
|
103
|
+
`)
|
|
104
|
+
expect(await second.json()).toMatchInlineSnapshot(`
|
|
105
|
+
{
|
|
106
|
+
"calls": 2,
|
|
107
|
+
"token": "two",
|
|
108
|
+
}
|
|
109
|
+
`)
|
|
110
|
+
expect(await hit.json()).toMatchInlineSnapshot(`
|
|
111
|
+
{
|
|
112
|
+
"calls": 1,
|
|
113
|
+
"token": "one",
|
|
114
|
+
}
|
|
115
|
+
`)
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
|
|
85
119
|
test('stores entries with the shared policy form, not the client form', async () => {
|
|
86
120
|
await withCaches(async (stores) => {
|
|
87
121
|
const app = new Hono()
|
package/src/internal/Cache.ts
CHANGED
|
@@ -57,7 +57,7 @@ export function response<environment extends Env>(
|
|
|
57
57
|
options: response.Options<environment>,
|
|
58
58
|
): MiddlewareHandler<environment> {
|
|
59
59
|
const defaultCacheControl = options.cacheControl ?? policies.default
|
|
60
|
-
const vary = options.vary ?? ['Accept-Encoding', 'Authorization', 'Tempo-API-Key']
|
|
60
|
+
const vary = options.vary ?? ['Accept-Encoding', 'Authorization', 'Tempo-API-Key', 'X-API-Key']
|
|
61
61
|
// hono/cache suffixes its key with `::<directive>=<value>` for every
|
|
62
62
|
// configured vary directive (trimmed, lowercased, deduped). Mirror that
|
|
63
63
|
// normalization so the `no-cache` purge below deletes exactly the entry the
|
|
@@ -140,7 +140,7 @@ export function response<environment extends Env>(
|
|
|
140
140
|
let res = result instanceof Response ? new Response(result.body, result) : c.res
|
|
141
141
|
if (
|
|
142
142
|
result instanceof Response &&
|
|
143
|
-
|
|
143
|
+
Etag.matches(res.headers.get('ETag'), c.req.header('If-None-Match'))
|
|
144
144
|
)
|
|
145
145
|
res = notModified(res)
|
|
146
146
|
|
|
@@ -158,7 +158,9 @@ export function response<environment extends Env>(
|
|
|
158
158
|
|
|
159
159
|
// `markCacheable` lets the edge layer pay its store lookup only on routes
|
|
160
160
|
// that mount this middleware; everything else skips the read.
|
|
161
|
-
return EdgeCache.markCacheable(middleware
|
|
161
|
+
return EdgeCache.markCacheable(middleware, {
|
|
162
|
+
key: options.key as (c: Context) => Promise<string> | string,
|
|
163
|
+
})
|
|
162
164
|
}
|
|
163
165
|
|
|
164
166
|
export declare namespace response {
|
|
@@ -214,9 +216,15 @@ export function urlKey<
|
|
|
214
216
|
return url.toString()
|
|
215
217
|
}
|
|
216
218
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
219
|
+
namespace Etag {
|
|
220
|
+
export function matches(etag: string | null, ifNoneMatch: string | undefined) {
|
|
221
|
+
if (!etag || !ifNoneMatch) return false
|
|
222
|
+
return ifNoneMatch.split(/,\s*/).some((tag) => stripWeak(tag) === stripWeak(etag))
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function stripWeak(etag: string) {
|
|
226
|
+
return etag.replace(/^W\//, '')
|
|
227
|
+
}
|
|
220
228
|
}
|
|
221
229
|
|
|
222
230
|
function notModified(response: Response) {
|
|
@@ -248,10 +256,6 @@ function setCacheHeaders(
|
|
|
248
256
|
headers.set('Vary', Array.from(vary.values()).join(', '))
|
|
249
257
|
}
|
|
250
258
|
|
|
251
|
-
function stripWeak(etag: string) {
|
|
252
|
-
return etag.replace(/^W\//, '')
|
|
253
|
-
}
|
|
254
|
-
|
|
255
259
|
// Derive the shared-cache policy from a route's client `Cache-Control`. A
|
|
256
260
|
// positive `s-maxage`/`max-age` (and no `no-store`/`no-cache`) is what makes a
|
|
257
261
|
// route eligible for the anonymous edge cache; the `private` directive only
|
|
@@ -19,10 +19,10 @@ describe('Cursor', () => {
|
|
|
19
19
|
})
|
|
20
20
|
|
|
21
21
|
test('round-trips a timestamp/id tuple', () => {
|
|
22
|
-
const token = Cursor.encode(['2026-01-01T00:00:00.000Z', '
|
|
22
|
+
const token = Cursor.encode(['2026-01-01T00:00:00.000Z', 'source:transaction-0'])
|
|
23
23
|
expect(Cursor.decode(token, ['timestamp', 'id'])).toEqual([
|
|
24
24
|
'2026-01-01T00:00:00.000Z',
|
|
25
|
-
'
|
|
25
|
+
'source:transaction-0',
|
|
26
26
|
])
|
|
27
27
|
})
|
|
28
28
|
|
package/src/internal/Cursor.ts
CHANGED
|
@@ -138,7 +138,7 @@ function isValid(value: unknown, field: Field): boolean {
|
|
|
138
138
|
case 'address':
|
|
139
139
|
return typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value)
|
|
140
140
|
case 'id':
|
|
141
|
-
return typeof value === 'string' && /^[A-Za-z0-
|
|
141
|
+
return typeof value === 'string' && /^[A-Za-z0-9:_-]+$/.test(value)
|
|
142
142
|
case 'timestamp':
|
|
143
143
|
return typeof value === 'string' && !Number.isNaN(Date.parse(value))
|
|
144
144
|
}
|