diff --git a/src/components/layout/Input.svelte b/src/components/layout/Input.svelte index 2fac991..cea4d48 100644 --- a/src/components/layout/Input.svelte +++ b/src/components/layout/Input.svelte @@ -15,6 +15,7 @@ export let placeholder = false; export let isHighlighted = false; export let isInvalid = false; + export let max = 10000000; @@ -110,5 +111,5 @@ - - \ No newline at end of file + + diff --git a/src/components/modals/ClosePosition.svelte b/src/components/modals/ClosePosition.svelte index 4fd8e04..89e8305 100644 --- a/src/components/modals/ClosePosition.svelte +++ b/src/components/modals/ClosePosition.svelte @@ -21,8 +21,36 @@ let amount, isSubmitting, sizeToClosePercent = 0; + function formatMaxCloseSize(size, maxDecimals = 8) { + if (!size) return ''; + const sizeString = `${size}`.trim(); + + if (sizeString.includes('e')) { + const numericSize = Number(sizeString); + if (!Number.isFinite(numericSize) || numericSize <= 0) return ''; + return numericSize.toFixed(18).replace(/\.?0+$/, ''); + } + + const [integerPart, decimalPart = ''] = sizeString.split('.'); + let trimmedDecimal = decimalPart.slice(0, maxDecimals).replace(/0+$/, ''); + + if (!trimmedDecimal && decimalPart && Number(integerPart || 0) === 0 && Number(sizeString) > 0) { + trimmedDecimal = decimalPart.slice(0, 18).replace(/0+$/, ''); + } + + if (!trimmedDecimal) { + return integerPart || '0'; + } + + return `${integerPart || '0'}.${trimmedDecimal}`; + } + + $: formattedMaxSize = formatMaxCloseSize(data.size); + $: amountIsTooLarge = amount && formattedMaxSize && amount * 1 > formattedMaxSize * 1; + async function submit() { if (!amount) return focusInput('Size to Close'); + if (amountIsTooLarge) return focusInput('Size to Close'); isSubmitting = true; const success = await submitCloseOrder({ market: data.market, @@ -92,11 +120,11 @@