diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index 94f8ea6ac..2a9b38c64 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -146,7 +146,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { @override Future calculateAmount( - {CryptoCurrency from, CryptoCurrency to, double amount}) async { + {CryptoCurrency from, CryptoCurrency to, double amount, + bool isReceiveAmount}) async { final url = apiUri + _exchangeAmountUriSufix + amount.toString() + diff --git a/lib/exchange/exchange_provider.dart b/lib/exchange/exchange_provider.dart index 418d20b8c..65f7ad8ba 100644 --- a/lib/exchange/exchange_provider.dart +++ b/lib/exchange/exchange_provider.dart @@ -20,5 +20,5 @@ abstract class ExchangeProvider { Future createTrade({TradeRequest request}); Future findTradeById({@required String id}); Future calculateAmount( - {CryptoCurrency from, CryptoCurrency to, double amount}); + {CryptoCurrency from, CryptoCurrency to, double amount, bool isReceiveAmount}); } diff --git a/lib/exchange/morphtoken/morphtoken_exchange_provider.dart b/lib/exchange/morphtoken/morphtoken_exchange_provider.dart index 6c4aade37..195f72ae5 100644 --- a/lib/exchange/morphtoken/morphtoken_exchange_provider.dart +++ b/lib/exchange/morphtoken/morphtoken_exchange_provider.dart @@ -185,7 +185,8 @@ class MorphTokenExchangeProvider extends ExchangeProvider { @override Future calculateAmount( - {CryptoCurrency from, CryptoCurrency to, double amount}) async { + {CryptoCurrency from, CryptoCurrency to, double amount, + bool isReceiveAmount}) async { final url = apiUri + _ratesURISuffix; final response = await get(url); final responseJSON = json.decode(response.body) as Map; diff --git a/lib/exchange/xmrto/xmrto_exchange_provider.dart b/lib/exchange/xmrto/xmrto_exchange_provider.dart index ca1253310..25232db65 100644 --- a/lib/exchange/xmrto/xmrto_exchange_provider.dart +++ b/lib/exchange/xmrto/xmrto_exchange_provider.dart @@ -21,8 +21,8 @@ class XMRTOExchangeProvider extends ExchangeProvider { ]); static const userAgent = 'CakeWallet/XMR iOS'; - static const originalApiUri = 'https://xmr.to/api/v2/xmr2btc'; - static const proxyApiUri = 'https://xmrproxy.net/api/v2/xmr2btc'; + static const originalApiUri = 'https://xmr.to/api/v3/xmr2btc'; + static const proxyApiUri = 'https://xmrproxy.net/api/v3/xmr2btc'; static const _orderParameterUriSufix = '/order_parameter_query'; static const _orderStatusUriSufix = '/order_status_query/'; static const _orderCreateUriSufix = '/order_create/'; @@ -61,9 +61,9 @@ class XMRTOExchangeProvider extends ExchangeProvider { } final responseJSON = json.decode(response.body) as Map; - double min = responseJSON['lower_limit'] as double; - double max = responseJSON['upper_limit'] as double; - final price = responseJSON['price'] as double; + double min = double.parse(responseJSON['lower_limit'] as String); + double max = double.parse(responseJSON['upper_limit'] as String); + final price = double.parse(responseJSON['price'] as String); if (price > 0) { try { @@ -88,7 +88,12 @@ class XMRTOExchangeProvider extends ExchangeProvider { final _request = request as XMRTOTradeRequest; final url = await getApiUri() + _orderCreateUriSufix; final body = { - 'xmr_amount': _request.amount, + 'amount': _request.isBTCRequest + ? _request.receiveAmount + : _request.amount, + 'amount_currency': _request.isBTCRequest + ? _request.to.toString() + : _request.from.toString(), 'btc_dest_address': _request.address }; final response = await post(url, @@ -165,7 +170,8 @@ class XMRTOExchangeProvider extends ExchangeProvider { @override Future calculateAmount( - {CryptoCurrency from, CryptoCurrency to, double amount}) async { + {CryptoCurrency from, CryptoCurrency to, double amount, + bool isReceiveAmount}) async { if (from != CryptoCurrency.xmr && to != CryptoCurrency.btc) { return 0; } @@ -174,7 +180,9 @@ class XMRTOExchangeProvider extends ExchangeProvider { _rate = await _fetchRates(); } - final double result = _rate * amount; + final double result = isReceiveAmount + ? _rate == 0 ? 0 : amount / _rate + : _rate * amount; return double.parse(result.toStringAsFixed(12)); } @@ -185,7 +193,7 @@ class XMRTOExchangeProvider extends ExchangeProvider { final response = await get(url, headers: {'Content-Type': 'application/json'}); final responseJSON = json.decode(response.body) as Map; - final price = responseJSON['price'] as double; + final price = double.parse(responseJSON['price'] as String); return price; } catch (e) { diff --git a/lib/exchange/xmrto/xmrto_trade_request.dart b/lib/exchange/xmrto/xmrto_trade_request.dart index a456b572a..e88db176d 100644 --- a/lib/exchange/xmrto/xmrto_trade_request.dart +++ b/lib/exchange/xmrto/xmrto_trade_request.dart @@ -7,12 +7,16 @@ class XMRTOTradeRequest extends TradeRequest { {@required this.from, @required this.to, @required this.amount, + @required this.receiveAmount, @required this.address, - @required this.refundAddress}); + @required this.refundAddress, + @required this.isBTCRequest}); final CryptoCurrency from; final CryptoCurrency to; final String amount; + final String receiveAmount; final String address; final String refundAddress; + final bool isBTCRequest; } diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index c734ef5a0..694f74129 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:cake_wallet/exchange/exchange_provider.dart'; import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/exchange/exchange_template.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; @@ -207,7 +208,9 @@ class ExchangePage extends BasePage { exchangeViewModel.wallet.currency ? exchangeViewModel.wallet.address : exchangeViewModel.receiveAddress, - initialIsAmountEditable: false, + initialIsAmountEditable: + exchangeViewModel.provider is + XMRTOExchangeProvider ? true : false, initialIsAddressEditable: exchangeViewModel .isReceiveAddressEnabled, @@ -520,6 +523,12 @@ class ExchangePage extends BasePage { receiveKey.currentState.isAddressEditable(isEditable: isEnabled); }); + reaction((_) => exchangeViewModel.provider, (ExchangeProvider provider) { + provider is XMRTOExchangeProvider + ? receiveKey.currentState.isAmountEditable(isEditable: true) + : receiveKey.currentState.isAmountEditable(isEditable: false); + }); + // FIXME: FIXME // reaction((_) => exchangeViewModel.tradeState, (ExchangeTradeState state) { @@ -573,6 +582,7 @@ class ExchangePage extends BasePage { if (depositAmountController.text != exchangeViewModel.depositAmount) { exchangeViewModel.changeDepositAmount( amount: depositAmountController.text); + exchangeViewModel.isReceiveAmountEntered = false; } }); @@ -583,6 +593,7 @@ class ExchangePage extends BasePage { if (receiveAmountController.text != exchangeViewModel.receiveAmount) { exchangeViewModel.changeReceiveAmount( amount: receiveAmountController.text); + exchangeViewModel.isReceiveAmountEntered = true; } }); diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index d1a29c731..caca84b83 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -48,6 +48,7 @@ abstract class ExchangeViewModelBase with Store { tradeState = ExchangeTradeStateInitial(); _cryptoNumberFormat = NumberFormat()..maximumFractionDigits = 12; provider = providersForCurrentPair().first; + isReceiveAmountEntered = false; loadLimits(); } @@ -92,6 +93,8 @@ abstract class ExchangeViewModelBase with Store { @observable bool isReceiveAddressEnabled; + bool isReceiveAmountEntered; + Limits limits; NumberFormat _cryptoNumberFormat; @@ -138,7 +141,8 @@ abstract class ExchangeViewModelBase with Store { provider .calculateAmount( - from: depositCurrency, to: receiveCurrency, amount: _amount) + from: depositCurrency, to: receiveCurrency, amount: _amount, + isReceiveAmount: true) .then((amount) => _cryptoNumberFormat .format(amount) .toString() @@ -159,7 +163,8 @@ abstract class ExchangeViewModelBase with Store { final _amount = double.parse(amount); provider .calculateAmount( - from: depositCurrency, to: receiveCurrency, amount: _amount) + from: depositCurrency, to: receiveCurrency, amount: _amount, + isReceiveAmount: false) .then((amount) => _cryptoNumberFormat .format(amount) .toString() @@ -191,8 +196,10 @@ abstract class ExchangeViewModelBase with Store { from: depositCurrency, to: receiveCurrency, amount: depositAmount, + receiveAmount: receiveAmount, address: receiveAddress, - refundAddress: depositAddress); + refundAddress: depositAddress, + isBTCRequest: isReceiveAmountEntered); amount = depositAmount; currency = depositCurrency; }