From 597a716f9d4abd647887ee4d36ce054abd4a50ac Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Fri, 21 Mar 2025 04:32:40 +0100 Subject: [PATCH] CW-686-polyseed-language-issues (#2098) * feat: Fix space for japanese seed * feat: Fix space for japanese seed * feat: Upgrade Polyseed version with improved jp support * feat: Fix monero legacy seed language falling back to english --- cw_monero/lib/api/wallet.dart | 23 +++++++++++++++---- cw_monero/lib/api/wallet_manager.dart | 6 ++++- cw_monero/lib/monero_wallet_service.dart | 18 ++++++--------- cw_monero/pubspec.yaml | 2 +- cw_wownero/pubspec.yaml | 2 +- .../validable_annotated_editable_text.dart | 3 ++- lib/view_model/wallet_creation_vm.dart | 2 +- pubspec_base.yaml | 2 +- 8 files changed, 37 insertions(+), 21 deletions(-) diff --git a/cw_monero/lib/api/wallet.dart b/cw_monero/lib/api/wallet.dart index 588ae9750..b9f3d21ec 100644 --- a/cw_monero/lib/api/wallet.dart +++ b/cw_monero/lib/api/wallet.dart @@ -61,9 +61,7 @@ String getSeed() { return legacy; } -String getSeedLegacy(String? language) { - final cakepassphrase = getPassphrase(); - var legacy = monero.Wallet_seed(wptr!, seedOffset: cakepassphrase); +String? getSeedLanguage(String? language) { switch (language) { case "Chinese (Traditional)": language = "Chinese (simplified)"; break; case "Chinese (Simplified)": language = "Chinese (simplified)"; break; @@ -71,8 +69,25 @@ String getSeedLegacy(String? language) { case "Czech": language = "English"; break; case "Japanese": language = "English"; break; } + return language; +} + +String getSeedLegacy(String? language) { + final cakepassphrase = getPassphrase(); + var legacy = monero.Wallet_seed(wptr!, seedOffset: cakepassphrase); + language = getSeedLanguage(language); if (monero.Wallet_status(wptr!) != 0) { - monero.Wallet_setSeedLanguage(wptr!, language: language ?? "English"); + if (language != null) { + monero.Wallet_setSeedLanguage(wptr!, language: language); + final status = monero.Wallet_status(wptr!); + if (status != 0) { + final err = monero.Wallet_errorString(wptr!); + if (legacy.isNotEmpty) { + return "$err\n\n$legacy"; + } + return err; + } + } legacy = monero.Wallet_seed(wptr!, seedOffset: cakepassphrase); } if (monero.Wallet_status(wptr!) != 0) { diff --git a/cw_monero/lib/api/wallet_manager.dart b/cw_monero/lib/api/wallet_manager.dart index 621f79577..7cadadbb9 100644 --- a/cw_monero/lib/api/wallet_manager.dart +++ b/cw_monero/lib/api/wallet_manager.dart @@ -73,6 +73,7 @@ void createWalletSync( required String passphrase, int nettype = 0}) { txhistory = null; + language = getSeedLanguage(language)!; final newWptr = monero.WalletManager_createWallet(wmPtr, path: path, password: password, language: language, networkType: 0); @@ -366,6 +367,9 @@ Future loadWallet( } if (deviceType == 1) { + if (gLedger == null) { + throw Exception("Tried to open a ledger wallet with no ledger connected"); + } final dummyWPtr = wptr ?? monero.WalletManager_openWallet(wmPtr, path: '', password: ''); enableLedgerExchange(dummyWPtr, gLedger!); @@ -533,4 +537,4 @@ Future restoreFromSpendKey( bool isWalletExist({required String path}) => _isWalletExist(path); -bool isViewOnlyBySpendKey() => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0; \ No newline at end of file +bool isViewOnlyBySpendKey() => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0; diff --git a/cw_monero/lib/monero_wallet_service.dart b/cw_monero/lib/monero_wallet_service.dart index fbb1c5331..598d400e5 100644 --- a/cw_monero/lib/monero_wallet_service.dart +++ b/cw_monero/lib/monero_wallet_service.dart @@ -11,8 +11,6 @@ import 'package:cw_core/wallet_credentials.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_service.dart'; import 'package:cw_core/wallet_type.dart'; -import 'package:cw_monero/api/exceptions/wallet_opening_exception.dart'; -import 'package:cw_core/get_height_by_date.dart'; import 'package:cw_monero/api/account_list.dart'; import 'package:cw_monero/api/wallet_manager.dart' as monero_wallet_manager; import 'package:cw_monero/api/wallet_manager.dart'; @@ -292,16 +290,14 @@ class MoneroWalletService extends WalletService< Future restoreFromSeed( MoneroRestoreWalletFromSeedCredentials credentials, {bool? isTestnet}) async { - if (credentials.mnemonic.split(" ").length == 16) { - // Restore from Polyseed - try { - if (Polyseed.isValidSeed(credentials.mnemonic)) { - return restoreFromPolyseed(credentials); - } - } catch (e) { - printV("Polyseed restore failed: $e"); - rethrow; + // Restore from Polyseed + try { + if (Polyseed.isValidSeed(credentials.mnemonic)) { + return restoreFromPolyseed(credentials); } + } catch (e) { + printV("Polyseed restore failed: $e"); + rethrow; } try { diff --git a/cw_monero/pubspec.yaml b/cw_monero/pubspec.yaml index 58c5fc968..862109e94 100644 --- a/cw_monero/pubspec.yaml +++ b/cw_monero/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: flutter_mobx: ^2.0.6+1 intl: ^0.19.0 encrypt: ^5.0.1 - polyseed: ^0.0.6 + polyseed: ^0.0.7 cw_core: path: ../cw_core monero: diff --git a/cw_wownero/pubspec.yaml b/cw_wownero/pubspec.yaml index d81cda250..b35f36071 100644 --- a/cw_wownero/pubspec.yaml +++ b/cw_wownero/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: flutter_mobx: ^2.0.6+1 intl: ^0.19.0 encrypt: ^5.0.1 - polyseed: ^0.0.6 + polyseed: ^0.0.7 cw_core: path: ../cw_core monero: diff --git a/lib/src/widgets/validable_annotated_editable_text.dart b/lib/src/widgets/validable_annotated_editable_text.dart index a7777961d..77f19fee0 100644 --- a/lib/src/widgets/validable_annotated_editable_text.dart +++ b/lib/src/widgets/validable_annotated_editable_text.dart @@ -92,7 +92,8 @@ class ValidatableAnnotatedEditableTextState extends EditableTextState { List getRanges() { final result = []; - final text = textEditingValue.text; + // Replace Ideographic Space (U+3000) with a normal space + final text = textEditingValue.text.replaceAll("\u3000", " "); final source = text .split(' ') .map((word) { diff --git a/lib/view_model/wallet_creation_vm.dart b/lib/view_model/wallet_creation_vm.dart index 4ee8069b3..f423622f6 100644 --- a/lib/view_model/wallet_creation_vm.dart +++ b/lib/view_model/wallet_creation_vm.dart @@ -60,7 +60,7 @@ abstract class WalletCreationVMBase with Store { final SeedSettingsViewModel seedSettingsViewModel; bool isPolyseed(String seed) => - (type == WalletType.monero || type == WalletType.wownero) && + [WalletType.monero, WalletType.wownero].contains(type) && (Polyseed.isValidSeed(seed) || (seed.split(" ").length == 14)); bool nameExists(String name) => walletCreationService.exists(name); diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 7e700e588..ca49f2842 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -104,7 +104,7 @@ dependencies: # ref: main socks5_proxy: ^1.0.4 flutter_svg: ^2.0.9 - polyseed: ^0.0.6 + polyseed: ^0.0.7 nostr_tools: ^1.0.9 ledger_flutter_plus: git: