From fdfb9f97ee6bdd0d84f41cf3a33728c9be65d41b Mon Sep 17 00:00:00 2001 From: shunab Date: Sat, 6 Jun 2026 22:44:39 +0100 Subject: [PATCH] feat(exchange): add Hyperliquid spot markets Load spotMeta alongside perp meta, resolve @index symbols to readable pair labels for search and UI, and keep wire ids for subscriptions. --- src/components/SearchDialog.vue | 10 +- src/components/chart/MarketsOverlay.vue | 7 +- src/components/settings/Exchange.vue | 4 +- src/components/trades/TradesSettings.vue | 4 +- src/components/trades/tradesFeed.ts | 14 ++- src/services/productsService.ts | 112 ++++++++++++++++++++++- src/store/app.ts | 1 + src/worker/exchanges/hyperliquid.ts | 71 ++++++++++++-- 8 files changed, 199 insertions(+), 24 deletions(-) diff --git a/src/components/SearchDialog.vue b/src/components/SearchDialog.vue index ed45548db..492fa5307 100644 --- a/src/components/SearchDialog.vue +++ b/src/components/SearchDialog.vue @@ -227,7 +227,7 @@ @@ -332,7 +332,7 @@ :class="'icon-' + market.exchange" > - + selection.indexOf(product.id) === -1 && - queryFilter.test(product.local) + productMatchesSearchQuery(product, queryFilter) ) .reduce((groups, product) => { let localPair @@ -711,7 +712,8 @@ export default { } else { return this.filteredProducts.filter( product => - selection.indexOf(product.id) === -1 && queryFilter.test(product.id) + selection.indexOf(product.id) === -1 && + productMatchesSearchQuery(product, queryFilter) ) } }, diff --git a/src/components/chart/MarketsOverlay.vue b/src/components/chart/MarketsOverlay.vue index 276ac02e6..88f9d39ac 100644 --- a/src/components/chart/MarketsOverlay.vue +++ b/src/components/chart/MarketsOverlay.vue @@ -35,7 +35,7 @@ @click.stop.prevent />
- {{ market }} + {{ formatMarket(market) }} @@ -57,6 +57,7 @@ diff --git a/src/components/settings/Exchange.vue b/src/components/settings/Exchange.vue index 421ef1719..19778f1ce 100644 --- a/src/components/settings/Exchange.vue +++ b/src/components/settings/Exchange.vue @@ -25,7 +25,9 @@
-
{{ market.pair }}
+
+ {{ market.displayPair || market.pair }} +
diff --git a/src/components/trades/TradesSettings.vue b/src/components/trades/TradesSettings.vue index f3d82cc35..5e6406c12 100644 --- a/src/components/trades/TradesSettings.vue +++ b/src/components/trades/TradesSettings.vue @@ -548,9 +548,11 @@ export default class TradesSettings extends Vue { const multiplier = (this.$store.state[this.paneId] as TradesPaneState) .multipliers[marketKey] + const product = this.$store.state.panes.marketsListeners[marketKey] + return { exchange, - pair, + pair: product?.displayPair || pair, multiplier: !isNaN(multiplier) ? multiplier : 1, identifier: marketKey } diff --git a/src/components/trades/tradesFeed.ts b/src/components/trades/tradesFeed.ts index 28f0a1ea0..08d50dd59 100644 --- a/src/components/trades/tradesFeed.ts +++ b/src/components/trades/tradesFeed.ts @@ -1,6 +1,10 @@ import audioService, { AudioFunction } from '@/services/audioService' import gifsService from '@/services/gifsService' -import { formatAmount, formatMarketPrice } from '@/services/productsService' +import { + formatAmount, + formatMarketPrice, + getMarketDisplayPair +} from '@/services/productsService' import store from '@/store' import { SlippageMode, Trade } from '@/types/types' import { @@ -301,10 +305,10 @@ export default class TradesFeed { let pairName = '' if (this.showPairs) { - pairName = `
${trade.pair.replace( - '_', - ' ' - )}
` + pairName = `
${getMarketDisplayPair( + trade.exchange, + trade.pair + ).replace('_', ' ')}
` } return `