Disable mweb coins for exchanges (#1919)

* Disable mweb coins for exchanges * Take into consideration to not use non-mweb coins in ALL calculations

Omar Hatem committed Jan 3, 2025 at 08:53 UTC 5ea443235d9343c78ba5d6cc827bd5ccbca3c884
4 files changed +40 -23
lib/bitcoin/cw_bitcoin.dart
+3 -1
@@ -149,7 +149,8 @@ class CWBitcoin extends Bitcoin {
149 }
150
151 @override
152 - Future<int> estimateFakeSendAllTxAmount(Object wallet, TransactionPriority priority) async {
152 + Future<int> estimateFakeSendAllTxAmount(Object wallet, TransactionPriority priority,
153 + {UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any}) async {
154 try {
155 final sk = ECPrivate.random();
156 final electrumWallet = wallet as ElectrumWallet;
@@ -173,6 +174,7 @@ class CWBitcoin extends Bitcoin {
174 ? priority as LitecoinTransactionPriority
175 : priority as BitcoinTransactionPriority,
176 ),
177 + coinTypeToSpendFrom: coinTypeToSpendFrom,
178 );
179
180 return estimatedTx.amount;
lib/view_model/exchange/exchange_view_model.dart
+25 -17
@@ -9,6 +9,7 @@ import 'package:cake_wallet/exchange/provider/stealth_ex_exchange_provider.dart'
9 import 'package:cw_core/crypto_currency.dart';
10 import 'package:cw_core/sync_status.dart';
11 import 'package:cw_core/transaction_priority.dart';
12 +import 'package:cw_core/unspent_coin_type.dart';
13 import 'package:cw_core/utils/print_verbose.dart';
14 import 'package:cw_core/wallet_type.dart';
15 import 'package:hive/hive.dart';
@@ -122,7 +123,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
123 depositAmount = '';
124 receiveAmount = '';
125 receiveAddress = '';
125 - depositAddress = depositCurrency == wallet.currency ? wallet.walletAddresses.addressForExchange : '';
126 + depositAddress =
127 + depositCurrency == wallet.currency ? wallet.walletAddresses.addressForExchange : '';
128 provider = providersForCurrentPair().first;
129 final initialProvider = provider;
130 provider!.checkIsAvailable().then((bool isAvailable) {
@@ -157,8 +159,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
159 wallet.type == WalletType.bitcoinCash;
160
161 bool get hideAddressAfterExchange =>
160 - wallet.type == WalletType.monero ||
161 - wallet.type == WalletType.wownero;
162 + wallet.type == WalletType.monero || wallet.type == WalletType.wownero;
163
164 bool _useTorOnly;
165 final Box<Trade> trades;
@@ -167,17 +168,17 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
168 final SharedPreferences sharedPreferences;
169
170 List<ExchangeProvider> get _allProviders => [
170 - ChangeNowExchangeProvider(settingsStore: _settingsStore),
171 - SideShiftExchangeProvider(),
172 - SimpleSwapExchangeProvider(),
173 - ThorChainExchangeProvider(tradesStore: trades),
174 - if (FeatureFlag.isExolixEnabled) ExolixExchangeProvider(),
175 - QuantexExchangeProvider(),
176 - LetsExchangeExchangeProvider(),
177 - StealthExExchangeProvider(),
178 - TrocadorExchangeProvider(
179 - useTorOnly: _useTorOnly, providerStates: _settingsStore.trocadorProviderStates),
180 - ];
171 + ChangeNowExchangeProvider(settingsStore: _settingsStore),
172 + SideShiftExchangeProvider(),
173 + SimpleSwapExchangeProvider(),
174 + ThorChainExchangeProvider(tradesStore: trades),
175 + if (FeatureFlag.isExolixEnabled) ExolixExchangeProvider(),
176 + QuantexExchangeProvider(),
177 + LetsExchangeExchangeProvider(),
178 + StealthExExchangeProvider(),
179 + TrocadorExchangeProvider(
180 + useTorOnly: _useTorOnly, providerStates: _settingsStore.trocadorProviderStates),
181 + ];
182
183 @observable
184 ExchangeProvider? provider;
@@ -613,8 +614,10 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
614 isReceiveAmountEntered = false;
615 depositAmount = '';
616 receiveAmount = '';
616 - depositAddress = depositCurrency == wallet.currency ? wallet.walletAddresses.addressForExchange : '';
617 - receiveAddress = receiveCurrency == wallet.currency ? wallet.walletAddresses.addressForExchange : '';
617 + depositAddress =
618 + depositCurrency == wallet.currency ? wallet.walletAddresses.addressForExchange : '';
619 + receiveAddress =
620 + receiveCurrency == wallet.currency ? wallet.walletAddresses.addressForExchange : '';
621 isDepositAddressEnabled = !(depositCurrency == wallet.currency);
622 isFixedRateMode = false;
623 _onPairChange();
@@ -640,7 +643,12 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
643 wallet.type == WalletType.bitcoinCash) {
644 final priority = _settingsStore.priority[wallet.type]!;
645
643 - final amount = await bitcoin!.estimateFakeSendAllTxAmount(wallet, priority);
646 + final amount = await bitcoin!.estimateFakeSendAllTxAmount(
647 + wallet,
648 + priority,
649 + coinTypeToSpendFrom:
650 + wallet.type == WalletType.litecoin ? UnspentCoinType.nonMweb : UnspentCoinType.any,
651 + );
652
653 changeDepositAmount(amount: bitcoin!.formatterBitcoinAmountToString(amount: amount));
654 }
lib/view_model/send/send_view_model.dart
+10 -3
@@ -394,7 +394,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
394
395 if (wallet.isHardwareWallet) state = IsAwaitingDeviceResponseState();
396
397 - pendingTransaction = await wallet.createTransaction(_credentials());
397 + pendingTransaction = await wallet.createTransaction(_credentials(provider));
398
399 if (provider is ThorChainExchangeProvider) {
400 final outputCount = pendingTransaction?.outputCount ?? 0;
@@ -522,7 +522,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
522 void setTransactionPriority(TransactionPriority priority) =>
523 _settingsStore.priority[wallet.type] = priority;
524
525 - Object _credentials() {
525 + Object _credentials([ExchangeProvider? provider]) {
526 final priority = _settingsStore.priority[wallet.type];
527
528 if (priority == null &&
@@ -535,7 +535,6 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
535
536 switch (wallet.type) {
537 case WalletType.bitcoin:
538 - case WalletType.litecoin:
538 case WalletType.bitcoinCash:
539 return bitcoin!.createBitcoinTransactionCredentials(
540 outputs,
@@ -543,6 +542,14 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
542 feeRate: customBitcoinFeeRate,
543 coinTypeToSpendFrom: coinTypeToSpendFrom,
544 );
545 + case WalletType.litecoin:
546 + return bitcoin!.createBitcoinTransactionCredentials(
547 + outputs,
548 + priority: priority!,
549 + feeRate: customBitcoinFeeRate,
550 + // if it's an exchange flow then disable sending from mweb coins
551 + coinTypeToSpendFrom: provider != null ? UnspentCoinType.nonMweb : coinTypeToSpendFrom,
552 + );
553
554 case WalletType.monero:
555 return monero!
tool/configure.dart
+2 -2
@@ -109,7 +109,6 @@ import 'package:cw_bitcoin/electrum.dart';
109 import 'package:cw_bitcoin/electrum_transaction_info.dart';
110 import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
111 import 'package:cw_bitcoin/bitcoin_receive_page_option.dart';
112 -import 'package:cw_bitcoin/bitcoin_wallet.dart';
112 import 'package:cw_bitcoin/electrum_wallet.dart';
113 import 'package:cw_bitcoin/bitcoin_unspent.dart';
114 import 'package:cw_bitcoin/bitcoin_mnemonic.dart';
@@ -173,7 +172,8 @@ abstract class Bitcoin {
172 List<ElectrumSubAddress> getSilentPaymentAddresses(Object wallet);
173 List<ElectrumSubAddress> getSilentPaymentReceivedAddresses(Object wallet);
174
176 - Future<int> estimateFakeSendAllTxAmount(Object wallet, TransactionPriority priority);
175 + Future<int> estimateFakeSendAllTxAmount(Object wallet, TransactionPriority priority,
176 + {UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any});
177 List<ElectrumSubAddress> getSubAddresses(Object wallet);
178
179 String formatterBitcoinAmountToString({required int amount});