diff --git a/cw_wownero/lib/api/wallet_manager.dart b/cw_wownero/lib/api/wallet_manager.dart index 516437bfc..53d62f1cf 100644 --- a/cw_wownero/lib/api/wallet_manager.dart +++ b/cw_wownero/lib/api/wallet_manager.dart @@ -53,15 +53,28 @@ void restoreWalletFromSeedSync( required String seed, int nettype = 0, int restoreHeight = 0}) { - wptr = wownero.WalletManager_recoveryWallet( - wmPtr, - path: path, - password: password, - mnemonic: seed, - restoreHeight: restoreHeight, - seedOffset: '', - networkType: 0, - ); + if (seed.split(" ").length == 14) { + wptr = wownero.WOWNERO_deprecated_restore14WordSeed( + path: path, + password: password, + language: seed, // I KNOW - this is supposed to be called seed + networkType: 0, + ); + + setRefreshFromBlockHeight( + height: wownero.WOWNERO_deprecated_14WordSeedHeight(seed: seed), + ); + } else { + wptr = wownero.WalletManager_recoveryWallet( + wmPtr, + path: path, + password: password, + mnemonic: seed, + restoreHeight: restoreHeight, + seedOffset: '', + networkType: 0, + ); + } final status = wownero.Wallet_status(wptr!); diff --git a/lib/entities/seed_type.dart b/lib/entities/seed_type.dart index ab9965528..150efda7e 100644 --- a/lib/entities/seed_type.dart +++ b/lib/entities/seed_type.dart @@ -10,6 +10,7 @@ class SeedType extends EnumerableItem with Serializable { static const legacy = SeedType(raw: 0, title: 'Legacy (25 words)'); static const polyseed = SeedType(raw: 1, title: 'Polyseed (16 words)'); + static const wowneroSeed = SeedType(raw: 1, title: 'Wownero (14 words)'); static SeedType deserialize({required int raw}) { switch (raw) { @@ -17,6 +18,8 @@ class SeedType extends EnumerableItem with Serializable { return legacy; case 1: return polyseed; + case 2: + return wowneroSeed; default: throw Exception('Unexpected token: $raw for SeedType deserialize'); } @@ -29,6 +32,8 @@ class SeedType extends EnumerableItem with Serializable { return S.current.seedtype_legacy; case SeedType.polyseed: return S.current.seedtype_polyseed; + case SeedType.wowneroSeed: + return S.current.seedtype_wownero; default: return ''; } diff --git a/lib/src/screens/restore/wallet_restore_from_seed_form.dart b/lib/src/screens/restore/wallet_restore_from_seed_form.dart index baf8a1091..01a5f2f97 100644 --- a/lib/src/screens/restore/wallet_restore_from_seed_form.dart +++ b/lib/src/screens/restore/wallet_restore_from_seed_form.dart @@ -90,6 +90,10 @@ class WalletRestoreFromSeedFormState extends State { _changeSeedType(SeedType.polyseed); _changeLanguage(lang.nameEnglish); } + if (widget.type == WalletType.wownero && seed.split(" ").length == 14) { + _changeSeedType(SeedType.wowneroSeed); + _changeLanguage("English"); + } widget.onSeedChange?.call(seed); } @@ -149,8 +153,20 @@ class WalletRestoreFromSeedFormState extends State { await showPopUp( context: context, builder: (_) => Picker( - items: SeedType.all, - selectedAtIndex: isPolyseed ? 1 : 0, + items: switch (widget.type) { + WalletType.monero => [SeedType.legacy, SeedType.polyseed], + WalletType.wownero => [ + SeedType.legacy, + SeedType.polyseed, + SeedType.wowneroSeed + ], + _ => [SeedType.legacy] + }, + selectedAtIndex: isPolyseed + ? 1 + : seedTypeController.value.text.contains("14") + ? 2 + : 0, mainAxisAlignment: MainAxisAlignment.start, onItemSelected: _changeSeedType, isSeparated: false, @@ -169,7 +185,7 @@ class WalletRestoreFromSeedFormState extends State { ), ), ), - if (widget.displayLanguageSelector) + if (!seedTypeController.value.text.contains("14") && widget.displayLanguageSelector) GestureDetector( onTap: () async { await showPopUp( @@ -193,7 +209,9 @@ class WalletRestoreFromSeedFormState extends State { ), ), ), - if (!isPolyseed && widget.displayBlockHeightSelector) + if ((!isPolyseed) && + widget.displayBlockHeightSelector && + (widget.type == WalletType.wownero && !seedTypeController.value.text.contains("14"))) BlockchainHeightWidget( focusNode: widget.blockHeightFocusNode, key: blockchainHeightKey, @@ -228,7 +246,11 @@ class WalletRestoreFromSeedFormState extends State { ); void _changeLanguage(String language) { - final setLang = isPolyseed ? "POLYSEED_$language" : language; + final setLang = isPolyseed + ? "POLYSEED_$language" + : seedTypeController.value.text.contains("14") + ? "WOWSEED_" + language + : language; setState(() { this.language = setLang; seedWidgetStateKey.currentState!.changeSeedLanguage(setLang); diff --git a/lib/src/screens/restore/wallet_restore_page.dart b/lib/src/screens/restore/wallet_restore_page.dart index be286a34e..7c7e2f5ff 100644 --- a/lib/src/screens/restore/wallet_restore_page.dart +++ b/lib/src/screens/restore/wallet_restore_page.dart @@ -255,6 +255,8 @@ class WalletRestorePage extends BasePage { final seedWords = seedPhrase.split(' '); + if (seedWords.length == 14 && walletRestoreViewModel.type == WalletType.wownero) return true; + if ((walletRestoreViewModel.type == WalletType.monero || walletRestoreViewModel.type == WalletType.wownero || walletRestoreViewModel.type == WalletType.haven) && diff --git a/lib/view_model/wallet_creation_vm.dart b/lib/view_model/wallet_creation_vm.dart index 2763daac2..d72333408 100644 --- a/lib/view_model/wallet_creation_vm.dart +++ b/lib/view_model/wallet_creation_vm.dart @@ -44,7 +44,8 @@ abstract class WalletCreationVMBase with Store { final AppStore _appStore; bool isPolyseed(String seed) => - (type == WalletType.monero || type == WalletType.wownero) && Polyseed.isValidSeed(seed); + (type == WalletType.monero || type == WalletType.wownero) && + (Polyseed.isValidSeed(seed) || (seed.split(" ").length == 14)); bool nameExists(String name) => walletCreationService.exists(name); diff --git a/lib/wownero/cw_wownero.dart b/lib/wownero/cw_wownero.dart index 927330edb..eccb0f126 100644 --- a/lib/wownero/cw_wownero.dart +++ b/lib/wownero/cw_wownero.dart @@ -170,6 +170,10 @@ class CWWownero extends Wownero { final lang = language.replaceAll("POLYSEED_", ""); return PolyseedLang.getByEnglishName(lang).words; } + if (language.startsWith("WOWSEED_")) { + final lang = language.replaceAll("WOWSEED_", ""); + return PolyseedLang.getByEnglishName(lang).words; + } switch (language.toLowerCase()) { case 'english': return EnglishMnemonics.words; @@ -224,13 +228,13 @@ class CWWownero extends Wownero { name: name, password: password, height: height, mnemonic: mnemonic); @override - WalletCredentials createWowneroNewWalletCredentials({ - required String name, - required String language, - required bool isPolyseed, - String? password}) => + WalletCredentials createWowneroNewWalletCredentials( + {required String name, + required String language, + required bool isPolyseed, + String? password}) => WowneroNewWalletCredentials( - name: name, password: password, language: language, isPolyseed: isPolyseed); + name: name, password: password, language: language, isPolyseed: isPolyseed); @override Map getKeys(Object wallet) { diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 468030f37..296d8d7c4 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -594,6 +594,7 @@ "seedtype": "Seedtype", "seedtype_legacy": "Legacy (25 words)", "seedtype_polyseed": "Polyseed (16 words)", + "seedtype_wownero": "Wownero (14 words)", "select_backup_file": "Select backup file", "select_buy_provider_notice": "Select a buy provider above. You can skip this screen by setting your default buy provider in app settings.", "select_destination": "Please select destination for the backup file.",