From 28184e223a6cdbb5709bcf52d7d8379af9c575a3 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 25 Sep 2025 14:52:10 +0200 Subject: [PATCH] feat: add `truncateDecimals` method to EVMChainFormatter and update transaction logic to improve decimal handling (#2540) --- cw_evm/lib/evm_chain_formatter.dart | 10 ++++++++++ cw_evm/lib/evm_chain_wallet.dart | 7 +++++-- cw_evm/test/cw_evm_test.dart | 18 +++++++++++------- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/cw_evm/lib/evm_chain_formatter.dart b/cw_evm/lib/evm_chain_formatter.dart index 797728885..e53737170 100644 --- a/cw_evm/lib/evm_chain_formatter.dart +++ b/cw_evm/lib/evm_chain_formatter.dart @@ -21,6 +21,16 @@ class EVMChainFormatter { } } + static String truncateDecimals(String amount, int decimals) { + final parts = amount.split("."); + + if (parts.length == 2) { + parts[1] = parts[1].substring(0, parts[1].length > decimals ? decimals : parts[1].length); + } + + return parts.join("."); + } + static int _getDividerForInput(String amount) { final result = amount.split('.'); if (result.length > 1) { diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index 5feb3bec8..f7fb244bb 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -490,7 +490,9 @@ abstract class EVMChainWalletBase final totalOriginalAmount = EVMChainFormatter.parseEVMChainAmountToDouble( outputs.fold(0, (acc, value) => acc + (value.formattedCryptoAmount ?? 0))); - totalAmount = parseFixed(totalOriginalAmount.toString(), exponent); + + totalAmount = parseFixed( + EVMChainFormatter.truncateDecimals(totalOriginalAmount.toString(), exponent), exponent); final gasFeesModel = await calculateActualEstimatedFeeForCreateTransaction( amount: totalAmount, @@ -512,7 +514,8 @@ abstract class EVMChainWalletBase final totalOriginalAmount = EVMChainFormatter.parseEVMChainAmountToDouble(output.formattedCryptoAmount ?? 0); - totalAmount = parseFixed(totalOriginalAmount.toString(), exponent); + totalAmount = parseFixed( + EVMChainFormatter.truncateDecimals(totalOriginalAmount.toString(), exponent), exponent); } if (output.sendAll && transactionCurrency is Erc20Token) { diff --git a/cw_evm/test/cw_evm_test.dart b/cw_evm/test/cw_evm_test.dart index 6a4dea276..c0ffd3e16 100644 --- a/cw_evm/test/cw_evm_test.dart +++ b/cw_evm/test/cw_evm_test.dart @@ -1,12 +1,16 @@ +import 'package:cw_evm/evm_chain_formatter.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:cw_evm/cw_evm.dart'; - void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); + group('EVMChainFormatter', () { + group('truncateDecimals', () { + test('no decimals', () => expect(EVMChainFormatter.truncateDecimals("5", 6), "5")); + test('less than max decimals', + () => expect(EVMChainFormatter.truncateDecimals("5.00001", 6), "5.00001")); + test('max decimals', + () => expect(EVMChainFormatter.truncateDecimals("5.000001", 6), "5.000001")); + test('more than max decimals', + () => expect(EVMChainFormatter.truncateDecimals("5.0000001", 6), "5.000000")); + }); }); }