import { ChangeEvent, useMemo, useState } from 'react' import { useAddress } from '@/hooks/useAddress' import { remirrorTokenAbi } from '@/lib/abi' import { addressMap } from '@/lib/address' import { precision } from '@/lib/math' import { wagmiConfig } from '@/lib/wagmi' import { readContract } from '@wagmi/core' import { useDebouncedCallback } from 'use-debounce' import { useAccount, useBalance } from 'wagmi' import { Button } from '../ui/button' import { BuyTokenButton } from './BuyTokenButton' import { useRemirrorBalance } from './hooks/useRemirrorBalance' const formatAmount = (value: string): string => { // Remove leading zeroes and limit decimals return value.replace(/^0+(\d)|(\.\d{18})\d+$/, '$1$2') } export const Transaction = () => { const address = useAddress() const { isConnected } = useAccount() const { data: balanceData } = useBalance({ address }) const [ethAmount, setEthAmount] = useState('0') const [purchasedAmount, setPurchasedAmount] = useState('0') const { isLoading, data: remirrorBalance } = useRemirrorBalance() const ethBalance = useMemo(() => { return balanceData?.value ? precision.toDecimal(balanceData.value).toString() : '0.00' }, [balanceData]) const calculatepurchasedAmount = useDebouncedCallback( async (value: number) => { const amount = await readContract(wagmiConfig, { address: addressMap.RemirrorToken, abi: remirrorTokenAbi, functionName: 'getTokenAmount', args: [precision.token(value, 18)], }) const decimalAmount = precision.toDecimal(amount) if (!ethAmount || !decimalAmount) { setPurchasedAmount('') } else { setPurchasedAmount(decimalAmount.toString()) } }, 400, ) const validateAndSetEthAmount = (value: string) => { // Validate and format input if (/^\d*\.?\d*$/.test(value) && !value.startsWith('.')) { const formattedValue = formatAmount(value) setEthAmount(formattedValue) calculatepurchasedAmount(formattedValue ? parseFloat(formattedValue) : 0) } } const validateAndsetPurchasedAmount = (value: string) => { // Validate and format input if (/^\d*\.?\d*$/.test(value) && !value.startsWith('.')) { // const formattedValue = formatAmount(value) // TODO: setPurchasedAmount // setPurchasedAmount(formattedValue) // TODO: setEthAmount // setEthAmount( // formattedValue // ? (parseFloat(formattedValue) / ETH_TO_BTC_RATE).toFixed(18) // : '', // ) } } const handleMaxClick = () => { setEthAmount(ethBalance) calculatepurchasedAmount(Number(ethBalance)) } const isInsufficientBalance = parseFloat(ethAmount) > parseFloat(ethBalance) const isAmountValid = parseFloat(ethAmount) > 0 && parseFloat(purchasedAmount) > 0 return (

Buy Remirror

Sell
) => validateAndSetEthAmount(e.target.value) } placeholder="Amount in ETH" className="p-2 font-[600] text-[24px] text-[#222222] pl-0 bg-gray-100 rounded w-full border-none focus:border-none outline-none" /> ETH ETH
Balance: {ethBalance}
Buy
) => validateAndsetPurchasedAmount(e.target.value) } placeholder="Amount in PenX" className="p-2 font-[500] text-[24px] text-[#222222] pl-0 bg-gray-100 rounded w-full border-none focus:border-none outline-none" /> PenX Remirror
Balance:{' '} {remirrorBalance ? precision.toDecimal(remirrorBalance).toFixed(4) : '0.00'}
{ setEthAmount('') setPurchasedAmount('') }} isInsufficientBalance={isInsufficientBalance} isAmountValid={isAmountValid} />
) }