mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-06-28 20:39:51 +00:00
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:
parent
4b03fc763f
commit
4f35cc9b0f
1 changed files with 71 additions and 25 deletions
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue