From 317ef8f3e4414749569b74f83f4925b80d9c3400 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Tue, 16 Feb 2021 21:06:23 +0200 Subject: [PATCH 01/12] CAKE-278 | added isReceiveAmountEditable and isFixedRateMode to exchange_view_model.dart; fixed changeReceiveAmount() in the exchange_view_model.dart; applied StandardCheckbox to exchange_page.dart for checking fixed rate mode; applied alert dialog to exchange_page.dart when receive amount has focus and fixed rate mode is not checked; added reaction for isFixedRateMode in the exchange_page.dart; added key and changeValue() to standard_checkbox.dart --- lib/src/screens/exchange/exchange_page.dart | 57 +++++++++++++++++-- lib/src/widgets/standard_checkbox.dart | 7 ++- .../exchange/exchange_view_model.dart | 14 ++++- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 55cd9c8ad..20b7a842f 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -1,6 +1,8 @@ import 'dart:ui'; import 'package:cake_wallet/entities/sync_status.dart'; import 'package:cake_wallet/entities/wallet_type.dart'; +import 'package:cake_wallet/exchange/changenow/changenow_exchange_provider.dart'; +import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -37,6 +39,7 @@ class ExchangePage extends BasePage { final ExchangeViewModel exchangeViewModel; final depositKey = GlobalKey(); final receiveKey = GlobalKey(); + final checkBoxKey = GlobalKey(); final _formKey = GlobalKey(); final _depositAmountFocus = FocusNode(); final _receiveAmountFocus = FocusNode(); @@ -240,9 +243,7 @@ class ExchangePage extends BasePage { ? exchangeViewModel.wallet.address : exchangeViewModel.receiveAddress, initialIsAmountEditable: exchangeViewModel - .provider is XMRTOExchangeProvider - ? true - : false, + .isReceiveAmountEditable, initialIsAddressEditable: exchangeViewModel .isReceiveAddressEnabled, @@ -271,6 +272,21 @@ class ExchangePage extends BasePage { ], ), ), + Padding( + padding: EdgeInsets.only(top: 12, left: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + StandardCheckbox( + key: checkBoxKey, + value: exchangeViewModel.isFixedRateMode, + caption: 'Fixed rate', // FIXME + onChanged: (value) => + exchangeViewModel.isFixedRateMode = value, + ), + ], + ) + ), Padding( padding: EdgeInsets.only(top: 30, left: 24, bottom: 24), child: Row( @@ -567,7 +583,7 @@ class ExchangePage extends BasePage { }); reaction((_) => exchangeViewModel.provider, (ExchangeProvider provider) { - provider is XMRTOExchangeProvider + provider is ChangeNowExchangeProvider ? receiveKey.currentState.isAmountEditable(isEditable: true) : receiveKey.currentState.isAmountEditable(isEditable: false); }); @@ -647,6 +663,39 @@ class ExchangePage extends BasePage { } }); + _receiveAmountFocus.addListener(() { + if (_receiveAmountFocus.hasFocus && !exchangeViewModel.isFixedRateMode) { + showPopUp( + context: context, + builder: (BuildContext context) { + return AlertWithTwoActions( + alertTitle: S.of(context).exchange, + alertContent: 'You will be able to enter receive amount when fixed rate is checked. Do you want to check fixed rate?', //FIXME + leftButtonText: S.of(context).cancel, + rightButtonText: S.of(context).ok, + actionLeftButton: () { + FocusScope.of(context).unfocus(); + receiveAmountController.text = ''; + Navigator.of(context).pop(); + }, + actionRightButton: () { + exchangeViewModel.isFixedRateMode = true; + checkBoxKey.currentState + .changeValue(exchangeViewModel.isFixedRateMode); + Navigator.of(context).pop(); + }); + }); + } + }); + + reaction((_) => exchangeViewModel.isFixedRateMode, (bool isFixedRateMode) { + if ((_receiveAmountFocus.hasFocus || + exchangeViewModel.isReceiveAmountEntered) && !isFixedRateMode) { + FocusScope.of(context).unfocus(); + receiveAmountController.text = ''; + } + }); + _isReactionsSet = true; } diff --git a/lib/src/widgets/standard_checkbox.dart b/lib/src/widgets/standard_checkbox.dart index 774acc9b7..64ae95acc 100644 --- a/lib/src/widgets/standard_checkbox.dart +++ b/lib/src/widgets/standard_checkbox.dart @@ -4,9 +4,10 @@ import 'package:flutter/material.dart'; class StandardCheckbox extends StatefulWidget { StandardCheckbox({ + Key key, @required this.value, this.caption = '', - @required this.onChanged}); + @required this.onChanged}) : super(key: key); final bool value; final String caption; @@ -24,6 +25,10 @@ class StandardCheckboxState extends State { String caption; Function(bool) onChanged; + void changeValue(bool newValue) { + setState(() => value = newValue); + } + @override Widget build(BuildContext context) { return GestureDetector( diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 90c62593d..506df787b 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -58,6 +58,9 @@ abstract class ExchangeViewModelBase with Store { } }); + isReceiveAmountEditable = provider is ChangeNowExchangeProvider; + isFixedRateMode = false; + isReceiveAmountEntered = false; loadLimits(); } @@ -106,6 +109,12 @@ abstract class ExchangeViewModelBase with Store { @observable bool isReceiveAmountEntered; + @observable + bool isReceiveAmountEditable; + + @observable + bool isFixedRateMode; + @computed SyncStatus get status => wallet.syncStatus; @@ -127,6 +136,7 @@ abstract class ExchangeViewModelBase with Store { this.provider = provider; depositAmount = ''; receiveAmount = ''; + isReceiveAmountEditable = provider is ChangeNowExchangeProvider; loadLimits(); } @@ -160,8 +170,8 @@ abstract class ExchangeViewModelBase with Store { provider .calculateAmount( - from: depositCurrency, - to: receiveCurrency, + from: receiveCurrency, + to: depositCurrency, amount: _amount, isReceiveAmount: true) .then((amount) => _cryptoNumberFormat From 6e102c49696a4ff50f21bc0594c0cbf6c0cf3143 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Thu, 18 Feb 2021 21:08:52 +0200 Subject: [PATCH 02/12] CAKE-278 | applied fixed-rate flow to changenow_exchange_provider.dart, exchange_view_model.dart and exchange_page.dart; added isFixedRateMode to fetchLimits(), createTrade() and calculateAmount() methods in the exchange_provider.dart --- .../changenow_exchange_provider.dart | 65 +++++++++++++++---- lib/exchange/exchange_provider.dart | 9 +-- .../morphtoken_exchange_provider.dart | 6 +- .../xmrto/xmrto_exchange_provider.dart | 5 +- lib/src/screens/exchange/exchange_page.dart | 7 ++ .../exchange/exchange_view_model.dart | 13 +++- 6 files changed, 79 insertions(+), 26 deletions(-) diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index 8f984359f..a852bc298 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -29,6 +29,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { static const _exchangeAmountUriSufix = '/exchange-amount/'; static const _transactionsUriSufix = '/transactions/'; static const _minAmountUriSufix = '/min-amount/'; + static const _marketInfoUriSufix = '/market-info/'; + static const _fixedRateUriSufix = 'fixed-rate/'; @override String get title => 'ChangeNOW'; @@ -44,19 +46,43 @@ class ChangeNowExchangeProvider extends ExchangeProvider { Future checkIsAvailable() async => true; @override - Future fetchLimits({CryptoCurrency from, CryptoCurrency to}) async { + Future fetchLimits({CryptoCurrency from, CryptoCurrency to, + bool isFixedRateMode}) async { final symbol = from.toString() + '_' + to.toString(); - final url = apiUri + _minAmountUriSufix + symbol; + final url = isFixedRateMode + ? apiUri + _marketInfoUriSufix + _fixedRateUriSufix + apiKey + : apiUri + _minAmountUriSufix + symbol; final response = await get(url); - final responseJSON = json.decode(response.body) as Map; - final min = responseJSON['minAmount'] as double; - return Limits(min: min, max: null); + if (isFixedRateMode) { + final responseJSON = json.decode(response.body) as List; + + for (var elem in responseJSON) { + final elemFrom = elem["from"] as String; + final elemTo = elem["to"] as String; + + if ((elemFrom == from.toString().toLowerCase()) && + (elemTo == to.toString().toLowerCase())) { + final min = elem["min"] as double; + final max = elem["max"] as double; + + return Limits(min: min, max: max); + } + } + return Limits(min: 0, max: 0); + } else { + final responseJSON = json.decode(response.body) as Map; + final min = responseJSON['minAmount'] as double; + + return Limits(min: min, max: null); + } } @override - Future createTrade({TradeRequest request}) async { - const url = apiUri + _transactionsUriSufix + apiKey; + Future createTrade({TradeRequest request, bool isFixedRateMode}) async { + final url = isFixedRateMode + ? apiUri + _transactionsUriSufix + _fixedRateUriSufix + apiKey + : apiUri + _transactionsUriSufix + apiKey; final _request = request as ChangeNowRequest; final body = { 'from': _request.from.toString(), @@ -145,14 +171,25 @@ class ChangeNowExchangeProvider extends ExchangeProvider { {CryptoCurrency from, CryptoCurrency to, double amount, + bool isFixedRateMode, bool isReceiveAmount}) async { - final url = apiUri + - _exchangeAmountUriSufix + - amount.toString() + - '/' + - from.toString() + - '_' + - to.toString(); + final url = isFixedRateMode + ? apiUri + + _exchangeAmountUriSufix + + _fixedRateUriSufix + + amount.toString() + + '/' + + from.toString() + + '_' + + to.toString() + + '?api_key=' + apiKey + : apiUri + + _exchangeAmountUriSufix + + amount.toString() + + '/' + + from.toString() + + '_' + + to.toString(); final response = await get(url); final responseJSON = json.decode(response.body) as Map; final estimatedAmount = responseJSON['estimatedAmount'] as double; diff --git a/lib/exchange/exchange_provider.dart b/lib/exchange/exchange_provider.dart index 276177dac..616715022 100644 --- a/lib/exchange/exchange_provider.dart +++ b/lib/exchange/exchange_provider.dart @@ -17,10 +17,11 @@ abstract class ExchangeProvider { @override String toString() => title; - Future fetchLimits({CryptoCurrency from, CryptoCurrency to}); - Future createTrade({TradeRequest request}); + Future fetchLimits( + {CryptoCurrency from, CryptoCurrency to, bool isFixedRateMode}); + Future createTrade({TradeRequest request, bool isFixedRateMode}); Future findTradeById({@required String id}); - Future calculateAmount( - {CryptoCurrency from, CryptoCurrency to, double amount, bool isReceiveAmount}); + Future calculateAmount({CryptoCurrency from, CryptoCurrency to, + double amount, bool isFixedRateMode, bool isReceiveAmount}); Future checkIsAvailable(); } diff --git a/lib/exchange/morphtoken/morphtoken_exchange_provider.dart b/lib/exchange/morphtoken/morphtoken_exchange_provider.dart index b90eb84e9..ed8010f41 100644 --- a/lib/exchange/morphtoken/morphtoken_exchange_provider.dart +++ b/lib/exchange/morphtoken/morphtoken_exchange_provider.dart @@ -71,7 +71,7 @@ class MorphTokenExchangeProvider extends ExchangeProvider { Future checkIsAvailable() async => true; @override - Future fetchLimits({CryptoCurrency from, CryptoCurrency to}) async { + Future fetchLimits({CryptoCurrency from, CryptoCurrency to, bool isFixedRateMode}) async { final url = apiUri + _limitsURISuffix; final headers = {'Content-type': 'application/json'}; final body = json.encode({ @@ -100,7 +100,7 @@ class MorphTokenExchangeProvider extends ExchangeProvider { } @override - Future createTrade({TradeRequest request}) async { + Future createTrade({TradeRequest request, bool isFixedRateMode}) async { const url = apiUri + _morphURISuffix; final _request = request as MorphTokenRequest; final body = { @@ -191,7 +191,7 @@ class MorphTokenExchangeProvider extends ExchangeProvider { @override Future calculateAmount( - {CryptoCurrency from, CryptoCurrency to, double amount, + {CryptoCurrency from, CryptoCurrency to, double amount, bool isFixedRateMode, bool isReceiveAmount}) async { final url = apiUri + _ratesURISuffix; final response = await get(url); diff --git a/lib/exchange/xmrto/xmrto_exchange_provider.dart b/lib/exchange/xmrto/xmrto_exchange_provider.dart index cc63ff1a3..91365ee40 100644 --- a/lib/exchange/xmrto/xmrto_exchange_provider.dart +++ b/lib/exchange/xmrto/xmrto_exchange_provider.dart @@ -58,7 +58,7 @@ class XMRTOExchangeProvider extends ExchangeProvider { } @override - Future fetchLimits({CryptoCurrency from, CryptoCurrency to}) async { + Future fetchLimits({CryptoCurrency from, CryptoCurrency to, bool isFixedRateMode}) async { final url = originalApiUri + _orderParameterUriSuffix; final response = await get(url); final correction = 0.001; @@ -91,7 +91,7 @@ class XMRTOExchangeProvider extends ExchangeProvider { } @override - Future createTrade({TradeRequest request}) async { + Future createTrade({TradeRequest request, bool isFixedRateMode}) async { final _request = request as XMRTOTradeRequest; final url = originalApiUri + _orderCreateUriSuffix; final _amount = @@ -188,6 +188,7 @@ class XMRTOExchangeProvider extends ExchangeProvider { {CryptoCurrency from, CryptoCurrency to, double amount, + bool isFixedRateMode, bool isReceiveAmount}) async { if (from != CryptoCurrency.xmr && to != CryptoCurrency.btc) { return 0; diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 20b7a842f..03cc866e6 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -693,7 +693,14 @@ class ExchangePage extends BasePage { exchangeViewModel.isReceiveAmountEntered) && !isFixedRateMode) { FocusScope.of(context).unfocus(); receiveAmountController.text = ''; + } else { + exchangeViewModel.changeDepositAmount( + amount: depositAmountController.text); } + + checkBoxKey.currentState + .changeValue(exchangeViewModel.isFixedRateMode); + exchangeViewModel.loadLimits(); }); _isReactionsSet = true; diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 506df787b..f38180230 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -137,12 +137,14 @@ abstract class ExchangeViewModelBase with Store { depositAmount = ''; receiveAmount = ''; isReceiveAmountEditable = provider is ChangeNowExchangeProvider; + isFixedRateMode = false; loadLimits(); } @action void changeDepositCurrency({CryptoCurrency currency}) { depositCurrency = currency; + isFixedRateMode = false; _onPairChange(); isDepositAddressEnabled = !(depositCurrency == wallet.currency); isReceiveAddressEnabled = !(receiveCurrency == wallet.currency); @@ -151,6 +153,7 @@ abstract class ExchangeViewModelBase with Store { @action void changeReceiveCurrency({CryptoCurrency currency}) { receiveCurrency = currency; + isFixedRateMode = false; _onPairChange(); isDepositAddressEnabled = !(depositCurrency == wallet.currency); isReceiveAddressEnabled = !(receiveCurrency == wallet.currency); @@ -173,6 +176,7 @@ abstract class ExchangeViewModelBase with Store { from: receiveCurrency, to: depositCurrency, amount: _amount, + isFixedRateMode: isFixedRateMode, isReceiveAmount: true) .then((amount) => _cryptoNumberFormat .format(amount) @@ -197,6 +201,7 @@ abstract class ExchangeViewModelBase with Store { from: depositCurrency, to: receiveCurrency, amount: _amount, + isFixedRateMode: isFixedRateMode, isReceiveAmount: false) .then((amount) => _cryptoNumberFormat .format(amount) @@ -210,8 +215,8 @@ abstract class ExchangeViewModelBase with Store { limitsState = LimitsIsLoading(); try { - limits = await provider.fetchLimits( - from: depositCurrency, to: receiveCurrency); + limits = await provider.fetchLimits(from: depositCurrency, + to: receiveCurrency, isFixedRateMode: isFixedRateMode); limitsState = LimitsLoadedSuccessfully(limits: limits); } catch (e) { limitsState = LimitsLoadedFailure(error: e.toString()); @@ -275,7 +280,8 @@ abstract class ExchangeViewModelBase with Store { } else { try { tradeState = TradeIsCreating(); - final trade = await provider.createTrade(request: request); + final trade = await provider.createTrade(request: request, + isFixedRateMode: isFixedRateMode); trade.walletId = wallet.id; tradesStore.setTrade(trade); await trades.add(trade); @@ -304,6 +310,7 @@ abstract class ExchangeViewModelBase with Store { receiveAddress = receiveCurrency == wallet.currency ? wallet.address : ''; isDepositAddressEnabled = !(depositCurrency == wallet.currency); isReceiveAddressEnabled = !(receiveCurrency == wallet.currency); + isFixedRateMode = false; _onPairChange(); } From fb6e7de1663f6886545b323de3ec34f13fae548e Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Fri, 19 Feb 2021 10:37:30 +0200 Subject: [PATCH 03/12] CAKE-278 | fixed calculating estimated amount when receive amount is entered; fixed applyTemplate() method in the exchange_page.dart and reset() method in the exchange_view_model.dart --- .../changenow_exchange_provider.dart | 39 +++++++++++++++---- lib/src/screens/exchange/exchange_page.dart | 14 ++----- .../exchange/exchange_view_model.dart | 3 +- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index a852bc298..832eee88f 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -173,8 +173,32 @@ class ChangeNowExchangeProvider extends ExchangeProvider { double amount, bool isFixedRateMode, bool isReceiveAmount}) async { - final url = isFixedRateMode - ? apiUri + + if (isReceiveAmount && isFixedRateMode) { + final url = apiUri + _marketInfoUriSufix + _fixedRateUriSufix + apiKey; + final response = await get(url); + final responseJSON = json.decode(response.body) as List; + var rate = 0.0; + var fee = 0.0; + + for (var elem in responseJSON) { + final elemFrom = elem["from"] as String; + final elemTo = elem["to"] as String; + + if ((elemFrom == to.toString().toLowerCase()) && + (elemTo == from.toString().toLowerCase())) { + rate = elem["rate"] as double; + fee = elem["minerFee"] as double; + break; + } + } + + final estimatedAmount = (amount == 0.0)||(rate == 0.0) ? 0.0 + : (amount + fee)/rate; + + return estimatedAmount; + } else { + final url = isFixedRateMode + ? apiUri + _exchangeAmountUriSufix + _fixedRateUriSufix + amount.toString() + @@ -183,17 +207,18 @@ class ChangeNowExchangeProvider extends ExchangeProvider { '_' + to.toString() + '?api_key=' + apiKey - : apiUri + + : apiUri + _exchangeAmountUriSufix + amount.toString() + '/' + from.toString() + '_' + to.toString(); - final response = await get(url); - final responseJSON = json.decode(response.body) as Map; - final estimatedAmount = responseJSON['estimatedAmount'] as double; + final response = await get(url); + final responseJSON = json.decode(response.body) as Map; + final estimatedAmount = responseJSON['estimatedAmount'] as double; - return estimatedAmount; + return estimatedAmount; + } } } diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 03cc866e6..149529b10 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -480,17 +480,9 @@ class ExchangePage extends BasePage { currency: CryptoCurrency.fromString(template.receiveCurrency)); switch (template.provider) { - case 'XMR.TO': - exchangeViewModel.changeProvider( - provider: exchangeViewModel.providerList[0]); - break; case 'ChangeNOW': exchangeViewModel.changeProvider( - provider: exchangeViewModel.providerList[1]); - break; - case 'MorphToken': - exchangeViewModel.changeProvider( - provider: exchangeViewModel.providerList[2]); + provider: exchangeViewModel.providerList[0]); break; } @@ -498,6 +490,7 @@ class ExchangePage extends BasePage { exchangeViewModel.depositAddress = template.depositAddress; exchangeViewModel.receiveAddress = template.receiveAddress; exchangeViewModel.isReceiveAmountEntered = false; + exchangeViewModel.isFixedRateMode = false; } void _setReactions( @@ -670,12 +663,11 @@ class ExchangePage extends BasePage { builder: (BuildContext context) { return AlertWithTwoActions( alertTitle: S.of(context).exchange, - alertContent: 'You will be able to enter receive amount when fixed rate is checked. Do you want to check fixed rate?', //FIXME + alertContent: 'You will be able to enter receive amount when fixed rate mode is checked. Do you want to switch to fixed rate mode?', //FIXME leftButtonText: S.of(context).cancel, rightButtonText: S.of(context).ok, actionLeftButton: () { FocusScope.of(context).unfocus(); - receiveAmountController.text = ''; Navigator.of(context).pop(); }, actionRightButton: () { diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index f38180230..0df6dbfd1 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -301,11 +301,10 @@ abstract class ExchangeViewModelBase with Store { @action void reset() { + _initialPairBasedOnWallet(); isReceiveAmountEntered = false; depositAmount = ''; receiveAmount = ''; - depositCurrency = CryptoCurrency.xmr; - receiveCurrency = CryptoCurrency.btc; depositAddress = depositCurrency == wallet.currency ? wallet.address : ''; receiveAddress = receiveCurrency == wallet.currency ? wallet.address : ''; isDepositAddressEnabled = !(depositCurrency == wallet.currency); From ae96213aadcc209b851a5f3ab37c42e8ca9762c6 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Mon, 22 Feb 2021 18:04:37 +0200 Subject: [PATCH 04/12] CAKE-278 | added expireAt to Trade() for exchange with fixed rate --- .../changenow_exchange_provider.dart | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index 832eee88f..02e6d9f7c 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -153,17 +153,35 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final state = TradeState.deserialize(raw: status); final extraId = responseJSON['payinExtraId'] as String; final outputTransaction = responseJSON['payoutHash'] as String; + final expiredAtRaw = responseJSON['validUntil'] as String; + final expiredAt = expiredAtRaw != null + ? DateTime.parse(expiredAtRaw).toLocal() + : null; - return Trade( - id: id, - from: from, - to: to, - provider: description, - inputAddress: inputAddress, - amount: expectedSendAmount, - state: state, - extraId: extraId, - outputTransaction: outputTransaction); + if (expiredAt != null) { + return Trade( + id: id, + from: from, + to: to, + provider: description, + inputAddress: inputAddress, + amount: expectedSendAmount, + state: state, + extraId: extraId, + expiredAt: expiredAt, + outputTransaction: outputTransaction); + } else { + return Trade( + id: id, + from: from, + to: to, + provider: description, + inputAddress: inputAddress, + amount: expectedSendAmount, + state: state, + extraId: extraId, + outputTransaction: outputTransaction); + } } @override From d024972345e6fa06a8cbaeb8cc654cbc6debf7e2 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Mon, 22 Feb 2021 20:10:23 +0200 Subject: [PATCH 05/12] CAKE-282 | made QR code border a little bold in the exchange_trade_page.dart and qr_widget.dart --- lib/src/screens/exchange_trade/exchange_trade_page.dart | 1 + lib/src/screens/receive/widgets/qr_widget.dart | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 5dd558d23..9dad2d4d9 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -148,6 +148,7 @@ class ExchangeTradeState extends State { padding: EdgeInsets.all(5), decoration: BoxDecoration( border: Border.all( + width: 3, color: Theme.of(context) .accentTextTheme .subtitle diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index b479378ed..4de923bad 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -48,6 +48,7 @@ class QRWidget extends StatelessWidget { padding: EdgeInsets.all(5), decoration: BoxDecoration( border: Border.all( + width: 3, color: Theme.of(context).accentTextTheme. display3.backgroundColor ) From 3135823afa1febc308898df06f30c15adc691d40 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Mon, 22 Feb 2021 20:46:05 +0200 Subject: [PATCH 06/12] CAKE-283 | changed FAQ on the app (now it shown in browser) --- lib/view_model/settings/settings_view_model.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/view_model/settings/settings_view_model.dart b/lib/view_model/settings/settings_view_model.dart index 0211b2276..e1938b005 100644 --- a/lib/view_model/settings/settings_view_model.dart +++ b/lib/view_model/settings/settings_view_model.dart @@ -26,6 +26,7 @@ import 'package:cake_wallet/view_model/settings/regular_list_item.dart'; import 'package:cake_wallet/view_model/settings/settings_list_item.dart'; import 'package:cake_wallet/view_model/settings/switcher_list_item.dart'; import 'package:cake_wallet/src/screens/auth/auth_page.dart'; +import 'package:url_launcher/url_launcher.dart'; part 'settings_view_model.g.dart'; @@ -173,8 +174,10 @@ abstract class SettingsViewModelBase with Store { ), RegularListItem( title: S.current.faq, - handler: (BuildContext context) => - Navigator.pushNamed(context, Routes.faq), + handler: (BuildContext context) async { + final url = 'https://cakewallet.com/guide/'; + if (await canLaunch(url)) await launch(url); + }, ) ], [VersionListItem(title: currentVersion)] From fc70852002476fc05f7c9e487ec3deb1cb6deaf8 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Tue, 23 Feb 2021 19:36:03 +0200 Subject: [PATCH 07/12] CAKE-278 | applied fixed rate mode only for pair xmr-btc; added _defineIsReceiveAmountEditable() to exchange_view_model.dart; added reaction on isReceiveAmountEditable to exchange_page.dart --- lib/src/screens/exchange/exchange_page.dart | 146 +++++++++--------- .../exchange/exchange_view_model.dart | 18 ++- 2 files changed, 86 insertions(+), 78 deletions(-) diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 149529b10..100c8eaca 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -118,7 +118,7 @@ class ExchangePage extends BasePage { key: _formKey, child: ScrollableWithBottomSection( contentPadding: EdgeInsets.only(bottom: 24), - content: Column( + content: Observer(builder: (_) => Column( children: [ Container( padding: EdgeInsets.only(bottom: 32), @@ -168,22 +168,22 @@ class ExchangePage extends BasePage { hasAllAmount: exchangeViewModel.hasAllAmount, allAmount: exchangeViewModel.hasAllAmount ? () => exchangeViewModel - .calculateDepositAllAmount() + .calculateDepositAllAmount() : null, amountFocusNode: _depositAmountFocus, key: depositKey, title: S.of(context).you_will_send, initialCurrency: - exchangeViewModel.depositCurrency, + exchangeViewModel.depositCurrency, initialWalletName: depositWalletName, initialAddress: - exchangeViewModel.depositCurrency == - exchangeViewModel.wallet.currency - ? exchangeViewModel.wallet.address - : exchangeViewModel.depositAddress, + exchangeViewModel.depositCurrency == + exchangeViewModel.wallet.currency + ? exchangeViewModel.wallet.address + : exchangeViewModel.depositAddress, initialIsAmountEditable: true, initialIsAddressEditable: - exchangeViewModel.isDepositAddressEnabled, + exchangeViewModel.isDepositAddressEnabled, isAmountEstimated: false, hasRefundAddress: true, currencies: CryptoCurrency.all, @@ -214,7 +214,7 @@ class ExchangePage extends BasePage { imageArrow: arrowBottomPurple, currencyButtonColor: Colors.transparent, addressButtonsColor: - Theme.of(context).focusColor, + Theme.of(context).focusColor, borderColor: Theme.of(context) .primaryTextTheme .body2 @@ -228,64 +228,64 @@ class ExchangePage extends BasePage { ), Padding( padding: - EdgeInsets.only(top: 29, left: 24, right: 24), + EdgeInsets.only(top: 29, left: 24, right: 24), child: Observer( builder: (_) => ExchangeCard( - amountFocusNode: _receiveAmountFocus, - key: receiveKey, - title: S.of(context).you_will_get, - initialCurrency: - exchangeViewModel.receiveCurrency, - initialWalletName: receiveWalletName, - initialAddress: exchangeViewModel - .receiveCurrency == - exchangeViewModel.wallet.currency - ? exchangeViewModel.wallet.address - : exchangeViewModel.receiveAddress, - initialIsAmountEditable: exchangeViewModel - .isReceiveAmountEditable, - initialIsAddressEditable: - exchangeViewModel - .isReceiveAddressEnabled, - isAmountEstimated: true, - currencies: CryptoCurrency.all, - onCurrencySelected: (currency) => - exchangeViewModel - .changeReceiveCurrency( - currency: currency), - imageArrow: arrowBottomCakeGreen, - currencyButtonColor: Colors.transparent, - addressButtonsColor: - Theme.of(context).focusColor, - borderColor: Theme.of(context) - .primaryTextTheme - .body2 - .decorationColor, - currencyValueValidator: AmountValidator( - type: exchangeViewModel.wallet.type), - addressTextFieldValidator: - AddressValidator( - type: exchangeViewModel - .receiveCurrency), - )), + amountFocusNode: _receiveAmountFocus, + key: receiveKey, + title: S.of(context).you_will_get, + initialCurrency: + exchangeViewModel.receiveCurrency, + initialWalletName: receiveWalletName, + initialAddress: exchangeViewModel + .receiveCurrency == + exchangeViewModel.wallet.currency + ? exchangeViewModel.wallet.address + : exchangeViewModel.receiveAddress, + initialIsAmountEditable: exchangeViewModel + .isReceiveAmountEditable, + initialIsAddressEditable: + exchangeViewModel + .isReceiveAddressEnabled, + isAmountEstimated: true, + currencies: CryptoCurrency.all, + onCurrencySelected: (currency) => + exchangeViewModel + .changeReceiveCurrency( + currency: currency), + imageArrow: arrowBottomCakeGreen, + currencyButtonColor: Colors.transparent, + addressButtonsColor: + Theme.of(context).focusColor, + borderColor: Theme.of(context) + .primaryTextTheme + .body2 + .decorationColor, + currencyValueValidator: AmountValidator( + type: exchangeViewModel.wallet.type), + addressTextFieldValidator: + AddressValidator( + type: exchangeViewModel + .receiveCurrency), + )), ) ], ), ), - Padding( - padding: EdgeInsets.only(top: 12, left: 24), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - StandardCheckbox( - key: checkBoxKey, - value: exchangeViewModel.isFixedRateMode, - caption: 'Fixed rate', // FIXME - onChanged: (value) => - exchangeViewModel.isFixedRateMode = value, - ), - ], - ) + if (exchangeViewModel.isReceiveAmountEditable) Padding( + padding: EdgeInsets.only(top: 12, left: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + StandardCheckbox( + key: checkBoxKey, + value: exchangeViewModel.isFixedRateMode, + caption: 'Fixed rate', // FIXME + onChanged: (value) => + exchangeViewModel.isFixedRateMode = value, + ), + ], + ) ), Padding( padding: EdgeInsets.only(top: 30, left: 24, bottom: 24), @@ -318,7 +318,7 @@ class ExchangePage extends BasePage { .pushNamed(Routes.exchangeTemplate), child: Container( padding: - EdgeInsets.only(left: 1, right: 10), + EdgeInsets.only(left: 1, right: 10), child: DottedBorder( borderType: BorderType.RRect, dashPattern: [6, 4], @@ -385,23 +385,23 @@ class ExchangePage extends BasePage { .of(context) .confirm_delete_template, rightButtonText: - S.of(context).delete, + S.of(context).delete, leftButtonText: - S.of(context).cancel, + S.of(context).cancel, actionRightButton: () { Navigator.of( - dialogContext) + dialogContext) .pop(); exchangeViewModel .removeTemplate( - template: - template); + template: + template); exchangeViewModel .updateTemplate(); }, actionLeftButton: () => Navigator.of( - dialogContext) + dialogContext) .pop()); }); }, @@ -411,7 +411,7 @@ class ExchangePage extends BasePage { ], ))) ], - ), + )), bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24), bottomSection: Column(children: [ @@ -575,10 +575,10 @@ class ExchangePage extends BasePage { receiveKey.currentState.isAddressEditable(isEditable: isEnabled); }); - reaction((_) => exchangeViewModel.provider, (ExchangeProvider provider) { - provider is ChangeNowExchangeProvider - ? receiveKey.currentState.isAmountEditable(isEditable: true) - : receiveKey.currentState.isAmountEditable(isEditable: false); + reaction((_) => exchangeViewModel.isReceiveAmountEditable, + (bool isReceiveAmountEditable) { + receiveKey.currentState + .isAmountEditable(isEditable: isReceiveAmountEditable); }); reaction((_) => exchangeViewModel.tradeState, (ExchangeTradeState state) { diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 0df6dbfd1..a9ff4ceda 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -57,10 +57,8 @@ abstract class ExchangeViewModelBase with Store { _onPairChange(); } }); - - isReceiveAmountEditable = provider is ChangeNowExchangeProvider; + _defineIsReceiveAmountEditable(); isFixedRateMode = false; - isReceiveAmountEntered = false; loadLimits(); } @@ -136,8 +134,8 @@ abstract class ExchangeViewModelBase with Store { this.provider = provider; depositAmount = ''; receiveAmount = ''; - isReceiveAmountEditable = provider is ChangeNowExchangeProvider; isFixedRateMode = false; + _defineIsReceiveAmountEditable(); loadLimits(); } @@ -380,7 +378,7 @@ abstract class ExchangeViewModelBase with Store { } } - depositAddress = depositCurrency == wallet.currency ? wallet.address : ''; + _defineIsReceiveAmountEditable(); depositAmount = ''; receiveAmount = ''; loadLimits(); @@ -405,4 +403,14 @@ abstract class ExchangeViewModelBase with Store { break; } } + + void _defineIsReceiveAmountEditable() { + if ((provider is ChangeNowExchangeProvider) + &&(depositCurrency == CryptoCurrency.xmr) + &&(receiveCurrency == CryptoCurrency.btc)) { + isReceiveAmountEditable = true; + } else { + isReceiveAmountEditable = false; + } + } } From 270b5f4c782dd2a46f610b760ac8e5354f321681 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Tue, 23 Feb 2021 20:38:36 +0200 Subject: [PATCH 08/12] CAKE-281 | added addr1 address format validation for cardano --- lib/core/address_validator.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index 0591029f3..ee8fe4b9a 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -15,7 +15,8 @@ class AddressValidator extends TextValidator { case CryptoCurrency.xmr: return '[0-9a-zA-Z]'; case CryptoCurrency.ada: - return '[0-9a-zA-Z]'; + return '^[0-9a-zA-Z]{59}\$|^[0-9a-zA-Z]{92}\$|^[0-9a-zA-Z]{104}\$' + '|^[0-9a-zA-Z]{105}\$|^addr1[0-9a-zA-Z]{98}\$'; case CryptoCurrency.bch: return '[0-9a-zA-Z]'; case CryptoCurrency.bnb: @@ -54,7 +55,7 @@ class AddressValidator extends TextValidator { case CryptoCurrency.xmr: return [95, 106]; case CryptoCurrency.ada: - return [59, 92, 104, 105]; + return null; case CryptoCurrency.bch: return [42]; case CryptoCurrency.bnb: From a4c6d01c18287de1ade9a3ecf7ae3a62a781304e Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Wed, 24 Feb 2021 10:16:03 +0200 Subject: [PATCH 09/12] CAKE-278 | applied localization to checkbox text and fixed rate alert text (exchange_page.dart) --- lib/generated/i18n.dart | 70 +++++++++++++++++---- lib/src/screens/exchange/exchange_page.dart | 7 +-- res/values/strings_de.arb | 7 ++- res/values/strings_en.arb | 7 ++- res/values/strings_es.arb | 7 ++- res/values/strings_hi.arb | 7 ++- res/values/strings_ja.arb | 7 ++- res/values/strings_ko.arb | 7 ++- res/values/strings_nl.arb | 7 ++- res/values/strings_pl.arb | 7 ++- res/values/strings_pt.arb | 7 ++- res/values/strings_ru.arb | 7 ++- res/values/strings_uk.arb | 7 ++- res/values/strings_zh.arb | 7 ++- 14 files changed, 121 insertions(+), 40 deletions(-) diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 006647ba6..c7c238f09 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -35,7 +35,7 @@ class S implements WidgetsLocalizations { String get all => "ALL"; String get amount => "Amount: "; String get amount_is_estimate => "The receive amount is an estimate"; - String get amount_is_guaranteed => "In xmr.to, to receive a guaranteed BTC amount, enter the BTC amount and not the XMR amount above"; + String get amount_is_guaranteed => "The receive amount is guaranteed"; String get auth_store_ban_timeout => "ban_timeout"; String get auth_store_banned_for => "Banned for "; String get auth_store_banned_minutes => " minutes"; @@ -395,6 +395,8 @@ class S implements WidgetsLocalizations { String get confirmed => 'Confirmed'; String get unconfirmed => 'Unconfirmed'; String get displayable => 'Displayable'; + String get fixed_rate => 'Fixed rate'; + String get fixed_rate_alert => 'You will be able to enter receive amount when fixed rate mode is checked. Do you want to switch to fixed rate mode?'; } class $de extends S { @@ -536,7 +538,7 @@ class $de extends S { @override String get receive => "Erhalten"; @override - String get amount_is_guaranteed => "Geben Sie in xmr.to den BTC-Betrag und nicht den oben genannten XMR-Betrag ein, um einen garantierten BTC-Betrag zu erhalten"; + String get amount_is_guaranteed => "Der Empfangsbetrag ist garantiert"; @override String get auth_store_banned_for => "Gebannt für "; @override @@ -1151,6 +1153,10 @@ class $de extends S { String get unconfirmed => 'Unbestätigt'; @override String get displayable => 'Anzeigebar'; + @override + String get fixed_rate => 'Fester Zinssatz'; + @override + String get fixed_rate_alert => 'Sie können den Empfangsbetrag eingeben, wenn der Festpreismodus aktiviert ist. Möchten Sie in den Festpreismodus wechseln?'; } class $hi extends S { @@ -1292,7 +1298,7 @@ class $hi extends S { @override String get receive => "प्राप्त करना"; @override - String get amount_is_guaranteed => "Xmr.to में, गारंटीशुदा BTC राशि प्राप्त करने के लिए, BTC राशि दर्ज करें और ऊपर XMR राशि नहीं"; + String get amount_is_guaranteed => "प्राप्त राशि की गारंटी हैं"; @override String get auth_store_banned_for => "के लिए प्रतिबंधित है "; @override @@ -1907,6 +1913,10 @@ class $hi extends S { String get unconfirmed => 'अपुष्ट'; @override String get displayable => 'प्रदर्शन योग्य'; + @override + String get fixed_rate => 'निर्धारित दर'; + @override + String get fixed_rate_alert => 'फिक्स्ड रेट मोड की जांच करने पर आप प्राप्त राशि दर्ज कर पाएंगे। क्या आप निश्चित दर मोड पर स्विच करना चाहते हैं?'; } class $ru extends S { @@ -2048,7 +2058,7 @@ class $ru extends S { @override String get receive => "Получить"; @override - String get amount_is_guaranteed => "В xmr.to, чтобы получить гарантированную сумму BTC, введите сумму BTC, а не сумму XMR выше"; + String get amount_is_guaranteed => "Полученная сумма гарантирована"; @override String get auth_store_banned_for => "Заблокировано на "; @override @@ -2663,6 +2673,10 @@ class $ru extends S { String get unconfirmed => 'Неподтвержденный'; @override String get displayable => 'Отображаемый'; + @override + String get fixed_rate => 'Фиксированная ставка'; + @override + String get fixed_rate_alert => 'Вы сможете ввести сумму получения тогда, когда будет установлен режим фиксированной ставки. Вы хотите перейти в режим фиксированной ставки?'; } class $ko extends S { @@ -2804,7 +2818,7 @@ class $ko extends S { @override String get receive => "받다"; @override - String get amount_is_guaranteed => "xmr.to에서 보장 된 BTC 금액을 받으려면 위의 XMR 금액이 아닌 BTC 금액을 입력하십시오."; + String get amount_is_guaranteed => "수령 금액이 보장됩니다."; @override String get auth_store_banned_for => "금지"; @override @@ -3419,6 +3433,10 @@ class $ko extends S { String get unconfirmed => '미확인'; @override String get displayable => '표시 가능'; + @override + String get fixed_rate => '고정 비율'; + @override + String get fixed_rate_alert => '고정 금리 모드 체크시 수취 금액 입력이 가능합니다. 고정 속도 모드로 전환 하시겠습니까?'; } class $pt extends S { @@ -3560,7 +3578,7 @@ class $pt extends S { @override String get receive => "Receber"; @override - String get amount_is_guaranteed => "Em xmr.to, para receber um valor BTC garantido, insira o valor BTC e não o valor XMR acima"; + String get amount_is_guaranteed => "O valor recebido é garantido"; @override String get auth_store_banned_for => "Banido por"; @override @@ -4175,6 +4193,10 @@ class $pt extends S { String get unconfirmed => 'Não confirmado'; @override String get displayable => 'Exibível'; + @override + String get fixed_rate => 'Taxa fixa'; + @override + String get fixed_rate_alert => 'Você poderá inserir a quantia recebida quando o modo de taxa fixa estiver marcado. Quer mudar para o modo de taxa fixa?'; } class $uk extends S { @@ -4316,7 +4338,7 @@ class $uk extends S { @override String get receive => "Отримати"; @override - String get amount_is_guaranteed => "У xmr.to, щоб отримати гарантовану суму BTC, введіть суму BTC, а не XMR вище"; + String get amount_is_guaranteed => "Отримана сума є гарантованою"; @override String get auth_store_banned_for => "Заблоковано на "; @override @@ -4931,6 +4953,10 @@ class $uk extends S { String get unconfirmed => 'Непідтверджений'; @override String get displayable => 'Відображуваний'; + @override + String get fixed_rate => 'Фіксована ставка'; + @override + String get fixed_rate_alert => 'Ви зможете ввести суму отримання тоді, коли буде встановлений режим фіксованої ставки. Ви хочете перейти в режим фіксованої ставки?'; } class $ja extends S { @@ -5072,7 +5098,7 @@ class $ja extends S { @override String get receive => "受け取る"; @override - String get amount_is_guaranteed => "xmr.toで、保証されたBTC金額を受け取るには、上記のXMR金額ではなく、BTC金額を入力します"; + String get amount_is_guaranteed => "受け取り金額は保証されています"; @override String get auth_store_banned_for => "禁止されています "; @override @@ -5687,6 +5713,10 @@ class $ja extends S { String get unconfirmed => '未確認'; @override String get displayable => '表示可能'; + @override + String get fixed_rate => '固定金利'; + @override + String get fixed_rate_alert => '固定金利モードにチェックを入れると、受取額を入力できるようになります。 固定金利モードに切り替えますか?'; } class $en extends S { @@ -5832,7 +5862,7 @@ class $pl extends S { @override String get receive => "Otrzymać"; @override - String get amount_is_guaranteed => "W xmr.to, aby otrzymać gwarantowaną kwotę BTC, wprowadź kwotę BTC, a nie kwotę XMR powyżej"; + String get amount_is_guaranteed => "Otrzymana kwota jest gwarantowana"; @override String get auth_store_banned_for => "Bzbanowany za "; @override @@ -6447,6 +6477,10 @@ class $pl extends S { String get unconfirmed => 'niepotwierdzony'; @override String get displayable => 'Wyświetlane'; + @override + String get fixed_rate => 'Stała stawka'; + @override + String get fixed_rate_alert => 'Będziesz mógł wprowadzić kwotę otrzymaną, gdy zaznaczony jest tryb stałej stawki. Czy chcesz przejść do trybu stałej stawki?'; } class $es extends S { @@ -6588,7 +6622,7 @@ class $es extends S { @override String get receive => "Recibir"; @override - String get amount_is_guaranteed => "En xmr.to, para recibir una cantidad BTC garantizada, ingrese la cantidad BTC y no la cantidad XMR arriba"; + String get amount_is_guaranteed => "La cantidad recibida está garantizada"; @override String get auth_store_banned_for => "Prohibido para "; @override @@ -7203,6 +7237,10 @@ class $es extends S { String get unconfirmed => 'inconfirmado'; @override String get displayable => 'Visualizable'; + @override + String get fixed_rate => 'Tipo de interés fijo'; + @override + String get fixed_rate_alert => 'Podrá ingresar la cantidad recibida cuando el modo de tarifa fija esté marcado. ¿Quieres cambiar al modo de tarifa fija?'; } class $nl extends S { @@ -7344,7 +7382,7 @@ class $nl extends S { @override String get receive => "Krijgen"; @override - String get amount_is_guaranteed => "Om een gegarandeerd BTC-bedrag te ontvangen, voert u in xmr.to het BTC-bedrag in en niet het bovenstaande XMR-bedrag"; + String get amount_is_guaranteed => "Het ontvangen bedrag is gegarandeerd"; @override String get auth_store_banned_for => "Verboden voor "; @override @@ -7959,6 +7997,10 @@ class $nl extends S { String get unconfirmed => 'niet bevestigd'; @override String get displayable => 'Weer te geven'; + @override + String get fixed_rate => 'Vast tarief'; + @override + String get fixed_rate_alert => 'U kunt het ontvangen bedrag invoeren wanneer de modus voor vaste tarieven is aangevinkt. Wilt u overschakelen naar de vaste-tariefmodus?'; } class $zh extends S { @@ -8100,7 +8142,7 @@ class $zh extends S { @override String get receive => "接收"; @override - String get amount_is_guaranteed => "在xmr.to中,要接收保证的BTC数量,请输入BTC数量,而不要输入上方的XMR数量"; + String get amount_is_guaranteed => "接收金額有保證"; @override String get auth_store_banned_for => "禁止 "; @override @@ -8715,6 +8757,10 @@ class $zh extends S { String get unconfirmed => '未经证实'; @override String get displayable => '可显示'; + @override + String get fixed_rate => '固定利率'; + @override + String get fixed_rate_alert => '選中固定費率模式後,您將可以輸入接收金額。 您要切換到固定速率模式嗎?'; } class GeneratedLocalizationsDelegate extends LocalizationsDelegate { diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 100c8eaca..d811f296f 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -280,7 +280,7 @@ class ExchangePage extends BasePage { StandardCheckbox( key: checkBoxKey, value: exchangeViewModel.isFixedRateMode, - caption: 'Fixed rate', // FIXME + caption: S.of(context).fixed_rate, onChanged: (value) => exchangeViewModel.isFixedRateMode = value, ), @@ -418,8 +418,7 @@ class ExchangePage extends BasePage { Padding( padding: EdgeInsets.only(bottom: 15), child: Observer(builder: (_) { - final description = - exchangeViewModel.provider is XMRTOExchangeProvider + final description = exchangeViewModel.isFixedRateMode ? S.of(context).amount_is_guaranteed : S.of(context).amount_is_estimate; return Center( @@ -663,7 +662,7 @@ class ExchangePage extends BasePage { builder: (BuildContext context) { return AlertWithTwoActions( alertTitle: S.of(context).exchange, - alertContent: 'You will be able to enter receive amount when fixed rate mode is checked. Do you want to switch to fixed rate mode?', //FIXME + alertContent: S.of(context).fixed_rate_alert, leftButtonText: S.of(context).cancel, rightButtonText: S.of(context).ok, actionLeftButton: () { diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 0efd03060..22a7be7aa 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Wechseln Sie den Exchange-Anbieter", "you_will_send" : "Konvertieren von", "you_will_get" : "Konvertieren zu", - "amount_is_guaranteed" : "Geben Sie in xmr.to den BTC-Betrag und nicht den oben genannten XMR-Betrag ein, um einen garantierten BTC-Betrag zu erhalten", + "amount_is_guaranteed" : "Der Empfangsbetrag ist garantiert", "amount_is_estimate" : "Der empfangene Betrag ist eine Schätzung", "powered_by" : "Unterstützt von ${title}", "error" : "Error", @@ -456,5 +456,8 @@ "enter_backup_password" : "Geben Sie hier das Sicherungskennwort ein", "select_backup_file" : "Wählen Sie die Sicherungsdatei", "import" : "Importieren", - "please_select_backup_file" : "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein." + "please_select_backup_file" : "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein.", + + "fixed_rate" : "Fester Zinssatz", + "fixed_rate_alert" : "Sie können den Empfangsbetrag eingeben, wenn der Festpreismodus aktiviert ist. Möchten Sie in den Festpreismodus wechseln?" } \ No newline at end of file diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 0f047346f..832c030ec 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Change Exchange Provider", "you_will_send" : "Convert from", "you_will_get" : "Convert to", - "amount_is_guaranteed" : "In xmr.to, to receive a guaranteed BTC amount, enter the BTC amount and not the XMR amount above", + "amount_is_guaranteed" : "The receive amount is guaranteed", "amount_is_estimate" : "The receive amount is an estimate", "powered_by" : "Powered by ${title}", "error" : "Error", @@ -456,5 +456,8 @@ "enter_backup_password" : "Enter backup password here", "select_backup_file" : "Select backup file", "import" : "Import", - "please_select_backup_file" : "Please select backup file and enter backup password." + "please_select_backup_file" : "Please select backup file and enter backup password.", + + "fixed_rate" : "Fixed rate", + "fixed_rate_alert" : "You will be able to enter receive amount when fixed rate mode is checked. Do you want to switch to fixed rate mode?" } \ No newline at end of file diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 046a4ddcf..71c52eb96 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Cambiar proveedor de intercambio", "you_will_send" : "Convertir de", "you_will_get" : "Convertir a", - "amount_is_guaranteed" : "En xmr.to, para recibir una cantidad BTC garantizada, ingrese la cantidad BTC y no la cantidad XMR arriba", + "amount_is_guaranteed" : "La cantidad recibida está garantizada", "amount_is_estimate" : "El monto recibido es un estimado", "powered_by" : "Energizado por ${title}", "error" : "Error", @@ -456,5 +456,8 @@ "enter_backup_password" : "Ingrese la contraseña de respaldo aquí", "select_backup_file" : "Seleccionar archivo de respaldo", "import" : "Importar", - "please_select_backup_file" : "Seleccione el archivo de respaldo e ingrese la contraseña de respaldo." + "please_select_backup_file" : "Seleccione el archivo de respaldo e ingrese la contraseña de respaldo.", + + "fixed_rate" : "Tipo de interés fijo", + "fixed_rate_alert" : "Podrá ingresar la cantidad recibida cuando el modo de tarifa fija esté marcado. ¿Quieres cambiar al modo de tarifa fija?" } \ No newline at end of file diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 7d9565e6d..8e5da5511 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "एक्सचेंज प्रदाता बदलें", "you_will_send" : "से रूपांतरित करें", "you_will_get" : "में बदलें", - "amount_is_guaranteed" : "Xmr.to में, गारंटीशुदा BTC राशि प्राप्त करने के लिए, BTC राशि दर्ज करें और ऊपर XMR राशि नहीं", + "amount_is_guaranteed" : "प्राप्त राशि की गारंटी है", "amount_is_estimate" : "प्राप्त राशि एक अनुमान है", "powered_by" : "द्वारा संचालित ${title}", "error" : "त्रुटि", @@ -456,5 +456,8 @@ "enter_backup_password" : "यहां बैकअप पासवर्ड डालें", "select_backup_file" : "बैकअप फ़ाइल का चयन करें", "import" : "आयात", - "please_select_backup_file" : "कृपया बैकअप फ़ाइल चुनें और बैकअप पासवर्ड डालें।" + "please_select_backup_file" : "कृपया बैकअप फ़ाइल चुनें और बैकअप पासवर्ड डालें।", + + "fixed_rate" : "निर्धारित दर", + "fixed_rate_alert" : "फिक्स्ड रेट मोड की जांच करने पर आप प्राप्त राशि दर्ज कर पाएंगे। क्या आप निश्चित दर मोड पर स्विच करना चाहते हैं?" } \ No newline at end of file diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index d9254c609..cd8a2b06d 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Exchangeプロバイダーの変更", "you_will_send" : "から変換", "you_will_get" : "に変換", - "amount_is_guaranteed" : "xmr.toで、保証されたBTC金額を受け取るには、上記のXMR金額ではなく、BTC金額を入力します", + "amount_is_guaranteed" : "受け取り金額は保証されています", "amount_is_estimate" : "受け取り金額は見積もりです", "powered_by" : "搭載 ${title}", "error" : "エラー", @@ -456,5 +456,8 @@ "enter_backup_password" : "ここにバックアップパスワードを入力してください", "select_backup_file" : "バックアップファイルを選択", "import" : "インポート", - "please_select_backup_file" : "バックアップファイルを選択し、バックアップパスワードを入力してください。" + "please_select_backup_file" : "バックアップファイルを選択し、バックアップパスワードを入力してください。", + + "fixed_rate" : "固定金利", + "fixed_rate_alert" : "固定金利モードにチェックを入れると、受取額を入力できるようになります。 固定金利モードに切り替えますか?" } \ No newline at end of file diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index ea57c2ff6..259923ef7 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "교환 공급자 변경", "you_will_send" : "다음에서 변환", "you_will_get" : "로 변환하다", - "amount_is_guaranteed" : "xmr.to에서 보장 된 BTC 금액을 받으려면 위의 XMR 금액이 아닌 BTC 금액을 입력하십시오.", + "amount_is_guaranteed" : "수령 금액이 보장됩니다.", "amount_is_estimate" : "수신 금액은 견적입니다", "powered_by" : "에 의해 구동 ${title}", "error" : "오류", @@ -456,5 +456,8 @@ "enter_backup_password" : "여기에 백업 비밀번호를 입력하세요.", "select_backup_file" : "백업 파일 선택", "import" : "수입", - "please_select_backup_file" : "백업 파일을 선택하고 백업 암호를 입력하십시오." + "please_select_backup_file" : "백업 파일을 선택하고 백업 암호를 입력하십시오.", + + "fixed_rate" : "고정 비율", + "fixed_rate_alert" : "고정 금리 모드 체크시 수취 금액 입력이 가능합니다. 고정 속도 모드로 전환 하시겠습니까?" } \ No newline at end of file diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 275bfc8a1..2a309424a 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Wijzig Exchange Provider", "you_will_send" : "Converteren van", "you_will_get" : "Converteren naar", - "amount_is_guaranteed" : "Om een gegarandeerd BTC-bedrag te ontvangen, voert u in xmr.to het BTC-bedrag in en niet het bovenstaande XMR-bedrag", + "amount_is_guaranteed" : "Het ontvangen bedrag is gegarandeerd", "amount_is_estimate" : "Het ontvangen bedrag is een schatting", "powered_by" : "Aangedreven door ${title}", "error" : "Fout", @@ -456,5 +456,8 @@ "enter_backup_password" : "Voer hier een back-upwachtwoord in", "select_backup_file" : "Selecteer een back-upbestand", "import" : "Importeren", - "please_select_backup_file" : "Selecteer een back-upbestand en voer een back-upwachtwoord in." + "please_select_backup_file" : "Selecteer een back-upbestand en voer een back-upwachtwoord in.", + + "fixed_rate" : "Vast tarief", + "fixed_rate_alert" : "U kunt het ontvangen bedrag invoeren wanneer de modus voor vaste tarieven is aangevinkt. Wilt u overschakelen naar de vaste-tariefmodus?" } \ No newline at end of file diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 552a8b36f..81c8366fb 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Zmień dostawcę programu Exchange", "you_will_send" : "Konwertuj z", "you_will_get" : "Konwertuj na", - "amount_is_guaranteed" : "W xmr.to, aby otrzymać gwarantowaną kwotę BTC, wprowadź kwotę BTC, a nie kwotę XMR powyżej", + "amount_is_guaranteed" : "Otrzymana kwota jest gwarantowana", "amount_is_estimate" : "Otrzymana kwota jest wartością szacunkową", "powered_by" : "Zasilany przez ${title}", "error" : "Błąd", @@ -456,5 +456,8 @@ "enter_backup_password" : "Wprowadź tutaj hasło zapasowe", "select_backup_file" : "Wybierz plik kopii zapasowej", "import" : "Import", - "please_select_backup_file" : "Wybierz plik kopii zapasowej i wprowadź hasło zapasowe." + "please_select_backup_file" : "Wybierz plik kopii zapasowej i wprowadź hasło zapasowe.", + + "fixed_rate" : "Stała stawka", + "fixed_rate_alert" : "Będziesz mógł wprowadzić kwotę otrzymaną, gdy zaznaczony jest tryb stałej stawki. Czy chcesz przejść do trybu stałej stawki?" } \ No newline at end of file diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 2b75d9f01..03e5d47a3 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Alterar o provedor de troca", "you_will_send" : "Converter de", "you_will_get" : "Converter para", - "amount_is_guaranteed" : "Em xmr.to, para receber um valor BTC garantido, insira o valor BTC e não o valor XMR acima", + "amount_is_guaranteed" : "O valor recebido é garantido", "amount_is_estimate" : "O valor a ser recebido informado acima é uma estimativa", "powered_by" : "Troca realizada por ${title}", "error" : "Erro", @@ -456,5 +456,8 @@ "enter_backup_password" : "Digite a senha de backup aqui", "select_backup_file" : "Selecione o arquivo de backup", "import" : "Importar", - "please_select_backup_file" : "Selecione o arquivo de backup e insira a senha de backup." + "please_select_backup_file" : "Selecione o arquivo de backup e insira a senha de backup.", + + "fixed_rate" : "Taxa fixa", + "fixed_rate_alert" : "Você poderá inserir a quantia recebida quando o modo de taxa fixa estiver marcado. Quer mudar para o modo de taxa fixa?" } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index a972f5382..1ed8dabb4 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Изменить провайдера обмена", "you_will_send" : "Конвертировать из", "you_will_get" : "Конвертировать в", - "amount_is_guaranteed" : "В xmr.to, чтобы получить гарантированную сумму BTC, введите сумму BTC, а не сумму XMR выше", + "amount_is_guaranteed" : "Полученная сумма гарантирована", "amount_is_estimate" : "Полученная сумма является приблизительной", "powered_by" : "Используя ${title}", "error" : "Ошибка", @@ -456,5 +456,8 @@ "enter_backup_password" : "Введите пароль резервной копии", "select_backup_file" : "Выберите файл резервной копии", "import" : "Импортировать", - "please_select_backup_file" : "Выберите файл резервной копии и введите пароль резервной копии." + "please_select_backup_file" : "Выберите файл резервной копии и введите пароль резервной копии.", + + "fixed_rate" : "Фиксированная ставка", + "fixed_rate_alert" : "Вы сможете ввести сумму получения тогда, когда будет установлен режим фиксированной ставки. Вы хотите перейти в режим фиксированной ставки?" } \ No newline at end of file diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 9ee5860c2..90bcf6e23 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Змінити провайдера обміну", "you_will_send" : "Конвертувати з", "you_will_get" : "Конвертувати в", - "amount_is_guaranteed" : "У xmr.to, щоб отримати гарантовану суму BTC, введіть суму BTC, а не XMR вище", + "amount_is_guaranteed" : "Отримана сума є гарантованою", "amount_is_estimate" : "Отримана сума є приблизною", "powered_by" : "Використовуючи ${title}", "error" : "Помилка", @@ -456,5 +456,8 @@ "enter_backup_password" : "Введіть пароль резервної копії", "select_backup_file" : "Виберіть файл резервної копії", "import" : "Імпортувати", - "please_select_backup_file" : "Виберіть файл резервної копії та введіть пароль резервної копії." + "please_select_backup_file" : "Виберіть файл резервної копії та введіть пароль резервної копії.", + + "fixed_rate" : "Фіксована ставка", + "fixed_rate_alert" : "Ви зможете ввести суму отримання тоді, коли буде встановлений режим фіксованої ставки. Ви хочете перейти в режим фіксованої ставки?" } \ No newline at end of file diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 4b8197711..7f63edf2f 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "更改交易所提供商", "you_will_send" : "從轉換", "you_will_get" : "轉換成", - "amount_is_guaranteed" : "在xmr.to中,要接收保证的BTC数量,请输入BTC数量,而不要输入上方的XMR数量", + "amount_is_guaranteed" : "接收金額有保證", "amount_is_estimate" : "收款金额为估算值", "powered_by" : "供电 ${title}", "error" : "错误", @@ -456,5 +456,8 @@ "enter_backup_password" : "在此處輸入備用密碼", "select_backup_file" : "選擇備份文件", "import" : "進口", - "please_select_backup_file" : "請選擇備份文件,然後輸入備份密碼。" + "please_select_backup_file" : "請選擇備份文件,然後輸入備份密碼。", + + "fixed_rate" : "固定利率", + "fixed_rate_alert" : "選中固定費率模式後,您將可以輸入接收金額。 您要切換到固定速率模式嗎?" } \ No newline at end of file From 574fdfa874c775ad030cc0d84590499a6639777d Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Wed, 24 Feb 2021 10:26:02 +0200 Subject: [PATCH 10/12] CAKE-283 | moved url to static const --- lib/view_model/settings/settings_view_model.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/view_model/settings/settings_view_model.dart b/lib/view_model/settings/settings_view_model.dart index e1938b005..2a5e9c174 100644 --- a/lib/view_model/settings/settings_view_model.dart +++ b/lib/view_model/settings/settings_view_model.dart @@ -175,7 +175,6 @@ abstract class SettingsViewModelBase with Store { RegularListItem( title: S.current.faq, handler: (BuildContext context) async { - final url = 'https://cakewallet.com/guide/'; if (await canLaunch(url)) await launch(url); }, ) @@ -184,6 +183,8 @@ abstract class SettingsViewModelBase with Store { ]; } + static const url = 'https://cakewallet.com/guide/'; + @observable String currentVersion; From 2e9e231a7487f98d90d95901ba6f53575c1cb3dc Mon Sep 17 00:00:00 2001 From: Nadiia <55130281+hope-with-me@users.noreply.github.com> Date: Wed, 24 Feb 2021 17:32:35 +0200 Subject: [PATCH 11/12] Update PRIVACY.md --- PRIVACY.md | 163 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 101 insertions(+), 62 deletions(-) diff --git a/PRIVACY.md b/PRIVACY.md index 485f01864..5f20032b6 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,74 +1,113 @@ Privacy Policy -Last modified: January 28, 2021 -Introduction -Cake Technologies Inc. ("Company" or "We") respect your privacy and are committed to protecting it through our compliance with this policy. -This policy describes the types of information we may collect from you or that you may provide when you use the App (our "App") and our practices for collecting, using, maintaining, protecting, and disclosing that information. -This policy applies to information we collect: -On this App. -In email, text, and other electronic messages between you and this App. -It does not apply to information collected by: -Us offline or through any other means, including on any other App operated by Company or any third party (including our affiliates and subsidiaries)]; or -Any third party (including our affiliates and subsidiaries), including through any application or content (including advertising) that may link to or be accessible from or on the App. -Please read this policy carefully to understand our policies and practices regarding your information and how we will treat it. If you do not agree with our policies and practices, you have the choice to not use the App. By accessing or using this App, you agree to this privacy policy. This policy may change from time to time. Your continued use of this App after we make changes is deemed to be acceptance of those changes, so please check the policy periodically for updates. -Definitions -"App" means the software program provided by the Company, downloaded by You on any electronic device, named Cake Wallet. -"Device" means any device that can access the App, such as a cell phone or tablet device. -"Node" means a full Monero or Bitcoin Node, which transmits data to your App for processing and synchronization, and to which your Device transmits transactions which you would like to submit to the Monero or Bitcoin networks. -"Cake Wallet Nodes" refers to the set of cryptocurrency nodes operated and maintained by Cake Technologies. -"Service" refers to the App. -"Third-party Service" refers to any service integrated into the Cake Wallet Application. This includes ChangeNow and XMR.to. -"Usage Data" refers to data collected automatically about your usage of an Application. -"You" means the individual, group, corporation, or any other entity accessing or using the Service. +Last modified: February 23, 2021 + +Introduction +============ + + Cake Technologies Inc. ("Company" or "We") respect your privacy and are committed to protecting it through our compliance with this policy. + + This policy describes the types of information we may collect from you or that you may provide when you use the App (our "App") and our practices for collecting, using, maintaining, protecting, and disclosing that information. + + This policy applies to information we collect: + - On this App. + - In email, text, and other electronic messages between you and this App. + It does not apply to information collected by: + - Us offline or through any other means, including on any other App operated by Company or any third party (including our affiliates and subsidiaries)]; or + - Any third party (including our affiliates and subsidiaries), including through any application or content (including advertising) that may link to or be accessible from or on the App. + Please read this policy carefully to understand our policies and practices regarding your information and how we will treat it. If you do not agree with our policies and practices, you have the choice to not use the App. By accessing or using this App, you agree to this privacy policy. This policy may change from time to time. Your continued use of this App after we make changes is deemed to be acceptance of those changes, so please check the policy periodically for updates. + +Definitions +----------- + + - "App" means the software program provided by the Company, downloaded by You on any electronic device, named Cake Wallet. + - "Device" means any device that can access the App, such as a cell phone or tablet device. + - "Node" means a full Monero or Bitcoin Node, which transmits data to your App for processing and synchronization, and to which your Device transmits transactions which you would like to submit to the Monero or Bitcoin networks. + - "Cake Wallet Nodes" refers to the set of cryptocurrency nodes operated and maintained by Cake Technologies. + - "Service" refers to the App. + - "Third-party Service" refers to any service integrated into the Cake Wallet Application. This includes ChangeNow. + - "Usage Data" refers to data collected automatically about your usage of an Application. + - "You" means the individual, group, corporation, or any other entity accessing or using the Service. Information We Collect About You and How We Collect It -We collect several types of information from and about users of our App, including information: -By which you may be personally identified, such as name, e-mail address, or and a/any other identifier by which you may be contacted online or offline ("personal information" or "Personal Data”), ONLY when you provide it to us; -Device IP address, the block height to which your wallet is synchronized, and any transactions which you use our Node to submit to the Monero or Bitcoin networks. -We collect this information: -Directly from you when you provide it to us. -Automatically as you use the App, if you use one of the Cake Wallet Nodes. Information collected automatically may include IP address and block height. -Usage Data (including the date and time at which you use an application, the duration of using it, and other ‘metadata’) is NOT collected by Cake Technologies through the usage of the App. Cake Technologies has no reason to care about any aspect of your continued usage of our App. We believe that this data is your own property and that we have no right to collect it. -Personal information is received by Cake Technologies ONLY in the event that you choose to provide it to us. This is provided either by synchronizing your wallet using the Nodes maintained by Cake Technologies, or by voluntarily contacting Cake Technologies regarding support, questions or suggestions. You also have the right to choose not to provide data to Cake Technologies, by choosing a different Node. The option to do so is provided by default with a list of Nodes, but Cake Wallet also provides the ability to add another Node not listed, or use your own Node. -Data relating to your funds, and their security and privacy, remains on your device at ALL times. Your private keys, seeds, backup files, and wallet passcode are your own responsibility. This data is not received, collected, or stored by Cake Technologies at any time, for any reason. -Personal Data collected through the Cake Wallet Nodes is limited to your device's IP address, the block height to which your wallet is synchronized, and any transactions which you use our Node to submit to the Monero or Bitcoin networks. -Personal Data received by Cake Technologies in this manner is not stored for any length of time, and thus Cake Technologies is both unwilling to and incapable of sharing this data, or using it for any purpose beyond ensuring your appropriate connection to our Nodes. -If you decide to use a Node offered by any third party, some of which we offer by default in the Cake Wallet Application, said third party will receive this Personal Data instead of Cake Technologies. We take no responsibility for the actions of any third-party Node offered within the Application. +------------------------------------------------------ + + We collect several types of information from and about users of our App, including information: + - By which you may be personally identified, such as name, e-mail address, or and a/any other identifier by which you may be contacted online or offline ("personal information" or "Personal Data”), ONLY when you provide it to us; + - Device IP address, the block height to which your wallet is synchronized, and any transactions which you use our Node to submit to the Monero or Bitcoin networks. + We collect this information: + - Directly from you when you provide it to us. + - Automatically as you use the App, if you use one of the Cake Wallet Nodes. Information collected automatically may include IP address and block height. + + Usage Data (including the date and time at which you use an application, the duration of using it, and other ‘metadata’) is NOT collected by Cake Technologies through the usage of the App. Cake Technologies has no reason to care about any aspect of your continued usage of our App. We believe that this data is your own property and that we have no right to collect it. + + Personal information is received by Cake Technologies ONLY in the event that you choose to provide it to us. This is provided either by synchronizing your wallet using the Nodes maintained by Cake Technologies, or by voluntarily contacting Cake Technologies regarding support, questions or suggestions. You also have the right to choose not to provide data to Cake Technologies, by choosing a different Node. The option to do so is provided by default with a list of Nodes, but Cake Wallet also provides the ability to add another Node not listed, or use your own Node. + + Data relating to your funds, and their security and privacy, remains on your device at ALL times. Your private keys, seeds, backup files, and wallet passcode are your own responsibility. This data is not received, collected, or stored by Cake Technologies at any time, for any reason. + + Personal Data collected through the Cake Wallet Nodes is limited to your device's IP address, the block height to which your wallet is synchronized, and any transactions which you use our Node to submit to the Monero or Bitcoin networks. Personal Data received by Cake Technologies in this manner is not stored for any length of time, and thus Cake Technologies is both unwilling to and incapable of sharing this data, or using it for any purpose beyond ensuring your appropriate connection to our Nodes. + + If you decide to use a Node offered by any third party, some of which we offer by default in the Cake Wallet Application, said third party will receive this Personal Data instead of Cake Technologies. We take no responsibility for the actions of any third-party Node offered within the Application. If you decide to synchronize your Wallet using your own Node, neither Cake Technologies nor any third party will have access to this Personal Data. + + In any of these situations, Cake Technologies takes no responsibility for interception of this data by any outside individual, group, corporation, or institution. You should understand this and take any and all appropriate actions to secure your own data. -If you decide to synchronize your Wallet using your own Node, neither Cake Technologies nor any third party will have access to this Personal Data. -In any of these situations, Cake Technologies takes no responsibility for interception of this data by any outside individual, group, corporation, or institution. You should understand this and take any and all appropriate actions to secure your own data. How We Use Your Information -We use information that we collect about you or that you provide to us, including any personal information: -To present our App and its contents to you. -To allow you to sync using the closest geographical Node: In the event that you choose to synchronize your wallet using the Node maintained by Cake Technologies, we determine your location using your IP address to redirect your Wallet to the fastest possible Node. -To contact you: In the event that you contact Cake Technologies first, we will use the Personal Data with which you provide us, to contact you by email, Telegram, Reddit, or any other means. -To manage your requests: To attend and manage your requests to us. -For any other purpose with your consent. +--------------------------- + + We use information that we collect about you or that you provide to us, including any personal information: + - To present our App and its contents to you. + - To allow you to sync using the closest geographical Node: In the event that you choose to synchronize your wallet using the Node maintained by Cake Technologies, we determine your location using your IP address to redirect your Wallet to the fastest possible Node. + - To contact you: In the event that you contact Cake Technologies first, we will use the Personal Data with which you provide us, to contact you by email, Telegram, Reddit, or any other means. + - To manage your requests: To attend and manage your requests to us. + - For any other purpose with your consent. + Transfer of Your Personal Data -Personal Data received by the Cake Wallet Nodes, or voluntarily submitted to Cake Technologies through e-mail, Telegram, Reddit, or any other method, may be transferred to computers located outside of your governmental jurisdiction, where the data protection laws may differ from yours. -Your consent to this Privacy Policy, and your submission of such information, represents your agreement to this transfer. -Cake Technologies will take all necessary steps to ensure that your data is treated securely and in accordance with this Privacy Policy. No transfer of your Personal Data will take place to an organization or a country, unless there are adequate controls in place to protect the security of your data. +------------------------------ + + Personal Data received by the Cake Wallet Nodes, or voluntarily submitted to Cake Technologies through e-mail, Telegram, Reddit, or any other method, may be transferred to computers located outside of your governmental jurisdiction, where the data protection laws may differ from yours. Your consent to this Privacy Policy, and your submission of such information, represents your agreement to this transfer. + + Cake Technologies will take all necessary steps to ensure that your data is treated securely and in accordance with this Privacy Policy. No transfer of your Personal Data will take place to an organization or a country, unless there are adequate controls in place to protect the security of your data. + Disclosure of Your Information -We may disclose aggregated information about our users, and information that does not identify any individual, without restriction. For example, we may, from time to time, disclose the number of users who have downloaded our Application. -We may disclose personal information that we collect or you provide as described in this privacy policy: -To our subsidiaries and affiliates. -To contractors, service providers, and other third parties we use to support our business and who are bound by contractual obligations to keep personal information confidential and use it only for the purposes for which we disclose it to them. -To a buyer or other successor in the event of a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Cake Technology's assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which personal information held by Cake Technology about our App users is among the assets transferred. However, we will provide notice before this Personal Data is transferred and becomes subject to a different Privacy Policy. -To fulfill the purpose for which you provide it. -For any other purpose disclosed by us when you provide the information. -With your consent. -We may also disclose your personal information: -To comply with any court order, law, or legal process, including to respond to any government or regulatory request. -To enforce or apply our terms of use and other agreements, including for billing and collection purposes. -If we believe disclosure is necessary or appropriate to protect the rights, property, or safety of Cake Technologies, our customers, or others. -Cake Technologies is incapable of providing any authority or government agency with data received by the Cake Wallet Nodes, because we do not store this data. -Under certain circumstances, Cake Technologies may be required by authorities to disclose Personal Data which you voluntarily provide us, including your e-mail address, Telegram username, or Reddit username. WE STRONGLY RECOMMEND THAT YOU DO NOT TRANSMIT ANY PERSONALLY IDENTIFIABLE INFORMATION TO US VIA THESE OR ANY OTHER METHODS. +------------------------------ + + We may disclose aggregated information about our users, and information that does not identify any individual, without restriction. For example, we may, from time to time, disclose the number of users who have downloaded our Application. + + We may disclose personal information that we collect or you provide as described in this privacy policy: + - To our subsidiaries and affiliates. + - To contractors, service providers, and other third parties we use to support our business and who are bound by contractual obligations to keep personal information confidential and use it only for the purposes for which we disclose it to them. + - To a buyer or other successor in the event of a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Cake Technology's assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which personal information held by Cake Technology about our App users is among the assets transferred. However, we will provide notice before this Personal Data is transferred and becomes subject to a different Privacy Policy. + - To fulfill the purpose for which you provide it. + - For any other purpose disclosed by us when you provide the information. + - With your consent. + + We may also disclose your personal information: + - To comply with any court order, law, or legal process, including to respond to any government or regulatory request. + - To enforce or apply our terms of use and other agreements, including for billing and collection purposes. + - If we believe disclosure is necessary or appropriate to protect the rights, property, or safety of Cake Technologies, our customers, or others. + + Cake Technologies is incapable of providing any authority or government agency with data received by the Cake Wallet Nodes, because we do not store this data. + + Under certain circumstances, Cake Technologies may be required by authorities to disclose Personal Data which you voluntarily provide us, including your e-mail address, Telegram username, or Reddit username. WE STRONGLY RECOMMEND THAT YOU DO NOT TRANSMIT ANY PERSONALLY IDENTIFIABLE INFORMATION TO US VIA THESE OR ANY OTHER METHODS. + Data Security -You are responsible for your personal data, including all data related to the safety of your funds. You should take all appropriate action to protect this data. Cake Technologies cannot recover any data related to your funds in the event that you lose or give away this data. Cake Technologies strongly recommends that you take action to secure your funds, by writing down your seeds or keys, storing encrypted backups, and never sharing this information. -Cake Technologies undertakes any and all reasonable steps possible to secure any data that you voluntarily transmit to us. However, we cannot guarantee that any outside system used to transmit this data is entirely secure and, as such, we recommend that you exercise caution when voluntarily transmitting data to us. +------------- + + You are responsible for your personal data, including all data related to the safety of your funds. You should take all appropriate action to protect this data. Cake Technologies cannot recover any data related to your funds in the event that you lose or give away this data. Cake Technologies strongly recommends that you take action to secure your funds, by writing down your seeds or keys, storing encrypted backups, and never sharing this information. + + Cake Technologies undertakes any and all reasonable steps possible to secure any data that you voluntarily transmit to us. However, we cannot guarantee that any outside system used to transmit this data is entirely secure and, as such, we recommend that you exercise caution when voluntarily transmitting data to us. + Links to Other Websites -The App may contain links to other websites that are not operated by us. If you click on a third-party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit. We have no control over and assume no responsibility for the content, privacy policies or practices of any third-party sites or services. +----------------------- + + The App may contain links to other websites that are not operated by us. If you click on a third-party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit. We have no control over and assume no responsibility for the content, privacy policies or practices of any third-party sites or services. + Changes to Our Privacy Policy -It is our policy to post any changes we make to our privacy policy on this page. If we make material changes to how we treat our users' personal information, we will notify you through a notice on the App. The date the privacy policy was last revised is identified at the top of this document. You are responsible for periodically visiting our App and this privacy policy to check for any changes to our Privacy Policy. -Contact Us +----------------------------- + + It is our policy to post any changes we make to our privacy policy on this page. If we make material changes to how we treat our users' personal information, we will notify you through a notice on the App. The date the privacy policy was last revised is identified at the top of this document. You are responsible for periodically visiting our App and this privacy policy to check for any changes to our Privacy Policy. + +Contact Us +---------- + If you have any questions about this Privacy Policy, you are encouraged to contact us by email at info@cakewallet.com. From bc407b9f0fefd2ac21f2350471d5df006d201205 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Wed, 24 Feb 2021 19:45:30 +0200 Subject: [PATCH 12/12] CAKE-280 | updated alert text for xlm and xrp trades --- lib/generated/i18n.dart | 46 +++++++++++++++++++ .../exchange_trade/exchange_trade_page.dart | 6 ++- .../exchange/exchange_trade_view_model.dart | 7 +++ res/values/strings_de.arb | 5 +- res/values/strings_en.arb | 5 +- res/values/strings_es.arb | 5 +- res/values/strings_hi.arb | 5 +- res/values/strings_ja.arb | 5 +- res/values/strings_ko.arb | 5 +- res/values/strings_nl.arb | 5 +- res/values/strings_pl.arb | 5 +- res/values/strings_pt.arb | 5 +- res/values/strings_ru.arb | 5 +- res/values/strings_uk.arb | 5 +- res/values/strings_zh.arb | 5 +- 15 files changed, 105 insertions(+), 14 deletions(-) diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 006647ba6..494fa9914 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -395,6 +395,8 @@ class S implements WidgetsLocalizations { String get confirmed => 'Confirmed'; String get unconfirmed => 'Unconfirmed'; String get displayable => 'Displayable'; + String get xlm_extra_info => 'Please don’t forget to specify the Memo ID while sending the XLM transaction for the exchange'; + String get xrp_extra_info => 'Please don’t forget to specify the Destination Tag while sending the XRP transaction for the exchange'; } class $de extends S { @@ -1151,6 +1153,10 @@ class $de extends S { String get unconfirmed => 'Unbestätigt'; @override String get displayable => 'Anzeigebar'; + @override + String get xlm_extra_info => 'Bitte vergessen Sie nicht, die Memo-ID anzugeben, während Sie die XLM-Transaktion für den Austausch senden'; + @override + String get xrp_extra_info => 'Bitte vergessen Sie nicht, das Ziel-Tag anzugeben, während Sie die XRP-Transaktion für den Austausch senden'; } class $hi extends S { @@ -1907,6 +1913,10 @@ class $hi extends S { String get unconfirmed => 'अपुष्ट'; @override String get displayable => 'प्रदर्शन योग्य'; + @override + String get xlm_extra_info => 'एक्सचेंज के लिए XLM ट्रांजेक्शन भेजते समय मेमो आईडी निर्दिष्ट करना न भूलें'; + @override + String get xrp_extra_info => 'एक्सचेंज के लिए एक्सआरपी लेनदेन भेजते समय कृपया गंतव्य टैग निर्दिष्ट करना न भूलें'; } class $ru extends S { @@ -2663,6 +2673,10 @@ class $ru extends S { String get unconfirmed => 'Неподтвержденный'; @override String get displayable => 'Отображаемый'; + @override + String get xlm_extra_info => 'Не забудьте указать Memo ID (памятка) при отправке транзакции XLM для обмена'; + @override + String get xrp_extra_info => 'Не забудьте указать целевой тег при отправке транзакции XRP для обмена'; } class $ko extends S { @@ -3419,6 +3433,10 @@ class $ko extends S { String get unconfirmed => '미확인'; @override String get displayable => '표시 가능'; + @override + String get xlm_extra_info => '교환을 위해 XLM 거래를 보낼 때 메모 ID를 지정하는 것을 잊지 마십시오'; + @override + String get xrp_extra_info => '교환을 위해 XRP 트랜잭션을 보내는 동안 대상 태그를 지정하는 것을 잊지 마십시오'; } class $pt extends S { @@ -4175,6 +4193,10 @@ class $pt extends S { String get unconfirmed => 'Não confirmado'; @override String get displayable => 'Exibível'; + @override + String get xlm_extra_info => 'Não se esqueça de especificar o Memo ID ao enviar a transação XLM para a troca'; + @override + String get xrp_extra_info => 'Não se esqueça de especificar a etiqueta de destino ao enviar a transação XRP para a troca'; } class $uk extends S { @@ -4931,6 +4953,10 @@ class $uk extends S { String get unconfirmed => 'Непідтверджений'; @override String get displayable => 'Відображуваний'; + @override + String get xlm_extra_info => "Будь ласка, не забудьте вказати ідентифікатор пам'ятки під час надсилання транзакції XLM для обміну"; + @override + String get xrp_extra_info => 'Будь ласка, не забудьте вказати тег призначення під час надсилання XRP-транзакції для обміну'; } class $ja extends S { @@ -5687,6 +5713,10 @@ class $ja extends S { String get unconfirmed => '未確認'; @override String get displayable => '表示可能'; + @override + String get xlm_extra_info => '交換用のXLMトランザクションを送信するときに、メモIDを指定することを忘れないでください'; + @override + String get xrp_extra_info => '取引所のXRPトランザクションを送信するときに、宛先タグを指定することを忘れないでください'; } class $en extends S { @@ -6447,6 +6477,10 @@ class $pl extends S { String get unconfirmed => 'niepotwierdzony'; @override String get displayable => 'Wyświetlane'; + @override + String get xlm_extra_info => 'Nie zapomnij podać identyfikatora notatki podczas wysyłania transakcji XLM do wymiany'; + @override + String get xrp_extra_info => 'Nie zapomnij podać tagu docelowego podczas wysyłania transakcji XRP do wymiany'; } class $es extends S { @@ -7203,6 +7237,10 @@ class $es extends S { String get unconfirmed => 'inconfirmado'; @override String get displayable => 'Visualizable'; + @override + String get xlm_extra_info => 'No olvide especificar el ID de nota al enviar la transacción XLM para el intercambio'; + @override + String get xrp_extra_info => 'No olvide especificar la etiqueta de destino al enviar la transacción XRP para el intercambio'; } class $nl extends S { @@ -7959,6 +7997,10 @@ class $nl extends S { String get unconfirmed => 'niet bevestigd'; @override String get displayable => 'Weer te geven'; + @override + String get xlm_extra_info => 'Vergeet niet om de Memo-ID op te geven tijdens het verzenden van de XLM-transactie voor de uitwisseling'; + @override + String get xrp_extra_info => 'Vergeet niet om de Destination Tag op te geven tijdens het verzenden van de XRP-transactie voor de uitwisseling'; } class $zh extends S { @@ -8715,6 +8757,10 @@ class $zh extends S { String get unconfirmed => '未经证实'; @override String get displayable => '可显示'; + @override + String get xlm_extra_info => '發送用於交換的XLM交易時,請不要忘記指定備忘錄ID'; + @override + String get xrp_extra_info => '發送用於交換的XRP交易時,請不要忘記指定目標標記'; } class GeneratedLocalizationsDelegate extends LocalizationsDelegate { diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 5dd558d23..1c92bfef9 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -28,9 +28,11 @@ void showInformation( final information = exchangeTradeViewModel.isSendable ? S.current.exchange_result_confirm( - trade.amount ?? fetchingLabel, trade.from.toString(), walletName) + trade.amount ?? fetchingLabel, trade.from.toString(), walletName) + + exchangeTradeViewModel.extraInfo : S.current.exchange_result_description( - trade.amount ?? fetchingLabel, trade.from.toString()); + trade.amount ?? fetchingLabel, trade.from.toString()) + + exchangeTradeViewModel.extraInfo; showPopUp( context: context, diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index 1c938d054..a739b207f 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -59,6 +59,13 @@ abstract class ExchangeTradeViewModelBase with Store { @observable bool isSendable; + @computed + String get extraInfo => trade.from == CryptoCurrency.xlm + ? '\n\n' + S.current.xlm_extra_info + : trade.from == CryptoCurrency.xrp + ? '\n\n' + S.current.xrp_extra_info + : ''; + @observable ObservableList items; diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 0efd03060..d4ccff11e 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "Geben Sie hier das Sicherungskennwort ein", "select_backup_file" : "Wählen Sie die Sicherungsdatei", "import" : "Importieren", - "please_select_backup_file" : "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein." + "please_select_backup_file" : "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein.", + + "xlm_extra_info" : "Bitte vergessen Sie nicht, die Memo-ID anzugeben, während Sie die XLM-Transaktion für den Austausch senden", + "xrp_extra_info" : "Bitte vergessen Sie nicht, das Ziel-Tag anzugeben, während Sie die XRP-Transaktion für den Austausch senden" } \ No newline at end of file diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 0f047346f..7e6794515 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "Enter backup password here", "select_backup_file" : "Select backup file", "import" : "Import", - "please_select_backup_file" : "Please select backup file and enter backup password." + "please_select_backup_file" : "Please select backup file and enter backup password.", + + "xlm_extra_info" : "Please don’t forget to specify the Memo ID while sending the XLM transaction for the exchange", + "xrp_extra_info" : "Please don’t forget to specify the Destination Tag while sending the XRP transaction for the exchange" } \ No newline at end of file diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 046a4ddcf..640407463 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "Ingrese la contraseña de respaldo aquí", "select_backup_file" : "Seleccionar archivo de respaldo", "import" : "Importar", - "please_select_backup_file" : "Seleccione el archivo de respaldo e ingrese la contraseña de respaldo." + "please_select_backup_file" : "Seleccione el archivo de respaldo e ingrese la contraseña de respaldo.", + + "xlm_extra_info" : "No olvide especificar el ID de nota al enviar la transacción XLM para el intercambio", + "xrp_extra_info" : "No olvide especificar la etiqueta de destino al enviar la transacción XRP para el intercambio" } \ No newline at end of file diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 7d9565e6d..16b7b1a7e 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "यहां बैकअप पासवर्ड डालें", "select_backup_file" : "बैकअप फ़ाइल का चयन करें", "import" : "आयात", - "please_select_backup_file" : "कृपया बैकअप फ़ाइल चुनें और बैकअप पासवर्ड डालें।" + "please_select_backup_file" : "कृपया बैकअप फ़ाइल चुनें और बैकअप पासवर्ड डालें।", + + "xlm_extra_info" : "एक्सचेंज के लिए XLM ट्रांजेक्शन भेजते समय मेमो आईडी निर्दिष्ट करना न भूलें", + "xrp_extra_info" : "एक्सचेंज के लिए एक्सआरपी लेनदेन भेजते समय कृपया गंतव्य टैग निर्दिष्ट करना न भूलें" } \ No newline at end of file diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index d9254c609..5df5991eb 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "ここにバックアップパスワードを入力してください", "select_backup_file" : "バックアップファイルを選択", "import" : "インポート", - "please_select_backup_file" : "バックアップファイルを選択し、バックアップパスワードを入力してください。" + "please_select_backup_file" : "バックアップファイルを選択し、バックアップパスワードを入力してください。", + + "xlm_extra_info" : "交換用のXLMトランザクションを送信するときに、メモIDを指定することを忘れないでください", + "xrp_extra_info" : "取引所のXRPトランザクションを送信するときに、宛先タグを指定することを忘れないでください" } \ No newline at end of file diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index ea57c2ff6..497222e43 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "여기에 백업 비밀번호를 입력하세요.", "select_backup_file" : "백업 파일 선택", "import" : "수입", - "please_select_backup_file" : "백업 파일을 선택하고 백업 암호를 입력하십시오." + "please_select_backup_file" : "백업 파일을 선택하고 백업 암호를 입력하십시오.", + + "xlm_extra_info" : "교환을 위해 XLM 거래를 보낼 때 메모 ID를 지정하는 것을 잊지 마십시오", + "xrp_extra_info" : "교환을 위해 XRP 트랜잭션을 보내는 동안 대상 태그를 지정하는 것을 잊지 마십시오" } \ No newline at end of file diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 275bfc8a1..24c4830e8 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "Voer hier een back-upwachtwoord in", "select_backup_file" : "Selecteer een back-upbestand", "import" : "Importeren", - "please_select_backup_file" : "Selecteer een back-upbestand en voer een back-upwachtwoord in." + "please_select_backup_file" : "Selecteer een back-upbestand en voer een back-upwachtwoord in.", + + "xlm_extra_info" : "Vergeet niet om de Memo-ID op te geven tijdens het verzenden van de XLM-transactie voor de uitwisseling", + "xrp_extra_info" : "Vergeet niet om de Destination Tag op te geven tijdens het verzenden van de XRP-transactie voor de uitwisseling" } \ No newline at end of file diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 552a8b36f..a7ded238f 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "Wprowadź tutaj hasło zapasowe", "select_backup_file" : "Wybierz plik kopii zapasowej", "import" : "Import", - "please_select_backup_file" : "Wybierz plik kopii zapasowej i wprowadź hasło zapasowe." + "please_select_backup_file" : "Wybierz plik kopii zapasowej i wprowadź hasło zapasowe.", + + "xlm_extra_info" : "Nie zapomnij podać identyfikatora notatki podczas wysyłania transakcji XLM do wymiany", + "xrp_extra_info" : "Nie zapomnij podać tagu docelowego podczas wysyłania transakcji XRP do wymiany" } \ No newline at end of file diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 2b75d9f01..38be63cba 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "Digite a senha de backup aqui", "select_backup_file" : "Selecione o arquivo de backup", "import" : "Importar", - "please_select_backup_file" : "Selecione o arquivo de backup e insira a senha de backup." + "please_select_backup_file" : "Selecione o arquivo de backup e insira a senha de backup.", + + "xlm_extra_info" : "Não se esqueça de especificar o Memo ID ao enviar a transação XLM para a troca", + "xrp_extra_info" : "Não se esqueça de especificar a etiqueta de destino ao enviar a transação XRP para a troca" } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index a972f5382..d30c1b7d1 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "Введите пароль резервной копии", "select_backup_file" : "Выберите файл резервной копии", "import" : "Импортировать", - "please_select_backup_file" : "Выберите файл резервной копии и введите пароль резервной копии." + "please_select_backup_file" : "Выберите файл резервной копии и введите пароль резервной копии.", + + "xlm_extra_info" : "Не забудьте указать Memo ID (памятка) при отправке транзакции XLM для обмена", + "xrp_extra_info" : "Не забудьте указать целевой тег при отправке транзакции XRP для обмена" } \ No newline at end of file diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 9ee5860c2..3a9c7daa8 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "Введіть пароль резервної копії", "select_backup_file" : "Виберіть файл резервної копії", "import" : "Імпортувати", - "please_select_backup_file" : "Виберіть файл резервної копії та введіть пароль резервної копії." + "please_select_backup_file" : "Виберіть файл резервної копії та введіть пароль резервної копії.", + + "xlm_extra_info" : "Будь ласка, не забудьте вказати ідентифікатор пам'ятки під час надсилання транзакції XLM для обміну", + "xrp_extra_info" : "Будь ласка, не забудьте вказати тег призначення під час надсилання XRP-транзакції для обміну" } \ No newline at end of file diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 4b8197711..7a8f4fe8d 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -456,5 +456,8 @@ "enter_backup_password" : "在此處輸入備用密碼", "select_backup_file" : "選擇備份文件", "import" : "進口", - "please_select_backup_file" : "請選擇備份文件,然後輸入備份密碼。" + "please_select_backup_file" : "請選擇備份文件,然後輸入備份密碼。", + + "xlm_extra_info" : "發送用於交換的XLM交易時,請不要忘記指定備忘錄ID", + "xrp_extra_info" : "發送用於交換的XRP交易時,請不要忘記指定目標標記" } \ No newline at end of file