import DailyRange from '@components/shared/DailyRange' import { useTranslation } from 'next-i18next' import { useRouter } from 'next/router' import { useMemo, useState } from 'react' import Link from 'next/link' import SheenLoader from '@components/shared/SheenLoader' import useMangoGroup from 'hooks/useMangoGroup' import useJupiterMints from 'hooks/useJupiterMints' import ActionPanel from './ActionPanel' import ChartTabs from './ChartTabs' import { useQuery } from '@tanstack/react-query' import TopTokenAccounts from './TopTokenAccounts' import TokenParams from './TokenParams' import { formatTokenSymbol } from 'utils/tokens' import TokenLogo from '@components/shared/TokenLogo' import { ArrowLeftIcon, ArrowTopRightOnSquareIcon, ArrowTrendingUpIcon, ArrowsRightLeftIcon, } from '@heroicons/react/20/solid' import RateCurveChart from './RateCurveChart' import PriceChart from './PriceChart' import Button from '@components/shared/Button' import mangoStore from '@store/mangoStore' import { fetchCMSTokenPage } from 'utils/contentful' const DEFAULT_COINGECKO_VALUES = { ath: 0, atl: 0, ath_change_percentage: 0, atl_change_percentage: 0, ath_date: 0, atl_date: 0, high_24h: { usd: 0 }, circulating_supply: 0, fully_diluted_valuation: 0, low_24h: { usd: 0 }, market_cap: 0, max_supply: 0, price_change_percentage_24h: 0, total_supply: 0, total_volume: 0, } type CryptoStatsResponse = { high_24h: Record low_24h: Record price_change_percentage_24h: number } export type CoingeckoDataType = { market_data: CryptoStatsResponse name: string } const fetchTokenInfo = async (tokenId: string | undefined) => { if (!tokenId) return const response = await fetch( `https://api.coingecko.com/api/v3/coins/${tokenId}?localization=false&tickers=false&developer_data=false&sparkline=false&community_data=false `, ) const data = await response.json() return data } const TokenPage = () => { const { t } = useTranslation(['common', 'token']) const [loading, setLoading] = useState(true) const router = useRouter() const { token } = router.query const { group } = useMangoGroup() const { mangoTokens } = useJupiterMints() const spotMarkets = mangoStore((s) => s.serumMarkets) const bankName = useMemo(() => { if (!token) return return token === 'wBTC' ? 'wBTC (Portal)' : token === 'ETH' ? 'ETH (Portal)' : token.toString() }, [token]) const bank = useMemo(() => { if (group && bankName) { const bank = group.banksMapByName.get(bankName) if (bank) { return bank[0] } else { setLoading(false) } } }, [group, bankName]) const coingeckoId = useMemo(() => { if (bank && mangoTokens.length) { return mangoTokens.find((t) => t.address === bank.mint.toString()) ?.extensions?.coingeckoId } }, [bank, mangoTokens]) const { data: coingeckoTokenInfo } = useQuery( ['coingecko-token-info', coingeckoId], () => fetchTokenInfo(coingeckoId), { cacheTime: 1000 * 60 * 15, staleTime: 1000 * 60 * 5, retry: 3, refetchOnWindowFocus: false, enabled: !!coingeckoId, }, ) const { data: cmsTokenData } = useQuery( ['cms-token-data', bankName], () => fetchCMSTokenPage(bankName), { cacheTime: 1000 * 60 * 15, staleTime: 1000 * 60 * 5, retry: 3, refetchOnWindowFocus: false, enabled: !!bankName, }, ) const { high_24h, low_24h } = coingeckoTokenInfo?.market_data ? coingeckoTokenInfo.market_data : DEFAULT_COINGECKO_VALUES const formatCoingeckoName = (name: string) => { if (name === 'Wrapped Solana') return 'Solana' if (name.includes('Wormhole')) return name.replace('Wormhole', 'Portal') return name } const handleTrade = () => { const markets = spotMarkets.filter( (m) => m.baseTokenIndex === bank?.tokenIndex, ) if (markets) { if (markets.length === 1) { router.push(`/trade?name=${markets[0].name}`) } if (markets.length > 1) { const market = markets.find((mkt) => !mkt.reduceOnly) if (market) { router.push(`/trade?name=${market.name}`) } } } } const handleSwap = () => { if (bank?.name === 'USDC') { router.push(`/swap?in=USDC&out=SOL`) } else { router.push(`/swap?in=USDC&out=${bank?.name}`) } } return ( <>
{bank ? ( {formatTokenSymbol(bank.name)} ) : null}
{bank && bankName ? ( <>
{coingeckoTokenInfo?.name ? (

{formatCoingeckoName(coingeckoTokenInfo.name)}

) : (

{bank.name}

)} {cmsTokenData?.length ? ( What is {bank?.name}? ) : null}
{high_24h.usd && low_24h.usd ? ( ) : null}
{/* {coingeckoTokenInfo?.market_data ? ( ) : loadingCoingeckoInfo && coingeckoId ? (
) : (
🦎

No CoinGecko data...

)} */} {/*

{bank?.name} on Mango

*/}
) : loading ? (
) : (

😔

{t('token:token-not-found')}

{t('token:token-not-found-desc', { token: token })}

{t('token:go-to-account')}
)} ) } export default TokenPage