CAKE-343 | applied subaddresses for contact book; added addresses field to wallet_info.dart; added updateAddressesInfo() to wallet_base.dart; applied updateAddressesInfo() to wallet services and view models
OleksandrSobol committed
Jun 18, 2021 at 15:36 UTC
6709b7779a9692cfafd8186439b7e9ca1dfdfde0
13 files changed
+81
-18
lib/bitcoin/bitcoin_wallet_service.dart
+1
@@ -44,6 +44,7 @@ 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();
48
return wallet;
49
}
50
lib/bitcoin/electrum_wallet.dart
+2
@@ -125,6 +125,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
125
126
address = addresses[_accountIndex].address;
127
128
+ await updateAddressesInfo();
129
+
130
await save();
131
}
132
lib/bitcoin/litecoin_wallet_service.dart
+1
@@ -45,6 +45,7 @@ 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();
49
return wallet;
50
}
51
lib/core/wallet_base.dart
+9
@@ -66,4 +66,13 @@ abstract class WalletBase<
66
Future<void> rescan({int height});
67
68
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
+ }
78
}
lib/di.dart
+1
@@ -362,6 +362,7 @@ Future setup(
362
AccountListItem, void>(
363
(AccountListItem account, _) => MoneroAccountEditOrCreateViewModel(
364
(getIt.get<AppStore>().wallet as MoneroWallet).accountList,
365
+ wallet: getIt.get<AppStore>().wallet,
366
accountListItem: account));
367
368
getIt.registerFactoryParam<MoneroAccountEditOrCreatePage, AccountListItem,
lib/entities/wallet_info.dart
+3
@@ -53,5 +53,8 @@ class WalletInfo extends HiveObject {
53
@HiveField(8)
54
String address;
55
56
+ @HiveField(10)
57
+ Map<String, String> addresses;
58
+
59
DateTime get date => DateTime.fromMillisecondsSinceEpoch(timestamp);
60
}
lib/monero/monero_wallet.dart
+22
@@ -445,4 +445,26 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
445
print(e.toString());
446
}
447
}
448
+
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.addAll({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
+ }
469
+ }
470
}
lib/monero/monero_wallet_service.dart
+1
@@ -126,6 +126,7 @@ class MoneroWalletService extends WalletService<
126
}
127
128
await wallet.init();
129
+ await wallet.updateAddressesInfo();
130
131
return wallet;
132
} catch (e) {
lib/src/screens/contact/contact_list_page.dart
+13
-11
@@ -151,17 +151,19 @@ class ContactListPage extends BasePage {
151
crossAxisAlignment: CrossAxisAlignment.center,
152
children: <Widget>[
153
image ?? Offstage(),
154
- Padding(
155
- padding: image != null
156
- ? EdgeInsets.only(left: 12)
157
- : EdgeInsets.only(left: 0),
158
- child: Text(
159
- contact.name,
160
- style: TextStyle(
161
- fontSize: 14,
162
- fontWeight: FontWeight.normal,
163
- color: Theme.of(context).primaryTextTheme.title.color),
164
- ),
154
+ Expanded(
155
+ child: Padding(
156
+ padding: image != null
157
+ ? EdgeInsets.only(left: 12)
158
+ : EdgeInsets.only(left: 0),
159
+ child: Text(
160
+ contact.name,
161
+ style: TextStyle(
162
+ fontSize: 14,
163
+ fontWeight: FontWeight.normal,
164
+ color: Theme.of(context).primaryTextTheme.title.color),
165
+ ),
166
+ )
167
)
168
],
169
),
lib/view_model/contact_list/contact_list_view_model.dart
+17
-5
@@ -16,11 +16,23 @@ class ContactListViewModel = ContactListViewModelBase
16
abstract class ContactListViewModelBase with Store {
17
ContactListViewModelBase(this.contactSource, this.walletInfoSource)
18
: contacts = ObservableList<ContactRecord>(),
19
- walletContacts = walletInfoSource.values
20
- .where((info) => info.address?.isNotEmpty ?? false)
21
- .map((info) => WalletContact(
22
- info.address, info.name, walletTypeToCryptoCurrency(info.type)))
23
- .toList() {
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,
31
+ walletTypeToCryptoCurrency(info.type)));
32
+ }
33
+ }
34
+ });
35
+
36
_subscription = contactSource.bindToListWithTransform(
37
contacts, (Contact contact) => ContactRecord(contactSource, contact),
38
initialFire: true);
lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart
+8
-2
@@ -1,3 +1,5 @@
1
+import 'package:cake_wallet/core/wallet_base.dart';
2
+import 'package:flutter/foundation.dart';
3
import 'package:mobx/mobx.dart';
4
import 'package:cake_wallet/core/execution_state.dart';
5
import 'package:cake_wallet/monero/monero_account_list.dart';
@@ -10,11 +12,12 @@ class MoneroAccountEditOrCreateViewModel = MoneroAccountEditOrCreateViewModelBas
12
13
abstract class MoneroAccountEditOrCreateViewModelBase with Store {
14
MoneroAccountEditOrCreateViewModelBase(this._moneroAccountList,
13
- {AccountListItem accountListItem})
15
+ {@required WalletBase wallet, AccountListItem accountListItem})
16
: state = InitialExecutionState(),
17
isEdit = accountListItem != null,
18
label = accountListItem?.label??'',
17
- _accountListItem = accountListItem;
19
+ _accountListItem = accountListItem,
20
+ _wallet = wallet;
21
22
final bool isEdit;
23
@@ -26,6 +29,7 @@ abstract class MoneroAccountEditOrCreateViewModelBase with Store {
29
30
final MoneroAccountList _moneroAccountList;
31
final AccountListItem _accountListItem;
32
+ final WalletBase _wallet;
33
34
Future<void> save() async {
35
try {
@@ -38,6 +42,8 @@ abstract class MoneroAccountEditOrCreateViewModelBase with Store {
42
await _moneroAccountList.addAccount(label: label);
43
}
44
45
+ await _wallet.updateAddressesInfo();
46
+
47
state = ExecutedSuccessfullyState();
48
} catch (e) {
49
state = FailureState(e.toString());
lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart
+2
@@ -54,6 +54,8 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store {
54
await _createNew();
55
}
56
57
+ await _wallet.updateAddressesInfo();
58
+
59
state = AddressSavedSuccessfully();
60
} catch (e) {
61
state = AddressEditOrCreateStateFailure(error: e.toString());
lib/view_model/wallet_creation_vm.dart
+1
@@ -54,6 +54,7 @@ abstract class WalletCreationVMBase with Store {
54
await _walletInfoSource.add(walletInfo);
55
_appStore.changeCurrentWallet(wallet);
56
_appStore.authenticationStore.allowed();
57
+ await wallet.updateAddressesInfo();
58
state = ExecutedSuccessfullyState();
59
} catch (e) {
60
state = FailureState(e.toString());