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());