mango-v4-ui/hooks/useOracleProvider.ts

66 lines
1.8 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)
}
2023-12-27 17:50:20 -08:00
if (name === 'RENDER') {
name = 'RNDR'
}
switch (marketOrBase.oracleProvider) {
case OracleProvider.Pyth:
return [
'Pyth',
`https://pyth.network/price-feeds/crypto-${name.toLowerCase()}-usd`,
]
case OracleProvider.Switchboard:
return [
'Switchboard',
2024-04-01 05:24:44 -07:00
`https://app.switchboard.xyz/solana/mainnet/feed/${marketOrBase.oracle.toString()}`,
]
case OracleProvider.Stub:
return ['Stub', '']
default:
return ['Unknown', '']
}
}
2024-01-26 06:41:34 -08:00
//will use selected market from mango store if no bank provided
const useOracleProvider = (bank?: Bank) => {
const { selectedMarket } = useSelectedMarket()
const [oracleProvider, oracleLinkPath] = useMemo(() => {
2023-05-01 03:55:22 -07:00
if (!selectedMarket) return ['', '']
2024-01-26 06:41:34 -08:00
return getOracleProvider(bank || selectedMarket)
}, [selectedMarket, bank])
return { oracleProvider, oracleLinkPath }
}
export default useOracleProvider