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>
This commit is contained in:
Serhii 2025-03-13 03:00:45 +02:00 committed by GitHub
parent 4b03fc763f
commit 4f35cc9b0f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -116,7 +116,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
.toList()); .toList());
_setAvailableProviders(); _setAvailableProviders();
calculateBestRate();
autorun((_) { autorun((_) {
if (selectedProviders.any((provider) => provider is TrocadorExchangeProvider)) { if (selectedProviders.any((provider) => provider is TrocadorExchangeProvider)) {
@ -154,9 +153,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
_defineIsReceiveAmountEditable(); _defineIsReceiveAmountEditable();
loadLimits(); loadLimits();
reaction((_) => isFixedRateMode, (Object _) { reaction((_) => isFixedRateMode, (Object _) {
bestRate = 0.0;
loadLimits(); loadLimits();
bestRate = 0;
calculateBestRate();
}); });
if (isElectrumWallet) { if (isElectrumWallet) {
@ -210,6 +208,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
final List<ExchangeProvider> _tradeAvailableProviders = []; final List<ExchangeProvider> _tradeAvailableProviders = [];
Map<ExchangeProvider, Limits> _providerLimits = {};
@observable @observable
ObservableList<ExchangeProvider> selectedProviders; ObservableList<ExchangeProvider> selectedProviders;
@ -433,9 +433,24 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
return true; return true;
} }
Future<void> calculateBestRate() async { Future<void> calculateBestRate() async {
final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount) ?? 1; if (depositCurrency == receiveCurrency) {
bestRate = 0.0;
return;
}
final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount)
?? initialAmountByAssets(isFixedRateMode ? receiveCurrency : depositCurrency);
final _providers = _tradeAvailableProviders final validProvidersForAmount = _tradeAvailableProviders.where((provider) {
final limits = _providerLimits[provider];
if (limits == null) return false;
if (limits.min != null && amount < limits.min!) return false;
if (limits.max != null && amount > limits.max!) return false;
return true;
}).toList();
final _providers = validProvidersForAmount
.where((element) => !isFixedRateMode || element.supportsFixedRate) .where((element) => !isFixedRateMode || element.supportsFixedRate)
.toList(); .toList();
@ -473,6 +488,10 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
@action @action
Future<void> loadLimits() async { Future<void> loadLimits() async {
if (depositCurrency == receiveCurrency) {
limitsState = LimitsLoadedSuccessfully(limits: Limits(min: 0, max: 0));
return;
};
if (selectedProviders.isEmpty) return; if (selectedProviders.isEmpty) return;
limitsState = LimitsIsLoading(); limitsState = LimitsIsLoading();
@ -484,23 +503,27 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
double? highestMax = 0.0; double? highestMax = 0.0;
try { try {
final result = await Future.wait( final futures = selectedProviders
selectedProviders.where((provider) => providersForCurrentPair().contains(provider)).map( .where((provider) => providersForCurrentPair().contains(provider))
(provider) => provider .map((provider) async {
.fetchLimits( final limits = await provider
from: from, .fetchLimits(
to: to, from: from,
isFixedRateMode: isFixedRateMode, to: to,
) isFixedRateMode: isFixedRateMode,
.onError((error, stackTrace) => Limits(max: 0.0, min: double.maxFinite)) )
.timeout( .onError((error, stackTrace) => Limits(max: 0.0, min: double.maxFinite))
Duration(seconds: 7), .timeout(
onTimeout: () => Limits(max: 0.0, min: double.maxFinite), Duration(seconds: 7),
), onTimeout: () => Limits(max: 0.0, min: double.maxFinite),
), );
); return MapEntry(provider, limits);
}).toList();
result.forEach((tempLimits) { final entries = await Future.wait(futures);
_providerLimits = Map.fromEntries(entries);
_providerLimits.values.forEach((tempLimits) {
if (lowestMin != null && (tempLimits.min ?? -1) < lowestMin!) { if (lowestMin != null && (tempLimits.min ?? -1) < lowestMin!) {
lowestMin = tempLimits.min; lowestMin = tempLimits.min;
} }
@ -525,10 +548,18 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
} else { } else {
limitsState = LimitsLoadedFailure(error: 'Limits loading failed'); limitsState = LimitsLoadedFailure(error: 'Limits loading failed');
} }
calculateBestRate();
} }
@action @action
Future<void> createTrade() async { Future<void> createTrade() async {
if (depositCurrency == receiveCurrency) {
tradeState = TradeIsCreatedFailure(
title: S.current.trade_not_created,
error: 'Can\'t exchange the same currency');
return;
}
if (isSendAllEnabled) { if (isSendAllEnabled) {
await calculateDepositAllAmount(); await calculateDepositAllAmount();
final amount = double.tryParse(depositAmount); final amount = double.tryParse(depositAmount);
@ -706,10 +737,9 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
void _onPairChange() { void _onPairChange() {
depositAmount = ''; depositAmount = '';
receiveAmount = ''; receiveAmount = '';
bestRate = 0.0;
loadLimits(); loadLimits();
_setAvailableProviders(); _setAvailableProviders();
bestRate = 0;
calculateBestRate();
} }
void _initialPairBasedOnWallet() { void _initialPairBasedOnWallet() {
@ -803,9 +833,8 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
receiveAmount = ''; receiveAmount = '';
isFixedRateMode = false; isFixedRateMode = false;
_defineIsReceiveAmountEditable(); _defineIsReceiveAmountEditable();
bestRate = 0.0;
loadLimits(); loadLimits();
bestRate = 0;
calculateBestRate();
final Map<String, dynamic> exchangeProvidersSelection = final Map<String, dynamic> exchangeProvidersSelection =
json.decode(sharedPreferences.getString(PreferencesKey.exchangeProvidersSelection) ?? "{}") json.decode(sharedPreferences.getString(PreferencesKey.exchangeProvidersSelection) ?? "{}")
@ -988,4 +1017,21 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
return false; return false;
} }
} }
double initialAmountByAssets (CryptoCurrency ticker) {
final amount = switch (ticker) {
CryptoCurrency.trx => 1000,
CryptoCurrency.nano => 10,
CryptoCurrency.zano => 10,
CryptoCurrency.wow => 1000,
CryptoCurrency.ada => 1000,
CryptoCurrency.dash => 10,
CryptoCurrency.rune => 10,
_ => 1
};
return amount.toDouble();
}
} }