diff --git a/android/app/src/main/AndroidManifestBase.xml b/android/app/src/main/AndroidManifestBase.xml
index b3556301c..5d0c41846 100644
--- a/android/app/src/main/AndroidManifestBase.xml
+++ b/android/app/src/main/AndroidManifestBase.xml
@@ -42,4 +42,11 @@
android:name="flutterEmbedding"
android:value="2" />
+
+
+
+
+
+
+
diff --git a/cw_core/lib/transaction_info.dart b/cw_core/lib/transaction_info.dart
index 9d72fa843..ae6bddbe2 100644
--- a/cw_core/lib/transaction_info.dart
+++ b/cw_core/lib/transaction_info.dart
@@ -1,5 +1,4 @@
import 'package:cw_core/transaction_direction.dart';
-//import 'package:cake_wallet/utils/mobx.dart';
import 'package:cw_core/keyable.dart';
abstract class TransactionInfo extends Object with Keyable {
@@ -18,4 +17,6 @@ abstract class TransactionInfo extends Object with Keyable {
@override
dynamic get keyIndex => id;
+
+ Map additionalInfo;
}
\ No newline at end of file
diff --git a/cw_monero/lib/monero_transaction_info.dart b/cw_monero/lib/monero_transaction_info.dart
index 83dd65390..9677c1341 100644
--- a/cw_monero/lib/monero_transaction_info.dart
+++ b/cw_monero/lib/monero_transaction_info.dart
@@ -23,7 +23,13 @@ class MoneroTransactionInfo extends TransactionInfo {
accountIndex = int.parse(map['accountIndex'] as String),
addressIndex = map['addressIndex'] as int,
key = getTxKey((map['hash'] ?? '') as String),
- fee = map['fee'] as int ?? 0;
+ fee = map['fee'] as int ?? 0 {
+ additionalInfo = {
+ 'key': key,
+ 'accountIndex': accountIndex,
+ 'addressIndex': addressIndex
+ };
+ }
MoneroTransactionInfo.fromRow(TransactionInfoRow row)
: id = row.getHash(),
@@ -36,7 +42,13 @@ class MoneroTransactionInfo extends TransactionInfo {
accountIndex = row.subaddrAccount,
addressIndex = row.subaddrIndex,
key = getTxKey(row.getHash()),
- fee = row.fee;
+ fee = row.fee {
+ additionalInfo = {
+ 'key': key,
+ 'accountIndex': accountIndex,
+ 'addressIndex': addressIndex
+ };
+ }
final String id;
final int height;
diff --git a/lib/monero/cw_monero.dart b/lib/monero/cw_monero.dart
index 97433773b..f17e4b6ed 100644
--- a/lib/monero/cw_monero.dart
+++ b/lib/monero/cw_monero.dart
@@ -288,4 +288,9 @@ class CWMonero extends Monero {
WalletService createMoneroWalletService(Box walletInfoSource) {
return MoneroWalletService(walletInfoSource);
}
+
+ String getTransactionAddress(Object wallet, int accountIndex, int addressIndex) {
+ final moneroWallet = wallet as MoneroWallet;
+ return moneroWallet.getTransactionAddress(accountIndex, addressIndex);
+ }
}
diff --git a/lib/src/screens/exchange/exchange_template_page.dart b/lib/src/screens/exchange/exchange_template_page.dart
index 653ec9d13..7d98594d5 100644
--- a/lib/src/screens/exchange/exchange_template_page.dart
+++ b/lib/src/screens/exchange/exchange_template_page.dart
@@ -3,9 +3,13 @@ import 'package:cake_wallet/exchange/exchange_provider.dart';
import 'package:cake_wallet/exchange/exchange_template.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
+import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
+import 'package:keyboard_actions/keyboard_actions.dart';
+import 'package:keyboard_actions/keyboard_actions_config.dart';
+import 'package:keyboard_actions/keyboard_actions_item.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cw_core/crypto_currency.dart';
@@ -28,6 +32,8 @@ class ExchangeTemplatePage extends BasePage {
final depositKey = GlobalKey();
final receiveKey = GlobalKey();
final _formKey = GlobalKey();
+ final _depositAmountFocus = FocusNode();
+ final _receiveAmountFocus = FocusNode();
var _isReactionsSet = false;
@override
@@ -36,9 +42,6 @@ class ExchangeTemplatePage extends BasePage {
@override
Color get titleColor => Colors.white;
- @override
- bool get resizeToAvoidBottomInset => false;
-
@override
bool get extendBodyBehindAppBar => true;
@@ -74,7 +77,22 @@ class ExchangeTemplatePage extends BasePage {
WidgetsBinding.instance
.addPostFrameCallback((_) => _setReactions(context, exchangeViewModel));
- return Container(
+ return KeyboardActions(
+ disableScroll: true,
+ config: KeyboardActionsConfig(
+ keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
+ keyboardBarColor:
+ Theme.of(context).accentTextTheme.body2.backgroundColor,
+ nextFocus: false,
+ actions: [
+ KeyboardActionsItem(
+ focusNode: _depositAmountFocus,
+ toolbarButtons: [(_) => KeyboardDoneButton()]),
+ KeyboardActionsItem(
+ focusNode: _receiveAmountFocus,
+ toolbarButtons: [(_) => KeyboardDoneButton()])
+ ]),
+ child: Container(
color: Theme.of(context).backgroundColor,
child: Form(
key: _formKey,
@@ -121,6 +139,7 @@ class ExchangeTemplatePage extends BasePage {
padding: EdgeInsets.fromLTRB(24, 90, 24, 32),
child: Observer(
builder: (_) => ExchangeCard(
+ amountFocusNode: _depositAmountFocus,
key: depositKey,
title: S.of(context).you_will_send,
initialCurrency:
@@ -160,6 +179,7 @@ class ExchangeTemplatePage extends BasePage {
padding: EdgeInsets.only(top: 29, left: 24, right: 24),
child: Observer(
builder: (_) => ExchangeCard(
+ amountFocusNode: _receiveAmountFocus,
key: receiveKey,
title: S.of(context).you_will_get,
initialCurrency:
@@ -244,6 +264,7 @@ class ExchangeTemplatePage extends BasePage {
textColor: Colors.white),
]),
))
+ )
);
}
diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart
index cdf7de566..71fff8914 100644
--- a/lib/src/screens/send/send_page.dart
+++ b/lib/src/screens/send/send_page.dart
@@ -197,7 +197,6 @@ class SendPage extends BasePage {
itemCount: itemCount,
itemBuilder: (context, index) {
final template = templates[index];
-
return TemplateTile(
key: UniqueKey(),
to: template.name,
diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart
index 9de6eefc8..fb753e876 100644
--- a/lib/view_model/send/send_view_model.dart
+++ b/lib/view_model/send/send_view_model.dart
@@ -29,8 +29,11 @@ part 'send_view_model.g.dart';
class SendViewModel = SendViewModelBase with _$SendViewModel;
abstract class SendViewModelBase with Store {
- SendViewModelBase(this._wallet, this._settingsStore,
- this.sendTemplateViewModel, this._fiatConversationStore,
+ SendViewModelBase(
+ this._wallet,
+ this._settingsStore,
+ this.sendTemplateViewModel,
+ this._fiatConversationStore,
this.transactionDescriptionBox)
: state = InitialExecutionState() {
final priority = _settingsStore.priority[_wallet.type];
@@ -127,15 +130,17 @@ abstract class SendViewModelBase with Store {
bool get isReadyForSend => _wallet.syncStatus is SyncedSyncStatus;
@computed
- ObservableList get templates => sendTemplateViewModel.templates;
+ List get templates => sendTemplateViewModel.templates
+ .where((template) => _isEqualCurrency(template.cryptoCurrency))
+ .toList();
@computed
- bool get isElectrumWallet => _wallet.type == WalletType.bitcoin || _wallet.type == WalletType.litecoin;
+ bool get isElectrumWallet =>
+ _wallet.type == WalletType.bitcoin || _wallet.type == WalletType.litecoin;
- bool get hasYat
- => outputs.any((out) => out.isParsedAddress
- && out.parsedAddress.parseFrom == ParseFrom.yatRecord);
-
+ bool get hasYat => outputs.any((out) =>
+ out.isParsedAddress &&
+ out.parsedAddress.parseFrom == ParseFrom.yatRecord);
WalletType get walletType => _wallet.type;
final WalletBase _wallet;
@@ -200,19 +205,16 @@ abstract class SendViewModelBase with Store {
case WalletType.bitcoin:
final priority = _settingsStore.priority[_wallet.type];
- return bitcoin.createBitcoinTransactionCredentials(
- outputs, priority);
+ return bitcoin.createBitcoinTransactionCredentials(outputs, priority);
case WalletType.litecoin:
final priority = _settingsStore.priority[_wallet.type];
- return bitcoin.createBitcoinTransactionCredentials(
- outputs, priority);
+ return bitcoin.createBitcoinTransactionCredentials(outputs, priority);
case WalletType.monero:
final priority = _settingsStore.priority[_wallet.type];
return monero.createMoneroTransactionCreationCredentials(
- outputs: outputs,
- priority: priority);
+ outputs: outputs, priority: priority);
default:
return null;
}
@@ -229,4 +231,7 @@ abstract class SendViewModelBase with Store {
return priority.toString();
}
+
+ bool _isEqualCurrency(String currency) =>
+ currency.toLowerCase() == _wallet.currency.title.toLowerCase();
}
diff --git a/lib/view_model/transaction_details_view_model.dart b/lib/view_model/transaction_details_view_model.dart
index 59afe7f66..b9752a693 100644
--- a/lib/view_model/transaction_details_view_model.dart
+++ b/lib/view_model/transaction_details_view_model.dart
@@ -13,6 +13,7 @@ import 'package:mobx/mobx.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:url_launcher/url_launcher.dart';
+import 'package:cake_wallet/monero/monero.dart';
part 'transaction_details_view_model.g.dart';
@@ -31,6 +32,9 @@ abstract class TransactionDetailsViewModelBase with Store {
final dateFormat = DateFormatter.withCurrentLocal();
final tx = transactionInfo;
+ final key = tx.additionalInfo['key'] as String;
+ final accountIndex = tx.additionalInfo['accountIndex'] as int;
+ final addressIndex = tx.additionalInfo['addressIndex'] as int;
if (wallet.type == WalletType.monero) {
final _items = [
@@ -46,30 +50,27 @@ abstract class TransactionDetailsViewModelBase with Store {
value: tx.amountFormatted()),
StandartListItem(
title: S.current.transaction_details_fee, value: tx.feeFormatted()),
+ if (key?.isNotEmpty ?? false)
+ StandartListItem(title: S.current.transaction_key, value: key)
];
- //if (tx.key?.isNotEmpty ?? null) {
- // _items.add(
- // StandartListItem(title: S.current.transaction_key, value: tx.key));
- //}
+ if (tx.direction == TransactionDirection.incoming &&
+ accountIndex != null &&
+ addressIndex != null) {
+ try {
+ final address = monero.getTransactionAddress(wallet, accountIndex, addressIndex);
- //if (tx.direction == TransactionDirection.incoming) {
- // try {
- // final accountIndex = tx.accountIndex;
- // final addressIndex = tx.addressIndex;
- //final address = moneroUtils.getTransactionAddress(wallet, accountIndex, addressIndex);
-
- //if (address?.isNotEmpty ?? false) {
- // isRecipientAddressShown = true;
- // _items.add(
- // StandartListItem(
- // title: S.current.transaction_details_recipient_address,
- // value: address));
- //}
- // } catch (e) {
- // print(e.toString());
- // }
- //}
+ if (address?.isNotEmpty ?? false) {
+ isRecipientAddressShown = true;
+ _items.add(
+ StandartListItem(
+ title: S.current.transaction_details_recipient_address,
+ value: address));
+ }
+ } catch (e) {
+ print(e.toString());
+ }
+ }
items.addAll(_items);
}
diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh
index 5c6bd3ad9..276a854e5 100755
--- a/scripts/android/app_env.sh
+++ b/scripts/android/app_env.sh
@@ -20,7 +20,7 @@ MONERO_COM_PACKAGE="com.monero.app"
CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="4.3.5"
-CAKEWALLET_BUILD_NUMBER=84
+CAKEWALLET_BUILD_NUMBER=85
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh
index 89667f0da..5d444e658 100755
--- a/scripts/ios/app_env.sh
+++ b/scripts/ios/app_env.sh
@@ -18,7 +18,7 @@ MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="4.3.5"
-CAKEWALLET_BUILD_NUMBER=78
+CAKEWALLET_BUILD_NUMBER=80
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
if ! [[ " ${TYPES[*]} " =~ " ${APP_IOS_TYPE} " ]]; then
diff --git a/tool/configure.dart b/tool/configure.dart
index 6e221848c..0987fa7a4 100644
--- a/tool/configure.dart
+++ b/tool/configure.dart
@@ -204,6 +204,8 @@ abstract class Monero {
MoneroWalletDetails getMoneroWalletDetails(Object wallet);
+ String getTransactionAddress(Object wallet, int accountIndex, int addressIndex);
+
int getHeigthByDate({DateTime date});
TransactionPriority getDefaultTransactionPriority();
TransactionPriority deserializeMoneroTransactionPriority({int raw});