mango-v4-ui/hooks/useOracleProvider.ts

63 lines
1.7 KiB
TypeScript
Raw Normal View History

import {
Bank,
OracleProvider,
PerpMarket,
Serum3Market,
} from '@blockworks-foundation/mango-v4'
2023-05-01 03:55:22 -07:00
import mangoStore from '@store/mangoStore'
import { useMemo } from 'react'
import { formatTokenSymbol } from 'utils/tokens'
import useSelectedMarket from './useSelectedMarket'
export const getOracleProvider = (
2023-07-21 11:47:53 -07:00
marketOrBank: PerpMarket | Serum3Market | Bank,
) => {
let marketOrBase: PerpMarket | Bank
let name: string
if (marketOrBank instanceof Bank) {
marketOrBase = marketOrBank
name = formatTokenSymbol(marketOrBank.name)
} else if (marketOrBank instanceof PerpMarket) {
marketOrBase = marketOrBank
name = marketOrBank.name.split('-')[0]
} else {
2023-05-01 03:55:22 -07:00
const group = mangoStore.getState().group
if (!group) return ['Unavailable', '']
const baseBank = group.getFirstBankByTokenIndex(marketOrBank.baseTokenIndex)
marketOrBase = baseBank
name = formatTokenSymbol(baseBank.name)
}
if (name === 'USDC') return ['N/A', '']
switch (marketOrBase.oracleProvider) {
case OracleProvider.Pyth:
return [
'Pyth',
`https://pyth.network/price-feeds/crypto-${name.toLowerCase()}-usd`,
]
case OracleProvider.Switchboard:
return [
'Switchboard',
2023-09-06 03:46:40 -07:00
`https://app.switchboard.xyz/solana/mainnet-beta/feed/${marketOrBase.oracle.toString()}`,
]
case OracleProvider.Stub:
return ['Stub', '']
default:
return ['Unknown', '']
}
}
const useOracleProvider = () => {
const { selectedMarket } = useSelectedMarket()
const [oracleProvider, oracleLinkPath] = useMemo(() => {
2023-05-01 03:55:22 -07:00
if (!selectedMarket) return ['', '']
return getOracleProvider(selectedMarket)
}, [selectedMarket])
return { oracleProvider, oracleLinkPath }
}
export default useOracleProvider