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

Konstantin Ullrich committed Mar 21, 2025 at 04:32 UTC 597a716f9d4abd647887ee4d36ce054abd4a50ac
8 files changed +37 -21
cw_monero/lib/api/wallet.dart
+19 -4
@@ -61,9 +61,7 @@ String getSeed() {
61 return legacy;
62 }
63
64 -String getSeedLegacy(String? language) {
65 - final cakepassphrase = getPassphrase();
66 - var legacy = monero.Wallet_seed(wptr!, seedOffset: cakepassphrase);
64 +String? getSeedLanguage(String? language) {
65 switch (language) {
66 case "Chinese (Traditional)": language = "Chinese (simplified)"; break;
67 case "Chinese (Simplified)": language = "Chinese (simplified)"; break;
@@ -71,8 +69,25 @@ String getSeedLegacy(String? language) {
69 case "Czech": language = "English"; break;
70 case "Japanese": language = "English"; break;
71 }
72 + return language;
73 +}
74 +
75 +String getSeedLegacy(String? language) {
76 + final cakepassphrase = getPassphrase();
77 + var legacy = monero.Wallet_seed(wptr!, seedOffset: cakepassphrase);
78 + language = getSeedLanguage(language);
79 if (monero.Wallet_status(wptr!) != 0) {
75 - monero.Wallet_setSeedLanguage(wptr!, language: language ?? "English");
80 + if (language != null) {
81 + monero.Wallet_setSeedLanguage(wptr!, language: language);
82 + final status = monero.Wallet_status(wptr!);
83 + if (status != 0) {
84 + final err = monero.Wallet_errorString(wptr!);
85 + if (legacy.isNotEmpty) {
86 + return "$err\n\n$legacy";
87 + }
88 + return err;
89 + }
90 + }
91 legacy = monero.Wallet_seed(wptr!, seedOffset: cakepassphrase);
92 }
93 if (monero.Wallet_status(wptr!) != 0) {
cw_monero/lib/api/wallet_manager.dart
+5 -1
@@ -73,6 +73,7 @@ void createWalletSync(
73 required String passphrase,
74 int nettype = 0}) {
75 txhistory = null;
76 + language = getSeedLanguage(language)!;
77 final newWptr = monero.WalletManager_createWallet(wmPtr,
78 path: path, password: password, language: language, networkType: 0);
79
@@ -366,6 +367,9 @@ Future<void> loadWallet(
367 }
368
369 if (deviceType == 1) {
370 + if (gLedger == null) {
371 + throw Exception("Tried to open a ledger wallet with no ledger connected");
372 + }
373 final dummyWPtr = wptr ??
374 monero.WalletManager_openWallet(wmPtr, path: '', password: '');
375 enableLedgerExchange(dummyWPtr, gLedger!);
@@ -533,4 +537,4 @@ Future<void> restoreFromSpendKey(
537
538 bool isWalletExist({required String path}) => _isWalletExist(path);
539
536 -bool isViewOnlyBySpendKey() => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0;
\ No newline at end of file
540 +bool isViewOnlyBySpendKey() => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0;
cw_monero/lib/monero_wallet_service.dart
+7 -11
@@ -11,8 +11,6 @@ import 'package:cw_core/wallet_credentials.dart';
11 import 'package:cw_core/wallet_info.dart';
12 import 'package:cw_core/wallet_service.dart';
13 import 'package:cw_core/wallet_type.dart';
14 -import 'package:cw_monero/api/exceptions/wallet_opening_exception.dart';
15 -import 'package:cw_core/get_height_by_date.dart';
14 import 'package:cw_monero/api/account_list.dart';
15 import 'package:cw_monero/api/wallet_manager.dart' as monero_wallet_manager;
16 import 'package:cw_monero/api/wallet_manager.dart';
@@ -292,16 +290,14 @@ class MoneroWalletService extends WalletService<
290 Future<MoneroWallet> restoreFromSeed(
291 MoneroRestoreWalletFromSeedCredentials credentials,
292 {bool? isTestnet}) async {
295 - if (credentials.mnemonic.split(" ").length == 16) {
296 - // Restore from Polyseed
297 - try {
298 - if (Polyseed.isValidSeed(credentials.mnemonic)) {
299 - return restoreFromPolyseed(credentials);
300 - }
301 - } catch (e) {
302 - printV("Polyseed restore failed: $e");
303 - rethrow;
293 + // Restore from Polyseed
294 + try {
295 + if (Polyseed.isValidSeed(credentials.mnemonic)) {
296 + return restoreFromPolyseed(credentials);
297 }
298 + } catch (e) {
299 + printV("Polyseed restore failed: $e");
300 + rethrow;
301 }
302
303 try {
cw_monero/pubspec.yaml
+1 -1
@@ -19,7 +19,7 @@ dependencies:
19 flutter_mobx: ^2.0.6+1
20 intl: ^0.19.0
21 encrypt: ^5.0.1
22 - polyseed: ^0.0.6
22 + polyseed: ^0.0.7
23 cw_core:
24 path: ../cw_core
25 monero:
cw_wownero/pubspec.yaml
+1 -1
@@ -19,7 +19,7 @@ dependencies:
19 flutter_mobx: ^2.0.6+1
20 intl: ^0.19.0
21 encrypt: ^5.0.1
22 - polyseed: ^0.0.6
22 + polyseed: ^0.0.7
23 cw_core:
24 path: ../cw_core
25 monero:
lib/src/widgets/validable_annotated_editable_text.dart
+2 -1
@@ -92,7 +92,8 @@ class ValidatableAnnotatedEditableTextState extends EditableTextState {
92
93 List<Annotation> getRanges() {
94 final result = <Annotation>[];
95 - final text = textEditingValue.text;
95 + // Replace Ideographic Space (U+3000) with a normal space
96 + final text = textEditingValue.text.replaceAll("\u3000", " ");
97 final source = text
98 .split(' ')
99 .map((word) {
lib/view_model/wallet_creation_vm.dart
+1 -1
@@ -60,7 +60,7 @@ abstract class WalletCreationVMBase with Store {
60 final SeedSettingsViewModel seedSettingsViewModel;
61
62 bool isPolyseed(String seed) =>
63 - (type == WalletType.monero || type == WalletType.wownero) &&
63 + [WalletType.monero, WalletType.wownero].contains(type) &&
64 (Polyseed.isValidSeed(seed) || (seed.split(" ").length == 14));
65
66 bool nameExists(String name) => walletCreationService.exists(name);
pubspec_base.yaml
+1 -1
@@ -104,7 +104,7 @@ dependencies:
104 # ref: main
105 socks5_proxy: ^1.0.4
106 flutter_svg: ^2.0.9
107 - polyseed: ^0.0.6
107 + polyseed: ^0.0.7
108 nostr_tools: ^1.0.9
109 ledger_flutter_plus:
110 git: