mango-v4-ui/hooks/useSelectedMarket.ts

118 lines
3.5 KiB
TypeScript
Raw Normal View History

2022-11-19 17:40:06 -08:00
import { Serum3Market } from '@blockworks-foundation/mango-v4'
import mangoStore from '@store/mangoStore'
import { useMemo } from 'react'
2023-04-25 05:41:23 -07:00
import { floorToDecimal, getDecimalCount } from 'utils/numbers'
2023-01-14 21:01:30 -08:00
import useJupiterMints from './useJupiterMints'
2022-11-19 17:40:06 -08:00
import useMangoGroup from './useMangoGroup'
2023-07-09 18:33:09 -07:00
import { CUSTOM_TOKEN_ICONS } from 'utils/constants'
2022-11-19 17:40:06 -08:00
export default function useSelectedMarket() {
const { group } = useMangoGroup()
const selectedMarket = mangoStore((s) => s.selectedMarket.current)
2023-01-14 21:01:30 -08:00
const { mangoTokens } = useJupiterMints()
2022-11-19 17:40:06 -08:00
const marketAddress = useMemo(() => {
return selectedMarket?.publicKey.toString()
}, [selectedMarket])
2022-11-19 17:40:06 -08:00
const price: number = useMemo(() => {
if (!group) return 0
if (selectedMarket instanceof Serum3Market) {
const baseBank = group.getFirstBankByTokenIndex(
2023-07-21 11:47:53 -07:00
selectedMarket.baseTokenIndex,
2022-11-19 17:40:06 -08:00
)
2023-04-25 05:41:23 -07:00
const quoteBank = group.getFirstBankByTokenIndex(
2023-07-21 11:47:53 -07:00
selectedMarket.quoteTokenIndex,
2023-04-25 05:41:23 -07:00
)
const market = group.getSerum3ExternalMarket(
2023-07-21 11:47:53 -07:00
selectedMarket.serumMarketExternal,
2023-04-25 05:41:23 -07:00
)
2022-11-19 17:40:06 -08:00
2023-04-25 05:41:23 -07:00
return floorToDecimal(
baseBank.uiPrice / quoteBank.uiPrice,
2023-07-21 11:47:53 -07:00
getDecimalCount(market.tickSize),
2023-04-25 05:41:23 -07:00
).toNumber()
2022-11-19 17:40:06 -08:00
} else if (selectedMarket) {
return selectedMarket._uiPrice
} else return 0
}, [selectedMarket, group])
2022-11-20 20:52:03 -08:00
const serumOrPerpMarket = useMemo(() => {
const group = mangoStore.getState().group
if (!group || !selectedMarket) return
if (selectedMarket instanceof Serum3Market) {
return group?.getSerum3ExternalMarket(selectedMarket.serumMarketExternal)
} else {
return selectedMarket
}
}, [selectedMarket])
2023-01-14 21:01:30 -08:00
const baseSymbol = useMemo(() => {
return selectedMarket?.name.split(/-|\//)[0]
}, [selectedMarket])
const baseLogoURI = useMemo(() => {
if (!baseSymbol || !mangoTokens.length) return ''
2023-07-09 18:33:09 -07:00
const lowerCaseBaseSymbol = baseSymbol.toLowerCase()
const hasCustomIcon = CUSTOM_TOKEN_ICONS[lowerCaseBaseSymbol]
if (hasCustomIcon) {
return `/icons/${lowerCaseBaseSymbol}.svg`
} else {
const token =
mangoTokens.find(
2023-07-21 11:47:53 -07:00
(t) => t.symbol.toLowerCase() === lowerCaseBaseSymbol,
2023-07-09 18:33:09 -07:00
) ||
2023-07-22 13:44:43 -07:00
mangoTokens.find(
(t) => t.symbol.toLowerCase()?.includes(lowerCaseBaseSymbol),
2023-07-09 18:33:09 -07:00
)
if (token) {
return token.logoURI
}
2023-01-14 21:01:30 -08:00
}
}, [baseSymbol, mangoTokens])
const quoteBank = useMemo(() => {
const group = mangoStore.getState().group
if (!group || !selectedMarket) return
const tokenIdx =
selectedMarket instanceof Serum3Market
? selectedMarket.quoteTokenIndex
: selectedMarket?.settleTokenIndex
return group?.getFirstBankByTokenIndex(tokenIdx)
}, [selectedMarket])
const quoteSymbol = useMemo(() => {
return quoteBank?.name
}, [quoteBank])
const quoteLogoURI = useMemo(() => {
if (!quoteSymbol || !mangoTokens.length) return ''
2023-07-09 18:33:09 -07:00
const lowerCaseQuoteSymbol = quoteSymbol.toLowerCase()
const hasCustomIcon = CUSTOM_TOKEN_ICONS[lowerCaseQuoteSymbol]
if (hasCustomIcon) {
return `/icons/${lowerCaseQuoteSymbol}.svg`
} else {
const token = mangoTokens.find(
2023-07-21 11:47:53 -07:00
(t) => t.symbol.toLowerCase() === lowerCaseQuoteSymbol,
2023-07-09 18:33:09 -07:00
)
if (token) {
return token.logoURI
}
2023-01-14 21:01:30 -08:00
}
}, [quoteSymbol, mangoTokens])
return {
selectedMarket,
selectedMarketAddress: marketAddress,
2023-01-14 21:01:30 -08:00
price,
serumOrPerpMarket,
baseSymbol,
quoteBank,
2023-01-14 21:01:30 -08:00
quoteSymbol,
baseLogoURI,
quoteLogoURI,
2023-12-07 19:52:18 -08:00
marketAddress,
2023-01-14 21:01:30 -08:00
}
2022-11-19 17:40:06 -08:00
}