1deba2059e
* update generated types * added CRO to token info * update contract addresses to match latest deployment * feat: token prices fetched from oracle contract * trade page initial commit * trade asset action hook * extract max swap amount logic into custom hook * trade component ui adjustments * trade container min-width and some styling improvements * trade success message and loading indicator * normalize naming conventions on trading * max swap amount formula adjustments * trade execute msg with borrow. code cleanup * fix: click max update tokenOut amount. remove wallet from fund denom * delay token amount decimal conversion. input formatting * increase hardcoded gas * renamed max swappable amount hook * display token prices and market information on landing page * reset trade amounts when selected account change * max trade amount cleanup and minor performance optimizations * fix: liabilities value with 1 hour interest buffer for trade action * add token symbol to wallet and account labels * swap trade pairs icon and basic functionality * remove unnecessary optional chaining. comment adjusted * refactor useTokenPrices to build query dynamically on tokens data * extracted trade container and respective functionality into separate file * fix: properly calculate positions after full swap * mp-1218: trading using wallet
67 lines
1.5 KiB
TypeScript
67 lines
1.5 KiB
TypeScript
import { useQuery } from '@tanstack/react-query'
|
|
import { useMemo } from 'react'
|
|
import { gql, request } from 'graphql-request'
|
|
|
|
import { contractAddresses } from 'config/contracts'
|
|
import { queryKeys } from 'types/query-keys-factory'
|
|
import { chain } from 'utils/chains'
|
|
import tokenInfo from 'config/tokenInfo'
|
|
|
|
interface Result {
|
|
prices: {
|
|
[key: string]: {
|
|
denom: string
|
|
price: string
|
|
}
|
|
}
|
|
}
|
|
|
|
const tokenInfoList = Object.values(tokenInfo)
|
|
|
|
// TODO: build gql query dynamically on whitelisted tokens
|
|
const fetchTokenPrices = () => {
|
|
return request(
|
|
chain.hive,
|
|
gql`
|
|
query PriceOracle {
|
|
prices: wasm {
|
|
${tokenInfoList.map((token) => {
|
|
return `${token.symbol}: contractQuery(
|
|
contractAddress: "${contractAddresses.oracle}"
|
|
query: {
|
|
price: {
|
|
denom: "${token.denom}"
|
|
}
|
|
}
|
|
)`
|
|
})}
|
|
}
|
|
}
|
|
`,
|
|
)
|
|
}
|
|
|
|
const useTokenPrices = () => {
|
|
const result = useQuery<Result>(queryKeys.tokenPrices(), fetchTokenPrices, {
|
|
refetchInterval: 30000,
|
|
staleTime: Infinity,
|
|
})
|
|
|
|
return {
|
|
...result,
|
|
data: useMemo(() => {
|
|
if (!result.data) return
|
|
|
|
return Object.values(result.data?.prices).reduce(
|
|
(acc, entry) => ({
|
|
...acc,
|
|
[entry.denom]: Number(entry.price),
|
|
}),
|
|
{},
|
|
) as { [key in string]: number }
|
|
}, [result.data]),
|
|
}
|
|
}
|
|
|
|
export default useTokenPrices
|