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