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
package/src/apps/index.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export { data,
|
|
1
|
+
export { data, FxOracle } from './data/index.js'
|
|
2
|
+
export { funding } from './funding/index.js'
|
|
2
3
|
export { management } from './management/index.js'
|
|
3
4
|
export { mcp } from './mcp.js'
|
|
4
5
|
export { mpp } from './mpp/index.js'
|
|
5
6
|
export { relay } from './relay/index.js'
|
|
7
|
+
export * as Zones from './Zones.js'
|
|
@@ -576,4 +576,33 @@ describe('createRequestUsageReporter', () => {
|
|
|
576
576
|
expect((await RequestUsage.getBucket(db, { bucketStart, environment: 'production', orgId: 'org_1' }))?.reportedCount).toBe(6) // prettier-ignore
|
|
577
577
|
await db.close()
|
|
578
578
|
})
|
|
579
|
+
|
|
580
|
+
test('behavior: exposes the durable retry backlog for alerting', async () => {
|
|
581
|
+
const db = create()
|
|
582
|
+
await db.migrate()
|
|
583
|
+
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
|
|
584
|
+
await StripeCustomers.setStatus(db, 'org_1', 'active')
|
|
585
|
+
const { stripe } = stubStripe({
|
|
586
|
+
meterEvent() {
|
|
587
|
+
throw new Error('Stripe unavailable')
|
|
588
|
+
},
|
|
589
|
+
subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
|
|
590
|
+
})
|
|
591
|
+
const reporter = Billing.createRequestUsageReporter({
|
|
592
|
+
db,
|
|
593
|
+
now: () => Date.now(),
|
|
594
|
+
readCounts: async () => [{ bucketStart, count: 4, orgId: 'org_1' }],
|
|
595
|
+
stripe,
|
|
596
|
+
})
|
|
597
|
+
|
|
598
|
+
expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
599
|
+
expect(await reporter.pending()).toEqual([
|
|
600
|
+
{
|
|
601
|
+
count: 1,
|
|
602
|
+
environment: 'production',
|
|
603
|
+
oldestPendingAgeSeconds: expect.any(Number),
|
|
604
|
+
},
|
|
605
|
+
])
|
|
606
|
+
await db.close()
|
|
607
|
+
})
|
|
579
608
|
})
|
|
@@ -444,6 +444,20 @@ export function createRequestUsageReporter(
|
|
|
444
444
|
...(sandboxStripe ? [{ client: sandboxStripe, environment: 'sandbox' as const }] : []),
|
|
445
445
|
]
|
|
446
446
|
return {
|
|
447
|
+
async pending() {
|
|
448
|
+
return Promise.all(
|
|
449
|
+
clients.map(async ({ environment }) => {
|
|
450
|
+
const status = await RequestUsage.getPendingStatus(Db.get(db), environment)
|
|
451
|
+
return {
|
|
452
|
+
count: status.count,
|
|
453
|
+
environment,
|
|
454
|
+
oldestPendingAgeSeconds: status.oldestAttemptedAt
|
|
455
|
+
? Math.max(0, Math.floor((now() - new Date(status.oldestAttemptedAt).getTime()) / 1_000))
|
|
456
|
+
: 0,
|
|
457
|
+
}
|
|
458
|
+
}),
|
|
459
|
+
)
|
|
460
|
+
},
|
|
447
461
|
async tick() {
|
|
448
462
|
const database = Db.get(db)
|
|
449
463
|
let failed = 0
|
|
@@ -583,9 +597,18 @@ export declare namespace createRequestUsageReporter {
|
|
|
583
597
|
|
|
584
598
|
/** A scheduled request-metering job. */
|
|
585
599
|
type Reporter = {
|
|
600
|
+
/** Reads the current retry backlog without sending meter events. */
|
|
601
|
+
pending(): Promise<readonly Pending[]>
|
|
586
602
|
/** Runs one reporting pass across production (and sandbox when configured). */
|
|
587
603
|
tick(): Promise<{ failed: number; reported: number; skipped: number }>
|
|
588
604
|
}
|
|
605
|
+
|
|
606
|
+
/** Current durable retry backlog for one billing environment. */
|
|
607
|
+
type Pending = {
|
|
608
|
+
count: number
|
|
609
|
+
environment: StripeCustomers.Record['environment']
|
|
610
|
+
oldestPendingAgeSeconds: number
|
|
611
|
+
}
|
|
589
612
|
}
|
|
590
613
|
|
|
591
614
|
/** Composite key for the in-tick blocked-bucket set. */
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Context } from 'hono'
|
|
2
|
+
|
|
3
|
+
import * as Response from '../../internal/Response.js'
|
|
4
|
+
|
|
5
|
+
/** Returns the standard error for operations that require a user session. */
|
|
6
|
+
export function sessionRequired(c: Context) {
|
|
7
|
+
return Response.error(c, {
|
|
8
|
+
code: 'forbidden',
|
|
9
|
+
message: 'Session required',
|
|
10
|
+
status: 403,
|
|
11
|
+
})
|
|
12
|
+
}
|
|
@@ -119,9 +119,11 @@ describe('keys', () => {
|
|
|
119
119
|
|
|
120
120
|
// Even the org owner cannot self-mint zone access: membership is
|
|
121
121
|
// controlled zone-side, so zone scopes are super-admin-issued.
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
for (const scope of ['zone:421700001:read', 'zone:421700001:write']) {
|
|
123
|
+
const denied = await app.request(base, json('POST', owner, { scopes: [scope] }))
|
|
124
|
+
expect(denied.status).toBe(403)
|
|
125
|
+
expect(await denied.json()).toMatchObject({ error: { code: 'scope_not_issuable' } })
|
|
126
|
+
}
|
|
125
127
|
})
|
|
126
128
|
|
|
127
129
|
test('restricts project management keys without delegating issuance', async () => {
|
|
@@ -254,6 +256,99 @@ describe('keys', () => {
|
|
|
254
256
|
expect(empty).toEqual({ data: [] })
|
|
255
257
|
})
|
|
256
258
|
|
|
259
|
+
test('creates, reads, updates, enforces, and clears an IP allowlist', async () => {
|
|
260
|
+
const state = TestApp.kvStore()
|
|
261
|
+
const app = TestApp.create({
|
|
262
|
+
// Avoid waiting for the accepted KV and isolate-cache propagation delay.
|
|
263
|
+
auth: { cache: false, superAdmin: { secret } },
|
|
264
|
+
kv: { store: state },
|
|
265
|
+
session: { wallet: { origin } },
|
|
266
|
+
}).get(
|
|
267
|
+
'/custom/allowlist-test',
|
|
268
|
+
Auth.policy({ apiKey: { scopes: ['data:read'] } }),
|
|
269
|
+
OpenApi.describeRoute({
|
|
270
|
+
operationId: 'getAllowlistTest',
|
|
271
|
+
responses: { 200: { description: 'Allowlist test response.' } },
|
|
272
|
+
summary: 'Test allowlist',
|
|
273
|
+
}),
|
|
274
|
+
(c) => c.json({ ok: true }, 200),
|
|
275
|
+
)
|
|
276
|
+
const cookie = await session(app)
|
|
277
|
+
const { org, project } = await fixture(app, cookie)
|
|
278
|
+
const base = `/v1/orgs/${org.id}/projects/${project.id}/api-keys`
|
|
279
|
+
const created = await TestApp.json(
|
|
280
|
+
await app.request(
|
|
281
|
+
base,
|
|
282
|
+
superAdminJson('POST', {
|
|
283
|
+
allowedIps: ['203.0.113.0/24'],
|
|
284
|
+
scopes: ['data:read'],
|
|
285
|
+
}),
|
|
286
|
+
),
|
|
287
|
+
Keys.schema.createApiKey.Response,
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
expect(created.allowedIps).toEqual(['203.0.113.0/24'])
|
|
291
|
+
const authenticate = (address?: string) =>
|
|
292
|
+
app.request('/custom/allowlist-test', {
|
|
293
|
+
headers: {
|
|
294
|
+
...(address ? { 'cf-connecting-ip': address } : {}),
|
|
295
|
+
'tempo-api-key': created.token,
|
|
296
|
+
},
|
|
297
|
+
})
|
|
298
|
+
const listed = await TestApp.json(
|
|
299
|
+
await app.request(base, { headers: { cookie } }),
|
|
300
|
+
Keys.schema.listApiKeys.Response,
|
|
301
|
+
)
|
|
302
|
+
expect(listed.data[0]?.allowedIps).toEqual(['203.0.113.0/24'])
|
|
303
|
+
|
|
304
|
+
expect((await authenticate('203.0.113.7')).status).toBe(200)
|
|
305
|
+
const denied = await authenticate('198.51.100.7')
|
|
306
|
+
expect(denied.status).toBe(403)
|
|
307
|
+
expect(await denied.json()).toMatchObject({ error: { code: 'api_key_ip_forbidden' } })
|
|
308
|
+
|
|
309
|
+
const updated = await TestApp.json(
|
|
310
|
+
await app.request(
|
|
311
|
+
`${base}/${created.id}`,
|
|
312
|
+
json('PATCH', cookie, { allowedIps: ['198.51.100.7'] }),
|
|
313
|
+
),
|
|
314
|
+
Keys.schema.Key,
|
|
315
|
+
)
|
|
316
|
+
expect(updated.allowedIps).toEqual(['198.51.100.7'])
|
|
317
|
+
|
|
318
|
+
expect((await authenticate('203.0.113.7')).status).toBe(403)
|
|
319
|
+
expect((await authenticate('198.51.100.7')).status).toBe(200)
|
|
320
|
+
|
|
321
|
+
const cleared = await TestApp.json(
|
|
322
|
+
await app.request(`${base}/${created.id}`, json('PATCH', cookie, { allowedIps: [] })),
|
|
323
|
+
Keys.schema.Key,
|
|
324
|
+
)
|
|
325
|
+
expect(cleared.allowedIps).toEqual([])
|
|
326
|
+
expect((await authenticate()).status).toBe(200)
|
|
327
|
+
})
|
|
328
|
+
|
|
329
|
+
test('rejects malformed IP allowlists on create and update', async () => {
|
|
330
|
+
const app = createApp()
|
|
331
|
+
const cookie = await session(app)
|
|
332
|
+
const { org, project } = await fixture(app, cookie)
|
|
333
|
+
const base = `/v1/orgs/${org.id}/projects/${project.id}/api-keys`
|
|
334
|
+
|
|
335
|
+
const invalidCreate = await app.request(
|
|
336
|
+
base,
|
|
337
|
+
json('POST', cookie, { allowedIps: ['203.0.113.0/33'], scopes: ['data:read'] }),
|
|
338
|
+
)
|
|
339
|
+
expect(invalidCreate.status).toBe(400)
|
|
340
|
+
|
|
341
|
+
const created = await TestApp.json(
|
|
342
|
+
await app.request(base, json('POST', cookie, { scopes: ['data:read'] })),
|
|
343
|
+
Keys.schema.createApiKey.Response,
|
|
344
|
+
)
|
|
345
|
+
const invalidUpdate = await app.request(
|
|
346
|
+
`${base}/${created.id}`,
|
|
347
|
+
json('PATCH', cookie, { allowedIps: ['*'] }),
|
|
348
|
+
)
|
|
349
|
+
expect(invalidUpdate.status).toBe(400)
|
|
350
|
+
})
|
|
351
|
+
|
|
257
352
|
test('rejects the wildcard scope at mint', async () => {
|
|
258
353
|
const app = createApp()
|
|
259
354
|
const cookie = await session(app)
|
|
@@ -425,6 +520,11 @@ describe('keys', () => {
|
|
|
425
520
|
{ headers: { cookie: owner }, method: 'DELETE' },
|
|
426
521
|
)
|
|
427
522
|
expect(crossRevoke.status).toBe(404)
|
|
523
|
+
const crossUpdate = await app.request(
|
|
524
|
+
`/v1/orgs/${org.id}/projects/${other.id}/api-keys/${minted.id}`,
|
|
525
|
+
json('PATCH', owner, { allowedIps: ['203.0.113.0/24'] }),
|
|
526
|
+
)
|
|
527
|
+
expect(crossUpdate.status).toBe(404)
|
|
428
528
|
|
|
429
529
|
// Foreign session: the whole surface 404s at the org-ownership link.
|
|
430
530
|
const stranger = await session(app)
|
|
@@ -3,6 +3,7 @@ import * as z from 'zod/mini'
|
|
|
3
3
|
|
|
4
4
|
import * as Analytics from '../../../analytics/Analytics.js'
|
|
5
5
|
import * as RequestEvents from '../../../analytics/tables/requestEvents.js'
|
|
6
|
+
import * as ApiKey from '../../../ApiKey.js'
|
|
6
7
|
import * as ApiKeys from '../../../ApiKeys.js'
|
|
7
8
|
import type * as App from '../../../App.js'
|
|
8
9
|
import * as Db from '../../../db/Db.js'
|
|
@@ -12,12 +13,19 @@ import * as OpenApi from '../../../internal/OpenApi.js'
|
|
|
12
13
|
import * as Response from '../../../internal/Response.js'
|
|
13
14
|
import * as Schema from '../../../internal/Schema.js'
|
|
14
15
|
import * as Scope from '../../../Scope.js'
|
|
16
|
+
import * as ManagementError from '../Error.js'
|
|
15
17
|
|
|
16
18
|
/** Zod schemas owned by the API-keys resource. */
|
|
17
19
|
export namespace schema {
|
|
18
20
|
/** One API key: metadata only — the token appears once, at mint. */
|
|
19
21
|
export const Key = Schema.describe(
|
|
20
22
|
z.object({
|
|
23
|
+
allowedIps: ApiKey.schema.AllowedIps.check(
|
|
24
|
+
z.describe(
|
|
25
|
+
'Client IP addresses and CIDR ranges allowed to use this key. An empty list means unrestricted.',
|
|
26
|
+
),
|
|
27
|
+
z.meta({ examples: [['203.0.113.0/24', '2001:db8::1']] }),
|
|
28
|
+
),
|
|
21
29
|
createdAt: z
|
|
22
30
|
.string()
|
|
23
31
|
.check(
|
|
@@ -139,6 +147,14 @@ export namespace schema {
|
|
|
139
147
|
/** Request body minting a key. The wildcard scope is not issuable here. */
|
|
140
148
|
export const KeyBody = z
|
|
141
149
|
.object({
|
|
150
|
+
allowedIps: z
|
|
151
|
+
.optional(ApiKey.schema.AllowedIps)
|
|
152
|
+
.check(
|
|
153
|
+
z.describe(
|
|
154
|
+
'Client IP addresses and CIDR ranges allowed to use the key. Omit or use an empty list for unrestricted access.',
|
|
155
|
+
),
|
|
156
|
+
z.meta({ examples: [['203.0.113.0/24']] }),
|
|
157
|
+
),
|
|
142
158
|
environment: z
|
|
143
159
|
._default(z.enum(['production', 'sandbox']), 'production')
|
|
144
160
|
.check(z.describe('Key environment.'), z.meta({ examples: ['sandbox'] })),
|
|
@@ -223,10 +239,25 @@ export namespace schema {
|
|
|
223
239
|
})
|
|
224
240
|
.check(z.describe('Confirmation that the key was revoked.'))
|
|
225
241
|
}
|
|
242
|
+
|
|
243
|
+
/** Schemas for the updateApiKey operation. */
|
|
244
|
+
export namespace updateApiKey {
|
|
245
|
+
/** Request body replacing or clearing a key's IP allowlist. */
|
|
246
|
+
export const Body = z
|
|
247
|
+
.object({
|
|
248
|
+
allowedIps: ApiKey.schema.AllowedIps.check(
|
|
249
|
+
z.describe(
|
|
250
|
+
'Replacement client IP/CIDR allowlist. Use an empty list for unrestricted access.',
|
|
251
|
+
),
|
|
252
|
+
z.meta({ examples: [['203.0.113.0/24']] }),
|
|
253
|
+
),
|
|
254
|
+
})
|
|
255
|
+
.check(z.describe("Fields for updating an API key's network access."))
|
|
256
|
+
}
|
|
226
257
|
}
|
|
227
258
|
|
|
228
259
|
/**
|
|
229
|
-
* Mounts project-attributed API key mint, list, and revoke routes plus the org-wide list. Project routes enforce caller organization and project attribution.
|
|
260
|
+
* Mounts project-attributed API key mint, list, update, and revoke routes plus the org-wide list. Project routes enforce caller organization and project attribution.
|
|
230
261
|
*/
|
|
231
262
|
export function apiKeys(options: apiKeys.Options = {}) {
|
|
232
263
|
const hidden = !options.enabled
|
|
@@ -281,7 +312,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
|
|
|
281
312
|
const kv = c.get('kv')
|
|
282
313
|
if (!kv) return notEnabled(c)
|
|
283
314
|
const createdBy = mintedBy(c)
|
|
284
|
-
if (!createdBy) return sessionRequired(c)
|
|
315
|
+
if (!createdBy) return ManagementError.sessionRequired(c)
|
|
285
316
|
|
|
286
317
|
const body = c.req.valid('json')
|
|
287
318
|
|
|
@@ -312,6 +343,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
|
|
|
312
343
|
{
|
|
313
344
|
createdBy,
|
|
314
345
|
environment: body.environment,
|
|
346
|
+
...(body.allowedIps === undefined ? {} : { allowedIps: body.allowedIps }),
|
|
315
347
|
...(billingActive === undefined ? {} : { billingActive }),
|
|
316
348
|
...(body.name === undefined ? {} : { name: body.name }),
|
|
317
349
|
orgId,
|
|
@@ -452,6 +484,69 @@ export function apiKeys(options: apiKeys.Options = {}) {
|
|
|
452
484
|
}
|
|
453
485
|
},
|
|
454
486
|
)
|
|
487
|
+
.patch(
|
|
488
|
+
'/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}',
|
|
489
|
+
Auth.policy({ apiKey: { scopes: ['management:write'] }, session: true }),
|
|
490
|
+
Auth.ensureOrg({ role: 'admin' }),
|
|
491
|
+
Auth.ensureProject(),
|
|
492
|
+
OpenApi.validate('param', schema.KeyParams, {
|
|
493
|
+
code: 'param_invalid',
|
|
494
|
+
message: 'Check the path parameters and try again.',
|
|
495
|
+
}),
|
|
496
|
+
OpenApi.validate('json', schema.updateApiKey.Body, {
|
|
497
|
+
code: 'body_invalid',
|
|
498
|
+
message: 'Check the request body and try again.',
|
|
499
|
+
}),
|
|
500
|
+
OpenApi.describeRoute({
|
|
501
|
+
description:
|
|
502
|
+
"Replace an API key's client IP/CIDR allowlist. An empty list removes the restriction.",
|
|
503
|
+
hide: hidden,
|
|
504
|
+
operationId: 'updateApiKey',
|
|
505
|
+
responses: OpenApi.responses({
|
|
506
|
+
errors: {
|
|
507
|
+
404: 'No accessible API key was found for this id.',
|
|
508
|
+
},
|
|
509
|
+
success: {
|
|
510
|
+
description: 'The updated API key metadata.',
|
|
511
|
+
schema: schema.Key,
|
|
512
|
+
},
|
|
513
|
+
}),
|
|
514
|
+
summary: 'Update API key',
|
|
515
|
+
tags: ['API Keys'],
|
|
516
|
+
}),
|
|
517
|
+
async (c) => {
|
|
518
|
+
if (Auth.narrowAccess) return Auth.accessError(c)
|
|
519
|
+
if (Auth.narrowScope) return Auth.ensureProjectError(c)
|
|
520
|
+
if (OpenApi.narrowValidation)
|
|
521
|
+
return OpenApi.validationError(c, {
|
|
522
|
+
code: 'param_invalid',
|
|
523
|
+
message: 'Check the path parameters and try again.',
|
|
524
|
+
})
|
|
525
|
+
if (OpenApi.narrowValidation)
|
|
526
|
+
return OpenApi.validationError(c, {
|
|
527
|
+
code: 'body_invalid',
|
|
528
|
+
message: 'Check the request body and try again.',
|
|
529
|
+
})
|
|
530
|
+
|
|
531
|
+
const kv = c.get('kv')
|
|
532
|
+
if (!kv) return notEnabled(c)
|
|
533
|
+
const { keyId } = c.req.valid('param')
|
|
534
|
+
try {
|
|
535
|
+
const record = await ApiKeys.get(kv.store, keyId, {
|
|
536
|
+
scopeCatalog: c.get('scopeCatalog'),
|
|
537
|
+
})
|
|
538
|
+
if (!record || record.orgId !== Auth.org(c).id || record.projectId !== Auth.project(c).id)
|
|
539
|
+
return keyNotFound(c)
|
|
540
|
+
const updated = await ApiKeys.update(kv.store, keyId, c.req.valid('json'), {
|
|
541
|
+
scopeCatalog: c.get('scopeCatalog'),
|
|
542
|
+
})
|
|
543
|
+
if (!updated) return keyNotFound(c)
|
|
544
|
+
return c.json(Response.validated(schema.Key, serializeKey(updated)), 200)
|
|
545
|
+
} catch (cause) {
|
|
546
|
+
return Response.upstream(c, cause)
|
|
547
|
+
}
|
|
548
|
+
},
|
|
549
|
+
)
|
|
455
550
|
.delete(
|
|
456
551
|
'/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}',
|
|
457
552
|
Auth.policy({ apiKey: { scopes: ['management:write'] }, session: true }),
|
|
@@ -531,6 +626,7 @@ async function serializeKeys(c: Context<App.Environment>, records: readonly ApiK
|
|
|
531
626
|
/** Projects a persisted record onto the management key shape (no rate limits, no token). */
|
|
532
627
|
function serializeKey(record: ApiKeys.Record, lastUsedAt?: string) {
|
|
533
628
|
return {
|
|
629
|
+
allowedIps: [...record.allowedIps],
|
|
534
630
|
createdAt: record.createdAt,
|
|
535
631
|
...(record.createdBy === undefined ? {} : { createdBy: record.createdBy }),
|
|
536
632
|
environment: record.environment,
|
|
@@ -582,11 +678,3 @@ function notEnabled(c: Context<App.Environment>) {
|
|
|
582
678
|
status: 404,
|
|
583
679
|
})
|
|
584
680
|
}
|
|
585
|
-
|
|
586
|
-
function sessionRequired(c: Context<App.Environment>) {
|
|
587
|
-
return Response.error(c, {
|
|
588
|
-
code: 'forbidden',
|
|
589
|
-
message: 'Session required',
|
|
590
|
-
status: 403,
|
|
591
|
-
})
|
|
592
|
-
}
|
|
@@ -8,6 +8,7 @@ import * as Memberships from '../../../db/tables/memberships.js'
|
|
|
8
8
|
import * as OpenApi from '../../../internal/OpenApi.js'
|
|
9
9
|
import * as Response from '../../../internal/Response.js'
|
|
10
10
|
import * as Schema from '../../../internal/Schema.js'
|
|
11
|
+
import * as ManagementError from '../Error.js'
|
|
11
12
|
|
|
12
13
|
import type { Email, Environment } from '../App.js'
|
|
13
14
|
|
|
@@ -386,7 +387,7 @@ export function invitations() {
|
|
|
386
387
|
if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
|
|
387
388
|
|
|
388
389
|
const principal = Auth.getPrincipal(c)
|
|
389
|
-
if (principal?.type !== 'session') return sessionRequired(c)
|
|
390
|
+
if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
|
|
390
391
|
// Without a verified email there is nothing to match against.
|
|
391
392
|
if (!principal.email)
|
|
392
393
|
return c.json(Response.validated(schema.listMyInvitations.Response, { data: [] }), 200)
|
|
@@ -437,7 +438,7 @@ export function invitations() {
|
|
|
437
438
|
})
|
|
438
439
|
|
|
439
440
|
const principal = Auth.getPrincipal(c)
|
|
440
|
-
if (principal?.type !== 'session') return sessionRequired(c)
|
|
441
|
+
if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
|
|
441
442
|
|
|
442
443
|
const { invitationId } = c.req.valid('param')
|
|
443
444
|
const db = Db.get(c.get('db'))
|
|
@@ -492,7 +493,7 @@ export function invitations() {
|
|
|
492
493
|
})
|
|
493
494
|
|
|
494
495
|
const principal = Auth.getPrincipal(c)
|
|
495
|
-
if (principal?.type !== 'session') return sessionRequired(c)
|
|
496
|
+
if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
|
|
496
497
|
|
|
497
498
|
const { invitationId } = c.req.valid('param')
|
|
498
499
|
const db = Db.get(c.get('db'))
|
|
@@ -575,11 +576,3 @@ function invitationNotFound(c: Context<Environment>) {
|
|
|
575
576
|
status: 404,
|
|
576
577
|
})
|
|
577
578
|
}
|
|
578
|
-
|
|
579
|
-
function sessionRequired(c: Context<Environment>) {
|
|
580
|
-
return Response.error(c, {
|
|
581
|
-
code: 'forbidden',
|
|
582
|
-
message: 'Session required',
|
|
583
|
-
status: 403,
|
|
584
|
-
})
|
|
585
|
-
}
|
|
@@ -11,6 +11,7 @@ import * as OpenApi from '../../../internal/OpenApi.js'
|
|
|
11
11
|
import * as Organizations from '../../../db/tables/organizations.js'
|
|
12
12
|
import * as Response from '../../../internal/Response.js'
|
|
13
13
|
import * as Schema from '../../../internal/Schema.js'
|
|
14
|
+
import * as ManagementError from '../Error.js'
|
|
14
15
|
|
|
15
16
|
/** Zod schemas owned by the organizations resource. */
|
|
16
17
|
export namespace schema {
|
|
@@ -178,7 +179,7 @@ export function orgs() {
|
|
|
178
179
|
|
|
179
180
|
const principal = Auth.getPrincipal(c)
|
|
180
181
|
if (principal?.type !== 'session' && principal?.type !== 'super_admin')
|
|
181
|
-
return sessionRequired(c)
|
|
182
|
+
return ManagementError.sessionRequired(c)
|
|
182
183
|
|
|
183
184
|
const body = c.req.valid('json')
|
|
184
185
|
const db = Db.get(c.get('db'))
|
|
@@ -380,11 +381,3 @@ function organizationNotFound(c: Context<App.Environment>) {
|
|
|
380
381
|
status: 404,
|
|
381
382
|
})
|
|
382
383
|
}
|
|
383
|
-
|
|
384
|
-
function sessionRequired(c: Context<App.Environment>) {
|
|
385
|
-
return Response.error(c, {
|
|
386
|
-
code: 'forbidden',
|
|
387
|
-
message: 'Session required',
|
|
388
|
-
status: 403,
|
|
389
|
-
})
|
|
390
|
-
}
|
|
@@ -14,10 +14,14 @@ describe('scopes', () => {
|
|
|
14
14
|
expect(response.headers.get('cache-control')).toMatchInlineSnapshot(
|
|
15
15
|
`"private, max-age=300, stale-while-revalidate=3600"`,
|
|
16
16
|
)
|
|
17
|
-
expect(body.data).toEqual(
|
|
17
|
+
expect(body.data).toEqual(
|
|
18
|
+
[...Scope.catalog, Scope.zoneEntry, Scope.zoneWriteEntry].map((entry) => ({ ...entry })),
|
|
19
|
+
)
|
|
18
20
|
expect(body.data.map((entry) => entry.scope)).toMatchInlineSnapshot(`
|
|
19
21
|
[
|
|
20
22
|
"data:read",
|
|
23
|
+
"funding:read",
|
|
24
|
+
"funding:write",
|
|
21
25
|
"indexer:query",
|
|
22
26
|
"management:read",
|
|
23
27
|
"management:write",
|
|
@@ -27,6 +31,7 @@ describe('scopes', () => {
|
|
|
27
31
|
"webhooks:read",
|
|
28
32
|
"webhooks:write",
|
|
29
33
|
"zone:<chainId>:read",
|
|
34
|
+
"zone:<chainId>:write",
|
|
30
35
|
]
|
|
31
36
|
`)
|
|
32
37
|
})
|
|
@@ -42,6 +47,6 @@ describe('scopes', () => {
|
|
|
42
47
|
const body = await TestApp.json(response, Scopes.schema.getScopes.Response)
|
|
43
48
|
|
|
44
49
|
expect(response.status).toBe(200)
|
|
45
|
-
expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry, custom])
|
|
50
|
+
expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry, Scope.zoneWriteEntry, custom])
|
|
46
51
|
})
|
|
47
52
|
})
|
|
@@ -24,7 +24,7 @@ export namespace schema {
|
|
|
24
24
|
.string()
|
|
25
25
|
.check(
|
|
26
26
|
z.describe(
|
|
27
|
-
'Scope identifier used in API-key grants and route policies.
|
|
27
|
+
'Scope identifier used in API-key grants and route policies. Zone templates carry a concrete chain id and access level in grants.',
|
|
28
28
|
),
|
|
29
29
|
z.meta({ examples: ['data:read'] }),
|
|
30
30
|
),
|
|
@@ -66,7 +66,7 @@ export function scopes() {
|
|
|
66
66
|
}),
|
|
67
67
|
Cache.response<App.Environment>({
|
|
68
68
|
cacheControl: Cache.policies.stable,
|
|
69
|
-
name: 'tempo-api:scopes:
|
|
69
|
+
name: 'tempo-api:scopes:v5',
|
|
70
70
|
key: (c) => {
|
|
71
71
|
const url = new URL(c.req.url)
|
|
72
72
|
url.search = ''
|
|
@@ -2,6 +2,7 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
|
|
|
2
2
|
|
|
3
3
|
import * as App from '../../../App.js'
|
|
4
4
|
import * as Memberships from '../../../db/tables/memberships.js'
|
|
5
|
+
import * as Cursor from '../../../internal/Cursor.js'
|
|
5
6
|
import * as core_Webhooks from '../../../internal/Webhooks.js'
|
|
6
7
|
import * as TestApp from '../../../../test/App.js'
|
|
7
8
|
import { management } from '../App.js'
|
|
@@ -47,7 +48,8 @@ async function organization(app: ReturnType<typeof createApp>, cookie: string) {
|
|
|
47
48
|
|
|
48
49
|
describe('webhooks', () => {
|
|
49
50
|
test('creates, lists, pauses, and deletes an organization webhook', async () => {
|
|
50
|
-
const
|
|
51
|
+
const db = TestApp.database()
|
|
52
|
+
const app = createApp({ db })
|
|
51
53
|
const cookie = await session(app)
|
|
52
54
|
const org = await organization(app, cookie)
|
|
53
55
|
const collection = `/v1/orgs/${org.id}/webhooks`
|
|
@@ -65,6 +67,9 @@ describe('webhooks', () => {
|
|
|
65
67
|
expect(createdResponse.status).toBe(200)
|
|
66
68
|
const created = await TestApp.json(createdResponse, Webhooks.schema.createWebhook.Response)
|
|
67
69
|
expect(created).toHaveProperty('secret', expect.stringMatching(/^whsec_/))
|
|
70
|
+
expect(Cursor.decode((await core_Webhooks.getCursor(db, created.id))!, ['int'])).toEqual([
|
|
71
|
+
expect.any(Number),
|
|
72
|
+
])
|
|
68
73
|
|
|
69
74
|
const listedResponse = await app.request(collection, { headers: { cookie } })
|
|
70
75
|
expect(listedResponse.status).toBe(200)
|
|
@@ -6,6 +6,7 @@ import * as Db from '../../../db/Db.js'
|
|
|
6
6
|
import * as Auth from '../../../internal/Auth.js'
|
|
7
7
|
import * as OpenApi from '../../../internal/OpenApi.js'
|
|
8
8
|
import * as Response from '../../../internal/Response.js'
|
|
9
|
+
import * as WebhookDestination from '../../../internal/WebhookDestination.js'
|
|
9
10
|
import * as Webhooks from '../../../internal/Webhooks.js'
|
|
10
11
|
import { schema as webhookSchema } from '../../data/routes/webhooks.js'
|
|
11
12
|
import type { Environment } from '../App.js'
|
|
@@ -217,17 +218,28 @@ export function webhooks(options: webhooks.Options = {}) {
|
|
|
217
218
|
if (!supportedChainIds.has(chainId))
|
|
218
219
|
return Response.unsupportedChainId(c, chainId, supportedChainIds)
|
|
219
220
|
try {
|
|
221
|
+
// Preserve destination errors before the creation-time RPC dependency.
|
|
222
|
+
WebhookDestination.assertDestination(body.destination)
|
|
223
|
+
const db = Db.get(c.get('db'))
|
|
224
|
+
const maxPerOwner = options.webhook.maxPerOwner ?? defaultMaxPerOwner
|
|
225
|
+
const owner_ = owner(Auth.org(c).id)
|
|
226
|
+
if ((await Webhooks.countSubscriptions(db, owner_)) >= maxPerOwner)
|
|
227
|
+
throw new Webhooks.LimitExceededError(maxPerOwner)
|
|
228
|
+
const startBlockNumber = Number(await c.get('getClient')(chainId).getBlockNumber())
|
|
220
229
|
const subscription = await Webhooks.createSubscription(
|
|
221
|
-
|
|
230
|
+
db,
|
|
222
231
|
{
|
|
223
232
|
chainId,
|
|
224
233
|
...(body.context === undefined ? {} : { context: body.context }),
|
|
225
234
|
destination: body.destination,
|
|
226
235
|
eventType: body.eventType,
|
|
227
236
|
filters: body.filters,
|
|
228
|
-
owner:
|
|
237
|
+
owner: owner_,
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
maxPerOwner,
|
|
241
|
+
startBlockNumber,
|
|
229
242
|
},
|
|
230
|
-
{ maxPerOwner: options.webhook.maxPerOwner ?? defaultMaxPerOwner },
|
|
231
243
|
)
|
|
232
244
|
return c.json(
|
|
233
245
|
Response.validated(schema.createWebhook.Response, created(subscription)),
|
package/src/apps/mcp.test.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { Cli as incur_Cli, z } from 'incur'
|
|
2
|
+
import { App } from 'tapimo'
|
|
3
|
+
import { data } from 'tapimo/apps'
|
|
2
4
|
|
|
3
5
|
import * as TestApp from '../../test/App.js'
|
|
4
6
|
import * as Runtime from '../../test/runtime.js'
|
|
@@ -17,7 +19,7 @@ const reader = {
|
|
|
17
19
|
/** Composes a test app with the MCP group mounted, dispatching in-process. */
|
|
18
20
|
function createHost(
|
|
19
21
|
options: {
|
|
20
|
-
app?:
|
|
22
|
+
app?: Host | undefined
|
|
21
23
|
docs?: mcp.Options['docs'] | undefined
|
|
22
24
|
} = {},
|
|
23
25
|
) {
|
|
@@ -149,7 +151,7 @@ test('identifies as Tempo MCP', async () => {
|
|
|
149
151
|
})
|
|
150
152
|
})
|
|
151
153
|
|
|
152
|
-
test('scopes tools to the data
|
|
154
|
+
test('scopes tools to the data and inbound funding domains', async () => {
|
|
153
155
|
const { app, host } = createHost({ docs: docsStub() })
|
|
154
156
|
|
|
155
157
|
// The domain filter must drop paths that actually exist in the spec.
|
|
@@ -170,6 +172,8 @@ test('scopes tools to the data domain', async () => {
|
|
|
170
172
|
const tools = (await toolsSearch(host)).map((tool) => tool.name)
|
|
171
173
|
|
|
172
174
|
expect(tools).toContain('v1_tokens_get')
|
|
175
|
+
expect(tools).toContain('v1_funding_quotes')
|
|
176
|
+
expect(tools).toContain('v1_funding_transfers_post')
|
|
173
177
|
expect(tools).toContain('docs_search')
|
|
174
178
|
// RPC is part of the data domain tag group.
|
|
175
179
|
expect(tools.some((name) => name.startsWith('rpc'))).toBe(true)
|
|
@@ -180,6 +184,17 @@ test('scopes tools to the data domain', async () => {
|
|
|
180
184
|
expect(tools.some((name) => name.startsWith('v1_me'))).toBe(false)
|
|
181
185
|
})
|
|
182
186
|
|
|
187
|
+
test('keeps the data tools functional when funding is omitted', async () => {
|
|
188
|
+
const app = App.create({ auth: false, db: TestApp.database() }).route('/', data())
|
|
189
|
+
const { host } = createHost({ app })
|
|
190
|
+
|
|
191
|
+
await initialize(host)
|
|
192
|
+
const tools = (await toolsSearch(host)).map((tool) => tool.name)
|
|
193
|
+
|
|
194
|
+
expect(tools).toContain('v1_tokens_get')
|
|
195
|
+
expect(tools.some((name) => name.startsWith('v1_funding_'))).toBe(false)
|
|
196
|
+
})
|
|
197
|
+
|
|
183
198
|
test('keeps tool input schemas compact', async () => {
|
|
184
199
|
const { host } = createHost()
|
|
185
200
|
await initialize(host)
|