diff --git a/packages/shared/components/inputs/Amount.svelte b/packages/shared/components/inputs/Amount.svelte index aa453ff2569..bb7610cb153 100644 --- a/packages/shared/components/inputs/Amount.svelte +++ b/packages/shared/components/inputs/Amount.svelte @@ -1,7 +1,6 @@ + + {label || locale('general.amount')} @@ -40,25 +57,23 @@ bind:value={amount} {disabled} /> - + + {/each} diff --git a/packages/shared/locales/en.json b/packages/shared/locales/en.json index 38c2e842503..fd0bde935ab 100644 --- a/packages/shared/locales/en.json +++ b/packages/shared/locales/en.json @@ -549,6 +549,8 @@ "send": { "addressLength": "Addresses should be {length} characters long.", "amountTooHigh": "This is greater than your available balance.", + "amountNoFloat": "If units are `i` you cannot use decimal places.", + "amountInvalidFormat": "The amount appears to be an invalid number.", "amountZero": "The amount must be greater than 0.", "wrongAddressFormat": "Addresses start with the prefix {prefix}.", "insufficientFunds": "This account has insufficient funds" diff --git a/packages/shared/routes/dashboard/wallet/views/Send.svelte b/packages/shared/routes/dashboard/wallet/views/Send.svelte index 982af9b74f1..f9117de4d28 100644 --- a/packages/shared/routes/dashboard/wallet/views/Send.svelte +++ b/packages/shared/routes/dashboard/wallet/views/Send.svelte @@ -24,7 +24,7 @@ let selectedSendType = SEND_TYPE.EXTERNAL let unit = Unit.Mi - let amount = convertUnits($sendParams.amount, Unit.i, unit) + let amount = convertUnits($sendParams.amount, Unit.i, unit).toString() let to = undefined let amountError = '' let addressPrefix = ($account ?? $accounts[0]).depositAddress.split('1')[0] @@ -68,7 +68,6 @@ $: accountsDropdownItems = $accounts.map((acc) => format(acc)) $: from = $account ? format($account) : accountsDropdownItems[0] - $: $sendParams.amount = convertUnits(amount, unit, Unit.i) const handleSendTypeClick = (type) => { selectedSendType = type @@ -91,42 +90,55 @@ const handleSendClick = () => { amountError = '' addressError = '' - if ($sendParams.amount > from.balance) { - amountError = locale('error.send.amountTooHigh') - } else if ($sendParams.amount <= 0) { - amountError = locale('error.send.amountZero') - } - if (selectedSendType === SEND_TYPE.EXTERNAL) { - // Validate address length - if ($sendParams.address.length !== ADDRESS_LENGTH) { - addressError = locale('error.send.addressLength', { - values: { - length: ADDRESS_LENGTH, - }, - }) - } else if (!validateBech32Address(addressPrefix, $sendParams.address)) { - addressError = locale('error.send.wrongAddressFormat', { - values: { - prefix: addressPrefix, - }, - }) + + if (unit === Unit.i && Number.parseInt(amount, 10).toString() !== amount) { + amountError = locale('error.send.amountNoFloat') + } else { + let amountAsFloat = Number.parseFloat(amount) + if (amountAsFloat.toString() !== amount) { + amountError = locale('error.send.amountInvalidFormat') + } else if (amountAsFloat > from.balance) { + amountError = locale('error.send.amountTooHigh') + } else if (amountAsFloat <= 0) { + amountError = locale('error.send.amountZero') } - } - if (!amountError && !addressError) { - if (selectedSendType === SEND_TYPE.INTERNAL) { - internalTransfer(from.id, to.id, $sendParams.amount) - } else { - send(from.id, $sendParams.address, $sendParams.amount) + if (selectedSendType === SEND_TYPE.EXTERNAL) { + // Validate address length + if ($sendParams.address.length !== ADDRESS_LENGTH) { + addressError = locale('error.send.addressLength', { + values: { + length: ADDRESS_LENGTH, + }, + }) + } else if (!validateBech32Address(addressPrefix, $sendParams.address)) { + addressError = locale('error.send.wrongAddressFormat', { + values: { + prefix: addressPrefix, + }, + }) + } + } + + if (!amountError && !addressError) { + $sendParams.amount = convertUnits(amountAsFloat, unit, Unit.i) + + if (selectedSendType === SEND_TYPE.INTERNAL) { + internalTransfer(from.id, to.id, $sendParams.amount) + } else { + send(from.id, $sendParams.address, $sendParams.amount) + } } } } + const handleBackClick = () => { accountRoute.set(AccountRoutes.Init) if (!$account) { walletRoute.set(WalletRoutes.Init) } } + const format = (account: WalletAccount) => { return { ...account, @@ -135,7 +147,7 @@ } } const handleMaxClick = () => { - amount = convertUnits(from.balance, Unit.i, unit) + amount = convertUnits(from.balance, Unit.i, unit).toString() } onMount(() => { to = $accounts.length === 2 ? accountsDropdownItems[from.id === $accounts[0].id ? 1 : 0] : to