- Add whether this provide supports fixed rate or not - Fix Change now fixed rate exchange due to wrong rate id

- Add whether this provide supports fixed rate or not - Fix Change now fixed rate exchange due to wrong rate id

OmarHatem committed Dec 6, 2022 at 19:23 UTC f14c01303fa08dd0a8d80571bf61e16ac990da39
7 files changed +31 -13
lib/exchange/changenow/changenow_exchange_provider.dart
+14 -6
@@ -11,7 +11,6 @@ import 'package:cake_wallet/exchange/trade_request.dart';
11 import 'package:cake_wallet/exchange/trade_state.dart';
12 import 'package:cake_wallet/exchange/changenow/changenow_request.dart';
13 import 'package:cake_wallet/exchange/exchange_provider_description.dart';
14 -import 'package:cake_wallet/exchange/trade_not_created_exeption.dart';
14
15 class ChangeNowExchangeProvider extends ExchangeProvider {
16 ChangeNowExchangeProvider()
@@ -21,8 +20,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
20 .where((i) => i != CryptoCurrency.xhv)
21 .map((i) => CryptoCurrency.all
22 .where((i) => i != CryptoCurrency.xhv)
24 - .map((k) => ExchangePair(from: i, to: k, reverse: true))
25 - .where((c) => c != null))
23 + .map((k) => ExchangePair(from: i, to: k, reverse: true)))
24 .expand((i) => i)
25 .toList());
26
@@ -43,6 +41,9 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
41 @override
42 bool get isEnabled => true;
43
44 + @override
45 + bool get supportsFixedRate => true;
46 +
47 @override
48 ExchangeProviderDescription get description =>
49 ExchangeProviderDescription.changeNow;
@@ -109,6 +110,15 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
110 };
111
112 if (isFixedRateMode) {
113 + // since we schedule to calculate the rate every 5 seconds we need to ensure that
114 + // we have the latest rate id with the given inputs before creating the trade
115 + await calculateAmount(
116 + from: _request.to,
117 + to: _request.from,
118 + amount: double.tryParse(_request.toAmount) ?? 0,
119 + isFixedRateMode: true,
120 + isReceiveAmount: true,
121 + );
122 body['rateId'] = _lastUsedRateId;
123 }
124
@@ -180,9 +190,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
190 final extraId = responseJSON['payinExtraId'] as String;
191 final outputTransaction = responseJSON['payoutHash'] as String;
192 final expiredAtRaw = responseJSON['validUntil'] as String;
183 - final expiredAt = expiredAtRaw != null
184 - ? DateTime.parse(expiredAtRaw).toLocal()
185 - : null;
193 + final expiredAt = DateTime.tryParse(expiredAtRaw)?.toLocal();
194
195 return Trade(
196 id: id,
lib/exchange/exchange_provider.dart
+1 -1
@@ -1,4 +1,3 @@
1 -import 'package:flutter/foundation.dart';
1 import 'package:cw_core/crypto_currency.dart';
2 import 'package:cake_wallet/exchange/trade_request.dart';
3 import 'package:cake_wallet/exchange/exchange_pair.dart';
@@ -14,6 +13,7 @@ abstract class ExchangeProvider {
13 ExchangeProviderDescription get description;
14 bool get isAvailable;
15 bool get isEnabled;
16 + bool get supportsFixedRate;
17
18 @override
19 String toString() => title;
lib/exchange/morphtoken/morphtoken_exchange_provider.dart
+3
@@ -66,6 +66,9 @@ class MorphTokenExchangeProvider extends ExchangeProvider {
66 @override
67 bool get isEnabled => true;
68
69 + @override
70 + bool get supportsFixedRate => false;
71 +
72 @override
73 ExchangeProviderDescription get description =>
74 ExchangeProviderDescription.morphToken;
lib/exchange/sideshift/sideshift_exchange_provider.dart
+5 -5
@@ -12,7 +12,6 @@ import 'package:cw_core/crypto_currency.dart';
12 import 'package:cake_wallet/exchange/trade_request.dart';
13 import 'package:cake_wallet/exchange/trade.dart';
14 import 'package:cake_wallet/exchange/limits.dart';
15 -import 'package:flutter/foundation.dart';
15 import 'package:http/http.dart';
16
17 class SideShiftExchangeProvider extends ExchangeProvider {
@@ -48,8 +47,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
47
48 return supportedCurrencies
49 .map((i) => supportedCurrencies
51 - .map((k) => ExchangePair(from: i, to: k, reverse: true))
52 - .where((c) => c != null))
50 + .map((k) => ExchangePair(from: i, to: k, reverse: true)))
51 .expand((i) => i)
52 .toList();
53 }
@@ -257,8 +255,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
255 state = TradeState.deserialize(raw: status ?? 'created');
256
257 final expiredAtRaw = responseJSON['expiresAtISO'] as String;
260 - final expiredAt =
261 - expiredAtRaw != null ? DateTime.parse(expiredAtRaw).toLocal() : null;
258 + final expiredAt = DateTime.tryParse(expiredAtRaw)?.toLocal();
259
260 return Trade(
261 id: id,
@@ -278,6 +275,9 @@ class SideShiftExchangeProvider extends ExchangeProvider {
275 @override
276 bool get isEnabled => true;
277
278 + @override
279 + bool get supportsFixedRate => true;
280 +
281 @override
282 String get title => 'SideShift';
283
lib/exchange/simpleswap/simpleswap_exchange_provider.dart
+3
@@ -209,6 +209,9 @@ class SimpleSwapExchangeProvider extends ExchangeProvider {
209 @override
210 bool get isEnabled => true;
211
212 + @override
213 + bool get supportsFixedRate => false;
214 +
215 @override
216 String get title => 'SimpleSwap';
217
lib/exchange/xmrto/xmrto_exchange_provider.dart
+3
@@ -48,6 +48,9 @@ class XMRTOExchangeProvider extends ExchangeProvider {
48 @override
49 bool get isEnabled => true;
50
51 + @override
52 + bool get supportsFixedRate => false;
53 +
54 @override
55 ExchangeProviderDescription get description =>
56 ExchangeProviderDescription.xmrto;
lib/view_model/exchange/exchange_view_model.dart
+2 -1
@@ -306,10 +306,11 @@ abstract class ExchangeViewModelBase with Store {
306 }
307
308 Future<void> _calculateBestRate() async {
309 - final amount = double.tryParse(depositAmount) ?? 1;
309 + final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount) ?? 1;
310
311 final result = await Future.wait<double>(
312 _tradeAvailableProviders
313 + .where((element) => element.supportsFixedRate)
314 .map((element) => element.calculateAmount(
315 from: depositCurrency,
316 to: receiveCurrency,