fix invalid wallet pointer getting set even when we throw (#1556)

* fix invalid wallet pointer getting set even when we throw * Hide "wallet seeds" field if there is no seeds (cases of restore from keys) --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>

cyan committed Jul 26, 2024 at 17:36 UTC eb8158e9963b6dc518fbb24ba5bd36251e5c47f7
3 files changed +53 -37
cw_monero/lib/api/wallet_manager.dart
+22 -15
@@ -32,13 +32,14 @@ void createWalletSync(
32 required String language,
33 int nettype = 0}) {
34 txhistory = null;
35 - wptr = monero.WalletManager_createWallet(wmPtr,
35 + final newWptr = monero.WalletManager_createWallet(wmPtr,
36 path: path, password: password, language: language, networkType: 0);
37
38 - final status = monero.Wallet_status(wptr!);
38 + final status = monero.Wallet_status(newWptr);
39 if (status != 0) {
40 - throw WalletCreationException(message: monero.Wallet_errorString(wptr!));
40 + throw WalletCreationException(message: monero.Wallet_errorString(newWptr));
41 }
42 + wptr = newWptr;
43 monero.Wallet_store(wptr!, path: path);
44 openedWalletsByPath[path] = wptr!;
45
@@ -57,7 +58,7 @@ void restoreWalletFromSeedSync(
58 int nettype = 0,
59 int restoreHeight = 0}) {
60 txhistory = null;
60 - wptr = monero.WalletManager_recoveryWallet(
61 + final newWptr = monero.WalletManager_recoveryWallet(
62 wmPtr,
63 path: path,
64 password: password,
@@ -67,12 +68,13 @@ void restoreWalletFromSeedSync(
68 networkType: 0,
69 );
70
70 - final status = monero.Wallet_status(wptr!);
71 + final status = monero.Wallet_status(newWptr);
72
73 if (status != 0) {
73 - final error = monero.Wallet_errorString(wptr!);
74 + final error = monero.Wallet_errorString(newWptr);
75 throw WalletRestoreFromSeedException(message: error);
76 }
77 + wptr = newWptr;
78
79 openedWalletsByPath[path] = wptr!;
80 }
@@ -87,7 +89,7 @@ void restoreWalletFromKeysSync(
89 int nettype = 0,
90 int restoreHeight = 0}) {
91 txhistory = null;
90 - wptr = monero.WalletManager_createWalletFromKeys(
92 + final newWptr = monero.WalletManager_createWalletFromKeys(
93 wmPtr,
94 path: path,
95 password: password,
@@ -98,12 +100,14 @@ void restoreWalletFromKeysSync(
100 nettype: 0,
101 );
102
101 - final status = monero.Wallet_status(wptr!);
103 + final status = monero.Wallet_status(newWptr);
104 if (status != 0) {
105 throw WalletRestoreFromKeysException(
104 - message: monero.Wallet_errorString(wptr!));
106 + message: monero.Wallet_errorString(newWptr));
107 }
108
109 + wptr = newWptr;
110 +
111 openedWalletsByPath[path] = wptr!;
112 }
113
@@ -128,7 +132,7 @@ void restoreWalletFromSpendKeySync(
132 // );
133
134 txhistory = null;
131 - wptr = monero.WalletManager_createDeterministicWalletFromSpendKey(
135 + final newWptr = monero.WalletManager_createDeterministicWalletFromSpendKey(
136 wmPtr,
137 path: path,
138 password: password,
@@ -138,14 +142,16 @@ void restoreWalletFromSpendKeySync(
142 restoreHeight: restoreHeight,
143 );
144
141 - final status = monero.Wallet_status(wptr!);
145 + final status = monero.Wallet_status(newWptr);
146
147 if (status != 0) {
144 - final err = monero.Wallet_errorString(wptr!);
148 + final err = monero.Wallet_errorString(newWptr);
149 print("err: $err");
150 throw WalletRestoreFromKeysException(message: err);
151 }
152
153 + wptr = newWptr;
154 +
155 monero.Wallet_setCacheAttribute(wptr!, key: "cakewallet.seed", value: seed);
156
157 storeSync();
@@ -203,15 +209,16 @@ void loadWallet(
209 });
210 }
211 txhistory = null;
206 - wptr = monero.WalletManager_openWallet(wmPtr,
212 + final newWptr = monero.WalletManager_openWallet(wmPtr,
213 path: path, password: password);
214 _lastOpenedWallet = path;
209 - final status = monero.Wallet_status(wptr!);
215 + final status = monero.Wallet_status(newWptr);
216 if (status != 0) {
211 - final err = monero.Wallet_errorString(wptr!);
217 + final err = monero.Wallet_errorString(newWptr);
218 print(err);
219 throw WalletOpeningException(message: err);
220 }
221 + wptr = newWptr;
222 openedWalletsByPath[path] = wptr!;
223 }
224 }
cw_wownero/lib/api/wallet_manager.dart
+25 -16
@@ -32,13 +32,14 @@ void createWalletSync(
32 required String language,
33 int nettype = 0}) {
34 txhistory = null;
35 - wptr = wownero.WalletManager_createWallet(wmPtr,
35 + final newWptr = wownero.WalletManager_createWallet(wmPtr,
36 path: path, password: password, language: language, networkType: 0);
37
38 - final status = wownero.Wallet_status(wptr!);
38 + final status = wownero.Wallet_status(newWptr);
39 if (status != 0) {
40 - throw WalletCreationException(message: wownero.Wallet_errorString(wptr!));
40 + throw WalletCreationException(message: wownero.Wallet_errorString(newWptr));
41 }
42 + wptr = newWptr;
43 wownero.Wallet_store(wptr!, path: path);
44 openedWalletsByPath[path] = wptr!;
45
@@ -56,9 +57,10 @@ void restoreWalletFromSeedSync(
57 required String seed,
58 int nettype = 0,
59 int restoreHeight = 0}) {
60 + var newWptr;
61 if (seed.split(" ").length == 14) {
62 txhistory = null;
61 - wptr = wownero.WOWNERO_deprecated_restore14WordSeed(
63 + newWptr = wownero.WOWNERO_deprecated_restore14WordSeed(
64 path: path,
65 password: password,
66 language: seed, // I KNOW - this is supposed to be called seed
@@ -70,7 +72,7 @@ void restoreWalletFromSeedSync(
72 );
73 } else {
74 txhistory = null;
73 - wptr = wownero.WalletManager_recoveryWallet(
75 + newWptr = wownero.WalletManager_recoveryWallet(
76 wmPtr,
77 path: path,
78 password: password,
@@ -81,13 +83,15 @@ void restoreWalletFromSeedSync(
83 );
84 }
85
84 - final status = wownero.Wallet_status(wptr!);
86 + final status = wownero.Wallet_status(newWptr);
87
88 if (status != 0) {
87 - final error = wownero.Wallet_errorString(wptr!);
89 + final error = wownero.Wallet_errorString(newWptr);
90 throw WalletRestoreFromSeedException(message: error);
91 }
92
93 + wptr = newWptr;
94 +
95 openedWalletsByPath[path] = wptr!;
96 }
97
@@ -101,7 +105,7 @@ void restoreWalletFromKeysSync(
105 int nettype = 0,
106 int restoreHeight = 0}) {
107 txhistory = null;
104 - wptr = wownero.WalletManager_createWalletFromKeys(
108 + final newWptr = wownero.WalletManager_createWalletFromKeys(
109 wmPtr,
110 path: path,
111 password: password,
@@ -112,12 +116,14 @@ void restoreWalletFromKeysSync(
116 nettype: 0,
117 );
118
115 - final status = wownero.Wallet_status(wptr!);
119 + final status = wownero.Wallet_status(newWptr);
120 if (status != 0) {
121 throw WalletRestoreFromKeysException(
118 - message: wownero.Wallet_errorString(wptr!));
122 + message: wownero.Wallet_errorString(newWptr));
123 }
124
125 + wptr = newWptr;
126 +
127 openedWalletsByPath[path] = wptr!;
128 }
129
@@ -142,7 +148,7 @@ void restoreWalletFromSpendKeySync(
148 // );
149
150 txhistory = null;
145 - wptr = wownero.WalletManager_createDeterministicWalletFromSpendKey(
151 + final newWptr = wownero.WalletManager_createDeterministicWalletFromSpendKey(
152 wmPtr,
153 path: path,
154 password: password,
@@ -152,14 +158,16 @@ void restoreWalletFromSpendKeySync(
158 restoreHeight: restoreHeight,
159 );
160
155 - final status = wownero.Wallet_status(wptr!);
161 + final status = wownero.Wallet_status(newWptr);
162
163 if (status != 0) {
158 - final err = wownero.Wallet_errorString(wptr!);
164 + final err = wownero.Wallet_errorString(newWptr);
165 print("err: $err");
166 throw WalletRestoreFromKeysException(message: err);
167 }
168
169 + wptr = newWptr;
170 +
171 wownero.Wallet_setCacheAttribute(wptr!, key: "cakewallet.seed", value: seed);
172
173 storeSync();
@@ -217,15 +225,16 @@ void loadWallet(
225 });
226 }
227 txhistory = null;
220 - wptr = wownero.WalletManager_openWallet(wmPtr,
228 + final newWptr = wownero.WalletManager_openWallet(wmPtr,
229 path: path, password: password);
230 _lastOpenedWallet = path;
223 - final status = wownero.Wallet_status(wptr!);
231 + final status = wownero.Wallet_status(newWptr);
232 if (status != 0) {
225 - final err = wownero.Wallet_errorString(wptr!);
233 + final err = wownero.Wallet_errorString(newWptr);
234 print(err);
235 throw WalletOpeningException(message: err);
236 }
237 + wptr = newWptr;
238 openedWalletsByPath[path] = wptr!;
239 }
240 }
lib/view_model/wallet_keys_view_model.dart
+6 -6
@@ -83,8 +83,8 @@ abstract class WalletKeysViewModelBase with Store {
83 StandartListItem(
84 title: S.current.view_key_private,
85 value: keys['privateViewKey']!),
86 - StandartListItem(
87 - title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
86 + if (_appStore.wallet!.seed!.isNotEmpty)
87 + StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
88 ]);
89
90 if (_appStore.wallet?.seed != null &&
@@ -123,8 +123,8 @@ abstract class WalletKeysViewModelBase with Store {
123 StandartListItem(
124 title: S.current.view_key_private,
125 value: keys['privateViewKey']!),
126 - StandartListItem(
127 - title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
126 + if (_appStore.wallet!.seed!.isNotEmpty)
127 + StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
128 ]);
129 }
130
@@ -147,8 +147,8 @@ abstract class WalletKeysViewModelBase with Store {
147 StandartListItem(
148 title: S.current.view_key_private,
149 value: keys['privateViewKey']!),
150 - StandartListItem(
151 - title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
150 + if (_appStore.wallet!.seed!.isNotEmpty)
151 + StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
152 ]);
153
154 if (_appStore.wallet?.seed != null &&