Cw 519 tor connection (#1158)
* initial draft for tor feature * Configure nodes to use Tor proxy if enabled * Add socks proxy upon connecting to tor fix disconnect button * Try tor with github actions * accept defaults for rust installation * Merge main Change Tor tile name
Omar Hatem committed
Nov 18, 2023 at 15:43 UTC
ab83f5b67fe085c993abb7738e7d692364ebb5e7
44 files changed
+548
-113
.github/workflows/pr_test_build.yml
+2
@@ -38,6 +38,8 @@ jobs:
38
sudo mkdir -p /opt/android
39
sudo chown $USER /opt/android
40
cd /opt/android
41
+ -y curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
42
+ cargo install cargo-ndk
43
git clone https://github.com/cake-tech/cake_wallet.git --branch $GITHUB_HEAD_REF
44
cd cake_wallet/scripts/android/
45
./install_ndk.sh
cw_bitcoin/pubspec.lock
+30
-13
@@ -481,50 +481,50 @@ packages:
481
dependency: "direct main"
482
description:
483
name: path_provider
484
- sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95
484
+ sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
485
url: "https://pub.dev"
486
source: hosted
487
- version: "2.0.12"
487
+ version: "2.1.1"
488
path_provider_android:
489
dependency: transitive
490
description:
491
name: path_provider_android
492
- sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e
492
+ sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
493
url: "https://pub.dev"
494
source: hosted
495
- version: "2.0.22"
495
+ version: "2.2.1"
496
path_provider_foundation:
497
dependency: transitive
498
description:
499
name: path_provider_foundation
500
- sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74"
500
+ sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
501
url: "https://pub.dev"
502
source: hosted
503
- version: "2.1.1"
503
+ version: "2.3.1"
504
path_provider_linux:
505
dependency: transitive
506
description:
507
name: path_provider_linux
508
- sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
508
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
509
url: "https://pub.dev"
510
source: hosted
511
- version: "2.1.7"
511
+ version: "2.2.1"
512
path_provider_platform_interface:
513
dependency: transitive
514
description:
515
name: path_provider_platform_interface
516
- sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76
516
+ sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
517
url: "https://pub.dev"
518
source: hosted
519
- version: "2.0.5"
519
+ version: "2.1.1"
520
path_provider_windows:
521
dependency: transitive
522
description:
523
name: path_provider_windows
524
- sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c
524
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
525
url: "https://pub.dev"
526
source: hosted
527
- version: "2.1.3"
527
+ version: "2.2.1"
528
platform:
529
dependency: transitive
530
description:
@@ -610,6 +610,14 @@ packages:
610
description: flutter
611
source: sdk
612
version: "0.0.99"
613
+ socks5_proxy:
614
+ dependency: transitive
615
+ description:
616
+ name: socks5_proxy
617
+ sha256: "1d21b5606169654bbf4cfb904e8e6ed897e9f763358709f87310c757096d909a"
618
+ url: "https://pub.dev"
619
+ source: hosted
620
+ version: "1.0.4"
621
source_gen:
622
dependency: transitive
623
description:
@@ -690,6 +698,15 @@ packages:
698
url: "https://pub.dev"
699
source: hosted
700
version: "1.0.1"
701
+ tor:
702
+ dependency: transitive
703
+ description:
704
+ path: "."
705
+ ref: main
706
+ resolved-ref: "09ba92cb11d4e3cacf97256e57863b805f79f2e5"
707
+ url: "https://github.com/cake-tech/tor.git"
708
+ source: git
709
+ version: "0.0.1"
710
typed_data:
711
dependency: transitive
712
description:
@@ -756,4 +773,4 @@ packages:
773
version: "3.1.1"
774
sdks:
775
dart: ">=3.0.0 <4.0.0"
759
- flutter: ">=3.0.0"
776
+ flutter: ">=3.7.0"
cw_bitcoin_cash/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux
+1
-1
@@ -1 +1 @@
1
-/Users/blazebrain/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/
\ No newline at end of file
1
+/Users/omarhatem/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/
\ No newline at end of file
cw_bitcoin_cash/linux/flutter/generated_plugins.cmake
+1
@@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
6
)
7
8
list(APPEND FLUTTER_FFI_PLUGIN_LIST
9
+ tor
10
)
11
12
set(PLUGIN_BUNDLED_LIBRARIES)
cw_core/lib/node.dart
+17
-6
@@ -6,6 +6,7 @@ import 'package:hive/hive.dart';
6
import 'package:cw_core/hive_type_ids.dart';
7
import 'package:cw_core/wallet_type.dart';
8
import 'package:http/io_client.dart' as ioc;
9
+import 'package:tor/tor.dart';
10
11
part 'node.g.dart';
12
@@ -129,9 +130,7 @@ class Node extends HiveObject with Keyable {
130
try {
131
switch (type) {
132
case WalletType.monero:
132
- return useSocksProxy
133
- ? requestNodeWithProxy(socksProxyAddress ?? '')
134
- : requestMoneroNode();
133
+ return requestMoneroNode();
134
case WalletType.bitcoin:
135
return requestElectrumServer();
136
case WalletType.litecoin:
@@ -154,6 +153,9 @@ class Node extends HiveObject with Keyable {
153
}
154
155
Future<bool> requestMoneroNode() async {
156
+ if (uri.toString().contains(".onion") || useSocksProxy) {
157
+ return await requestNodeWithProxy();
158
+ }
159
final path = '/json_rpc';
160
final rpcUri = isSSL ? Uri.https(uri.authority, path) : Uri.http(uri.authority, path);
161
final realm = 'monero-rpc';
@@ -205,11 +207,20 @@ class Node extends HiveObject with Keyable {
207
}
208
}
209
208
- Future<bool> requestNodeWithProxy(String proxy) async {
209
- if (proxy.isEmpty || !proxy.contains(':')) {
210
+ Future<bool> requestNodeWithProxy() async {
211
+ if ((socksProxyAddress == null ||
212
+ socksProxyAddress!.isEmpty ||
213
+ !socksProxyAddress!.contains(':')) &&
214
+ !Tor.instance.enabled) {
215
return false;
216
}
212
- final proxyAddress = proxy.split(':')[0];
217
+
218
+ String? proxy = socksProxyAddress;
219
+
220
+ if ((proxy?.isEmpty ?? true) && Tor.instance.enabled) {
221
+ proxy = "${InternetAddress.loopbackIPv4.address}:${Tor.instance.port}";
222
+ }
223
+ final proxyAddress = proxy!.split(':')[0];
224
final proxyPort = int.parse(proxy.split(':')[1]);
225
try {
226
final socket = await Socket.connect(proxyAddress, proxyPort, timeout: Duration(seconds: 5));
cw_core/pubspec.lock
+30
-13
@@ -407,50 +407,50 @@ packages:
407
dependency: "direct main"
408
description:
409
name: path_provider
410
- sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95
410
+ sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
411
url: "https://pub.dev"
412
source: hosted
413
- version: "2.0.12"
413
+ version: "2.1.1"
414
path_provider_android:
415
dependency: transitive
416
description:
417
name: path_provider_android
418
- sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e
418
+ sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
419
url: "https://pub.dev"
420
source: hosted
421
- version: "2.0.22"
421
+ version: "2.2.1"
422
path_provider_foundation:
423
dependency: transitive
424
description:
425
name: path_provider_foundation
426
- sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74"
426
+ sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
427
url: "https://pub.dev"
428
source: hosted
429
- version: "2.1.1"
429
+ version: "2.3.1"
430
path_provider_linux:
431
dependency: transitive
432
description:
433
name: path_provider_linux
434
- sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
434
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
435
url: "https://pub.dev"
436
source: hosted
437
- version: "2.1.7"
437
+ version: "2.2.1"
438
path_provider_platform_interface:
439
dependency: transitive
440
description:
441
name: path_provider_platform_interface
442
- sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76
442
+ sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
443
url: "https://pub.dev"
444
source: hosted
445
- version: "2.0.5"
445
+ version: "2.1.1"
446
path_provider_windows:
447
dependency: transitive
448
description:
449
name: path_provider_windows
450
- sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c
450
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
451
url: "https://pub.dev"
452
source: hosted
453
- version: "2.1.3"
453
+ version: "2.2.1"
454
platform:
455
dependency: transitive
456
description:
@@ -528,6 +528,14 @@ packages:
528
description: flutter
529
source: sdk
530
version: "0.0.99"
531
+ socks5_proxy:
532
+ dependency: "direct main"
533
+ description:
534
+ name: socks5_proxy
535
+ sha256: "1d21b5606169654bbf4cfb904e8e6ed897e9f763358709f87310c757096d909a"
536
+ url: "https://pub.dev"
537
+ source: hosted
538
+ version: "1.0.4"
539
source_gen:
540
dependency: transitive
541
description:
@@ -608,6 +616,15 @@ packages:
616
url: "https://pub.dev"
617
source: hosted
618
version: "1.0.1"
619
+ tor:
620
+ dependency: "direct main"
621
+ description:
622
+ path: "."
623
+ ref: main
624
+ resolved-ref: "09ba92cb11d4e3cacf97256e57863b805f79f2e5"
625
+ url: "https://github.com/cake-tech/tor.git"
626
+ source: git
627
+ version: "0.0.1"
628
typed_data:
629
dependency: transitive
630
description:
@@ -666,4 +683,4 @@ packages:
683
version: "3.1.1"
684
sdks:
685
dart: ">=3.0.0 <4.0.0"
669
- flutter: ">=3.0.0"
686
+ flutter: ">=3.7.0"
cw_core/pubspec.yaml
+5
@@ -19,6 +19,11 @@ dependencies:
19
flutter_mobx: ^2.0.6+1
20
intl: ^0.18.0
21
encrypt: ^5.0.1
22
+ socks5_proxy: ^1.0.4
23
+ tor:
24
+ git:
25
+ url: https://github.com/cake-tech/tor.git
26
+ ref: main
27
28
dev_dependencies:
29
flutter_test:
cw_haven/pubspec.lock
+30
-13
@@ -414,50 +414,50 @@ packages:
414
dependency: "direct main"
415
description:
416
name: path_provider
417
- sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95
417
+ sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
418
url: "https://pub.dev"
419
source: hosted
420
- version: "2.0.12"
420
+ version: "2.1.1"
421
path_provider_android:
422
dependency: transitive
423
description:
424
name: path_provider_android
425
- sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e
425
+ sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
426
url: "https://pub.dev"
427
source: hosted
428
- version: "2.0.22"
428
+ version: "2.2.1"
429
path_provider_foundation:
430
dependency: transitive
431
description:
432
name: path_provider_foundation
433
- sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74"
433
+ sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
434
url: "https://pub.dev"
435
source: hosted
436
- version: "2.1.1"
436
+ version: "2.3.1"
437
path_provider_linux:
438
dependency: transitive
439
description:
440
name: path_provider_linux
441
- sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
441
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
442
url: "https://pub.dev"
443
source: hosted
444
- version: "2.1.7"
444
+ version: "2.2.1"
445
path_provider_platform_interface:
446
dependency: transitive
447
description:
448
name: path_provider_platform_interface
449
- sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76
449
+ sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
450
url: "https://pub.dev"
451
source: hosted
452
- version: "2.0.5"
452
+ version: "2.1.1"
453
path_provider_windows:
454
dependency: transitive
455
description:
456
name: path_provider_windows
457
- sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
457
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
458
url: "https://pub.dev"
459
source: hosted
460
- version: "2.1.5"
460
+ version: "2.2.1"
461
platform:
462
dependency: transitive
463
description:
@@ -535,6 +535,14 @@ packages:
535
description: flutter
536
source: sdk
537
version: "0.0.99"
538
+ socks5_proxy:
539
+ dependency: transitive
540
+ description:
541
+ name: socks5_proxy
542
+ sha256: "1d21b5606169654bbf4cfb904e8e6ed897e9f763358709f87310c757096d909a"
543
+ url: "https://pub.dev"
544
+ source: hosted
545
+ version: "1.0.4"
546
source_gen:
547
dependency: transitive
548
description:
@@ -615,6 +623,15 @@ packages:
623
url: "https://pub.dev"
624
source: hosted
625
version: "1.0.1"
626
+ tor:
627
+ dependency: transitive
628
+ description:
629
+ path: "."
630
+ ref: main
631
+ resolved-ref: "09ba92cb11d4e3cacf97256e57863b805f79f2e5"
632
+ url: "https://github.com/cake-tech/tor.git"
633
+ source: git
634
+ version: "0.0.1"
635
typed_data:
636
dependency: transitive
637
description:
@@ -673,4 +690,4 @@ packages:
690
version: "3.1.1"
691
sdks:
692
dart: ">=3.0.0 <4.0.0"
676
- flutter: ">=3.0.0"
693
+ flutter: ">=3.7.0"
cw_monero/example/pubspec.lock
+30
-13
@@ -237,50 +237,50 @@ packages:
237
dependency: transitive
238
description:
239
name: path_provider
240
- sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95
240
+ sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
241
url: "https://pub.dev"
242
source: hosted
243
- version: "2.0.12"
243
+ version: "2.1.1"
244
path_provider_android:
245
dependency: transitive
246
description:
247
name: path_provider_android
248
- sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e
248
+ sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
249
url: "https://pub.dev"
250
source: hosted
251
- version: "2.0.22"
251
+ version: "2.2.1"
252
path_provider_foundation:
253
dependency: transitive
254
description:
255
name: path_provider_foundation
256
- sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74"
256
+ sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
257
url: "https://pub.dev"
258
source: hosted
259
- version: "2.1.1"
259
+ version: "2.3.1"
260
path_provider_linux:
261
dependency: transitive
262
description:
263
name: path_provider_linux
264
- sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
264
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
265
url: "https://pub.dev"
266
source: hosted
267
- version: "2.1.7"
267
+ version: "2.2.1"
268
path_provider_platform_interface:
269
dependency: transitive
270
description:
271
name: path_provider_platform_interface
272
- sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76
272
+ sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
273
url: "https://pub.dev"
274
source: hosted
275
- version: "2.0.5"
275
+ version: "2.1.1"
276
path_provider_windows:
277
dependency: transitive
278
description:
279
name: path_provider_windows
280
- sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
280
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
281
url: "https://pub.dev"
282
source: hosted
283
- version: "2.1.5"
283
+ version: "2.2.1"
284
platform:
285
dependency: transitive
286
description:
@@ -318,6 +318,14 @@ packages:
318
description: flutter
319
source: sdk
320
version: "0.0.99"
321
+ socks5_proxy:
322
+ dependency: transitive
323
+ description:
324
+ name: socks5_proxy
325
+ sha256: "1d21b5606169654bbf4cfb904e8e6ed897e9f763358709f87310c757096d909a"
326
+ url: "https://pub.dev"
327
+ source: hosted
328
+ version: "1.0.4"
329
source_span:
330
dependency: transitive
331
description:
@@ -366,6 +374,15 @@ packages:
374
url: "https://pub.dev"
375
source: hosted
376
version: "0.5.1"
377
+ tor:
378
+ dependency: transitive
379
+ description:
380
+ path: "."
381
+ ref: main
382
+ resolved-ref: "09ba92cb11d4e3cacf97256e57863b805f79f2e5"
383
+ url: "https://github.com/cake-tech/tor.git"
384
+ source: git
385
+ version: "0.0.1"
386
typed_data:
387
dependency: transitive
388
description:
@@ -400,4 +417,4 @@ packages:
417
version: "0.2.0+3"
418
sdks:
419
dart: ">=3.0.0 <4.0.0"
403
- flutter: ">=3.0.0"
420
+ flutter: ">=3.7.0"
cw_monero/pubspec.lock
+30
-13
@@ -414,50 +414,50 @@ packages:
414
dependency: "direct main"
415
description:
416
name: path_provider
417
- sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95
417
+ sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
418
url: "https://pub.dev"
419
source: hosted
420
- version: "2.0.12"
420
+ version: "2.1.1"
421
path_provider_android:
422
dependency: transitive
423
description:
424
name: path_provider_android
425
- sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e
425
+ sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
426
url: "https://pub.dev"
427
source: hosted
428
- version: "2.0.22"
428
+ version: "2.2.1"
429
path_provider_foundation:
430
dependency: transitive
431
description:
432
name: path_provider_foundation
433
- sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74"
433
+ sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
434
url: "https://pub.dev"
435
source: hosted
436
- version: "2.1.1"
436
+ version: "2.3.1"
437
path_provider_linux:
438
dependency: transitive
439
description:
440
name: path_provider_linux
441
- sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
441
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
442
url: "https://pub.dev"
443
source: hosted
444
- version: "2.1.7"
444
+ version: "2.2.1"
445
path_provider_platform_interface:
446
dependency: transitive
447
description:
448
name: path_provider_platform_interface
449
- sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76
449
+ sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
450
url: "https://pub.dev"
451
source: hosted
452
- version: "2.0.5"
452
+ version: "2.1.1"
453
path_provider_windows:
454
dependency: transitive
455
description:
456
name: path_provider_windows
457
- sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
457
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
458
url: "https://pub.dev"
459
source: hosted
460
- version: "2.1.5"
460
+ version: "2.2.1"
461
platform:
462
dependency: transitive
463
description:
@@ -535,6 +535,14 @@ packages:
535
description: flutter
536
source: sdk
537
version: "0.0.99"
538
+ socks5_proxy:
539
+ dependency: transitive
540
+ description:
541
+ name: socks5_proxy
542
+ sha256: "1d21b5606169654bbf4cfb904e8e6ed897e9f763358709f87310c757096d909a"
543
+ url: "https://pub.dev"
544
+ source: hosted
545
+ version: "1.0.4"
546
source_gen:
547
dependency: transitive
548
description:
@@ -615,6 +623,15 @@ packages:
623
url: "https://pub.dev"
624
source: hosted
625
version: "1.0.1"
626
+ tor:
627
+ dependency: transitive
628
+ description:
629
+ path: "."
630
+ ref: main
631
+ resolved-ref: "09ba92cb11d4e3cacf97256e57863b805f79f2e5"
632
+ url: "https://github.com/cake-tech/tor.git"
633
+ source: git
634
+ version: "0.0.1"
635
typed_data:
636
dependency: transitive
637
description:
@@ -673,4 +690,4 @@ packages:
690
version: "3.1.1"
691
sdks:
692
dart: ">=3.0.0 <4.0.0"
676
- flutter: ">=3.0.0"
693
+ flutter: ">=3.7.0"
cw_nano/pubspec.lock
+29
-12
@@ -491,50 +491,50 @@ packages:
491
dependency: transitive
492
description:
493
name: path_provider
494
- sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2"
494
+ sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
495
url: "https://pub.dev"
496
source: hosted
497
- version: "2.0.15"
497
+ version: "2.1.1"
498
path_provider_android:
499
dependency: transitive
500
description:
501
name: path_provider_android
502
- sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86"
502
+ sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
503
url: "https://pub.dev"
504
source: hosted
505
- version: "2.0.27"
505
+ version: "2.2.1"
506
path_provider_foundation:
507
dependency: transitive
508
description:
509
name: path_provider_foundation
510
- sha256: "916731ccbdce44d545414dd9961f26ba5fbaa74bcbb55237d8e65a623a8c7297"
510
+ sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
511
url: "https://pub.dev"
512
source: hosted
513
- version: "2.2.4"
513
+ version: "2.3.1"
514
path_provider_linux:
515
dependency: transitive
516
description:
517
name: path_provider_linux
518
- sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57
518
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
519
url: "https://pub.dev"
520
source: hosted
521
- version: "2.1.11"
521
+ version: "2.2.1"
522
path_provider_platform_interface:
523
dependency: transitive
524
description:
525
name: path_provider_platform_interface
526
- sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
526
+ sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
527
url: "https://pub.dev"
528
source: hosted
529
- version: "2.0.6"
529
+ version: "2.1.1"
530
path_provider_windows:
531
dependency: transitive
532
description:
533
name: path_provider_windows
534
- sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96"
534
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
535
url: "https://pub.dev"
536
source: hosted
537
- version: "2.1.7"
537
+ version: "2.2.1"
538
pinenacl:
539
dependency: transitive
540
description:
@@ -676,6 +676,14 @@ packages:
676
description: flutter
677
source: sdk
678
version: "0.0.99"
679
+ socks5_proxy:
680
+ dependency: transitive
681
+ description:
682
+ name: socks5_proxy
683
+ sha256: "1d21b5606169654bbf4cfb904e8e6ed897e9f763358709f87310c757096d909a"
684
+ url: "https://pub.dev"
685
+ source: hosted
686
+ version: "1.0.4"
687
source_gen:
688
dependency: transitive
689
description:
@@ -756,6 +764,15 @@ packages:
764
url: "https://pub.dev"
765
source: hosted
766
version: "1.0.1"
767
+ tor:
768
+ dependency: transitive
769
+ description:
770
+ path: "."
771
+ ref: main
772
+ resolved-ref: "09ba92cb11d4e3cacf97256e57863b805f79f2e5"
773
+ url: "https://github.com/cake-tech/tor.git"
774
+ source: git
775
+ version: "0.0.1"
776
typed_data:
777
dependency: transitive
778
description:
ios/Podfile.lock
+6
@@ -147,6 +147,8 @@ PODS:
147
- SwiftProtobuf (1.22.0)
148
- SwiftyGif (5.4.4)
149
- Toast (4.0.0)
150
+ - tor (0.0.1):
151
+ - Flutter
152
- uni_links (0.0.1):
153
- Flutter
154
- UnstoppableDomainsResolution (4.0.0):
@@ -185,6 +187,7 @@ DEPENDENCIES:
187
- sensitive_clipboard (from `.symlinks/plugins/sensitive_clipboard/ios`)
188
- share_plus (from `.symlinks/plugins/share_plus/ios`)
189
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
190
+ - tor (from `.symlinks/plugins/tor/ios`)
191
- uni_links (from `.symlinks/plugins/uni_links/ios`)
192
- UnstoppableDomainsResolution (~> 4.0.0)
193
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
@@ -255,6 +258,8 @@ EXTERNAL SOURCES:
258
:path: ".symlinks/plugins/share_plus/ios"
259
shared_preferences_foundation:
260
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
261
+ tor:
262
+ :path: ".symlinks/plugins/tor/ios"
263
uni_links:
264
:path: ".symlinks/plugins/uni_links/ios"
265
url_launcher_ios:
@@ -300,6 +305,7 @@ SPEC CHECKSUMS:
305
SwiftProtobuf: 40bd808372cb8706108f22d28f8ab4a6b9bc6989
306
SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
307
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
308
+ tor: 662a9f5b980b5c86decb8ba611de9bcd4c8286eb
309
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
310
UnstoppableDomainsResolution: c3c67f4d0a5e2437cb00d4bd50c2e00d6e743841
311
url_launcher_ios: 68d46cc9766d0c41dbdc884310529557e3cd7a86
lib/di.dart
+2
@@ -46,6 +46,7 @@ import 'package:cake_wallet/src/screens/ionia/cards/ionia_gift_card_detail_page.
46
import 'package:cake_wallet/src/screens/ionia/cards/ionia_more_options_page.dart';
47
import 'package:cake_wallet/src/screens/settings/connection_sync_page.dart';
48
import 'package:cake_wallet/src/screens/settings/trocador_providers_page.dart';
49
+import 'package:cake_wallet/src/screens/settings/tor_page.dart';
50
import 'package:cake_wallet/src/screens/setup_2fa/modify_2fa_page.dart';
51
import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa_qr_page.dart';
52
import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa.dart';
@@ -1175,6 +1176,7 @@ Future<void> setup({
1176
getIt.registerFactory(
1177
() => WalletConnectConnectionsView(web3walletService: getIt.get<Web3WalletService>()));
1178
1179
+ getIt.registerFactory<TorPage>(() => TorPage(getIt.get<AppStore>()));
1180
1181
_isSetupFinished = true;
1182
}
lib/router.dart
+4
@@ -43,6 +43,7 @@ import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart';
43
import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart';
44
import 'package:cake_wallet/src/screens/settings/connection_sync_page.dart';
45
import 'package:cake_wallet/src/screens/settings/trocador_providers_page.dart';
46
+import 'package:cake_wallet/src/screens/settings/tor_page.dart';
47
import 'package:cake_wallet/src/screens/setup_2fa/modify_2fa_page.dart';
48
import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa_qr_page.dart';
49
import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa.dart';
@@ -615,6 +616,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
616
web3walletService: getIt.get<Web3WalletService>(),
617
launchUri: settings.arguments as Uri?,
618
));
619
+ case Routes.torPage:
620
+ return MaterialPageRoute<void>(builder: (_) => getIt.get<TorPage>());
621
+
622
default:
623
return MaterialPageRoute<void>(
624
builder: (_) => Scaffold(
lib/routes.dart
+1
@@ -101,4 +101,5 @@ class Routes {
101
static const manageNodes = '/manage_nodes';
102
static const managePowNodes = '/manage_pow_nodes';
103
static const walletConnectConnectionsListing = '/wallet-connect-connections-listing';
104
+ static const torPage = '/tor_page';
105
}
lib/src/screens/settings/connection_sync_page.dart
+5
-2
@@ -3,7 +3,6 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arro
3
import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
4
import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
5
import 'package:cake_wallet/src/screens/settings/widgets/wallet_connect_button.dart';
6
-import 'package:cake_wallet/src/screens/wallet_connect/wc_connections_listing_view.dart';
6
import 'package:cake_wallet/utils/device_info.dart';
7
import 'package:cake_wallet/utils/show_pop_up.dart';
8
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
@@ -90,7 +89,11 @@ class ConnectionSyncPage extends BasePage {
89
onTap: () => Navigator.of(context).pushNamed(Routes.walletConnectConnectionsListing),
90
),
91
const StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
93
- ]
92
+ ],
93
+ SettingsCellWithArrow(
94
+ title: S.current.tor_connection,
95
+ handler: (context) => Navigator.of(context).pushNamed(Routes.torPage),
96
+ ),
97
],
98
),
99
);
lib/src/screens/settings/tor_page.dart
new
+267
@@ -0,0 +1,267 @@
1
+import 'dart:async';
2
+import 'dart:io';
3
+
4
+import 'package:cake_wallet/src/screens/base_page.dart';
5
+import 'package:cake_wallet/store/app_store.dart';
6
+import 'package:flutter/material.dart';
7
+import 'package:tor/tor.dart';
8
+
9
+class TorPage extends BasePage {
10
+ final AppStore appStore;
11
+
12
+ TorPage(this.appStore);
13
+
14
+ @override
15
+ Widget body(BuildContext context) {
16
+ return TorPageBody(appStore);
17
+ }
18
+}
19
+
20
+class TorPageBody extends StatefulWidget {
21
+ final AppStore appStore;
22
+
23
+ const TorPageBody(this.appStore, {Key? key}) : super(key: key);
24
+
25
+ @override
26
+ State<TorPageBody> createState() => _TorPageBodyState();
27
+}
28
+
29
+class _TorPageBodyState extends State<TorPageBody> {
30
+ bool torEnabled = false;
31
+ bool connecting = false;
32
+
33
+ // Set the default text for the host input field.
34
+ final hostController = TextEditingController(text: 'https://icanhazip.com/');
35
+
36
+ // https://check.torproject.org is another good option.
37
+
38
+ Future<void> startTor() async {
39
+ setState(() {
40
+ connecting = true; // Update flag
41
+ });
42
+
43
+ await Tor.init();
44
+
45
+ // Start the proxy
46
+ await Tor.instance.start();
47
+
48
+ // Toggle started flag.
49
+ setState(() {
50
+ torEnabled = Tor.instance.enabled; // Update flag
51
+ connecting = false;
52
+ });
53
+
54
+ final node = widget.appStore.settingsStore.getCurrentNode(widget.appStore.wallet!.type);
55
+ if (node.socksProxyAddress?.isEmpty ?? true) {
56
+ node.socksProxyAddress = "${InternetAddress.loopbackIPv4.address}:${Tor.instance.port}";
57
+ }
58
+ widget.appStore.wallet!.connectToNode(node: node);
59
+
60
+ print('Done awaiting; tor should be running');
61
+ }
62
+
63
+ Future<void> endTor() async {
64
+ // Start the proxy
65
+ Tor.instance.disable();
66
+
67
+ // Toggle started flag.
68
+ setState(() {
69
+ torEnabled = Tor.instance.enabled; // Update flag
70
+ });
71
+
72
+ print('Done awaiting; tor should be stopped');
73
+ }
74
+
75
+ @override
76
+ void initState() {
77
+ super.initState();
78
+
79
+ torEnabled = Tor.instance.enabled;
80
+ }
81
+
82
+ @override
83
+ void dispose() {
84
+ // Clean up the controller when the widget is disposed.
85
+ hostController.dispose();
86
+ super.dispose();
87
+ }
88
+
89
+ @override
90
+ Widget build(BuildContext context) {
91
+ return SingleChildScrollView(
92
+ child: Container(
93
+ padding: const EdgeInsets.all(10),
94
+ child: connecting
95
+ ? ConnectingScreen()
96
+ : torEnabled
97
+ ? DisconnectScreen(disconnect: endTor)
98
+ : ConnectScreen(connect: startTor),
99
+ ),
100
+ );
101
+ }
102
+}
103
+
104
+class ConnectScreen extends StatelessWidget {
105
+ final Function() connect;
106
+
107
+ const ConnectScreen({super.key, required this.connect});
108
+
109
+ @override
110
+ Widget build(BuildContext context) {
111
+ return Center(
112
+ child: Column(
113
+ mainAxisAlignment: MainAxisAlignment.center,
114
+ children: <Widget>[
115
+ Container(
116
+ width: 200,
117
+ height: 200,
118
+ decoration: BoxDecoration(
119
+ shape: BoxShape.circle,
120
+ color: Colors.blue,
121
+ ),
122
+ child: Icon(
123
+ Icons.lock,
124
+ color: Colors.white,
125
+ size: 100,
126
+ ),
127
+ ),
128
+ SizedBox(height: 20),
129
+ Text(
130
+ 'Connect to Tor',
131
+ style: TextStyle(
132
+ fontSize: 24,
133
+ fontWeight: FontWeight.bold,
134
+ ),
135
+ ),
136
+ SizedBox(height: 10),
137
+ Text(
138
+ 'Your connection to the Tor network ensures privacy and security.',
139
+ style: TextStyle(
140
+ fontSize: 16,
141
+ color: Colors.grey,
142
+ ),
143
+ textAlign: TextAlign.center,
144
+ ),
145
+ SizedBox(height: 30),
146
+ ElevatedButton(
147
+ onPressed: connect,
148
+ style: ElevatedButton.styleFrom(
149
+ primary: Colors.blue,
150
+ padding: EdgeInsets.symmetric(horizontal: 40, vertical: 15),
151
+ shape: RoundedRectangleBorder(
152
+ borderRadius: BorderRadius.circular(30),
153
+ ),
154
+ ),
155
+ child: Text(
156
+ 'Connect',
157
+ style: TextStyle(
158
+ fontSize: 18,
159
+ color: Colors.white,
160
+ ),
161
+ ),
162
+ ),
163
+ ],
164
+ ),
165
+ );
166
+ }
167
+}
168
+
169
+class DisconnectScreen extends StatelessWidget {
170
+ final Function() disconnect;
171
+
172
+ const DisconnectScreen({super.key, required this.disconnect});
173
+
174
+ @override
175
+ Widget build(BuildContext context) {
176
+ return Center(
177
+ child: Column(
178
+ mainAxisAlignment: MainAxisAlignment.center,
179
+ children: <Widget>[
180
+ Container(
181
+ width: 200,
182
+ height: 200,
183
+ decoration: BoxDecoration(
184
+ shape: BoxShape.circle,
185
+ color: Colors.green,
186
+ ),
187
+ child: Icon(
188
+ Icons.check,
189
+ color: Colors.white,
190
+ size: 100,
191
+ ),
192
+ ),
193
+ SizedBox(height: 20),
194
+ Text(
195
+ 'Connected to Tor',
196
+ style: TextStyle(
197
+ fontSize: 24,
198
+ fontWeight: FontWeight.bold,
199
+ ),
200
+ ),
201
+ SizedBox(height: 10),
202
+ Text(
203
+ 'You are currently connected to the Tor network.',
204
+ style: TextStyle(
205
+ fontSize: 16,
206
+ color: Colors.grey,
207
+ ),
208
+ textAlign: TextAlign.center,
209
+ ),
210
+ SizedBox(height: 30),
211
+ ElevatedButton(
212
+ onPressed: disconnect,
213
+ style: ElevatedButton.styleFrom(
214
+ primary: Colors.red,
215
+ padding: EdgeInsets.symmetric(horizontal: 40, vertical: 15),
216
+ shape: RoundedRectangleBorder(
217
+ borderRadius: BorderRadius.circular(30),
218
+ ),
219
+ ),
220
+ child: Text(
221
+ 'Disconnect',
222
+ style: TextStyle(
223
+ fontSize: 18,
224
+ color: Colors.white,
225
+ ),
226
+ ),
227
+ ),
228
+ ],
229
+ ),
230
+ );
231
+ }
232
+}
233
+
234
+class ConnectingScreen extends StatelessWidget {
235
+ @override
236
+ Widget build(BuildContext context) {
237
+ return Center(
238
+ child: Column(
239
+ mainAxisAlignment: MainAxisAlignment.center,
240
+ children: <Widget>[
241
+ Container(
242
+ width: 200,
243
+ height: 200,
244
+ decoration: BoxDecoration(
245
+ shape: BoxShape.circle,
246
+ color: Colors.yellow,
247
+ ),
248
+ child: Icon(
249
+ Icons.hourglass_bottom,
250
+ color: Colors.white,
251
+ size: 100,
252
+ ),
253
+ ),
254
+ SizedBox(height: 20),
255
+ Text(
256
+ 'Connecting...',
257
+ style: TextStyle(
258
+ fontSize: 24,
259
+ fontWeight: FontWeight.bold,
260
+ ),
261
+ ),
262
+ SizedBox(height: 10),
263
+ ],
264
+ ),
265
+ );
266
+ }
267
+}
pubspec_base.yaml
+6
-1
@@ -83,7 +83,7 @@ dependencies:
83
ref: main
84
version: 1.0.0
85
flutter_plugin_android_lifecycle: 2.0.9
86
- path_provider_android: 2.0.24
86
+ path_provider_android: ^2.2.1
87
shared_preferences_android: 2.0.17
88
url_launcher_android: 6.0.24
89
sensitive_clipboard: ^1.0.0
@@ -98,6 +98,11 @@ dependencies:
98
url: https://github.com/cake-tech/bitcoin_flutter.git
99
ref: cake-update-v3
100
fluttertoast: 8.1.4
101
+ tor:
102
+ git:
103
+ url: https://github.com/cake-tech/tor.git
104
+ ref: main
105
+ socks5_proxy: ^1.0.4
106
107
dev_dependencies:
108
flutter_test:
res/values/strings_ar.arb
+2
-1
@@ -730,5 +730,6 @@
730
"seed_phrase_length": " ﺭﻭﺬﺒﻟﺍ ﺓﺭﺎﺒﻌﻟﺍ ﻝﻮﻃ",
731
"unavailable_balance": " ﺮﻓﻮﺘﻣ ﺮﻴﻏ ﺪﻴﺻﺭ",
732
"unavailable_balance_description": ".ﺎﻫﺪﻴﻤﺠﺗ ءﺎﻐﻟﺇ ﺭﺮﻘﺗ ﻰﺘﺣ ﺕﻼﻣﺎﻌﻤﻠﻟ ﻝﻮﺻﻮﻠﻟ ﺔﻠﺑﺎﻗ ﺮﻴﻏ ﺓﺪﻤﺠﻤﻟﺍ ﺓﺪﺻﺭﻷﺍ ﻞﻈﺗ ﺎﻤﻨﻴﺑ ،ﺎﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺕﻼﻣﺎﻌﻤﻟﺍ ﻝﺎﻤﺘﻛﺍ ﺩﺮﺠﻤﺑ ﺔﺣﺎﺘﻣ ﺔﻠﻔﻘﻤﻟﺍ ﺓﺪﺻﺭﻷﺍ ﺢﺒﺼﺘﺳ .ﻚﺑ ﺔﺻﺎﺨﻟﺍ ﺕﻼﻤﻌﻟﺍ ﻲﻓ ﻢﻜﺤﺘﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻲﻓ ﻂﺸﻧ ﻞﻜﺸﺑ ﺎﻫﺪﻴﻤﺠﺘﺑ ﺖﻤﻗ",
733
- "unspent_change": "يتغير"
733
+ "unspent_change": "يتغير",
734
+ "tor_connection": " ﺭﻮﺗ ﻝﺎﺼﺗﺍ"
735
}
res/values/strings_bg.arb
+2
-1
@@ -726,5 +726,6 @@
726
"seed_phrase_length": "Дължина на началната фраза",
727
"unavailable_balance": "Неналично салдо",
728
"unavailable_balance_description": "Неналично салдо: Тази обща сума включва средства, които са заключени в чакащи транзакции и тези, които сте замразили активно в настройките за контрол на монетите. Заключените баланси ще станат достъпни, след като съответните им транзакции бъдат завършени, докато замразените баланси остават недостъпни за транзакции, докато не решите да ги размразите.",
729
- "unspent_change": "Промяна"
729
+ "unspent_change": "Промяна",
730
+ "tor_connection": "Tor връзка"
731
}
res/values/strings_cs.arb
+2
-1
@@ -726,5 +726,6 @@
726
"seed_phrase_length": "Délka fráze semene",
727
"unavailable_balance": "Nedostupný zůstatek",
728
"unavailable_balance_description": "Nedostupný zůstatek: Tento součet zahrnuje prostředky, které jsou uzamčeny v nevyřízených transakcích a ty, které jste aktivně zmrazili v nastavení kontroly mincí. Uzamčené zůstatky budou k dispozici po dokončení příslušných transakcí, zatímco zmrazené zůstatky zůstanou pro transakce nepřístupné, dokud se nerozhodnete je uvolnit.",
729
- "unspent_change": "Změna"
729
+ "unspent_change": "Změna",
730
+ "tor_connection": "Připojení Tor"
731
}
res/values/strings_de.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "Länge der Seed-Phrase",
735
"unavailable_balance": "Nicht verfügbares Guthaben",
736
"unavailable_balance_description": "Nicht verfügbares Guthaben: Diese Summe umfasst Gelder, die in ausstehenden Transaktionen gesperrt sind, und solche, die Sie in Ihren Münzkontrolleinstellungen aktiv eingefroren haben. Gesperrte Guthaben werden verfügbar, sobald die entsprechenden Transaktionen abgeschlossen sind, während eingefrorene Guthaben für Transaktionen nicht zugänglich bleiben, bis Sie sich dazu entschließen, sie wieder freizugeben.",
737
- "unspent_change": "Wechselgeld"
737
+ "unspent_change": "Wechselgeld",
738
+ "tor_connection": "Tor-Verbindung"
739
}
res/values/strings_en.arb
+2
-1
@@ -735,5 +735,6 @@
735
"seed_phrase_length": "Seed phrase length",
736
"unavailable_balance": "Unavailable balance",
737
"unavailable_balance_description": "Unavailable Balance: This total includes funds that are locked in pending transactions and those you have actively frozen in your coin control settings. Locked balances will become available once their respective transactions are completed, while frozen balances remain inaccessible for transactions until you decide to unfreeze them.",
738
- "unspent_change": "Change"
738
+ "unspent_change": "Change",
739
+ "tor_connection": "Tor connection"
740
}
res/values/strings_es.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "Longitud de la frase inicial",
735
"unavailable_balance": "Saldo no disponible",
736
"unavailable_balance_description": "Saldo no disponible: este total incluye fondos que están bloqueados en transacciones pendientes y aquellos que usted ha congelado activamente en su configuración de control de monedas. Los saldos bloqueados estarán disponibles una vez que se completen sus respectivas transacciones, mientras que los saldos congelados permanecerán inaccesibles para las transacciones hasta que usted decida descongelarlos.",
737
- "unspent_change": "Cambiar"
737
+ "unspent_change": "Cambiar",
738
+ "tor_connection": "conexión tor"
739
}
res/values/strings_fr.arb
+2
-1
@@ -734,5 +734,6 @@
734
"unavailable_balance_description": "Solde indisponible : ce total comprend les fonds bloqués dans les transactions en attente et ceux que vous avez activement gelés dans vos paramètres de contrôle des pièces. Les soldes bloqués deviendront disponibles une fois leurs transactions respectives terminées, tandis que les soldes gelés resteront inaccessibles aux transactions jusqu'à ce que vous décidiez de les débloquer.",
735
"camera_permission_is_required": "L'autorisation d'accès à la caméra est requise.\nVeuillez l'activer depuis les paramètres de l'application.",
736
"switchToETHWallet": "Veuillez passer à un portefeuille (wallet) Ethereum et réessayer",
737
- "unspent_change": "Changement"
737
+ "unspent_change": "Changement",
738
+ "tor_connection": "Connexion Tor"
739
}
res/values/strings_ha.arb
+2
-1
@@ -712,5 +712,6 @@
712
"seed_phrase_length": "Tsawon jimlar iri",
713
"unavailable_balance": "Ma'aunin da ba ya samuwa",
714
"unavailable_balance_description": "Ma'auni Babu: Wannan jimlar ya haɗa da kuɗi waɗanda ke kulle a cikin ma'amaloli da ke jiran aiki da waɗanda kuka daskare sosai a cikin saitunan sarrafa kuɗin ku. Ma'auni da aka kulle za su kasance da zarar an kammala ma'amalolinsu, yayin da daskararrun ma'auni ba za su iya samun damar yin ciniki ba har sai kun yanke shawarar cire su.",
715
- "unspent_change": "Canza"
715
+ "unspent_change": "Canza",
716
+ "tor_connection": "Tor haɗin gwiwa"
717
}
res/values/strings_hi.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "बीज वाक्यांश की लंबाई",
735
"unavailable_balance": "अनुपलब्ध शेष",
736
"unavailable_balance_description": "अनुपलब्ध शेष राशि: इस कुल में वे धनराशि शामिल हैं जो लंबित लेनदेन में बंद हैं और जिन्हें आपने अपनी सिक्का नियंत्रण सेटिंग्स में सक्रिय रूप से जमा कर रखा है। लॉक किए गए शेष उनके संबंधित लेन-देन पूरे होने के बाद उपलब्ध हो जाएंगे, जबकि जमे हुए शेष लेन-देन के लिए अप्राप्य रहेंगे जब तक कि आप उन्हें अनफ्रीज करने का निर्णय नहीं लेते।",
737
- "unspent_change": "परिवर्तन"
737
+ "unspent_change": "परिवर्तन",
738
+ "tor_connection": "टोर कनेक्शन"
739
}
res/values/strings_hr.arb
+2
-1
@@ -732,5 +732,6 @@
732
"seed_phrase_length": "Duljina početne fraze",
733
"unavailable_balance": "Nedostupno stanje",
734
"unavailable_balance_description": "Nedostupno stanje: Ovaj ukupni iznos uključuje sredstva koja su zaključana u transakcijama na čekanju i ona koja ste aktivno zamrznuli u postavkama kontrole novčića. Zaključani saldi postat će dostupni kada se dovrše njihove transakcije, dok zamrznuti saldi ostaju nedostupni za transakcije sve dok ih ne odlučite odmrznuti.",
735
- "unspent_change": "Promijeniti"
735
+ "unspent_change": "Promijeniti",
736
+ "tor_connection": "Tor veza"
737
}
res/values/strings_id.arb
+2
-1
@@ -722,5 +722,6 @@
722
"seed_phrase_length": "Panjang frase benih",
723
"unavailable_balance": "Saldo tidak tersedia",
724
"unavailable_balance_description": "Saldo Tidak Tersedia: Total ini termasuk dana yang terkunci dalam transaksi yang tertunda dan dana yang telah Anda bekukan secara aktif di pengaturan kontrol koin Anda. Saldo yang terkunci akan tersedia setelah transaksi masing-masing selesai, sedangkan saldo yang dibekukan tetap tidak dapat diakses untuk transaksi sampai Anda memutuskan untuk mencairkannya.",
725
- "unspent_change": "Mengubah"
725
+ "unspent_change": "Mengubah",
726
+ "tor_connection": "koneksi Tor"
727
}
res/values/strings_it.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "Lunghezza della frase seed",
735
"unavailable_balance": "Saldo non disponibile",
736
"unavailable_balance_description": "Saldo non disponibile: questo totale include i fondi bloccati nelle transazioni in sospeso e quelli che hai congelato attivamente nelle impostazioni di controllo delle monete. I saldi bloccati diventeranno disponibili una volta completate le rispettive transazioni, mentre i saldi congelati rimarranno inaccessibili per le transazioni finché non deciderai di sbloccarli.",
737
- "unspent_change": "Modifica"
737
+ "unspent_change": "Modifica",
738
+ "tor_connection": "Connessione Tor"
739
}
res/values/strings_ja.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "シードフレーズの長さ",
735
"unavailable_balance": "利用できない残高",
736
"unavailable_balance_description": "利用不可能な残高: この合計には、保留中のトランザクションにロックされている資金と、コイン管理設定でアクティブに凍結した資金が含まれます。ロックされた残高は、それぞれの取引が完了すると利用可能になりますが、凍結された残高は、凍結を解除するまで取引にアクセスできません。",
737
- "unspent_change": "変化"
737
+ "unspent_change": "変化",
738
+ "tor_connection": "Tor接続"
739
}
res/values/strings_ko.arb
+2
-1
@@ -732,5 +732,6 @@
732
"seed_phrase_length": "시드 문구 길이",
733
"unavailable_balance": "사용할 수 없는 잔액",
734
"unavailable_balance_description": "사용할 수 없는 잔액: 이 총계에는 보류 중인 거래에 잠겨 있는 자금과 코인 관리 설정에서 적극적으로 동결된 자금이 포함됩니다. 잠긴 잔액은 해당 거래가 완료되면 사용할 수 있게 되며, 동결된 잔액은 동결을 해제하기 전까지 거래에 액세스할 수 없습니다.",
735
- "unspent_change": "변화"
735
+ "unspent_change": "변화",
736
+ "tor_connection": "토르 연결"
737
}
res/values/strings_my.arb
+2
-1
@@ -732,5 +732,6 @@
732
"seed_phrase_length": "မျိုးစေ့စာပိုဒ်တိုအရှည်",
733
"unavailable_balance": "လက်ကျန်ငွေ မရရှိနိုင်ပါ။",
734
"unavailable_balance_description": "မရရှိနိုင်သော လက်ကျန်ငွေ- ဤစုစုပေါင်းတွင် ဆိုင်းငံ့ထားသော ငွေပေးငွေယူများတွင် သော့ခတ်ထားသော ငွေကြေးများနှင့် သင်၏ coin ထိန်းချုပ်မှုဆက်တင်များတွင် သင် တက်ကြွစွာ အေးခဲထားသော ငွေများ ပါဝင်သည်။ သော့ခတ်ထားသော လက်ကျန်ငွေများကို ၎င်းတို့၏ သက်ဆိုင်ရာ ငွေပေးငွေယူများ ပြီးမြောက်သည်နှင့် တပြိုင်နက် ရရှိနိုင်မည်ဖြစ်ပြီး၊ အေးခဲထားသော လက်ကျန်များကို ၎င်းတို့အား ပြန်ဖြုတ်ရန် သင်ဆုံးဖြတ်သည်အထိ ငွေပေးငွေယူများအတွက် ဆက်လက်၍မရနိုင်ပါ။",
735
- "unspent_change": "ပေြာင်းလဲခြင်း"
735
+ "unspent_change": "ပေြာင်းလဲခြင်း",
736
+ "tor_connection": "Tor ချိတ်ဆက်မှု"
737
}
res/values/strings_nl.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "Lengte van de zaadzin",
735
"unavailable_balance": "Onbeschikbaar saldo",
736
"unavailable_balance_description": "Niet-beschikbaar saldo: Dit totaal omvat het geld dat is vergrendeld in lopende transacties en het geld dat u actief hebt bevroren in uw muntcontrole-instellingen. Vergrendelde saldi komen beschikbaar zodra de betreffende transacties zijn voltooid, terwijl bevroren saldi ontoegankelijk blijven voor transacties totdat u besluit ze weer vrij te geven.",
737
- "unspent_change": "Wijziging"
737
+ "unspent_change": "Wijziging",
738
+ "tor_connection": "Tor-verbinding"
739
}
res/values/strings_pl.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "Długość frazy początkowej",
735
"unavailable_balance": "Niedostępne saldo",
736
"unavailable_balance_description": "Niedostępne saldo: Suma ta obejmuje środki zablokowane w transakcjach oczekujących oraz te, które aktywnie zamroziłeś w ustawieniach kontroli monet. Zablokowane salda staną się dostępne po zakończeniu odpowiednich transakcji, natomiast zamrożone salda pozostaną niedostępne dla transakcji, dopóki nie zdecydujesz się ich odblokować.",
737
- "unspent_change": "Zmiana"
737
+ "unspent_change": "Zmiana",
738
+ "tor_connection": "Połączenie Torem"
739
}
res/values/strings_pt.arb
+2
-1
@@ -733,5 +733,6 @@
733
"seed_phrase_length": "Comprimento da frase-semente",
734
"unavailable_balance": "Saldo indisponível",
735
"unavailable_balance_description": "Saldo Indisponível: Este total inclui fundos bloqueados em transações pendentes e aqueles que você congelou ativamente nas configurações de controle de moedas. Os saldos bloqueados ficarão disponíveis assim que suas respectivas transações forem concluídas, enquanto os saldos congelados permanecerão inacessíveis para transações até que você decida descongelá-los.",
736
- "unspent_change": "Mudar"
736
+ "unspent_change": "Mudar",
737
+ "tor_connection": "Conexão Tor"
738
}
res/values/strings_ru.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "Длина исходной фразы",
735
"unavailable_balance": "Недоступный баланс",
736
"unavailable_balance_description": "Недоступный баланс: в эту сумму входят средства, заблокированные в ожидающих транзакциях, и средства, которые вы активно заморозили в настройках управления монетами. Заблокированные балансы станут доступны после завершения соответствующих транзакций, а замороженные балансы останутся недоступными для транзакций, пока вы не решите их разморозить.",
737
- "unspent_change": "Изменять"
737
+ "unspent_change": "Изменять",
738
+ "tor_connection": "Тор соединение"
739
}
res/values/strings_th.arb
+2
-1
@@ -732,5 +732,6 @@
732
"seed_phrase_length": "ความยาววลีของเมล็ด",
733
"unavailable_balance": "ยอดคงเหลือไม่พร้อมใช้งาน",
734
"unavailable_balance_description": "ยอดคงเหลือที่ไม่พร้อมใช้งาน: ยอดรวมนี้รวมถึงเงินทุนที่ถูกล็อคในการทำธุรกรรมที่รอดำเนินการและที่คุณได้แช่แข็งไว้ในการตั้งค่าการควบคุมเหรียญของคุณ ยอดคงเหลือที่ถูกล็อคจะพร้อมใช้งานเมื่อธุรกรรมที่เกี่ยวข้องเสร็จสมบูรณ์ ในขณะที่ยอดคงเหลือที่แช่แข็งจะไม่สามารถเข้าถึงได้สำหรับธุรกรรมจนกว่าคุณจะตัดสินใจยกเลิกการแช่แข็ง",
735
- "unspent_change": "เปลี่ยน"
735
+ "unspent_change": "เปลี่ยน",
736
+ "tor_connection": "การเชื่อมต่อทอร์"
737
}
res/values/strings_tl.arb
+2
-1
@@ -729,5 +729,6 @@
729
"seed_phrase_length": "Haba ng parirala ng binhi",
730
"unavailable_balance": "Hindi available na balanse",
731
"unavailable_balance_description": "Hindi Available na Balanse: Kasama sa kabuuang ito ang mga pondong naka-lock sa mga nakabinbing transaksyon at ang mga aktibong na-freeze mo sa iyong mga setting ng kontrol ng coin. Magiging available ang mga naka-lock na balanse kapag nakumpleto na ang kani-kanilang mga transaksyon, habang ang mga nakapirming balanse ay nananatiling hindi naa-access para sa mga transaksyon hanggang sa magpasya kang i-unfreeze ang mga ito.",
732
- "unspent_change": "Baguhin"
732
+ "unspent_change": "Baguhin",
733
+ "tor_connection": "Koneksyon ng Tor"
734
}
res/values/strings_tr.arb
+2
-1
@@ -732,5 +732,6 @@
732
"seed_phrase_length": "Çekirdek cümle uzunluğu",
733
"unavailable_balance": "Kullanılamayan bakiye",
734
"unavailable_balance_description": "Kullanılamayan Bakiye: Bu toplam, bekleyen işlemlerde kilitlenen fonları ve jeton kontrol ayarlarınızda aktif olarak dondurduğunuz fonları içerir. Kilitli bakiyeler, ilgili işlemleri tamamlandıktan sonra kullanılabilir hale gelir; dondurulmuş bakiyeler ise siz onları dondurmaya karar verene kadar işlemler için erişilemez durumda kalır.",
735
- "unspent_change": "Değiştirmek"
735
+ "unspent_change": "Değiştirmek",
736
+ "tor_connection": "Tor bağlantısı"
737
}
res/values/strings_uk.arb
+2
-1
@@ -734,5 +734,6 @@
734
"seed_phrase_length": "Довжина початкової фрази",
735
"unavailable_balance": "Недоступний баланс",
736
"unavailable_balance_description": "Недоступний баланс: ця сума включає кошти, заблоковані в незавершених транзакціях, і ті, які ви активно заморозили в налаштуваннях контролю монет. Заблоковані баланси стануть доступними після завершення відповідних транзакцій, тоді як заморожені баланси залишаються недоступними для транзакцій, доки ви не вирішите їх розморозити.",
737
- "unspent_change": "Зміна"
737
+ "unspent_change": "Зміна",
738
+ "tor_connection": "Підключення Tor"
739
}
res/values/strings_ur.arb
+2
-1
@@ -726,5 +726,6 @@
726
"seed_phrase_length": " ﯽﺋﺎﺒﻤﻟ ﯽﮐ ﮯﻠﻤﺟ ﮯﮐ ﺞﯿﺑ",
727
"unavailable_balance": " ﺲﻨﻠﯿﺑ ﺏﺎﯿﺘﺳﺩ ﺮﯿﻏ",
728
"unavailable_balance_description": "۔ﮯﺗﺮﮐ ﮟﯿﮩﻧ ﮧﻠﺼﯿﻓ ﺎﮐ ﮯﻧﺮﮐ ﺪﻤﺠﻨﻣ ﻥﺍ ﮟﯿﮩﻧﺍ ﭖﺁ ﮧﮐ ﮏﺗ ﺐﺟ ﮟﯿﮨ ﮯﺘﮨﺭ ﯽﺋﺎﺳﺭ ﻞﺑﺎﻗﺎﻧ ﮏﺗ ﺖﻗﻭ ﺱﺍ ﮯﯿﻟ ﮯﮐ ﻦﯾﺩ ﻦﯿﻟ ﺲﻨﻠﯿﺑ ﺪﻤﺠﻨﻣ ﮧﮐ ﺐﺟ ،ﮯﮔ ﮟﯿﺋﺎﺟ ﻮﮨ ﺏﺎﯿﺘﺳﺩ ﺲﻨﻠﯿﺑ ﻞﻔﻘﻣ ﺪﻌﺑ ﮯﮐ ﮯﻧﻮﮨ ﻞﻤﮑﻣ ﻦﯾﺩ ﻦﯿﻟ ﮧﻘﻠﻌﺘﻣ ﮯﮐ ﻥﺍ ۔ﮯﮨ ﺎﮭﮐﺭ ﺮ",
729
- "unspent_change": "تبدیل کریں"
729
+ "unspent_change": "تبدیل کریں",
730
+ "tor_connection": " ﻦﺸﮑﻨﮐ ﺭﻮﭨ"
731
}
res/values/strings_yo.arb
+2
-1
@@ -728,5 +728,6 @@
728
"seed_phrase_length": "Gigun gbolohun irugbin",
729
"unavailable_balance": "Iwontunwonsi ti ko si",
730
"unavailable_balance_description": "Iwontunws.funfun ti ko si: Lapapọ yii pẹlu awọn owo ti o wa ni titiipa ni awọn iṣowo isunmọ ati awọn ti o ti didi ni itara ninu awọn eto iṣakoso owo rẹ. Awọn iwọntunwọnsi titiipa yoo wa ni kete ti awọn iṣowo oniwun wọn ba ti pari, lakoko ti awọn iwọntunwọnsi tio tutunini ko ni iraye si fun awọn iṣowo titi iwọ o fi pinnu lati mu wọn kuro.",
731
- "unspent_change": "Yipada"
731
+ "unspent_change": "Yipada",
732
+ "tor_connection": "Tor asopọ"
733
}
res/values/strings_zh.arb
+2
-1
@@ -733,5 +733,6 @@
733
"seed_phrase_length": "种子短语长度",
734
"unavailable_balance": "不可用余额",
735
"unavailable_balance_description": "不可用余额:此总额包括锁定在待处理交易中的资金以及您在硬币控制设置中主动冻结的资金。一旦各自的交易完成,锁定的余额将变得可用,而冻结的余额在您决定解冻之前仍然无法进行交易。",
736
- "unspent_change": "改变"
736
+ "unspent_change": "改变",
737
+ "tor_connection": "Tor连接"
738
}