diff --git a/apps/abcswap/src/pages/Swap.tsx b/apps/abcswap/src/pages/Swap.tsx index a0df9e5..c6ee0fd 100644 --- a/apps/abcswap/src/pages/Swap.tsx +++ b/apps/abcswap/src/pages/Swap.tsx @@ -1,20 +1,20 @@ -import { useState } from "react"; -import { useNavigate, useParams } from "react-router-dom"; import { EditIcon, InfoIcon, RepeatIcon } from '@chakra-ui/icons'; import { Box, Button, Checkbox, Flex, HStack, Icon, IconButton, Input, Link, NumberInput, NumberInputField, Text, Tooltip, VStack } from "@chakra-ui/react"; import { ConnectButton } from '@rainbow-me/rainbowkit'; +import { useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; import { formatUnits, parseUnits } from "viem"; import { useAccount, useBalance } from "wagmi"; -import { useProcessTransactions } from "transactions-modal"; -import { TokenSelector } from "commons-ui/src/components/TokenSelector"; -import TermsModal from "commons-ui/src/components/TermsModal"; import PrivacyPolicyModal from "commons-ui/src/components/PrivacyPolicyModal"; +import TermsModal from "commons-ui/src/components/TermsModal"; +import { TokenSelector } from "commons-ui/src/components/TokenSelector"; +import { useProcessTransactions } from "transactions-modal"; +import { formatWithMaxDecimals, trimDecimals } from "commons-ui/src/utils"; import { useAbcInfo } from "../hooks/useAbcInfo"; import { useBondingCurvePrice } from "../hooks/useBondingCurvePrice"; import useSwapSteps from "../hooks/useSwapSteps"; -import { formatWithFixedDecimals } from "commons-ui/src/utils" export default function SimpleConvert() { @@ -65,18 +65,18 @@ export default function SimpleConvert() { const invertedUnitaryPrice = unitaryPrice ? (10n ** BigInt(fromToken.decimals)) ** 2n / unitaryPrice : undefined; function invert() { - setAmount((convertedAmount && formatUnits(convertedAmount, toToken.decimals) || '0')); + setAmount(formatDisplayNumber(convertedAmount && formatUnits(convertedAmount, toToken.decimals) || '0')); setInverted(inverted => !inverted); } function handleSwap() { - const subtitle = `Swapping ${amount} ${fromToken.symbol} to ${formatWithFixedDecimals(convertedAmountFormatted, 3)} ${toToken.symbol}`; + const subtitle = `Swapping ${formatDisplayNumber(amount)} ${fromToken.symbol} to ${formatDisplayNumber(convertedAmountFormatted)} ${toToken.symbol}`; processTransactions("Swapping Tokens", subtitle, steps); } function handleAmountChange(amount: string) { amount = amount.replace(/^0+(?!\.|$)/, ''); // Avoiding leading 0s - /^\d*\.?\d*$/.test(amount) && setAmount(amount); + /^\d*\.?\d*$/.test(amount) && setAmount(trimDecimals(amount, 4)); } function ActionButton(params: { title: string, isDisabled: boolean, onClick: () => void }): JSX.Element { @@ -117,6 +117,10 @@ export default function SimpleConvert() { ) } + function formatDisplayNumber(number: string | undefined) { + return number?formatWithMaxDecimals(number, 4):''; + } + return ( @@ -162,10 +166,10 @@ export default function SimpleConvert() { - Balance: {fromTokenBalance?.formatted} + Balance: {formatDisplayNumber(fromTokenBalance?.formatted)} setAmount(fromTokenBalance?.formatted || '0')}>Max - 1 {fromToken.symbol} = {formatUnits(unitaryPrice || 0n, toToken.decimals)} {toToken.symbol} + 1 {fromToken.symbol} = {formatDisplayNumber(formatUnits(unitaryPrice || 0n, toToken.decimals))} {toToken.symbol}
@@ -188,10 +192,10 @@ export default function SimpleConvert() { - + - Balance: {toTokenBalance?.formatted} - 1 {toToken.symbol} = {formatUnits(invertedUnitaryPrice || 0n, fromToken.decimals)} {fromToken.symbol} + Balance: {formatDisplayNumber(toTokenBalance?.formatted)} + 1 {toToken.symbol} = {formatDisplayNumber(formatUnits(invertedUnitaryPrice || 0n, fromToken.decimals))} {fromToken.symbol} diff --git a/pkg/commons-ui/src/utils.ts b/pkg/commons-ui/src/utils.ts index 48c0e40..f2b6a81 100644 --- a/pkg/commons-ui/src/utils.ts +++ b/pkg/commons-ui/src/utils.ts @@ -1,14 +1,28 @@ -export function formatWithFixedDecimals(value: string, fixedDecimals: number) { - let display = value.toString() - - const negative = display.startsWith('-') - if (negative) display = display.slice(1) - +function parseNumber(value: string) : {isNegative: Boolean, integer: string, fraction: string}{ + const positive = value.startsWith('-'); let [integer, fraction] = [ - display.split('.')[0], - display.split('.')[1] || '' - ] + value.split('.')[0], + value.split('.')[1] || '' + ] + return {isNegative: positive, integer: integer, fraction: fraction} +} + +export function formatWithFixedDecimals(value: string, fixedDecimals: number) { + let {isNegative, integer, fraction} = parseNumber(value); fraction = fraction.padEnd(fixedDecimals, '0') fraction = fraction.slice(0, fixedDecimals) - return `${negative ? '-' : ''}${integer || '0'}${`.${fraction}`}` + return `${isNegative ? '-' : ''}${integer || '0'}${`.${fraction}`}` +} + +export function formatWithMaxDecimals(value: string, maxDecimals: number) { + let {isNegative, integer, fraction} = parseNumber(value); + fraction = fraction.slice(0, maxDecimals) + return `${isNegative ? '-' : ''}${integer || '0'}${fraction.length>0?`.${fraction}`:''}` } + +export function trimDecimals(value: string, maxDecimals: number) { + let {isNegative, integer, fraction} = parseNumber(value); + fraction = fraction.slice(0, maxDecimals) + let hasDecimalSeparator = value.includes('.'); + return `${isNegative ? '-' : ''}${integer || '0'}${hasDecimalSeparator?'.':''}${`${fraction}`}` +} \ No newline at end of file