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(