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: