CAKE-343 | added bitcoin_wallet_addresses.dart and litecoin_wallet_addresses.dart tj the app; moved addresses from wallets to wallet addresses classes; deleted wallet addresses credentials

OleksandrSobol committed Jul 13, 2021 at 08:46 UTC 0d367c4b455c2ea9972649aad731f725754471dc
25 files changed +380 -308
lib/bitcoin/bitcoin_wallet.dart
+9 -7
@@ -1,12 +1,12 @@
1 import 'package:mobx/mobx.dart';
2 import 'package:flutter/foundation.dart';
3 import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
4 -import 'package:cake_wallet/bitcoin/utils.dart';
4 import 'package:cake_wallet/bitcoin/electrum_wallet_snapshot.dart';
5 import 'package:cake_wallet/bitcoin/electrum_wallet.dart';
6 import 'package:cake_wallet/entities/wallet_info.dart';
7 import 'package:cake_wallet/bitcoin/bitcoin_address_record.dart';
8 import 'package:cake_wallet/bitcoin/electrum_balance.dart';
9 +import 'package:cake_wallet/bitcoin/bitcoin_wallet_addresses.dart';
10
11 part 'bitcoin_wallet.g.dart';
12
@@ -26,8 +26,14 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
26 walletInfo: walletInfo,
27 networkType: bitcoin.bitcoin,
28 initialAddresses: initialAddresses,
29 - initialBalance: initialBalance,
30 - accountIndex: accountIndex);
29 + initialBalance: initialBalance) {
30 + walletAddresses = BitcoinWalletAddresses(
31 + walletInfo,
32 + initialAddresses: initialAddresses,
33 + accountIndex: accountIndex,
34 + hd: hd,
35 + networkType: networkType);
36 + }
37
38 static Future<BitcoinWallet> open({
39 @required String name,
@@ -44,8 +50,4 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
50 initialBalance: snp.balance,
51 accountIndex: snp.accountIndex);
52 }
47 -
48 - @override
49 - String getAddress({@required int index, @required bitcoin.HDWallet hd}) =>
50 - generateP2WPKHAddress(hd: hd, index: index, networkType: networkType);
53 }
lib/bitcoin/bitcoin_wallet_addresses.dart new
+33
@@ -0,0 +1,33 @@
1 +import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
2 +import 'package:cake_wallet/bitcoin/utils.dart';
3 +import 'package:cake_wallet/bitcoin/bitcoin_address_record.dart';
4 +import 'package:cake_wallet/bitcoin/electrum_wallet_addresses.dart';
5 +import 'package:cake_wallet/entities/wallet_info.dart';
6 +import 'package:flutter/foundation.dart';
7 +import 'package:mobx/mobx.dart';
8 +
9 +part 'bitcoin_wallet_addresses.g.dart';
10 +
11 +class BitcoinWalletAddresses = BitcoinWalletAddressesBase
12 + with _$BitcoinWalletAddresses;
13 +
14 +abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses
15 + with Store {
16 + BitcoinWalletAddressesBase(
17 + WalletInfo walletInfo,
18 + {@required List<BitcoinAddressRecord> initialAddresses,
19 + int accountIndex = 0,
20 + @required bitcoin.HDWallet hd,
21 + @required this.networkType})
22 + : super(
23 + walletInfo,
24 + initialAddresses: initialAddresses,
25 + accountIndex: accountIndex,
26 + hd: hd);
27 +
28 + bitcoin.NetworkType networkType;
29 +
30 + @override
31 + String getAddress({@required int index, @required bitcoin.HDWallet hd}) =>
32 + generateP2WPKHAddress(hd: hd, index: index, networkType: networkType);
33 +}
\ No newline at end of file
lib/bitcoin/electrum_wallet.dart
+10 -90
@@ -1,7 +1,6 @@
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';
4 import 'package:mobx/mobx.dart';
5 import 'package:rxdart/subjects.dart';
6 import 'package:flutter/foundation.dart';
@@ -44,18 +43,14 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
43 @required this.networkType,
44 @required this.mnemonic,
45 ElectrumClient electrumClient,
47 - int accountIndex = 0,
46 ElectrumBalance initialBalance})
47 : balance = initialBalance ??
48 const ElectrumBalance(confirmed: 0, unconfirmed: 0),
49 hd = bitcoin.HDWallet.fromSeed(mnemonicToSeedBytes(mnemonic),
50 network: networkType)
51 .derivePath("m/0'/0"),
54 - addresses = ObservableList<BitcoinAddressRecord>.of(
55 - (initialAddresses ?? []).toSet()),
52 syncStatus = NotConnectedSyncStatus(),
53 _password = password,
58 - _accountIndex = accountIndex,
54 _feeRates = <int>[],
55 _isTransactionUpdating = false,
56 super(walletInfo) {
@@ -65,8 +60,6 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
60 ElectrumTransactionHistory(walletInfo: walletInfo, password: password);
61 _unspent = [];
62 _scripthashesUpdateSubject = {};
68 - _walletAddressInBox = ElectrumWalletAddresses(walletInfo);
69 - _walletAddressInBoxCredentials = ElectrumWalletAddressesCredentials();
63 }
64
65 static int estimatedTransactionSize(int inputsCount, int outputsCounts) =>
@@ -78,8 +71,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
71 ElectrumClient electrumClient;
72
73 @override
81 - @observable
82 - String address;
74 + ElectrumWalletAddresses walletAddresses;
75
76 @override
77 @observable
@@ -89,17 +81,12 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
81 @observable
82 SyncStatus syncStatus;
83
92 - ObservableList<BitcoinAddressRecord> addresses;
93 -
94 - List<String> get scriptHashes => addresses
84 + List<String> get scriptHashes => walletAddresses.addresses
85 .map((addr) => scriptHash(addr.address, networkType: networkType))
86 .toList();
87
88 String get xpub => hd.base58;
89
100 - ElectrumWalletAddresses _walletAddressInBox;
101 - ElectrumWalletAddressesCredentials _walletAddressInBoxCredentials;
102 -
90 @override
91 String get seed => mnemonic;
92
@@ -112,73 +99,13 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
99 final String _password;
100 List<BitcoinUnspent> _unspent;
101 List<int> _feeRates;
115 - int _accountIndex;
102 Map<String, BehaviorSubject<Object>> _scripthashesUpdateSubject;
103 bool _isTransactionUpdating;
104
105 Future<void> init() async {
120 - await generateAddresses();
121 - address = addresses[_accountIndex].address;
106 + await walletAddresses.init();
107 await transactionHistory.init();
123 - await _updateWalletAddressInBox();
124 - }
125 -
126 - @action
127 - Future<void> nextAddress() async {
128 - _accountIndex += 1;
129 -
130 - if (_accountIndex >= addresses.length) {
131 - _accountIndex = 0;
132 - }
133 -
134 - address = addresses[_accountIndex].address;
135 -
136 - await save();
137 - }
138 -
139 - Future<void> generateAddresses() async {
140 - if (addresses.length < 33) {
141 - final addressesCount = 33 - addresses.length;
142 - await generateNewAddresses(addressesCount,
143 - startIndex: addresses.length, hd: hd);
144 - }
145 - }
146 -
147 - Future<BitcoinAddressRecord> generateNewAddress(
148 - {bool isHidden = false, bitcoin.HDWallet hd}) async {
149 - _accountIndex += 1;
150 - final _hd = hd ?? this.hd;
151 - final address = BitcoinAddressRecord(
152 - getAddress(index: _accountIndex, hd: _hd),
153 - index: _accountIndex,
154 - isHidden: isHidden);
155 - addresses.add(address);
156 - await save();
157 - return address;
158 - }
159 -
160 - Future<List<BitcoinAddressRecord>> generateNewAddresses(int count,
161 - {int startIndex = 0, bitcoin.HDWallet hd, bool isHidden = false}) async {
162 - final list = <BitcoinAddressRecord>[];
163 -
164 - for (var i = startIndex; i < count + startIndex; i++) {
165 - final address = BitcoinAddressRecord(getAddress(index: i, hd: hd),
166 - index: i, isHidden: isHidden);
167 - list.add(address);
168 - }
169 -
170 - addresses.addAll(list);
108 await save();
172 - return list;
173 - }
174 -
175 - Future<void> updateAddress(String address) async {
176 - for (final addr in addresses) {
177 - if (addr.address == address) {
178 - await save();
179 - break;
180 - }
181 - }
109 }
110
111 @action
@@ -186,7 +113,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
113 Future<void> startSync() async {
114 try {
115 syncStatus = StartingSyncStatus();
189 - updateTransactions();
116 + await updateTransactions();
117 _subscribeForUpdates();
118 await _updateBalance();
119 await _updateUnspent();
@@ -238,7 +165,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
165 ? allAmount
166 : credentialsAmount;
167 final txb = bitcoin.TransactionBuilder(network: networkType);
241 - final changeAddress = address;
168 + final changeAddress = walletAddresses.address;
169 var leftAmount = amount;
170 var totalInputAmount = 0;
171
@@ -321,8 +248,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
248
249 String toJSON() => json.encode({
250 'mnemonic': mnemonic,
324 - 'account_index': _accountIndex.toString(),
325 - 'addresses': addresses.map((addr) => addr.toJSON()).toList(),
251 + 'account_index': walletAddresses.accountIndex.toString(),
252 + 'addresses': walletAddresses.addresses.map((addr) => addr.toJSON()).toList(),
253 'balance': balance?.toJSON()
254 });
255
@@ -370,7 +297,6 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
297 final path = await makePath();
298 await write(path: path, password: _password, data: toJSON());
299 await transactionHistory.save();
373 - await _updateWalletAddressInBox();
300 }
301
302 bitcoin.ECPair keyPairFor({@required int index}) =>
@@ -386,13 +312,12 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
312 } catch (_) {}
313 }
314
389 - String getAddress({@required int index, @required bitcoin.HDWallet hd}) => '';
390 -
315 Future<String> makePath() async =>
316 pathForWallet(name: walletInfo.name, type: walletInfo.type);
317
318 Future<void> _updateUnspent() async {
395 - final unspent = await Future.wait(addresses.map((address) => electrumClient
319 + final unspent = await Future.wait(walletAddresses
320 + .addresses.map((address) => electrumClient
321 .getListUnspentWithAddress(address.address, networkType)
322 .then((unspent) => unspent
323 .map((unspent) => BitcoinUnspent.fromJSON(address, unspent)))));
@@ -403,7 +328,7 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
328 {@required String hash, @required int height}) async {
329 final tx = await electrumClient.getTransactionExpanded(hash: hash);
330 return ElectrumTransactionInfo.fromElectrumVerbose(tx, walletInfo.type,
406 - height: height, addresses: addresses);
331 + height: height, addresses: walletAddresses.addresses);
332 }
333
334 @override
@@ -473,9 +398,4 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
398 balance = await _fetchBalances();
399 await save();
400 }
476 -
477 - Future<void> _updateWalletAddressInBox() async {
478 - _walletAddressInBoxCredentials.address = address;
479 - await _walletAddressInBox.update(_walletAddressInBoxCredentials);
480 - }
401 }
lib/bitcoin/electrum_wallet_addresses.dart
+96 -17
@@ -1,30 +1,109 @@
1 -import 'package:cake_wallet/bitcoin/electrum_wallet_addresses_credentials.dart';
1 +import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
2 +import 'package:cake_wallet/bitcoin/bitcoin_address_record.dart';
3 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 +import 'package:flutter/foundation.dart';
6 +import 'package:mobx/mobx.dart';
7
6 -class ElectrumWalletAddresses extends WalletAddresses {
7 - ElectrumWalletAddresses(WalletInfo walletInfo) : super(walletInfo);
8 +part 'electrum_wallet_addresses.g.dart';
9 +
10 +class ElectrumWalletAddresses = ElectrumWalletAddressesBase
11 + with _$ElectrumWalletAddresses;
12 +
13 +abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
14 + ElectrumWalletAddressesBase(WalletInfo walletInfo,
15 + {@required List<BitcoinAddressRecord> initialAddresses,
16 + int accountIndex = 0,
17 + @required bitcoin.HDWallet hd})
18 + : super(walletInfo) {
19 + this.hd = hd;
20 + this.accountIndex = accountIndex;
21 + addresses = ObservableList<BitcoinAddressRecord>.of(
22 + (initialAddresses ?? []).toSet());
23 + }
24
25 @override
10 - Future<void> update(WalletAddressesCredentials credentials) async {
11 - try {
12 - if (credentials == null) {
13 - return;
14 - }
26 + @observable
27 + String address;
28 +
29 + bitcoin.HDWallet hd;
30 +
31 + ObservableList<BitcoinAddressRecord> addresses;
32 +
33 + int accountIndex;
34 +
35 + @override
36 + Future<void> init() async {
37 + await generateAddresses();
38 + address = addresses[accountIndex].address;
39 + await updateAddressesInBox();
40 + }
41 +
42 + @action
43 + Future<void> nextAddress() async {
44 + accountIndex += 1;
45 +
46 + if (accountIndex >= addresses.length) {
47 + accountIndex = 0;
48 + }
49 +
50 + address = addresses[accountIndex].address;
51
16 - final _credentials = credentials as ElectrumWalletAddressesCredentials;
17 - final _address = _credentials.address;
18 - final _label = '';
52 + await updateAddressesInBox();
53 + }
54 +
55 + Future<void> generateAddresses() async {
56 + if (addresses.length < 33) {
57 + final addressesCount = 33 - addresses.length;
58 + await generateNewAddresses(addressesCount,
59 + startIndex: addresses.length, hd: hd);
60 + }
61 + }
62
20 - if (_address == null || _address.isEmpty) {
21 - return;
63 + Future<BitcoinAddressRecord> generateNewAddress(
64 + {bool isHidden = false, bitcoin.HDWallet hd}) async {
65 + accountIndex += 1;
66 + final _hd = hd ?? this.hd;
67 + final address = BitcoinAddressRecord(
68 + getAddress(index: accountIndex, hd: _hd),
69 + index: accountIndex,
70 + isHidden: isHidden);
71 + addresses.add(address);
72 + return address;
73 + }
74 +
75 + Future<List<BitcoinAddressRecord>> generateNewAddresses(int count,
76 + {int startIndex = 0, bitcoin.HDWallet hd, bool isHidden = false}) async {
77 + final list = <BitcoinAddressRecord>[];
78 +
79 + for (var i = startIndex; i < count + startIndex; i++) {
80 + final address = BitcoinAddressRecord(getAddress(index: i, hd: hd),
81 + index: i, isHidden: isHidden);
82 + list.add(address);
83 + }
84 +
85 + addresses.addAll(list);
86 + return list;
87 + }
88 +
89 + /*Future<void> updateAddress(String address) async {
90 + for (final addr in addresses) {
91 + if (addr.address == address) {
92 + await save();
93 + break;
94 }
95 + }
96 + }*/
97
24 - addresses.clear();
25 - addresses[_address] = _label;
98 + String getAddress({@required int index, @required bitcoin.HDWallet hd}) => '';
99 +
100 + @override
101 + Future<void> updateAddressesInBox() async {
102 + try {
103 + addressesMap.clear();
104 + addressesMap[address] = '';
105
27 - await save();
106 + await saveAddressesInBox();
107 } catch (e) {
108 print(e.toString());
109 }
lib/bitcoin/electrum_wallet_addresses_credentials.dart deleted
-7
@@ -1,7 +0,0 @@
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.dart
+10 -26
@@ -1,6 +1,5 @@
1 -import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
2 -import 'package:cake_wallet/bitcoin/bitcoin_mnemonic.dart';
1 import 'package:cake_wallet/bitcoin/bitcoin_transaction_priority.dart';
2 +import 'package:cake_wallet/bitcoin/litecoin_wallet_addresses.dart';
3 import 'package:cake_wallet/entities/transaction_priority.dart';
4 import 'package:flutter/foundation.dart';
5 import 'package:mobx/mobx.dart';
@@ -10,7 +9,6 @@ import 'package:cake_wallet/bitcoin/electrum_wallet.dart';
9 import 'package:cake_wallet/bitcoin/bitcoin_address_record.dart';
10 import 'package:cake_wallet/bitcoin/electrum_balance.dart';
11 import 'package:cake_wallet/bitcoin/litecoin_network.dart';
13 -import 'package:cake_wallet/bitcoin/utils.dart';
12
13 part 'litecoin_wallet.g.dart';
14
@@ -30,8 +28,15 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
28 walletInfo: walletInfo,
29 networkType: litecoinNetwork,
30 initialAddresses: initialAddresses,
33 - initialBalance: initialBalance,
34 - accountIndex: accountIndex);
31 + initialBalance: initialBalance) {
32 + walletAddresses = LitecoinWalletAddresses(
33 + walletInfo,
34 + initialAddresses: initialAddresses,
35 + accountIndex: accountIndex,
36 + hd: hd,
37 + networkType: networkType,
38 + mnemonic: mnemonic);
39 + }
40
41 static Future<LitecoinWallet> open({
42 @required String name,
@@ -49,27 +54,6 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
54 accountIndex: snp.accountIndex);
55 }
56
52 - @override
53 - String getAddress({@required int index, @required bitcoin.HDWallet hd}) =>
54 - generateP2WPKHAddress(hd: hd, index: index, networkType: networkType);
55 -
56 - @override
57 - Future<void> generateAddresses() async {
58 - if (addresses.length < 33) {
59 - final addressesCount = 22 - addresses.length;
60 - await generateNewAddresses(addressesCount,
61 - hd: hd, startIndex: addresses.length);
62 -
63 - final changeRoot = bitcoin.HDWallet.fromSeed(
64 - mnemonicToSeedBytes(mnemonic),
65 - network: networkType)
66 - .derivePath("m/0'/1");
67 -
68 - await generateNewAddresses(11,
69 - startIndex: 0, hd: changeRoot, isHidden: true);
70 - }
71 - }
72 -
57 @override
58 int feeRate(TransactionPriority priority) {
59 if (priority is LitecoinTransactionPriority) {
lib/bitcoin/litecoin_wallet_addresses.dart new
+54
@@ -0,0 +1,54 @@
1 +import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
2 +import 'package:cake_wallet/bitcoin/bitcoin_mnemonic.dart';
3 +import 'package:cake_wallet/bitcoin/utils.dart';
4 +import 'package:cake_wallet/bitcoin/bitcoin_address_record.dart';
5 +import 'package:cake_wallet/bitcoin/electrum_wallet_addresses.dart';
6 +import 'package:cake_wallet/entities/wallet_info.dart';
7 +import 'package:flutter/foundation.dart';
8 +import 'package:mobx/mobx.dart';
9 +
10 +part 'litecoin_wallet_addresses.g.dart';
11 +
12 +class LitecoinWalletAddresses = LitecoinWalletAddressesBase
13 + with _$LitecoinWalletAddresses;
14 +
15 +abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses
16 + with Store {
17 + LitecoinWalletAddressesBase(
18 + WalletInfo walletInfo,
19 + {@required List<BitcoinAddressRecord> initialAddresses,
20 + int accountIndex = 0,
21 + @required bitcoin.HDWallet hd,
22 + @required this.networkType,
23 + @required this.mnemonic})
24 + : super(
25 + walletInfo,
26 + initialAddresses: initialAddresses,
27 + accountIndex: accountIndex,
28 + hd: hd);
29 +
30 + bitcoin.NetworkType networkType;
31 +
32 + final String mnemonic;
33 +
34 + @override
35 + String getAddress({@required int index, @required bitcoin.HDWallet hd}) =>
36 + generateP2WPKHAddress(hd: hd, index: index, networkType: networkType);
37 +
38 + @override
39 + Future<void> generateAddresses() async {
40 + if (addresses.length < 33) {
41 + final addressesCount = 22 - addresses.length;
42 + await generateNewAddresses(addressesCount,
43 + hd: hd, startIndex: addresses.length);
44 +
45 + final changeRoot = bitcoin.HDWallet.fromSeed(
46 + mnemonicToSeedBytes(mnemonic),
47 + network: networkType)
48 + .derivePath("m/0'/1");
49 +
50 + await generateNewAddresses(11,
51 + startIndex: 0, hd: changeRoot, isHidden: true);
52 + }
53 + }
54 +}
\ No newline at end of file
lib/buy/buy_provider.dart
+1 -1
@@ -15,7 +15,7 @@ abstract class BuyProvider {
15 String get trackUrl;
16
17 WalletType get walletType => wallet.type;
18 - String get walletAddress => wallet.address;
18 + String get walletAddress => wallet.walletAddresses.address;
19 String get walletId => wallet.id;
20
21 @override
lib/core/wallet_base.dart
+5 -2
@@ -1,6 +1,7 @@
1 import 'package:cake_wallet/entities/balance.dart';
2 import 'package:cake_wallet/entities/transaction_info.dart';
3 import 'package:cake_wallet/entities/transaction_priority.dart';
4 +import 'package:cake_wallet/entities/wallet_addresses.dart';
5 import 'package:flutter/foundation.dart';
6 import 'package:cake_wallet/entities/wallet_info.dart';
7 import 'package:cake_wallet/core/pending_transaction.dart';
@@ -30,9 +31,9 @@ abstract class WalletBase<
31
32 String get name => walletInfo.name;
33
33 - String get address;
34 + //String get address;
35
35 - set address(String address);
36 + //set address(String address);
37
38 BalanceType get balance;
39
@@ -44,6 +45,8 @@ abstract class WalletBase<
45
46 Object get keys;
47
48 + WalletAddresses get walletAddresses;
49 +
50 HistoryType transactionHistory;
51
52 Future<void> connectToNode({@required Node node});
lib/di.dart
+1 -1
@@ -361,7 +361,7 @@ Future setup(
361 getIt.registerFactoryParam<MoneroAccountEditOrCreateViewModel,
362 AccountListItem, void>(
363 (AccountListItem account, _) => MoneroAccountEditOrCreateViewModel(
364 - (getIt.get<AppStore>().wallet as MoneroWallet).accountList,
364 + (getIt.get<AppStore>().wallet as MoneroWallet).walletAddresses.accountList,
365 wallet: getIt.get<AppStore>().wallet,
366 accountListItem: account));
367
lib/entities/wallet_addresses.dart
+12 -6
@@ -1,24 +1,30 @@
1 -import 'package:cake_wallet/entities/wallet_addresses_credentials.dart';
1 import 'package:cake_wallet/entities/wallet_info.dart';
2
3 abstract class WalletAddresses {
4 WalletAddresses(this.walletInfo) {
6 - addresses = walletInfo?.addresses ?? {};
5 + addressesMap = {};
6 }
7
8 final WalletInfo walletInfo;
9
11 - Map<String, String> addresses;
10 + String get address;
11
13 - Future<void> update(WalletAddressesCredentials credentials);
12 + set address(String address);
13
15 - Future<void> save() async {
14 + Map<String, String> addressesMap;
15 +
16 + Future<void> init();
17 +
18 + Future<void> updateAddressesInBox();
19 +
20 + Future<void> saveAddressesInBox() async {
21 try {
22 if (walletInfo == null) {
23 return;
24 }
25
21 - walletInfo.addresses = addresses;
26 + walletInfo.address = address;
27 + walletInfo.addresses = addressesMap;
28
29 if (walletInfo.isInBox) {
30 await walletInfo.save();
lib/entities/wallet_addresses_credentials.dart deleted
-1
@@ -1 +0,0 @@
1 -abstract class WalletAddressesCredentials {}
\ No newline at end of file
lib/monero/monero_wallet.dart
+18 -72
@@ -4,7 +4,6 @@ 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';
7 import 'package:flutter/foundation.dart';
8 import 'package:mobx/mobx.dart';
9 import 'package:cw_monero/transaction_history.dart'
@@ -17,10 +16,7 @@ import 'package:cake_wallet/monero/pending_monero_transaction.dart';
16 import 'package:cake_wallet/monero/monero_wallet_keys.dart';
17 import 'package:cake_wallet/monero/monero_balance.dart';
18 import 'package:cake_wallet/monero/monero_transaction_history.dart';
20 -import 'package:cake_wallet/monero/monero_subaddress_list.dart';
21 -import 'package:cake_wallet/monero/monero_account_list.dart';
19 import 'package:cake_wallet/monero/account.dart';
23 -import 'package:cake_wallet/monero/subaddress.dart';
20 import 'package:cake_wallet/core/pending_transaction.dart';
21 import 'package:cake_wallet/core/wallet_base.dart';
22 import 'package:cake_wallet/entities/sync_status.dart';
@@ -37,9 +33,7 @@ class MoneroWallet = MoneroWalletBase with _$MoneroWallet;
33 abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
34 MoneroTransactionHistory, MoneroTransactionInfo> with Store {
35 MoneroWalletBase({WalletInfo walletInfo})
40 - : accountList = MoneroAccountList(),
41 - subaddressList = MoneroSubaddressList(),
42 - super(walletInfo) {
36 + : super(walletInfo) {
37 transactionHistory = MoneroTransactionHistory();
38 balance = MoneroBalance(
39 fullBalance: monero_wallet.getFullBalance(accountIndex: 0),
@@ -49,34 +43,25 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
43 _isSavingAfterSync = false;
44 _isSavingAfterNewTransaction = false;
45 _isTransactionUpdating = false;
52 - _walletAllAddresses = MoneroWalletAddresses(walletInfo);
53 - _walletAddressesCredentials = MoneroWalletAddressesCredentials();
54 - _onAccountChangeReaction = reaction((_) => account, (Account account) {
46 + walletAddresses = MoneroWalletAddresses(walletInfo);
47 + _onAccountChangeReaction = reaction((_) => walletAddresses.account,
48 + (Account account) {
49 balance = MoneroBalance(
50 fullBalance: monero_wallet.getFullBalance(accountIndex: account.id),
51 unlockedBalance:
52 monero_wallet.getUnlockedBalance(accountIndex: account.id));
59 - subaddressList.update(accountIndex: account.id);
60 - subaddress = subaddressList.subaddresses.first;
61 - address = subaddress.address;
53 + walletAddresses.updateSubaddressList(accountIndex: account.id);
54 });
55 }
56
57 static const int _autoAfterSyncSaveInterval = 60000;
58
67 - @observable
68 - Account account;
69 -
70 - @observable
71 - Subaddress subaddress;
72 -
59 @override
74 - @observable
75 - SyncStatus syncStatus;
60 + MoneroWalletAddresses walletAddresses;
61
62 @override
63 @observable
79 - String address;
64 + SyncStatus syncStatus;
65
66 @override
67 @observable
@@ -92,10 +77,6 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
77 publicSpendKey: monero_wallet.getPublicSpendKey(),
78 publicViewKey: monero_wallet.getPublicViewKey());
79
95 - final MoneroSubaddressList subaddressList;
96 -
97 - final MoneroAccountList accountList;
98 -
80 SyncListener _listener;
81 ReactionDisposer _onAccountChangeReaction;
82 int _lastAutosaveTimestamp;
@@ -103,20 +84,13 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
84 bool _isSavingAfterNewTransaction;
85 bool _isTransactionUpdating;
86 int _lastSaveTimestamp;
106 - MoneroWalletAddresses _walletAllAddresses;
107 - MoneroWalletAddressesCredentials _walletAddressesCredentials;
87
88 Future<void> init() async {
110 - accountList.update();
111 - account = accountList.accounts.first;
112 - subaddressList.update(accountIndex: account.id ?? 0);
113 - subaddress = subaddressList.getAll().first;
89 + await walletAddresses.init();
90 balance = MoneroBalance(
115 - fullBalance: monero_wallet.getFullBalance(accountIndex: account.id),
91 + fullBalance: monero_wallet.getFullBalance(accountIndex: walletAddresses.account.id),
92 unlockedBalance:
117 - monero_wallet.getUnlockedBalance(accountIndex: account.id));
118 - address = subaddress.address;
119 - await _updateWalletAllAddressesInBox();
93 + monero_wallet.getUnlockedBalance(accountIndex: walletAddresses.account.id));
94 _setListeners();
95 await updateTransactions();
96
@@ -136,24 +110,6 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
110 _onAccountChangeReaction?.reaction?.dispose();
111 }
112
139 - bool validate() {
140 - accountList.update();
141 - final accountListLength = accountList.accounts?.length ?? 0;
142 -
143 - if (accountListLength <= 0) {
144 - return false;
145 - }
146 -
147 - subaddressList.update(accountIndex: accountList.accounts.first.id);
148 - final subaddressListLength = subaddressList.subaddresses?.length ?? 0;
149 -
150 - if (subaddressListLength <= 0) {
151 - return false;
152 - }
153 -
154 - return true;
155 - }
156 -
113 @override
114 Future<void> connectToNode({@required Node node}) async {
115 try {
@@ -196,7 +152,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
152 ? moneroParseAmount(amount: _credentials.amount)
153 : null;
154 final unlockedBalance =
199 - monero_wallet.getUnlockedBalance(accountIndex: account.id);
155 + monero_wallet.getUnlockedBalance(accountIndex: walletAddresses.account.id);
156
157 if ((amount != null && unlockedBalance < amount) ||
158 (amount == null && unlockedBalance <= 0)) {
@@ -216,7 +172,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
172 paymentId: _credentials.paymentId,
173 amount: _credentials.amount,
174 priorityRaw: _credentials.priority.serialize(),
219 - accountIndex: account.id);
175 + accountIndex: walletAddresses.account.id);
176
177 return PendingMoneroTransaction(pendingTransactionDescription);
178 }
@@ -245,7 +201,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
201
202 @override
203 Future<void> save() async {
248 - await _updateWalletAllAddressesInBox();
204 + await walletAddresses.updateAddressesInBox();
205
206 final now = DateTime.now().millisecondsSinceEpoch;
207
@@ -274,7 +230,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
230 monero_wallet.rescanBlockchainAsync();
231 await startSync();
232 _askForUpdateBalance();
277 - accountList.update();
233 + walletAddresses.accountList.update();
234 await _askForUpdateTransactionHistory();
235 await save();
236 await walletInfo.save();
@@ -373,10 +329,10 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
329 await updateTransactions();
330
331 int _getFullBalance() =>
376 - monero_wallet.getFullBalance(accountIndex: account.id);
332 + monero_wallet.getFullBalance(accountIndex: walletAddresses.account.id);
333
334 int _getUnlockedBalance() =>
379 - monero_wallet.getUnlockedBalance(accountIndex: account.id);
335 + monero_wallet.getUnlockedBalance(accountIndex: walletAddresses.account.id);
336
337 Future<void> _afterSyncSave() async {
338 try {
@@ -423,13 +379,13 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
379 if (walletInfo.isRecovery) {
380 await _askForUpdateTransactionHistory();
381 _askForUpdateBalance();
426 - accountList.update();
382 + walletAddresses.accountList.update();
383 }
384
385 if (blocksLeft < 100) {
386 await _askForUpdateTransactionHistory();
387 _askForUpdateBalance();
432 - accountList.update();
388 + walletAddresses.accountList.update();
389 syncStatus = SyncedSyncStatus();
390 await _afterSyncSave();
391
@@ -454,14 +410,4 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
410 print(e.toString());
411 }
412 }
457 -
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 - }
413 }
lib/monero/monero_wallet_addresses.dart
+66 -19
@@ -1,38 +1,85 @@
1 import 'package:cake_wallet/entities/wallet_addresses.dart';
2 -import 'package:cake_wallet/entities/wallet_addresses_credentials.dart';
2 import 'package:cake_wallet/entities/wallet_info.dart';
4 -import 'monero_wallet_addresses_credentials.dart';
3 +import 'package:cake_wallet/monero/account.dart';
4 +import 'package:cake_wallet/monero/monero_account_list.dart';
5 +import 'package:cake_wallet/monero/monero_subaddress_list.dart';
6 +import 'package:cake_wallet/monero/subaddress.dart';
7 +import 'package:mobx/mobx.dart';
8
6 -class MoneroWalletAddresses extends WalletAddresses {
7 - MoneroWalletAddresses(WalletInfo walletInfo) : super(walletInfo);
9 +part 'monero_wallet_addresses.g.dart';
10 +
11 +class MoneroWalletAddresses = MoneroWalletAddressesBase
12 + with _$MoneroWalletAddresses;
13 +
14 +abstract class MoneroWalletAddressesBase extends WalletAddresses with Store {
15 + MoneroWalletAddressesBase(WalletInfo walletInfo) : super(walletInfo) {
16 + accountList = MoneroAccountList();
17 + subaddressList = MoneroSubaddressList();
18 + }
19
20 @override
10 - Future<void> update(WalletAddressesCredentials credentials) async {
11 - try {
12 - if (credentials == null) {
13 - return;
14 - }
21 + @observable
22 + String address;
23 +
24 + @observable
25 + Account account;
26 +
27 + @observable
28 + Subaddress subaddress;
29
16 - final _credentials = credentials as MoneroWalletAddressesCredentials;
17 - final _accountList = _credentials.accountList;
18 - final _subaddressList = _credentials.subaddressList;
30 + MoneroSubaddressList subaddressList;
31
20 - if (_accountList == null || _subaddressList == null) {
21 - return;
22 - }
32 + MoneroAccountList accountList;
33 +
34 + @override
35 + Future<void> init() async {
36 + accountList.update();
37 + account = accountList.accounts.first;
38 + updateSubaddressList(accountIndex: account.id ?? 0);
39 + await updateAddressesInBox();
40 + }
41 +
42 + @override
43 + Future<void> updateAddressesInBox() async {
44 + try {
45 + final _subaddressList = MoneroSubaddressList();
46
24 - addresses.clear();
47 + addressesMap.clear();
48
26 - _accountList.accounts.forEach((account) {
49 + accountList.accounts.forEach((account) {
50 _subaddressList.update(accountIndex: account.id);
51 _subaddressList.subaddresses.forEach((subaddress) {
29 - addresses[subaddress.address] = subaddress.label;
52 + addressesMap[subaddress.address] = subaddress.label;
53 });
54 });
55
33 - await save();
56 + await saveAddressesInBox();
57 } catch (e) {
58 print(e.toString());
59 }
60 }
61 +
62 + bool validate() {
63 + accountList.update();
64 + final accountListLength = accountList.accounts?.length ?? 0;
65 +
66 + if (accountListLength <= 0) {
67 + return false;
68 + }
69 +
70 + subaddressList.update(accountIndex: accountList.accounts.first.id);
71 + final subaddressListLength = subaddressList.subaddresses?.length ?? 0;
72 +
73 + if (subaddressListLength <= 0) {
74 + return false;
75 + }
76 +
77 + return true;
78 + }
79 +
80 + void updateSubaddressList({int accountIndex}) {
81 + subaddressList.update(accountIndex: accountIndex);
82 + subaddress = subaddressList.subaddresses.first;
83 + address = subaddress.address;
84 + }
85 }
\ No newline at end of file
lib/monero/monero_wallet_addresses_credentials.dart deleted
-9
@@ -1,9 +0,0 @@
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 -1
@@ -117,7 +117,7 @@ class MoneroWalletService extends WalletService<
117 (info) => info.id == WalletBase.idFor(name, getType()),
118 orElse: () => null);
119 final wallet = MoneroWallet(walletInfo: walletInfo);
120 - final isValid = wallet.validate();
120 + final isValid = wallet.walletAddresses.validate();
121
122 if (!isValid) {
123 await _removeCache(name);
lib/reactions/on_current_wallet_change.dart
+1 -1
@@ -37,7 +37,7 @@ void startCurrentWalletChangeReaction(AppStore appStore,
37 await wallet.connectToNode(node: node);
38
39 if (wallet.walletInfo.address?.isEmpty ?? true) {
40 - wallet.walletInfo.address = wallet.address;
40 + wallet.walletInfo.address = wallet.walletAddresses.address;
41
42 if (wallet.walletInfo.isInBox) {
43 await wallet.walletInfo.save();
lib/src/screens/exchange/exchange_page.dart
+8 -6
@@ -179,7 +179,7 @@ class ExchangePage extends BasePage {
179 initialAddress:
180 exchangeViewModel.depositCurrency ==
181 exchangeViewModel.wallet.currency
182 - ? exchangeViewModel.wallet.address
182 + ? exchangeViewModel.wallet.walletAddresses.address
183 : exchangeViewModel.depositAddress,
184 initialIsAmountEditable: true,
185 initialIsAddressEditable:
@@ -240,7 +240,7 @@ class ExchangePage extends BasePage {
240 initialAddress: exchangeViewModel
241 .receiveCurrency ==
242 exchangeViewModel.wallet.currency
243 - ? exchangeViewModel.wallet.address
243 + ? exchangeViewModel.wallet.walletAddresses.address
244 : exchangeViewModel.receiveAddress,
245 initialIsAmountEditable: exchangeViewModel
246 .isReceiveAmountEditable,
@@ -646,7 +646,8 @@ class ExchangePage extends BasePage {
646 }
647 });
648
649 - reaction((_) => exchangeViewModel.wallet.address, (String address) {
649 + reaction((_) => exchangeViewModel.wallet.walletAddresses.address,
650 + (String address) {
651 if (exchangeViewModel.depositCurrency == CryptoCurrency.xmr) {
652 depositKey.currentState.changeAddress(address: address);
653 }
@@ -707,7 +708,8 @@ class ExchangePage extends BasePage {
708 isCurrentTypeWallet ? exchangeViewModel.wallet.name : null);
709
710 key.currentState.changeAddress(
710 - address: isCurrentTypeWallet ? exchangeViewModel.wallet.address : '');
711 + address: isCurrentTypeWallet
712 + ? exchangeViewModel.wallet.walletAddresses.address : '');
713
714 key.currentState.changeAmount(amount: '');
715 }
@@ -719,9 +721,9 @@ class ExchangePage extends BasePage {
721 if (isCurrentTypeWallet) {
722 key.currentState.changeWalletName(exchangeViewModel.wallet.name);
723 key.currentState.addressController.text =
722 - exchangeViewModel.wallet.address;
724 + exchangeViewModel.wallet.walletAddresses.address;
725 } else if (key.currentState.addressController.text ==
724 - exchangeViewModel.wallet.address) {
726 + exchangeViewModel.wallet.walletAddresses.address) {
727 key.currentState.changeWalletName(null);
728 key.currentState.addressController.text = null;
729 }
lib/src/screens/exchange/exchange_template_page.dart
+8 -6
@@ -129,7 +129,7 @@ class ExchangeTemplatePage extends BasePage {
129 initialAddress: exchangeViewModel
130 .depositCurrency ==
131 exchangeViewModel.wallet.currency
132 - ? exchangeViewModel.wallet.address
132 + ? exchangeViewModel.wallet.walletAddresses.address
133 : exchangeViewModel.depositAddress,
134 initialIsAmountEditable: true,
135 initialIsAddressEditable: exchangeViewModel
@@ -168,7 +168,7 @@ class ExchangeTemplatePage extends BasePage {
168 initialAddress:
169 exchangeViewModel.receiveCurrency ==
170 exchangeViewModel.wallet.currency
171 - ? exchangeViewModel.wallet.address
171 + ? exchangeViewModel.wallet.walletAddresses.address
172 : exchangeViewModel.receiveAddress,
173 initialIsAmountEditable:
174 exchangeViewModel.provider is
@@ -383,7 +383,8 @@ class ExchangeTemplatePage extends BasePage {
383 }
384 });
385
386 - reaction((_) => exchangeViewModel.wallet.address, (String address) {
386 + reaction((_) => exchangeViewModel.wallet.walletAddresses.address,
387 + (String address) {
388 if (exchangeViewModel.depositCurrency == CryptoCurrency.xmr) {
389 depositKey.currentState.changeAddress(address: address);
390 }
@@ -405,7 +406,8 @@ class ExchangeTemplatePage extends BasePage {
406 isCurrentTypeWallet ? exchangeViewModel.wallet.name : null);
407
408 key.currentState.changeAddress(
408 - address: isCurrentTypeWallet ? exchangeViewModel.wallet.address : '');
409 + address: isCurrentTypeWallet
410 + ? exchangeViewModel.wallet.walletAddresses.address : '');
411
412 key.currentState.changeAmount(amount: '');
413 }
@@ -417,9 +419,9 @@ class ExchangeTemplatePage extends BasePage {
419 if (isCurrentTypeWallet) {
420 key.currentState.changeWalletName(exchangeViewModel.wallet.name);
421 key.currentState.addressController.text =
420 - exchangeViewModel.wallet.address;
422 + exchangeViewModel.wallet.walletAddresses.address;
423 } else if (key.currentState.addressController.text ==
422 - exchangeViewModel.wallet.address) {
424 + exchangeViewModel.wallet.walletAddresses.address) {
425 key.currentState.changeWalletName(null);
426 key.currentState.addressController.text = null;
427 }
lib/view_model/dashboard/dashboard_view_model.dart
+12 -12
@@ -92,17 +92,17 @@ abstract class DashboardViewModelBase with Store {
92 final _wallet = wallet;
93
94 if (_wallet is MoneroWallet) {
95 - subname = _wallet.account?.label;
95 + subname = _wallet.walletAddresses.account?.label;
96
97 - _onMoneroAccountChangeReaction = reaction((_) => _wallet.account,
98 - (Account account) => _onMoneroAccountChange(_wallet));
97 + _onMoneroAccountChangeReaction = reaction((_) => _wallet.walletAddresses
98 + .account, (Account account) => _onMoneroAccountChange(_wallet));
99
100 _onMoneroBalanceChangeReaction = reaction((_) => _wallet.balance,
101 (MoneroBalance balance) => _onMoneroTransactionsUpdate(_wallet));
102
103 final _accountTransactions = _wallet
104 .transactionHistory.transactions.values
105 - .where((tx) => tx.accountIndex == _wallet.account.id)
105 + .where((tx) => tx.accountIndex == _wallet.walletAddresses.account.id)
106 .toList();
107
108 transactions = ObservableList.of(_accountTransactions.map((transaction) =>
@@ -131,7 +131,7 @@ abstract class DashboardViewModelBase with Store {
131 filter: (TransactionInfo tx) {
132 final wallet = _wallet;
133 if (tx is MoneroTransactionInfo && wallet is MoneroWallet) {
134 - return tx.accountIndex == wallet.account.id;
134 + return tx.accountIndex == wallet.walletAddresses.account.id;
135 }
136
137 return true;
@@ -153,7 +153,7 @@ abstract class DashboardViewModelBase with Store {
153 String subname;
154
155 @computed
156 - String get address => wallet.address;
156 + String get address => wallet.walletAddresses.address;
157
158 @computed
159 SyncStatus get status => wallet.syncStatus;
@@ -251,13 +251,13 @@ abstract class DashboardViewModelBase with Store {
251 wallet.type == WalletType.bitcoin && wallet.seed.split(' ').length < 24;
252
253 if (wallet is MoneroWallet) {
254 - subname = wallet.account?.label;
254 + subname = wallet.walletAddresses.account?.label;
255
256 _onMoneroAccountChangeReaction?.reaction?.dispose();
257 _onMoneroBalanceChangeReaction?.reaction?.dispose();
258
259 - _onMoneroAccountChangeReaction = reaction((_) => wallet.account,
260 - (Account account) => _onMoneroAccountChange(wallet));
259 + _onMoneroAccountChangeReaction = reaction((_) => wallet.walletAddresses
260 + .account, (Account account) => _onMoneroAccountChange(wallet));
261
262 _onMoneroBalanceChangeReaction = reaction((_) => wallet.balance,
263 (MoneroBalance balance) => _onMoneroTransactionsUpdate(wallet));
@@ -284,7 +284,7 @@ abstract class DashboardViewModelBase with Store {
284 settingsStore: appStore.settingsStore),
285 filter: (TransactionInfo tx) {
286 if (tx is MoneroTransactionInfo && wallet is MoneroWallet) {
287 - return tx.accountIndex == wallet.account.id;
287 + return tx.accountIndex == wallet.walletAddresses.account.id;
288 }
289
290 return true;
@@ -293,7 +293,7 @@ abstract class DashboardViewModelBase with Store {
293
294 @action
295 void _onMoneroAccountChange(MoneroWallet wallet) {
296 - subname = wallet.account?.label;
296 + subname = wallet.walletAddresses.account?.label;
297 _onMoneroTransactionsUpdate(wallet);
298 }
299
@@ -302,7 +302,7 @@ abstract class DashboardViewModelBase with Store {
302 transactions.clear();
303
304 final _accountTransactions = wallet.transactionHistory.transactions.values
305 - .where((tx) => tx.accountIndex == wallet.account.id)
305 + .where((tx) => tx.accountIndex == wallet.walletAddresses.account.id)
306 .toList();
307
308 transactions.addAll(_accountTransactions.map((transaction) =>
lib/view_model/exchange/exchange_view_model.dart
+6 -3
@@ -41,7 +41,8 @@ abstract class ExchangeViewModelBase with Store {
41 depositAmount = '';
42 receiveAmount = '';
43 receiveAddress = '';
44 - depositAddress = depositCurrency == wallet.currency ? wallet.address : '';
44 + depositAddress = depositCurrency == wallet.currency
45 + ? wallet.walletAddresses.address : '';
46 limitsState = LimitsInitialState();
47 tradeState = ExchangeTradeStateInitial();
48 _cryptoNumberFormat = NumberFormat()..maximumFractionDigits = 12;
@@ -308,8 +309,10 @@ abstract class ExchangeViewModelBase with Store {
309 isReceiveAmountEntered = false;
310 depositAmount = '';
311 receiveAmount = '';
311 - depositAddress = depositCurrency == wallet.currency ? wallet.address : '';
312 - receiveAddress = receiveCurrency == wallet.currency ? wallet.address : '';
312 + depositAddress = depositCurrency == wallet.currency
313 + ? wallet.walletAddresses.address : '';
314 + receiveAddress = receiveCurrency == wallet.currency
315 + ? wallet.walletAddresses.address : '';
316 isDepositAddressEnabled = !(depositCurrency == wallet.currency);
317 isReceiveAddressEnabled = !(receiveCurrency == wallet.currency);
318 isFixedRateMode = false;
lib/view_model/monero_account_list/monero_account_list_view_model.dart
+5 -4
@@ -20,15 +20,16 @@ abstract class MoneroAccountListViewModelBase with Store {
20 }
21
22 @computed
23 - List<AccountListItem> get accounts => _moneroWallet.accountList.accounts
24 - .map((acc) => AccountListItem(
23 + List<AccountListItem> get accounts => _moneroWallet.walletAddresses
24 + .accountList.accounts.map((acc) => AccountListItem(
25 label: acc.label,
26 id: acc.id,
27 - isSelected: acc.id == _moneroWallet.account.id))
27 + isSelected: acc.id == _moneroWallet.walletAddresses.account.id))
28 .toList();
29
30 final MoneroWallet _moneroWallet;
31
32 void select(AccountListItem item) =>
33 - _moneroWallet.account = Account(id: item.id, label: item.label);
33 + _moneroWallet.walletAddresses.account =
34 + Account(id: item.id, label: item.label);
35 }
lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart
+12 -8
@@ -64,12 +64,15 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store {
64 final wallet = _wallet;
65
66 if (wallet is ElectrumWallet) {
67 - await wallet.generateNewAddress();
67 + await wallet.walletAddresses.generateNewAddress();
68 + await wallet.save();
69 }
70
71 if (wallet is MoneroWallet) {
71 - await wallet.subaddressList
72 - .addSubaddress(accountIndex: wallet.account.id, label: label);
72 + await wallet.walletAddresses.subaddressList
73 + .addSubaddress(
74 + accountIndex: wallet.walletAddresses.account.id,
75 + label: label);
76 await wallet.save();
77 }
78 }
@@ -77,13 +80,14 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store {
80 Future<void> _update() async {
81 final wallet = _wallet;
82
80 - if (wallet is BitcoinWallet) {
81 - await wallet.updateAddress(_item.address as String);
82 - }
83 + /*if (wallet is BitcoinWallet) {
84 + await wallet.walletAddresses.updateAddress(_item.address as String);
85 + await wallet.save();
86 + }*/
87
88 if (wallet is MoneroWallet) {
85 - await wallet.subaddressList.setLabelSubaddress(
86 - accountIndex: wallet.account.id,
89 + await wallet.walletAddresses.subaddressList.setLabelSubaddress(
90 + accountIndex: wallet.walletAddresses.account.id,
91 addressIndex: _item.id as int,
92 label: label);
93 await wallet.save();
lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
+11 -8
@@ -80,7 +80,7 @@ abstract class WalletAddressListViewModelBase with Store {
80
81 @computed
82 WalletAddressListItem get address =>
83 - WalletAddressListItem(address: _wallet.address);
83 + WalletAddressListItem(address: _wallet.walletAddresses.address);
84
85 @computed
86 PaymentURI get uri {
@@ -105,8 +105,10 @@ abstract class WalletAddressListViewModelBase with Store {
105 final addressList = ObservableList<ListItem>();
106
107 if (wallet is MoneroWallet) {
108 - final primaryAddress = wallet.subaddressList.subaddresses.first;
109 - addressList.addAll(wallet.subaddressList.subaddresses.map((subaddress) {
108 + final primaryAddress =
109 + wallet.walletAddresses.subaddressList.subaddresses.first;
110 + addressList.addAll(wallet.walletAddresses.subaddressList.subaddresses
111 + .map((subaddress) {
112 final isPrimary = subaddress == primaryAddress;
113
114 return WalletAddressListItem(
@@ -118,8 +120,8 @@ abstract class WalletAddressListViewModelBase with Store {
120 }
121
122 if (wallet is BitcoinWallet) {
121 - final primaryAddress = wallet.addresses.first;
122 - final bitcoinAddresses = wallet.addresses.map((addr) {
123 + final primaryAddress = wallet.walletAddresses.addresses.first;
124 + final bitcoinAddresses = wallet.walletAddresses.addresses.map((addr) {
125 final isPrimary = addr == primaryAddress;
126
127 return WalletAddressListItem(
@@ -139,7 +141,7 @@ abstract class WalletAddressListViewModelBase with Store {
141 final wallet = _wallet;
142
143 if (wallet is MoneroWallet) {
142 - return wallet.account.label;
144 + return wallet.walletAddresses.account.label;
145 }
146
147 return null;
@@ -160,7 +162,7 @@ abstract class WalletAddressListViewModelBase with Store {
162
163 @action
164 void setAddress(WalletAddressListItem address) =>
163 - _wallet.address = address.address;
165 + _wallet.walletAddresses.address = address.address;
166
167 void _init() {
168 _baseItems = [];
@@ -177,7 +179,8 @@ abstract class WalletAddressListViewModelBase with Store {
179 final wallet = _wallet;
180
181 if (wallet is ElectrumWallet) {
180 - wallet.nextAddress();
182 + wallet.walletAddresses.nextAddress();
183 + wallet.save();
184 }
185 }
186 }
lib/view_model/wallet_creation_vm.dart
+1 -1
@@ -50,7 +50,7 @@ abstract class WalletCreationVMBase with Store {
50 dirPath: dirPath);
51 credentials.walletInfo = walletInfo;
52 final wallet = await process(credentials);
53 - walletInfo.address = wallet.address;
53 + walletInfo.address = wallet.walletAddresses.address;
54 await _walletInfoSource.add(walletInfo);
55 _appStore.changeCurrentWallet(wallet);
56 _appStore.authenticationStore.allowed();