import BigNumber from 'bignumber.js' import { useCallback, useEffect, useMemo, useState } from 'react' import Modal from 'components/Modals/Modal' import AccountSummaryInModal from 'components/account/AccountSummary/AccountSummaryInModal' import Button from 'components/common/Button' import Card from 'components/common/Card' import DisplayCurrency from 'components/common/DisplayCurrency' import Divider from 'components/common/Divider' import { FormattedNumber } from 'components/common/FormattedNumber' import { ArrowRight, InfoCircle } from 'components/common/Icons' import Text from 'components/common/Text' import TitleAndSubCell from 'components/common/TitleAndSubCell' import TokenInputWithSlider from 'components/common/TokenInput/TokenInputWithSlider' import AssetImage from 'components/common/assets/AssetImage' import { BN_ZERO } from 'constants/math' import useBaseAsset from 'hooks/assets/useBasetAsset' import useMarkets from 'hooks/markets/useMarkets' import useCurrentWalletBalance from 'hooks/useCurrentWalletBalance' import { useUpdatedAccount } from 'hooks/useUpdatedAccount' import useStore from 'store' import { BNCoin } from 'types/classes/BNCoin' import { formatPercent } from 'utils/formatters' import { BN } from 'utils/helpers' import { getDebtAmountWithInterest } from 'utils/tokens' interface Props { account: Account } function RepayNotAvailable(props: { asset: Asset }) { return (
No funds for repay {`Unfortunately you don't have any ${props.asset.symbol} in your Wallet to repay the debt.`}
) } export default function Repay(props: Props) { const { account } = props const modal = useStore((s) => s.v1BorrowAndRepayModal) const baseAsset = useBaseAsset() const asset = modal?.data.asset ?? baseAsset const [amount, setAmount] = useState(BN_ZERO) const balance = useCurrentWalletBalance(asset.denom) const v1Action = useStore((s) => s.v1Action) const [max, setMax] = useState(BN_ZERO) const { simulateRepay } = useUpdatedAccount(account) const apy = modal?.data.apy.borrow ?? 0 const accountDebt = modal?.data.accountDebtAmount ?? BN_ZERO const markets = useMarkets() const accountDebtWithInterest = useMemo( () => getDebtAmountWithInterest(accountDebt, apy), [accountDebt, apy], ) const overpayExeedsCap = useMemo(() => { const marketAsset = markets.find((market) => market.asset.denom === asset.denom) if (!marketAsset) return const overpayAmount = accountDebtWithInterest.minus(accountDebt) const marketCapAfterOverpay = marketAsset.cap.used.plus(overpayAmount) return marketAsset.cap.max.isLessThanOrEqualTo(marketCapAfterOverpay) }, [markets, asset.denom, accountDebt, accountDebtWithInterest]) const maxRepayAmount = useMemo(() => { const maxBalance = BN(balance?.amount ?? 0) return BigNumber.min(maxBalance, overpayExeedsCap ? accountDebt : accountDebtWithInterest) }, [accountDebtWithInterest, overpayExeedsCap, accountDebt, balance?.amount]) const close = useCallback(() => { setAmount(BN_ZERO) useStore.setState({ v1BorrowAndRepayModal: null }) }, [setAmount]) const onConfirmClick = useCallback(() => { v1Action('repay', BNCoin.fromDenomAndBigNumber(asset.denom, amount)) close() }, [v1Action, asset, amount, close]) const handleChange = useCallback( (newAmount: BigNumber) => { if (!amount.isEqualTo(newAmount)) setAmount(newAmount) }, [amount, setAmount], ) const onDebounce = useCallback(() => { const repayCoin = BNCoin.fromDenomAndBigNumber( asset.denom, amount.isGreaterThan(accountDebt) ? accountDebt : amount, ) simulateRepay(repayCoin, true) }, [amount, accountDebt, asset, simulateRepay]) useEffect(() => { if (maxRepayAmount.isEqualTo(max)) return setMax(maxRepayAmount) }, [max, maxRepayAmount]) useEffect(() => { if (amount.isLessThanOrEqualTo(max)) return handleChange(max) setAmount(max) }, [amount, max, handleChange]) if (!modal) return null return ( {'Repay'} {asset.symbol} } headerClassName='gradient-header pl-2 pr-2.5 py-2.5 border-b-white/5 border-b' contentClassName='flex flex-col' >
Total Borrowed
Liquidity available
{maxRepayAmount.isZero() && }
) }