import BigNumber from 'bignumber.js' import { useMemo, useState } from 'react' import Button from 'components/Button' import DisplayCurrency from 'components/DisplayCurrency' import Divider from 'components/Divider' import { ArrowRight, ExclamationMarkCircled } from 'components/Icons' import Slider from 'components/Slider' import Switch from 'components/Switch' import Text from 'components/Text' import TokenInput from 'components/TokenInput' import usePrice from 'hooks/usePrice' import { getAmount } from 'utils/accounts' import { BN } from 'utils/helpers' import { Gauge } from 'components/Gauge' import useStore from 'store' interface Props { primaryAmount: BigNumber secondaryAmount: BigNumber primaryAsset: Asset secondaryAsset: Asset account: Account isCustomRatio: boolean onChangeIsCustomRatio: (isCustomRatio: boolean) => void onChangePrimaryAmount: (amount: BigNumber) => void onChangeSecondaryAmount: (amount: BigNumber) => void toggleOpen: (index: number) => void } export default function VaultDeposit(props: Props) { const baseCurrency = useStore((s) => s.baseCurrency) const availablePrimaryAmount = getAmount(props.primaryAsset.denom, props.account.deposits) const availableSecondaryAmount = getAmount(props.secondaryAsset.denom, props.account.deposits) const primaryPrice = usePrice(props.primaryAsset.denom) const secondaryPrice = usePrice(props.secondaryAsset.denom) const primaryValue = useMemo( () => props.primaryAmount.times(primaryPrice), [props.primaryAmount, primaryPrice], ) const secondaryValue = useMemo( () => props.secondaryAmount.times(secondaryPrice), [props.secondaryAmount, secondaryPrice], ) const totalValue = useMemo( () => primaryValue.plus(secondaryValue), [primaryValue, secondaryValue], ) const primaryValuePercentage = useMemo( () => primaryValue.div(totalValue).times(100).decimalPlaces(2).toNumber() || 50, [primaryValue, totalValue], ) const secondaryValuePercentage = useMemo( () => new BigNumber(100).minus(primaryValuePercentage).decimalPlaces(2).toNumber() || 50, [primaryValuePercentage], ) const maxAssetValueNonCustom = useMemo( () => BN( Math.min( availablePrimaryAmount.times(primaryPrice).toNumber(), availableSecondaryAmount.times(secondaryPrice).toNumber(), ), ), [availablePrimaryAmount, primaryPrice, availableSecondaryAmount, secondaryPrice], ) const primaryMax = useMemo( () => props.isCustomRatio ? availablePrimaryAmount : maxAssetValueNonCustom.dividedBy(primaryPrice), [props.isCustomRatio, availablePrimaryAmount, primaryPrice, maxAssetValueNonCustom], ) const secondaryMax = useMemo( () => props.isCustomRatio ? availableSecondaryAmount : maxAssetValueNonCustom.dividedBy(secondaryPrice), [props.isCustomRatio, availableSecondaryAmount, secondaryPrice, maxAssetValueNonCustom], ) const [percentage, setPercentage] = useState( primaryValue.dividedBy(maxAssetValueNonCustom).times(100).decimalPlaces(0).toNumber(), ) const disableInput = (availablePrimaryAmount.isZero() || availableSecondaryAmount.isZero()) && !props.isCustomRatio function handleSwitch() { const isCustomRatioNew = !props.isCustomRatio if (!isCustomRatioNew) { props.onChangePrimaryAmount(BN(0)) props.onChangeSecondaryAmount(BN(0)) setPercentage(0) } props.onChangeIsCustomRatio(isCustomRatioNew) } function onChangePrimaryDeposit(amount: BigNumber) { if (amount.isGreaterThan(primaryMax)) { amount = primaryMax } props.onChangePrimaryAmount(amount) setPercentage(amount.dividedBy(primaryMax).times(100).decimalPlaces(0).toNumber()) if (!props.isCustomRatio) { props.onChangeSecondaryAmount(secondaryMax.multipliedBy(amount.dividedBy(primaryMax))) } } function onChangeSecondaryDeposit(amount: BigNumber) { if (amount.isGreaterThan(secondaryMax)) { amount = secondaryMax } props.onChangeSecondaryAmount(amount) setPercentage(amount.dividedBy(secondaryMax).times(100).decimalPlaces(0).toNumber()) if (!props.isCustomRatio) { props.onChangePrimaryAmount(primaryMax.multipliedBy(amount.dividedBy(secondaryMax))) } } function onChangeSlider(value: number) { setPercentage(value) props.onChangePrimaryAmount(primaryMax.multipliedBy(value / 100)) props.onChangeSecondaryAmount(secondaryMax.multipliedBy(value / 100)) } function getWarningText(asset: Asset) { return `You don't have ${asset.symbol} balance in your account. Toggle custom amount to deposit.` } return (
{!props.isCustomRatio && ( )}
{disableInput ? (
You currently have little to none of one asset. Toggle custom ratio to supply your assets asymmetrically.
) : ( )}
Custom ratio
{`${props.primaryAsset.symbol}-${props.secondaryAsset.symbol} Deposit Value`}
) }