CAKE-343 | added wallet_addresses.dart, monero_wallet_addresses.dart, electrum_wallet_addresses.dart, wallet_addresses_credentials.dart, monero_wallet_addresses_credentials.dart and electrum_wallet_addresses_credentials.dart to the app; applied ElectrumWalletAddresses to electrum_wallet.dart and MoneroWalletAddresses to monero_wallet.dart; fixed contact_list_view_model.dart, other view models and services

OleksandrSobol committed Jul 8, 2021 at 17:52 UTC e03f0ce4d3cf3e072a4ed4ef4e72655421cf065a
16 files changed +159 -51
lib/bitcoin/bitcoin_wallet_service.dart
-1
@@ -44,7 +44,6 @@ class BitcoinWalletService extends WalletService<
44 final wallet = await BitcoinWalletBase.open(
45 password: password, name: name, walletInfo: walletInfo);
46 await wallet.init();
47 - await wallet.updateAddressesInfo();
47 return wallet;
48 }
49
lib/bitcoin/electrum_wallet.dart
+14 -2
@@ -1,5 +1,7 @@
1 import 'dart:async';
2 import 'dart:convert';
3 +import 'package:cake_wallet/bitcoin/electrum_wallet_addresses.dart';
4 +import 'package:cake_wallet/bitcoin/electrum_wallet_addresses_credentials.dart';
5 import 'package:mobx/mobx.dart';
6 import 'package:rxdart/subjects.dart';
7 import 'package:flutter/foundation.dart';
@@ -63,6 +65,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
65 ElectrumTransactionHistory(walletInfo: walletInfo, password: password);
66 _unspent = [];
67 _scripthashesUpdateSubject = {};
68 + _walletAddressInBox = ElectrumWalletAddresses(walletInfo);
69 + _walletAddressInBoxCredentials = ElectrumWalletAddressesCredentials();
70 }
71
72 static int estimatedTransactionSize(int inputsCount, int outputsCounts) =>
@@ -93,6 +97,9 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
97
98 String get xpub => hd.base58;
99
100 + ElectrumWalletAddresses _walletAddressInBox;
101 + ElectrumWalletAddressesCredentials _walletAddressInBoxCredentials;
102 +
103 @override
104 String get seed => mnemonic;
105
@@ -113,6 +120,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
120 await generateAddresses();
121 address = addresses[_accountIndex].address;
122 await transactionHistory.init();
123 + await _updateWalletAddressInBox();
124 }
125
126 @action
@@ -125,8 +133,6 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
133
134 address = addresses[_accountIndex].address;
135
128 - await updateAddressesInfo();
129 -
136 await save();
137 }
138
@@ -364,6 +370,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
370 final path = await makePath();
371 await write(path: path, password: _password, data: toJSON());
372 await transactionHistory.save();
373 + await _updateWalletAddressInBox();
374 }
375
376 bitcoin.ECPair keyPairFor({@required int index}) =>
@@ -466,4 +473,9 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
473 balance = await _fetchBalances();
474 await save();
475 }
476 +
477 + Future<void> _updateWalletAddressInBox() async {
478 + _walletAddressInBoxCredentials.address = address;
479 + await _walletAddressInBox.update(_walletAddressInBoxCredentials);
480 + }
481 }
lib/bitcoin/electrum_wallet_addresses.dart new
+32
@@ -0,0 +1,32 @@
1 +import 'package:cake_wallet/bitcoin/electrum_wallet_addresses_credentials.dart';
2 +import 'package:cake_wallet/entities/wallet_addresses.dart';
3 +import 'package:cake_wallet/entities/wallet_addresses_credentials.dart';
4 +import 'package:cake_wallet/entities/wallet_info.dart';
5 +
6 +class ElectrumWalletAddresses extends WalletAddresses {
7 + ElectrumWalletAddresses(WalletInfo walletInfo) : super(walletInfo);
8 +
9 + @override
10 + Future<void> update(WalletAddressesCredentials credentials) async {
11 + try {
12 + if (credentials == null) {
13 + return;
14 + }
15 +
16 + final _credentials = credentials as ElectrumWalletAddressesCredentials;
17 + final _address = _credentials.address;
18 + final _label = '';
19 +
20 + if (_address == null || _address.isEmpty) {
21 + return;
22 + }
23 +
24 + addresses.clear();
25 + addresses[_address] = _label;
26 +
27 + await save();
28 + } catch (e) {
29 + print(e.toString());
30 + }
31 + }
32 +}
\ No newline at end of file
lib/bitcoin/electrum_wallet_addresses_credentials.dart new
+7
@@ -0,0 +1,7 @@
1 +import 'package:cake_wallet/entities/wallet_addresses_credentials.dart';
2 +
3 +class ElectrumWalletAddressesCredentials extends WalletAddressesCredentials {
4 + ElectrumWalletAddressesCredentials();
5 +
6 + String address;
7 +}
\ No newline at end of file
lib/bitcoin/litecoin_wallet_service.dart
-1
@@ -45,7 +45,6 @@ class LitecoinWalletService extends WalletService<
45 final wallet = await LitecoinWalletBase.open(
46 password: password, name: name, walletInfo: walletInfo);
47 await wallet.init();
48 - await wallet.updateAddressesInfo();
48 return wallet;
49 }
50
lib/core/wallet_base.dart
-10
@@ -6,7 +6,6 @@ import 'package:cake_wallet/entities/wallet_info.dart';
6 import 'package:cake_wallet/core/pending_transaction.dart';
7 import 'package:cake_wallet/core/transaction_history.dart';
8 import 'package:cake_wallet/entities/currency_for_wallet_type.dart';
9 -import 'package:cake_wallet/entities/monero_transaction_priority.dart';
9 import 'package:cake_wallet/entities/crypto_currency.dart';
10 import 'package:cake_wallet/entities/sync_status.dart';
11 import 'package:cake_wallet/entities/node.dart';
@@ -66,13 +65,4 @@ abstract class WalletBase<
65 Future<void> rescan({int height});
66
67 void close();
69 -
70 - Future<void> updateAddressesInfo() async {
71 - try {
72 - walletInfo.address = address;
73 - await walletInfo.save();
74 - } catch (e) {
75 - print(e.toString());
76 - }
77 - }
68 }
lib/entities/wallet_addresses.dart new
+30
@@ -0,0 +1,30 @@
1 +import 'package:cake_wallet/entities/wallet_addresses_credentials.dart';
2 +import 'package:cake_wallet/entities/wallet_info.dart';
3 +
4 +abstract class WalletAddresses {
5 + WalletAddresses(this.walletInfo) {
6 + addresses = walletInfo?.addresses ?? {};
7 + }
8 +
9 + final WalletInfo walletInfo;
10 +
11 + Map<String, String> addresses;
12 +
13 + Future<void> update(WalletAddressesCredentials credentials);
14 +
15 + Future<void> save() async {
16 + try {
17 + if (walletInfo == null) {
18 + return;
19 + }
20 +
21 + walletInfo.addresses = addresses;
22 +
23 + if (walletInfo.isInBox) {
24 + await walletInfo.save();
25 + }
26 + } catch (e) {
27 + print(e.toString());
28 + }
29 + }
30 +}
\ No newline at end of file
lib/entities/wallet_addresses_credentials.dart new
+1
@@ -0,0 +1 @@
1 +abstract class WalletAddressesCredentials {}
\ No newline at end of file
lib/monero/monero_wallet.dart
+17 -20
@@ -3,6 +3,8 @@ import 'package:cake_wallet/entities/transaction_priority.dart';
3 import 'package:cake_wallet/monero/monero_amount_format.dart';
4 import 'package:cake_wallet/monero/monero_transaction_creation_exception.dart';
5 import 'package:cake_wallet/monero/monero_transaction_info.dart';
6 +import 'package:cake_wallet/monero/monero_wallet_addresses.dart';
7 +import 'package:cake_wallet/monero/monero_wallet_addresses_credentials.dart';
8 import 'package:flutter/foundation.dart';
9 import 'package:mobx/mobx.dart';
10 import 'package:cw_monero/transaction_history.dart'
@@ -47,6 +49,8 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
49 _isSavingAfterSync = false;
50 _isSavingAfterNewTransaction = false;
51 _isTransactionUpdating = false;
52 + _walletAllAddresses = MoneroWalletAddresses(walletInfo);
53 + _walletAddressesCredentials = MoneroWalletAddressesCredentials();
54 _onAccountChangeReaction = reaction((_) => account, (Account account) {
55 balance = MoneroBalance(
56 fullBalance: monero_wallet.getFullBalance(accountIndex: account.id),
@@ -99,6 +103,8 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
103 bool _isSavingAfterNewTransaction;
104 bool _isTransactionUpdating;
105 int _lastSaveTimestamp;
106 + MoneroWalletAddresses _walletAllAddresses;
107 + MoneroWalletAddressesCredentials _walletAddressesCredentials;
108
109 Future<void> init() async {
110 accountList.update();
@@ -110,6 +116,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
116 unlockedBalance:
117 monero_wallet.getUnlockedBalance(accountIndex: account.id));
118 address = subaddress.address;
119 + await _updateWalletAllAddressesInBox();
120 _setListeners();
121 await updateTransactions();
122
@@ -238,6 +245,8 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
245
246 @override
247 Future<void> save() async {
248 + await _updateWalletAllAddressesInBox();
249 +
250 final now = DateTime.now().millisecondsSinceEpoch;
251
252 if (now - _lastSaveTimestamp < Duration(seconds: 10).inMilliseconds) {
@@ -446,25 +455,13 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
455 }
456 }
457
449 - @override
450 - Future<void> updateAddressesInfo() async {
451 - final Map<String, String> _addresses = {};
452 - final _subaddressList = MoneroSubaddressList();
453 -
454 - accountList.accounts.forEach((account) {
455 - _subaddressList.update(accountIndex: account.id);
456 - _subaddressList.subaddresses.forEach((subaddress) {
457 - _addresses[subaddress.address] = subaddress.label;
458 - });
459 - });
460 -
461 - try {
462 - walletInfo.addresses = _addresses;
463 - walletInfo.address = address;
464 -
465 - await walletInfo.save();
466 - } catch (e) {
467 - print(e.toString());
468 - }
458 + Future<void> _updateWalletAllAddressesInBox() async {
459 + _walletAddressesCredentials
460 + ..accountList = accountList
461 + ..subaddressList = subaddressList;
462 + await _walletAllAddresses.update(_walletAddressesCredentials);
463 + subaddressList.update(accountIndex: account.id ?? 0);
464 + subaddress = subaddressList.subaddresses.first;
465 + address = subaddress.address;
466 }
467 }
lib/monero/monero_wallet_addresses.dart new
+38
@@ -0,0 +1,38 @@
1 +import 'package:cake_wallet/entities/wallet_addresses.dart';
2 +import 'package:cake_wallet/entities/wallet_addresses_credentials.dart';
3 +import 'package:cake_wallet/entities/wallet_info.dart';
4 +import 'monero_wallet_addresses_credentials.dart';
5 +
6 +class MoneroWalletAddresses extends WalletAddresses {
7 + MoneroWalletAddresses(WalletInfo walletInfo) : super(walletInfo);
8 +
9 + @override
10 + Future<void> update(WalletAddressesCredentials credentials) async {
11 + try {
12 + if (credentials == null) {
13 + return;
14 + }
15 +
16 + final _credentials = credentials as MoneroWalletAddressesCredentials;
17 + final _accountList = _credentials.accountList;
18 + final _subaddressList = _credentials.subaddressList;
19 +
20 + if (_accountList == null || _subaddressList == null) {
21 + return;
22 + }
23 +
24 + addresses.clear();
25 +
26 + _accountList.accounts.forEach((account) {
27 + _subaddressList.update(accountIndex: account.id);
28 + _subaddressList.subaddresses.forEach((subaddress) {
29 + addresses[subaddress.address] = subaddress.label;
30 + });
31 + });
32 +
33 + await save();
34 + } catch (e) {
35 + print(e.toString());
36 + }
37 + }
38 +}
\ No newline at end of file
lib/monero/monero_wallet_addresses_credentials.dart new
+9
@@ -0,0 +1,9 @@
1 +import 'package:cake_wallet/entities/wallet_addresses_credentials.dart';
2 +import 'package:cake_wallet/monero/monero_account_list.dart';
3 +import 'package:cake_wallet/monero/monero_subaddress_list.dart';
4 +
5 +class MoneroWalletAddressesCredentials extends WalletAddressesCredentials {
6 +
7 + MoneroAccountList accountList;
8 + MoneroSubaddressList subaddressList;
9 +}
\ No newline at end of file
lib/monero/monero_wallet_service.dart
-1
@@ -126,7 +126,6 @@ class MoneroWalletService extends WalletService<
126 }
127
128 await wallet.init();
129 - await wallet.updateAddressesInfo();
129
130 return wallet;
131 } catch (e) {
lib/view_model/contact_list/contact_list_view_model.dart
+10 -11
@@ -18,18 +18,17 @@ abstract class ContactListViewModelBase with Store {
18 : contacts = ObservableList<ContactRecord>(),
19 walletContacts = [] {
20 walletInfoSource.values.forEach((info) {
21 - if (info.address?.isNotEmpty ?? false) {
22 - if (info.addresses != null) {
23 - info.addresses?.forEach((address, label) {
24 - walletContacts.add(WalletContact(
25 - address,
26 - info.name + ' ($label)',
27 - walletTypeToCryptoCurrency(info.type)));
28 - });
29 - } else {
30 - walletContacts.add(WalletContact(info.address, info.name,
21 + if (info.addresses?.isNotEmpty ?? false) {
22 + info.addresses?.forEach((address, label) {
23 + final name = label.isNotEmpty
24 + ? info.name + ' ($label)'
25 + : info.name;
26 +
27 + walletContacts.add(WalletContact(
28 + address,
29 + name,
30 walletTypeToCryptoCurrency(info.type)));
32 - }
31 + });
32 }
33 });
34
lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart
+1 -2
@@ -42,8 +42,7 @@ abstract class MoneroAccountEditOrCreateViewModelBase with Store {
42 await _moneroAccountList.addAccount(label: label);
43 }
44
45 - await _wallet.updateAddressesInfo();
46 -
45 + await _wallet.save();
46 state = ExecutedSuccessfullyState();
47 } catch (e) {
48 state = FailureState(e.toString());
lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart
-2
@@ -54,8 +54,6 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store {
54 await _createNew();
55 }
56
57 - await _wallet.updateAddressesInfo();
58 -
57 state = AddressSavedSuccessfully();
58 } catch (e) {
59 state = AddressEditOrCreateStateFailure(error: e.toString());
lib/view_model/wallet_creation_vm.dart
-1
@@ -54,7 +54,6 @@ abstract class WalletCreationVMBase with Store {
54 await _walletInfoSource.add(walletInfo);
55 _appStore.changeCurrentWallet(wallet);
56 _appStore.authenticationStore.allowed();
57 - await wallet.updateAddressesInfo();
57 state = ExecutedSuccessfullyState();
58 } catch (e) {
59 state = FailureState(e.toString());