import { Bank, PerpMarket } from '@blockworks-foundation/mango-v4' import { IconButton } from '@components/shared/Button' import { ChartBarIcon } from '@heroicons/react/20/solid' import mangoStore from '@store/mangoStore' import useSelectedMarket from 'hooks/useSelectedMarket' import { useTranslation } from 'next-i18next' import { useEffect, useState } from 'react' import { formatCurrencyValue, getDecimalCount, numberCompacter, } from 'utils/numbers' import MarketSelectDropdown from './MarketSelectDropdown' import PerpFundingRate from './PerpFundingRate' import { BorshAccountsCoder } from '@coral-xyz/anchor' const AdvancedMarketHeader = ({ showChart, setShowChart, }: { showChart?: boolean setShowChart?: (x: boolean) => void }) => { const { t } = useTranslation(['common', 'trade']) // const perpStats = mangoStore((s) => s.perpStats.data) const { serumOrPerpMarket, price: stalePrice, selectedMarket, } = useSelectedMarket() // const selectedMarketName = mangoStore((s) => s.selectedMarket.name) const connection = mangoStore((s) => s.connection) const [price, setPrice] = useState(stalePrice) //subscribe to the market oracle account useEffect(() => { const client = mangoStore.getState().client const group = mangoStore.getState().group if (!group || !selectedMarket) return let marketOrBank: PerpMarket | Bank let decimals: number if (selectedMarket instanceof PerpMarket) { marketOrBank = selectedMarket decimals = selectedMarket.baseDecimals } else { const baseBank = group.getFirstBankByTokenIndex( selectedMarket.baseTokenIndex ) marketOrBank = baseBank decimals = group.getMintDecimals(baseBank.mint) } const coder = new BorshAccountsCoder(client.program.idl) const subId = connection.onAccountChange( marketOrBank.oracle, async (info, _context) => { // selectedMarket = mangoStore.getState().selectedMarket.current // if (!(selectedMarket instanceof PerpMarket)) return const { price, uiPrice, lastUpdatedSlot } = await group.decodePriceFromOracleAi( coder, marketOrBank.oracle, info, decimals, client ) marketOrBank._price = price marketOrBank._uiPrice = uiPrice setPrice(uiPrice) marketOrBank._oracleLastUpdatedSlot = lastUpdatedSlot }, 'processed' ) return () => { if (typeof subId !== 'undefined') { connection.removeAccountChangeListener(subId) } } }, [connection, selectedMarket]) useEffect(() => { if (serumOrPerpMarket instanceof PerpMarket) { const actions = mangoStore.getState().actions actions.fetchPerpStats() } }, [serumOrPerpMarket]) return (