import BigNumber from 'bignumber.js' import { useMemo, useRef, useState } from 'react' import BorrowTable from 'components/Borrow/BorrowTable' import BorrowModal from 'components/BorrowModal' import Card from 'components/Card' import RepayModal from 'components/RepayModal' import Text from 'components/Text' import useAllowedCoins from 'hooks/useAllowedCoins' import useCreditAccountPositions from 'hooks/useCreditAccountPositions' import useMarkets from 'hooks/useMarkets' import useRedbankBalances from 'hooks/useRedbankBalances' import useTokenPrices from 'hooks/useTokenPrices' import useCreditManagerStore from 'stores/useCreditManagerStore' import { getTokenDecimals, getTokenInfo } from 'utils/tokens' type ModalState = { show: 'borrow' | 'repay' | false data: { tokenDenom: string } } const Borrow = () => { const [modalState, setModalState] = useState({ show: false, data: { tokenDenom: '' }, }) const selectedAccount = useCreditManagerStore((s) => s.selectedAccount) const { data: allowedCoinsData } = useAllowedCoins() const { data: positionsData } = useCreditAccountPositions(selectedAccount ?? '') const { data: marketsData } = useMarkets() const { data: tokenPrices } = useTokenPrices() const { data: redbankBalances } = useRedbankBalances() // recreate modals and reset state whenever ref changes const modalId = useRef(0) const borrowedAssetsMap = useMemo(() => { let borrowedAssetsMap: Map = new Map() positionsData?.debts.forEach((coin) => { borrowedAssetsMap.set(coin.denom, coin.amount) }) return borrowedAssetsMap }, [positionsData]) const { borrowedAssets, notBorrowedAssets } = useMemo(() => { return { borrowedAssets: allowedCoinsData ?.filter((denom) => borrowedAssetsMap.has(denom)) .map((denom) => { const { symbol, chain, icon } = getTokenInfo(denom) const borrowRate = Number(marketsData?.[denom].borrow_rate) || 0 const marketLiquidity = BigNumber(redbankBalances?.[denom] ?? 0) .div(10 ** getTokenDecimals(denom)) .toNumber() const borrowAmount = BigNumber(borrowedAssetsMap.get(denom) as string) .div(10 ** getTokenDecimals(denom)) .toNumber() const borrowValue = borrowAmount * (tokenPrices?.[denom] ?? 0) const rowData = { denom, symbol, icon, chain, borrowed: { amount: borrowAmount, value: borrowValue, }, borrowRate, marketLiquidity, } return rowData }) ?? [], notBorrowedAssets: allowedCoinsData ?.filter((denom) => !borrowedAssetsMap.has(denom)) .map((denom) => { const { symbol, chain, icon } = getTokenInfo(denom) const borrowRate = Number(marketsData?.[denom].borrow_rate) || 0 const marketLiquidity = BigNumber(redbankBalances?.[denom] ?? 0) .div(10 ** getTokenDecimals(denom)) .toNumber() const rowData = { denom, symbol, icon, chain, borrowed: null, borrowRate, marketLiquidity, } return rowData }) ?? [], } }, [allowedCoinsData, borrowedAssetsMap, marketsData, redbankBalances, tokenPrices]) const handleBorrowClick = (denom: string) => { setModalState({ show: 'borrow', data: { tokenDenom: denom } }) modalId.current += 1 } const handleRepayClick = (denom: string) => { setModalState({ show: 'repay', data: { tokenDenom: denom } }) modalId.current += 1 } return (
Borrowings
Available to Borrow
setModalState({ ...modalState, show: false })} /> setModalState({ ...modalState, show: false })} />
) } export default Borrow