revert subaddress fix (#1656)

add show/hide passphrase

Omar Hatem committed Aug 29, 2024 at 00:52 UTC 82f64a42642516d1abed58c12be4018129c6e813
13 files changed +51 -126
cw_monero/lib/api/transaction_history.dart
+5 -22
@@ -45,8 +45,6 @@ List<Transaction> getAllTransactions() {
45 confirmations: 0,
46 blockheight: 0,
47 accountIndex: i,
48 - addressIndex: 0,
49 - addressIndexList: [0],
48 paymentId: "",
49 amount: fullBalance - availBalance,
50 isSpend: false,
@@ -247,30 +245,19 @@ Future<PendingTransactionDescription> createTransactionMultDest(
245
246 class Transaction {
247 final String displayLabel;
250 - String get subaddressLabel => monero.Wallet_getSubaddressLabel(
248 + String subaddressLabel = monero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0);
249 + late final String address = monero.Wallet_address(
250 wptr!,
252 - accountIndex: accountIndex,
253 - addressIndex: addressIndex,
251 + accountIndex: 0,
252 + addressIndex: 0,
253 );
255 - String get address => monero.Wallet_address(
256 - wptr!,
257 - accountIndex: accountIndex,
258 - addressIndex: addressIndex,
259 - );
260 - List<String> get addressList => List.generate(addressIndexList.length, (index) =>
261 - monero.Wallet_address(
262 - wptr!,
263 - accountIndex: accountIndex,
264 - addressIndex: addressIndexList[index],
265 - ));
254 final String description;
255 final int fee;
256 final int confirmations;
257 late final bool isPending = confirmations < 10;
258 final int blockheight;
271 - final int addressIndex;
259 + final int addressIndex = 0;
260 final int accountIndex;
273 - final List<int> addressIndexList;
261 final String paymentId;
262 final int amount;
263 final bool isSpend;
@@ -316,8 +303,6 @@ class Transaction {
303 amount = monero.TransactionInfo_amount(txInfo),
304 paymentId = monero.TransactionInfo_paymentId(txInfo),
305 accountIndex = monero.TransactionInfo_subaddrAccount(txInfo),
319 - addressIndex = int.tryParse(monero.TransactionInfo_subaddrIndex(txInfo).split(", ")[0]) ?? 0,
320 - addressIndexList = monero.TransactionInfo_subaddrIndex(txInfo).split(", ").map((e) => int.tryParse(e) ?? 0).toList(),
306 blockheight = monero.TransactionInfo_blockHeight(txInfo),
307 confirmations = monero.TransactionInfo_confirmations(txInfo),
308 fee = monero.TransactionInfo_fee(txInfo),
@@ -331,8 +316,6 @@ class Transaction {
316 required this.confirmations,
317 required this.blockheight,
318 required this.accountIndex,
334 - required this.addressIndexList,
335 - required this.addressIndex,
319 required this.paymentId,
320 required this.amount,
321 required this.isSpend,
cw_monero/lib/monero_subaddress_list.dart
+3 -6
@@ -1,7 +1,6 @@
1 import 'package:cw_core/subaddress.dart';
2 import 'package:cw_monero/api/coins_info.dart';
3 import 'package:cw_monero/api/subaddress_list.dart' as subaddress_list;
4 -import 'package:cw_monero/api/wallet.dart';
4 import 'package:flutter/services.dart';
5 import 'package:mobx/mobx.dart';
6
@@ -104,9 +103,6 @@ abstract class MoneroSubaddressListBase with Store {
103 required List<String> usedAddresses,
104 }) async {
105 _usedAddresses.addAll(usedAddresses);
107 - final _all = _usedAddresses.toSet().toList();
108 - _usedAddresses.clear();
109 - _usedAddresses.addAll(_all);
106 if (_isUpdating) {
107 return;
108 }
@@ -128,7 +124,7 @@ abstract class MoneroSubaddressListBase with Store {
124 Future<List<Subaddress>> _getAllUnusedAddresses(
125 {required int accountIndex, required String label}) async {
126 final allAddresses = subaddress_list.getAllSubaddresses();
131 - if (allAddresses.isEmpty || _usedAddresses.contains(allAddresses.first.address)) {
127 + if (allAddresses.isEmpty || _usedAddresses.contains(allAddresses.last)) {
128 final isAddressUnused = await _newSubaddress(accountIndex: accountIndex, label: label);
129 if (!isAddressUnused) {
130 return await _getAllUnusedAddresses(accountIndex: accountIndex, label: label);
@@ -147,7 +143,8 @@ abstract class MoneroSubaddressListBase with Store {
143 label.toLowerCase() == 'Primary account'.toLowerCase()
144 ? 'Primary address'
145 : label);
150 - }).toList().reversed.toList();
146 + })
147 + .toList();
148 }
149
150 Future<bool> _newSubaddress({required int accountIndex, required String label}) async {
cw_monero/lib/monero_wallet.dart
-5
@@ -86,9 +86,6 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
86 reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
87 _updateSubAddress(enabled, account: walletAddresses.account);
88 });
89 - _onTxHistoryChangeReaction = reaction((_) => transactionHistory, (__) {
90 - _updateSubAddress(isEnabledAutoGenerateSubaddress, account: walletAddresses.account);
91 - });
89 }
90
91 static const int _autoSaveInterval = 30;
@@ -131,7 +128,6 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
128
129 monero_wallet.SyncListener? _listener;
130 ReactionDisposer? _onAccountChangeReaction;
134 - ReactionDisposer? _onTxHistoryChangeReaction;
131 bool _isTransactionUpdating;
132 bool _hasSyncAfterStartup;
133 Timer? _autoSaveTimer;
@@ -171,7 +167,6 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
167 void close() async {
168 _listener?.stop();
169 _onAccountChangeReaction?.reaction.dispose();
174 - _onTxHistoryChangeReaction?.reaction.dispose();
170 _autoSaveTimer?.cancel();
171 }
172
cw_monero/lib/monero_wallet_addresses.dart
-20
@@ -3,7 +3,6 @@ import 'package:cw_core/address_info.dart';
3 import 'package:cw_core/subaddress.dart';
4 import 'package:cw_core/wallet_addresses.dart';
5 import 'package:cw_core/wallet_info.dart';
6 -import 'package:cw_monero/api/transaction_history.dart';
6 import 'package:cw_monero/api/wallet.dart';
7 import 'package:cw_monero/monero_account_list.dart';
8 import 'package:cw_monero/monero_subaddress_list.dart';
@@ -38,25 +37,6 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store {
37
38 MoneroAccountList accountList;
39
41 - @override
42 - Set<String> get usedAddresses {
43 - final txs = getAllTransactions();
44 - final adds = _originalUsedAddresses.toList();
45 - for (var i = 0; i < txs.length; i++) {
46 - for (var j = 0; j < txs[i].addressList.length; j++) {
47 - adds.add(txs[i].addressList[j]);
48 - }
49 - }
50 - return adds.toSet();
51 - }
52 -
53 - Set<String> _originalUsedAddresses = Set();
54 -
55 - @override
56 - set usedAddresses(Set<String> _usedAddresses) {
57 - _originalUsedAddresses = _usedAddresses;
58 - }
59 -
40 @override
41 Future<void> init() async {
42 accountList.update();
cw_wownero/lib/api/transaction_history.dart
+5 -18
@@ -45,8 +45,6 @@ List<Transaction> getAllTransactions() {
45 confirmations: 0,
46 blockheight: 0,
47 accountIndex: i,
48 - addressIndex: 0,
49 - addressIndexList: [0],
48 paymentId: "",
49 amount: fullBalance - availBalance,
50 isSpend: false,
@@ -245,26 +243,19 @@ Future<PendingTransactionDescription> createTransactionMultDest(
243
244 class Transaction {
245 final String displayLabel;
248 - String get subaddressLabel => wownero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0);
249 - String get address => wownero.Wallet_address(
246 + String subaddressLabel = wownero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0);
247 + late final String address = wownero.Wallet_address(
248 wptr!,
251 - accountIndex: accountIndex,
252 - addressIndex: addressIndex,
249 + accountIndex: 0,
250 + addressIndex: 0,
251 );
254 - List<String> get addressList => List.generate(addressIndexList.length, (index) =>
255 - wownero.Wallet_address(
256 - wptr!,
257 - accountIndex: accountIndex,
258 - addressIndex: addressIndexList[index],
259 - ));
252 final String description;
253 final int fee;
254 final int confirmations;
255 late final bool isPending = confirmations < 3;
256 final int blockheight;
265 - final int addressIndex;
257 + final int addressIndex = 0;
258 final int accountIndex;
267 - final List<int> addressIndexList;
259 final String paymentId;
260 final int amount;
261 final bool isSpend;
@@ -310,8 +301,6 @@ class Transaction {
301 amount = wownero.TransactionInfo_amount(txInfo),
302 paymentId = wownero.TransactionInfo_paymentId(txInfo),
303 accountIndex = wownero.TransactionInfo_subaddrAccount(txInfo),
313 - addressIndex = int.tryParse(wownero.TransactionInfo_subaddrIndex(txInfo).split(", ")[0]) ?? 0,
314 - addressIndexList = wownero.TransactionInfo_subaddrIndex(txInfo).split(", ").map((e) => int.tryParse(e) ?? 0).toList(),
304 blockheight = wownero.TransactionInfo_blockHeight(txInfo),
305 confirmations = wownero.TransactionInfo_confirmations(txInfo),
306 fee = wownero.TransactionInfo_fee(txInfo),
@@ -325,8 +314,6 @@ class Transaction {
314 required this.confirmations,
315 required this.blockheight,
316 required this.accountIndex,
328 - required this.addressIndex,
329 - required this.addressIndexList,
317 required this.paymentId,
318 required this.amount,
319 required this.isSpend,
cw_wownero/lib/wownero_subaddress_list.dart
-4
@@ -1,7 +1,6 @@
1 import 'package:cw_core/subaddress.dart';
2 import 'package:cw_wownero/api/coins_info.dart';
3 import 'package:cw_wownero/api/subaddress_list.dart' as subaddress_list;
4 -import 'package:cw_wownero/api/wallet.dart';
4 import 'package:flutter/services.dart';
5 import 'package:mobx/mobx.dart';
6
@@ -104,9 +103,6 @@ abstract class WowneroSubaddressListBase with Store {
103 required List<String> usedAddresses,
104 }) async {
105 _usedAddresses.addAll(usedAddresses);
107 - final _all = _usedAddresses.toSet().toList();
108 - _usedAddresses.clear();
109 - _usedAddresses.addAll(_all);
106 if (_isUpdating) {
107 return;
108 }
cw_wownero/lib/wownero_wallet.dart
-6
@@ -82,10 +82,6 @@ abstract class WowneroWalletBase
82 reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
83 _updateSubAddress(enabled, account: walletAddresses.account);
84 });
85 -
86 - _onTxHistoryChangeReaction = reaction((_) => transactionHistory, (__) {
87 - _updateSubAddress(isEnabledAutoGenerateSubaddress, account: walletAddresses.account);
88 - });
85 }
86
87 static const int _autoSaveInterval = 30;
@@ -127,7 +123,6 @@ abstract class WowneroWalletBase
123
124 wownero_wallet.SyncListener? _listener;
125 ReactionDisposer? _onAccountChangeReaction;
130 - ReactionDisposer? _onTxHistoryChangeReaction;
126 bool _isTransactionUpdating;
127 bool _hasSyncAfterStartup;
128 Timer? _autoSaveTimer;
@@ -163,7 +158,6 @@ abstract class WowneroWalletBase
158 void close() async {
159 _listener?.stop();
160 _onAccountChangeReaction?.reaction.dispose();
166 - _onTxHistoryChangeReaction?.reaction.dispose();
161 _autoSaveTimer?.cancel();
162 }
163
cw_wownero/lib/wownero_wallet_addresses.dart
-18
@@ -3,7 +3,6 @@ import 'package:cw_core/address_info.dart';
3 import 'package:cw_core/subaddress.dart';
4 import 'package:cw_core/wallet_addresses.dart';
5 import 'package:cw_core/wallet_info.dart';
6 -import 'package:cw_wownero/api/transaction_history.dart';
6 import 'package:cw_wownero/api/wallet.dart';
7 import 'package:cw_wownero/wownero_account_list.dart';
8 import 'package:cw_wownero/wownero_subaddress_list.dart';
@@ -37,24 +36,7 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store {
36 WowneroSubaddressList subaddressList;
37
38 WowneroAccountList accountList;
40 - @override
41 - Set<String> get usedAddresses {
42 - final txs = getAllTransactions();
43 - final adds = _originalUsedAddresses.toList();
44 - for (var i = 0; i < txs.length; i++) {
45 - for (var j = 0; j < txs[i].addressList.length; j++) {
46 - adds.add(txs[i].addressList[j]);
47 - }
48 - }
49 - return adds.toSet();
50 - }
39
52 - Set<String> _originalUsedAddresses = Set();
53 -
54 - @override
55 - set usedAddresses(Set<String> _usedAddresses) {
56 - _originalUsedAddresses = _usedAddresses;
57 - }
40 @override
41 Future<void> init() async {
42 accountList.update();
lib/src/screens/new_wallet/advanced_privacy_settings_page.dart
+31 -20
@@ -70,6 +70,8 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
70 final _formKey = GlobalKey<FormState>();
71 bool? testnetValue;
72
73 + bool obscurePassphrase = true;
74 +
75 @override
76 void initState() {
77 passphraseController.text = widget.seedTypeViewModel.passphrase ?? '';
@@ -138,27 +140,36 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
140 );
141 }),
142 if (!widget.isFromRestore) ...[
141 - Observer(builder: (_) {
142 - if (widget.privacySettingsViewModel.hasSeedPhraseLengthOption)
143 - return SettingsPickerCell<SeedPhraseLength>(
144 - title: S.current.seed_phrase_length,
145 - items: SeedPhraseLength.values,
146 - selectedItem: widget.privacySettingsViewModel.seedPhraseLength,
147 - onItemSelected: (SeedPhraseLength length) {
148 - widget.privacySettingsViewModel.setSeedPhraseLength(length);
149 - },
150 - );
151 - return Container();
152 - }),
153 - if (widget.privacySettingsViewModel.hasPassphraseOption)
154 - Padding(
155 - padding: EdgeInsets.all(24),
156 - child: BaseTextFormField(
157 - hintText: S.current.passphrase,
158 - controller: passphraseController,
159 - obscureText: true,
143 + Observer(builder: (_) {
144 + if (widget.privacySettingsViewModel.hasSeedPhraseLengthOption)
145 + return SettingsPickerCell<SeedPhraseLength>(
146 + title: S.current.seed_phrase_length,
147 + items: SeedPhraseLength.values,
148 + selectedItem: widget.privacySettingsViewModel.seedPhraseLength,
149 + onItemSelected: (SeedPhraseLength length) {
150 + widget.privacySettingsViewModel.setSeedPhraseLength(length);
151 + },
152 + );
153 + return Container();
154 + }),
155 + if (widget.privacySettingsViewModel.hasPassphraseOption)
156 + Padding(
157 + padding: EdgeInsets.all(24),
158 + child: BaseTextFormField(
159 + hintText: S.current.passphrase,
160 + controller: passphraseController,
161 + obscureText: obscurePassphrase,
162 + suffixIcon: GestureDetector(
163 + onTap: () => setState(() {
164 + obscurePassphrase = !obscurePassphrase;
165 + }),
166 + child: Icon(
167 + Icons.remove_red_eye,
168 + color: obscurePassphrase ? Colors.black54 : Colors.black26,
169 + ),
170 + ),
171 + ),
172 ),
161 - ),
173 ],
174 Observer(builder: (_) {
175 return Column(
scripts/android/app_env.sh
+2 -2
@@ -16,14 +16,14 @@ APP_ANDROID_TYPE=$1
16
17 MONERO_COM_NAME="Monero.com"
18 MONERO_COM_VERSION="1.16.5"
19 -MONERO_COM_BUILD_NUMBER=99
19 +MONERO_COM_BUILD_NUMBER=100
20 MONERO_COM_BUNDLE_ID="com.monero.app"
21 MONERO_COM_PACKAGE="com.monero.app"
22 MONERO_COM_SCHEME="monero.com"
23
24 CAKEWALLET_NAME="Cake Wallet"
25 CAKEWALLET_VERSION="4.19.5"
26 -CAKEWALLET_BUILD_NUMBER=226
26 +CAKEWALLET_BUILD_NUMBER=227
27 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
28 CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
29 CAKEWALLET_SCHEME="cakewallet"
scripts/ios/app_env.sh
+2 -2
@@ -14,12 +14,12 @@ APP_IOS_TYPE=$1
14
15 MONERO_COM_NAME="Monero.com"
16 MONERO_COM_VERSION="1.16.5"
17 -MONERO_COM_BUILD_NUMBER=97
17 +MONERO_COM_BUILD_NUMBER=98
18 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
19
20 CAKEWALLET_NAME="Cake Wallet"
21 CAKEWALLET_VERSION="4.19.5"
22 -CAKEWALLET_BUILD_NUMBER=264
22 +CAKEWALLET_BUILD_NUMBER=266
23 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
24
25 HAVEN_NAME="Haven"
scripts/linux/app_env.sh
+1 -1
@@ -15,7 +15,7 @@ fi
15
16 CAKEWALLET_NAME="Cake Wallet"
17 CAKEWALLET_VERSION="1.9.5"
18 -CAKEWALLET_BUILD_NUMBER=32
18 +CAKEWALLET_BUILD_NUMBER=33
19
20 if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then
21 echo "Wrong app type."
scripts/macos/app_env.sh
+2 -2
@@ -17,12 +17,12 @@ fi
17
18 MONERO_COM_NAME="Monero.com"
19 MONERO_COM_VERSION="1.6.5"
20 -MONERO_COM_BUILD_NUMBER=30
20 +MONERO_COM_BUILD_NUMBER=31
21 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
22
23 CAKEWALLET_NAME="Cake Wallet"
24 CAKEWALLET_VERSION="1.12.5"
25 -CAKEWALLET_BUILD_NUMBER=86
25 +CAKEWALLET_BUILD_NUMBER=88
26 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
27
28 if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then