Skip to content

Commit 87ea98c

Browse files
committed
drop deprecated route
1 parent ccc391a commit 87ea98c

7 files changed

Lines changed: 44 additions & 99 deletions

File tree

listen-interface/src/components/Chart.tsx

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import {
99
} from "lightweight-charts";
1010
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
1111
import { z } from "zod";
12-
import { useListenMetadata } from "../hooks/useListenMetadata";
13-
import { CandlestickData, CandlestickDataSchema } from "../lib/types";
12+
import { useSolanaToken } from "../hooks/useToken";
13+
import { CandlestickData } from "../lib/types";
1414
import { useTokenStore } from "../store/tokenStore";
1515
import { Socials } from "./Socials";
1616

@@ -189,6 +189,9 @@ async function fetchGeckoTerminalOHLC(
189189
};
190190
});
191191

192+
// Sort by timestamp in ascending order (required by lightweight-charts)
193+
candlesticks.sort((a, b) => a.timestamp - b.timestamp);
194+
192195
return candlesticks;
193196
} catch (error) {
194197
console.error("Failed to fetch GeckoTerminal OHLC data:", error);
@@ -482,7 +485,7 @@ export function Chart({ mint, interval: defaultInterval = "30s" }: ChartProps) {
482485
// Subscribe to token store updates
483486
const latestUpdate = useTokenStore((state) => state.latestUpdate);
484487

485-
const { data: metadata } = useListenMetadata(mint);
488+
const { data: metadata } = useSolanaToken(mint);
486489

487490
const percentChange = useMemo(() => {
488491
if (!data || data.length < 2) {
@@ -612,14 +615,10 @@ export function Chart({ mint, interval: defaultInterval = "30s" }: ChartProps) {
612615
responseData = await fetchGeckoTerminalOHLC(poolAddress, selectedInterval);
613616
}
614617

615-
// If GeckoTerminal fails or no pool found, fall back to custom API
618+
// If GeckoTerminal fails or no pool found, show empty chart
616619
if (!responseData || responseData.length === 0) {
617-
console.log(`Falling back to custom API for token ${mint}`);
618-
const response = await fetch(
619-
// use prod for charts always
620-
`https://api.listen-rs.com/v1/adapter/candlesticks?mint=${mint}&interval=${selectedInterval}`
621-
);
622-
responseData = CandlestickDataSchema.parse(await response.json());
620+
console.log(`No chart data available for token ${mint} - pool might not exist on GeckoTerminal`);
621+
responseData = [];
623622
}
624623

625624
if (!isDisposed.current) {
@@ -660,10 +659,10 @@ export function Chart({ mint, interval: defaultInterval = "30s" }: ChartProps) {
660659

661660
// Format pubkey for display
662661
const formattedPubkey = useMemo(() => {
663-
if (!metadata?.mint) return "";
664-
return metadata.mint.length > 12
665-
? `${metadata.mint.slice(0, 6)}...${metadata.mint.slice(-6)}`
666-
: metadata.mint;
662+
if (!metadata?.address) return "";
663+
return metadata.address.length > 12
664+
? `${metadata.address.slice(0, 6)}...${metadata.address.slice(-6)}`
665+
: metadata.address;
667666
}, [metadata]);
668667

669668
return (
@@ -672,34 +671,34 @@ export function Chart({ mint, interval: defaultInterval = "30s" }: ChartProps) {
672671
<div className="flex items-center justify-between mb-2 p-3 backdrop-blur-sm">
673672
<div className="flex items-center">
674673
{/* Add token image with proper spacing */}
675-
{metadata?.mpl.ipfs_metadata?.image && (
674+
{metadata?.logoURI && (
676675
<div className="w-8 h-8 relative rounded-full overflow-hidden mr-3">
677676
<img
678-
src={metadata.mpl.ipfs_metadata.image.replace(
677+
src={metadata.logoURI.replace(
679678
"cf-ipfs.com",
680679
"ipfs.io"
681680
)}
682-
alt={metadata?.mpl.symbol || "Token"}
681+
alt={metadata?.symbol || "Token"}
683682
className="w-full h-full object-cover"
684683
/>
685684
</div>
686685
)}
687686
<div className="flex flex-col">
688687
<div className="flex items-center space-x-2">
689-
{metadata?.mpl.symbol && (
688+
{metadata?.symbol && (
690689
<span className="font-bold text-white">
691-
{metadata.mpl.symbol}
690+
{metadata.symbol}
692691
</span>
693692
)}
694-
{metadata?.mpl.name && (
693+
{metadata?.name && (
695694
<span className="text-white ml-2 hidden lg:block">
696-
{metadata.mpl.name}
695+
{metadata.name}
697696
</span>
698697
)}
699-
{metadata?.mint && (
698+
{metadata?.address && (
700699
<span
701700
className="text-xs text-white/70 ml-2 hidden lg:block"
702-
title={metadata.mint}
701+
title={metadata.address}
703702
>
704703
({formattedPubkey})
705704
</span>
@@ -717,7 +716,7 @@ export function Chart({ mint, interval: defaultInterval = "30s" }: ChartProps) {
717716
</span>
718717
)}
719718
</div>
720-
<Socials tokenMetadata={metadata ?? null} pubkey={mint} />
719+
<Socials tokenMetadata={null} pubkey={mint} />
721720
</div>
722721
</div>
723722

listen-interface/src/components/JupiterQuoteDisplay.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useListenMetadata } from "../hooks/useListenMetadata";
1+
import { useSolanaToken } from "../hooks/useToken";
22
import { formatAmount, imageMap } from "../lib/util";
33
import { JupiterQuoteResponse } from "../types/quote";
44

@@ -8,11 +8,11 @@ interface JupiterQuoteDisplayProps {
88

99
export const JupiterQuoteDisplay = ({ quote }: JupiterQuoteDisplayProps) => {
1010
// Fetch token metadata for images
11-
const inputTokenMetadata = useListenMetadata(quote.inputMint);
12-
const outputTokenMetadata = useListenMetadata(quote.outputMint);
11+
const inputTokenMetadata = useSolanaToken(quote.inputMint);
12+
const outputTokenMetadata = useSolanaToken(quote.outputMint);
1313

14-
let inputSymbol = inputTokenMetadata.data?.mpl?.symbol || "Unknown";
15-
let outputSymbol = outputTokenMetadata.data?.mpl?.symbol || "Unknown";
14+
let inputSymbol = inputTokenMetadata.data?.symbol || "Unknown";
15+
let outputSymbol = outputTokenMetadata.data?.symbol || "Unknown";
1616

1717
if (quote.inputMint === "So11111111111111111111111111111111111111112") {
1818
inputSymbol = "wSOL";
@@ -25,16 +25,16 @@ export const JupiterQuoteDisplay = ({ quote }: JupiterQuoteDisplayProps) => {
2525
const inputImage =
2626
quote.inputMint in imageMap
2727
? imageMap[quote.inputMint as keyof typeof imageMap]
28-
: inputTokenMetadata.data?.mpl?.ipfs_metadata?.image;
28+
: inputTokenMetadata.data?.logoURI;
2929

3030
const outputImage =
3131
quote.outputMint in imageMap
3232
? imageMap[quote.outputMint as keyof typeof imageMap]
33-
: outputTokenMetadata.data?.mpl?.ipfs_metadata?.image;
33+
: outputTokenMetadata.data?.logoURI;
3434

3535
// Calculate formatted amounts based on token decimals
36-
const inputDecimals = inputTokenMetadata.data?.spl?.decimals || 9;
37-
const outputDecimals = outputTokenMetadata.data?.spl?.decimals || 9;
36+
const inputDecimals = inputTokenMetadata.data?.decimals || 9;
37+
const outputDecimals = outputTokenMetadata.data?.decimals || 9;
3838

3939
// Format price impact as percentage
4040
const priceImpactPercentage = (

listen-interface/src/components/TokenTile.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { FaBoltLightning, FaRegStar, FaStar } from "react-icons/fa6";
77
import { HiOutlineSparkles } from "react-icons/hi2";
88
import { useChat } from "../contexts/ChatContext";
99
import { useModal } from "../contexts/ModalContext";
10-
import { useListenMetadata } from "../hooks/useListenMetadata";
10+
import { useSolanaToken } from "../hooks/useToken";
1111
import { usePipelineExecution } from "../hooks/usePipelineExecution";
1212
import i18n from "../i18n";
1313
import { useSettingsStore } from "../store/settingsStore";
@@ -22,7 +22,7 @@ interface TokenTileProps {
2222
export function TokenTile({ token }: TokenTileProps) {
2323
const { openChart } = useModal();
2424
const { isLoading } = useChat();
25-
const { data: metadata } = useListenMetadata(token.pubkey);
25+
const { data: metadata } = useSolanaToken(token.pubkey);
2626
const { quickBuyAmount } = useSettingsStore();
2727
const [copied, setCopied] = useState(false);
2828
const { isExecuting, quickBuyToken } = usePipelineExecution();
@@ -71,7 +71,7 @@ export function TokenTile({ token }: TokenTileProps) {
7171

7272
const isTokenWatchlisted = isWatchlisted(token.pubkey);
7373

74-
const tokenSymbol = metadata?.mpl.symbol ?? token.name;
74+
const tokenSymbol = metadata?.symbol ?? token.name;
7575
const researchMessage =
7676
i18n.language === "en"
7777
? `Listen, please research $${tokenSymbol} (${token.pubkey}). Provide it a score between 1 and 100 on how solid the narrative is.`
@@ -85,11 +85,11 @@ export function TokenTile({ token }: TokenTileProps) {
8585
<div className="p-3 sm:p-4 flex items-center justify-between hover:bg-black/50 transition-colors relative">
8686
<div className="flex items-center space-x-2 sm:space-x-4">
8787
<div className="flex items-center space-x-2 sm:space-x-3">
88-
{metadata?.mpl.ipfs_metadata?.image &&
89-
metadata.mpl.ipfs_metadata.image.startsWith("https://") && (
88+
{metadata?.logoURI &&
89+
metadata.logoURI.startsWith("https://") && (
9090
<div className="w-8 h-8 sm:w-12 sm:h-12 relative rounded-full overflow-hidden">
9191
<img
92-
src={metadata.mpl.ipfs_metadata.image.replace(
92+
src={metadata.logoURI.replace(
9393
"cf-ipfs.com",
9494
"ipfs.io"
9595
)}
@@ -105,7 +105,7 @@ export function TokenTile({ token }: TokenTileProps) {
105105
className="hover:text-blue-500 truncate max-w-[90px] sm:max-w-none cursor-pointer"
106106
onClick={() => openChart({ mint: token.pubkey })}
107107
>
108-
{metadata?.mpl.symbol ?? token.name}
108+
{metadata?.symbol ?? token.name}
109109
</div>
110110
<button
111111
onClick={(e) => {
@@ -127,7 +127,7 @@ export function TokenTile({ token }: TokenTileProps) {
127127
</button>
128128
</span>
129129
</div>
130-
<Socials tokenMetadata={metadata ?? null} pubkey={token.pubkey} />
130+
<Socials tokenMetadata={null} pubkey={token.pubkey} />
131131
<div className="text-xs sm:text-sm text-gray-500">
132132
{t("token_tile.market_cap")}: $
133133
{(token.marketCap / 1e6).toFixed(1)}M

listen-interface/src/hooks/useListenMetadata.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.

listen-interface/src/lib/balance-change.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Connection, ParsedTransactionWithMeta } from "@solana/web3.js";
2-
import { fetchListenMetadata } from "./listen";
32
import { WSOL_MINT } from "./price";
3+
import { fetchTokenMetadataFromJupiter } from "./solanaPortfolio";
44
import { formatAmountUI } from "./util";
55

66
interface BalanceChange {
@@ -85,10 +85,10 @@ export const getBalanceChange = async (
8585
}
8686

8787
const change = parseBalanceChanges(tx, userAddress);
88-
const tokenThatChanged = await fetchListenMetadata(change.pubkey);
88+
const tokenThatChanged = await fetchTokenMetadataFromJupiter(change.pubkey);
8989

9090
return {
91-
symbol: tokenThatChanged.mpl.symbol,
91+
symbol: tokenThatChanged.symbol,
9292
pubkey: change.pubkey,
9393
uiAmount: change.uiAmount,
9494
};

listen-interface/src/lib/listen.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

listen-interface/src/lib/solanaPortfolio.ts

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import {
44
LAMPORTS_PER_SOL,
55
PublicKey,
66
} from "@solana/web3.js";
7-
import { fetchListenMetadata } from "./listen";
87
import { tokenMetadataCache } from "./localStorage";
98
import { fetchTokenPrices } from "./price";
109
import { Holding, PortfolioItem, TokenMetadata } from "./types";
11-
import { decodeTokenAccount, imageMap } from "./util";
10+
import { decodeTokenAccount } from "./util";
1211

1312
const TOKEN_PROGRAM_ID = new PublicKey(
1413
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
@@ -57,31 +56,6 @@ function parseHolding(ata: {
5756
}
5857
}
5958

60-
export async function fetchTokenMetadataLegacy(
61-
mint: string,
62-
): Promise<TokenMetadata> {
63-
try {
64-
// listen metadata is cached on server, could cache on client too here
65-
const metadataRaw = await fetchListenMetadata(mint);
66-
const USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
67-
const usdcImage = imageMap[USDC_MINT];
68-
const logoUri =
69-
mint === USDC_MINT ? usdcImage : metadataRaw.mpl.ipfs_metadata?.image;
70-
71-
return {
72-
address: metadataRaw.mint,
73-
name: metadataRaw.mpl.name,
74-
symbol: metadataRaw.mpl.symbol,
75-
decimals: metadataRaw.spl.decimals,
76-
logoURI: logoUri ?? "",
77-
volume24h: 0,
78-
chainId: 1151111081099710,
79-
};
80-
} catch (error) {
81-
console.warn(`Failed to fetch legacy metadata for ${mint}:`, error);
82-
return await fetchTokenMetadataFromJupiter(mint);
83-
}
84-
}
8559

8660
export async function fetchTokenMetadataFromJupiter(
8761
mint: string,

0 commit comments

Comments
 (0)