tapimo 0.7.0 → 0.7.2
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/dist/ApiKeys.d.ts +24 -7
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +17 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12104 -7861
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +191 -128
- 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 +601 -20
- 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 +94 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +141 -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/verified-tokens.d.ts +166 -166
- 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 +151 -95
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +2 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +18 -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 +14377 -10165
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +91 -19
- 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 +32 -32
- 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 +312 -312
- package/dist/apps/data/routes/balances.d.ts +18 -18
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +176 -176
- 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 +2144 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +947 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1231 -324
- 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.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/funding.d.ts +4092 -387
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +1403 -256
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +5 -5
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +19 -2
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +265 -265
- 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 +5 -5
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +211 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +36 -36
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +49 -9
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +116 -88
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +198 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +55 -55
- 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 +78 -29
- 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 +10 -10
- 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.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +34 -9
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +5 -3
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +175 -65
- 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/index.d.ts +2 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +2 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +670 -670
- 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 +5 -5
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +2 -8
- 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 +62 -62
- 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 +30 -30
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +78 -78
- package/dist/apps/management/routes/orgs.d.ts +48 -48
- 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 +9 -9
- 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 +80 -80
- package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
- package/dist/apps/management/routes/webhooks.d.ts +50 -50
- 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/mpp/App.d.ts +55 -56
- 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 +184 -24
- 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 +16 -7
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/db/Db.d.ts +20 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +342 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +921 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +269 -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 +159 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +206 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +115 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +100 -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 +35 -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 +4 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +14 -4
- 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 +26 -0
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +35 -2
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +16 -10
- 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 +9 -2
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +36 -9
- 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/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 +1 -1
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +3 -0
- 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 +8 -3
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +24 -13
- 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 +43 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +79 -11
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +82 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +83 -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 +366 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +286 -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 +52 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +314 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1186 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1081 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +113 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +676 -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/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 +13 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +13 -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 +46 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +464 -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 +9 -4
- package/src/ApiKeys.test.ts +11 -7
- package/src/ApiKeys.ts +37 -9
- package/src/App.test.ts +85 -10
- package/src/App.ts +224 -137
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +650 -30
- 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 +167 -23
- package/src/admin/apps/api-keys.ts +166 -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 +189 -95
- package/src/analytics/Analytics.test.ts +69 -10
- package/src/analytics/Analytics.ts +20 -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 +84 -1
- package/src/apps/data/App.test.ts +38 -9
- package/src/apps/data/App.ts +96 -33
- 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 +1108 -0
- package/src/apps/data/routes/earn.ts +1391 -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/funding.test.ts +2712 -221
- package/src/apps/data/routes/funding.ts +1604 -387
- package/src/apps/data/routes/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +19 -2
- 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 +243 -25
- package/src/apps/data/routes/tokenlist.test.ts +15 -0
- package/src/apps/data/routes/tokenlist.ts +88 -22
- package/src/apps/data/routes/tokens.ts +262 -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/verified-tokens.test.ts +51 -0
- package/src/apps/data/routes/verified-tokens.ts +52 -15
- package/src/apps/data/routes/webhooks.test.ts +432 -33
- package/src/apps/data/routes/webhooks.ts +189 -79
- 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/index.ts +2 -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 +5 -3
- package/src/apps/management/routes/api-keys.ts +2 -9
- 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/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 +122 -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 +495 -64
- package/src/apps/relay/App.ts +234 -24
- package/src/apps/relay/Sponsorships.test.ts +51 -0
- package/src/apps/relay/Sponsorships.ts +19 -7
- package/src/db/Db.ts +439 -0
- package/src/db/Schema.ts +325 -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 +376 -0
- package/src/db/tables/fundingDeposits.test.ts +261 -0
- package/src/db/tables/fundingDeposits.ts +229 -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.test.ts +88 -0
- package/src/db/tables/organizations.ts +42 -1
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +52 -2
- package/src/db/tables/sponsoredTransactions.ts +18 -6
- 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 +48 -0
- package/src/internal/Auth.ts +61 -2
- package/src/internal/Cache.ts +13 -9
- 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 +37 -5
- package/src/internal/EdgeCache.ts +39 -7
- 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/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +189 -8
- 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 +3 -0
- package/src/internal/Provider.test.ts +17 -0
- package/src/internal/Provider.ts +17 -0
- package/src/internal/Schema.test.ts +13 -0
- package/src/internal/Schema.ts +41 -24
- 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 +212 -18
- package/src/internal/Tidx.ts +112 -32
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +170 -17
- package/src/internal/Viem.ts +111 -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 +453 -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 +430 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1796 -0
- package/src/internal/funding/Reconciliation.local.test.ts +504 -0
- package/src/internal/funding/Reconciliation.test.ts +2020 -0
- package/src/internal/funding/Reconciliation.ts +930 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -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 +20 -0
- package/src/internal/funding/index.ts +12 -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 +474 -0
- package/src/internal/funding/providers/relay.ts +559 -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/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/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,36 @@ 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
|
+
url: resolvedUrl,
|
|
372
|
+
} = Viem.resolveRpc(upstream_rpc, { chainId, principal, zone })
|
|
373
|
+
const usePublicZoneUrl = Boolean(zone && zoneToken)
|
|
374
|
+
const url = usePublicZoneUrl ? publicZoneUrl : resolvedUrl
|
|
278
375
|
// The chain id is syntactically valid but this deployment has no RPC upstream
|
|
279
376
|
// configured for it (no `rpc` config and no built-in default).
|
|
280
377
|
if (!url)
|
|
@@ -288,7 +385,9 @@ async function passthrough(
|
|
|
288
385
|
const headers = new Headers()
|
|
289
386
|
for (const [name, value] of c.req.raw.headers)
|
|
290
387
|
if (!strippedHeaders.has(name.toLowerCase())) headers.set(name, value)
|
|
291
|
-
|
|
388
|
+
// Public Zone endpoints authenticate with the caller's token, never internal RPC credentials.
|
|
389
|
+
if (!usePublicZoneUrl && basicAuth) headers.set('authorization', `Basic ${btoa(basicAuth)}`)
|
|
390
|
+
else if (!usePublicZoneUrl && bearerAuth) headers.set('authorization', `Bearer ${bearerAuth}`)
|
|
292
391
|
if (zone && zoneToken) headers.set(ZoneRpcAuthentication.headerName, zoneToken)
|
|
293
392
|
|
|
294
393
|
// `duplex` is required when streaming a request body, but is not yet in
|
|
@@ -306,18 +405,137 @@ async function passthrough(
|
|
|
306
405
|
|
|
307
406
|
try {
|
|
308
407
|
const response = await fetch(new Request(upstream, init))
|
|
408
|
+
let body = response.body
|
|
409
|
+
|
|
410
|
+
if (!response.ok) {
|
|
411
|
+
// Malformed requests and public Zone authentication failures are caused
|
|
412
|
+
// by caller input, not by the RPC provider.
|
|
413
|
+
if (!isCallerRpcFailure(response.status, usePublicZoneUrl))
|
|
414
|
+
c.set('providerFailure', rpcProviderFailure(response, alertChainId))
|
|
415
|
+
} else if (response.status === 200) {
|
|
416
|
+
const inspection = await inspectRpcResponse(response)
|
|
417
|
+
body = inspection.body
|
|
418
|
+
if (inspection.result?.ok === false && !(inspection.result.empty && options.notificationOnly))
|
|
419
|
+
c.set('providerFailure', {
|
|
420
|
+
chainId: alertChainId,
|
|
421
|
+
failure: 'payload',
|
|
422
|
+
id: 'rpc',
|
|
423
|
+
operation: 'request',
|
|
424
|
+
})
|
|
425
|
+
else if (inspection.result?.ok) {
|
|
426
|
+
const parsed = schema.ResponseBody.safeParse(inspection.result.value)
|
|
427
|
+
if (!parsed.success)
|
|
428
|
+
c.set('providerFailure', {
|
|
429
|
+
chainId: alertChainId,
|
|
430
|
+
failure: 'payload',
|
|
431
|
+
id: 'rpc',
|
|
432
|
+
operation: 'request',
|
|
433
|
+
})
|
|
434
|
+
else {
|
|
435
|
+
const rpc = Log.rpcErrors(parsed.data)
|
|
436
|
+
if (rpc) c.set('rpcResponse', rpc)
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
309
440
|
|
|
310
441
|
// Stream the upstream response back verbatim so JSON-RPC bodies, status
|
|
311
442
|
// codes, and headers survive exactly as clients expect.
|
|
312
|
-
return c.newResponse(
|
|
313
|
-
TypedResponse<never, never, never>
|
|
443
|
+
return c.newResponse(body, response) as globalThis.Response & TypedResponse<never, never, never>
|
|
314
444
|
} catch (cause) {
|
|
315
445
|
// Timeouts and network failures become the standard 502 envelope instead
|
|
316
446
|
// of an unhandled 500.
|
|
447
|
+
c.set('providerFailure', rpcProviderFailure(cause, alertChainId))
|
|
317
448
|
return Response.upstream(c, cause) as never
|
|
318
449
|
}
|
|
319
450
|
}
|
|
320
451
|
|
|
452
|
+
function isCallerRpcFailure(status: number, usePublicZoneUrl: boolean) {
|
|
453
|
+
return (
|
|
454
|
+
status === 400 ||
|
|
455
|
+
status === 413 ||
|
|
456
|
+
status === 415 ||
|
|
457
|
+
status === 422 ||
|
|
458
|
+
(usePublicZoneUrl && (status === 401 || status === 403))
|
|
459
|
+
)
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
declare namespace passthrough {
|
|
463
|
+
/** Request facts needed to classify the upstream response. */
|
|
464
|
+
type Options = {
|
|
465
|
+
/** Whether every valid request in the payload omits an id. */
|
|
466
|
+
notificationOnly: boolean
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
async function inspectRpcResponse(response: globalThis.Response): Promise<RpcInspection> {
|
|
471
|
+
const contentLength = Number(response.headers.get('content-length'))
|
|
472
|
+
if (Number.isFinite(contentLength) && contentLength > maxRpcInspectionBytes)
|
|
473
|
+
return { body: response.body, result: undefined }
|
|
474
|
+
if (!response.body) return { body: null, result: { empty: true, ok: false } }
|
|
475
|
+
|
|
476
|
+
const reader = response.body.getReader()
|
|
477
|
+
const chunks: Uint8Array<ArrayBuffer>[] = []
|
|
478
|
+
let size = 0
|
|
479
|
+
let complete = false
|
|
480
|
+
while (size <= maxRpcInspectionBytes) {
|
|
481
|
+
const read = await reader.read()
|
|
482
|
+
if (read.done) {
|
|
483
|
+
complete = true
|
|
484
|
+
break
|
|
485
|
+
}
|
|
486
|
+
chunks.push(read.value)
|
|
487
|
+
size += read.value.byteLength
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
let index = 0
|
|
491
|
+
const body = new ReadableStream<Uint8Array<ArrayBuffer>>({
|
|
492
|
+
cancel: (reason) => reader.cancel(reason),
|
|
493
|
+
async pull(controller) {
|
|
494
|
+
const chunk = chunks[index]
|
|
495
|
+
if (chunk) {
|
|
496
|
+
index += 1
|
|
497
|
+
controller.enqueue(chunk)
|
|
498
|
+
return
|
|
499
|
+
}
|
|
500
|
+
const read = await reader.read()
|
|
501
|
+
if (read.done) controller.close()
|
|
502
|
+
else controller.enqueue(read.value)
|
|
503
|
+
},
|
|
504
|
+
})
|
|
505
|
+
if (!complete || size > maxRpcInspectionBytes) return { body, result: undefined }
|
|
506
|
+
|
|
507
|
+
const bytes = new Uint8Array(size)
|
|
508
|
+
let offset = 0
|
|
509
|
+
for (const chunk of chunks) {
|
|
510
|
+
bytes.set(chunk, offset)
|
|
511
|
+
offset += chunk.byteLength
|
|
512
|
+
}
|
|
513
|
+
const result = (() => {
|
|
514
|
+
try {
|
|
515
|
+
return { ok: true as const, value: JSON.parse(new TextDecoder().decode(bytes)) as unknown }
|
|
516
|
+
} catch {
|
|
517
|
+
return { empty: size === 0, ok: false as const }
|
|
518
|
+
}
|
|
519
|
+
})()
|
|
520
|
+
return { body, result }
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
function rpcProviderFailure(cause: unknown, chainId: number): Log.ProviderFailure {
|
|
524
|
+
const base = { chainId, id: 'rpc', operation: 'request' } as const
|
|
525
|
+
if (
|
|
526
|
+
cause instanceof DOMException &&
|
|
527
|
+
(cause.name === 'AbortError' || cause.name === 'TimeoutError')
|
|
528
|
+
)
|
|
529
|
+
return { ...base, failure: 'timeout' }
|
|
530
|
+
if (cause instanceof globalThis.Response) {
|
|
531
|
+
if (cause.status === 408) return { ...base, failure: 'timeout', status: cause.status }
|
|
532
|
+
if (cause.status === 429) return { ...base, failure: 'rate_limit', status: cause.status }
|
|
533
|
+
return { ...base, failure: 'http', status: cause.status }
|
|
534
|
+
}
|
|
535
|
+
if (cause instanceof TypeError) return { ...base, failure: 'network' }
|
|
536
|
+
return { ...base, failure: 'unknown' }
|
|
537
|
+
}
|
|
538
|
+
|
|
321
539
|
function resolveChainId(c: Context<App.Environment>) {
|
|
322
540
|
const parameter = c.req.param('chain')
|
|
323
541
|
if (parameter === undefined) return c.get('chainId')
|
|
@@ -75,4 +75,19 @@ describe('GET /tokenlist', () => {
|
|
|
75
75
|
expect(body.tokens).toEqual([])
|
|
76
76
|
expect(body.version.patch).toBe(0)
|
|
77
77
|
})
|
|
78
|
+
|
|
79
|
+
test('refreshes cached reads after a snapshot publish', async () => {
|
|
80
|
+
const db = TestApp.database()
|
|
81
|
+
await VerifiedTokens.replace(db, chainId, seedList)
|
|
82
|
+
const client = TestApp.client({ auth: { keys: [reader] }, db })
|
|
83
|
+
|
|
84
|
+
await client.v1.tokenlist.$get({ query: {} }, as(reader))
|
|
85
|
+
await VerifiedTokens.replace(db, chainId, seedList.slice(1))
|
|
86
|
+
|
|
87
|
+
const response = await client.v1.tokenlist.$get({ query: {} }, as(reader))
|
|
88
|
+
const body = await TestApp.json(response, Tokenlist.schema.getTokenList.Response)
|
|
89
|
+
expect(body.tokens.map((token) => token.address)).toEqual(
|
|
90
|
+
seedList.slice(1).map((token) => token.address),
|
|
91
|
+
)
|
|
92
|
+
})
|
|
78
93
|
})
|
|
@@ -1,12 +1,14 @@
|
|
|
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'
|
|
5
5
|
import * as Auth from '../../../internal/Auth.js'
|
|
6
6
|
import * as Cache from '../../../internal/Cache.js'
|
|
7
|
+
import * as EdgeCache from '../../../internal/EdgeCache.js'
|
|
7
8
|
import * as OpenApi from '../../../internal/OpenApi.js'
|
|
8
9
|
import * as Response from '../../../internal/Response.js'
|
|
9
10
|
import * as Schema from '../../../internal/Schema.js'
|
|
11
|
+
import * as Timing from '../../../internal/Timing.js'
|
|
10
12
|
import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
|
|
11
13
|
import * as Viem from '../../../internal/Viem.js'
|
|
12
14
|
import { getTokenLogo } from './tokens.js'
|
|
@@ -159,11 +161,24 @@ export function tokenlist() {
|
|
|
159
161
|
summary: 'Get token list',
|
|
160
162
|
tags: ['Verified Tokens'],
|
|
161
163
|
}),
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
164
|
+
// Anonymous callers accept the route's five-minute freshness window.
|
|
165
|
+
// Credentialed reads keep snapshot-version invalidation.
|
|
166
|
+
EdgeCache.setEligibility(
|
|
167
|
+
Cache.response<App.Environment>({
|
|
168
|
+
cacheControl: Cache.policies.stable,
|
|
169
|
+
name: 'tempo-api:tokenlist:v1',
|
|
170
|
+
key: async (c) => {
|
|
171
|
+
const base = Cache.urlKey(c, schema.getTokenList.Query)
|
|
172
|
+
const query = schema.getTokenList.Query.parse(
|
|
173
|
+
Object.fromEntries(new URL(c.req.url).searchParams),
|
|
174
|
+
)
|
|
175
|
+
const chainId = query.chainId ?? c.get('chainId')
|
|
176
|
+
const { version } = await VerifiedTokens.snapshot(c, chainId)
|
|
177
|
+
return `${base}:v:${version}`
|
|
178
|
+
},
|
|
179
|
+
}),
|
|
180
|
+
anonymousEdgeCache,
|
|
181
|
+
),
|
|
167
182
|
async (c) => {
|
|
168
183
|
if (Auth.narrowAccess) return Auth.paidAccessError(c)
|
|
169
184
|
if (OpenApi.narrowValidation)
|
|
@@ -176,22 +191,18 @@ export function tokenlist() {
|
|
|
176
191
|
const chainId = query.chainId ?? c.get('chainId')
|
|
177
192
|
try {
|
|
178
193
|
const snapshot = await VerifiedTokens.snapshot(c, chainId)
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
...(logoURI === undefined ? {} : { logoURI }),
|
|
192
|
-
}
|
|
193
|
-
}),
|
|
194
|
-
)
|
|
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
|
+
})
|
|
195
206
|
const list = {
|
|
196
207
|
name: Viem.chains.find((chain) => chain.id === chainId)?.name ?? `Tempo ${chainId}`,
|
|
197
208
|
timestamp: snapshot.updatedAt,
|
|
@@ -205,3 +216,58 @@ export function tokenlist() {
|
|
|
205
216
|
},
|
|
206
217
|
)
|
|
207
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
|
+
}
|