From 8039209e904ff50b9830771631e5112cf86af21f Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Fri, 10 Jul 2026 15:21:40 +0200 Subject: [PATCH] feat: add `ToMoney` extension for double type and refactor currency amount conversions --- cw_core/lib/amount/money_double.dart | 13 +++++++++++++ cw_solana/lib/solana_client.dart | 8 ++++---- lib/view_model/exchange/exchange_view_model.dart | 6 +++--- 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 cw_core/lib/amount/money_double.dart diff --git a/cw_core/lib/amount/money_double.dart b/cw_core/lib/amount/money_double.dart new file mode 100644 index 0000000000..b3331c44b3 --- /dev/null +++ b/cw_core/lib/amount/money_double.dart @@ -0,0 +1,13 @@ +import 'dart:math'; +import 'package:cw_core/amount/money.dart'; +import 'package:cw_core/currency.dart'; + +extension ToMoney on double { + /// Turn a double representation of a currency amount to a proper Money representation + /// truncating currencies with more than 20 decimals because double can not handle more + Money? tryToMoney(Currency currency) => + Money.tryParse(toStringAsFixed(min(currency.decimals, 20)), currency); + + Money toMoney(Currency currency) => + Money.parse(toStringAsFixed(min(currency.decimals, 20)), currency); +} diff --git a/cw_solana/lib/solana_client.dart b/cw_solana/lib/solana_client.dart index ad72c74a9c..3bea89e762 100644 --- a/cw_solana/lib/solana_client.dart +++ b/cw_solana/lib/solana_client.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_core/amount/money.dart'; +import 'package:cw_core/amount/money_double.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/currency.dart'; import 'package:cw_core/node.dart'; @@ -654,7 +655,7 @@ class SolanaWalletClient { from: outgoingFrom, to: outgoingTo, id: outgoingId, - amount: Money.parse(outgoingAmount.toStringAsFixed(outgoingToken.decimals), outgoingToken), + amount: outgoingAmount.toMoney(outgoingToken), programId: outgoingMintAddress == null ? SystemProgramConst.programId.address : SPLTokenProgramConst.tokenProgramId.address, @@ -672,7 +673,7 @@ class SolanaWalletClient { from: incomingFrom, to: incomingTo, id: incomingId, - amount: Money.parse(incomingAmount.toStringAsFixed(incomingToken.decimals), incomingToken), + amount: incomingAmount.toMoney(incomingToken), programId: incomingMintAddress == null ? SystemProgramConst.programId.address : SPLTokenProgramConst.tokenProgramId.address, @@ -869,8 +870,7 @@ class SolanaWalletClient { from: sender, to: receiver, id: signature, - amount: Money.parse(amount.toStringAsFixed((splToken ?? CryptoCurrency.sol).decimals), - splToken ?? CryptoCurrency.sol), + amount: amount.toMoney(splToken ?? CryptoCurrency.sol), programId: SPLTokenProgramConst.tokenProgramId.address, blockTimeInInt: blockTime?.toInt() ?? 0, fee: Money.fromInt(fee, CryptoCurrency.sol), diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index e48515bb78..619579b23c 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -45,6 +45,7 @@ import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/utils/exchange_provider_logger.dart'; import 'package:cw_core/amount/amount_sanitizer.dart'; import 'package:cw_core/amount/money.dart'; +import 'package:cw_core/amount/money_double.dart'; import "package:cw_core/wallet_info.dart"; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/dashboard/trades_store.dart'; @@ -804,7 +805,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with } final amount_ = _enteredAmount / (forcedProvider == null ? bestRate : forcedProviderRate); - _depositAmount = Money.tryParse(amount_.toStringAsFixed(depositCurrency.decimals), depositCurrency); + _depositAmount = amount_.tryToMoney(depositCurrency); } @action @@ -863,8 +864,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with } final amount_ = _enteredAmount * (forcedProvider == null ? bestRate : forcedProviderRate); - _receiveAmount = - Money.tryParse(amount_.toStringAsFixed(min(20, receiveCurrency.decimals)), receiveCurrency); + _receiveAmount = amount_.tryToMoney(receiveCurrency); } bool checkIfInputMeetsMinOrMaxCondition(String input) {