- 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,