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
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
/** @module-tag localnet */
|
|
2
|
+
|
|
1
3
|
import * as TestApp from '../../test/App.js'
|
|
2
4
|
import * as Runtime from '../../test/runtime.js'
|
|
3
5
|
import * as Indexer from '../apps/data/routes/indexer.js'
|
|
6
|
+
import type * as Log from './Log.js'
|
|
7
|
+
import * as Tidx from './Tidx.js'
|
|
4
8
|
|
|
5
9
|
describe('local TIDX runtime', () => {
|
|
6
10
|
test.runIf(Runtime.get().mode === 'localnet')(
|
|
7
|
-
'
|
|
11
|
+
'observes queries through a disposable TIDX',
|
|
8
12
|
async () => {
|
|
9
13
|
const runtime = Runtime.get()
|
|
10
|
-
const
|
|
14
|
+
const entries: Log.Entry[] = []
|
|
15
|
+
const client = TestApp.client({ logger: (entry) => void entries.push(entry) })
|
|
11
16
|
const response = await client.v1.indexer.query.$get(
|
|
12
17
|
{ query: { chainId: String(runtime.chainId), sql: 'select 1 as value' } },
|
|
13
18
|
TestApp.auth,
|
|
@@ -20,7 +25,7 @@ describe('local TIDX runtime', () => {
|
|
|
20
25
|
[
|
|
21
26
|
"value",
|
|
22
27
|
]
|
|
23
|
-
|
|
28
|
+
`)
|
|
24
29
|
expect(body.rows).toMatchInlineSnapshot(`
|
|
25
30
|
[
|
|
26
31
|
[
|
|
@@ -28,6 +33,76 @@ describe('local TIDX runtime', () => {
|
|
|
28
33
|
],
|
|
29
34
|
]
|
|
30
35
|
`)
|
|
36
|
+
expect(entries[0]?.provider).toBeUndefined()
|
|
37
|
+
expect(entries[0]?.timings?.['tidx']).toBeGreaterThan(0)
|
|
38
|
+
},
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
test.runIf(Runtime.get().mode === 'localnet')(
|
|
42
|
+
'does not record caller query rejections as provider failures',
|
|
43
|
+
async () => {
|
|
44
|
+
const runtime = Runtime.get()
|
|
45
|
+
const entries: Log.Entry[] = []
|
|
46
|
+
const client = TestApp.client({ logger: (entry) => void entries.push(entry) })
|
|
47
|
+
const response = await client.v1.indexer.query.$get(
|
|
48
|
+
{
|
|
49
|
+
query: {
|
|
50
|
+
chainId: String(runtime.chainId),
|
|
51
|
+
sql: 'select * from missing_observability_table',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
TestApp.auth,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
expect(response.status).toBe(422)
|
|
58
|
+
expect(entries[0]?.provider).toBeUndefined()
|
|
59
|
+
expect(entries[0]?.timings?.['tidx']).toBeGreaterThan(0)
|
|
60
|
+
},
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
test.runIf(Runtime.get().mode === 'localnet')(
|
|
64
|
+
'clears a handled failure after a successful query',
|
|
65
|
+
async () => {
|
|
66
|
+
const runtime = Runtime.get()
|
|
67
|
+
const failures: (Log.ProviderFailure | undefined)[] = []
|
|
68
|
+
const timings: number[] = []
|
|
69
|
+
const client = Tidx.observe(
|
|
70
|
+
Tidx.getClient({
|
|
71
|
+
chainId: runtime.chainId,
|
|
72
|
+
tidx: { baseUrl: runtime.tidxUrl },
|
|
73
|
+
}),
|
|
74
|
+
{
|
|
75
|
+
record: (failure) => void failures.push(failure),
|
|
76
|
+
time: async (fn) => {
|
|
77
|
+
const start = performance.now()
|
|
78
|
+
try {
|
|
79
|
+
return await fn()
|
|
80
|
+
} finally {
|
|
81
|
+
timings.push(performance.now() - start)
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
await expect(
|
|
88
|
+
client.fetch({
|
|
89
|
+
chainId: runtime.chainId,
|
|
90
|
+
query: 'select * from missing_observability_table',
|
|
91
|
+
}),
|
|
92
|
+
).rejects.toThrow()
|
|
93
|
+
await client.fetch({ chainId: runtime.chainId, query: 'select 1' })
|
|
94
|
+
|
|
95
|
+
expect(failures).toEqual([
|
|
96
|
+
{
|
|
97
|
+
failure: 'query',
|
|
98
|
+
id: 'tidx',
|
|
99
|
+
operation: 'query',
|
|
100
|
+
status: 422,
|
|
101
|
+
},
|
|
102
|
+
undefined,
|
|
103
|
+
])
|
|
104
|
+
expect(timings).toHaveLength(2)
|
|
105
|
+
expect(timings.every((duration) => duration > 0)).toBe(true)
|
|
31
106
|
},
|
|
32
107
|
)
|
|
33
108
|
})
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Tidx as TidxClient } from 'tidx.ts'
|
|
2
2
|
|
|
3
|
+
import * as Zones from '../apps/Zones.js'
|
|
3
4
|
import type * as Auth from './Auth.js'
|
|
4
5
|
import * as Tidx from './Tidx.js'
|
|
5
6
|
import type * as Viem from './Viem.js'
|
|
@@ -25,6 +26,115 @@ function fakeClient(fetch: Tidx.Client['fetch']): Tidx.Client {
|
|
|
25
26
|
return { fetch } as never
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
describe('providerFailure', () => {
|
|
30
|
+
test('classifies failed 200 bodies as payload failures', () => {
|
|
31
|
+
expect(Tidx.providerFailure(appError('secret upstream detail'))).toEqual({
|
|
32
|
+
failure: 'payload',
|
|
33
|
+
id: 'tidx',
|
|
34
|
+
operation: 'query',
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('classifies query and HTTP failures', () => {
|
|
39
|
+
expect([
|
|
40
|
+
Tidx.providerFailure(appError('secret upstream detail', 422)),
|
|
41
|
+
Tidx.providerFailure(appError('secret upstream detail', 503)),
|
|
42
|
+
]).toMatchInlineSnapshot(`
|
|
43
|
+
[
|
|
44
|
+
{
|
|
45
|
+
"failure": "query",
|
|
46
|
+
"id": "tidx",
|
|
47
|
+
"operation": "query",
|
|
48
|
+
"status": 422,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"failure": "http",
|
|
52
|
+
"id": "tidx",
|
|
53
|
+
"operation": "query",
|
|
54
|
+
"status": 503,
|
|
55
|
+
},
|
|
56
|
+
]
|
|
57
|
+
`)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
test('classifies timeout and rate-limit statuses', () => {
|
|
61
|
+
expect([
|
|
62
|
+
Tidx.providerFailure(appError('secret upstream detail', 408)),
|
|
63
|
+
Tidx.providerFailure(appError('secret upstream detail', 429)),
|
|
64
|
+
]).toMatchInlineSnapshot(`
|
|
65
|
+
[
|
|
66
|
+
{
|
|
67
|
+
"failure": "timeout",
|
|
68
|
+
"id": "tidx",
|
|
69
|
+
"operation": "query",
|
|
70
|
+
"status": 408,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"failure": "rate_limit",
|
|
74
|
+
"id": "tidx",
|
|
75
|
+
"operation": "query",
|
|
76
|
+
"status": 429,
|
|
77
|
+
},
|
|
78
|
+
]
|
|
79
|
+
`)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
test('classifies transport failures without their messages', () => {
|
|
83
|
+
expect([
|
|
84
|
+
Tidx.providerFailure(new DOMException('secret timeout detail', 'TimeoutError')),
|
|
85
|
+
Tidx.providerFailure(new TypeError('secret network detail')),
|
|
86
|
+
Tidx.providerFailure(new Error('secret unknown detail')),
|
|
87
|
+
]).toMatchInlineSnapshot(`
|
|
88
|
+
[
|
|
89
|
+
{
|
|
90
|
+
"failure": "timeout",
|
|
91
|
+
"id": "tidx",
|
|
92
|
+
"operation": "query",
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"failure": "network",
|
|
96
|
+
"id": "tidx",
|
|
97
|
+
"operation": "query",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"failure": "unknown",
|
|
101
|
+
"id": "tidx",
|
|
102
|
+
"operation": "query",
|
|
103
|
+
},
|
|
104
|
+
]
|
|
105
|
+
`)
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
describe('responseFailure', () => {
|
|
110
|
+
test('classifies failed 200 bodies without consuming the response', async () => {
|
|
111
|
+
const response = Response.json({ error: 'secret upstream detail', ok: false })
|
|
112
|
+
|
|
113
|
+
expect(await Tidx.responseFailure(response)).toEqual({
|
|
114
|
+
failure: 'payload',
|
|
115
|
+
id: 'tidx',
|
|
116
|
+
operation: 'query',
|
|
117
|
+
})
|
|
118
|
+
expect(await response.json()).toEqual({ error: 'secret upstream detail', ok: false })
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
test('ignores successful 200 bodies', async () => {
|
|
122
|
+
const response = Response.json({ ok: true })
|
|
123
|
+
|
|
124
|
+
expect(await Tidx.responseFailure(response)).toBeUndefined()
|
|
125
|
+
})
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
describe('isQueryRejection', () => {
|
|
129
|
+
test('matches caller-caused query statuses only', () => {
|
|
130
|
+
expect(
|
|
131
|
+
[400, 422, 408, 429, 500].map((status) =>
|
|
132
|
+
Tidx.isQueryRejection(new Response(null, { status })),
|
|
133
|
+
),
|
|
134
|
+
).toEqual([true, true, false, false, false])
|
|
135
|
+
})
|
|
136
|
+
})
|
|
137
|
+
|
|
28
138
|
describe('escape', () => {
|
|
29
139
|
test('doubles quotes for ANSI string literals, leaving backslashes alone', () => {
|
|
30
140
|
expect(Tidx.escape('USD')).toMatchInlineSnapshot(`"USD"`)
|
|
@@ -145,6 +255,19 @@ describe('withTransientRetry', () => {
|
|
|
145
255
|
})
|
|
146
256
|
})
|
|
147
257
|
|
|
258
|
+
describe('isDeterministicError', () => {
|
|
259
|
+
test('flags indexer failures a retry cannot fix', () => {
|
|
260
|
+
// The planner rejects the query shape outright (e.g. 422 `db error`).
|
|
261
|
+
expect(Tidx.isDeterministicError(appError('db error', 422))).toBe(true)
|
|
262
|
+
expect(Tidx.isDeterministicError(appError('syntax error near "SELCT"'))).toBe(true)
|
|
263
|
+
// Transient failures retry instead.
|
|
264
|
+
expect(Tidx.isDeterministicError(appError('db error'))).toBe(false)
|
|
265
|
+
expect(Tidx.isDeterministicError(appError('bad gateway', 502))).toBe(false)
|
|
266
|
+
// Non-indexer errors are not indexer failures at all.
|
|
267
|
+
expect(Tidx.isDeterministicError(new Error('db error'))).toBe(false)
|
|
268
|
+
})
|
|
269
|
+
})
|
|
270
|
+
|
|
148
271
|
describe('resolve', () => {
|
|
149
272
|
test('defaults to the per-chain indexer URL', () => {
|
|
150
273
|
expect(Tidx.resolve(undefined, { chainId: 4217, principal: null })).toMatchInlineSnapshot(`
|
|
@@ -185,8 +308,42 @@ describe('resolve', () => {
|
|
|
185
308
|
`)
|
|
186
309
|
})
|
|
187
310
|
|
|
311
|
+
test('selects a serialized base URL by chain id', () => {
|
|
312
|
+
const tidx = {
|
|
313
|
+
baseUrl: JSON.stringify({ 4217: 'https://mainnet.indexer.test', 42431: 'https://testnet.indexer.test' }), // prettier-ignore
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
expect(Tidx.resolve(tidx, { chainId: 4217, principal: null })).toMatchInlineSnapshot(`
|
|
317
|
+
{
|
|
318
|
+
"baseUrl": "https://mainnet.indexer.test",
|
|
319
|
+
"basicAuth": undefined,
|
|
320
|
+
}
|
|
321
|
+
`)
|
|
322
|
+
expect(Tidx.resolve(tidx, { chainId: 42431, principal: null })).toMatchInlineSnapshot(`
|
|
323
|
+
{
|
|
324
|
+
"baseUrl": "https://testnet.indexer.test",
|
|
325
|
+
"basicAuth": undefined,
|
|
326
|
+
}
|
|
327
|
+
`)
|
|
328
|
+
})
|
|
329
|
+
|
|
330
|
+
test('passes Zone metadata to the resolver', () => {
|
|
331
|
+
expect(
|
|
332
|
+
Tidx.resolve(({ zone }) => ({ baseUrl: zone ? 'http://tidx:8080' : undefined }), {
|
|
333
|
+
chainId: Zones.zoneE.id,
|
|
334
|
+
principal: null,
|
|
335
|
+
zone: Zones.zoneE,
|
|
336
|
+
}),
|
|
337
|
+
).toMatchInlineSnapshot(`
|
|
338
|
+
{
|
|
339
|
+
"baseUrl": "http://tidx:8080",
|
|
340
|
+
"basicAuth": undefined,
|
|
341
|
+
}
|
|
342
|
+
`)
|
|
343
|
+
})
|
|
344
|
+
|
|
188
345
|
test('the static form ignores the principal', () => {
|
|
189
|
-
const tidx = { baseUrl: 'https://internal.indexer'
|
|
346
|
+
const tidx = { auth: 'user:pass', baseUrl: 'https://internal.indexer' }
|
|
190
347
|
expect(Tidx.resolve(tidx, { chainId: 4217, principal: publicPrincipal }))
|
|
191
348
|
.toMatchInlineSnapshot(`
|
|
192
349
|
{
|
|
@@ -206,7 +363,7 @@ describe('resolve', () => {
|
|
|
206
363
|
test('resolves Bearer auth', () => {
|
|
207
364
|
expect(
|
|
208
365
|
Tidx.resolve(
|
|
209
|
-
{ baseUrl: 'https://internal.indexer'
|
|
366
|
+
{ auth: 'zone-secret', baseUrl: 'https://internal.indexer' },
|
|
210
367
|
{ chainId: 4217, principal: apiKeyPrincipal },
|
|
211
368
|
),
|
|
212
369
|
).toMatchInlineSnapshot(`
|
|
@@ -218,11 +375,36 @@ describe('resolve', () => {
|
|
|
218
375
|
`)
|
|
219
376
|
})
|
|
220
377
|
|
|
378
|
+
test('selects Bearer auth by chain id', () => {
|
|
379
|
+
const tidx = {
|
|
380
|
+
auth: { 4217: 'mainnet-secret', 42431: 'testnet-secret' },
|
|
381
|
+
baseUrl: 'https://internal.indexer',
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
expect(Tidx.resolve(tidx, { chainId: 4217, principal: null }).bearerAuth).toBe('mainnet-secret')
|
|
385
|
+
expect(Tidx.resolve(tidx, { chainId: 42431, principal: null }).bearerAuth).toBe(
|
|
386
|
+
'testnet-secret',
|
|
387
|
+
)
|
|
388
|
+
expect(Tidx.resolve(tidx, { chainId: 421_700_001, principal: null }).bearerAuth).toBeUndefined()
|
|
389
|
+
})
|
|
390
|
+
|
|
391
|
+
test('parses serialized Bearer auth by chain id', () => {
|
|
392
|
+
const tidx = {
|
|
393
|
+
auth: JSON.stringify({ 421_700_001: 'zone-secret' }),
|
|
394
|
+
baseUrl: 'https://internal.indexer',
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
expect(Tidx.resolve(tidx, { chainId: 421_700_001, principal: null }).bearerAuth).toBe(
|
|
398
|
+
'zone-secret',
|
|
399
|
+
)
|
|
400
|
+
expect(Tidx.resolve(tidx, { chainId: 4217, principal: null }).bearerAuth).toBeUndefined()
|
|
401
|
+
})
|
|
402
|
+
|
|
221
403
|
test('the resolver form routes anonymous callers to a separate upstream', () => {
|
|
222
|
-
const tidx = ({ principal }: Viem.
|
|
404
|
+
const tidx = ({ principal }: Viem.resolveRpc.Context) =>
|
|
223
405
|
principal?.type === 'public'
|
|
224
406
|
? { baseUrl: 'https://indexer.tempo.xyz' }
|
|
225
|
-
: { baseUrl: 'https://internal.indexer'
|
|
407
|
+
: { auth: 'user:pass', baseUrl: 'https://internal.indexer' }
|
|
226
408
|
expect(Tidx.resolve(tidx, { chainId: 4217, principal: publicPrincipal }))
|
|
227
409
|
.toMatchInlineSnapshot(`
|
|
228
410
|
{
|
|
@@ -268,7 +450,7 @@ describe('getClient', () => {
|
|
|
268
450
|
try {
|
|
269
451
|
const client = Tidx.getClient({
|
|
270
452
|
chainId: 4217,
|
|
271
|
-
tidx: { baseUrl: 'https://internal.indexer'
|
|
453
|
+
tidx: { auth: 'zone-secret', baseUrl: 'https://internal.indexer' },
|
|
272
454
|
})
|
|
273
455
|
await client.fetch({ query: 'select 1' })
|
|
274
456
|
|
|
@@ -286,33 +468,45 @@ describe('createGetClient', () => {
|
|
|
286
468
|
tidx: ({ principal }) =>
|
|
287
469
|
principal?.type === 'public'
|
|
288
470
|
? { baseUrl: 'https://indexer.tempo.xyz' }
|
|
289
|
-
: { baseUrl: 'https://internal.indexer'
|
|
471
|
+
: { auth: 'user:pass', baseUrl: 'https://internal.indexer' },
|
|
290
472
|
})
|
|
291
473
|
// Callers resolving to the same upstream share a client; distinct upstreams
|
|
292
474
|
// (and chain ids) get distinct clients.
|
|
293
|
-
expect(getTidx(4217, apiKeyPrincipal)).toBe(
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
expect(getTidx(4217,
|
|
475
|
+
expect(getTidx(4217, { principal: apiKeyPrincipal })).toBe(
|
|
476
|
+
getTidx(4217, { principal: apiKeyPrincipal }),
|
|
477
|
+
)
|
|
478
|
+
expect(getTidx(4217, { principal: publicPrincipal })).toBe(
|
|
479
|
+
getTidx(4217, { principal: publicPrincipal }),
|
|
480
|
+
)
|
|
481
|
+
expect(getTidx(4217, { principal: publicPrincipal })).not.toBe(
|
|
482
|
+
getTidx(4217, { principal: apiKeyPrincipal }),
|
|
483
|
+
)
|
|
484
|
+
expect(getTidx(4217, { principal: apiKeyPrincipal })).not.toBe(
|
|
485
|
+
getTidx(42431, { principal: apiKeyPrincipal }),
|
|
486
|
+
)
|
|
297
487
|
})
|
|
298
488
|
|
|
299
489
|
test('shares a client across principals when the resolver ignores them', () => {
|
|
300
490
|
const getTidx = Tidx.createGetClient()
|
|
301
491
|
// With no resolver the upstream is identical for every caller, so the key
|
|
302
492
|
// (resolved output) collapses and all principals share one client.
|
|
303
|
-
expect(getTidx(4217, publicPrincipal)).toBe(
|
|
304
|
-
|
|
493
|
+
expect(getTidx(4217, { principal: publicPrincipal })).toBe(
|
|
494
|
+
getTidx(4217, { principal: apiKeyPrincipal }),
|
|
495
|
+
)
|
|
496
|
+
expect(getTidx(4217, { principal: null })).toBe(getTidx(4217, { principal: publicPrincipal }))
|
|
305
497
|
})
|
|
306
498
|
|
|
307
499
|
test('does not share clients across Bearer credentials', () => {
|
|
308
500
|
const getTidx = Tidx.createGetClient({
|
|
309
501
|
tidx: ({ principal }) => ({
|
|
502
|
+
auth: principal?.type === 'public' ? 'public-secret' : 'private-secret',
|
|
310
503
|
baseUrl: 'https://internal.indexer',
|
|
311
|
-
bearerAuth: principal?.type === 'public' ? 'public-secret' : 'private-secret',
|
|
312
504
|
}),
|
|
313
505
|
})
|
|
314
506
|
|
|
315
|
-
expect(getTidx(4217, publicPrincipal)).not.toBe(
|
|
507
|
+
expect(getTidx(4217, { principal: publicPrincipal })).not.toBe(
|
|
508
|
+
getTidx(4217, { principal: apiKeyPrincipal }),
|
|
509
|
+
)
|
|
316
510
|
})
|
|
317
511
|
|
|
318
512
|
test('consults the resolver on every call but builds one client per upstream', () => {
|
|
@@ -322,14 +516,14 @@ describe('createGetClient', () => {
|
|
|
322
516
|
const config =
|
|
323
517
|
principal?.type === 'public'
|
|
324
518
|
? { baseUrl: 'https://indexer.tempo.xyz' }
|
|
325
|
-
: { baseUrl: 'https://internal.indexer'
|
|
519
|
+
: { auth: 'user:pass', baseUrl: 'https://internal.indexer' }
|
|
326
520
|
seen.push(principal?.type)
|
|
327
521
|
return config
|
|
328
522
|
},
|
|
329
523
|
})
|
|
330
|
-
const first = getTidx(4217, apiKeyPrincipal)
|
|
331
|
-
const second = getTidx(4217, apiKeyPrincipal)
|
|
332
|
-
getTidx(4217, publicPrincipal)
|
|
524
|
+
const first = getTidx(4217, { principal: apiKeyPrincipal })
|
|
525
|
+
const second = getTidx(4217, { principal: apiKeyPrincipal })
|
|
526
|
+
getTidx(4217, { principal: publicPrincipal })
|
|
333
527
|
// The resolver is consulted on every call (it derives the cache key from its
|
|
334
528
|
// resolved output) — including the repeat that hits the cache — so a
|
|
335
529
|
// per-request principal is always honored.
|
package/src/internal/Tidx.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { Tidx } from 'tidx.ts'
|
|
2
|
+
import type { Chain } from 'viem'
|
|
2
3
|
|
|
3
|
-
import
|
|
4
|
+
import * as Auth from './Auth.js'
|
|
5
|
+
import * as Errors from './Errors.js'
|
|
6
|
+
import type * as Log from './Log.js'
|
|
4
7
|
import * as Viem from './Viem.js'
|
|
5
8
|
|
|
6
9
|
/** Default Tempo indexer (TIDX) base URLs. */
|
|
@@ -12,37 +15,36 @@ export const url: Record<number, string> = {
|
|
|
12
15
|
/** TIDX query client. */
|
|
13
16
|
export type Client = Tidx.Tidx
|
|
14
17
|
|
|
15
|
-
/** Gets a TIDX query client for a Tempo chain id and request
|
|
16
|
-
export type GetClient = (
|
|
18
|
+
/** Gets a TIDX query client for a Tempo chain id and request context. */
|
|
19
|
+
export type GetClient = (
|
|
20
|
+
chainId?: Viem.ChainId,
|
|
21
|
+
options?: Pick<getClient.Options, 'principal' | 'zone'>,
|
|
22
|
+
) => Client
|
|
17
23
|
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
* back to the built-in {@link url} map (e.g. for a chain the resolver doesn't
|
|
21
|
-
* serve).
|
|
22
|
-
*/
|
|
23
|
-
export type UrlResolver = (chainId: Viem.ChainId) => string | undefined
|
|
24
|
+
/** Shared, per-chain, or dynamically resolved TIDX URLs. */
|
|
25
|
+
export type UrlResolver = Viem.UrlResolver
|
|
24
26
|
|
|
25
27
|
/**
|
|
26
28
|
* Resolves the effective TIDX config for a single request.
|
|
27
29
|
*
|
|
28
30
|
* Accepts either a static config object or a per-request resolver function that
|
|
29
|
-
* receives a {@link Viem.
|
|
31
|
+
* receives a {@link Viem.resolveRpc.Context} (`chainId` plus the request
|
|
30
32
|
* `principal`), so callers can route traffic per caller — e.g. send anonymous
|
|
31
33
|
* (`principal.type === 'public'`) traffic to a separate, no-auth indexer. A
|
|
32
34
|
* missing `baseUrl` falls back to the built-in public host map ({@link url});
|
|
33
|
-
* missing auth
|
|
35
|
+
* missing `auth` sends no Authorization header.
|
|
34
36
|
*/
|
|
35
37
|
export function resolve(
|
|
36
38
|
tidx: getClient.Tidx | undefined,
|
|
37
|
-
context: Viem.
|
|
39
|
+
context: Viem.resolveRpc.Context,
|
|
38
40
|
): resolve.Resolved {
|
|
39
41
|
const config = typeof tidx === 'function' ? tidx(context) : tidx
|
|
40
42
|
return {
|
|
43
|
+
...Auth.resolveCredential({ chainId: context.chainId, value: config?.auth }),
|
|
41
44
|
baseUrl:
|
|
42
|
-
(
|
|
45
|
+
Viem.resolveUrl(config?.baseUrl, context.chainId) ??
|
|
46
|
+
context.zone?.rpcUrls['tidx']?.http[0] ??
|
|
43
47
|
url[context.chainId],
|
|
44
|
-
basicAuth: config?.basicAuth,
|
|
45
|
-
...(config?.bearerAuth ? { bearerAuth: config.bearerAuth } : {}),
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
50
|
|
|
@@ -63,8 +65,8 @@ export declare namespace resolve {
|
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
export function getClient(options: getClient.Options): Client {
|
|
66
|
-
const { chainId = Viem.defaultChainId, principal = null, tidx } = options
|
|
67
|
-
const { baseUrl, basicAuth, bearerAuth } = resolve(tidx, { chainId, principal })
|
|
68
|
+
const { chainId = Viem.defaultChainId, principal = null, tidx, zone } = options
|
|
69
|
+
const { baseUrl, basicAuth, bearerAuth } = resolve(tidx, { chainId, principal, zone })
|
|
68
70
|
return withTransientRetry(
|
|
69
71
|
Tidx.create({
|
|
70
72
|
baseUrl,
|
|
@@ -79,7 +81,7 @@ export function getClient(options: getClient.Options): Client {
|
|
|
79
81
|
* Builds a memoized {@link GetClient} that constructs one TIDX client per
|
|
80
82
|
* resolved upstream and reuses it. Clients are stateless HTTP transports, so
|
|
81
83
|
* reusing them avoids per-call construction cost. The cache key is the resolved
|
|
82
|
-
* output (`baseUrl` +
|
|
84
|
+
* output (`baseUrl` + auth + `chainId`), not the principal, so a resolver
|
|
83
85
|
* `tidx` may branch on any principal field while client cardinality stays
|
|
84
86
|
* bounded by the number of distinct upstreams — callers that resolve to the same
|
|
85
87
|
* upstream share a client. Shared by `data()` (per-request reads) and
|
|
@@ -90,15 +92,16 @@ export function createGetClient(options: createGetClient.Options = {}): GetClien
|
|
|
90
92
|
const { defaultChainId = Viem.defaultChainId, tidx } = options
|
|
91
93
|
const clients = new Map<string, Client>()
|
|
92
94
|
|
|
93
|
-
return (chainId = defaultChainId,
|
|
95
|
+
return (chainId = defaultChainId, options = {}) => {
|
|
96
|
+
const { principal = null, zone } = options
|
|
94
97
|
// Resolve to derive the cache key; `getClient` re-resolves to build the
|
|
95
98
|
// client on a miss. `resolve` is pure and cheap, so the extra call is free.
|
|
96
|
-
const { baseUrl, basicAuth, bearerAuth } = resolve(tidx, { chainId, principal })
|
|
99
|
+
const { baseUrl, basicAuth, bearerAuth } = resolve(tidx, { chainId, principal, zone })
|
|
97
100
|
const cacheKey = `${baseUrl}|${basicAuth ?? ''}|${bearerAuth ?? ''}|${chainId}`
|
|
98
101
|
const existing = clients.get(cacheKey)
|
|
99
102
|
if (existing) return existing
|
|
100
103
|
|
|
101
|
-
const client = getClient({ chainId, principal, tidx })
|
|
104
|
+
const client = getClient({ chainId, principal, tidx, zone })
|
|
102
105
|
clients.set(cacheKey, client)
|
|
103
106
|
return client
|
|
104
107
|
}
|
|
@@ -186,6 +189,85 @@ export function withTransientRetry(client: Client): Client {
|
|
|
186
189
|
}
|
|
187
190
|
}
|
|
188
191
|
|
|
192
|
+
/** Adds request-scoped timing and redacted failure diagnostics to a TIDX client. */
|
|
193
|
+
export function observe(client: Client, options: observe.Options): Client {
|
|
194
|
+
const fetch = client.fetch.bind(client)
|
|
195
|
+
return {
|
|
196
|
+
...client,
|
|
197
|
+
fetch: (parameters) =>
|
|
198
|
+
options.time(async () => {
|
|
199
|
+
try {
|
|
200
|
+
const result = await fetch(parameters)
|
|
201
|
+
options.record(undefined)
|
|
202
|
+
return result
|
|
203
|
+
} catch (cause) {
|
|
204
|
+
options.record(providerFailure(cause))
|
|
205
|
+
throw cause
|
|
206
|
+
}
|
|
207
|
+
}),
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export declare namespace observe {
|
|
212
|
+
/** Request-scoped observability hooks for TIDX calls. */
|
|
213
|
+
type Options = {
|
|
214
|
+
/** Records a failure, or clears one after a later successful query. */
|
|
215
|
+
record: (failure: Log.ProviderFailure | undefined) => void
|
|
216
|
+
/** Measures the complete TIDX call, including retries. */
|
|
217
|
+
time: <value>(fn: () => Promise<value>) => Promise<value>
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Returns bounded failure metadata for a TIDX request. */
|
|
222
|
+
export function providerFailure(cause: unknown): Log.ProviderFailure {
|
|
223
|
+
const base = { id: 'tidx', operation: 'query' } as const
|
|
224
|
+
if (
|
|
225
|
+
cause instanceof DOMException &&
|
|
226
|
+
(cause.name === 'AbortError' || cause.name === 'TimeoutError')
|
|
227
|
+
)
|
|
228
|
+
return { ...base, failure: 'timeout' }
|
|
229
|
+
|
|
230
|
+
const status = Errors.getStatus(cause)
|
|
231
|
+
if (status !== undefined && status >= 200 && status < 300) return { ...base, failure: 'payload' }
|
|
232
|
+
if (status === 408) return { ...base, failure: 'timeout', status }
|
|
233
|
+
if (status === 422) return { ...base, failure: 'query', status }
|
|
234
|
+
if (status === 429) return { ...base, failure: 'rate_limit', status }
|
|
235
|
+
if (status !== undefined) return { ...base, failure: 'http', status }
|
|
236
|
+
if (cause instanceof TypeError) return { ...base, failure: 'network' }
|
|
237
|
+
return { ...base, failure: 'unknown' }
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** Returns bounded failure metadata when a TIDX response represents a failed query. */
|
|
241
|
+
export async function responseFailure(
|
|
242
|
+
response: Response,
|
|
243
|
+
): Promise<Log.ProviderFailure | undefined> {
|
|
244
|
+
if (!response.ok) return providerFailure(response)
|
|
245
|
+
|
|
246
|
+
// Parsing is observational; clone the response so the raw route can return its body unchanged.
|
|
247
|
+
const body: unknown = await response
|
|
248
|
+
.clone()
|
|
249
|
+
.json()
|
|
250
|
+
.catch(() => undefined)
|
|
251
|
+
if (typeof body === 'object' && body !== null && 'ok' in body && body.ok === true)
|
|
252
|
+
return undefined
|
|
253
|
+
return { failure: 'payload', id: 'tidx', operation: 'query' }
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Whether a TIDX response is a deterministic rejection of the caller's query. */
|
|
257
|
+
export function isQueryRejection(cause: unknown): boolean {
|
|
258
|
+
const status = Errors.getStatus(cause)
|
|
259
|
+
return status === 400 || status === 422
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* True for deterministic indexer failures a retry cannot fix: a
|
|
264
|
+
* `FetchRequestError` outside {@link isTransientError}'s transient classes,
|
|
265
|
+
* e.g. an HTTP 422 `db error` for a query shape the planner cannot execute.
|
|
266
|
+
*/
|
|
267
|
+
export function isDeterministicError(error: unknown): boolean {
|
|
268
|
+
return error instanceof Tidx.FetchRequestError && !isTransientError(error)
|
|
269
|
+
}
|
|
270
|
+
|
|
189
271
|
/**
|
|
190
272
|
* True for transient indexer errors: an HTTP-level transient failure
|
|
191
273
|
* (408/429/5xx), or a `FetchRequestError` that came back on a **2xx** HTTP
|
|
@@ -214,30 +296,28 @@ export declare namespace getClient {
|
|
|
214
296
|
principal?: Auth.Principal | null | undefined
|
|
215
297
|
/** TIDX query client options. */
|
|
216
298
|
tidx?: Tidx | undefined
|
|
299
|
+
/** Zone chain metadata used for TIDX URL resolution. */
|
|
300
|
+
zone?: Chain | undefined
|
|
217
301
|
}
|
|
218
302
|
|
|
219
303
|
/**
|
|
220
304
|
* TIDX query client options: either a static config, or a per-request
|
|
221
|
-
* resolver function that receives a {@link Viem.
|
|
305
|
+
* resolver function that receives a {@link Viem.resolveRpc.Context} and returns
|
|
222
306
|
* the config to use (e.g. routing anonymous callers to a public, no-auth
|
|
223
307
|
* indexer).
|
|
224
308
|
*/
|
|
225
309
|
type Tidx =
|
|
226
310
|
| {
|
|
311
|
+
/** Shared or per-chain TIDX credentials. Values containing `:` use Basic auth; others use Bearer auth. */
|
|
312
|
+
auth?: Auth.ChainCredential | undefined
|
|
227
313
|
/** Resolves the TIDX base URL for a Tempo chain id, or a static base URL. */
|
|
228
|
-
baseUrl?: UrlResolver |
|
|
229
|
-
/** Basic auth credentials for TIDX requests. */
|
|
230
|
-
basicAuth?: string | undefined
|
|
231
|
-
/** Bearer auth credential for TIDX requests. */
|
|
232
|
-
bearerAuth?: string | undefined
|
|
314
|
+
baseUrl?: UrlResolver | undefined
|
|
233
315
|
}
|
|
234
|
-
| ((context: Viem.
|
|
316
|
+
| ((context: Viem.resolveRpc.Context) => {
|
|
317
|
+
/** Shared or per-chain TIDX credentials, or undefined for none. */
|
|
318
|
+
auth?: Auth.ChainCredential | undefined
|
|
235
319
|
/** TIDX base URL to use; falls back to the built-in public host when omitted. */
|
|
236
320
|
baseUrl?: string | undefined
|
|
237
|
-
/** Basic auth credentials for TIDX requests, or undefined for none. */
|
|
238
|
-
basicAuth?: string | undefined
|
|
239
|
-
/** Bearer auth credential for TIDX requests, or undefined for none. */
|
|
240
|
-
bearerAuth?: string | undefined
|
|
241
321
|
})
|
|
242
322
|
}
|
|
243
323
|
|
|
@@ -126,6 +126,21 @@ describe('read', () => {
|
|
|
126
126
|
expect(snapshot?.version).toBe('v2')
|
|
127
127
|
expect(snapshot?.list.map((token) => token.symbol)).toEqual(['aUSD'])
|
|
128
128
|
})
|
|
129
|
+
|
|
130
|
+
test('round-trips a Zone chain id above the signed 32-bit range', async () => {
|
|
131
|
+
const chainId = 421_700_001
|
|
132
|
+
const db = TestApp.database()
|
|
133
|
+
await seed(db, chainId, 'zone', tokens)
|
|
134
|
+
const [head, rows, snapshot] = await Promise.all([
|
|
135
|
+
core_VerifiedTokens.head(db, chainId),
|
|
136
|
+
core_VerifiedTokens.list(db, chainId),
|
|
137
|
+
VerifiedTokens.read(db, chainId),
|
|
138
|
+
])
|
|
139
|
+
|
|
140
|
+
expect(head?.chainId).toBe(chainId)
|
|
141
|
+
expect(rows.map((row) => row.chainId)).toEqual(tokens.map(() => chainId))
|
|
142
|
+
expect(snapshot?.chainId).toBe(chainId)
|
|
143
|
+
})
|
|
129
144
|
})
|
|
130
145
|
|
|
131
146
|
describe('snapshot', () => {
|