mars-v2-frontend/hooks/useTokenPrices.tsx
Gustavo Mauricio 1deba2059e
MP-1699: Trade on Margin Account (#52)
* 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
2022-11-22 10:14:12 +01:00

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