Cw 940 reduce impossible api calls to trocador (#2050)

* skip Impossible API calls on exchange flow * call calculateBestRate from loadLimits --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

Serhii committed Mar 13, 2025 at 03:00 UTC 4f35cc9b0fd24078efb68b8037ea1883704bbb79
1 file changed +71 -25
lib/view_model/exchange/exchange_view_model.dart
+71 -25
@@ -116,7 +116,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
116 .toList());
117
118 _setAvailableProviders();
119 - calculateBestRate();
119
120 autorun((_) {
121 if (selectedProviders.any((provider) => provider is TrocadorExchangeProvider)) {
@@ -154,9 +153,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
153 _defineIsReceiveAmountEditable();
154 loadLimits();
155 reaction((_) => isFixedRateMode, (Object _) {
156 + bestRate = 0.0;
157 loadLimits();
158 - bestRate = 0;
159 - calculateBestRate();
158 });
159
160 if (isElectrumWallet) {
@@ -210,6 +208,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
208
209 final List<ExchangeProvider> _tradeAvailableProviders = [];
210
211 + Map<ExchangeProvider, Limits> _providerLimits = {};
212 +
213 @observable
214 ObservableList<ExchangeProvider> selectedProviders;
215
@@ -433,9 +433,24 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
433 return true;
434 }
435 Future<void> calculateBestRate() async {
436 - final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount) ?? 1;
436 + if (depositCurrency == receiveCurrency) {
437 + bestRate = 0.0;
438 + return;
439 + }
440 + final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount)
441 + ?? initialAmountByAssets(isFixedRateMode ? receiveCurrency : depositCurrency);
442 +
443 + final validProvidersForAmount = _tradeAvailableProviders.where((provider) {
444 + final limits = _providerLimits[provider];
445 +
446 + if (limits == null) return false;
447 + if (limits.min != null && amount < limits.min!) return false;
448 + if (limits.max != null && amount > limits.max!) return false;
449 +
450 + return true;
451 + }).toList();
452
438 - final _providers = _tradeAvailableProviders
453 + final _providers = validProvidersForAmount
454 .where((element) => !isFixedRateMode || element.supportsFixedRate)
455 .toList();
456
@@ -473,6 +488,10 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
488
489 @action
490 Future<void> loadLimits() async {
491 + if (depositCurrency == receiveCurrency) {
492 + limitsState = LimitsLoadedSuccessfully(limits: Limits(min: 0, max: 0));
493 + return;
494 + };
495 if (selectedProviders.isEmpty) return;
496
497 limitsState = LimitsIsLoading();
@@ -484,23 +503,27 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
503 double? highestMax = 0.0;
504
505 try {
487 - final result = await Future.wait(
488 - selectedProviders.where((provider) => providersForCurrentPair().contains(provider)).map(
489 - (provider) => provider
490 - .fetchLimits(
491 - from: from,
492 - to: to,
493 - isFixedRateMode: isFixedRateMode,
494 - )
495 - .onError((error, stackTrace) => Limits(max: 0.0, min: double.maxFinite))
496 - .timeout(
497 - Duration(seconds: 7),
498 - onTimeout: () => Limits(max: 0.0, min: double.maxFinite),
499 - ),
500 - ),
501 - );
506 + final futures = selectedProviders
507 + .where((provider) => providersForCurrentPair().contains(provider))
508 + .map((provider) async {
509 + final limits = await provider
510 + .fetchLimits(
511 + from: from,
512 + to: to,
513 + isFixedRateMode: isFixedRateMode,
514 + )
515 + .onError((error, stackTrace) => Limits(max: 0.0, min: double.maxFinite))
516 + .timeout(
517 + Duration(seconds: 7),
518 + onTimeout: () => Limits(max: 0.0, min: double.maxFinite),
519 + );
520 + return MapEntry(provider, limits);
521 + }).toList();
522 +
523 + final entries = await Future.wait(futures);
524 + _providerLimits = Map.fromEntries(entries);
525
503 - result.forEach((tempLimits) {
526 + _providerLimits.values.forEach((tempLimits) {
527 if (lowestMin != null && (tempLimits.min ?? -1) < lowestMin!) {
528 lowestMin = tempLimits.min;
529 }
@@ -525,10 +548,18 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
548 } else {
549 limitsState = LimitsLoadedFailure(error: 'Limits loading failed');
550 }
551 +
552 + calculateBestRate();
553 }
554
555 @action
556 Future<void> createTrade() async {
557 + if (depositCurrency == receiveCurrency) {
558 + tradeState = TradeIsCreatedFailure(
559 + title: S.current.trade_not_created,
560 + error: 'Can\'t exchange the same currency');
561 + return;
562 + }
563 if (isSendAllEnabled) {
564 await calculateDepositAllAmount();
565 final amount = double.tryParse(depositAmount);
@@ -706,10 +737,9 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
737 void _onPairChange() {
738 depositAmount = '';
739 receiveAmount = '';
740 + bestRate = 0.0;
741 loadLimits();
742 _setAvailableProviders();
711 - bestRate = 0;
712 - calculateBestRate();
743 }
744
745 void _initialPairBasedOnWallet() {
@@ -803,9 +833,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
833 receiveAmount = '';
834 isFixedRateMode = false;
835 _defineIsReceiveAmountEditable();
836 + bestRate = 0.0;
837 loadLimits();
807 - bestRate = 0;
808 - calculateBestRate();
838
839 final Map<String, dynamic> exchangeProvidersSelection =
840 json.decode(sharedPreferences.getString(PreferencesKey.exchangeProvidersSelection) ?? "{}")
@@ -988,4 +1017,21 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
1017 return false;
1018 }
1019 }
1020 +
1021 + double initialAmountByAssets (CryptoCurrency ticker) {
1022 + final amount = switch (ticker) {
1023 + CryptoCurrency.trx => 1000,
1024 + CryptoCurrency.nano => 10,
1025 + CryptoCurrency.zano => 10,
1026 + CryptoCurrency.wow => 1000,
1027 + CryptoCurrency.ada => 1000,
1028 + CryptoCurrency.dash => 10,
1029 + CryptoCurrency.rune => 10,
1030 +
1031 + _ => 1
1032 + };
1033 + return amount.toDouble();
1034 + }
1035 +
1036 +
1037 }