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
|
@@ -3,7 +3,9 @@ import { ZoneRpcAuthentication } from 'ox/tempo'
|
|
|
3
3
|
import * as z from 'zod/mini'
|
|
4
4
|
|
|
5
5
|
import type * as App from '../../../App.js'
|
|
6
|
+
import * as Scope from '../../../Scope.js'
|
|
6
7
|
import * as Auth from '../../../internal/Auth.js'
|
|
8
|
+
import * as Log from '../../../internal/Log.js'
|
|
7
9
|
import * as OpenApi from '../../../internal/OpenApi.js'
|
|
8
10
|
import * as Response from '../../../internal/Response.js'
|
|
9
11
|
import * as Schema from '../../../internal/Schema.js'
|
|
@@ -66,11 +68,24 @@ const zoneReadMethods = new Set([
|
|
|
66
68
|
'net_version',
|
|
67
69
|
'web3_clientVersion',
|
|
68
70
|
'web3_sha3',
|
|
71
|
+
'zone_getEncryptionKey',
|
|
72
|
+
'zone_getZoneInfo',
|
|
69
73
|
])
|
|
70
74
|
|
|
75
|
+
// Zone write scopes broadcast caller-signed transactions only. Node-managed
|
|
76
|
+
// accounts, signing, faucet, admin, and debug methods remain inaccessible.
|
|
77
|
+
const zoneWriteMethods = new Set(['eth_sendRawTransaction', 'eth_sendRawTransactionSync'])
|
|
78
|
+
|
|
79
|
+
const maxRpcInspectionBytes = 64 * 1_024
|
|
80
|
+
|
|
71
81
|
/** Never reached; carries typed passthrough response variants into Hono client inference. */
|
|
72
82
|
const narrowPassthrough = false as boolean
|
|
73
83
|
|
|
84
|
+
type RpcInspection = {
|
|
85
|
+
body: ReadableStream<Uint8Array<ArrayBuffer>> | null
|
|
86
|
+
result: { empty: boolean; ok: false } | { ok: true; value: unknown } | undefined
|
|
87
|
+
}
|
|
88
|
+
|
|
74
89
|
/** Zod schemas owned by the raw RPC passthrough. */
|
|
75
90
|
export namespace schema {
|
|
76
91
|
/** JSON-RPC request identifier. */
|
|
@@ -118,17 +133,20 @@ export namespace schema {
|
|
|
118
133
|
error: z
|
|
119
134
|
.optional(Error)
|
|
120
135
|
.check(z.describe('JSON-RPC error object returned when a method fails.')),
|
|
121
|
-
id:
|
|
122
|
-
.
|
|
123
|
-
|
|
124
|
-
z.describe('Client-supplied JSON-RPC request id used to match responses to requests.'),
|
|
125
|
-
),
|
|
136
|
+
id: Id.check(
|
|
137
|
+
z.describe('Client-supplied JSON-RPC request id used to match responses to requests.'),
|
|
138
|
+
),
|
|
126
139
|
jsonrpc: z.literal('2.0').check(z.describe('JSON-RPC protocol version; Tempo uses `2.0`.')),
|
|
127
140
|
result: z
|
|
128
141
|
.optional(z.unknown())
|
|
129
142
|
.check(z.describe('Result returned by the upstream RPC method.')),
|
|
130
143
|
})
|
|
131
|
-
.check(
|
|
144
|
+
.check(
|
|
145
|
+
z.refine((response) => (response.error === undefined) !== (response.result === undefined), {
|
|
146
|
+
error: 'A JSON-RPC response must contain exactly one of result or error.',
|
|
147
|
+
}),
|
|
148
|
+
z.describe('One JSON-RPC response returned by Tempo.'),
|
|
149
|
+
)
|
|
132
150
|
|
|
133
151
|
/** JSON-RPC request or batch request payload. */
|
|
134
152
|
export const RequestBody = z
|
|
@@ -137,7 +155,7 @@ export namespace schema {
|
|
|
137
155
|
|
|
138
156
|
/** JSON-RPC response or batch response payload. */
|
|
139
157
|
export const ResponseBody = z
|
|
140
|
-
.union([Response, z.array(Response)])
|
|
158
|
+
.union([Response, z.array(Response).check(z.minLength(1))])
|
|
141
159
|
.check(z.describe('A single JSON-RPC response or an array of responses for batch calls.'))
|
|
142
160
|
}
|
|
143
161
|
|
|
@@ -148,7 +166,7 @@ export function rpc() {
|
|
|
148
166
|
Auth.policy({ apiKey: { scopes: ['data:read'] }, public: true }),
|
|
149
167
|
OpenApi.describeRoute({
|
|
150
168
|
description:
|
|
151
|
-
'Sends a single or batch Ethereum JSON-RPC request directly to Tempo. Use `/rpc/testnet`, `/rpc/mainnet`, or `/rpc/:chain` to choose a chain. Zone
|
|
169
|
+
'Sends a single or batch Ethereum JSON-RPC request directly to Tempo. Use `/rpc/testnet`, `/rpc/mainnet`, or `/rpc/:chain` to choose a chain. Zone read scopes permit read-only methods; Zone write scopes also permit signed transaction broadcasts. A Zone token in `X-Authorization-Token` is forwarded to the authenticated Zone RPC. This passthrough is not part of the stable API contract and is supported on a best-effort basis only. It has no compatibility, latency, availability, or data-freshness guarantees, and breaking changes may happen with limited notice.',
|
|
152
170
|
operationId: 'rpcRequest',
|
|
153
171
|
parameters: [
|
|
154
172
|
{
|
|
@@ -214,17 +232,33 @@ export function rpc() {
|
|
|
214
232
|
message: 'Missing API key',
|
|
215
233
|
status: 401,
|
|
216
234
|
})
|
|
217
|
-
if (zone && !zoneToken
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
235
|
+
if (zone && !zoneToken) {
|
|
236
|
+
const requests = Array.isArray(body) ? body : [body]
|
|
237
|
+
const allowed =
|
|
238
|
+
requests.length > 0 &&
|
|
239
|
+
requests.every(
|
|
240
|
+
(request) =>
|
|
241
|
+
isZoneReadMethod(request) ||
|
|
242
|
+
(isZoneWriteMethod(request) && hasZoneWriteScope(c, chainId)),
|
|
243
|
+
)
|
|
244
|
+
if (!allowed)
|
|
245
|
+
return Response.error(c, {
|
|
246
|
+
code: 'api_key_forbidden',
|
|
247
|
+
message:
|
|
248
|
+
'Zone API keys may call read-only RPC methods. A matching Zone write scope also permits signed transaction broadcasts; pass a Zone token for other methods.',
|
|
249
|
+
status: 403,
|
|
250
|
+
})
|
|
251
|
+
}
|
|
224
252
|
|
|
225
253
|
if (narrowPassthrough)
|
|
226
|
-
return c.json(
|
|
227
|
-
|
|
254
|
+
return c.json(
|
|
255
|
+
Response.validated(schema.ResponseBody, { id: null, jsonrpc: '2.0', result: null }),
|
|
256
|
+
200,
|
|
257
|
+
)
|
|
258
|
+
const notificationOnly = inspectBody
|
|
259
|
+
? isNotificationOnly(body)
|
|
260
|
+
: await inspectNotificationOnly(c.req.raw)
|
|
261
|
+
return passthrough(c, chainId, { notificationOnly })
|
|
228
262
|
},
|
|
229
263
|
)
|
|
230
264
|
}
|
|
@@ -251,9 +285,55 @@ function isPublicMethod(request: unknown): boolean {
|
|
|
251
285
|
return typeof method === 'string' && method.startsWith('eth_')
|
|
252
286
|
}
|
|
253
287
|
|
|
254
|
-
function
|
|
255
|
-
const
|
|
256
|
-
|
|
288
|
+
function isNotificationOnly(body: unknown): boolean {
|
|
289
|
+
const parsed = schema.RequestBody.safeParse(body)
|
|
290
|
+
if (!parsed.success) return false
|
|
291
|
+
const requests = Array.isArray(parsed.data) ? parsed.data : [parsed.data]
|
|
292
|
+
return requests.length > 0 && requests.every((request) => request.id === undefined)
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async function inspectNotificationOnly(request: Request): Promise<boolean> {
|
|
296
|
+
const contentLength = Number(request.headers.get('content-length'))
|
|
297
|
+
if (Number.isFinite(contentLength) && contentLength > maxRpcInspectionBytes) return false
|
|
298
|
+
const body = request.clone().body
|
|
299
|
+
if (!body) return false
|
|
300
|
+
|
|
301
|
+
const reader = body.getReader()
|
|
302
|
+
const chunks: Uint8Array<ArrayBuffer>[] = []
|
|
303
|
+
let size = 0
|
|
304
|
+
let complete = false
|
|
305
|
+
while (size <= maxRpcInspectionBytes) {
|
|
306
|
+
const read = await reader.read()
|
|
307
|
+
if (read.done) {
|
|
308
|
+
complete = true
|
|
309
|
+
break
|
|
310
|
+
}
|
|
311
|
+
chunks.push(read.value)
|
|
312
|
+
size += read.value.byteLength
|
|
313
|
+
}
|
|
314
|
+
if (!complete || size > maxRpcInspectionBytes) {
|
|
315
|
+
void reader.cancel()
|
|
316
|
+
return false
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const bytes = new Uint8Array(size)
|
|
320
|
+
let offset = 0
|
|
321
|
+
for (const chunk of chunks) {
|
|
322
|
+
bytes.set(chunk, offset)
|
|
323
|
+
offset += chunk.byteLength
|
|
324
|
+
}
|
|
325
|
+
try {
|
|
326
|
+
return isNotificationOnly(JSON.parse(new TextDecoder().decode(bytes)) as unknown)
|
|
327
|
+
} catch {
|
|
328
|
+
return false
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function hasZoneWriteScope(c: Context<App.Environment>, chainId: number): boolean {
|
|
333
|
+
const principal = Auth.getPrincipal(c)
|
|
334
|
+
if (principal?.type !== 'api_key') return false
|
|
335
|
+
const scopes = principal.apiKey.scopes
|
|
336
|
+
return scopes.includes(Scope.wildcard) || scopes.includes(`zone:${chainId}:write`)
|
|
257
337
|
}
|
|
258
338
|
|
|
259
339
|
function isZoneReadMethod(request: unknown): boolean {
|
|
@@ -262,19 +342,37 @@ function isZoneReadMethod(request: unknown): boolean {
|
|
|
262
342
|
return typeof method === 'string' && zoneReadMethods.has(method)
|
|
263
343
|
}
|
|
264
344
|
|
|
345
|
+
function isZoneWriteMethod(request: unknown): boolean {
|
|
346
|
+
if (!request || typeof request !== 'object') return false
|
|
347
|
+
const method = (request as Record<string, unknown>)['method']
|
|
348
|
+
return typeof method === 'string' && zoneWriteMethods.has(method)
|
|
349
|
+
}
|
|
350
|
+
|
|
265
351
|
async function passthrough(
|
|
266
352
|
c: Context<App.Environment>,
|
|
267
353
|
chainId: z.output<typeof Schema.ChainId>,
|
|
354
|
+
options: passthrough.Options,
|
|
268
355
|
): Promise<globalThis.Response & TypedResponse<never, never, never>> {
|
|
356
|
+
// Keep caller-selected values out of metric dimensions even if an upstream
|
|
357
|
+
// resolver accepts a chain the deployment did not declare.
|
|
358
|
+
const alertChainId = c.get('supportedChainIds').has(chainId) ? chainId : 0
|
|
269
359
|
const zone = c.get('zones').get(chainId)
|
|
270
360
|
const zoneToken = getZoneToken(c)
|
|
271
|
-
const rpc =
|
|
361
|
+
const rpc = c.get('rpc')
|
|
272
362
|
const principal = Auth.getPrincipal(c)
|
|
273
363
|
const upstream_rpc =
|
|
274
364
|
!zone && principal?.type === 'public' && typeof rpc !== 'function' ? undefined : rpc
|
|
275
365
|
// Anonymous callers use the built-in public RPC unless a resolver chooses a
|
|
276
366
|
// different public upstream.
|
|
277
|
-
const {
|
|
367
|
+
const {
|
|
368
|
+
basicAuth,
|
|
369
|
+
bearerAuth,
|
|
370
|
+
publicZoneUrl,
|
|
371
|
+
zoneHeaders,
|
|
372
|
+
url: resolvedUrl,
|
|
373
|
+
} = Viem.resolveRpc(upstream_rpc, { chainId, principal, zone })
|
|
374
|
+
const usePublicZoneUrl = Boolean(zone && zoneToken)
|
|
375
|
+
const url = usePublicZoneUrl ? publicZoneUrl : resolvedUrl
|
|
278
376
|
// The chain id is syntactically valid but this deployment has no RPC upstream
|
|
279
377
|
// configured for it (no `rpc` config and no built-in default).
|
|
280
378
|
if (!url)
|
|
@@ -288,7 +386,10 @@ async function passthrough(
|
|
|
288
386
|
const headers = new Headers()
|
|
289
387
|
for (const [name, value] of c.req.raw.headers)
|
|
290
388
|
if (!strippedHeaders.has(name.toLowerCase())) headers.set(name, value)
|
|
291
|
-
if (
|
|
389
|
+
if (zoneHeaders) for (const [name, value] of new Headers(zoneHeaders)) headers.set(name, value)
|
|
390
|
+
// Public Zone endpoints authenticate with the caller's token, never internal RPC credentials.
|
|
391
|
+
if (!usePublicZoneUrl && basicAuth) headers.set('authorization', `Basic ${btoa(basicAuth)}`)
|
|
392
|
+
else if (!usePublicZoneUrl && bearerAuth) headers.set('authorization', `Bearer ${bearerAuth}`)
|
|
292
393
|
if (zone && zoneToken) headers.set(ZoneRpcAuthentication.headerName, zoneToken)
|
|
293
394
|
|
|
294
395
|
// `duplex` is required when streaming a request body, but is not yet in
|
|
@@ -306,18 +407,137 @@ async function passthrough(
|
|
|
306
407
|
|
|
307
408
|
try {
|
|
308
409
|
const response = await fetch(new Request(upstream, init))
|
|
410
|
+
let body = response.body
|
|
411
|
+
|
|
412
|
+
if (!response.ok) {
|
|
413
|
+
// Malformed requests and public Zone authentication failures are caused
|
|
414
|
+
// by caller input, not by the RPC provider.
|
|
415
|
+
if (!isCallerRpcFailure(response.status, usePublicZoneUrl))
|
|
416
|
+
c.set('providerFailure', rpcProviderFailure(response, alertChainId))
|
|
417
|
+
} else if (response.status === 200) {
|
|
418
|
+
const inspection = await inspectRpcResponse(response)
|
|
419
|
+
body = inspection.body
|
|
420
|
+
if (inspection.result?.ok === false && !(inspection.result.empty && options.notificationOnly))
|
|
421
|
+
c.set('providerFailure', {
|
|
422
|
+
chainId: alertChainId,
|
|
423
|
+
failure: 'payload',
|
|
424
|
+
id: 'rpc',
|
|
425
|
+
operation: 'request',
|
|
426
|
+
})
|
|
427
|
+
else if (inspection.result?.ok) {
|
|
428
|
+
const parsed = schema.ResponseBody.safeParse(inspection.result.value)
|
|
429
|
+
if (!parsed.success)
|
|
430
|
+
c.set('providerFailure', {
|
|
431
|
+
chainId: alertChainId,
|
|
432
|
+
failure: 'payload',
|
|
433
|
+
id: 'rpc',
|
|
434
|
+
operation: 'request',
|
|
435
|
+
})
|
|
436
|
+
else {
|
|
437
|
+
const rpc = Log.rpcErrors(parsed.data)
|
|
438
|
+
if (rpc) c.set('rpcResponse', rpc)
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
309
442
|
|
|
310
443
|
// Stream the upstream response back verbatim so JSON-RPC bodies, status
|
|
311
444
|
// codes, and headers survive exactly as clients expect.
|
|
312
|
-
return c.newResponse(
|
|
313
|
-
TypedResponse<never, never, never>
|
|
445
|
+
return c.newResponse(body, response) as globalThis.Response & TypedResponse<never, never, never>
|
|
314
446
|
} catch (cause) {
|
|
315
447
|
// Timeouts and network failures become the standard 502 envelope instead
|
|
316
448
|
// of an unhandled 500.
|
|
449
|
+
c.set('providerFailure', rpcProviderFailure(cause, alertChainId))
|
|
317
450
|
return Response.upstream(c, cause) as never
|
|
318
451
|
}
|
|
319
452
|
}
|
|
320
453
|
|
|
454
|
+
function isCallerRpcFailure(status: number, usePublicZoneUrl: boolean) {
|
|
455
|
+
return (
|
|
456
|
+
status === 400 ||
|
|
457
|
+
status === 413 ||
|
|
458
|
+
status === 415 ||
|
|
459
|
+
status === 422 ||
|
|
460
|
+
(usePublicZoneUrl && (status === 401 || status === 403))
|
|
461
|
+
)
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
declare namespace passthrough {
|
|
465
|
+
/** Request facts needed to classify the upstream response. */
|
|
466
|
+
type Options = {
|
|
467
|
+
/** Whether every valid request in the payload omits an id. */
|
|
468
|
+
notificationOnly: boolean
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
async function inspectRpcResponse(response: globalThis.Response): Promise<RpcInspection> {
|
|
473
|
+
const contentLength = Number(response.headers.get('content-length'))
|
|
474
|
+
if (Number.isFinite(contentLength) && contentLength > maxRpcInspectionBytes)
|
|
475
|
+
return { body: response.body, result: undefined }
|
|
476
|
+
if (!response.body) return { body: null, result: { empty: true, ok: false } }
|
|
477
|
+
|
|
478
|
+
const reader = response.body.getReader()
|
|
479
|
+
const chunks: Uint8Array<ArrayBuffer>[] = []
|
|
480
|
+
let size = 0
|
|
481
|
+
let complete = false
|
|
482
|
+
while (size <= maxRpcInspectionBytes) {
|
|
483
|
+
const read = await reader.read()
|
|
484
|
+
if (read.done) {
|
|
485
|
+
complete = true
|
|
486
|
+
break
|
|
487
|
+
}
|
|
488
|
+
chunks.push(read.value)
|
|
489
|
+
size += read.value.byteLength
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
let index = 0
|
|
493
|
+
const body = new ReadableStream<Uint8Array<ArrayBuffer>>({
|
|
494
|
+
cancel: (reason) => reader.cancel(reason),
|
|
495
|
+
async pull(controller) {
|
|
496
|
+
const chunk = chunks[index]
|
|
497
|
+
if (chunk) {
|
|
498
|
+
index += 1
|
|
499
|
+
controller.enqueue(chunk)
|
|
500
|
+
return
|
|
501
|
+
}
|
|
502
|
+
const read = await reader.read()
|
|
503
|
+
if (read.done) controller.close()
|
|
504
|
+
else controller.enqueue(read.value)
|
|
505
|
+
},
|
|
506
|
+
})
|
|
507
|
+
if (!complete || size > maxRpcInspectionBytes) return { body, result: undefined }
|
|
508
|
+
|
|
509
|
+
const bytes = new Uint8Array(size)
|
|
510
|
+
let offset = 0
|
|
511
|
+
for (const chunk of chunks) {
|
|
512
|
+
bytes.set(chunk, offset)
|
|
513
|
+
offset += chunk.byteLength
|
|
514
|
+
}
|
|
515
|
+
const result = (() => {
|
|
516
|
+
try {
|
|
517
|
+
return { ok: true as const, value: JSON.parse(new TextDecoder().decode(bytes)) as unknown }
|
|
518
|
+
} catch {
|
|
519
|
+
return { empty: size === 0, ok: false as const }
|
|
520
|
+
}
|
|
521
|
+
})()
|
|
522
|
+
return { body, result }
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
function rpcProviderFailure(cause: unknown, chainId: number): Log.ProviderFailure {
|
|
526
|
+
const base = { chainId, id: 'rpc', operation: 'request' } as const
|
|
527
|
+
if (
|
|
528
|
+
cause instanceof DOMException &&
|
|
529
|
+
(cause.name === 'AbortError' || cause.name === 'TimeoutError')
|
|
530
|
+
)
|
|
531
|
+
return { ...base, failure: 'timeout' }
|
|
532
|
+
if (cause instanceof globalThis.Response) {
|
|
533
|
+
if (cause.status === 408) return { ...base, failure: 'timeout', status: cause.status }
|
|
534
|
+
if (cause.status === 429) return { ...base, failure: 'rate_limit', status: cause.status }
|
|
535
|
+
return { ...base, failure: 'http', status: cause.status }
|
|
536
|
+
}
|
|
537
|
+
if (cause instanceof TypeError) return { ...base, failure: 'network' }
|
|
538
|
+
return { ...base, failure: 'unknown' }
|
|
539
|
+
}
|
|
540
|
+
|
|
321
541
|
function resolveChainId(c: Context<App.Environment>) {
|
|
322
542
|
const parameter = c.req.param('chain')
|
|
323
543
|
if (parameter === undefined) return c.get('chainId')
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Hono } from 'hono'
|
|
1
|
+
import { Hono, type Context } from 'hono'
|
|
2
2
|
import * as z from 'zod/mini'
|
|
3
3
|
|
|
4
4
|
import type * as App from '../../../App.js'
|
|
@@ -8,6 +8,7 @@ import * as EdgeCache from '../../../internal/EdgeCache.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 Timing from '../../../internal/Timing.js'
|
|
11
12
|
import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
|
|
12
13
|
import * as Viem from '../../../internal/Viem.js'
|
|
13
14
|
import { getTokenLogo } from './tokens.js'
|
|
@@ -160,7 +161,8 @@ export function tokenlist() {
|
|
|
160
161
|
summary: 'Get token list',
|
|
161
162
|
tags: ['Verified Tokens'],
|
|
162
163
|
}),
|
|
163
|
-
//
|
|
164
|
+
// Anonymous callers accept the route's five-minute freshness window.
|
|
165
|
+
// Credentialed reads keep snapshot-version invalidation.
|
|
164
166
|
EdgeCache.setEligibility(
|
|
165
167
|
Cache.response<App.Environment>({
|
|
166
168
|
cacheControl: Cache.policies.stable,
|
|
@@ -175,7 +177,7 @@ export function tokenlist() {
|
|
|
175
177
|
return `${base}:v:${version}`
|
|
176
178
|
},
|
|
177
179
|
}),
|
|
178
|
-
|
|
180
|
+
anonymousEdgeCache,
|
|
179
181
|
),
|
|
180
182
|
async (c) => {
|
|
181
183
|
if (Auth.narrowAccess) return Auth.paidAccessError(c)
|
|
@@ -189,22 +191,18 @@ export function tokenlist() {
|
|
|
189
191
|
const chainId = query.chainId ?? c.get('chainId')
|
|
190
192
|
try {
|
|
191
193
|
const snapshot = await VerifiedTokens.snapshot(c, chainId)
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
...(logoURI === undefined ? {} : { logoURI }),
|
|
205
|
-
}
|
|
206
|
-
}),
|
|
207
|
-
)
|
|
194
|
+
const logos = await getTokenLogos(c, { chainId, tokens: snapshot.list })
|
|
195
|
+
const tokens = snapshot.list.map((token) => {
|
|
196
|
+
const logoURI = logos.get(token.address) ?? token.logoUri
|
|
197
|
+
return {
|
|
198
|
+
chainId,
|
|
199
|
+
address: token.address,
|
|
200
|
+
name: token.name,
|
|
201
|
+
symbol: token.symbol,
|
|
202
|
+
decimals: token.decimals,
|
|
203
|
+
...(logoURI === undefined ? {} : { logoURI }),
|
|
204
|
+
}
|
|
205
|
+
})
|
|
208
206
|
const list = {
|
|
209
207
|
name: Viem.chains.find((chain) => chain.id === chainId)?.name ?? `Tempo ${chainId}`,
|
|
210
208
|
timestamp: snapshot.updatedAt,
|
|
@@ -218,3 +216,58 @@ export function tokenlist() {
|
|
|
218
216
|
},
|
|
219
217
|
)
|
|
220
218
|
}
|
|
219
|
+
|
|
220
|
+
function anonymousEdgeCache(c: Context<App.Environment>) {
|
|
221
|
+
return (
|
|
222
|
+
!c.req.header('authorization') &&
|
|
223
|
+
!c.req.header('cookie') &&
|
|
224
|
+
!c.req.header('tempo-api-key') &&
|
|
225
|
+
!c.req.header('x-api-key')
|
|
226
|
+
)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
async function getTokenLogos(
|
|
230
|
+
c: Context<App.Environment>,
|
|
231
|
+
options: getTokenLogos.Options,
|
|
232
|
+
): Promise<ReadonlyMap<string, string>> {
|
|
233
|
+
return Timing.time(c, 'token_logos', async () => {
|
|
234
|
+
const getAsset = c.get('getAsset')
|
|
235
|
+
const listAssets = getAsset.list
|
|
236
|
+
if (!listAssets) {
|
|
237
|
+
const entries = await Promise.all(
|
|
238
|
+
options.tokens.map(
|
|
239
|
+
async (token) =>
|
|
240
|
+
[
|
|
241
|
+
token.address,
|
|
242
|
+
await getTokenLogo(c, { address: token.address, chainId: options.chainId }).catch(
|
|
243
|
+
() => undefined,
|
|
244
|
+
),
|
|
245
|
+
] as const,
|
|
246
|
+
),
|
|
247
|
+
)
|
|
248
|
+
const logos = new Map<string, string>()
|
|
249
|
+
for (const [address, uri] of entries) if (uri) logos.set(address, uri)
|
|
250
|
+
return logos
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Logos are optional metadata; an asset-store outage must not hide the
|
|
254
|
+
// verified token list itself. Snapshot logo URIs remain available below.
|
|
255
|
+
const assets = await listAssets(options.chainId, 'icons/').catch(() => [])
|
|
256
|
+
const uris = new Map(assets.map((asset) => [asset.key, asset.uri]))
|
|
257
|
+
return new Map(
|
|
258
|
+
options.tokens.flatMap((token) => {
|
|
259
|
+
const uri = uris.get(`${options.chainId}/icons/${token.address}`)
|
|
260
|
+
return uri ? [[token.address, uri] as const] : []
|
|
261
|
+
}),
|
|
262
|
+
)
|
|
263
|
+
})
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
declare namespace getTokenLogos {
|
|
267
|
+
type Options = {
|
|
268
|
+
/** Tempo chain containing the token assets. */
|
|
269
|
+
chainId: number
|
|
270
|
+
/** Verified tokens whose curated logo locations should be resolved. */
|
|
271
|
+
tokens: readonly Pick<VerifiedTokens.Token, 'address'>[]
|
|
272
|
+
}
|
|
273
|
+
}
|
|
@@ -274,7 +274,6 @@ describe('GET /tokens?verified=true', () => {
|
|
|
274
274
|
describe('GET /tokens?addresses=', () => {
|
|
275
275
|
test('separates repeated addresses in the response cache', async () => {
|
|
276
276
|
const routed = TestApp.create({ db })
|
|
277
|
-
const headers = { authorization: `Bearer ${TestApp.key.token}` }
|
|
278
277
|
const repeated = new URLSearchParams()
|
|
279
278
|
repeated.append('addresses', TestApp.token)
|
|
280
279
|
repeated.append('addresses', TestApp.tokenWithHolders)
|
|
@@ -282,9 +281,9 @@ describe('GET /tokens?addresses=', () => {
|
|
|
282
281
|
addresses: TestApp.tokenWithHolders,
|
|
283
282
|
})
|
|
284
283
|
|
|
285
|
-
const primed = await routed.request(`/v1/tokens?${repeated}
|
|
286
|
-
const miss = await routed.request(`/v1/tokens?${single}
|
|
287
|
-
const hit = await routed.request(`/v1/tokens?${single}
|
|
284
|
+
const primed = await routed.request(`/v1/tokens?${repeated}`)
|
|
285
|
+
const miss = await routed.request(`/v1/tokens?${single}`)
|
|
286
|
+
const hit = await routed.request(`/v1/tokens?${single}`)
|
|
288
287
|
const primedBody = await TestApp.json(primed, Tokens.schema.getTokens.Response)
|
|
289
288
|
const body = await TestApp.json(hit, Tokens.schema.getTokens.Response)
|
|
290
289
|
|
|
@@ -302,7 +301,6 @@ describe('GET /tokens?addresses=', () => {
|
|
|
302
301
|
|
|
303
302
|
test('separates repeated includes in the response cache', async () => {
|
|
304
303
|
const routed = TestApp.create({ db })
|
|
305
|
-
const headers = { authorization: `Bearer ${TestApp.key.token}` }
|
|
306
304
|
const repeated = new URLSearchParams({ limit: '5' })
|
|
307
305
|
repeated.append('include', 'createdAt')
|
|
308
306
|
repeated.append('include', 'holderCount')
|
|
@@ -311,9 +309,9 @@ describe('GET /tokens?addresses=', () => {
|
|
|
311
309
|
limit: '5',
|
|
312
310
|
})
|
|
313
311
|
|
|
314
|
-
const primed = await routed.request(`/v1/tokens?${repeated}
|
|
315
|
-
const miss = await routed.request(`/v1/tokens?${single}
|
|
316
|
-
const hit = await routed.request(`/v1/tokens?${single}
|
|
312
|
+
const primed = await routed.request(`/v1/tokens?${repeated}`)
|
|
313
|
+
const miss = await routed.request(`/v1/tokens?${single}`)
|
|
314
|
+
const hit = await routed.request(`/v1/tokens?${single}`)
|
|
317
315
|
const primedBody = await TestApp.json(primed, Tokens.schema.getTokens.Response)
|
|
318
316
|
const body = await TestApp.json(hit, Tokens.schema.getTokens.Response)
|
|
319
317
|
|