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
}