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,3 +1,5 @@
|
|
|
1
|
+
// TODO(tidx-v1): Restore `queryOutbound` from commit `de87725` after TIDX v1 ships. Remove the receipt-side merge and bounded follow-up lookup.
|
|
2
|
+
|
|
1
3
|
import { Hono, type Context } from 'hono'
|
|
2
4
|
import { Address, Hex } from 'ox'
|
|
3
5
|
import { type Log, parseEventLogs, zeroAddress } from 'viem'
|
|
@@ -14,7 +16,7 @@ import * as OpenApi from '../../../internal/OpenApi.js'
|
|
|
14
16
|
import * as Response from '../../../internal/Response.js'
|
|
15
17
|
import * as Schema from '../../../internal/Schema.js'
|
|
16
18
|
import * as Store from '../../../internal/Store.js'
|
|
17
|
-
import
|
|
19
|
+
import * as Tidx from '../../../internal/Tidx.js'
|
|
18
20
|
import * as Timing from '../../../internal/Timing.js'
|
|
19
21
|
import * as Ttl from '../../../internal/Ttl.js'
|
|
20
22
|
import * as Value from '../../../internal/Value.js'
|
|
@@ -54,7 +56,7 @@ export namespace schema {
|
|
|
54
56
|
.optional(z.nullable(Valuation.schema.Value))
|
|
55
57
|
.check(
|
|
56
58
|
z.describe(
|
|
57
|
-
'The amount’s nominal value in the requested `
|
|
59
|
+
'The amount’s nominal value in the requested `valuation.currency`. `null` when the token is ' +
|
|
58
60
|
'unverified, its display currency has no rate, or rates were unavailable.',
|
|
59
61
|
),
|
|
60
62
|
),
|
|
@@ -74,7 +76,7 @@ export namespace schema {
|
|
|
74
76
|
/** Page-level resources: valuation rate provenance. */
|
|
75
77
|
export const Meta = z
|
|
76
78
|
.object({
|
|
77
|
-
|
|
79
|
+
valuation: z
|
|
78
80
|
.optional(Valuation.schema.Pricing)
|
|
79
81
|
.check(
|
|
80
82
|
z.describe(
|
|
@@ -1408,7 +1410,6 @@ export namespace schema {
|
|
|
1408
1410
|
.strictObject({
|
|
1409
1411
|
chainId: Schema.ChainIdQuery,
|
|
1410
1412
|
cursor: Schema.Cursor,
|
|
1411
|
-
denomination: Schema.Denomination,
|
|
1412
1413
|
// Folding is opt-in: by default every item is returned at the root.
|
|
1413
1414
|
group: z
|
|
1414
1415
|
._default(Schema.booleanQuery(), false)
|
|
@@ -1430,6 +1431,7 @@ export namespace schema {
|
|
|
1430
1431
|
),
|
|
1431
1432
|
z.meta({ examples: [true] }),
|
|
1432
1433
|
),
|
|
1434
|
+
'valuation.currency': Schema.Denomination,
|
|
1433
1435
|
})
|
|
1434
1436
|
.check(
|
|
1435
1437
|
z.describe(
|
|
@@ -1471,7 +1473,6 @@ export namespace schema {
|
|
|
1471
1473
|
export const Query = z
|
|
1472
1474
|
.strictObject({
|
|
1473
1475
|
chainId: Schema.ChainIdQuery,
|
|
1474
|
-
denomination: Schema.Denomination,
|
|
1475
1476
|
include: includeQuery,
|
|
1476
1477
|
// Raw-log capture is opt-in: it can add a large `events` array to every
|
|
1477
1478
|
// item, so the default response stays lean.
|
|
@@ -1483,6 +1484,7 @@ export namespace schema {
|
|
|
1483
1484
|
),
|
|
1484
1485
|
z.meta({ examples: [true] }),
|
|
1485
1486
|
),
|
|
1487
|
+
'valuation.currency': Schema.Denomination,
|
|
1486
1488
|
})
|
|
1487
1489
|
.check(z.describe('Query parameters for the transaction activity request.'))
|
|
1488
1490
|
|
|
@@ -1736,7 +1738,7 @@ function baseFor(options: {
|
|
|
1736
1738
|
}
|
|
1737
1739
|
|
|
1738
1740
|
/**
|
|
1739
|
-
* A normalized provider row. Mirrors the
|
|
1741
|
+
* A normalized provider row. Mirrors the bounded receipt/log lookups
|
|
1740
1742
|
* (`source: 'q1'`, full log columns) and the decoded `Transfer` projection
|
|
1741
1743
|
* (`source: 'q2'`, transfer columns), so the classification pipeline does not
|
|
1742
1744
|
* care which query produced the row.
|
|
@@ -1789,8 +1791,8 @@ type TxGroup = {
|
|
|
1789
1791
|
* Creates address-scoped activity handlers, mounted under the `/addresses`
|
|
1790
1792
|
* composer. Exposes `GET /:address/activities`.
|
|
1791
1793
|
*
|
|
1792
|
-
* Runs the full activity classification pipeline:
|
|
1793
|
-
*
|
|
1794
|
+
* Runs the full activity classification pipeline: outbound receipt/log
|
|
1795
|
+
* lookups plus inbound and outbound transfer queries, merged
|
|
1794
1796
|
* and decoded into typed items (`transfer`/`mint`/`burn`/`swap`/
|
|
1795
1797
|
* `approval`/`session-closed`/`access-key-created`/`access-key-revoked`/
|
|
1796
1798
|
* `token-created`/`burn-blocked`/`channel-opened`/`channel-funded`/
|
|
@@ -1882,7 +1884,7 @@ export function addresses(options: addresses.Options = {}) {
|
|
|
1882
1884
|
// Build immutable token and structured amount copies from RPC metadata.
|
|
1883
1885
|
const { items, rates } = await enrichTokens(c, {
|
|
1884
1886
|
chainId,
|
|
1885
|
-
denomination: query.
|
|
1887
|
+
denomination: query['valuation.currency'] ?? 'USD',
|
|
1886
1888
|
include: query.include,
|
|
1887
1889
|
items: unenrichedItems,
|
|
1888
1890
|
oracle,
|
|
@@ -1895,7 +1897,7 @@ export function addresses(options: addresses.Options = {}) {
|
|
|
1895
1897
|
return c.json(
|
|
1896
1898
|
Response.validated(schema.getAddressActivities.Response, {
|
|
1897
1899
|
data,
|
|
1898
|
-
...(rates ? { meta: {
|
|
1900
|
+
...(rates ? { meta: { valuation: Valuation.pricing(rates, oracle) } } : {}),
|
|
1899
1901
|
nextCursor,
|
|
1900
1902
|
}),
|
|
1901
1903
|
200,
|
|
@@ -2016,7 +2018,7 @@ export function transactions(options: transactions.Options = {}) {
|
|
|
2016
2018
|
// Build immutable token and structured amount copies from RPC metadata.
|
|
2017
2019
|
const { items, rates } = await enrichTokens(c, {
|
|
2018
2020
|
chainId,
|
|
2019
|
-
denomination: query.
|
|
2021
|
+
denomination: query['valuation.currency'] ?? 'USD',
|
|
2020
2022
|
include: query.include,
|
|
2021
2023
|
items: unenrichedItems,
|
|
2022
2024
|
oracle,
|
|
@@ -2025,7 +2027,7 @@ export function transactions(options: transactions.Options = {}) {
|
|
|
2025
2027
|
return c.json(
|
|
2026
2028
|
Response.validated(schema.getTransactionActivities.Response, {
|
|
2027
2029
|
data: items,
|
|
2028
|
-
...(rates ? { meta: {
|
|
2030
|
+
...(rates ? { meta: { valuation: Valuation.pricing(rates, oracle) } } : {}),
|
|
2029
2031
|
}),
|
|
2030
2032
|
200,
|
|
2031
2033
|
)
|
|
@@ -2217,8 +2219,8 @@ export declare namespace list {
|
|
|
2217
2219
|
/**
|
|
2218
2220
|
* Creates a TIDX-backed {@link Provider} that runs three sub-queries in
|
|
2219
2221
|
* parallel and merges them:
|
|
2220
|
-
* - Q1 (outbound):
|
|
2221
|
-
*
|
|
2222
|
+
* - Q1 (outbound): page receipts where the address is `from` or `fee_payer`,
|
|
2223
|
+
* then fetch the selected transactions' logs with a bounded lookup.
|
|
2222
2224
|
* - Q2 (inbound): decoded `Transfer` events to the address.
|
|
2223
2225
|
* - Q3 (outbound transfers): decoded `Transfer` events from the address
|
|
2224
2226
|
* (catches access-key-signed sends where `tx.from` differs from the address).
|
|
@@ -2236,16 +2238,8 @@ export function tidx(deps: tidx.Deps): Provider {
|
|
|
2236
2238
|
}
|
|
2237
2239
|
|
|
2238
2240
|
/**
|
|
2239
|
-
* Q1
|
|
2240
|
-
*
|
|
2241
|
-
*
|
|
2242
|
-
* The cursor uses a two-predicate keyset (`block_num <= N` AND `(block_num <
|
|
2243
|
-
* N OR tx_idx < M)`) rather than a plain `block_num < N`: the `<= N` upper
|
|
2244
|
-
* bound lets the ClickHouse planner seek to the cursor block on the
|
|
2245
|
-
* `(block_num, tx_idx)` primary key instead of scanning from the tip, which
|
|
2246
|
-
* is what avoids planner 422s on busy addresses. Over-fetch `limit * 4`
|
|
2247
|
-
* (never `OFFSET`) because one tx fans out into many log rows that
|
|
2248
|
-
* `groupByTx` collapses back into a single group.
|
|
2241
|
+
* Q1 pages outbound receipts, then fetches their logs by bounded block range
|
|
2242
|
+
* and transaction hash. The cursor preserves block and transaction index order.
|
|
2249
2243
|
*/
|
|
2250
2244
|
async function queryOutbound(options: {
|
|
2251
2245
|
address: Address.Address
|
|
@@ -2254,50 +2248,90 @@ export function tidx(deps: tidx.Deps): Provider {
|
|
|
2254
2248
|
}): Promise<Row[]> {
|
|
2255
2249
|
const { address, cursor, limit } = options
|
|
2256
2250
|
const keyset = cursor
|
|
2257
|
-
? `AND
|
|
2251
|
+
? `AND block_num <= ${cursor.blockNum} AND (block_num < ${cursor.blockNum} OR tx_idx < ${cursor.txIdx})`
|
|
2258
2252
|
: ''
|
|
2259
|
-
|
|
2260
|
-
const
|
|
2253
|
+
const queryLimit = limit + 1
|
|
2254
|
+
const fetchReceipts = (side: 'fee_payer' | 'from') =>
|
|
2255
|
+
tidxClient.fetch({
|
|
2256
|
+
chainId,
|
|
2257
|
+
// Raw-table query (no signature-decoded CTE), so the inline SQL is cast
|
|
2258
|
+
// to `string`.
|
|
2259
|
+
query: `
|
|
2260
|
+
SELECT tx_hash, block_num, block_timestamp, tx_idx, "from", fee_payer
|
|
2261
|
+
FROM receipts
|
|
2262
|
+
WHERE "${side}" = '${address}' ${keyset}
|
|
2263
|
+
ORDER BY block_num DESC, tx_idx DESC
|
|
2264
|
+
LIMIT ${queryLimit}
|
|
2265
|
+
` as string,
|
|
2266
|
+
})
|
|
2267
|
+
|
|
2268
|
+
// Fetching `limit + 1` from each side is sufficient to form the newest
|
|
2269
|
+
// `limit + 1` transactions after the two ordered sets are merged.
|
|
2270
|
+
const [paid, sent] = await Promise.all([fetchReceipts('fee_payer'), fetchReceipts('from')])
|
|
2271
|
+
const seen = new Set<string>()
|
|
2272
|
+
const receipts = [...paid.rows, ...sent.rows]
|
|
2273
|
+
.map((r) => ({
|
|
2274
|
+
blockNum: Number(Value.toNumber(r['block_num'])),
|
|
2275
|
+
blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
|
|
2276
|
+
feePayer: lowerOrNull(r['fee_payer']),
|
|
2277
|
+
txHash: lowerHash(r['tx_hash']),
|
|
2278
|
+
txIdx: Number(Value.toNumber(r['tx_idx'])),
|
|
2279
|
+
txSender: lowerOrNull(r['from']),
|
|
2280
|
+
}))
|
|
2281
|
+
.filter((receipt) => {
|
|
2282
|
+
if (seen.has(receipt.txHash)) return false
|
|
2283
|
+
seen.add(receipt.txHash)
|
|
2284
|
+
return true
|
|
2285
|
+
})
|
|
2286
|
+
.sort((a, b) => {
|
|
2287
|
+
if (a.blockNum !== b.blockNum) return b.blockNum - a.blockNum
|
|
2288
|
+
return b.txIdx - a.txIdx
|
|
2289
|
+
})
|
|
2290
|
+
.slice(0, queryLimit)
|
|
2291
|
+
if (receipts.length === 0) return []
|
|
2292
|
+
|
|
2293
|
+
const blocks = receipts.map((receipt) => receipt.blockNum)
|
|
2294
|
+
const receiptByHash = new Map(receipts.map((receipt) => [receipt.txHash, receipt]))
|
|
2295
|
+
const txHashes = receipts.map((receipt) => `'${receipt.txHash}'`).join(', ')
|
|
2296
|
+
|
|
2297
|
+
// `logs` is not keyed by transaction hash, so pair the bounded hash list
|
|
2298
|
+
// with the selected receipts' block range to avoid a full archive scan.
|
|
2299
|
+
const logs = await tidxClient.fetch({
|
|
2261
2300
|
chainId,
|
|
2301
|
+
// Raw-table query (no signature-decoded CTE), so the inline SQL is cast
|
|
2302
|
+
// to `string`.
|
|
2262
2303
|
query: `
|
|
2263
|
-
SELECT
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
receipts."from" AS tx_sender,
|
|
2269
|
-
receipts.fee_payer AS fee_payer,
|
|
2270
|
-
logs.address AS log_address,
|
|
2271
|
-
logs.selector AS selector,
|
|
2272
|
-
logs.topic1 AS topic1,
|
|
2273
|
-
logs.topic2 AS topic2,
|
|
2274
|
-
logs.topic3 AS topic3,
|
|
2275
|
-
logs.data AS data,
|
|
2276
|
-
logs.log_idx AS log_idx
|
|
2277
|
-
FROM receipts
|
|
2278
|
-
INNER JOIN logs ON logs.tx_hash = receipts.tx_hash
|
|
2279
|
-
WHERE (receipts."from" = '${address}' OR receipts.fee_payer = '${address}') ${keyset}
|
|
2280
|
-
ORDER BY receipts.block_num DESC, receipts.tx_idx DESC
|
|
2281
|
-
LIMIT ${limit * 4}
|
|
2304
|
+
SELECT tx_hash, block_num, tx_idx, log_idx, address, selector, topic1, topic2, topic3, data
|
|
2305
|
+
FROM logs
|
|
2306
|
+
WHERE block_num BETWEEN ${Math.min(...blocks)} AND ${Math.max(...blocks)}
|
|
2307
|
+
AND tx_hash IN (${txHashes})
|
|
2308
|
+
ORDER BY block_num DESC, tx_idx DESC, log_idx ASC
|
|
2282
2309
|
` as string,
|
|
2283
2310
|
})
|
|
2284
2311
|
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2312
|
+
const rows = logs.rows.flatMap((r) => {
|
|
2313
|
+
const receipt = receiptByHash.get(lowerHash(r['tx_hash']))
|
|
2314
|
+
if (!receipt) return []
|
|
2315
|
+
return [
|
|
2316
|
+
{
|
|
2317
|
+
blockNum: receipt.blockNum,
|
|
2318
|
+
blockTimestamp: receipt.blockTimestamp,
|
|
2319
|
+
data: Value.toText(r['data']) ?? null,
|
|
2320
|
+
feePayer: receipt.feePayer,
|
|
2321
|
+
logAddress: lower(r['address']),
|
|
2322
|
+
logIdx: Number(Value.toNumber(r['log_idx'])),
|
|
2323
|
+
selector: Value.toText(r['selector']) ?? null,
|
|
2324
|
+
source: 'q1' as const,
|
|
2325
|
+
topic1: Value.toText(r['topic1']) ?? null,
|
|
2326
|
+
topic2: Value.toText(r['topic2']) ?? null,
|
|
2327
|
+
topic3: Value.toText(r['topic3']) ?? null,
|
|
2328
|
+
txHash: receipt.txHash,
|
|
2329
|
+
txIdx: receipt.txIdx,
|
|
2330
|
+
txSender: receipt.txSender,
|
|
2331
|
+
},
|
|
2332
|
+
]
|
|
2333
|
+
})
|
|
2334
|
+
return mergeAndSort(rows, [], [])
|
|
2301
2335
|
}
|
|
2302
2336
|
|
|
2303
2337
|
/** Q2/Q3: decoded `Transfer` events on one side of the address. */
|
|
@@ -2313,18 +2347,43 @@ export function tidx(deps: tidx.Deps): Provider {
|
|
|
2313
2347
|
? `"to" = '${address}' AND "from" != '${address}'`
|
|
2314
2348
|
: `"from" = '${address}' AND "to" != '${address}'`
|
|
2315
2349
|
const keyset = cursor ? `AND block_num < ${cursor.blockNum}` : ''
|
|
2316
|
-
const
|
|
2317
|
-
chainId,
|
|
2318
|
-
query: `
|
|
2350
|
+
const query = (blockKey?: string) => `
|
|
2319
2351
|
SELECT "from", "to", address, value, tx_hash, block_num, block_timestamp, log_idx, tx_idx
|
|
2320
2352
|
FROM Transfer
|
|
2321
2353
|
WHERE ${where} ${keyset}
|
|
2322
|
-
ORDER BY
|
|
2323
|
-
LIMIT ${limit * 4}
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2354
|
+
${blockKey ? `ORDER BY ${blockKey} DESC, tx_idx DESC` : ''}
|
|
2355
|
+
LIMIT ${blockKey ? limit * 4 : Schema.countCap}
|
|
2356
|
+
`
|
|
2357
|
+
const result = await (async () => {
|
|
2358
|
+
try {
|
|
2359
|
+
return await tidxClient.fetch({
|
|
2360
|
+
chainId,
|
|
2361
|
+
query: query('block_num'),
|
|
2362
|
+
signatures: [transferSignature],
|
|
2363
|
+
})
|
|
2364
|
+
} catch (error) {
|
|
2365
|
+
if (!Tidx.isDeterministicError(error)) throw error
|
|
2366
|
+
try {
|
|
2367
|
+
// The expression blocks a mis-selected block-ordered top-N walk.
|
|
2368
|
+
return await tidxClient.fetch({
|
|
2369
|
+
chainId,
|
|
2370
|
+
query: query('block_num + 0'),
|
|
2371
|
+
signatures: [transferSignature],
|
|
2372
|
+
})
|
|
2373
|
+
} catch (fallbackError) {
|
|
2374
|
+
if (!Tidx.isDeterministicError(fallbackError)) throw fallbackError
|
|
2375
|
+
const result = await tidxClient.fetch({
|
|
2376
|
+
chainId,
|
|
2377
|
+
query: query(),
|
|
2378
|
+
signatures: [transferSignature],
|
|
2379
|
+
})
|
|
2380
|
+
// An unordered sample cannot safely produce an activity cursor.
|
|
2381
|
+
if (result.rows.length >= Schema.countCap) throw fallbackError
|
|
2382
|
+
return result
|
|
2383
|
+
}
|
|
2384
|
+
}
|
|
2385
|
+
})()
|
|
2386
|
+
const rows = result.rows.map((r) => ({
|
|
2328
2387
|
blockNum: Number(Value.toNumber(r['block_num'])),
|
|
2329
2388
|
blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
|
|
2330
2389
|
data: null,
|
|
@@ -2344,6 +2403,7 @@ export function tidx(deps: tidx.Deps): Provider {
|
|
|
2344
2403
|
txIdx: Number(Value.toNumber(r['tx_idx'])),
|
|
2345
2404
|
txSender: null,
|
|
2346
2405
|
}))
|
|
2406
|
+
return mergeAndSort([], rows, []).slice(0, limit * 4)
|
|
2347
2407
|
}
|
|
2348
2408
|
|
|
2349
2409
|
return {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** @module-tag localnet */
|
|
2
|
+
|
|
1
3
|
import { Schema } from 'tapimo'
|
|
2
4
|
import { FxOracle } from 'tapimo/apps'
|
|
3
5
|
import { Value as core_Value } from 'ox'
|
|
@@ -5,9 +7,10 @@ import { Actions } from 'viem/tempo'
|
|
|
5
7
|
|
|
6
8
|
import * as TestApp from '../../../../test/App.js'
|
|
7
9
|
import * as Runtime from '../../../../test/runtime.js'
|
|
10
|
+
import * as Tempo from '../../../../test/Tempo.js'
|
|
8
11
|
import * as TestViem from '../../../../test/Viem.js'
|
|
12
|
+
import * as Tidx from '../../../internal/Tidx.js'
|
|
9
13
|
import * as Balances from './balances.js'
|
|
10
|
-
import * as Tokens from './tokens.js'
|
|
11
14
|
|
|
12
15
|
// Deterministic EUR-based rate set so conversion math is exact in assertions.
|
|
13
16
|
const fixed = FxOracle.from({
|
|
@@ -31,19 +34,37 @@ function app(options: TestApp.create.Options = {}) {
|
|
|
31
34
|
return TestApp.client({ db, ...options })
|
|
32
35
|
}
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
const holderWithBalance = (async () => {
|
|
35
38
|
if (runtime.mode === 'localnet')
|
|
36
39
|
return runtime.fixtures!.fundedAccounts[0]!.toLowerCase() as `0x${string}`
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
const address = Tempo.accounts[1]!.address.toLowerCase() as `0x${string}`
|
|
41
|
+
const tidx = Tidx.getClient({
|
|
42
|
+
chainId: runtime.chainId,
|
|
43
|
+
tidx: { auth: process.env.TIDX_AUTH, baseUrl: runtime.tidxUrl },
|
|
44
|
+
})
|
|
45
|
+
const rpc = TestViem.getClient()
|
|
46
|
+
// Global setup funds this ephemeral account once. Wait for TIDX to index its
|
|
47
|
+
// faucet delta so discovery exercises a stable, low-activity holder.
|
|
48
|
+
for (let attempt = 0; attempt < 30; attempt++) {
|
|
49
|
+
const [balance, indexed] = await Promise.all([
|
|
50
|
+
Actions.token.getBalance(rpc, { account: address, token: TestApp.tokenWithHolders }),
|
|
51
|
+
tidx.fetch({
|
|
52
|
+
chainId: runtime.chainId,
|
|
53
|
+
engine: 'clickhouse',
|
|
54
|
+
// Raw-table query, so the inline SQL is cast to `string`.
|
|
55
|
+
query: `
|
|
56
|
+
SELECT token
|
|
57
|
+
FROM address_holder_deltas
|
|
58
|
+
WHERE holder = '${address}' AND token = '${TestApp.tokenWithHolders}'
|
|
59
|
+
LIMIT 1
|
|
60
|
+
` as string,
|
|
61
|
+
}),
|
|
62
|
+
])
|
|
63
|
+
if (balance.amount > 0n && indexed.rows.length > 0) return address
|
|
64
|
+
if (attempt < 29) await new Promise((resolve) => setTimeout(resolve, 500))
|
|
65
|
+
}
|
|
66
|
+
throw new Error('expected funded test account to reach TIDX')
|
|
67
|
+
})()
|
|
47
68
|
|
|
48
69
|
describe('GET /addresses/:address/balances', () => {
|
|
49
70
|
test('parses the total count include', () => {
|
|
@@ -63,7 +84,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
63
84
|
|
|
64
85
|
test('returns an amount-ranked balance page with per-row token references', async () => {
|
|
65
86
|
const client = app()
|
|
66
|
-
const holder = await holderWithBalance
|
|
87
|
+
const holder = await holderWithBalance
|
|
67
88
|
expect(holder).toMatch(/^0x[0-9a-f]{40}$/)
|
|
68
89
|
|
|
69
90
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
@@ -147,7 +168,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
147
168
|
|
|
148
169
|
test('embeds an exact balance total on demand via include=totalCount', async () => {
|
|
149
170
|
const client = app()
|
|
150
|
-
const holder = await holderWithBalance
|
|
171
|
+
const holder = await holderWithBalance
|
|
151
172
|
|
|
152
173
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
153
174
|
{ param: { address: holder }, query: { include: 'totalCount', limit: '5' } },
|
|
@@ -204,7 +225,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
204
225
|
|
|
205
226
|
test('surfaces a 502 when RPC correction is unavailable', async () => {
|
|
206
227
|
const client = app({ rpc: { url: () => 'http://127.0.0.1:1' } })
|
|
207
|
-
const holder = await holderWithBalance
|
|
228
|
+
const holder = await holderWithBalance
|
|
208
229
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
209
230
|
{ param: { address: holder }, query: {} },
|
|
210
231
|
TestApp.auth,
|
|
@@ -281,7 +302,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
281
302
|
],
|
|
282
303
|
})
|
|
283
304
|
const client = app({ db: logoDb })
|
|
284
|
-
const holder = await holderWithBalance
|
|
305
|
+
const holder = await holderWithBalance
|
|
285
306
|
expect(holder).toMatch(/^0x[0-9a-f]{40}$/)
|
|
286
307
|
|
|
287
308
|
// The seeded holder is a holder of a verified token, so the verified
|
|
@@ -306,7 +327,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
306
327
|
|
|
307
328
|
test('narrows balances by currency and retains verification', async () => {
|
|
308
329
|
const client = app()
|
|
309
|
-
const holder = await holderWithBalance
|
|
330
|
+
const holder = await holderWithBalance
|
|
310
331
|
expect(holder).toMatch(/^0x[0-9a-f]{40}$/)
|
|
311
332
|
|
|
312
333
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
@@ -322,11 +343,9 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
322
343
|
}
|
|
323
344
|
})
|
|
324
345
|
|
|
325
|
-
test('
|
|
346
|
+
test('includes feeEligible on balance rows', async () => {
|
|
326
347
|
const client = app()
|
|
327
|
-
|
|
328
|
-
// holders hold a token that is always fee-usable.
|
|
329
|
-
const holder = await holderWithBalance(client)
|
|
348
|
+
const holder = await holderWithBalance
|
|
330
349
|
|
|
331
350
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
332
351
|
{ param: { address: holder }, query: { limit: '20' } },
|
|
@@ -336,20 +355,14 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
336
355
|
expect(response.status).toBe(200)
|
|
337
356
|
expect(response.headers.get('server-timing')?.includes('fee_token_set;dur=')).toBe(true)
|
|
338
357
|
|
|
339
|
-
|
|
340
|
-
// boolean on each row (rather than omitted).
|
|
358
|
+
expect(body.data.length).toBeGreaterThan(0)
|
|
341
359
|
for (const balance of body.data) expect(typeof balance.feeEligible).toBe('boolean')
|
|
342
|
-
|
|
343
|
-
// The pathUSD holding (which the holder is guaranteed to hold) is flagged
|
|
344
|
-
// fee-usable: pathUSD is the default fee token and has fee-AMM pools.
|
|
345
|
-
const pathUsd = body.data.find((balance) => balance.token.address === TestApp.tokenWithHolders)
|
|
346
|
-
expect(pathUsd?.feeEligible).toBe(true)
|
|
347
360
|
})
|
|
348
361
|
|
|
349
362
|
test('values each verified holding in the default denomination', async () => {
|
|
350
363
|
await TestApp.verifiedSeed(db, runtime.chainId)
|
|
351
364
|
const client = app()
|
|
352
|
-
const holder = await holderWithBalance
|
|
365
|
+
const holder = await holderWithBalance
|
|
353
366
|
|
|
354
367
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
355
368
|
{ param: { address: holder }, query: { limit: '50' } },
|
|
@@ -368,11 +381,11 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
368
381
|
test('values holdings in a requested denomination', async () => {
|
|
369
382
|
await TestApp.verifiedSeed(db, runtime.chainId)
|
|
370
383
|
const client = app({ fx: { oracle: fixed } })
|
|
371
|
-
const holder = await holderWithBalance
|
|
384
|
+
const holder = await holderWithBalance
|
|
372
385
|
|
|
373
386
|
// Denominations are case-insensitive.
|
|
374
387
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
375
|
-
{ param: { address: holder }, query: {
|
|
388
|
+
{ param: { address: holder }, query: { limit: '50', 'valuation.currency': 'aud' } },
|
|
376
389
|
TestApp.auth,
|
|
377
390
|
)
|
|
378
391
|
const body = await TestApp.json(response, Balances.schema.getAddressBalances.Response)
|
|
@@ -383,7 +396,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
383
396
|
const expected = core_Value.format((core_Value.from(pathUsd!.formatted, 6) * 16n) / 10n, 6)
|
|
384
397
|
expect(pathUsd?.valuation).toEqual({ amount: expected, currency: 'AUD' })
|
|
385
398
|
// Consulted rates surface their provenance response-wide.
|
|
386
|
-
expect(body.meta?.
|
|
399
|
+
expect(body.meta?.valuation).toMatchInlineSnapshot(`
|
|
387
400
|
{
|
|
388
401
|
"asOf": "2026-01-01T00:00:00.000Z",
|
|
389
402
|
"basis": "nominal",
|
|
@@ -395,10 +408,10 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
395
408
|
test('nulls valuations when rates are unavailable', async () => {
|
|
396
409
|
await TestApp.verifiedSeed(db, runtime.chainId)
|
|
397
410
|
const client = app({ fx: { oracle: FxOracle.ecb({ url: 'http://127.0.0.1:1' }) } })
|
|
398
|
-
const holder = await holderWithBalance
|
|
411
|
+
const holder = await holderWithBalance
|
|
399
412
|
|
|
400
413
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
401
|
-
{ param: { address: holder }, query: {
|
|
414
|
+
{ param: { address: holder }, query: { limit: '50', 'valuation.currency': 'AUD' } },
|
|
402
415
|
TestApp.auth,
|
|
403
416
|
)
|
|
404
417
|
const body = await TestApp.json(response, Balances.schema.getAddressBalances.Response)
|
|
@@ -408,7 +421,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
408
421
|
expect(response.status).toBe(200)
|
|
409
422
|
expect(body.data.length).toBeGreaterThan(0)
|
|
410
423
|
for (const entry of body.data) expect(entry.valuation).toBeNull()
|
|
411
|
-
expect(body.meta?.
|
|
424
|
+
expect(body.meta?.valuation).toBeUndefined()
|
|
412
425
|
})
|
|
413
426
|
|
|
414
427
|
test('rejects denominations the oracle does not price', async () => {
|
|
@@ -418,7 +431,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
418
431
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
419
432
|
{
|
|
420
433
|
param: { address: `0x${'11'.repeat(20)}` },
|
|
421
|
-
query: { currency: 'JPY',
|
|
434
|
+
query: { currency: 'JPY', 'valuation.currency': 'JPY' },
|
|
422
435
|
},
|
|
423
436
|
TestApp.auth,
|
|
424
437
|
)
|
|
@@ -432,7 +445,7 @@ describe('GET /addresses/:address/balances', () => {
|
|
|
432
445
|
|
|
433
446
|
test('restricts the page to fee tokens when feeEligible=true', async () => {
|
|
434
447
|
const client = app()
|
|
435
|
-
const holder = await holderWithBalance
|
|
448
|
+
const holder = await holderWithBalance
|
|
436
449
|
|
|
437
450
|
const response = await client.v1.addresses[':address'].balances.$get(
|
|
438
451
|
{
|
|
@@ -52,7 +52,6 @@ export namespace schema {
|
|
|
52
52
|
),
|
|
53
53
|
),
|
|
54
54
|
cursor: Schema.Cursor,
|
|
55
|
-
denomination: Schema.Denomination,
|
|
56
55
|
feeEligible: z
|
|
57
56
|
.optional(Schema.booleanQuery())
|
|
58
57
|
.check(
|
|
@@ -67,6 +66,7 @@ export namespace schema {
|
|
|
67
66
|
include: Schema.totalCountInclude,
|
|
68
67
|
limit: Schema.Limit,
|
|
69
68
|
page: Schema.Page,
|
|
69
|
+
'valuation.currency': Schema.Denomination,
|
|
70
70
|
verified: z
|
|
71
71
|
.optional(Schema.booleanQuery())
|
|
72
72
|
.check(
|
|
@@ -144,7 +144,7 @@ export namespace schema {
|
|
|
144
144
|
.nullable(Valuation.schema.Value)
|
|
145
145
|
.check(
|
|
146
146
|
z.describe(
|
|
147
|
-
'The holding’s nominal value in the requested `
|
|
147
|
+
'The holding’s nominal value in the requested `valuation.currency`, or `null` when the ' +
|
|
148
148
|
'token is unverified, its display currency has no rate, or rates were unavailable.',
|
|
149
149
|
),
|
|
150
150
|
),
|
|
@@ -155,7 +155,7 @@ export namespace schema {
|
|
|
155
155
|
/** Page-level resources: opt-in counts plus valuation rate provenance. */
|
|
156
156
|
export const Meta = z
|
|
157
157
|
.object({
|
|
158
|
-
|
|
158
|
+
valuation: z
|
|
159
159
|
.optional(Valuation.schema.Pricing)
|
|
160
160
|
.check(
|
|
161
161
|
z.describe(
|
|
@@ -259,7 +259,7 @@ export function addresses(options: addresses.Options = {}) {
|
|
|
259
259
|
chainId,
|
|
260
260
|
currency: query.currency,
|
|
261
261
|
cursor: query.cursor,
|
|
262
|
-
denomination: query.
|
|
262
|
+
denomination: query['valuation.currency'] ?? 'USD',
|
|
263
263
|
feeEligible,
|
|
264
264
|
feeTokens,
|
|
265
265
|
includeTotalCount: query.include.includes('totalCount'),
|
|
@@ -468,7 +468,7 @@ async function getAddressBalances(
|
|
|
468
468
|
}
|
|
469
469
|
|
|
470
470
|
const meta = {
|
|
471
|
-
...(rates ? {
|
|
471
|
+
...(rates ? { valuation: Valuation.pricing(rates, oracle) } : {}),
|
|
472
472
|
...(includeTotalCount ? { totalCount: corrected.length, totalCountCapped: false } : {}),
|
|
473
473
|
}
|
|
474
474
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Address, Hash } from 'ox'
|
|
2
|
+
import { Schema } from 'tapimo'
|
|
2
3
|
|
|
3
4
|
import * as TestApp from '../../../../test/App.js'
|
|
4
5
|
import * as Runtime from '../../../../test/runtime.js'
|
|
@@ -59,6 +60,20 @@ describe('GET /gecko/:chainId/assets/:address', () => {
|
|
|
59
60
|
)
|
|
60
61
|
expect(response.status).toBe(400)
|
|
61
62
|
})
|
|
63
|
+
|
|
64
|
+
test('returns 404 for an address that is not a TIP-20 token', async () => {
|
|
65
|
+
const client = TestApp.client()
|
|
66
|
+
const response = await client.gecko[':chainId'].assets[':address'].$get(
|
|
67
|
+
// A syntactically valid address that is not a registered TIP-20: the
|
|
68
|
+
// metadata read reverts, which must surface as a `404`, not a `502`.
|
|
69
|
+
{ param: { chainId, address: '0xc97613eb1c39b0b57267739b5400ab08f8c4c285' } },
|
|
70
|
+
TestApp.auth,
|
|
71
|
+
)
|
|
72
|
+
const body = await TestApp.json(response, Schema.ErrorResponse)
|
|
73
|
+
|
|
74
|
+
expect(response.status).toBe(404)
|
|
75
|
+
expect(body.error.code).toBe('not_found')
|
|
76
|
+
})
|
|
62
77
|
})
|
|
63
78
|
|
|
64
79
|
describe('GET /gecko/:chainId/pairs', () => {
|
|
@@ -66,6 +81,7 @@ describe('GET /gecko/:chainId/pairs', () => {
|
|
|
66
81
|
const client = TestApp.client()
|
|
67
82
|
const response = await client.gecko[':chainId'].pairs.$get({ param: { chainId } }, TestApp.auth)
|
|
68
83
|
expect(response.status).toBe(200)
|
|
84
|
+
expect(response.headers.get('server-timing')?.includes('coingecko_metadata;dur=')).toBe(true)
|
|
69
85
|
const body = await TestApp.json(response, Coingecko.schema.PairsResponse)
|
|
70
86
|
expect(body.pairs.length).toBeGreaterThan(0)
|
|
71
87
|
const pair = body.pairs[0]!
|
|
@@ -169,6 +185,12 @@ describe('GET /gecko/:chainId/events', () => {
|
|
|
169
185
|
)
|
|
170
186
|
expect(response.status).toBe(200)
|
|
171
187
|
const body = await TestApp.json(response, Coingecko.schema.EventsResponse)
|
|
188
|
+
// The fan-out segments only emit once the window contains fills.
|
|
189
|
+
if (body.events.length > 0) {
|
|
190
|
+
const timing = response.headers.get('server-timing')
|
|
191
|
+
expect(timing?.includes('coingecko_pair_index;dur=')).toBe(true)
|
|
192
|
+
expect(timing?.includes('coingecko_metadata;dur=')).toBe(true)
|
|
193
|
+
}
|
|
172
194
|
for (const event of body.events) {
|
|
173
195
|
expect(event.eventType).toBe('swap')
|
|
174
196
|
expect(Hash.validate(event.pairId)).toBe(true)
|