import { ChevronDownIcon } from '@heroicons/react/solid' import { Wallet } from '@project-serum/anchor' import { useWallet } from '@solana/wallet-adapter-react' import { useTranslation } from 'next-i18next' import Image from 'next/image' import React, { ChangeEvent, useCallback, useMemo, useState } from 'react' import mangoStore from '../../store/state' import { ModalProps } from '../../types/modal' import { notify } from '../../utils/notifications' import { floorToDecimal } from '../../utils/numbers' import { TokenAccount } from '../../utils/tokens' import ButtonGroup from '../forms/ButtonGroup' import Input from '../forms/Input' import Label from '../forms/Label' import Button, { LinkButton } from '../shared/Button' import DepositTokenList from '../shared/DepositTokenList' import Loading from '../shared/Loading' import Modal from '../shared/Modal' import { EnterBottomExitBottom, FadeInFadeOut } from '../shared/Transitions' interface DepositModalProps { token?: string } type ModalCombinedProps = DepositModalProps & ModalProps export const walletBalanceForToken = ( walletTokens: TokenAccount[], token: string ): { maxAmount: number; maxDecimals: number } => { const group = mangoStore.getState().group const bank = group?.banksMap.get(token) let walletToken if (bank) { const tokenMint = bank?.mint walletToken = tokenMint ? walletTokens.find((t) => t.mint.toString() === tokenMint.toString()) : null } return { maxAmount: walletToken ? walletToken.uiAmount : 0, maxDecimals: bank?.mintDecimals || 6, } } function DepositModal({ isOpen, onClose, token }: ModalCombinedProps) { const { t } = useTranslation('common') const [inputAmount, setInputAmount] = useState('') const [submitting, setSubmitting] = useState(false) const [selectedToken, setSelectedToken] = useState(token || 'USDC') const [showTokenList, setShowTokenList] = useState(false) const [sizePercentage, setSizePercentage] = useState('') const { wallet } = useWallet() const walletTokens = mangoStore((s) => s.wallet.tokens) const tokenMax = useMemo(() => { return walletBalanceForToken(walletTokens, selectedToken) }, [walletTokens, selectedToken]) const setMax = useCallback(() => { setInputAmount(tokenMax.maxAmount.toString()) }, [tokenMax]) const handleSizePercentage = useCallback( (percentage: string) => { setSizePercentage(percentage) let amount = (Number(percentage) / 100) * tokenMax.maxAmount if (percentage !== '100') { amount = floorToDecimal(amount, tokenMax.maxDecimals) } setInputAmount(amount.toString()) }, [tokenMax] ) const handleSelectToken = (token: string) => { setSelectedToken(token) setShowTokenList(false) } const handleDeposit = async () => { const client = mangoStore.getState().client const group = mangoStore.getState().group const actions = mangoStore.getState().actions const mangoAccount = mangoStore.getState().mangoAccount.current if (!mangoAccount || !group) return try { setSubmitting(true) const tx = await client.tokenDeposit( group, mangoAccount, selectedToken, parseFloat(inputAmount) ) notify({ title: 'Transaction confirmed', type: 'success', txid: tx, }) await actions.reloadAccount() actions.fetchWalletTokens(wallet!.adapter as unknown as Wallet) setSubmitting(false) } catch (e: any) { notify({ title: 'Transaction failed', description: e.message, txid: e?.signature, type: 'error', }) console.error('Error depositing:', e) } onClose() } return (

{t('select-token')}

{t('deposit')}

) => setInputAmount(e.target.value) } />
handleSizePercentage(p)} values={['10', '25', '50', '75', '100']} unit="%" />
{/*

{t('health-impact')}

+12%

{t('deposit-value')}

$1,000.00

{t('token-collateral-multiplier', { token: selectedToken })}

0.8x

{t('collateral-value')}

$800.00

*/}
) } export default DepositModal