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
|
@@ -55,7 +55,7 @@ const mpp = {
|
|
|
55
55
|
getClient: () => Tempo.client,
|
|
56
56
|
recipient: Tempo.accounts[2].address,
|
|
57
57
|
},
|
|
58
|
-
} satisfies NonNullable<TestApp.create.Options['mpp']>
|
|
58
|
+
} satisfies NonNullable<Exclude<NonNullable<TestApp.create.Options['auth']>, false>['mpp']>
|
|
59
59
|
|
|
60
60
|
describe('MPP session management', () => {
|
|
61
61
|
test('keeps generated POST routes private', async () => {
|
|
@@ -72,7 +72,7 @@ describe('MPP session management', () => {
|
|
|
72
72
|
|
|
73
73
|
test('matches GET scopes for static, parameterized, and hidden resources', async () => {
|
|
74
74
|
const rateLimitStore = Store.memory()
|
|
75
|
-
const app = TestApp.create({ mpp, rateLimit: { store: rateLimitStore } })
|
|
75
|
+
const app = TestApp.create({ auth: { mpp }, rateLimit: { store: rateLimitStore } })
|
|
76
76
|
await exhaustPublicQuota(rateLimitStore)
|
|
77
77
|
|
|
78
78
|
for (const resource of [
|
|
@@ -106,7 +106,11 @@ describe('MPP session management', () => {
|
|
|
106
106
|
|
|
107
107
|
test('preserves the mounted base path in session scope', async () => {
|
|
108
108
|
const rateLimitStore = Store.memory()
|
|
109
|
-
const app = TestApp.create({
|
|
109
|
+
const app = TestApp.create({
|
|
110
|
+
auth: { mpp },
|
|
111
|
+
path: '/api',
|
|
112
|
+
rateLimit: { store: rateLimitStore },
|
|
113
|
+
})
|
|
110
114
|
await exhaustPublicQuota(rateLimitStore)
|
|
111
115
|
|
|
112
116
|
const resource = new URL(
|
|
@@ -129,12 +133,12 @@ describe('MPP session management', () => {
|
|
|
129
133
|
test('honors endpoint MPP overrides', async () => {
|
|
130
134
|
const app = TestApp.create({
|
|
131
135
|
auth: {
|
|
136
|
+
mpp,
|
|
132
137
|
overrides: {
|
|
133
138
|
'GET /v1/scopes': { mpp: true },
|
|
134
139
|
'GET /v1/tokens/:token': { mpp: false },
|
|
135
140
|
},
|
|
136
141
|
},
|
|
137
|
-
mpp,
|
|
138
142
|
})
|
|
139
143
|
const enabled = await app.request('/v1/scopes', { method: 'POST' })
|
|
140
144
|
const disabled = await app.request(`/v1/tokens/${TestApp.token}`, { method: 'POST' })
|
|
@@ -151,13 +155,13 @@ describe('zone chain gate', () => {
|
|
|
151
155
|
/** A consumer-supplied zone chain id (the API never derives these). */
|
|
152
156
|
const zone = 421_700_001
|
|
153
157
|
/** A second zone, isolating per-zone grants. */
|
|
154
|
-
const zoneB =
|
|
158
|
+
const zoneB = 4_217_000_002
|
|
155
159
|
|
|
156
160
|
function zoneOptions(chainId: number) {
|
|
157
|
-
return {
|
|
161
|
+
return TestApp.zone({
|
|
158
162
|
chainId,
|
|
159
|
-
|
|
160
|
-
}
|
|
163
|
+
rpcUrl: `https://${chainId}.rpc.test`,
|
|
164
|
+
})
|
|
161
165
|
}
|
|
162
166
|
|
|
163
167
|
/** Zone reader: holds the per-zone scope for `zone` (only). */
|
|
@@ -168,6 +172,14 @@ describe('zone chain gate', () => {
|
|
|
168
172
|
token: 'secret_zone',
|
|
169
173
|
} satisfies TestApp.kvStore.Key
|
|
170
174
|
|
|
175
|
+
/** Zone writer: broadcasts signed transactions and reads data for `zone`. */
|
|
176
|
+
const zoneWriter = {
|
|
177
|
+
id: 'key_zone_writer',
|
|
178
|
+
orgId: 'org_test',
|
|
179
|
+
scopes: ['data:read', `zone:${zone}:write`],
|
|
180
|
+
token: 'secret_zone_writer',
|
|
181
|
+
} satisfies TestApp.kvStore.Key
|
|
182
|
+
|
|
171
183
|
/** Full-access key: the wildcard covers every zone. */
|
|
172
184
|
const admin = {
|
|
173
185
|
id: 'key_admin',
|
|
@@ -187,7 +199,7 @@ describe('zone chain gate', () => {
|
|
|
187
199
|
/** A deployment serving two zones. */
|
|
188
200
|
function zoneApp() {
|
|
189
201
|
return TestApp.create({
|
|
190
|
-
auth: { keys: [admin, outsider, zoneReader] },
|
|
202
|
+
auth: { keys: [admin, outsider, zoneReader, zoneWriter] },
|
|
191
203
|
zones: [zoneOptions(zone), zoneOptions(zoneB)],
|
|
192
204
|
})
|
|
193
205
|
}
|
|
@@ -249,6 +261,11 @@ describe('zone chain gate', () => {
|
|
|
249
261
|
expect(response.status).toBe(200)
|
|
250
262
|
})
|
|
251
263
|
|
|
264
|
+
test('a Zone write scope reads Zone data', async () => {
|
|
265
|
+
const response = await zoneApp().request(`/v1/tokenlist?chainId=${zone}`, as(zoneWriter))
|
|
266
|
+
expect(response.status).toBe(200)
|
|
267
|
+
})
|
|
268
|
+
|
|
252
269
|
test('zone authorization applies to every data route', async () => {
|
|
253
270
|
const app = TestApp.create({ auth: false, zones: [zoneOptions(zone)] })
|
|
254
271
|
for (const path of [
|
|
@@ -370,6 +387,18 @@ describe('zone chain gate', () => {
|
|
|
370
387
|
})
|
|
371
388
|
|
|
372
389
|
test('public chains remain edge-cacheable on a Zone deployment', async () => {
|
|
390
|
+
const store = Store.memory()
|
|
391
|
+
const app = TestApp.create({ auth: false, cache: { store }, zones: [zoneOptions(zone)] })
|
|
392
|
+
const path = '/v1/funding/chains'
|
|
393
|
+
|
|
394
|
+
const first = await app.request(path)
|
|
395
|
+
const second = await app.request(path)
|
|
396
|
+
expect(first.status).toBe(200)
|
|
397
|
+
expect(second.status).toBe(200)
|
|
398
|
+
expect(second.headers.get('cache-control')).toContain('public')
|
|
399
|
+
})
|
|
400
|
+
|
|
401
|
+
test('serves anonymous token lists from the edge cache on public chains', async () => {
|
|
373
402
|
const store = Store.memory()
|
|
374
403
|
const app = TestApp.create({ auth: false, cache: { store }, zones: [zoneOptions(zone)] })
|
|
375
404
|
const path = `/v1/tokenlist?chainId=${Viem.chainId.testnet}`
|
package/src/apps/data/App.ts
CHANGED
|
@@ -11,15 +11,18 @@ import * as Path from '../../internal/Path.js'
|
|
|
11
11
|
import * as Response from '../../internal/Response.js'
|
|
12
12
|
import * as Schema from '../../internal/Schema.js'
|
|
13
13
|
import * as Tidx from '../../internal/Tidx.js'
|
|
14
|
+
import * as Timing from '../../internal/Timing.js'
|
|
14
15
|
import * as Viem from '../../internal/Viem.js'
|
|
15
16
|
import * as Scope from '../../Scope.js'
|
|
16
17
|
import * as Metadata from '../metadata.js'
|
|
18
|
+
|
|
17
19
|
import type * as FxOracle from './FxOracle.js'
|
|
18
20
|
|
|
19
21
|
import { transactions as transactionActivities } from './routes/activities.js'
|
|
20
22
|
import { addresses } from './routes/addresses.js'
|
|
21
23
|
import { blocks, blocksByTimestampCompat } from './routes/blocks.js'
|
|
22
24
|
import { coingecko } from './routes/coingecko.js'
|
|
25
|
+
import { earn } from './routes/earn.js'
|
|
23
26
|
import { exchanges } from './routes/exchanges.js'
|
|
24
27
|
import { feeAmm } from './routes/fee-amm.js'
|
|
25
28
|
import { funding } from './routes/funding.js'
|
|
@@ -32,10 +35,11 @@ import { transactions } from './routes/transactions.js'
|
|
|
32
35
|
import { transfers } from './routes/transfers.js'
|
|
33
36
|
import { verifiedTokens } from './routes/verified-tokens.js'
|
|
34
37
|
import { schema as webhookSchema, webhooks } from './routes/webhooks.js'
|
|
38
|
+
import { zones } from './routes/zones.js'
|
|
35
39
|
|
|
36
40
|
/**
|
|
37
|
-
* The chain-data route group extends app context with TIDX, assets,
|
|
38
|
-
*
|
|
41
|
+
* The chain-data route group extends app context with TIDX, assets, verified
|
|
42
|
+
* tokens, and webhooks, and exposes indexed and RPC-backed reads.
|
|
39
43
|
*
|
|
40
44
|
* ```ts
|
|
41
45
|
* App.create(options).route('/', data())
|
|
@@ -43,6 +47,8 @@ import { schema as webhookSchema, webhooks } from './routes/webhooks.js'
|
|
|
43
47
|
*/
|
|
44
48
|
export function data(options: data.Options = {}) {
|
|
45
49
|
const { assets, tidx } = options
|
|
50
|
+
const configuredChainIds =
|
|
51
|
+
typeof tidx === 'function' ? [] : Viem.configuredChainIds(tidx?.baseUrl)
|
|
46
52
|
const webhook =
|
|
47
53
|
options.webhook === false
|
|
48
54
|
? undefined
|
|
@@ -50,11 +56,17 @@ export function data(options: data.Options = {}) {
|
|
|
50
56
|
supportedChainIds: [Viem.chainId.mainnet, Viem.chainId.testnet],
|
|
51
57
|
})
|
|
52
58
|
|
|
53
|
-
// Zone endpoints are explicit trust boundaries; the API never derives them.
|
|
54
|
-
const zones = new Map((options.zones ?? []).map((zone) => [zone.chainId, zone]))
|
|
55
59
|
const dataRouteHandlers = new Set<unknown>()
|
|
56
60
|
|
|
57
61
|
const getTidx = Tidx.createGetClient({ tidx })
|
|
62
|
+
const earn_routes = earn({ fx: options.fx })
|
|
63
|
+
const indexer_routes = indexer()
|
|
64
|
+
const indexerRouteHandlers = new Set(indexer_routes.routes.map((route) => route.handler))
|
|
65
|
+
const rpcOnlyRouteHandlers = new Set(
|
|
66
|
+
earn_routes.routes
|
|
67
|
+
.filter((route) => route.path === '/v1/earn/vaults/:vaultId/positions/:address')
|
|
68
|
+
.map((route) => route.handler),
|
|
69
|
+
)
|
|
58
70
|
|
|
59
71
|
const app = new Hono<App.Environment>()
|
|
60
72
|
// Publish the chain-data context vars for this group's handlers. Runs after
|
|
@@ -65,16 +77,26 @@ export function data(options: data.Options = {}) {
|
|
|
65
77
|
const supportedChainIds = new Set<number>([
|
|
66
78
|
...c.get('supportedChainIds'),
|
|
67
79
|
...Object.keys(Tidx.url).map(Number),
|
|
68
|
-
...
|
|
80
|
+
...configuredChainIds,
|
|
69
81
|
])
|
|
70
82
|
c.set('getAsset', createGetAsset({ assets, basePath: c.get('basePath'), origin: new URL(c.req.url).origin })) // prettier-ignore
|
|
71
83
|
c.set('getClient', (chainId) => getClient(chainId ?? c.get('chainId')))
|
|
72
|
-
c.set('getTidx', (chainId) =>
|
|
84
|
+
c.set('getTidx', (chainId) => {
|
|
85
|
+
const resolved = chainId ?? c.get('chainId')
|
|
86
|
+
const client = getTidx(resolved, {
|
|
87
|
+
principal: Auth.getPrincipal(c),
|
|
88
|
+
zone: c.get('zones').get(resolved),
|
|
89
|
+
})
|
|
90
|
+
return Tidx.observe(client, {
|
|
91
|
+
record: (failure) =>
|
|
92
|
+
c.set('providerFailure', failure ? { ...failure, chainId: resolved } : undefined),
|
|
93
|
+
time: (fn) => Timing.time(c, 'tidx', fn),
|
|
94
|
+
})
|
|
95
|
+
})
|
|
73
96
|
c.set('supportedChainIds', supportedChainIds)
|
|
74
97
|
c.set('tidx', tidx)
|
|
75
98
|
c.set('verifiedTokens', options.verifiedTokens === false ? undefined : (options.verifiedTokens ?? {})) // prettier-ignore
|
|
76
99
|
c.set('webhook', webhook)
|
|
77
|
-
c.set('zones', zones)
|
|
78
100
|
await next()
|
|
79
101
|
})
|
|
80
102
|
// Resolve one chain for every data route before auth and handlers use it.
|
|
@@ -85,6 +107,8 @@ export function data(options: data.Options = {}) {
|
|
|
85
107
|
c,
|
|
86
108
|
defaultChainId,
|
|
87
109
|
handlers: dataRouteHandlers,
|
|
110
|
+
indexerHandlers: indexerRouteHandlers,
|
|
111
|
+
rpcOnlyHandlers: rpcOnlyRouteHandlers,
|
|
88
112
|
})
|
|
89
113
|
if (!selection.matched) return next()
|
|
90
114
|
if (selection.conflict || selection.invalid)
|
|
@@ -93,19 +117,39 @@ export function data(options: data.Options = {}) {
|
|
|
93
117
|
message: selection.conflict ? 'Conflicting chain ids' : 'Invalid chain id',
|
|
94
118
|
status: 400,
|
|
95
119
|
})
|
|
96
|
-
|
|
97
|
-
|
|
120
|
+
const principal = Auth.getPrincipal(c)
|
|
121
|
+
const rpc_config = c.get('rpc')
|
|
122
|
+
const tidx_config = c.get('tidx')
|
|
123
|
+
const zones = c.get('zones')
|
|
124
|
+
// Raw passthroughs and RPC-only reads need only RPC; composed data routes
|
|
125
|
+
// require both upstreams to avoid falling through to unrelated defaults.
|
|
126
|
+
const narrowedChainIds = new Set(
|
|
127
|
+
[...supportedChainIds].filter((chainId) => {
|
|
128
|
+
const context = { chainId, principal, zone: zones.get(chainId) }
|
|
129
|
+
const hasRpc = Viem.resolveRpc(rpc_config, context).url !== undefined
|
|
130
|
+
const hasTidx = Tidx.resolve(tidx_config, context).baseUrl !== undefined
|
|
131
|
+
if (selection.rpc || selection.rpcOnly) return hasRpc
|
|
132
|
+
if (selection.indexer) return hasTidx
|
|
133
|
+
return hasRpc && hasTidx
|
|
134
|
+
}),
|
|
135
|
+
)
|
|
136
|
+
c.set('supportedChainIds', narrowedChainIds)
|
|
137
|
+
if (!narrowedChainIds.has(selection.chainId))
|
|
138
|
+
return Response.unsupportedChainId(c, selection.chainId, narrowedChainIds)
|
|
98
139
|
c.set('chainId', selection.chainId)
|
|
99
140
|
return next()
|
|
100
141
|
})
|
|
101
142
|
// Zone data requires an issued scope. Raw RPC may instead forward the
|
|
102
143
|
// caller's Zone token to the node that enforces account scoping.
|
|
103
144
|
.use('*', async (c, next) => {
|
|
145
|
+
const zones = c.get('zones')
|
|
104
146
|
if (zones.size === 0) return next()
|
|
105
147
|
const selection = resolveChainSelector({
|
|
106
148
|
c,
|
|
107
149
|
defaultChainId: c.get('chainId'),
|
|
108
150
|
handlers: dataRouteHandlers,
|
|
151
|
+
indexerHandlers: indexerRouteHandlers,
|
|
152
|
+
rpcOnlyHandlers: rpcOnlyRouteHandlers,
|
|
109
153
|
})
|
|
110
154
|
if (!selection.matched) return next()
|
|
111
155
|
const chainId = c.get('chainId')
|
|
@@ -116,13 +160,14 @@ export function data(options: data.Options = {}) {
|
|
|
116
160
|
const allowed =
|
|
117
161
|
scopes?.includes(Scope.wildcard) ||
|
|
118
162
|
scopes?.includes(`zone:${chainId}:read`) ||
|
|
163
|
+
scopes?.includes(`zone:${chainId}:write`) ||
|
|
119
164
|
(selection.rpc && Boolean(c.req.header(ZoneRpcAuthentication.headerName)?.trim()))
|
|
120
165
|
if (!allowed)
|
|
121
166
|
return Response.error(c, {
|
|
122
167
|
code: 'api_key_forbidden',
|
|
123
168
|
message: selection.rpc
|
|
124
|
-
? `Chain id ${chainId} is a zone. Use an API key granting \`zone:${chainId}:read\`, or pass a Zone token via \`X-Authorization-Token\`.`
|
|
125
|
-
: `Chain id ${chainId} is a zone. Use an API key granting \`zone:${chainId}:read\`.`,
|
|
169
|
+
? `Chain id ${chainId} is a zone. Use an API key granting \`zone:${chainId}:read\` or \`zone:${chainId}:write\`, or pass a Zone token via \`X-Authorization-Token\`.`
|
|
170
|
+
: `Chain id ${chainId} is a zone. Use an API key granting \`zone:${chainId}:read\` or \`zone:${chainId}:write\`.`,
|
|
126
171
|
status: 403,
|
|
127
172
|
})
|
|
128
173
|
|
|
@@ -143,6 +188,8 @@ export function data(options: data.Options = {}) {
|
|
|
143
188
|
c,
|
|
144
189
|
defaultChainId: c.get('chainId'),
|
|
145
190
|
handlers: dataRouteHandlers,
|
|
191
|
+
indexerHandlers: indexerRouteHandlers,
|
|
192
|
+
rpcOnlyHandlers: rpcOnlyRouteHandlers,
|
|
146
193
|
})
|
|
147
194
|
if (!selection.matched || !Viem.isMainnet(c.get('chainId'))) return next()
|
|
148
195
|
|
|
@@ -167,10 +214,11 @@ export function data(options: data.Options = {}) {
|
|
|
167
214
|
})
|
|
168
215
|
.route('/', addresses({ fx: options.fx }))
|
|
169
216
|
.route('/', blocks())
|
|
217
|
+
.route('/', earn_routes)
|
|
170
218
|
.route('/', exchanges({ fx: options.fx }))
|
|
171
219
|
.route('/', feeAmm())
|
|
172
|
-
.route('/', funding(
|
|
173
|
-
.route('/',
|
|
220
|
+
.route('/', funding())
|
|
221
|
+
.route('/', indexer_routes)
|
|
174
222
|
.route('/', receipts({ fx: options.fx }))
|
|
175
223
|
.route('/', tokenlist())
|
|
176
224
|
.route('/', tokens())
|
|
@@ -179,6 +227,7 @@ export function data(options: data.Options = {}) {
|
|
|
179
227
|
.route('/', transfers({ fx: options.fx }))
|
|
180
228
|
.route('/', verifiedTokens())
|
|
181
229
|
.route('/', webhooks({ enabled: options.webhook !== false }))
|
|
230
|
+
.route('/', zones())
|
|
182
231
|
.route('/', rpc())
|
|
183
232
|
.route('/', coingecko())
|
|
184
233
|
.route('/', blocksByTimestampCompat())
|
|
@@ -187,22 +236,24 @@ export function data(options: data.Options = {}) {
|
|
|
187
236
|
c,
|
|
188
237
|
defaultChainId: c.get('chainId'),
|
|
189
238
|
handlers: dataRouteHandlers,
|
|
239
|
+
indexerHandlers: indexerRouteHandlers,
|
|
240
|
+
rpcOnlyHandlers: rpcOnlyRouteHandlers,
|
|
190
241
|
})
|
|
191
242
|
return (
|
|
192
243
|
selection.matched &&
|
|
193
244
|
!selection.conflict &&
|
|
194
245
|
!selection.invalid &&
|
|
195
|
-
!zones.has(selection.chainId)
|
|
246
|
+
!c.get('zones').has(selection.chainId)
|
|
196
247
|
)
|
|
197
248
|
}
|
|
198
249
|
for (const route of app.routes) {
|
|
199
250
|
if (route.method === 'ALL') continue
|
|
200
251
|
dataRouteHandlers.add(route.handler)
|
|
201
|
-
|
|
252
|
+
EdgeCache.setEligibility(route.handler, edgeCacheEligible)
|
|
202
253
|
}
|
|
203
254
|
return Metadata.attach(app, {
|
|
204
255
|
...openapi,
|
|
205
|
-
supportedChainIds: [...Object.keys(Tidx.url).map(Number), ...
|
|
256
|
+
supportedChainIds: [...Object.keys(Tidx.url).map(Number), ...configuredChainIds],
|
|
206
257
|
})
|
|
207
258
|
}
|
|
208
259
|
|
|
@@ -211,8 +262,6 @@ export declare namespace data {
|
|
|
211
262
|
type Options = {
|
|
212
263
|
/** Static API asset store for the current runtime (e.g. `Assets.cloudflareR2(...)`). Omit to skip static assets — token logo URIs go unresolved. */
|
|
213
264
|
assets?: Assets.Assets | undefined
|
|
214
|
-
/** Funding quote provider configuration. */
|
|
215
|
-
funding?: funding.Options | undefined
|
|
216
265
|
/** FX configuration for the valuation endpoint. */
|
|
217
266
|
fx?: Fx | undefined
|
|
218
267
|
/** TIDX query client options. */
|
|
@@ -221,11 +270,6 @@ export declare namespace data {
|
|
|
221
270
|
verifiedTokens?: VerifiedTokens | false | undefined
|
|
222
271
|
/** Webhook feature configuration. Enabled by default (rows live in `db`); pass `false` to disable, leaving `/webhooks` mounted but returning `404` and hidden from the OpenAPI document. */
|
|
223
272
|
webhook?: Webhook | false | undefined
|
|
224
|
-
/**
|
|
225
|
-
* Zone chains served by this deployment. REST and TIDX require a
|
|
226
|
-
* `zone:<chainId>:read` scope; raw RPC may forward a Zone token instead.
|
|
227
|
-
*/
|
|
228
|
-
zones?: readonly Zone[] | undefined
|
|
229
273
|
}
|
|
230
274
|
|
|
231
275
|
/** FX configuration for the valuation endpoint. */
|
|
@@ -234,14 +278,6 @@ export declare namespace data {
|
|
|
234
278
|
oracle?: FxOracle.Oracle | undefined
|
|
235
279
|
}
|
|
236
280
|
|
|
237
|
-
/** One zone chain served by this deployment. */
|
|
238
|
-
type Zone = {
|
|
239
|
-
/** Zone chain id. Consumer-supplied literal; the API never derives zone chain ids. */
|
|
240
|
-
chainId: number
|
|
241
|
-
/** Zone RPC used when forwarding a caller-supplied Zone token. */
|
|
242
|
-
forwardRpcUrl: string
|
|
243
|
-
}
|
|
244
|
-
|
|
245
281
|
/** Verified-token feature configuration. */
|
|
246
282
|
type VerifiedTokens = {
|
|
247
283
|
/**
|
|
@@ -260,13 +296,19 @@ function resolveChainSelector(options: {
|
|
|
260
296
|
c: Context<App.Environment>
|
|
261
297
|
defaultChainId: Viem.ChainId
|
|
262
298
|
handlers: ReadonlySet<unknown>
|
|
299
|
+
indexerHandlers: ReadonlySet<unknown>
|
|
300
|
+
rpcOnlyHandlers: ReadonlySet<unknown>
|
|
263
301
|
}) {
|
|
264
302
|
let matched = false
|
|
265
303
|
let path: string | undefined
|
|
266
304
|
let rpc = false
|
|
305
|
+
let rpcOnly = false
|
|
306
|
+
let indexer = false
|
|
267
307
|
for (const route of matchedRoutes(options.c)) {
|
|
268
308
|
if (!options.handlers.has(route.handler)) continue
|
|
269
309
|
matched = true
|
|
310
|
+
if (options.indexerHandlers.has(route.handler)) indexer = true
|
|
311
|
+
if (options.rpcOnlyHandlers.has(route.handler)) rpcOnly = true
|
|
270
312
|
const selector = pathChainSelector(route.path, options.c.req.path)
|
|
271
313
|
if (selector.name === undefined) continue
|
|
272
314
|
path = selector.value
|
|
@@ -278,9 +320,11 @@ function resolveChainSelector(options: {
|
|
|
278
320
|
return {
|
|
279
321
|
chainId: options.defaultChainId,
|
|
280
322
|
conflict: false,
|
|
323
|
+
indexer: false,
|
|
281
324
|
invalid: false,
|
|
282
325
|
matched: false,
|
|
283
326
|
rpc: false,
|
|
327
|
+
rpcOnly: false,
|
|
284
328
|
}
|
|
285
329
|
|
|
286
330
|
const search = new URL(options.c.req.url).searchParams
|
|
@@ -294,9 +338,11 @@ function resolveChainSelector(options: {
|
|
|
294
338
|
return {
|
|
295
339
|
chainId: chainIds[0] ?? options.defaultChainId,
|
|
296
340
|
conflict: chainIds.length > 1,
|
|
341
|
+
indexer,
|
|
297
342
|
invalid: parsed.some((result) => !result.success),
|
|
298
343
|
matched: true,
|
|
299
344
|
rpc,
|
|
345
|
+
rpcOnly,
|
|
300
346
|
}
|
|
301
347
|
}
|
|
302
348
|
|
|
@@ -326,14 +372,19 @@ const openapi = {
|
|
|
326
372
|
{ name: 'Activities', description: 'A readable feed of what an account did onchain.' },
|
|
327
373
|
{ name: 'Balances', description: 'How much of each token an account holds.' },
|
|
328
374
|
{ name: 'Blocks', description: 'The ordered batches of transactions making up the chain.' },
|
|
375
|
+
{ name: 'Earn', description: 'Vaults that earn yield from assets deposited on Tempo.' },
|
|
329
376
|
{ name: 'Exchange', description: "Tempo's built-in stablecoin exchange: pairs, swaps, orders, prices." }, // prettier-ignore
|
|
330
377
|
{ name: 'Fee AMM', description: 'Pools that convert stablecoins to pay fees.' },
|
|
331
|
-
{
|
|
378
|
+
{
|
|
379
|
+
name: 'Funding',
|
|
380
|
+
description: 'Quote, transfer, and deposit management for funding Tempo from other chains.',
|
|
381
|
+
},
|
|
332
382
|
{ name: 'Tokens', description: 'TIP-20 token details, supply, and holders.' },
|
|
333
383
|
{ name: 'Transactions', description: 'Transactions submitted to Tempo, and their receipts.' },
|
|
334
384
|
{ name: 'Transfers', description: 'Token movements from executing transactions.' },
|
|
335
385
|
{ name: 'Verified Tokens', description: 'A curated, trusted list of TIP-20 tokens.' },
|
|
336
386
|
{ name: 'Webhooks', description: 'Get signed callbacks when onchain events happen.' },
|
|
387
|
+
{ name: 'Zones', description: 'Private chain operations anchored to Tempo.' },
|
|
337
388
|
{ name: 'Indexer', description: "Run read-only SQL queries against Tempo's indexed data." },
|
|
338
389
|
{ name: 'RPC', description: 'Direct access to the chain over Ethereum JSON-RPC. Not part of the stable API contract; best-effort support only. No compatibility, latency, availability, or data-freshness guarantees. Breaking changes may happen with limited notice.' }, // prettier-ignore
|
|
339
390
|
{ name: 'CoinGecko', description: "Exchange data in CoinGecko's GeckoTerminal format." },
|
|
@@ -345,6 +396,7 @@ const openapi = {
|
|
|
345
396
|
'Activities',
|
|
346
397
|
'Balances',
|
|
347
398
|
'Blocks',
|
|
399
|
+
'Earn',
|
|
348
400
|
'Exchange',
|
|
349
401
|
'Fee AMM',
|
|
350
402
|
'Funding',
|
|
@@ -353,6 +405,7 @@ const openapi = {
|
|
|
353
405
|
'Transfers',
|
|
354
406
|
'Verified Tokens',
|
|
355
407
|
'Webhooks',
|
|
408
|
+
'Zones',
|
|
356
409
|
'Indexer',
|
|
357
410
|
'RPC',
|
|
358
411
|
'MCP',
|
|
@@ -415,7 +468,7 @@ function webhooksBlock() {
|
|
|
415
468
|
function createGetAsset(options: createGetAsset.Options): App.GetAsset {
|
|
416
469
|
const { assets, basePath, origin } = options
|
|
417
470
|
if (!assets) return () => undefined
|
|
418
|
-
|
|
471
|
+
const getAsset: App.GetAsset = async (chainId, path) => {
|
|
419
472
|
const pathname = Path.join(basePath, 'assets', String(chainId), path)
|
|
420
473
|
// `path` may be absolute (`Path.join` returns a leading slash); strip it so
|
|
421
474
|
// the key is `:chainId/:path`, not `:chainId//:path`.
|
|
@@ -429,6 +482,16 @@ function createGetAsset(options: createGetAsset.Options): App.GetAsset {
|
|
|
429
482
|
uri: new URL(pathname, origin).toString(),
|
|
430
483
|
}
|
|
431
484
|
}
|
|
485
|
+
const list = assets.list
|
|
486
|
+
if (list)
|
|
487
|
+
getAsset.list = async (chainId, path) => {
|
|
488
|
+
const prefix = `${chainId}/${path.replace(/^\/+/, '')}`
|
|
489
|
+
return (await list(prefix)).map((key) => ({
|
|
490
|
+
key,
|
|
491
|
+
uri: new URL(Path.join(basePath, 'assets', key), origin).toString(),
|
|
492
|
+
}))
|
|
493
|
+
}
|
|
494
|
+
return getAsset
|
|
432
495
|
}
|
|
433
496
|
|
|
434
497
|
declare namespace createGetAsset {
|
|
@@ -4,7 +4,7 @@ import * as Ttl from '../../internal/Ttl.js'
|
|
|
4
4
|
|
|
5
5
|
/** A pluggable fiat FX rate oracle consumed by the valuation endpoint. */
|
|
6
6
|
export type Oracle = {
|
|
7
|
-
/** Oracle identifier, surfaced as
|
|
7
|
+
/** Oracle identifier, surfaced as valuation rate provenance (e.g. `ecb`). */
|
|
8
8
|
name: string
|
|
9
9
|
/** Fetches the oracle's current rate set. */
|
|
10
10
|
rates: () => Promise<RateSet>
|
package/src/apps/data/index.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
/** @module-tag localnet */
|
|
2
|
+
|
|
1
3
|
import { Address, Hex, Value as core_Value } from 'ox'
|
|
2
4
|
import { FxOracle } from 'tapimo/apps'
|
|
3
|
-
import { encodeAbiParameters, encodeEventTopics } from 'viem'
|
|
4
|
-
import {
|
|
5
|
+
import { createClient, encodeAbiParameters, encodeEventTopics, http } from 'viem'
|
|
6
|
+
import { sendTransactionSync } from 'viem/actions'
|
|
7
|
+
import { Abis, Actions, Addresses } from 'viem/tempo'
|
|
5
8
|
|
|
6
9
|
import * as TestApp from '../../../../test/App.js'
|
|
7
10
|
import * as Runtime from '../../../../test/runtime.js'
|
|
11
|
+
import * as Tempo from '../../../../test/Tempo.js'
|
|
8
12
|
import * as Cursor from '../../../internal/Cursor.js'
|
|
9
13
|
import * as Store from '../../../internal/Store.js'
|
|
10
14
|
import * as Activities from './activities.js'
|
|
15
|
+
import * as Transactions from './transactions.js'
|
|
11
16
|
|
|
12
17
|
// Deterministic EUR-based rate set so conversion math is exact in assertions.
|
|
13
18
|
const fixed = FxOracle.from({
|
|
@@ -297,7 +302,7 @@ describe('GET /addresses/:address/activities', () => {
|
|
|
297
302
|
const hash = runtime.fixtures!.faucetTransactionHashes[0]!
|
|
298
303
|
|
|
299
304
|
const response = await client.v1.transactions[':transactionHash'].activities.$get(
|
|
300
|
-
{ param: { transactionHash: hash }, query: {
|
|
305
|
+
{ param: { transactionHash: hash }, query: { 'valuation.currency': 'AUD' } },
|
|
301
306
|
TestApp.auth,
|
|
302
307
|
)
|
|
303
308
|
const body = await TestApp.json(response, Activities.schema.getTransactionActivities.Response)
|
|
@@ -314,7 +319,7 @@ describe('GET /addresses/:address/activities', () => {
|
|
|
314
319
|
amount: core_Value.format((BigInt(amount.baseUnits) * 16n) / 10n, 6),
|
|
315
320
|
currency: 'AUD',
|
|
316
321
|
})
|
|
317
|
-
expect(body.meta?.
|
|
322
|
+
expect(body.meta?.valuation).toMatchInlineSnapshot(`
|
|
318
323
|
{
|
|
319
324
|
"asOf": "2026-01-01T00:00:00.000Z",
|
|
320
325
|
"basis": "nominal",
|
|
@@ -330,15 +335,86 @@ describe('GET /addresses/:address/activities', () => {
|
|
|
330
335
|
|
|
331
336
|
test('paginates with an opaque cursor', async () => {
|
|
332
337
|
const first = await activities(accounts.keychain, { limit: '5' })
|
|
338
|
+
expect(first.nextCursor).toBeTypeOf('string')
|
|
333
339
|
if (!first.nextCursor) return
|
|
334
340
|
const response = await request(accounts.keychain, { limit: '5', cursor: first.nextCursor })
|
|
335
341
|
expect(response.headers.get('cache-control')).toMatchInlineSnapshot(
|
|
336
342
|
`"private, max-age=60, stale-while-revalidate=300"`,
|
|
337
343
|
)
|
|
338
344
|
const second = await TestApp.json(response, Activities.schema.getAddressActivities.Response)
|
|
339
|
-
|
|
345
|
+
const firstHashes = new Set(
|
|
346
|
+
first.data.flatMap((entry) =>
|
|
347
|
+
entry.type === 'group'
|
|
348
|
+
? entry.data.items.map((item) => item.transactionHash)
|
|
349
|
+
: [entry.transactionHash],
|
|
350
|
+
),
|
|
351
|
+
)
|
|
352
|
+
const secondHashes = second.data.flatMap((entry) =>
|
|
353
|
+
entry.type === 'group'
|
|
354
|
+
? entry.data.items.map((item) => item.transactionHash)
|
|
355
|
+
: [entry.transactionHash],
|
|
356
|
+
)
|
|
357
|
+
expect(secondHashes.every((hash) => !firstHashes.has(hash))).toBe(true)
|
|
340
358
|
})
|
|
341
359
|
|
|
360
|
+
test.skipIf(runtime.mode !== 'localnet')(
|
|
361
|
+
'keeps older activity behind a high-log transaction',
|
|
362
|
+
async () => {
|
|
363
|
+
const account = Tempo.accounts[3]
|
|
364
|
+
const wallet = createClient({
|
|
365
|
+
account,
|
|
366
|
+
chain: Tempo.chain,
|
|
367
|
+
transport: http(Tempo.rpcUrl),
|
|
368
|
+
})
|
|
369
|
+
await Actions.faucet.fundSync(Tempo.client, { account, timeout: 60_000 })
|
|
370
|
+
const approval_result = await Actions.token.approveSync(wallet, {
|
|
371
|
+
amount: 1n,
|
|
372
|
+
spender: Addresses.stablecoinDex,
|
|
373
|
+
token: Addresses.pathUsd,
|
|
374
|
+
})
|
|
375
|
+
const approval = 'receipt' in approval_result ? approval_result.receipt : approval_result
|
|
376
|
+
const highLog = await sendTransactionSync(wallet, {
|
|
377
|
+
account,
|
|
378
|
+
calls: Array.from({ length: 25 }, (_, index) =>
|
|
379
|
+
Actions.token.approve.call(wallet, {
|
|
380
|
+
amount: BigInt(index + 2),
|
|
381
|
+
spender: Addresses.stablecoinDex,
|
|
382
|
+
token: Addresses.pathUsd,
|
|
383
|
+
}),
|
|
384
|
+
),
|
|
385
|
+
})
|
|
386
|
+
// The legacy `limit * 4` joined-row window stopped inside this transaction
|
|
387
|
+
// and never exposed the older approval to the activity paginator.
|
|
388
|
+
expect(highLog.logs.length).toBeGreaterThan(20)
|
|
389
|
+
|
|
390
|
+
const pending = new Set(
|
|
391
|
+
[approval.transactionHash, highLog.transactionHash].map((hash) => hash.toLowerCase()),
|
|
392
|
+
)
|
|
393
|
+
const deadline = Date.now() + 60_000
|
|
394
|
+
while (Date.now() < deadline && pending.size > 0) {
|
|
395
|
+
const response = await client.v1.transactions.$get(
|
|
396
|
+
{ query: { limit: '200', sender: account.address } },
|
|
397
|
+
{ headers: { 'cache-control': 'no-store', ...TestApp.auth.headers } },
|
|
398
|
+
)
|
|
399
|
+
if (response.status === 200) {
|
|
400
|
+
const body = await TestApp.json(response, Transactions.schema.getTransactions.Response)
|
|
401
|
+
for (const transaction of body.data) pending.delete(transaction.hash.toLowerCase())
|
|
402
|
+
}
|
|
403
|
+
if (pending.size > 0) await new Promise((resolve) => setTimeout(resolve, 250))
|
|
404
|
+
}
|
|
405
|
+
expect(pending).toEqual(new Set())
|
|
406
|
+
|
|
407
|
+
const body = await activities(account.address, { limit: '5' })
|
|
408
|
+
expect(
|
|
409
|
+
body.data.some(
|
|
410
|
+
(entry) =>
|
|
411
|
+
entry.type === 'approval' && entry.transactionHash === approval.transactionHash,
|
|
412
|
+
),
|
|
413
|
+
).toBe(true)
|
|
414
|
+
},
|
|
415
|
+
120_000,
|
|
416
|
+
)
|
|
417
|
+
|
|
342
418
|
test('validates denominations on empty feeds', async () => {
|
|
343
419
|
const client = TestApp.client({ fx: { oracle: fixed } })
|
|
344
420
|
const cursor = Cursor.encode([0, 0])
|
|
@@ -353,7 +429,7 @@ describe('GET /addresses/:address/activities', () => {
|
|
|
353
429
|
const response = await client.v1.addresses[':address'].activities.$get(
|
|
354
430
|
{
|
|
355
431
|
param: { address: accounts.keychain },
|
|
356
|
-
query: { cursor,
|
|
432
|
+
query: { cursor, limit: '5', 'valuation.currency': 'JPY' },
|
|
357
433
|
},
|
|
358
434
|
TestApp.auth,
|
|
359
435
|
)
|