Cw 772 restore from qr generates different wallet (#1721)
* fix derivation info for QR restoring * allow all available seed languages for Monero --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
Serhii committed
Oct 4, 2024 at 22:04 UTC
d933743a72be1e5c1031c82447cb2d104ba498f2
3 files changed
+41
-50
lib/view_model/restore/restore_from_qr_vm.dart
+10
-11
@@ -37,8 +37,7 @@ abstract class WalletRestorationFromQRVMBase extends WalletCreationVM with Store
37
spendKey = '',
38
wif = '',
39
address = '',
40
- super(appStore, walletInfoSource, walletCreationService, seedSettingsViewModel,
41
- type: type, isRecovery: true);
40
+ super(appStore, walletInfoSource, walletCreationService, seedSettingsViewModel, type: type, isRecovery: true);
41
42
@observable
43
int height;
@@ -58,13 +57,10 @@ abstract class WalletRestorationFromQRVMBase extends WalletCreationVM with Store
57
bool get hasRestorationHeight => type == WalletType.monero || type == WalletType.wownero;
58
59
@override
61
- WalletCredentials getCredentialsFromRestoredWallet(
62
- dynamic options, RestoredWallet restoreWallet) {
60
+ Future<WalletCredentials> getWalletCredentialsFromQRCredentials(
61
+ RestoredWallet restoreWallet) async {
62
final password = generateWalletPassword();
63
65
- DerivationInfo? derivationInfo;
66
- derivationInfo ??= getDefaultCreateDerivation();
67
-
64
switch (restoreWallet.restoreMode) {
65
case WalletRestoreMode.keys:
66
switch (restoreWallet.type) {
@@ -116,12 +112,13 @@ abstract class WalletRestorationFromQRVMBase extends WalletCreationVM with Store
112
);
113
case WalletType.bitcoin:
114
case WalletType.litecoin:
115
+ final derivationInfo = (await getDerivationInfoFromQRCredentials(restoreWallet)).first;
116
return bitcoin!.createBitcoinRestoreWalletFromSeedCredentials(
117
name: name,
118
mnemonic: restoreWallet.mnemonicSeed ?? '',
119
password: password,
120
passphrase: restoreWallet.passphrase,
124
- derivationType: derivationInfo!.derivationType!,
121
+ derivationType: derivationInfo.derivationType!,
122
derivationPath: derivationInfo.derivationPath!,
123
);
124
case WalletType.bitcoinCash:
@@ -139,11 +136,13 @@ abstract class WalletRestorationFromQRVMBase extends WalletCreationVM with Store
136
passphrase: restoreWallet.passphrase,
137
);
138
case WalletType.nano:
139
+ final derivationInfo =
140
+ (await getDerivationInfoFromQRCredentials(restoreWallet)).first;
141
return nano!.createNanoRestoreWalletFromSeedCredentials(
142
name: name,
143
mnemonic: restoreWallet.mnemonicSeed ?? '',
144
password: password,
146
- derivationType: derivationInfo!.derivationType!,
145
+ derivationType: derivationInfo.derivationType!,
146
passphrase: restoreWallet.passphrase,
147
);
148
case WalletType.polygon:
@@ -183,8 +182,8 @@ abstract class WalletRestorationFromQRVMBase extends WalletCreationVM with Store
182
}
183
184
@override
186
- Future<WalletBase> processFromRestoredWallet(
187
- WalletCredentials credentials, RestoredWallet restoreWallet) async {
185
+ Future<WalletBase> processFromRestoredWallet(WalletCredentials credentials,
186
+ RestoredWallet restoreWallet) async {
187
try {
188
switch (restoreWallet.restoreMode) {
189
case WalletRestoreMode.keys:
lib/view_model/restore/wallet_restore_from_qr_code.dart
+4
@@ -142,6 +142,10 @@ class WalletRestoreFromQRCode {
142
return WalletRestoreMode.seed;
143
}
144
145
+ if ((type == WalletType.monero || type == WalletType.wownero)) {
146
+ return WalletRestoreMode.seed;
147
+ }
148
+
149
seedValue.split(' ').forEach((element) {
150
if (!words.contains(element)) {
151
throw Exception(
lib/view_model/wallet_creation_vm.dart
+27
-39
@@ -85,21 +85,9 @@ abstract class WalletCreationVMBase with Store {
85
final dirPath = await pathForWalletDir(name: name, type: type);
86
final path = await pathForWallet(name: name, type: type);
87
88
- WalletCredentials credentials;
89
- if (restoreWallet != null) {
90
- if (restoreWallet.restoreMode == WalletRestoreMode.seed &&
91
- options == null &&
92
- (type == WalletType.nano ||
93
- type == WalletType.bitcoin ||
94
- type == WalletType.litecoin)) {
95
- final derivationInfo = await getDerivationInfo(restoreWallet);
96
- options ??= {};
97
- options["derivationInfo"] = derivationInfo.first;
98
- }
99
- credentials = getCredentialsFromRestoredWallet(options, restoreWallet);
100
- } else {
101
- credentials = getCredentials(options);
102
- }
88
+ final credentials = restoreWallet != null
89
+ ? await getWalletCredentialsFromQRCredentials(restoreWallet)
90
+ : getCredentials(options);
91
92
final walletInfo = WalletInfo.external(
93
id: WalletBase.idFor(name, type),
@@ -200,36 +188,36 @@ abstract class WalletCreationVMBase with Store {
188
}
189
}
190
203
- Future<List<DerivationInfo>> getDerivationInfo(RestoredWallet restoreWallet) async {
204
- var list = <DerivationInfo>[];
205
- final walletType = restoreWallet.type;
206
- var appStore = getIt.get<AppStore>();
207
- var node = appStore.settingsStore.getCurrentNode(walletType);
208
-
209
- switch (walletType) {
210
- case WalletType.bitcoin:
211
- case WalletType.litecoin:
212
- return bitcoin!.getDerivationsFromMnemonic(
213
- mnemonic: restoreWallet.mnemonicSeed!,
214
- node: node,
215
- );
216
- case WalletType.nano:
217
- return nanoUtil!.getDerivationsFromMnemonic(
218
- mnemonic: restoreWallet.mnemonicSeed!,
219
- node: node,
220
- );
221
- default:
222
- break;
191
+ Future<List<DerivationInfo>> getDerivationInfoFromQRCredentials(RestoredWallet restoreWallet) async {
192
+ var list = <DerivationInfo>[];
193
+ final walletType = restoreWallet.type;
194
+ var appStore = getIt.get<AppStore>();
195
+ var node = appStore.settingsStore.getCurrentNode(walletType);
196
+
197
+ switch (walletType) {
198
+ case WalletType.bitcoin:
199
+ case WalletType.litecoin:
200
+ return bitcoin!.getDerivationsFromMnemonic(
201
+ mnemonic: restoreWallet.mnemonicSeed!,
202
+ node: node,
203
+ passphrase: restoreWallet.passphrase,
204
+ );
205
+ case WalletType.nano:
206
+ return nanoUtil!.getDerivationsFromMnemonic(
207
+ mnemonic: restoreWallet.mnemonicSeed!,
208
+ node: node,
209
+ );
210
+ default:
211
+ break;
212
+ }
213
+ return list;
214
}
224
- return list;
225
- }
215
216
WalletCredentials getCredentials(dynamic options) => throw UnimplementedError();
217
218
Future<WalletBase> process(WalletCredentials credentials) => throw UnimplementedError();
219
231
- WalletCredentials getCredentialsFromRestoredWallet(
232
- dynamic options, RestoredWallet restoreWallet) =>
220
+ Future<WalletCredentials> getWalletCredentialsFromQRCredentials(RestoredWallet restoreWallet) async =>
221
throw UnimplementedError();
222
223
Future<WalletBase> processFromRestoredWallet(