CW-875 BackupServiceV3 (#2064)

* implement v3 backup system - Add new BackupServiceV3 with chunked backup support and checksums - Implement json-based metadata in backup system - Instead of binary file export a .zip file that user can open and see that it is a cake backup (should also prevent 3rd party software from corrupting binary data inside of the file, in case it doesn't checksum will fail, and user will know for sure that backup got corrupted) - Update flutter to 3.27.4 to use archive ^4.x.x (it offers in memory archive operations) * fix wallets not getting restored properly * prevent out of memory errors on files that are way too big during restore * Update lib/view_model/backup_view_model.dart [skip ci] * Update lib/core/backup_service.dart [skip ci] * Update lib/core/backup_service.dart --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

cyan committed Mar 22, 2025 at 02:16 UTC 102ab8dbe6e2d38dbdfab29ff3f924f1356dcb76
36 files changed +1193 -807
.github/workflows/automated_integration_test.yml
+1 -1
@@ -55,7 +55,7 @@ jobs:
55 - name: Flutter action
56 uses: subosito/flutter-action@v1
57 with:
58 - flutter-version: "3.24.0"
58 + flutter-version: "3.27.4"
59 channel: stable
60
61 - name: Install package dependencies
.github/workflows/pr_test_build_android.yml
+1 -1
@@ -9,7 +9,7 @@ jobs:
9 PR_test_build:
10 runs-on: linux-amd64
11 container:
12 - image: ghcr.io/cake-tech/cake_wallet:3.24.4-linux
12 + image: ghcr.io/cake-tech/cake_wallet:3.27.4-linux
13 env:
14 STORE_PASS: test@cake_wallet
15 KEY_PASS: test@cake_wallet
.github/workflows/pr_test_build_linux.yml
+1 -1
@@ -9,7 +9,7 @@ jobs:
9 PR_test_build:
10 runs-on: linux-amd64
11 container:
12 - image: ghcr.io/cake-tech/cake_wallet:3.24.4-linux
12 + image: ghcr.io/cake-tech/cake_wallet:3.27.4-linux
13 env:
14 STORE_PASS: test@cake_wallet
15 KEY_PASS: test@cake_wallet
Dockerfile
+3 -4
@@ -1,6 +1,5 @@
1 -# Usage:
2 -# docker build . -f Dockerfile -t ghcr.io/cake-tech/cake_wallet:3.24.4-linux
3 -# docker push ghcr.io/cake-tech/cake_wallet:3.24.4-linux
1 +# docker build . -f Dockerfile -t ghcr.io/cake-tech/cake_wallet:3.27.4-linux
2 +# docker push ghcr.io/cake-tech/cake_wallet:3.27.4-linux
3
4 # Heavily inspired by cirrusci images
5 # https://github.com/cirruslabs/docker-images-android/blob/master/sdk/tools/Dockerfile
@@ -17,7 +16,7 @@ LABEL org.opencontainers.image.source=https://github.com/cake-tech/cake_wallet
16 ENV GOLANG_VERSION=1.23.4
17
18 # Pin Flutter version to latest known-working version
20 -ENV FLUTTER_VERSION=3.24.4
19 +ENV FLUTTER_VERSION=3.27.4
20
21 # Pin Android Studio, platform, and build tools versions to latest known-working version
22 # Comes from https://developer.android.com/studio/#command-tools
android/app/build.gradle
+7 -9
@@ -1,3 +1,9 @@
1 +plugins {
2 + id "com.android.application"
3 + id "kotlin-android"
4 + id "dev.flutter.flutter-gradle-plugin"
5 +}
6 +
7 def localProperties = new Properties()
8 def localPropertiesFile = rootProject.file('local.properties')
9 if (localPropertiesFile.exists()) {
@@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) {
12 }
13 }
14
9 -def flutterRoot = localProperties.getProperty('flutter.sdk')
10 -if (flutterRoot == null) {
11 - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 -}
13 -
15 def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
16 if (flutterVersionCode == null) {
17 flutterVersionCode = '1'
@@ -21,9 +22,6 @@ if (flutterVersionName == null) {
22 flutterVersionName = '1.0'
23 }
24
24 -apply plugin: 'com.android.application'
25 -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
26 -
25 def keystoreProperties = new Properties()
26 def keystorePropertiesFile = rootProject.file('key.properties')
27 if (keystorePropertiesFile.exists()) {
@@ -38,7 +36,7 @@ if (appPropertiesFile.exists()) {
36
37 android {
38 compileSdkVersion 35
41 - buildToolsVersion "34.0.0"
39 + buildToolsVersion "35.0.0"
40
41 lintOptions {
42 disable 'InvalidPackage'
android/build.gradle
-14
@@ -1,17 +1,3 @@
1 -buildscript {
2 - ext.kotlin_version = '2.0.21'
3 - repositories {
4 - google()
5 - mavenCentral()
6 - }
7 -
8 - dependencies {
9 - classpath 'com.android.tools.build:gradle:8.7.1'
10 - classpath 'com.google.gms:google-services:4.3.8'
11 - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
12 - }
13 -}
14 -
1 allprojects {
2 repositories {
3 google()
android/settings.gradle
+21 -10
@@ -1,15 +1,26 @@
1 -include ':app'
1 +pluginManagement {
2 + def flutterSdkPath = {
3 + def properties = new Properties()
4 + file("local.properties").withInputStream { properties.load(it) }
5 + def flutterSdkPath = properties.getProperty("flutter.sdk")
6 + assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
7 + return flutterSdkPath
8 + }()
9
3 -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
10 + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
11
5 -def plugins = new Properties()
6 -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 -if (pluginsFile.exists()) {
8 - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
12 + repositories {
13 + google()
14 + mavenCentral()
15 + gradlePluginPortal()
16 + }
17 }
18
11 -plugins.each { name, path ->
12 - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 - include ":$name"
14 - project(":$name").projectDir = pluginDirectory
19 +plugins {
20 + id "dev.flutter.flutter-plugin-loader" version "1.0.0"
21 + id "com.android.application" version "8.7.1" apply false
22 + id "org.jetbrains.kotlin.android" version "2.0.21" apply false
23 + id "com.google.gms.google-services" version "4.3.8" apply false
24 }
25 +
26 +include ":app"
\ No newline at end of file
cw_bitcoin/pubspec.lock
+99 -107
@@ -17,14 +17,6 @@ packages:
17 url: "https://pub.dev"
18 source: hosted
19 version: "4.7.0"
20 - archive:
21 - dependency: transitive
22 - description:
23 - name: archive
24 - sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
25 - url: "https://pub.dev"
26 - source: hosted
27 - version: "3.6.1"
20 args:
21 dependency: transitive
22 description:
@@ -37,10 +29,10 @@ packages:
29 dependency: transitive
30 description:
31 name: asn1lib
40 - sha256: "6b151826fcc95ff246cd219a0bf4c753ea14f4081ad71c61939becf3aba27f70"
32 + sha256: "1c296cd268f486cabcc3930e9b93a8133169305f18d722916e675959a88f6d2c"
33 url: "https://pub.dev"
34 source: hosted
43 - version: "1.5.5"
35 + version: "1.5.9"
36 async:
37 dependency: transitive
38 description:
@@ -105,10 +97,10 @@ packages:
97 dependency: transitive
98 description:
99 name: bluez
108 - sha256: "203a1924e818a9dd74af2b2c7a8f375ab8e5edf0e486bba8f90a0d8a17ed9fce"
100 + sha256: "61a7204381925896a374301498f2f5399e59827c6498ae1e924aaa598751b545"
101 url: "https://pub.dev"
102 source: hosted
111 - version: "0.8.2"
103 + version: "0.8.3"
104 boolean_selector:
105 dependency: transitive
106 description:
@@ -137,18 +129,18 @@ packages:
129 dependency: transitive
130 description:
131 name: build_config
140 - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
132 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
133 url: "https://pub.dev"
134 source: hosted
143 - version: "1.1.1"
135 + version: "1.1.2"
136 build_daemon:
137 dependency: transitive
138 description:
139 name: build_daemon
148 - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
140 + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
141 url: "https://pub.dev"
142 source: hosted
151 - version: "4.0.2"
143 + version: "4.0.4"
144 build_resolvers:
145 dependency: "direct dev"
146 description:
@@ -185,10 +177,10 @@ packages:
177 dependency: transitive
178 description:
179 name: built_value
188 - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
180 + sha256: "8b158ab94ec6913e480dc3f752418348b5ae099eb75868b5f4775f0572999c61"
181 url: "https://pub.dev"
182 source: hosted
191 - version: "8.9.2"
183 + version: "8.9.4"
184 cake_backup:
185 dependency: transitive
186 description:
@@ -218,10 +210,10 @@ packages:
210 dependency: transitive
211 description:
212 name: cli_util
221 - sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19
213 + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
214 url: "https://pub.dev"
215 source: hosted
224 - version: "0.4.1"
216 + version: "0.4.2"
217 clock:
218 dependency: transitive
219 description:
@@ -234,18 +226,18 @@ packages:
226 dependency: transitive
227 description:
228 name: code_builder
237 - sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
229 + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
230 url: "https://pub.dev"
231 source: hosted
240 - version: "4.10.0"
232 + version: "4.10.1"
233 collection:
234 dependency: transitive
235 description:
236 name: collection
245 - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
237 + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
238 url: "https://pub.dev"
239 source: hosted
248 - version: "1.18.0"
240 + version: "1.19.0"
241 convert:
242 dependency: transitive
243 description:
@@ -312,10 +304,10 @@ packages:
304 dependency: transitive
305 description:
306 name: dbus
315 - sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac"
307 + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
308 url: "https://pub.dev"
309 source: hosted
318 - version: "0.7.10"
310 + version: "0.7.11"
311 decimal:
312 dependency: transitive
313 description:
@@ -381,10 +373,10 @@ packages:
373 dependency: "direct main"
374 description:
375 name: flutter_mobx
384 - sha256: "859fbf452fa9c2519d2700b125dd7fb14c508bbdd7fb65e26ca8ff6c92280e2e"
376 + sha256: ba5e93467866a2991259dc51cffd41ef45f695c667c2b8e7b087bf24118b50fe
377 url: "https://pub.dev"
378 source: hosted
387 - version: "2.2.1+1"
379 + version: "2.3.0"
380 flutter_test:
381 dependency: "direct dev"
382 description: flutter
@@ -394,10 +386,10 @@ packages:
386 dependency: transitive
387 description:
388 name: flutter_web_bluetooth
397 - sha256: fcd03e2e5f82edcedcbc940f1b6a0635a50757374183254f447640886c53208e
389 + sha256: "1363831def5eed1e1064d1eca04e8ccb35446e8f758579c3c519e156b77926da"
390 url: "https://pub.dev"
391 source: hosted
400 - version: "0.2.4"
392 + version: "1.0.0"
393 flutter_web_plugins:
394 dependency: transitive
395 description: flutter
@@ -415,18 +407,18 @@ packages:
407 dependency: transitive
408 description:
409 name: glob
418 - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
410 + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
411 url: "https://pub.dev"
412 source: hosted
421 - version: "2.1.2"
413 + version: "2.1.3"
414 google_identity_services_web:
415 dependency: transitive
416 description:
417 name: google_identity_services_web
426 - sha256: "5be191523702ba8d7a01ca97c17fca096822ccf246b0a9f11923a6ded06199b6"
418 + sha256: "55580f436822d64c8ff9a77e37d61f5fb1e6c7ec9d632a43ee324e2a05c3c6c9"
419 url: "https://pub.dev"
420 source: hosted
429 - version: "0.3.1+4"
421 + version: "0.3.3"
422 googleapis_auth:
423 dependency: transitive
424 description:
@@ -447,10 +439,10 @@ packages:
439 dependency: "direct main"
440 description:
441 name: grpc
450 - sha256: e93ee3bce45c134bf44e9728119102358c7cd69de7832d9a874e2e74eb8cab40
442 + sha256: "5b99b7a420937d4361ece68b798c9af8e04b5bc128a7859f2a4be87427694813"
443 url: "https://pub.dev"
444 source: hosted
453 - version: "3.2.4"
445 + version: "4.0.1"
446 hex:
447 dependency: transitive
448 description:
@@ -479,34 +471,34 @@ packages:
471 dependency: "direct main"
472 description:
473 name: http
482 - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
474 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
475 url: "https://pub.dev"
476 source: hosted
485 - version: "1.2.2"
477 + version: "1.3.0"
478 http2:
479 dependency: transitive
480 description:
481 name: http2
490 - sha256: "9ced024a160b77aba8fb8674e38f70875e321d319e6f303ec18e87bd5a4b0c1d"
482 + sha256: "382d3aefc5bd6dc68c6b892d7664f29b5beb3251611ae946a98d35158a82bbfa"
483 url: "https://pub.dev"
484 source: hosted
493 - version: "2.3.0"
485 + version: "2.3.1"
486 http_multi_server:
487 dependency: transitive
488 description:
489 name: http_multi_server
498 - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
490 + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
491 url: "https://pub.dev"
492 source: hosted
501 - version: "3.2.1"
493 + version: "3.2.2"
494 http_parser:
495 dependency: transitive
496 description:
497 name: http_parser
506 - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
498 + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
499 url: "https://pub.dev"
500 source: hosted
509 - version: "4.0.2"
501 + version: "4.1.2"
502 intl:
503 dependency: "direct main"
504 description:
@@ -519,10 +511,10 @@ packages:
511 dependency: transitive
512 description:
513 name: io
522 - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
514 + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
515 url: "https://pub.dev"
516 source: hosted
525 - version: "1.0.4"
517 + version: "1.0.5"
518 js:
519 dependency: transitive
520 description:
@@ -543,18 +535,18 @@ packages:
535 dependency: transitive
536 description:
537 name: leak_tracker
546 - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
538 + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
539 url: "https://pub.dev"
540 source: hosted
549 - version: "10.0.5"
541 + version: "10.0.7"
542 leak_tracker_flutter_testing:
543 dependency: transitive
544 description:
545 name: leak_tracker_flutter_testing
554 - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
546 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
547 url: "https://pub.dev"
548 source: hosted
557 - version: "3.0.5"
549 + version: "3.0.8"
550 leak_tracker_testing:
551 dependency: transitive
552 description:
@@ -568,7 +560,7 @@ packages:
560 description:
561 path: "packages/ledger-bitcoin"
562 ref: HEAD
571 - resolved-ref: "07cd61ef76a2a017b6d5ef233396740163265457"
563 + resolved-ref: e93254f3ff3f996fb91f65a1e7ceffb9f510b4c8
564 url: "https://github.com/cake-tech/ledger-flutter-plus-plugins"
565 source: git
566 version: "0.0.3"
@@ -576,16 +568,16 @@ packages:
568 dependency: "direct main"
569 description:
570 name: ledger_flutter_plus
579 - sha256: c7b04008553193dbca7e17b430768eecc372a72b0ff3625b5e7fc5e5c8d3231b
571 + sha256: "1c03f3c4a9754b5f0170a9eb9552ec54fa86e985f8ee71a255ee2c5629b53d31"
572 url: "https://pub.dev"
573 source: hosted
582 - version: "1.4.1"
574 + version: "1.5.1"
575 ledger_litecoin:
576 dependency: "direct main"
577 description:
578 path: "packages/ledger-litecoin"
579 ref: HEAD
588 - resolved-ref: "3dee36713e6ebec9dceb59b9ccae7f243a53ea9e"
580 + resolved-ref: e93254f3ff3f996fb91f65a1e7ceffb9f510b4c8
581 url: "https://github.com/cake-tech/ledger-flutter-plus-plugins"
582 source: git
583 version: "0.0.2"
@@ -641,10 +633,10 @@ packages:
633 dependency: "direct main"
634 description:
635 name: mobx
644 - sha256: "63920b27b32ad1910adfe767ab1750e4c212e8923232a1f891597b362074ea5e"
636 + sha256: bf1a90e5bcfd2851fc6984e20eef69557c65d9e4d0a88f5be4cf72c9819ce6b0
637 url: "https://pub.dev"
638 source: hosted
647 - version: "2.3.3+2"
639 + version: "2.5.0"
640 mobx_codegen:
641 dependency: "direct dev"
642 description:
@@ -674,10 +666,10 @@ packages:
666 dependency: transitive
667 description:
668 name: package_config
677 - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
669 + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67"
670 url: "https://pub.dev"
671 source: hosted
680 - version: "2.1.0"
672 + version: "2.1.1"
673 path:
674 dependency: transitive
675 description:
@@ -690,26 +682,26 @@ packages:
682 dependency: "direct main"
683 description:
684 name: path_provider
693 - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
685 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
686 url: "https://pub.dev"
687 source: hosted
696 - version: "2.1.4"
688 + version: "2.1.5"
689 path_provider_android:
690 dependency: transitive
691 description:
692 name: path_provider_android
701 - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a
693 + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
694 url: "https://pub.dev"
695 source: hosted
704 - version: "2.2.12"
696 + version: "2.2.15"
697 path_provider_foundation:
698 dependency: transitive
699 description:
700 name: path_provider_foundation
709 - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
701 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
702 url: "https://pub.dev"
703 source: hosted
712 - version: "2.4.0"
704 + version: "2.4.1"
705 path_provider_linux:
706 dependency: transitive
707 description:
@@ -794,18 +786,18 @@ packages:
786 dependency: transitive
787 description:
788 name: pub_semver
797 - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
789 + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd"
790 url: "https://pub.dev"
791 source: hosted
800 - version: "2.1.4"
792 + version: "2.1.5"
793 pubspec_parse:
794 dependency: transitive
795 description:
796 name: pubspec_parse
805 - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
797 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
798 url: "https://pub.dev"
799 source: hosted
808 - version: "1.3.0"
800 + version: "1.5.0"
801 quiver:
802 dependency: transitive
803 description:
@@ -834,26 +826,26 @@ packages:
826 dependency: "direct main"
827 description:
828 name: shared_preferences
837 - sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
829 + sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a"
830 url: "https://pub.dev"
831 source: hosted
840 - version: "2.3.2"
832 + version: "2.5.2"
833 shared_preferences_android:
834 dependency: transitive
835 description:
836 name: shared_preferences_android
845 - sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab"
837 + sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22
838 url: "https://pub.dev"
839 source: hosted
848 - version: "2.3.3"
840 + version: "2.4.6"
841 shared_preferences_foundation:
842 dependency: transitive
843 description:
844 name: shared_preferences_foundation
853 - sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
845 + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
846 url: "https://pub.dev"
847 source: hosted
856 - version: "2.5.3"
848 + version: "2.5.4"
849 shared_preferences_linux:
850 dependency: transitive
851 description:
@@ -874,10 +866,10 @@ packages:
866 dependency: transitive
867 description:
868 name: shared_preferences_web
877 - sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
869 + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
870 url: "https://pub.dev"
871 source: hosted
880 - version: "2.4.2"
872 + version: "2.4.3"
873 shared_preferences_windows:
874 dependency: transitive
875 description:
@@ -890,23 +882,23 @@ packages:
882 dependency: transitive
883 description:
884 name: shelf
893 - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
885 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
886 url: "https://pub.dev"
887 source: hosted
896 - version: "1.4.1"
888 + version: "1.4.2"
889 shelf_web_socket:
890 dependency: transitive
891 description:
892 name: shelf_web_socket
901 - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611"
893 + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67
894 url: "https://pub.dev"
895 source: hosted
904 - version: "2.0.0"
896 + version: "2.0.1"
897 sky_engine:
898 dependency: transitive
899 description: flutter
900 source: sdk
909 - version: "0.0.99"
901 + version: "0.0.0"
902 socks5_proxy:
903 dependency: transitive
904 description:
@@ -944,7 +936,7 @@ packages:
936 description:
937 path: "."
938 ref: "sp_v4.0.0"
947 - resolved-ref: ca1add293bd1e06920aa049b655832da50d0dab2
939 + resolved-ref: "2554cb8bd3ee1d026bc63e76a30d1226960c7cb4"
940 url: "https://github.com/cake-tech/sp_scanner"
941 source: git
942 version: "0.0.1"
@@ -952,10 +944,10 @@ packages:
944 dependency: transitive
945 description:
946 name: stack_trace
955 - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
947 + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
948 url: "https://pub.dev"
949 source: hosted
958 - version: "1.11.1"
950 + version: "1.12.0"
951 stream_channel:
952 dependency: transitive
953 description:
@@ -968,18 +960,18 @@ packages:
960 dependency: transitive
961 description:
962 name: stream_transform
971 - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
963 + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
964 url: "https://pub.dev"
965 source: hosted
974 - version: "2.1.0"
966 + version: "2.1.1"
967 string_scanner:
968 dependency: transitive
969 description:
970 name: string_scanner
979 - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
971 + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
972 url: "https://pub.dev"
973 source: hosted
982 - version: "1.2.0"
974 + version: "1.3.0"
975 term_glyph:
976 dependency: transitive
977 description:
@@ -992,18 +984,18 @@ packages:
984 dependency: transitive
985 description:
986 name: test_api
995 - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
987 + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
988 url: "https://pub.dev"
989 source: hosted
998 - version: "0.7.2"
990 + version: "0.7.3"
991 timing:
992 dependency: transitive
993 description:
994 name: timing
1003 - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
995 + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
996 url: "https://pub.dev"
997 source: hosted
1006 - version: "1.0.1"
998 + version: "1.0.2"
999 tuple:
1000 dependency: transitive
1001 description:
@@ -1024,10 +1016,10 @@ packages:
1016 dependency: transitive
1017 description:
1018 name: universal_ble
1027 - sha256: "0dfbd6b64bff3ad61ed7a895c232530d9614e9b01ab261a74433a43267edb7f3"
1019 + sha256: "1fad089150a29db82b3b7d60327e18c5ad6b3a5bb509defc1c690b0a76b9c098"
1020 url: "https://pub.dev"
1021 source: hosted
1030 - version: "0.12.0"
1022 + version: "0.15.0"
1023 universal_platform:
1024 dependency: transitive
1025 description:
@@ -1056,26 +1048,26 @@ packages:
1048 dependency: transitive
1049 description:
1050 name: vm_service
1059 - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
1051 + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
1052 url: "https://pub.dev"
1053 source: hosted
1062 - version: "14.2.4"
1054 + version: "14.3.0"
1055 watcher:
1056 dependency: "direct overridden"
1057 description:
1058 name: watcher
1067 - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
1059 + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
1060 url: "https://pub.dev"
1061 source: hosted
1070 - version: "1.1.0"
1062 + version: "1.1.1"
1063 web:
1064 dependency: transitive
1065 description:
1066 name: web
1075 - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
1067 + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
1068 url: "https://pub.dev"
1069 source: hosted
1078 - version: "1.1.0"
1070 + version: "1.1.1"
1071 web_socket:
1072 dependency: transitive
1073 description:
@@ -1088,10 +1080,10 @@ packages:
1080 dependency: transitive
1081 description:
1082 name: web_socket_channel
1091 - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
1083 + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
1084 url: "https://pub.dev"
1085 source: hosted
1094 - version: "3.0.1"
1086 + version: "3.0.2"
1087 xdg_directories:
1088 dependency: transitive
1089 description:
@@ -1112,18 +1104,18 @@ packages:
1104 dependency: transitive
1105 description:
1106 name: yaml
1115 - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
1107 + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
1108 url: "https://pub.dev"
1109 source: hosted
1118 - version: "3.1.2"
1110 + version: "3.1.3"
1111 yaml_edit:
1112 dependency: transitive
1113 description:
1114 name: yaml_edit
1123 - sha256: e9c1a3543d2da0db3e90270dbb1e4eebc985ee5e3ffe468d83224472b2194a5f
1115 + sha256: fb38626579fb345ad00e674e2af3a5c9b0cc4b9bfb8fd7f7ff322c7c9e62aef5
1116 url: "https://pub.dev"
1117 source: hosted
1126 - version: "2.2.1"
1118 + version: "2.2.2"
1119 sdks:
1128 - dart: ">=3.5.0 <4.0.0"
1120 + dart: ">=3.6.0 <4.0.0"
1121 flutter: ">=3.24.0"
cw_bitcoin/pubspec.yaml
+1 -1
@@ -32,7 +32,7 @@ dependencies:
32 ref: cake-update-v2
33 cw_mweb:
34 path: ../cw_mweb
35 - grpc: ^3.2.4
35 + grpc: ^4.0.1
36 sp_scanner:
37 git:
38 url: https://github.com/cake-tech/sp_scanner
cw_core/lib/utils/print_verbose.dart
+6 -4
@@ -1,3 +1,5 @@
1 +import 'dart:math';
2 +
3 void printV(dynamic content) {
4 CustomTrace programInfo = CustomTrace(StackTrace.current);
5 print("${programInfo.fileName}#${programInfo.lineNumber}:${programInfo.columnNumber} ${programInfo.callerFunctionName}: $content");
@@ -29,7 +31,7 @@ class CustomTrace {
31 var indexOfWhiteSpace = currentTrace.indexOf(' ');
32
33 /* Create a substring from the first whitespace index till the end of the string */
32 - var subStr = currentTrace.substring(indexOfWhiteSpace);
34 + var subStr = currentTrace.substring(max(0, indexOfWhiteSpace));
35
36 /* Grab the function name using reg expr */
37 var indexOfFunction = subStr.indexOf(RegExp(r'[A-Za-z0-9_]'));
@@ -40,7 +42,7 @@ class CustomTrace {
42 indexOfWhiteSpace = subStr.indexOf(RegExp(r'[ .]'));
43
44 /* Create a new substring from start to the first index of a whitespace. This substring gives us the function name */
43 - subStr = subStr.substring(0, indexOfWhiteSpace);
45 + subStr = subStr.substring(0, max(0, indexOfWhiteSpace));
46
47 return subStr;
48 }
@@ -61,7 +63,7 @@ class CustomTrace {
63 /* Search through the string and find the index of the file name by looking for the '.dart' regex */
64 var indexOfFileName = traceString.indexOf(RegExp(r'[/A-Za-z_]+.dart'), 1); // 1 to offest and not print the printV function name
65
64 - var fileInfo = traceString.substring(indexOfFileName);
66 + var fileInfo = traceString.substring(max(0, indexOfFileName));
67
68 var listOfInfos = fileInfo.split(":");
69
@@ -78,7 +80,7 @@ class CustomTrace {
80 columnStr = columnStr.replaceFirst(")", "");
81 this.columnNumber = int.tryParse(columnStr);
82 } catch (e) {
81 -
83 + print("Unable to parse trace (printV): $e");
84 }
85 }
86 }
cw_core/pubspec.lock
+89 -89
@@ -5,23 +5,23 @@ packages:
5 dependency: transitive
6 description:
7 name: _fe_analyzer_shared
8 - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
8 + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
9 url: "https://pub.dev"
10 source: hosted
11 - version: "72.0.0"
11 + version: "76.0.0"
12 _macros:
13 dependency: transitive
14 description: dart
15 source: sdk
16 - version: "0.3.2"
16 + version: "0.3.3"
17 analyzer:
18 dependency: transitive
19 description:
20 name: analyzer
21 - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
21 + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
22 url: "https://pub.dev"
23 source: hosted
24 - version: "6.7.0"
24 + version: "6.11.0"
25 args:
26 dependency: transitive
27 description:
@@ -34,10 +34,10 @@ packages:
34 dependency: transitive
35 description:
36 name: asn1lib
37 - sha256: "6b151826fcc95ff246cd219a0bf4c753ea14f4081ad71c61939becf3aba27f70"
37 + sha256: "1c296cd268f486cabcc3930e9b93a8133169305f18d722916e675959a88f6d2c"
38 url: "https://pub.dev"
39 source: hosted
40 - version: "1.5.5"
40 + version: "1.5.9"
41 async:
42 dependency: transitive
43 description:
@@ -67,50 +67,50 @@ packages:
67 dependency: transitive
68 description:
69 name: build
70 - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
70 + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
71 url: "https://pub.dev"
72 source: hosted
73 - version: "2.4.1"
73 + version: "2.4.2"
74 build_config:
75 dependency: transitive
76 description:
77 name: build_config
78 - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
78 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
79 url: "https://pub.dev"
80 source: hosted
81 - version: "1.1.1"
81 + version: "1.1.2"
82 build_daemon:
83 dependency: transitive
84 description:
85 name: build_daemon
86 - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
86 + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
87 url: "https://pub.dev"
88 source: hosted
89 - version: "4.0.2"
89 + version: "4.0.4"
90 build_resolvers:
91 dependency: "direct dev"
92 description:
93 name: build_resolvers
94 - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
94 + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0
95 url: "https://pub.dev"
96 source: hosted
97 - version: "2.4.2"
97 + version: "2.4.4"
98 build_runner:
99 dependency: "direct dev"
100 description:
101 name: build_runner
102 - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
102 + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99"
103 url: "https://pub.dev"
104 source: hosted
105 - version: "2.4.13"
105 + version: "2.4.15"
106 build_runner_core:
107 dependency: transitive
108 description:
109 name: build_runner_core
110 - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
110 + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
111 url: "https://pub.dev"
112 source: hosted
113 - version: "7.3.2"
113 + version: "8.0.0"
114 built_collection:
115 dependency: transitive
116 description:
@@ -123,10 +123,10 @@ packages:
123 dependency: transitive
124 description:
125 name: built_value
126 - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
126 + sha256: "8b158ab94ec6913e480dc3f752418348b5ae099eb75868b5f4775f0572999c61"
127 url: "https://pub.dev"
128 source: hosted
129 - version: "8.9.2"
129 + version: "8.9.4"
130 cake_backup:
131 dependency: "direct main"
132 description:
@@ -164,18 +164,18 @@ packages:
164 dependency: transitive
165 description:
166 name: code_builder
167 - sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
167 + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
168 url: "https://pub.dev"
169 source: hosted
170 - version: "4.10.0"
170 + version: "4.10.1"
171 collection:
172 dependency: transitive
173 description:
174 name: collection
175 - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
175 + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
176 url: "https://pub.dev"
177 source: hosted
178 - version: "1.18.0"
178 + version: "1.19.0"
179 convert:
180 dependency: transitive
181 description:
@@ -212,10 +212,10 @@ packages:
212 dependency: transitive
213 description:
214 name: dart_style
215 - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
215 + sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820"
216 url: "https://pub.dev"
217 source: hosted
218 - version: "2.3.7"
218 + version: "2.3.8"
219 decimal:
220 dependency: "direct main"
221 description:
@@ -273,10 +273,10 @@ packages:
273 dependency: "direct main"
274 description:
275 name: flutter_mobx
276 - sha256: "859fbf452fa9c2519d2700b125dd7fb14c508bbdd7fb65e26ca8ff6c92280e2e"
276 + sha256: ba5e93467866a2991259dc51cffd41ef45f695c667c2b8e7b087bf24118b50fe
277 url: "https://pub.dev"
278 source: hosted
279 - version: "2.2.1+1"
279 + version: "2.3.0"
280 flutter_test:
281 dependency: "direct dev"
282 description: flutter
@@ -294,10 +294,10 @@ packages:
294 dependency: transitive
295 description:
296 name: glob
297 - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
297 + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
298 url: "https://pub.dev"
299 source: hosted
300 - version: "2.1.2"
300 + version: "2.1.3"
301 graphs:
302 dependency: transitive
303 description:
@@ -326,26 +326,26 @@ packages:
326 dependency: "direct main"
327 description:
328 name: http
329 - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
329 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
330 url: "https://pub.dev"
331 source: hosted
332 - version: "1.2.2"
332 + version: "1.3.0"
333 http_multi_server:
334 dependency: transitive
335 description:
336 name: http_multi_server
337 - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
337 + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
338 url: "https://pub.dev"
339 source: hosted
340 - version: "3.2.1"
340 + version: "3.2.2"
341 http_parser:
342 dependency: transitive
343 description:
344 name: http_parser
345 - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
345 + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
346 url: "https://pub.dev"
347 source: hosted
348 - version: "4.0.2"
348 + version: "4.1.2"
349 intl:
350 dependency: "direct main"
351 description:
@@ -358,10 +358,10 @@ packages:
358 dependency: transitive
359 description:
360 name: io
361 - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
361 + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
362 url: "https://pub.dev"
363 source: hosted
364 - version: "1.0.4"
364 + version: "1.0.5"
365 js:
366 dependency: transitive
367 description:
@@ -382,18 +382,18 @@ packages:
382 dependency: transitive
383 description:
384 name: leak_tracker
385 - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
385 + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
386 url: "https://pub.dev"
387 source: hosted
388 - version: "10.0.5"
388 + version: "10.0.7"
389 leak_tracker_flutter_testing:
390 dependency: transitive
391 description:
392 name: leak_tracker_flutter_testing
393 - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
393 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
394 url: "https://pub.dev"
395 source: hosted
396 - version: "3.0.5"
396 + version: "3.0.8"
397 leak_tracker_testing:
398 dependency: transitive
399 description:
@@ -414,10 +414,10 @@ packages:
414 dependency: transitive
415 description:
416 name: macros
417 - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
417 + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
418 url: "https://pub.dev"
419 source: hosted
420 - version: "0.1.2-main.4"
420 + version: "0.1.3-main.0"
421 matcher:
422 dependency: transitive
423 description:
@@ -454,18 +454,18 @@ packages:
454 dependency: "direct main"
455 description:
456 name: mobx
457 - sha256: "63920b27b32ad1910adfe767ab1750e4c212e8923232a1f891597b362074ea5e"
457 + sha256: bf1a90e5bcfd2851fc6984e20eef69557c65d9e4d0a88f5be4cf72c9819ce6b0
458 url: "https://pub.dev"
459 source: hosted
460 - version: "2.3.3+2"
460 + version: "2.5.0"
461 mobx_codegen:
462 dependency: "direct dev"
463 description:
464 name: mobx_codegen
465 - sha256: "8e0d8653a0c720ad933cd8358f6f89f740ce89203657c13f25bea772ef1fff7c"
465 + sha256: "990da80722f7d7c0017dec92040b31545d625b15d40204c36a1e63d167c73cdc"
466 url: "https://pub.dev"
467 source: hosted
468 - version: "2.6.1"
468 + version: "2.7.0"
469 nested:
470 dependency: transitive
471 description:
@@ -487,10 +487,10 @@ packages:
487 dependency: transitive
488 description:
489 name: package_config
490 - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
490 + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67"
491 url: "https://pub.dev"
492 source: hosted
493 - version: "2.1.0"
493 + version: "2.1.1"
494 path:
495 dependency: transitive
496 description:
@@ -503,26 +503,26 @@ packages:
503 dependency: "direct main"
504 description:
505 name: path_provider
506 - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
506 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
507 url: "https://pub.dev"
508 source: hosted
509 - version: "2.1.4"
509 + version: "2.1.5"
510 path_provider_android:
511 dependency: transitive
512 description:
513 name: path_provider_android
514 - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a
514 + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
515 url: "https://pub.dev"
516 source: hosted
517 - version: "2.2.12"
517 + version: "2.2.15"
518 path_provider_foundation:
519 dependency: transitive
520 description:
521 name: path_provider_foundation
522 - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
522 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
523 url: "https://pub.dev"
524 source: hosted
525 - version: "2.4.0"
525 + version: "2.4.1"
526 path_provider_linux:
527 dependency: transitive
528 description:
@@ -591,18 +591,18 @@ packages:
591 dependency: transitive
592 description:
593 name: pub_semver
594 - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
594 + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd"
595 url: "https://pub.dev"
596 source: hosted
597 - version: "2.1.4"
597 + version: "2.1.5"
598 pubspec_parse:
599 dependency: transitive
600 description:
601 name: pubspec_parse
602 - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
602 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
603 url: "https://pub.dev"
604 source: hosted
605 - version: "1.3.0"
605 + version: "1.5.0"
606 rational:
607 dependency: transitive
608 description:
@@ -615,23 +615,23 @@ packages:
615 dependency: transitive
616 description:
617 name: shelf
618 - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
618 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
619 url: "https://pub.dev"
620 source: hosted
621 - version: "1.4.1"
621 + version: "1.4.2"
622 shelf_web_socket:
623 dependency: transitive
624 description:
625 name: shelf_web_socket
626 - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611"
626 + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
627 url: "https://pub.dev"
628 source: hosted
629 - version: "2.0.0"
629 + version: "3.0.0"
630 sky_engine:
631 dependency: transitive
632 description: flutter
633 source: sdk
634 - version: "0.0.99"
634 + version: "0.0.0"
635 socks5_proxy:
636 dependency: "direct main"
637 description:
@@ -652,10 +652,10 @@ packages:
652 dependency: transitive
653 description:
654 name: source_helper
655 - sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd"
655 + sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c"
656 url: "https://pub.dev"
657 source: hosted
658 - version: "1.3.4"
658 + version: "1.3.5"
659 source_span:
660 dependency: transitive
661 description:
@@ -668,10 +668,10 @@ packages:
668 dependency: transitive
669 description:
670 name: stack_trace
671 - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
671 + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
672 url: "https://pub.dev"
673 source: hosted
674 - version: "1.11.1"
674 + version: "1.12.0"
675 stream_channel:
676 dependency: transitive
677 description:
@@ -684,18 +684,18 @@ packages:
684 dependency: transitive
685 description:
686 name: stream_transform
687 - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
687 + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
688 url: "https://pub.dev"
689 source: hosted
690 - version: "2.1.0"
690 + version: "2.1.1"
691 string_scanner:
692 dependency: transitive
693 description:
694 name: string_scanner
695 - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
695 + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
696 url: "https://pub.dev"
697 source: hosted
698 - version: "1.2.0"
698 + version: "1.3.0"
699 term_glyph:
700 dependency: transitive
701 description:
@@ -708,18 +708,18 @@ packages:
708 dependency: transitive
709 description:
710 name: test_api
711 - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
711 + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
712 url: "https://pub.dev"
713 source: hosted
714 - version: "0.7.2"
714 + version: "0.7.3"
715 timing:
716 dependency: transitive
717 description:
718 name: timing
719 - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
719 + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
720 url: "https://pub.dev"
721 source: hosted
722 - version: "1.0.1"
722 + version: "1.0.2"
723 tuple:
724 dependency: transitive
725 description:
@@ -756,26 +756,26 @@ packages:
756 dependency: transitive
757 description:
758 name: vm_service
759 - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
759 + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
760 url: "https://pub.dev"
761 source: hosted
762 - version: "14.2.4"
762 + version: "14.3.0"
763 watcher:
764 dependency: "direct overridden"
765 description:
766 name: watcher
767 - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
767 + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
768 url: "https://pub.dev"
769 source: hosted
770 - version: "1.1.0"
770 + version: "1.1.1"
771 web:
772 dependency: transitive
773 description:
774 name: web
775 - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
775 + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
776 url: "https://pub.dev"
777 source: hosted
778 - version: "1.1.0"
778 + version: "1.1.1"
779 web_socket:
780 dependency: transitive
781 description:
@@ -788,10 +788,10 @@ packages:
788 dependency: transitive
789 description:
790 name: web_socket_channel
791 - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
791 + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
792 url: "https://pub.dev"
793 source: hosted
794 - version: "3.0.1"
794 + version: "3.0.2"
795 xdg_directories:
796 dependency: transitive
797 description:
@@ -804,10 +804,10 @@ packages:
804 dependency: transitive
805 description:
806 name: yaml
807 - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
807 + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
808 url: "https://pub.dev"
809 source: hosted
810 - version: "3.1.2"
810 + version: "3.1.3"
811 sdks:
812 - dart: ">=3.5.0 <4.0.0"
812 + dart: ">=3.6.0 <4.0.0"
813 flutter: ">=3.24.0"
cw_decred/pubspec.lock
+31 -31
@@ -5,23 +5,23 @@ packages:
5 dependency: transitive
6 description:
7 name: _fe_analyzer_shared
8 - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
8 + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
9 url: "https://pub.dev"
10 source: hosted
11 - version: "72.0.0"
11 + version: "76.0.0"
12 _macros:
13 dependency: transitive
14 description: dart
15 source: sdk
16 - version: "0.3.2"
16 + version: "0.3.3"
17 analyzer:
18 dependency: transitive
19 description:
20 name: analyzer
21 - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
21 + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
22 url: "https://pub.dev"
23 source: hosted
24 - version: "6.7.0"
24 + version: "6.11.0"
25 args:
26 dependency: transitive
27 description:
@@ -75,18 +75,18 @@ packages:
75 dependency: transitive
76 description:
77 name: build_config
78 - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
78 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
79 url: "https://pub.dev"
80 source: hosted
81 - version: "1.1.1"
81 + version: "1.1.2"
82 build_daemon:
83 dependency: transitive
84 description:
85 name: build_daemon
86 - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
86 + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
87 url: "https://pub.dev"
88 source: hosted
89 - version: "4.0.2"
89 + version: "4.0.4"
90 build_resolvers:
91 dependency: "direct dev"
92 description:
@@ -180,10 +180,10 @@ packages:
180 dependency: transitive
181 description:
182 name: collection
183 - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
183 + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
184 url: "https://pub.dev"
185 source: hosted
186 - version: "1.18.0"
186 + version: "1.19.0"
187 convert:
188 dependency: transitive
189 description:
@@ -365,10 +365,10 @@ packages:
365 dependency: transitive
366 description:
367 name: http_parser
368 - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
368 + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
369 url: "https://pub.dev"
370 source: hosted
371 - version: "4.0.2"
371 + version: "4.1.2"
372 intl:
373 dependency: transitive
374 description:
@@ -405,18 +405,18 @@ packages:
405 dependency: transitive
406 description:
407 name: leak_tracker
408 - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
408 + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
409 url: "https://pub.dev"
410 source: hosted
411 - version: "10.0.5"
411 + version: "10.0.7"
412 leak_tracker_flutter_testing:
413 dependency: transitive
414 description:
415 name: leak_tracker_flutter_testing
416 - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
416 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
417 url: "https://pub.dev"
418 source: hosted
419 - version: "3.0.5"
419 + version: "3.0.8"
420 leak_tracker_testing:
421 dependency: transitive
422 description:
@@ -437,10 +437,10 @@ packages:
437 dependency: transitive
438 description:
439 name: macros
440 - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
440 + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
441 url: "https://pub.dev"
442 source: hosted
443 - version: "0.1.2-main.4"
443 + version: "0.1.3-main.0"
444 matcher:
445 dependency: transitive
446 description:
@@ -646,10 +646,10 @@ packages:
646 dependency: transitive
647 description:
648 name: shelf
649 - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
649 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
650 url: "https://pub.dev"
651 source: hosted
652 - version: "1.4.1"
652 + version: "1.4.2"
653 shelf_web_socket:
654 dependency: transitive
655 description:
@@ -662,7 +662,7 @@ packages:
662 dependency: transitive
663 description: flutter
664 source: sdk
665 - version: "0.0.99"
665 + version: "0.0.0"
666 socks5_proxy:
667 dependency: transitive
668 description:
@@ -699,10 +699,10 @@ packages:
699 dependency: transitive
700 description:
701 name: stack_trace
702 - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
702 + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
703 url: "https://pub.dev"
704 source: hosted
705 - version: "1.11.1"
705 + version: "1.12.0"
706 stream_channel:
707 dependency: transitive
708 description:
@@ -723,10 +723,10 @@ packages:
723 dependency: transitive
724 description:
725 name: string_scanner
726 - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
726 + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
727 url: "https://pub.dev"
728 source: hosted
729 - version: "1.2.0"
729 + version: "1.3.0"
730 term_glyph:
731 dependency: transitive
732 description:
@@ -739,10 +739,10 @@ packages:
739 dependency: transitive
740 description:
741 name: test_api
742 - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
742 + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
743 url: "https://pub.dev"
744 source: hosted
745 - version: "0.7.2"
745 + version: "0.7.3"
746 timing:
747 dependency: transitive
748 description:
@@ -787,10 +787,10 @@ packages:
787 dependency: transitive
788 description:
789 name: vm_service
790 - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
790 + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
791 url: "https://pub.dev"
792 source: hosted
793 - version: "14.2.4"
793 + version: "14.3.0"
794 watcher:
795 dependency: transitive
796 description:
@@ -848,5 +848,5 @@ packages:
848 source: hosted
849 version: "2.2.2"
850 sdks:
851 - dart: ">=3.5.0 <4.0.0"
851 + dart: ">=3.6.0 <4.0.0"
852 flutter: ">=3.24.0"
cw_monero/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux
+1 -1
@@ -1 +1 @@
1 -/home/parallels/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/
\ No newline at end of file
1 +/Users/user/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/
\ No newline at end of file
cw_monero/pubspec.lock
+82 -82
@@ -29,10 +29,10 @@ packages:
29 dependency: transitive
30 description:
31 name: asn1lib
32 - sha256: "6b151826fcc95ff246cd219a0bf4c753ea14f4081ad71c61939becf3aba27f70"
32 + sha256: "1c296cd268f486cabcc3930e9b93a8133169305f18d722916e675959a88f6d2c"
33 url: "https://pub.dev"
34 source: hosted
35 - version: "1.5.5"
35 + version: "1.5.9"
36 async:
37 dependency: transitive
38 description:
@@ -54,10 +54,10 @@ packages:
54 dependency: transitive
55 description:
56 name: bluez
57 - sha256: "203a1924e818a9dd74af2b2c7a8f375ab8e5edf0e486bba8f90a0d8a17ed9fce"
57 + sha256: "61a7204381925896a374301498f2f5399e59827c6498ae1e924aaa598751b545"
58 url: "https://pub.dev"
59 source: hosted
60 - version: "0.8.2"
60 + version: "0.8.3"
61 boolean_selector:
62 dependency: transitive
63 description:
@@ -78,18 +78,18 @@ packages:
78 dependency: transitive
79 description:
80 name: build_config
81 - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
81 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
82 url: "https://pub.dev"
83 source: hosted
84 - version: "1.1.1"
84 + version: "1.1.2"
85 build_daemon:
86 dependency: transitive
87 description:
88 name: build_daemon
89 - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
89 + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
90 url: "https://pub.dev"
91 source: hosted
92 - version: "4.0.2"
92 + version: "4.0.4"
93 build_resolvers:
94 dependency: "direct dev"
95 description:
@@ -126,10 +126,10 @@ packages:
126 dependency: transitive
127 description:
128 name: built_value
129 - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
129 + sha256: "8b158ab94ec6913e480dc3f752418348b5ae099eb75868b5f4775f0572999c61"
130 url: "https://pub.dev"
131 source: hosted
132 - version: "8.9.2"
132 + version: "8.9.4"
133 cake_backup:
134 dependency: transitive
135 description:
@@ -167,18 +167,18 @@ packages:
167 dependency: transitive
168 description:
169 name: code_builder
170 - sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
170 + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
171 url: "https://pub.dev"
172 source: hosted
173 - version: "4.10.0"
173 + version: "4.10.1"
174 collection:
175 dependency: transitive
176 description:
177 name: collection
178 - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
178 + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
179 url: "https://pub.dev"
180 source: hosted
181 - version: "1.18.0"
181 + version: "1.19.0"
182 convert:
183 dependency: transitive
184 description:
@@ -230,10 +230,10 @@ packages:
230 dependency: transitive
231 description:
232 name: dbus
233 - sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac"
233 + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
234 url: "https://pub.dev"
235 source: hosted
236 - version: "0.7.10"
236 + version: "0.7.11"
237 decimal:
238 dependency: transitive
239 description:
@@ -291,10 +291,10 @@ packages:
291 dependency: "direct main"
292 description:
293 name: flutter_mobx
294 - sha256: "859fbf452fa9c2519d2700b125dd7fb14c508bbdd7fb65e26ca8ff6c92280e2e"
294 + sha256: ba5e93467866a2991259dc51cffd41ef45f695c667c2b8e7b087bf24118b50fe
295 url: "https://pub.dev"
296 source: hosted
297 - version: "2.2.1+1"
297 + version: "2.3.0"
298 flutter_test:
299 dependency: "direct dev"
300 description: flutter
@@ -304,10 +304,10 @@ packages:
304 dependency: transitive
305 description:
306 name: flutter_web_bluetooth
307 - sha256: "52ce64f65d7321c4bf6abfe9dac02fb888731339a5e0ad6de59fb916c20c9f02"
307 + sha256: "1363831def5eed1e1064d1eca04e8ccb35446e8f758579c3c519e156b77926da"
308 url: "https://pub.dev"
309 source: hosted
310 - version: "0.2.3"
310 + version: "1.0.0"
311 frontend_server_client:
312 dependency: transitive
313 description:
@@ -320,10 +320,10 @@ packages:
320 dependency: transitive
321 description:
322 name: glob
323 - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
323 + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
324 url: "https://pub.dev"
325 source: hosted
326 - version: "2.1.2"
326 + version: "2.1.3"
327 graphs:
328 dependency: transitive
329 description:
@@ -336,10 +336,10 @@ packages:
336 dependency: transitive
337 description:
338 name: hashlib
339 - sha256: f572f2abce09fc7aee53f15927052b9732ea1053e540af8cae211111ee0b99b1
339 + sha256: e13e8237d93fb275cd1c55fc339bb90638994d1a4f140c7ee270173b51f3d169
340 url: "https://pub.dev"
341 source: hosted
342 - version: "1.21.0"
342 + version: "1.21.1"
343 hashlib_codecs:
344 dependency: transitive
345 description:
@@ -368,26 +368,26 @@ packages:
368 dependency: "direct main"
369 description:
370 name: http
371 - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
371 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
372 url: "https://pub.dev"
373 source: hosted
374 - version: "1.2.2"
374 + version: "1.3.0"
375 http_multi_server:
376 dependency: transitive
377 description:
378 name: http_multi_server
379 - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
379 + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
380 url: "https://pub.dev"
381 source: hosted
382 - version: "3.2.1"
382 + version: "3.2.2"
383 http_parser:
384 dependency: transitive
385 description:
386 name: http_parser
387 - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
387 + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
388 url: "https://pub.dev"
389 source: hosted
390 - version: "4.0.2"
390 + version: "4.1.2"
391 intl:
392 dependency: "direct main"
393 description:
@@ -400,10 +400,10 @@ packages:
400 dependency: transitive
401 description:
402 name: io
403 - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
403 + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
404 url: "https://pub.dev"
405 source: hosted
406 - version: "1.0.4"
406 + version: "1.0.5"
407 js:
408 dependency: transitive
409 description:
@@ -424,18 +424,18 @@ packages:
424 dependency: transitive
425 description:
426 name: leak_tracker
427 - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
427 + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
428 url: "https://pub.dev"
429 source: hosted
430 - version: "10.0.5"
430 + version: "10.0.7"
431 leak_tracker_flutter_testing:
432 dependency: transitive
433 description:
434 name: leak_tracker_flutter_testing
435 - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
435 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
436 url: "https://pub.dev"
437 source: hosted
438 - version: "3.0.5"
438 + version: "3.0.8"
439 leak_tracker_testing:
440 dependency: transitive
441 description:
@@ -448,10 +448,10 @@ packages:
448 dependency: "direct main"
449 description:
450 name: ledger_flutter_plus
451 - sha256: c7b04008553193dbca7e17b430768eecc372a72b0ff3625b5e7fc5e5c8d3231b
451 + sha256: "1c03f3c4a9754b5f0170a9eb9552ec54fa86e985f8ee71a255ee2c5629b53d31"
452 url: "https://pub.dev"
453 source: hosted
454 - version: "1.4.1"
454 + version: "1.5.1"
455 ledger_usb_plus:
456 dependency: transitive
457 description:
@@ -504,10 +504,10 @@ packages:
504 dependency: "direct main"
505 description:
506 name: mobx
507 - sha256: "63920b27b32ad1910adfe767ab1750e4c212e8923232a1f891597b362074ea5e"
507 + sha256: bf1a90e5bcfd2851fc6984e20eef69557c65d9e4d0a88f5be4cf72c9819ce6b0
508 url: "https://pub.dev"
509 source: hosted
510 - version: "2.3.3+2"
510 + version: "2.5.0"
511 mobx_codegen:
512 dependency: "direct dev"
513 description:
@@ -554,10 +554,10 @@ packages:
554 dependency: transitive
555 description:
556 name: package_config
557 - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
557 + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67"
558 url: "https://pub.dev"
559 source: hosted
560 - version: "2.1.0"
560 + version: "2.1.1"
561 path:
562 dependency: transitive
563 description:
@@ -570,26 +570,26 @@ packages:
570 dependency: "direct main"
571 description:
572 name: path_provider
573 - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
573 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
574 url: "https://pub.dev"
575 source: hosted
576 - version: "2.1.4"
576 + version: "2.1.5"
577 path_provider_android:
578 dependency: transitive
579 description:
580 name: path_provider_android
581 - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a
581 + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
582 url: "https://pub.dev"
583 source: hosted
584 - version: "2.2.12"
584 + version: "2.2.15"
585 path_provider_foundation:
586 dependency: transitive
587 description:
588 name: path_provider_foundation
589 - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
589 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
590 url: "https://pub.dev"
591 source: hosted
592 - version: "2.4.0"
592 + version: "2.4.1"
593 path_provider_linux:
594 dependency: transitive
595 description:
@@ -650,10 +650,10 @@ packages:
650 dependency: "direct main"
651 description:
652 name: polyseed
653 - sha256: "11d4dbee409db053c5e9cd77382b2f5115f43fc2529158a826a96f3ba505d770"
653 + sha256: ccc6ba0ed3976837e770a324a6295fbf3d7c0d05fc0fa1906e36479b07c2675b
654 url: "https://pub.dev"
655 source: hosted
656 - version: "0.0.6"
656 + version: "0.0.7"
657 pool:
658 dependency: transitive
659 description:
@@ -674,18 +674,18 @@ packages:
674 dependency: transitive
675 description:
676 name: pub_semver
677 - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
677 + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd"
678 url: "https://pub.dev"
679 source: hosted
680 - version: "2.1.4"
680 + version: "2.1.5"
681 pubspec_parse:
682 dependency: transitive
683 description:
684 name: pubspec_parse
685 - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
685 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
686 url: "https://pub.dev"
687 source: hosted
688 - version: "1.3.0"
688 + version: "1.5.0"
689 rational:
690 dependency: transitive
691 description:
@@ -706,23 +706,23 @@ packages:
706 dependency: transitive
707 description:
708 name: shelf
709 - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
709 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
710 url: "https://pub.dev"
711 source: hosted
712 - version: "1.4.1"
712 + version: "1.4.2"
713 shelf_web_socket:
714 dependency: transitive
715 description:
716 name: shelf_web_socket
717 - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611"
717 + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67
718 url: "https://pub.dev"
719 source: hosted
720 - version: "2.0.0"
720 + version: "2.0.1"
721 sky_engine:
722 dependency: transitive
723 description: flutter
724 source: sdk
725 - version: "0.0.99"
725 + version: "0.0.0"
726 socks5_proxy:
727 dependency: transitive
728 description:
@@ -759,10 +759,10 @@ packages:
759 dependency: transitive
760 description:
761 name: stack_trace
762 - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
762 + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
763 url: "https://pub.dev"
764 source: hosted
765 - version: "1.11.1"
765 + version: "1.12.0"
766 stream_channel:
767 dependency: transitive
768 description:
@@ -775,18 +775,18 @@ packages:
775 dependency: transitive
776 description:
777 name: stream_transform
778 - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
778 + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
779 url: "https://pub.dev"
780 source: hosted
781 - version: "2.1.0"
781 + version: "2.1.1"
782 string_scanner:
783 dependency: transitive
784 description:
785 name: string_scanner
786 - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
786 + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
787 url: "https://pub.dev"
788 source: hosted
789 - version: "1.2.0"
789 + version: "1.3.0"
790 term_glyph:
791 dependency: transitive
792 description:
@@ -799,18 +799,18 @@ packages:
799 dependency: transitive
800 description:
801 name: test_api
802 - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
802 + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
803 url: "https://pub.dev"
804 source: hosted
805 - version: "0.7.2"
805 + version: "0.7.3"
806 timing:
807 dependency: transitive
808 description:
809 name: timing
810 - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
810 + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
811 url: "https://pub.dev"
812 source: hosted
813 - version: "1.0.1"
813 + version: "1.0.2"
814 tuple:
815 dependency: transitive
816 description:
@@ -831,10 +831,10 @@ packages:
831 dependency: transitive
832 description:
833 name: universal_ble
834 - sha256: "0dfbd6b64bff3ad61ed7a895c232530d9614e9b01ab261a74433a43267edb7f3"
834 + sha256: "1fad089150a29db82b3b7d60327e18c5ad6b3a5bb509defc1c690b0a76b9c098"
835 url: "https://pub.dev"
836 source: hosted
837 - version: "0.12.0"
837 + version: "0.15.0"
838 universal_platform:
839 dependency: transitive
840 description:
@@ -863,26 +863,26 @@ packages:
863 dependency: transitive
864 description:
865 name: vm_service
866 - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
866 + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
867 url: "https://pub.dev"
868 source: hosted
869 - version: "14.2.4"
869 + version: "14.3.0"
870 watcher:
871 dependency: "direct overridden"
872 description:
873 name: watcher
874 - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
874 + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
875 url: "https://pub.dev"
876 source: hosted
877 - version: "1.1.0"
877 + version: "1.1.1"
878 web:
879 dependency: transitive
880 description:
881 name: web
882 - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
882 + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
883 url: "https://pub.dev"
884 source: hosted
885 - version: "1.1.0"
885 + version: "1.1.1"
886 web_socket:
887 dependency: transitive
888 description:
@@ -895,10 +895,10 @@ packages:
895 dependency: transitive
896 description:
897 name: web_socket_channel
898 - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
898 + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
899 url: "https://pub.dev"
900 source: hosted
901 - version: "3.0.1"
901 + version: "3.0.2"
902 xdg_directories:
903 dependency: transitive
904 description:
@@ -919,10 +919,10 @@ packages:
919 dependency: transitive
920 description:
921 name: yaml
922 - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
922 + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
923 url: "https://pub.dev"
924 source: hosted
925 - version: "3.1.2"
925 + version: "3.1.3"
926 sdks:
927 - dart: ">=3.5.0 <4.0.0"
927 + dart: ">=3.6.0 <4.0.0"
928 flutter: ">=3.24.0"
cw_mweb/pubspec.yaml
+1 -1
@@ -10,7 +10,7 @@ environment:
10 dependencies:
11 flutter:
12 sdk: flutter
13 - grpc: ^3.2.4
13 + grpc: ^4.0.1
14 path_provider: ^2.1.2
15 plugin_platform_interface: ^2.0.2
16 cw_core:
cw_nano/pubspec.lock
+76 -76
@@ -29,10 +29,10 @@ packages:
29 dependency: transitive
30 description:
31 name: asn1lib
32 - sha256: "6b151826fcc95ff246cd219a0bf4c753ea14f4081ad71c61939becf3aba27f70"
32 + sha256: "1c296cd268f486cabcc3930e9b93a8133169305f18d722916e675959a88f6d2c"
33 url: "https://pub.dev"
34 source: hosted
35 - version: "1.5.5"
35 + version: "1.5.9"
36 async:
37 dependency: transitive
38 description:
@@ -94,18 +94,18 @@ packages:
94 dependency: transitive
95 description:
96 name: build_config
97 - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
97 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
98 url: "https://pub.dev"
99 source: hosted
100 - version: "1.1.1"
100 + version: "1.1.2"
101 build_daemon:
102 dependency: transitive
103 description:
104 name: build_daemon
105 - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
105 + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
106 url: "https://pub.dev"
107 source: hosted
108 - version: "4.0.2"
108 + version: "4.0.4"
109 build_resolvers:
110 dependency: transitive
111 description:
@@ -142,10 +142,10 @@ packages:
142 dependency: transitive
143 description:
144 name: built_value
145 - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
145 + sha256: "8b158ab94ec6913e480dc3f752418348b5ae099eb75868b5f4775f0572999c61"
146 url: "https://pub.dev"
147 source: hosted
148 - version: "8.9.2"
148 + version: "8.9.4"
149 cake_backup:
150 dependency: transitive
151 description:
@@ -183,18 +183,18 @@ packages:
183 dependency: transitive
184 description:
185 name: code_builder
186 - sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
186 + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
187 url: "https://pub.dev"
188 source: hosted
189 - version: "4.10.0"
189 + version: "4.10.1"
190 collection:
191 dependency: transitive
192 description:
193 name: collection
194 - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
194 + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
195 url: "https://pub.dev"
196 source: hosted
197 - version: "1.18.0"
197 + version: "1.19.0"
198 convert:
199 dependency: transitive
200 description:
@@ -315,10 +315,10 @@ packages:
315 dependency: transitive
316 description:
317 name: flutter_mobx
318 - sha256: "859fbf452fa9c2519d2700b125dd7fb14c508bbdd7fb65e26ca8ff6c92280e2e"
318 + sha256: ba5e93467866a2991259dc51cffd41ef45f695c667c2b8e7b087bf24118b50fe
319 url: "https://pub.dev"
320 source: hosted
321 - version: "2.2.1+1"
321 + version: "2.3.0"
322 flutter_test:
323 dependency: "direct dev"
324 description: flutter
@@ -341,10 +341,10 @@ packages:
341 dependency: transitive
342 description:
343 name: glob
344 - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
344 + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
345 url: "https://pub.dev"
346 source: hosted
347 - version: "2.1.2"
347 + version: "2.1.3"
348 graphs:
349 dependency: transitive
350 description:
@@ -381,26 +381,26 @@ packages:
381 dependency: "direct main"
382 description:
383 name: http
384 - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
384 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
385 url: "https://pub.dev"
386 source: hosted
387 - version: "1.2.2"
387 + version: "1.3.0"
388 http_multi_server:
389 dependency: transitive
390 description:
391 name: http_multi_server
392 - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
392 + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
393 url: "https://pub.dev"
394 source: hosted
395 - version: "3.2.1"
395 + version: "3.2.2"
396 http_parser:
397 dependency: transitive
398 description:
399 name: http_parser
400 - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
400 + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
401 url: "https://pub.dev"
402 source: hosted
403 - version: "4.0.2"
403 + version: "4.1.2"
404 intl:
405 dependency: transitive
406 description:
@@ -413,10 +413,10 @@ packages:
413 dependency: transitive
414 description:
415 name: io
416 - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
416 + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
417 url: "https://pub.dev"
418 source: hosted
419 - version: "1.0.4"
419 + version: "1.0.5"
420 js:
421 dependency: transitive
422 description:
@@ -437,18 +437,18 @@ packages:
437 dependency: transitive
438 description:
439 name: leak_tracker
440 - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
440 + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
441 url: "https://pub.dev"
442 source: hosted
443 - version: "10.0.5"
443 + version: "10.0.7"
444 leak_tracker_flutter_testing:
445 dependency: transitive
446 description:
447 name: leak_tracker_flutter_testing
448 - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
448 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
449 url: "https://pub.dev"
450 source: hosted
451 - version: "3.0.5"
451 + version: "3.0.8"
452 leak_tracker_testing:
453 dependency: transitive
454 description:
@@ -509,10 +509,10 @@ packages:
509 dependency: "direct main"
510 description:
511 name: mobx
512 - sha256: "63920b27b32ad1910adfe767ab1750e4c212e8923232a1f891597b362074ea5e"
512 + sha256: bf1a90e5bcfd2851fc6984e20eef69557c65d9e4d0a88f5be4cf72c9819ce6b0
513 url: "https://pub.dev"
514 source: hosted
515 - version: "2.3.3+2"
515 + version: "2.5.0"
516 mobx_codegen:
517 dependency: "direct dev"
518 description:
@@ -559,10 +559,10 @@ packages:
559 dependency: transitive
560 description:
561 name: package_config
562 - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
562 + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67"
563 url: "https://pub.dev"
564 source: hosted
565 - version: "2.1.0"
565 + version: "2.1.1"
566 path:
567 dependency: transitive
568 description:
@@ -575,26 +575,26 @@ packages:
575 dependency: transitive
576 description:
577 name: path_provider
578 - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
578 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
579 url: "https://pub.dev"
580 source: hosted
581 - version: "2.1.4"
581 + version: "2.1.5"
582 path_provider_android:
583 dependency: transitive
584 description:
585 name: path_provider_android
586 - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a
586 + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
587 url: "https://pub.dev"
588 source: hosted
589 - version: "2.2.12"
589 + version: "2.2.15"
590 path_provider_foundation:
591 dependency: transitive
592 description:
593 name: path_provider_foundation
594 - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
594 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
595 url: "https://pub.dev"
596 source: hosted
597 - version: "2.4.0"
597 + version: "2.4.1"
598 path_provider_linux:
599 dependency: transitive
600 description:
@@ -671,18 +671,18 @@ packages:
671 dependency: transitive
672 description:
673 name: pub_semver
674 - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
674 + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd"
675 url: "https://pub.dev"
676 source: hosted
677 - version: "2.1.4"
677 + version: "2.1.5"
678 pubspec_parse:
679 dependency: transitive
680 description:
681 name: pubspec_parse
682 - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
682 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
683 url: "https://pub.dev"
684 source: hosted
685 - version: "1.3.0"
685 + version: "1.5.0"
686 rational:
687 dependency: transitive
688 description:
@@ -695,26 +695,26 @@ packages:
695 dependency: "direct main"
696 description:
697 name: shared_preferences
698 - sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
698 + sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a"
699 url: "https://pub.dev"
700 source: hosted
701 - version: "2.3.2"
701 + version: "2.5.2"
702 shared_preferences_android:
703 dependency: transitive
704 description:
705 name: shared_preferences_android
706 - sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab"
706 + sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22
707 url: "https://pub.dev"
708 source: hosted
709 - version: "2.3.3"
709 + version: "2.4.6"
710 shared_preferences_foundation:
711 dependency: transitive
712 description:
713 name: shared_preferences_foundation
714 - sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
714 + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
715 url: "https://pub.dev"
716 source: hosted
717 - version: "2.5.3"
717 + version: "2.5.4"
718 shared_preferences_linux:
719 dependency: transitive
720 description:
@@ -735,10 +735,10 @@ packages:
735 dependency: transitive
736 description:
737 name: shared_preferences_web
738 - sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
738 + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
739 url: "https://pub.dev"
740 source: hosted
741 - version: "2.4.2"
741 + version: "2.4.3"
742 shared_preferences_windows:
743 dependency: transitive
744 description:
@@ -751,23 +751,23 @@ packages:
751 dependency: transitive
752 description:
753 name: shelf
754 - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
754 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
755 url: "https://pub.dev"
756 source: hosted
757 - version: "1.4.1"
757 + version: "1.4.2"
758 shelf_web_socket:
759 dependency: transitive
760 description:
761 name: shelf_web_socket
762 - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611"
762 + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67
763 url: "https://pub.dev"
764 source: hosted
765 - version: "2.0.0"
765 + version: "2.0.1"
766 sky_engine:
767 dependency: transitive
768 description: flutter
769 source: sdk
770 - version: "0.0.99"
770 + version: "0.0.0"
771 socks5_proxy:
772 dependency: transitive
773 description:
@@ -804,10 +804,10 @@ packages:
804 dependency: transitive
805 description:
806 name: stack_trace
807 - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
807 + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
808 url: "https://pub.dev"
809 source: hosted
810 - version: "1.11.1"
810 + version: "1.12.0"
811 stream_channel:
812 dependency: transitive
813 description:
@@ -820,18 +820,18 @@ packages:
820 dependency: transitive
821 description:
822 name: stream_transform
823 - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
823 + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
824 url: "https://pub.dev"
825 source: hosted
826 - version: "2.1.0"
826 + version: "2.1.1"
827 string_scanner:
828 dependency: transitive
829 description:
830 name: string_scanner
831 - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
831 + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
832 url: "https://pub.dev"
833 source: hosted
834 - version: "1.2.0"
834 + version: "1.3.0"
835 term_glyph:
836 dependency: transitive
837 description:
@@ -844,18 +844,18 @@ packages:
844 dependency: transitive
845 description:
846 name: test_api
847 - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
847 + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
848 url: "https://pub.dev"
849 source: hosted
850 - version: "0.7.2"
850 + version: "0.7.3"
851 timing:
852 dependency: transitive
853 description:
854 name: timing
855 - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
855 + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
856 url: "https://pub.dev"
857 source: hosted
858 - version: "1.0.1"
858 + version: "1.0.2"
859 tuple:
860 dependency: transitive
861 description:
@@ -892,26 +892,26 @@ packages:
892 dependency: transitive
893 description:
894 name: vm_service
895 - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
895 + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
896 url: "https://pub.dev"
897 source: hosted
898 - version: "14.2.4"
898 + version: "14.3.0"
899 watcher:
900 dependency: "direct overridden"
901 description:
902 name: watcher
903 - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
903 + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
904 url: "https://pub.dev"
905 source: hosted
906 - version: "1.1.0"
906 + version: "1.1.1"
907 web:
908 dependency: transitive
909 description:
910 name: web
911 - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
911 + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
912 url: "https://pub.dev"
913 source: hosted
914 - version: "1.1.0"
914 + version: "1.1.1"
915 web_socket:
916 dependency: transitive
917 description:
@@ -924,10 +924,10 @@ packages:
924 dependency: transitive
925 description:
926 name: web_socket_channel
927 - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
927 + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
928 url: "https://pub.dev"
929 source: hosted
930 - version: "3.0.1"
930 + version: "3.0.2"
931 xdg_directories:
932 dependency: transitive
933 description:
@@ -940,10 +940,10 @@ packages:
940 dependency: transitive
941 description:
942 name: yaml
943 - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
943 + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
944 url: "https://pub.dev"
945 source: hosted
946 - version: "3.1.2"
946 + version: "3.1.3"
947 sdks:
948 - dart: ">=3.5.0 <4.0.0"
948 + dart: ">=3.6.0 <4.0.0"
949 flutter: ">=3.24.0"
cw_wownero/pubspec.lock
+72 -72
@@ -29,10 +29,10 @@ packages:
29 dependency: transitive
30 description:
31 name: asn1lib
32 - sha256: "6b151826fcc95ff246cd219a0bf4c753ea14f4081ad71c61939becf3aba27f70"
32 + sha256: "1c296cd268f486cabcc3930e9b93a8133169305f18d722916e675959a88f6d2c"
33 url: "https://pub.dev"
34 source: hosted
35 - version: "1.5.5"
35 + version: "1.5.9"
36 async:
37 dependency: transitive
38 description:
@@ -70,18 +70,18 @@ packages:
70 dependency: transitive
71 description:
72 name: build_config
73 - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
73 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
74 url: "https://pub.dev"
75 source: hosted
76 - version: "1.1.1"
76 + version: "1.1.2"
77 build_daemon:
78 dependency: transitive
79 description:
80 name: build_daemon
81 - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
81 + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
82 url: "https://pub.dev"
83 source: hosted
84 - version: "4.0.2"
84 + version: "4.0.4"
85 build_resolvers:
86 dependency: "direct dev"
87 description:
@@ -118,10 +118,10 @@ packages:
118 dependency: transitive
119 description:
120 name: built_value
121 - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
121 + sha256: "8b158ab94ec6913e480dc3f752418348b5ae099eb75868b5f4775f0572999c61"
122 url: "https://pub.dev"
123 source: hosted
124 - version: "8.9.2"
124 + version: "8.9.4"
125 cake_backup:
126 dependency: transitive
127 description:
@@ -159,18 +159,18 @@ packages:
159 dependency: transitive
160 description:
161 name: code_builder
162 - sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
162 + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
163 url: "https://pub.dev"
164 source: hosted
165 - version: "4.10.0"
165 + version: "4.10.1"
166 collection:
167 dependency: transitive
168 description:
169 name: collection
170 - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
170 + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
171 url: "https://pub.dev"
172 source: hosted
173 - version: "1.18.0"
173 + version: "1.19.0"
174 convert:
175 dependency: transitive
176 description:
@@ -275,10 +275,10 @@ packages:
275 dependency: "direct main"
276 description:
277 name: flutter_mobx
278 - sha256: "859fbf452fa9c2519d2700b125dd7fb14c508bbdd7fb65e26ca8ff6c92280e2e"
278 + sha256: ba5e93467866a2991259dc51cffd41ef45f695c667c2b8e7b087bf24118b50fe
279 url: "https://pub.dev"
280 source: hosted
281 - version: "2.2.1+1"
281 + version: "2.3.0"
282 flutter_test:
283 dependency: "direct dev"
284 description: flutter
@@ -296,10 +296,10 @@ packages:
296 dependency: transitive
297 description:
298 name: glob
299 - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
299 + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
300 url: "https://pub.dev"
301 source: hosted
302 - version: "2.1.2"
302 + version: "2.1.3"
303 graphs:
304 dependency: transitive
305 description:
@@ -312,10 +312,10 @@ packages:
312 dependency: transitive
313 description:
314 name: hashlib
315 - sha256: f572f2abce09fc7aee53f15927052b9732ea1053e540af8cae211111ee0b99b1
315 + sha256: e13e8237d93fb275cd1c55fc339bb90638994d1a4f140c7ee270173b51f3d169
316 url: "https://pub.dev"
317 source: hosted
318 - version: "1.21.0"
318 + version: "1.21.1"
319 hashlib_codecs:
320 dependency: transitive
321 description:
@@ -344,26 +344,26 @@ packages:
344 dependency: "direct main"
345 description:
346 name: http
347 - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
347 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
348 url: "https://pub.dev"
349 source: hosted
350 - version: "1.2.2"
350 + version: "1.3.0"
351 http_multi_server:
352 dependency: transitive
353 description:
354 name: http_multi_server
355 - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
355 + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
356 url: "https://pub.dev"
357 source: hosted
358 - version: "3.2.1"
358 + version: "3.2.2"
359 http_parser:
360 dependency: transitive
361 description:
362 name: http_parser
363 - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
363 + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
364 url: "https://pub.dev"
365 source: hosted
366 - version: "4.0.2"
366 + version: "4.1.2"
367 intl:
368 dependency: "direct main"
369 description:
@@ -376,10 +376,10 @@ packages:
376 dependency: transitive
377 description:
378 name: io
379 - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
379 + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
380 url: "https://pub.dev"
381 source: hosted
382 - version: "1.0.4"
382 + version: "1.0.5"
383 js:
384 dependency: transitive
385 description:
@@ -400,18 +400,18 @@ packages:
400 dependency: transitive
401 description:
402 name: leak_tracker
403 - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
403 + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
404 url: "https://pub.dev"
405 source: hosted
406 - version: "10.0.5"
406 + version: "10.0.7"
407 leak_tracker_flutter_testing:
408 dependency: transitive
409 description:
410 name: leak_tracker_flutter_testing
411 - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
411 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
412 url: "https://pub.dev"
413 source: hosted
414 - version: "3.0.5"
414 + version: "3.0.8"
415 leak_tracker_testing:
416 dependency: transitive
417 description:
@@ -464,10 +464,10 @@ packages:
464 dependency: "direct main"
465 description:
466 name: mobx
467 - sha256: "63920b27b32ad1910adfe767ab1750e4c212e8923232a1f891597b362074ea5e"
467 + sha256: bf1a90e5bcfd2851fc6984e20eef69557c65d9e4d0a88f5be4cf72c9819ce6b0
468 url: "https://pub.dev"
469 source: hosted
470 - version: "2.3.3+2"
470 + version: "2.5.0"
471 mobx_codegen:
472 dependency: "direct dev"
473 description:
@@ -514,10 +514,10 @@ packages:
514 dependency: transitive
515 description:
516 name: package_config
517 - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
517 + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67"
518 url: "https://pub.dev"
519 source: hosted
520 - version: "2.1.0"
520 + version: "2.1.1"
521 path:
522 dependency: transitive
523 description:
@@ -530,26 +530,26 @@ packages:
530 dependency: "direct main"
531 description:
532 name: path_provider
533 - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
533 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
534 url: "https://pub.dev"
535 source: hosted
536 - version: "2.1.4"
536 + version: "2.1.5"
537 path_provider_android:
538 dependency: transitive
539 description:
540 name: path_provider_android
541 - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a
541 + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
542 url: "https://pub.dev"
543 source: hosted
544 - version: "2.2.12"
544 + version: "2.2.15"
545 path_provider_foundation:
546 dependency: transitive
547 description:
548 name: path_provider_foundation
549 - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
549 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
550 url: "https://pub.dev"
551 source: hosted
552 - version: "2.4.0"
552 + version: "2.4.1"
553 path_provider_linux:
554 dependency: transitive
555 description:
@@ -602,10 +602,10 @@ packages:
602 dependency: "direct main"
603 description:
604 name: polyseed
605 - sha256: "11d4dbee409db053c5e9cd77382b2f5115f43fc2529158a826a96f3ba505d770"
605 + sha256: ccc6ba0ed3976837e770a324a6295fbf3d7c0d05fc0fa1906e36479b07c2675b
606 url: "https://pub.dev"
607 source: hosted
608 - version: "0.0.6"
608 + version: "0.0.7"
609 pool:
610 dependency: transitive
611 description:
@@ -626,18 +626,18 @@ packages:
626 dependency: transitive
627 description:
628 name: pub_semver
629 - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
629 + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd"
630 url: "https://pub.dev"
631 source: hosted
632 - version: "2.1.4"
632 + version: "2.1.5"
633 pubspec_parse:
634 dependency: transitive
635 description:
636 name: pubspec_parse
637 - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
637 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
638 url: "https://pub.dev"
639 source: hosted
640 - version: "1.3.0"
640 + version: "1.5.0"
641 rational:
642 dependency: transitive
643 description:
@@ -650,23 +650,23 @@ packages:
650 dependency: transitive
651 description:
652 name: shelf
653 - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
653 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
654 url: "https://pub.dev"
655 source: hosted
656 - version: "1.4.1"
656 + version: "1.4.2"
657 shelf_web_socket:
658 dependency: transitive
659 description:
660 name: shelf_web_socket
661 - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611"
661 + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67
662 url: "https://pub.dev"
663 source: hosted
664 - version: "2.0.0"
664 + version: "2.0.1"
665 sky_engine:
666 dependency: transitive
667 description: flutter
668 source: sdk
669 - version: "0.0.99"
669 + version: "0.0.0"
670 socks5_proxy:
671 dependency: transitive
672 description:
@@ -703,10 +703,10 @@ packages:
703 dependency: transitive
704 description:
705 name: stack_trace
706 - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
706 + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
707 url: "https://pub.dev"
708 source: hosted
709 - version: "1.11.1"
709 + version: "1.12.0"
710 stream_channel:
711 dependency: transitive
712 description:
@@ -719,18 +719,18 @@ packages:
719 dependency: transitive
720 description:
721 name: stream_transform
722 - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
722 + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
723 url: "https://pub.dev"
724 source: hosted
725 - version: "2.1.0"
725 + version: "2.1.1"
726 string_scanner:
727 dependency: transitive
728 description:
729 name: string_scanner
730 - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
730 + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
731 url: "https://pub.dev"
732 source: hosted
733 - version: "1.2.0"
733 + version: "1.3.0"
734 term_glyph:
735 dependency: transitive
736 description:
@@ -743,18 +743,18 @@ packages:
743 dependency: transitive
744 description:
745 name: test_api
746 - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
746 + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
747 url: "https://pub.dev"
748 source: hosted
749 - version: "0.7.2"
749 + version: "0.7.3"
750 timing:
751 dependency: transitive
752 description:
753 name: timing
754 - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
754 + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
755 url: "https://pub.dev"
756 source: hosted
757 - version: "1.0.1"
757 + version: "1.0.2"
758 tuple:
759 dependency: transitive
760 description:
@@ -791,26 +791,26 @@ packages:
791 dependency: transitive
792 description:
793 name: vm_service
794 - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
794 + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
795 url: "https://pub.dev"
796 source: hosted
797 - version: "14.2.4"
797 + version: "14.3.0"
798 watcher:
799 dependency: "direct overridden"
800 description:
801 name: watcher
802 - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
802 + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
803 url: "https://pub.dev"
804 source: hosted
805 - version: "1.1.0"
805 + version: "1.1.1"
806 web:
807 dependency: transitive
808 description:
809 name: web
810 - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
810 + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
811 url: "https://pub.dev"
812 source: hosted
813 - version: "1.1.0"
813 + version: "1.1.1"
814 web_socket:
815 dependency: transitive
816 description:
@@ -823,10 +823,10 @@ packages:
823 dependency: transitive
824 description:
825 name: web_socket_channel
826 - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
826 + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
827 url: "https://pub.dev"
828 source: hosted
829 - version: "3.0.1"
829 + version: "3.0.2"
830 xdg_directories:
831 dependency: transitive
832 description:
@@ -839,10 +839,10 @@ packages:
839 dependency: transitive
840 description:
841 name: yaml
842 - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
842 + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
843 url: "https://pub.dev"
844 source: hosted
845 - version: "3.1.2"
845 + version: "3.1.3"
846 sdks:
847 - dart: ">=3.5.0 <4.0.0"
847 + dart: ">=3.6.0 <4.0.0"
848 flutter: ">=3.24.0"
cw_zano/pubspec.lock
+52 -52
@@ -29,10 +29,10 @@ packages:
29 dependency: transitive
30 description:
31 name: asn1lib
32 - sha256: "4bae5ae63e6d6dd17c4aac8086f3dec26c0236f6a0f03416c6c19d830c367cf5"
32 + sha256: "1c296cd268f486cabcc3930e9b93a8133169305f18d722916e675959a88f6d2c"
33 url: "https://pub.dev"
34 source: hosted
35 - version: "1.5.8"
35 + version: "1.5.9"
36 async:
37 dependency: transitive
38 description:
@@ -70,18 +70,18 @@ packages:
70 dependency: transitive
71 description:
72 name: build_config
73 - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
73 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
74 url: "https://pub.dev"
75 source: hosted
76 - version: "1.1.1"
76 + version: "1.1.2"
77 build_daemon:
78 dependency: transitive
79 description:
80 name: build_daemon
81 - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
81 + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
82 url: "https://pub.dev"
83 source: hosted
84 - version: "4.0.2"
84 + version: "4.0.4"
85 build_resolvers:
86 dependency: "direct dev"
87 description:
@@ -118,10 +118,10 @@ packages:
118 dependency: transitive
119 description:
120 name: built_value
121 - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
121 + sha256: "8b158ab94ec6913e480dc3f752418348b5ae099eb75868b5f4775f0572999c61"
122 url: "https://pub.dev"
123 source: hosted
124 - version: "8.9.2"
124 + version: "8.9.4"
125 cake_backup:
126 dependency: transitive
127 description:
@@ -167,10 +167,10 @@ packages:
167 dependency: transitive
168 description:
169 name: collection
170 - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
170 + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
171 url: "https://pub.dev"
172 source: hosted
173 - version: "1.18.0"
173 + version: "1.19.0"
174 convert:
175 dependency: transitive
176 description:
@@ -275,10 +275,10 @@ packages:
275 dependency: "direct main"
276 description:
277 name: flutter_mobx
278 - sha256: "859fbf452fa9c2519d2700b125dd7fb14c508bbdd7fb65e26ca8ff6c92280e2e"
278 + sha256: ba5e93467866a2991259dc51cffd41ef45f695c667c2b8e7b087bf24118b50fe
279 url: "https://pub.dev"
280 source: hosted
281 - version: "2.2.1+1"
281 + version: "2.3.0"
282 flutter_test:
283 dependency: "direct dev"
284 description: flutter
@@ -293,10 +293,10 @@ packages:
293 dependency: "direct main"
294 description:
295 name: fluttertoast
296 - sha256: "95f349437aeebe524ef7d6c9bde3e6b4772717cf46a0eb6a3ceaddc740b297cc"
296 + sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1"
297 url: "https://pub.dev"
298 source: hosted
299 - version: "8.2.8"
299 + version: "8.2.12"
300 frontend_server_client:
301 dependency: transitive
302 description:
@@ -309,10 +309,10 @@ packages:
309 dependency: transitive
310 description:
311 name: glob
312 - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
312 + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
313 url: "https://pub.dev"
314 source: hosted
315 - version: "2.1.2"
315 + version: "2.1.3"
316 graphs:
317 dependency: transitive
318 description:
@@ -341,26 +341,26 @@ packages:
341 dependency: "direct main"
342 description:
343 name: http
344 - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
344 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
345 url: "https://pub.dev"
346 source: hosted
347 - version: "1.2.2"
347 + version: "1.3.0"
348 http_multi_server:
349 dependency: transitive
350 description:
351 name: http_multi_server
352 - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
352 + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
353 url: "https://pub.dev"
354 source: hosted
355 - version: "3.2.1"
355 + version: "3.2.2"
356 http_parser:
357 dependency: transitive
358 description:
359 name: http_parser
360 - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
360 + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
361 url: "https://pub.dev"
362 source: hosted
363 - version: "4.0.2"
363 + version: "4.1.2"
364 intl:
365 dependency: "direct main"
366 description:
@@ -405,18 +405,18 @@ packages:
405 dependency: transitive
406 description:
407 name: leak_tracker
408 - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
408 + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
409 url: "https://pub.dev"
410 source: hosted
411 - version: "10.0.5"
411 + version: "10.0.7"
412 leak_tracker_flutter_testing:
413 dependency: transitive
414 description:
415 name: leak_tracker_flutter_testing
416 - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
416 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
417 url: "https://pub.dev"
418 source: hosted
419 - version: "3.0.5"
419 + version: "3.0.8"
420 leak_tracker_testing:
421 dependency: transitive
422 description:
@@ -469,10 +469,10 @@ packages:
469 dependency: "direct main"
470 description:
471 name: mobx
472 - sha256: "1f01a429529ac55e5e80c0fcad62c60112fb91df3dec11a9113d71cf0c2e2c4c"
472 + sha256: bf1a90e5bcfd2851fc6984e20eef69557c65d9e4d0a88f5be4cf72c9819ce6b0
473 url: "https://pub.dev"
474 source: hosted
475 - version: "2.4.0"
475 + version: "2.5.0"
476 mobx_codegen:
477 dependency: "direct dev"
478 description:
@@ -631,10 +631,10 @@ packages:
631 dependency: transitive
632 description:
633 name: pubspec_parse
634 - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
634 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
635 url: "https://pub.dev"
636 source: hosted
637 - version: "1.3.0"
637 + version: "1.5.0"
638 rational:
639 dependency: transitive
640 description:
@@ -647,10 +647,10 @@ packages:
647 dependency: transitive
648 description:
649 name: shelf
650 - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
650 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
651 url: "https://pub.dev"
652 source: hosted
653 - version: "1.4.1"
653 + version: "1.4.2"
654 shelf_web_socket:
655 dependency: transitive
656 description:
@@ -663,7 +663,7 @@ packages:
663 dependency: transitive
664 description: flutter
665 source: sdk
666 - version: "0.0.99"
666 + version: "0.0.0"
667 socks5_proxy:
668 dependency: transitive
669 description:
@@ -700,10 +700,10 @@ packages:
700 dependency: transitive
701 description:
702 name: stack_trace
703 - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
703 + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
704 url: "https://pub.dev"
705 source: hosted
706 - version: "1.11.1"
706 + version: "1.12.0"
707 stream_channel:
708 dependency: transitive
709 description:
@@ -716,18 +716,18 @@ packages:
716 dependency: transitive
717 description:
718 name: stream_transform
719 - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
719 + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
720 url: "https://pub.dev"
721 source: hosted
722 - version: "2.1.0"
722 + version: "2.1.1"
723 string_scanner:
724 dependency: transitive
725 description:
726 name: string_scanner
727 - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
727 + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
728 url: "https://pub.dev"
729 source: hosted
730 - version: "1.2.0"
730 + version: "1.3.0"
731 term_glyph:
732 dependency: transitive
733 description:
@@ -740,10 +740,10 @@ packages:
740 dependency: transitive
741 description:
742 name: test_api
743 - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
743 + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
744 url: "https://pub.dev"
745 source: hosted
746 - version: "0.7.2"
746 + version: "0.7.3"
747 timing:
748 dependency: transitive
749 description:
@@ -788,26 +788,26 @@ packages:
788 dependency: transitive
789 description:
790 name: vm_service
791 - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
791 + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
792 url: "https://pub.dev"
793 source: hosted
794 - version: "14.2.4"
794 + version: "14.3.0"
795 watcher:
796 dependency: "direct overridden"
797 description:
798 name: watcher
799 - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
799 + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
800 url: "https://pub.dev"
801 source: hosted
802 - version: "1.1.0"
802 + version: "1.1.1"
803 web:
804 dependency: transitive
805 description:
806 name: web
807 - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
807 + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
808 url: "https://pub.dev"
809 source: hosted
810 - version: "1.1.0"
810 + version: "1.1.1"
811 web_socket:
812 dependency: transitive
813 description:
@@ -820,10 +820,10 @@ packages:
820 dependency: transitive
821 description:
822 name: web_socket_channel
823 - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
823 + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
824 url: "https://pub.dev"
825 source: hosted
826 - version: "3.0.1"
826 + version: "3.0.2"
827 xdg_directories:
828 dependency: transitive
829 description:
@@ -836,10 +836,10 @@ packages:
836 dependency: transitive
837 description:
838 name: yaml
839 - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
839 + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
840 url: "https://pub.dev"
841 source: hosted
842 - version: "3.1.2"
842 + version: "3.1.3"
843 sdks:
844 - dart: ">=3.5.0 <4.0.0"
844 + dart: ">=3.6.0 <4.0.0"
845 flutter: ">=3.24.0"
cw_zano/pubspec.yaml
+1 -1
@@ -22,7 +22,7 @@ dependencies:
22 cw_core:
23 path: ../cw_core
24 json_bigint: ^3.0.0
25 - fluttertoast: ^8.2.8
25 + fluttertoast: ^8.2.12
26 monero:
27 git:
28 url: https://github.com/mrcyjanek/monero_c
docs/builds/IOS.md
+4 -4
@@ -7,7 +7,7 @@ The following are the system requirements to build Cake Wallet for your iOS devi
7 ```txt
8 macOS 15.3.1
9 Xcode 16.2
10 -Flutter 3.24.4
10 +Flutter 3.27.4
11 ```
12
13 NOTE: Newer versions of macOS and Xcode may also work, but have not been confirmed to work by the Cake team.
@@ -43,9 +43,9 @@ To enable iOS build support for Xcode, perform the following:
43
44 ### 3. Installing Flutter
45
46 -Install Flutter, specifically version `3.24.4` by following the [official docs](https://docs.flutter.dev/get-started/install/macos/desktop?tab=download).
46 +Install Flutter, specifically version `3.27.4` by following the [official docs](https://docs.flutter.dev/get-started/install/macos/desktop?tab=download).
47
48 -NOTE: as `3.24.4` is not the latest version, you'll need to download it from <https://docs.flutter.dev/release/archive> instead of the link in the docs above.
48 +NOTE: as `3.27.4` is not the latest version, you'll need to download it from <https://docs.flutter.dev/release/archive> instead of the link in the docs above.
49
50 ### 4. Installing Rust
51
@@ -65,7 +65,7 @@ The output of this command should appear like this, indicating successful instal
65
66 ```zsh
67 Doctor summary (to see all details, run flutter doctor -v):
68 -[✓] Flutter (Channel stable, 3.24.4, on macOS 15.x.x)
68 +[✓] Flutter (Channel stable, 3.27.4, on macOS 15.x.x)
69 [✓] Xcode - develop for iOS and macOS (Xcode 16.2)
70 ```
71
docs/builds/MACOS.md
+4 -4
@@ -7,7 +7,7 @@ The following are the system requirements to build Cake Wallet for your macOS de
7 ```txt
8 macOS 15.3.1
9 Xcode 16.2
10 -Flutter 3.24.4
10 +Flutter 3.27.4
11 ```
12
13 ### 1. Installing dependencies
@@ -34,9 +34,9 @@ sudo xcodebuild -runFirstLaunch
34
35 ### 3. Installing Flutter
36
37 -Install Flutter, specifically version `3.24.4` by following the [official docs](https://docs.flutter.dev/get-started/install/macos/desktop?tab=download).
37 +Install Flutter, specifically version `3.27.4` by following the [official docs](https://docs.flutter.dev/get-started/install/macos/desktop?tab=download).
38
39 -NOTE: as `3.24.4` is not the latest version, you'll need to download it from <https://docs.flutter.dev/release/archive> instead of the link in the docs above.
39 +NOTE: as `3.27.4` is not the latest version, you'll need to download it from <https://docs.flutter.dev/release/archive> instead of the link in the docs above.
40
41 ### 4. Installing Rust
42
@@ -56,7 +56,7 @@ The output of this command should appear like this, indicating successful instal
56
57 ```zsh
58 Doctor summary (to see all details, run flutter doctor -v):
59 -[✓] Flutter (Channel stable, 3.24.4, on macOS 15.x.x)
59 +[✓] Flutter (Channel stable, 3.27.4, on macOS 15.x.x)
60 ...
61 [✓] Xcode - develop for iOS and macOS (Xcode 16.2)
62 ...
docs/builds/WINDOWS.md
+3 -3
@@ -6,18 +6,18 @@ The following are the system requirements to build Cake Wallet for your Windows
6
7 ```txt
8 Windows 10 or later (64-bit), x86-64 based
9 -Flutter 3.24.4
9 +Flutter 3.27.4
10 ```
11
12 ### 1. Installing Flutter
13
14 -Install Flutter, specifically version `3.24.4` by following the [official docs](https://docs.flutter.dev/get-started/install/windows).
14 +Install Flutter, specifically version `3.27.4` by following the [official docs](https://docs.flutter.dev/get-started/install/windows).
15
16 In order for Flutter to function, you'll also need to enable Developer Mode:
17
18 Start Menu > search for "Run" > type `ms-settings:developers`, and turn on Developer Mode.
19
20 -NOTE: as `3.24.4` is not the latest version, you'll need to download it from <https://docs.flutter.dev/release/archive> instead of the link in the docs above.
20 +NOTE: as `3.27.4` is not the latest version, you'll need to download it from <https://docs.flutter.dev/release/archive> instead of the link in the docs above.
21
22 ### 2. Install Development Tools
23
ios/Podfile.lock
+9 -7
@@ -3,6 +3,8 @@ PODS:
3 - Flutter
4 - ReachabilitySwift
5 - CryptoSwift (1.8.3)
6 + - cw_mweb (0.0.1):
7 + - Flutter
8 - cw_decred (0.0.1):
9 - Flutter
10 - cw_mweb (0.0.1):
@@ -65,7 +67,6 @@ PODS:
67 - Flutter
68 - fluttertoast (0.0.2):
69 - Flutter
68 - - Toast
70 - in_app_review (2.0.0):
71 - Flutter
72 - integration_test (0.0.1):
@@ -76,7 +77,7 @@ PODS:
77 - path_provider_foundation (0.0.1):
78 - Flutter
79 - FlutterMacOS
79 - - permission_handler_apple (9.1.1):
80 + - permission_handler_apple (9.3.0):
81 - Flutter
82 - ReachabilitySwift (5.2.4)
83 - SDWebImage (5.19.7):
@@ -92,7 +93,6 @@ PODS:
93 - sp_scanner (0.0.1):
94 - Flutter
95 - SwiftyGif (5.4.5)
95 - - Toast (4.1.1)
96 - uni_links (0.0.1):
97 - Flutter
98 - universal_ble (0.0.1):
@@ -106,6 +106,7 @@ PODS:
106 DEPENDENCIES:
107 - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
108 - CryptoSwift
109 + - cw_mweb (from `.symlinks/plugins/cw_mweb/ios`)
110 - cw_decred (from `.symlinks/plugins/cw_decred/ios`)
111 - cw_mweb (from `.symlinks/plugins/cw_mweb/ios`)
112 - device_display_brightness (from `.symlinks/plugins/device_display_brightness/ios`)
@@ -142,11 +143,12 @@ SPEC REPOS:
143 - ReachabilitySwift
144 - SDWebImage
145 - SwiftyGif
145 - - Toast
146
147 EXTERNAL SOURCES:
148 connectivity_plus:
149 :path: ".symlinks/plugins/connectivity_plus/ios"
150 + cw_mweb:
151 + :path: ".symlinks/plugins/cw_mweb/ios"
152 cw_decred:
153 :path: ".symlinks/plugins/cw_decred/ios"
154 cw_mweb:
@@ -211,19 +213,19 @@ SPEC CHECKSUMS:
213 DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
214 DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
215 fast_scanner: 2cb1ad3e69e645e9980fb4961396ce5804caa3e3
214 - file_picker: 07c75322ede1d47ec9bb4ac82b27c94d3598251a
216 + file_picker: 9b3292d7c8bc68c8a7bf8eb78f730e49c8efc517
217 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
218 flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
219 flutter_local_authentication: 989278c681612f1ee0e36019e149137f114b9d7f
220 flutter_mailer: 3a8cd4f36c960fb04528d5471097270c19fec1c4
221 flutter_secure_storage: 2c2ff13db9e0a5647389bff88b0ecac56e3f3418
220 - fluttertoast: 76fea30fcf04176325f6864c87306927bd7d2038
222 + fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
223 in_app_review: 5596fe56fab799e8edb3561c03d053363ab13457
224 integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
225 OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
226 package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
227 path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
226 - permission_handler_apple: 3787117e48f80715ff04a3830ca039283d6a4f29
228 + permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
229 ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda
230 SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
231 sensitive_clipboard: 161e9abc3d56b3131309d8a321eb4690a803c16b
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+1
@@ -48,6 +48,7 @@
48 ignoresPersistentStateOnLaunch = "NO"
49 debugDocumentVersioning = "YES"
50 debugServiceExtension = "internal"
51 + enableGPUValidationMode = "1"
52 allowLocationSimulation = "YES">
53 <BuildableProductRunnable
54 runnableDebuggingMode = "0">
lib/core/backup_service.dart
+112 -199
@@ -24,118 +24,27 @@ import 'package:cake_wallet/.secrets.g.dart' as secrets;
24 import 'package:cake_wallet/wallet_types.g.dart';
25 import 'package:cake_backup/backup.dart' as cake_backup;
26
27 -class BackupService {
28 - BackupService(this._secureStorage, this._walletInfoSource, this._transactionDescriptionBox,
29 - this._keyService, this._sharedPreferences)
30 - : _cipher = Cryptography.instance.chacha20Poly1305Aead(),
31 - _correctWallets = <WalletInfo>[];
27 +class $BackupService {
28 + $BackupService(this._secureStorage, this.walletInfoSource, this.transactionDescriptionBox,
29 + this.keyService, this.sharedPreferences)
30 + : cipher = Cryptography.instance.chacha20Poly1305Aead(),
31 + correctWallets = <WalletInfo>[];
32
33 - static const currentVersion = _v2;
33 + static const currentVersion = _v3;
34
35 - static const _v1 = 1;
35 static const _v2 = 2;
36 + static const _v3 = 3;
37
38 - final Cipher _cipher;
38 + final Cipher cipher;
39 final SecureStorage _secureStorage;
40 - final SharedPreferences _sharedPreferences;
41 - final Box<WalletInfo> _walletInfoSource;
42 - final Box<TransactionDescription> _transactionDescriptionBox;
43 - final KeyService _keyService;
44 - List<WalletInfo> _correctWallets;
45 -
46 - Future<void> importBackup(Uint8List data, String password,
47 - {String nonce = secrets.backupSalt}) async {
48 - final version = getVersion(data);
49 -
50 - switch (version) {
51 - case _v1:
52 - final backupBytes = data.toList()..removeAt(0);
53 - final backupData = Uint8List.fromList(backupBytes);
54 - await _importBackupV1(backupData, password, nonce: nonce);
55 - break;
56 - case _v2:
57 - await _importBackupV2(data, password);
58 - break;
59 - default:
60 - break;
61 - }
62 - }
63 -
64 - Future<Uint8List> exportBackup(String password,
65 - {String nonce = secrets.backupSalt, int version = currentVersion}) async {
66 - switch (version) {
67 - case _v1:
68 - return await _exportBackupV1(password, nonce: nonce);
69 - case _v2:
70 - return await _exportBackupV2(password);
71 - default:
72 - throw Exception('Incorrect version: $version for exportBackup');
73 - }
74 - }
40 + final SharedPreferences sharedPreferences;
41 + final Box<WalletInfo> walletInfoSource;
42 + final Box<TransactionDescription> transactionDescriptionBox;
43 + final KeyService keyService;
44 + List<WalletInfo> correctWallets;
45
76 - @Deprecated('Use v2 instead')
77 - Future<Uint8List> _exportBackupV1(String password, {String nonce = secrets.backupSalt}) async =>
78 - throw Exception('Deprecated. Export for backups v1 is deprecated. Please use export v2.');
46
80 - Future<Uint8List> _exportBackupV2(String password) async {
81 - final zipEncoder = ZipFileEncoder();
82 - final appDir = await getAppDir();
83 - final now = DateTime.now();
84 - final tmpDir = Directory('${appDir.path}/~_BACKUP_TMP');
85 - final archivePath = '${tmpDir.path}/backup_${now.toString()}.zip';
86 - final fileEntities = appDir.listSync(recursive: false);
87 - final keychainDump = await _exportKeychainDumpV2(password);
88 - final preferencesDump = await _exportPreferencesJSON();
89 - final preferencesDumpFile = File('${tmpDir.path}/~_preferences_dump_TMP');
90 - final keychainDumpFile = File('${tmpDir.path}/~_keychain_dump_TMP');
91 - final transactionDescriptionDumpFile =
92 - File('${tmpDir.path}/~_transaction_descriptions_dump_TMP');
93 -
94 - final transactionDescriptionData = _transactionDescriptionBox
95 - .toMap()
96 - .map((key, value) => MapEntry(key.toString(), value.toJson()));
97 - final transactionDescriptionDump = jsonEncode(transactionDescriptionData);
98 -
99 - if (tmpDir.existsSync()) {
100 - tmpDir.deleteSync(recursive: true);
101 - }
102 -
103 - tmpDir.createSync();
104 - zipEncoder.create(archivePath);
105 -
106 - fileEntities.forEach((entity) {
107 - if (entity.path == archivePath || entity.path == tmpDir.path) {
108 - return;
109 - }
110 - final filename = entity.absolute;
111 - for (var ignore in ignoreFiles) {
112 - final filename = entity.absolute.path;
113 - if (filename.endsWith(ignore) && !filename.contains("wallets/")) {
114 - printV("ignoring backup file: $filename");
115 - return;
116 - }
117 - }
118 - printV("restoring: $filename");
119 - if (entity.statSync().type == FileSystemEntityType.directory) {
120 - zipEncoder.addDirectory(Directory(entity.path));
121 - } else {
122 - zipEncoder.addFile(File(entity.path));
123 - }
124 - });
125 - await keychainDumpFile.writeAsBytes(keychainDump.toList());
126 - await preferencesDumpFile.writeAsString(preferencesDump);
127 - await transactionDescriptionDumpFile.writeAsString(transactionDescriptionDump);
128 - await zipEncoder.addFile(preferencesDumpFile, '~_preferences_dump');
129 - await zipEncoder.addFile(keychainDumpFile, '~_keychain_dump');
130 - await zipEncoder.addFile(transactionDescriptionDumpFile, '~_transaction_descriptions_dump');
131 - zipEncoder.close();
132 -
133 - final content = File(archivePath).readAsBytesSync();
134 - tmpDir.deleteSync(recursive: true);
135 - return await _encryptV2(content, password);
136 - }
137 -
138 - Future<void> _importBackupV1(Uint8List data, String password, {required String nonce}) async {
47 + Future<void> importBackupV1(Uint8List data, String password, {required String nonce}) async {
48 final appDir = await getAppDir();
49 final decryptedData = await _decryptV1(data, password, nonce);
50 final zip = ZipDecoder().decodeBytes(decryptedData);
@@ -153,9 +62,9 @@ class BackupService {
62 }
63 };
64
156 - await _verifyWallets();
65 + await verifyWallets();
66 await _importKeychainDumpV1(password, nonce: nonce);
158 - await _importPreferencesDump();
67 + await importPreferencesDump();
68 }
69
70 // checked with .endsWith - so this should be the last part of the filename
@@ -163,12 +72,13 @@ class BackupService {
72 "flutter_assets/kernel_blob.bin",
73 "flutter_assets/vm_snapshot_data",
74 "flutter_assets/isolate_snapshot_data",
75 + "README.txt",
76 ".lock",
77 ];
78
169 - Future<void> _importBackupV2(Uint8List data, String password) async {
79 + Future<void> importBackupV2(Uint8List data, String password) async {
80 final appDir = await getAppDir();
171 - final decryptedData = await _decryptV2(data, password);
81 + final decryptedData = await decryptV2(data, password);
82 final zip = ZipDecoder().decodeBytes(decryptedData);
83
84 outer:
@@ -187,22 +97,25 @@ class BackupService {
97 ..createSync(recursive: true)
98 ..writeAsBytesSync(content, flush: true);
99 } else {
190 - Directory('${appDir.path}/' + filename)..create(recursive: true);
100 + final dir = Directory('${appDir.path}/' + filename);
101 + if (!dir.existsSync()) {
102 + dir.createSync(recursive: true);
103 + }
104 }
105 };
106
194 - await _verifyWallets();
195 - await _importKeychainDumpV2(password);
196 - await _importPreferencesDump();
197 - await _importTransactionDescriptionDump(); // HiveError: Box has already been closed
107 + await verifyWallets();
108 + await importKeychainDumpV2(password);
109 + await importPreferencesDump();
110 + await importTransactionDescriptionDump(); // HiveError: Box has already been closed
111 }
112
200 - Future<void> _verifyWallets() async {
113 + Future<void> verifyWallets() async {
114 final walletInfoSource = await _reloadHiveWalletInfoBox();
202 - _correctWallets =
115 + correctWallets =
116 walletInfoSource.values.where((info) => availableWalletTypes.contains(info.type)).toList();
117
205 - if (_correctWallets.isEmpty) {
118 + if (correctWallets.isEmpty) {
119 throw Exception('Correct wallets not detected');
120 }
121 }
@@ -219,7 +132,7 @@ class BackupService {
132 return await CakeHive.openBox<WalletInfo>(WalletInfo.boxName);
133 }
134
222 - Future<void> _importTransactionDescriptionDump() async {
135 + Future<void> importTransactionDescriptionDump() async {
136 final appDir = await getAppDir();
137 final transactionDescriptionFile = File('${appDir.path}/~_transaction_descriptions_dump');
138
@@ -231,7 +144,7 @@ class BackupService {
144 json.decode(transactionDescriptionFile.readAsStringSync()) as Map<String, dynamic>;
145 final descriptionsMap = jsonData.map((key, value) =>
146 MapEntry(key, TransactionDescription.fromJson(value as Map<String, dynamic>)));
234 - var box = _transactionDescriptionBox;
147 + var box = transactionDescriptionBox;
148 if (!box.isOpen) {
149 final transactionDescriptionsBoxKey =
150 await getEncryptionKey(secureStorage: _secureStorage, forKey: TransactionDescription.boxKey);
@@ -242,7 +155,7 @@ class BackupService {
155 await box.putAll(descriptionsMap);
156 }
157
245 - Future<void> _importPreferencesDump() async {
158 + Future<void> importPreferencesDump() async {
159 final appDir = await getAppDir();
160 final preferencesFile = File('${appDir.path}/~_preferences_dump');
161
@@ -254,12 +167,12 @@ class BackupService {
167 String currentWalletName = data[PreferencesKey.currentWalletName] as String;
168 int currentWalletType = data[PreferencesKey.currentWalletType] as int;
169
257 - final isCorrentCurrentWallet = _correctWallets
170 + final isCorrentCurrentWallet = correctWallets
171 .any((info) => info.name == currentWalletName && info.type.index == currentWalletType);
172
173 if (!isCorrentCurrentWallet) {
261 - currentWalletName = _correctWallets.first.name;
262 - currentWalletType = serializeToInt(_correctWallets.first.type);
174 + currentWalletName = correctWallets.first.name;
175 + currentWalletType = serializeToInt(correctWallets.first.type);
176 }
177
178 final currentNodeId = data[PreferencesKey.currentNodeIdKey] as int?;
@@ -298,114 +211,114 @@ class BackupService {
211 final autoGenerateSubaddressStatus =
212 data[PreferencesKey.autoGenerateSubaddressStatusKey] as int?;
213
301 - await _sharedPreferences.setString(PreferencesKey.currentWalletName, currentWalletName);
214 + await sharedPreferences.setString(PreferencesKey.currentWalletName, currentWalletName);
215
216 if (currentNodeId != null)
304 - await _sharedPreferences.setInt(PreferencesKey.currentNodeIdKey, currentNodeId);
217 + await sharedPreferences.setInt(PreferencesKey.currentNodeIdKey, currentNodeId);
218
219 if (currentBalanceDisplayMode != null)
307 - await _sharedPreferences.setInt(
220 + await sharedPreferences.setInt(
221 PreferencesKey.currentBalanceDisplayModeKey, currentBalanceDisplayMode);
222
310 - await _sharedPreferences.setInt(PreferencesKey.currentWalletType, currentWalletType);
223 + await sharedPreferences.setInt(PreferencesKey.currentWalletType, currentWalletType);
224
225 if (currentFiatCurrency != null)
313 - await _sharedPreferences.setString(
226 + await sharedPreferences.setString(
227 PreferencesKey.currentFiatCurrencyKey, currentFiatCurrency);
228
229 if (shouldSaveRecipientAddress != null)
317 - await _sharedPreferences.setBool(
230 + await sharedPreferences.setBool(
231 PreferencesKey.shouldSaveRecipientAddressKey, shouldSaveRecipientAddress);
232
233 if (isAppSecure != null)
321 - await _sharedPreferences.setBool(PreferencesKey.isAppSecureKey, isAppSecure);
234 + await sharedPreferences.setBool(PreferencesKey.isAppSecureKey, isAppSecure);
235
236 if (disableTradeOption != null)
324 - await _sharedPreferences.setBool(PreferencesKey.disableTradeOption, disableTradeOption);
237 + await sharedPreferences.setBool(PreferencesKey.disableTradeOption, disableTradeOption);
238
239 if (currentTransactionPriorityKeyLegacy != null)
327 - await _sharedPreferences.setInt(
240 + await sharedPreferences.setInt(
241 PreferencesKey.currentTransactionPriorityKeyLegacy, currentTransactionPriorityKeyLegacy);
242
243 if (currentBitcoinElectrumSererId != null)
331 - await _sharedPreferences.setInt(
244 + await sharedPreferences.setInt(
245 PreferencesKey.currentBitcoinElectrumSererIdKey, currentBitcoinElectrumSererId);
246
247 if (currentLanguageCode != null)
335 - await _sharedPreferences.setString(PreferencesKey.currentLanguageCode, currentLanguageCode);
248 + await sharedPreferences.setString(PreferencesKey.currentLanguageCode, currentLanguageCode);
249
250 if (displayActionListMode != null)
338 - await _sharedPreferences.setInt(
251 + await sharedPreferences.setInt(
252 PreferencesKey.displayActionListModeKey, displayActionListMode);
253
254 if (fiatApiMode != null)
342 - await _sharedPreferences.setInt(PreferencesKey.currentFiatApiModeKey, fiatApiMode);
255 + await sharedPreferences.setInt(PreferencesKey.currentFiatApiModeKey, fiatApiMode);
256 if (autoGenerateSubaddressStatus != null)
344 - await _sharedPreferences.setInt(
257 + await sharedPreferences.setInt(
258 PreferencesKey.autoGenerateSubaddressStatusKey, autoGenerateSubaddressStatus);
259
260 if (currentTheme != null && DeviceInfo.instance.isMobile) {
348 - await _sharedPreferences.setInt(PreferencesKey.currentTheme, currentTheme);
261 + await sharedPreferences.setInt(PreferencesKey.currentTheme, currentTheme);
262 // enforce dark theme on desktop platforms until the design is ready:
263 } else if (DeviceInfo.instance.isDesktop) {
351 - await _sharedPreferences.setInt(PreferencesKey.currentTheme, ThemeList.darkTheme.raw);
264 + await sharedPreferences.setInt(PreferencesKey.currentTheme, ThemeList.darkTheme.raw);
265 }
266
267 if (exchangeStatus != null)
355 - await _sharedPreferences.setInt(PreferencesKey.exchangeStatusKey, exchangeStatus);
268 + await sharedPreferences.setInt(PreferencesKey.exchangeStatusKey, exchangeStatus);
269
270 if (currentDefaultSettingsMigrationVersion != null)
358 - await _sharedPreferences.setInt(PreferencesKey.currentDefaultSettingsMigrationVersion,
271 + await sharedPreferences.setInt(PreferencesKey.currentDefaultSettingsMigrationVersion,
272 currentDefaultSettingsMigrationVersion);
273
274 if (moneroTransactionPriority != null)
362 - await _sharedPreferences.setInt(
275 + await sharedPreferences.setInt(
276 PreferencesKey.moneroTransactionPriority, moneroTransactionPriority);
277
278 if (bitcoinTransactionPriority != null)
366 - await _sharedPreferences.setInt(
279 + await sharedPreferences.setInt(
280 PreferencesKey.bitcoinTransactionPriority, bitcoinTransactionPriority);
281
282 if (sortBalanceTokensBy != null)
370 - await _sharedPreferences.setInt(PreferencesKey.sortBalanceBy, sortBalanceTokensBy);
283 + await sharedPreferences.setInt(PreferencesKey.sortBalanceBy, sortBalanceTokensBy);
284
285 if (pinNativeTokenAtTop != null)
373 - await _sharedPreferences.setBool(PreferencesKey.pinNativeTokenAtTop, pinNativeTokenAtTop);
286 + await sharedPreferences.setBool(PreferencesKey.pinNativeTokenAtTop, pinNativeTokenAtTop);
287
288 if (useEtherscan != null)
376 - await _sharedPreferences.setBool(PreferencesKey.useEtherscan, useEtherscan);
289 + await sharedPreferences.setBool(PreferencesKey.useEtherscan, useEtherscan);
290
291 if (defaultNanoRep != null)
379 - await _sharedPreferences.setString(PreferencesKey.defaultNanoRep, defaultNanoRep);
292 + await sharedPreferences.setString(PreferencesKey.defaultNanoRep, defaultNanoRep);
293
294 if (defaultBananoRep != null)
382 - await _sharedPreferences.setString(PreferencesKey.defaultBananoRep, defaultBananoRep);
295 + await sharedPreferences.setString(PreferencesKey.defaultBananoRep, defaultBananoRep);
296
384 - if (syncAll != null) await _sharedPreferences.setBool(PreferencesKey.syncAllKey, syncAll);
297 + if (syncAll != null) await sharedPreferences.setBool(PreferencesKey.syncAllKey, syncAll);
298 if (lookupsTwitter != null)
386 - await _sharedPreferences.setBool(PreferencesKey.lookupsTwitter, lookupsTwitter);
299 + await sharedPreferences.setBool(PreferencesKey.lookupsTwitter, lookupsTwitter);
300
301 if (lookupsMastodon != null)
389 - await _sharedPreferences.setBool(PreferencesKey.lookupsMastodon, lookupsMastodon);
302 + await sharedPreferences.setBool(PreferencesKey.lookupsMastodon, lookupsMastodon);
303
304 if (lookupsYatService != null)
392 - await _sharedPreferences.setBool(PreferencesKey.lookupsYatService, lookupsYatService);
305 + await sharedPreferences.setBool(PreferencesKey.lookupsYatService, lookupsYatService);
306
307 if (lookupsUnstoppableDomains != null)
395 - await _sharedPreferences.setBool(
308 + await sharedPreferences.setBool(
309 PreferencesKey.lookupsUnstoppableDomains, lookupsUnstoppableDomains);
310
311 if (lookupsOpenAlias != null)
399 - await _sharedPreferences.setBool(PreferencesKey.lookupsOpenAlias, lookupsOpenAlias);
312 + await sharedPreferences.setBool(PreferencesKey.lookupsOpenAlias, lookupsOpenAlias);
313
401 - if (lookupsENS != null) await _sharedPreferences.setBool(PreferencesKey.lookupsENS, lookupsENS);
314 + if (lookupsENS != null) await sharedPreferences.setBool(PreferencesKey.lookupsENS, lookupsENS);
315
316 if (lookupsWellKnown != null)
404 - await _sharedPreferences.setBool(PreferencesKey.lookupsWellKnown, lookupsWellKnown);
317 + await sharedPreferences.setBool(PreferencesKey.lookupsWellKnown, lookupsWellKnown);
318
406 - if (syncAll != null) await _sharedPreferences.setBool(PreferencesKey.syncAllKey, syncAll);
319 + if (syncAll != null) await sharedPreferences.setBool(PreferencesKey.syncAllKey, syncAll);
320
408 - if (syncMode != null) await _sharedPreferences.setInt(PreferencesKey.syncModeKey, syncMode);
321 + if (syncMode != null) await sharedPreferences.setInt(PreferencesKey.syncModeKey, syncMode);
322
323 await preferencesFile.delete();
324 }
@@ -436,12 +349,12 @@ class BackupService {
349 keychainDumpFile.deleteSync();
350 }
351
439 - Future<void> _importKeychainDumpV2(String password,
352 + Future<void> importKeychainDumpV2(String password,
353 {String keychainSalt = secrets.backupKeychainSalt}) async {
354 final appDir = await getAppDir();
355 final keychainDumpFile = File('${appDir.path}/~_keychain_dump');
356 final decryptedKeychainDumpFileData =
444 - await _decryptV2(keychainDumpFile.readAsBytesSync(), '$keychainSalt$password');
357 + await decryptV2(keychainDumpFile.readAsBytesSync(), '$keychainSalt$password');
358 final keychainJSON =
359 json.decode(utf8.decode(decryptedKeychainDumpFileData)) as Map<String, dynamic>;
360 final keychainWalletsInfo = keychainJSON['wallets'] as List;
@@ -462,7 +375,7 @@ class BackupService {
375 final name = info['name'] as String;
376 final password = info['password'] as String;
377
465 - await _keyService.saveWalletPassword(walletName: name, password: password);
378 + await keyService.saveWalletPassword(walletName: name, password: password);
379 }
380
381 @Deprecated('Use v2 instead')
@@ -470,14 +383,14 @@ class BackupService {
383 {required String nonce, String keychainSalt = secrets.backupKeychainSalt}) async =>
384 throw Exception('Deprecated');
385
473 - Future<Uint8List> _exportKeychainDumpV2(String password,
386 + Future<Uint8List> exportKeychainDumpV2(String password,
387 {String keychainSalt = secrets.backupKeychainSalt}) async {
388 final key = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword);
476 - final wallets = await Future.wait(_walletInfoSource.values.map((walletInfo) async {
389 + final wallets = await Future.wait(walletInfoSource.values.map((walletInfo) async {
390 return {
391 'name': walletInfo.name,
392 'type': walletInfo.type.toString(),
480 - 'password': await _keyService.getWalletPassword(walletName: walletInfo.name)
393 + 'password': await keyService.getWalletPassword(walletName: walletInfo.name)
394 };
395 }));
396 final backupPasswordKey = generateStoreKeyFor(key: SecretStoreKey.backupPassword);
@@ -489,58 +402,58 @@ class BackupService {
402 return encrypted;
403 }
404
492 - Future<String> _exportPreferencesJSON() async {
405 + Future<String> exportPreferencesJSON() async {
406 final preferences = <String, dynamic>{
407 PreferencesKey.currentWalletName:
495 - _sharedPreferences.getString(PreferencesKey.currentWalletName),
496 - PreferencesKey.currentNodeIdKey: _sharedPreferences.getInt(PreferencesKey.currentNodeIdKey),
408 + sharedPreferences.getString(PreferencesKey.currentWalletName),
409 + PreferencesKey.currentNodeIdKey: sharedPreferences.getInt(PreferencesKey.currentNodeIdKey),
410 PreferencesKey.currentBalanceDisplayModeKey:
498 - _sharedPreferences.getInt(PreferencesKey.currentBalanceDisplayModeKey),
499 - PreferencesKey.currentWalletType: _sharedPreferences.getInt(PreferencesKey.currentWalletType),
411 + sharedPreferences.getInt(PreferencesKey.currentBalanceDisplayModeKey),
412 + PreferencesKey.currentWalletType: sharedPreferences.getInt(PreferencesKey.currentWalletType),
413 PreferencesKey.currentFiatCurrencyKey:
501 - _sharedPreferences.getString(PreferencesKey.currentFiatCurrencyKey),
414 + sharedPreferences.getString(PreferencesKey.currentFiatCurrencyKey),
415 PreferencesKey.shouldSaveRecipientAddressKey:
503 - _sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey),
504 - PreferencesKey.disableTradeOption: _sharedPreferences.getBool(PreferencesKey.disableTradeOption),
416 + sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey),
417 + PreferencesKey.disableTradeOption: sharedPreferences.getBool(PreferencesKey.disableTradeOption),
418 PreferencesKey.currentTransactionPriorityKeyLegacy:
506 - _sharedPreferences.getInt(PreferencesKey.currentTransactionPriorityKeyLegacy),
419 + sharedPreferences.getInt(PreferencesKey.currentTransactionPriorityKeyLegacy),
420 PreferencesKey.currentBitcoinElectrumSererIdKey:
508 - _sharedPreferences.getInt(PreferencesKey.currentBitcoinElectrumSererIdKey),
421 + sharedPreferences.getInt(PreferencesKey.currentBitcoinElectrumSererIdKey),
422 PreferencesKey.currentLanguageCode:
510 - _sharedPreferences.getString(PreferencesKey.currentLanguageCode),
423 + sharedPreferences.getString(PreferencesKey.currentLanguageCode),
424 PreferencesKey.displayActionListModeKey:
512 - _sharedPreferences.getInt(PreferencesKey.displayActionListModeKey),
513 - PreferencesKey.currentTheme: _sharedPreferences.getInt(PreferencesKey.currentTheme),
514 - PreferencesKey.exchangeStatusKey: _sharedPreferences.getInt(PreferencesKey.exchangeStatusKey),
425 + sharedPreferences.getInt(PreferencesKey.displayActionListModeKey),
426 + PreferencesKey.currentTheme: sharedPreferences.getInt(PreferencesKey.currentTheme),
427 + PreferencesKey.exchangeStatusKey: sharedPreferences.getInt(PreferencesKey.exchangeStatusKey),
428 PreferencesKey.currentDefaultSettingsMigrationVersion:
516 - _sharedPreferences.getInt(PreferencesKey.currentDefaultSettingsMigrationVersion),
429 + sharedPreferences.getInt(PreferencesKey.currentDefaultSettingsMigrationVersion),
430 PreferencesKey.bitcoinTransactionPriority:
518 - _sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority),
431 + sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority),
432 PreferencesKey.moneroTransactionPriority:
520 - _sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority),
433 + sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority),
434 PreferencesKey.currentFiatApiModeKey:
522 - _sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey),
523 - PreferencesKey.sortBalanceBy: _sharedPreferences.getInt(PreferencesKey.sortBalanceBy),
435 + sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey),
436 + PreferencesKey.sortBalanceBy: sharedPreferences.getInt(PreferencesKey.sortBalanceBy),
437 PreferencesKey.pinNativeTokenAtTop:
525 - _sharedPreferences.getBool(PreferencesKey.pinNativeTokenAtTop),
526 - PreferencesKey.useEtherscan: _sharedPreferences.getBool(PreferencesKey.useEtherscan),
527 - PreferencesKey.defaultNanoRep: _sharedPreferences.getString(PreferencesKey.defaultNanoRep),
438 + sharedPreferences.getBool(PreferencesKey.pinNativeTokenAtTop),
439 + PreferencesKey.useEtherscan: sharedPreferences.getBool(PreferencesKey.useEtherscan),
440 + PreferencesKey.defaultNanoRep: sharedPreferences.getString(PreferencesKey.defaultNanoRep),
441 PreferencesKey.defaultBananoRep:
529 - _sharedPreferences.getString(PreferencesKey.defaultBananoRep),
530 - PreferencesKey.lookupsTwitter: _sharedPreferences.getBool(PreferencesKey.lookupsTwitter),
531 - PreferencesKey.lookupsMastodon: _sharedPreferences.getBool(PreferencesKey.lookupsMastodon),
442 + sharedPreferences.getString(PreferencesKey.defaultBananoRep),
443 + PreferencesKey.lookupsTwitter: sharedPreferences.getBool(PreferencesKey.lookupsTwitter),
444 + PreferencesKey.lookupsMastodon: sharedPreferences.getBool(PreferencesKey.lookupsMastodon),
445 PreferencesKey.lookupsYatService:
533 - _sharedPreferences.getBool(PreferencesKey.lookupsYatService),
446 + sharedPreferences.getBool(PreferencesKey.lookupsYatService),
447 PreferencesKey.lookupsUnstoppableDomains:
535 - _sharedPreferences.getBool(PreferencesKey.lookupsUnstoppableDomains),
536 - PreferencesKey.lookupsOpenAlias: _sharedPreferences.getBool(PreferencesKey.lookupsOpenAlias),
537 - PreferencesKey.lookupsENS: _sharedPreferences.getBool(PreferencesKey.lookupsENS),
448 + sharedPreferences.getBool(PreferencesKey.lookupsUnstoppableDomains),
449 + PreferencesKey.lookupsOpenAlias: sharedPreferences.getBool(PreferencesKey.lookupsOpenAlias),
450 + PreferencesKey.lookupsENS: sharedPreferences.getBool(PreferencesKey.lookupsENS),
451 PreferencesKey.lookupsWellKnown:
539 - _sharedPreferences.getBool(PreferencesKey.lookupsWellKnown),
540 - PreferencesKey.syncModeKey: _sharedPreferences.getInt(PreferencesKey.syncModeKey),
541 - PreferencesKey.syncAllKey: _sharedPreferences.getBool(PreferencesKey.syncAllKey),
452 + sharedPreferences.getBool(PreferencesKey.lookupsWellKnown),
453 + PreferencesKey.syncModeKey: sharedPreferences.getInt(PreferencesKey.syncModeKey),
454 + PreferencesKey.syncAllKey: sharedPreferences.getBool(PreferencesKey.syncAllKey),
455 PreferencesKey.autoGenerateSubaddressStatusKey:
543 - _sharedPreferences.getInt(PreferencesKey.autoGenerateSubaddressStatusKey),
456 + sharedPreferences.getInt(PreferencesKey.autoGenerateSubaddressStatusKey),
457 };
458
459 return json.encode(preferences);
@@ -564,13 +477,13 @@ class BackupService {
477 final nonce = base64.decode(nonceBase64).toList();
478 final box = SecretBox(Uint8List.sublistView(data, 0, data.lengthInBytes - macLength).toList(),
479 nonce: nonce, mac: Mac(Uint8List.sublistView(data, data.lengthInBytes - macLength)));
567 - final plainData = await _cipher.decrypt(box, secretKey: secretKey);
480 + final plainData = await cipher.decrypt(box, secretKey: secretKey);
481 return Uint8List.fromList(plainData);
482 }
483
484 Future<Uint8List> _encryptV2(Uint8List data, String passphrase) async =>
485 cake_backup.encrypt(passphrase, data, version: _v2);
486
574 - Future<Uint8List> _decryptV2(Uint8List data, String passphrase) async =>
487 + Future<Uint8List> decryptV2(Uint8List data, String passphrase) async =>
488 cake_backup.decrypt(passphrase, data);
489 }
lib/core/backup_service_v3.dart new
+470
@@ -0,0 +1,470 @@
1 +import 'dart:convert';
2 +import 'dart:io';
3 +import 'dart:typed_data';
4 +
5 +import 'package:archive/archive_io.dart';
6 +import 'package:cake_wallet/core/backup_service.dart';
7 +import 'package:cake_wallet/.secrets.g.dart' as secrets;
8 +import 'package:cake_backup/backup.dart' as cake_backup;
9 +import 'package:cake_wallet/utils/package_info.dart';
10 +import 'package:crypto/crypto.dart';
11 +import 'package:cw_core/root_dir.dart';
12 +import 'package:cw_core/utils/print_verbose.dart';
13 +import 'package:flutter/foundation.dart';
14 +
15 +enum BackupVersion {
16 + unknown, // index 0
17 + v1,
18 + v2,
19 + v3,
20 +}
21 +
22 +class ChunkChecksum {
23 + ChunkChecksum({
24 + required this.encrypted,
25 + required this.plain,
26 + });
27 +
28 + final String encrypted;
29 + final String plain;
30 +
31 + factory ChunkChecksum.fromJson(Map<String, dynamic> json) {
32 + return ChunkChecksum(
33 + encrypted: json['encrypted'] as String,
34 + plain: json['plain'] as String,
35 + );
36 + }
37 +
38 + Map<String, dynamic> toJson() {
39 + return {
40 + 'encrypted': encrypted,
41 + 'plain': plain,
42 + };
43 + }
44 +
45 + @override
46 + String toString() {
47 + return 'ChunkChecksum(encrypted: $encrypted, plain: $plain)';
48 + }
49 +}
50 +
51 +class ChunkLength {
52 + ChunkLength({
53 + required this.encrypted,
54 + required this.plain,
55 + });
56 +
57 + final int encrypted;
58 + final int plain;
59 +
60 + factory ChunkLength.fromJson(Map<String, dynamic> json) {
61 + return ChunkLength(
62 + encrypted: json['encrypted'] as int,
63 + plain: json['plain'] as int,
64 + );
65 + }
66 +
67 + Map<String, dynamic> toJson() {
68 + return {
69 + 'encrypted': encrypted,
70 + 'plain': plain,
71 + };
72 + }
73 + @override
74 + String toString() {
75 + return 'ChunkLength(encrypted: $encrypted, plain: $plain)';
76 + }
77 +}
78 +
79 +class ChunkDetails {
80 + ChunkDetails({
81 + required this.sha512sum,
82 + required this.length,
83 + });
84 +
85 + final ChunkChecksum sha512sum;
86 + final ChunkLength length;
87 +
88 + factory ChunkDetails.fromJson(Map<String, dynamic> json) {
89 + return ChunkDetails(
90 + sha512sum: ChunkChecksum.fromJson(json['sha512sum'] as Map<String, dynamic>),
91 + length: ChunkLength.fromJson(json['length'] as Map<String, dynamic>),
92 + );
93 + }
94 +
95 + Map<String, dynamic> toJson() {
96 + return {
97 + 'sha512sum': sha512sum,
98 + 'length': length,
99 + };
100 + }
101 +
102 + @override
103 + String toString() {
104 + return 'ChunkDetails(sha512sum: $sha512sum, length: $length)';
105 + }
106 +}
107 +
108 +class BackupMetadata {
109 + BackupMetadata({
110 + required this.version,
111 + required this.sha512sum,
112 + required this.chunks,
113 + required this.cakeVersion,
114 + });
115 +
116 + final BackupVersion version;
117 + String sha512sum;
118 + final List<ChunkDetails> chunks;
119 + String cakeVersion;
120 + factory BackupMetadata.fromJson(Map<String, dynamic> json) {
121 + return BackupMetadata(
122 + version: BackupVersion.values[json['version'] as int],
123 + sha512sum: json['sha512sum'] as String,
124 + chunks: (json['chunks'] as List<dynamic>).map((chunk) => ChunkDetails.fromJson(chunk as Map<String, dynamic>)).toList(),
125 + cakeVersion: json['cakeVersion'] as String,
126 + );
127 + }
128 +
129 + Map<String, dynamic> toJson() {
130 + return {
131 + 'version': version.index,
132 + 'sha512sum': sha512sum,
133 + 'chunks': chunks.map((chunk) => chunk.toJson()).toList(),
134 + 'cakeVersion': cakeVersion,
135 + };
136 + }
137 +
138 + @override
139 + String toString() {
140 + return 'BackupMetadata(version: $version, sha512sum: $sha512sum, chunks: $chunks)';
141 + }
142 +}
143 +
144 +class BackupServiceV3 extends $BackupService {
145 + BackupServiceV3(super.secureStorage, super.walletInfoSource, super.transactionDescriptionBox, super.keyService, super.sharedPreferences);
146 +
147 + static BackupVersion get currentVersion => BackupVersion.v3;
148 +
149 + Future<File> exportBackupFile(String password, {String nonce = secrets.backupSalt}) {
150 + return exportBackupFileV3(password, nonce: nonce);
151 + }
152 +
153 + BackupVersion getVersionFile(File data) {
154 + final raf = data.openSync(mode: FileMode.read);
155 +
156 + try {
157 + // Read first 4 bytes to check both version and zip signature
158 + final buffer = Uint8List(1);
159 + final bytesRead = raf.readIntoSync(buffer);
160 +
161 + if (bytesRead == 0) {
162 + throw Exception('Invalid backup file: empty file');
163 + }
164 +
165 + // Check if first byte is version 1 or 2
166 + if (buffer[0] == 1) {
167 + return BackupVersion.v1;
168 + } else if (buffer[0] == 2) {
169 + return BackupVersion.v2;
170 + } else if (buffer[0] == 0x50) {
171 + // $ head -c 64 test-archive.zip | hexdump -C
172 + // 00000000 50 4b 03 04 ....
173 + // Here we just check if the first byte is the zip signature
174 + // Inside of v3 backup we have multiple files.
175 + // Check metadata.json for version in v3 backup
176 + final inputStream = InputFileStream(data.path);
177 + final archive = ZipDecoder().decodeStream(inputStream);
178 + final metadataFile = archive.findFile('metadata.json');
179 + if (metadataFile == null) {
180 + throw Exception('Invalid v3 backup: missing metadata.json');
181 + }
182 + final metadataBytes = metadataFile.rawContent!.readBytes();
183 + final metadataString = utf8.decode(metadataBytes);
184 + final metadataJsonRaw = json.decode(metadataString) as Map<String, dynamic>;
185 + final metadata = BackupMetadata.fromJson(metadataJsonRaw);
186 + if (metadata.version == BackupVersion.v3) {
187 + return BackupVersion.v3;
188 + }
189 + }
190 +
191 + throw Exception('Invalid backup file: unknown version');
192 + } finally {
193 + raf.closeSync();
194 + }
195 + }
196 +
197 + Future<void> importBackupFile(File file, String password, {String nonce = secrets.backupSalt}) {
198 + final version = getVersionFile(file);
199 + switch (version) {
200 + case BackupVersion.unknown:
201 + throw Exception('Invalid backup file: unknown version');
202 + case BackupVersion.v1:
203 + final data = file.readAsBytesSync();
204 + final backupBytes = data.toList()..removeAt(0);
205 + final backupData = Uint8List.fromList(backupBytes);
206 + return super.importBackupV1(backupData, password, nonce: nonce);
207 + case BackupVersion.v2:
208 + return super.importBackupV2(file.readAsBytesSync(), password);
209 + case BackupVersion.v3:
210 + return importBackupFileV3(file, password, nonce: nonce);
211 + }
212 + }
213 +
214 + Future<void> importBackupFileV3(File file, String password, {String nonce = secrets.backupSalt}) async{
215 + // Overall design of v3 backup is the following:
216 + // 1. backup.zip - plaintext zip file that user can open with any archive manager
217 + // 2. backup.zip/README.txt - text file to let user know what is inside of this file
218 + // 3. backup.zip/metadata.json - json file with metadata about backup.
219 + // 4. backup.zip/data.bin - v2 backup file
220 +
221 + final inputStream = InputFileStream(file.path);
222 + final archive = ZipDecoder().decodeStream(inputStream);
223 + final metadataFile = archive.findFile('metadata.json');
224 + if (metadataFile == null) {
225 + throw Exception('Invalid v3 backup: missing metadata.json');
226 + }
227 + final metadataBytes = metadataFile.rawContent!.readBytes();
228 + final metadataString = utf8.decode(metadataBytes);
229 + final metadataJsonRaw = json.decode(metadataString) as Map<String, dynamic>;
230 + final metadata = BackupMetadata.fromJson(metadataJsonRaw);
231 +
232 + final dataFile = archive.findFile('data.bin');
233 + if (dataFile == null) {
234 + throw Exception('Invalid v3 backup: missing data.bin');
235 + }
236 + final dataStream = dataFile.rawContent!.getStream();
237 +
238 + final decryptedData = File('${file.path}_decrypted'); // decrypted zip file
239 + if (decryptedData.existsSync()) {
240 + decryptedData.deleteSync();
241 + }
242 + decryptedData.createSync(recursive: true);
243 + decryptedData.writeAsBytesSync(Uint8List(0), mode: FileMode.write, flush: true);
244 +
245 + int chunkIndex = 0;
246 + for (var chunk in metadata.chunks) {
247 + chunkIndex++;
248 + final chunkBytes = dataStream.readBytes(chunk.length.encrypted).toUint8List();
249 + final chunkChecksum = (await sha512.bind(Stream.fromIterable([chunkBytes])).first).toString();
250 +
251 + // readBytes stores position internally, so we don't need to think about it.
252 + if (chunk.sha512sum.encrypted != chunkChecksum) {
253 + throw Exception('Invalid v3 backup: chunk (${chunk.length.encrypted} bytes) checksum mismatch at index $chunkIndex\n'
254 + 'expected: ${chunk.sha512sum.encrypted}\n'
255 + 'got: $chunkChecksum');
256 + }
257 + final decryptedChunk = await cake_backup.decrypt(password, chunkBytes);
258 + decryptedData.writeAsBytesSync(decryptedChunk, mode: FileMode.append, flush: true);
259 + }
260 +
261 +
262 + final sha512sum = (await sha512.bind(decryptedData.openRead()).first).toString();
263 + if (sha512sum.toString() != metadata.sha512sum) {
264 + throw Exception('Invalid v3 backup: SHA512 checksum mismatch\n'
265 + 'expected: ${metadata.sha512sum}\n'
266 + 'got: $sha512sum');
267 + }
268 +
269 + // Decryption done, now we can import the backup (that is, unzip app data)
270 +
271 + // archive is **NOT** backup, it is just a zip file that contains data.bin inside.
272 + // We need to unzip it to get the backup.
273 + // data.bin after decryption is available in decryptedData.
274 +
275 + final zip = ZipDecoder();
276 + final decryptedDataStream = InputFileStream(decryptedData.path);
277 + final backupArchive = zip.decodeStream(decryptedDataStream);
278 +
279 +
280 + final appDir = await getAppDir();
281 +
282 + outer:
283 + for (var file in backupArchive.files) {
284 + final filename = file.name;
285 + for (var ignore in $BackupService.ignoreFiles) {
286 + if (filename.endsWith(ignore) && !filename.contains("wallets/")) {
287 + printV("ignoring backup file: $filename");
288 + continue outer;
289 + }
290 + }
291 + printV("restoring: $filename");
292 + if (file.isFile) {
293 + final output = File('${appDir.path}/' + filename)
294 + ..createSync(recursive: true);
295 + final outputStream = OutputFileStream(output.path);
296 + file.writeContent(outputStream);
297 + outputStream.flush();
298 + } else {
299 + final dir = Directory('${appDir.path}/' + filename);
300 + if (!dir.existsSync()) {
301 + dir.createSync(recursive: true);
302 + }
303 + }
304 + };
305 +
306 + // Continue importing the backup the old way
307 + await super.verifyWallets();
308 + await super.importKeychainDumpV2(password);
309 + await super.importPreferencesDump();
310 + await super.importTransactionDescriptionDump();
311 +
312 + // Delete decrypted data file
313 + decryptedData.deleteSync();
314 + }
315 +
316 + Future<File> exportBackupFileV3(String password, {String nonce = secrets.backupSalt}) async {
317 + final metadata = BackupMetadata(
318 + version: BackupVersion.v3,
319 + sha512sum: 'tbd',
320 + chunks: [],
321 + cakeVersion: 'tbd',
322 + );
323 + final zipEncoder = ZipFileEncoder();
324 + final appDir = await getAppDir();
325 + final now = DateTime.now().toIso8601String().replaceAll(':', '-');
326 + final tmpDir = Directory('${appDir.path}/~_BACKUP_TMP');
327 + final archivePath = '${tmpDir.path}/backup_${now}.tmp.zip';
328 + final archivePathExport = '${tmpDir.path}/backup_${now}.zip';
329 + final fileEntities = appDir.listSync(recursive: false);
330 + final keychainDump = await super.exportKeychainDumpV2(password);
331 + final preferencesDump = await super.exportPreferencesJSON();
332 + final preferencesDumpFile = File('${tmpDir.path}/~_preferences_dump_TMP');
333 + final keychainDumpFile = File('${tmpDir.path}/~_keychain_dump_TMP');
334 + final transactionDescriptionDumpFile =
335 + File('${tmpDir.path}/~_transaction_descriptions_dump_TMP');
336 +
337 + final transactionDescriptionData = super.transactionDescriptionBox
338 + .toMap()
339 + .map((key, value) => MapEntry(key.toString(), value.toJson()));
340 + final transactionDescriptionDump = jsonEncode(transactionDescriptionData);
341 +
342 + if (tmpDir.existsSync()) {
343 + tmpDir.deleteSync(recursive: true);
344 + }
345 +
346 + tmpDir.createSync();
347 + zipEncoder.create(archivePath);
348 + outer:
349 + for (var entity in fileEntities) {
350 + if (entity.path == archivePath || entity.path == tmpDir.path) {
351 + continue;
352 + }
353 + for (var ignore in $BackupService.ignoreFiles) {
354 + final filename = entity.absolute.path;
355 + if (filename.endsWith(ignore) && !filename.contains("wallets/")) {
356 + printV("ignoring backup file: $filename");
357 + continue outer;
358 + }
359 + }
360 +
361 + if (entity.statSync().type == FileSystemEntityType.directory) {
362 + await zipEncoder.addDirectory(Directory(entity.path));
363 + } else {
364 + await zipEncoder.addFile(File(entity.path));
365 + }
366 + }
367 + await keychainDumpFile.writeAsBytes(keychainDump.toList());
368 + await preferencesDumpFile.writeAsString(preferencesDump);
369 + await transactionDescriptionDumpFile.writeAsString(transactionDescriptionDump);
370 + await zipEncoder.addFile(preferencesDumpFile, '~_preferences_dump');
371 + await zipEncoder.addFile(keychainDumpFile, '~_keychain_dump');
372 + await zipEncoder.addFile(transactionDescriptionDumpFile, '~_transaction_descriptions_dump');
373 + await zipEncoder.close();
374 +
375 + final dataBinUnencrypted = File(archivePath);
376 +
377 + final dataBin = File('${tmpDir.path}/data.bin');
378 + dataBin.writeAsBytesSync(Uint8List(0), mode: FileMode.write, flush: true);
379 + final dataBinWriter = dataBin.openWrite();
380 +
381 + printV("------ Backup stats ------");
382 + printV("Backup version: ${metadata.version}");
383 + printV("Backup size: ${await dataBinUnencrypted.length()}");
384 + printV("Backup chunks: ${(await dataBinUnencrypted.length()) / chunkSize}");
385 + printV("------ Backup stats ------");
386 +
387 + int chunkIndex = 0;
388 + final stopwatch = Stopwatch()..start();
389 + printV("Starting backup encryption...");
390 +
391 + metadata.sha512sum = (await sha512.bind(dataBinUnencrypted.openRead()).first).toString();
392 +
393 + final raf = await dataBinUnencrypted.open();
394 +
395 +
396 + while (true) {
397 + printV("Reading chunk ${chunkIndex++}");
398 +
399 + stopwatch.reset();
400 + final chunk = await raf.read(chunkSize);
401 + printV("Chunk read completed in ${stopwatch.elapsed}");
402 + printV("Chunk length: ${chunk.length} expected: $chunkSize");
403 + if (chunk.length == 0) {
404 + break;
405 + }
406 +
407 + stopwatch.reset();
408 + final encryptedChunk = await cake_backup.encrypt(password, chunk);
409 + printV("Encryption completed in ${stopwatch.elapsed}");
410 +
411 + stopwatch.reset();
412 + final sha512sumEncryptedChunk = await sha512.bind(Stream.fromIterable([encryptedChunk])).first;
413 + final sha512sumUnencryptedChunk = await sha512.bind(Stream.fromIterable([chunk])).first;
414 + printV("Hashing completed in ${stopwatch.elapsed}");
415 +
416 + stopwatch.reset();
417 + dataBinWriter.add(encryptedChunk);
418 + metadata.chunks.add(ChunkDetails(
419 + sha512sum: ChunkChecksum(
420 + encrypted: sha512sumEncryptedChunk.toString(),
421 + plain: sha512sumUnencryptedChunk.toString(),
422 + ),
423 + length: ChunkLength(
424 + encrypted: encryptedChunk.length,
425 + plain: chunk.length,
426 + ),
427 + ));
428 +
429 + await dataBinWriter.flush();
430 + printV("Writing completed in ${stopwatch.elapsed}");
431 + }
432 + await raf.close();
433 +
434 + // Give the file to the user
435 +
436 + final metadataFile = File('${tmpDir.path}/metadata.json');
437 + final packageInfo = await PackageInfo.fromPlatform();
438 + metadata.cakeVersion = packageInfo.version;
439 +
440 + metadataFile.writeAsStringSync(JsonEncoder.withIndent(' ').convert(metadata.toJson()));
441 + final readmeFile = File('${tmpDir.path}/README.txt');
442 + readmeFile.writeAsStringSync('''This is a ${packageInfo.appName} backup. Do not modify this archive.
443 +
444 +App version: ${packageInfo.version}
445 +
446 +If you have any issues with this backup, please contact our in-app support.
447 +This backup was created on ${DateTime.now().toIso8601String()}
448 +''');
449 + final zip = ZipFileEncoder();
450 + zip.create(archivePathExport, level: 9);
451 + await zip.addFile(dataBin, 'data.bin');
452 + await zip.addFile(metadataFile, 'metadata.json');
453 + await zip.addFile(readmeFile, 'README.txt');
454 + await zip.close();
455 + // tmpDir.deleteSync(recursive: true);
456 + final file = File(archivePathExport);
457 + return file;
458 + }
459 +
460 + static const chunkSize = 24 * 1024 * 1024; // 24MiB
461 +
462 + File setVersionFile(File file, BackupVersion version) {
463 + if (version == BackupVersion.v3) return file; // v3 uses
464 + // helper function to call super.setVersion();
465 + final data = file.readAsBytesSync();
466 + super.setVersion(data, version.index);
467 + file.writeAsBytesSync(data);
468 + return file;
469 + }
470 +}
\ No newline at end of file
lib/di.dart
+4 -3
@@ -11,6 +11,7 @@ import 'package:cake_wallet/buy/dfx/dfx_buy_provider.dart';
11 import 'package:cake_wallet/buy/moonpay/moonpay_provider.dart';
12 import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart';
13 import 'package:cake_wallet/buy/order.dart';
14 +import 'package:cake_wallet/core/backup_service_v3.dart';
15 import 'package:cake_wallet/core/new_wallet_arguments.dart';
16 import 'package:cake_wallet/buy/robinhood/robinhood_buy_provider.dart';
17 import 'package:cake_wallet/core/auth_service.dart';
@@ -1215,12 +1216,12 @@ Future<void> setup({
1216
1217 getIt.registerFactory(() => CakeFeaturesViewModel(getIt.get<CakePayService>()));
1218
1218 - getIt.registerFactory(() => BackupService(getIt.get<SecureStorage>(), _walletInfoSource,
1219 + getIt.registerFactory(() => BackupServiceV3(getIt.get<SecureStorage>(), _walletInfoSource,
1220 _transactionDescriptionBox,
1221 getIt.get<KeyService>(), getIt.get<SharedPreferences>()));
1222
1223 getIt.registerFactory(() => BackupViewModel(
1223 - getIt.get<SecureStorage>(), getIt.get<SecretStore>(), getIt.get<BackupService>()));
1224 + getIt.get<SecureStorage>(), getIt.get<SecretStore>(), getIt.get<BackupServiceV3>()));
1225
1226 getIt.registerFactory(() => BackupPage(getIt.get<BackupViewModel>()));
1227
@@ -1232,7 +1233,7 @@ Future<void> setup({
1233 getIt.registerFactoryParam<RestoreOptionsPage, bool, void>(
1234 (bool isNewInstall, _) => RestoreOptionsPage(isNewInstall: isNewInstall));
1235
1235 - getIt.registerFactory(() => RestoreFromBackupViewModel(getIt.get<BackupService>()));
1236 + getIt.registerFactory(() => RestoreFromBackupViewModel(getIt.get<BackupServiceV3>()));
1237
1238 getIt.registerFactory(() => RestoreFromBackupPage(getIt.get<RestoreFromBackupViewModel>()));
1239
lib/locales/hausa_intl.dart
+2 -1
@@ -825,7 +825,6 @@ class _HaCupertinoLocalizationsDelegate extends LocalizationsDelegate<CupertinoL
825 patterns: haLocaleDatePatterns,
826 symbols: intl.DateSymbols.deserializeFromMap(haDateSymbols),
827 );
828 -
828 return SynchronousFuture<CupertinoLocalizations>(
829 HaCupertinoLocalizations(
830 localeName: localeName,
@@ -847,6 +846,7 @@ class _HaCupertinoLocalizationsDelegate extends LocalizationsDelegate<CupertinoL
846 singleDigitHourFormat: intl.DateFormat('j', localeName),
847 singleDigitMinuteFormat: intl.DateFormat.m(localeName),
848 singleDigitSecondFormat: intl.DateFormat.s(localeName),
849 + weekdayFormat: intl.DateFormat.E(localeName),
850 ),
851 );
852 }
@@ -871,6 +871,7 @@ class HaCupertinoLocalizations extends GlobalCupertinoLocalizations {
871 required super.singleDigitMinuteFormat,
872 required super.doubleDigitMinuteFormat,
873 required super.singleDigitSecondFormat,
874 + required super.weekdayFormat,
875 });
876
877 @override
lib/locales/yoruba_intl.dart
+2
@@ -846,6 +846,7 @@ class _YoCupertinoLocalizationsDelegate extends LocalizationsDelegate<CupertinoL
846 singleDigitHourFormat: intl.DateFormat('j', localeName),
847 singleDigitMinuteFormat: intl.DateFormat.m(localeName),
848 singleDigitSecondFormat: intl.DateFormat.s(localeName),
849 + weekdayFormat: intl.DateFormat.E(localeName),
850 ),
851 );
852 }
@@ -870,6 +871,7 @@ class YoCupertinoLocalizations extends GlobalCupertinoLocalizations {
871 required super.singleDigitMinuteFormat,
872 required super.doubleDigitMinuteFormat,
873 required super.singleDigitSecondFormat,
874 + required super.weekdayFormat,
875 });
876
877 @override
lib/src/screens/backup/backup_page.dart
+2 -3
@@ -137,7 +137,7 @@ class BackupPage extends BasePage {
137 leftButtonText: S.of(context).share,
138 actionRightButton: () async {
139 await backupViewModelBase.saveToDownload(
140 - backup.name, backup.content);
140 + backup.name, backup.file);
141 Navigator.of(dialogContext).pop();
142 },
143 actionLeftButton: () async {
@@ -160,8 +160,7 @@ class BackupPage extends BasePage {
160 fileName: backup.name);
161
162 try {
163 - File returnedFile = File(outputFile!);
164 - await returnedFile.writeAsBytes(backup.content);
163 + await backup.file.copy(outputFile!);
164 } catch (exception, stackTrace) {
165 await ExceptionHandler.onError(FlutterErrorDetails(
166 exception: exception,
lib/view_model/backup_view_model.dart
+23 -13
@@ -1,5 +1,6 @@
1 import 'dart:io';
2 import 'package:cake_wallet/core/backup_service.dart';
3 +import 'package:cake_wallet/core/backup_service_v3.dart';
4 import 'package:cake_wallet/core/execution_state.dart';
5 import 'package:cake_wallet/core/secure_storage.dart';
6 import 'package:cake_wallet/entities/secret_store_key.dart';
@@ -15,10 +16,10 @@ import 'package:path_provider/path_provider.dart';
16 part 'backup_view_model.g.dart';
17
18 class BackupExportFile {
18 - BackupExportFile(this.content, {required this.name});
19 + BackupExportFile(this.file, {required this.name});
20
21 final String name;
21 - final List<int> content;
22 + final File file;
23 }
24
25 class BackupViewModel = BackupViewModelBase with _$BackupViewModel;
@@ -38,7 +39,7 @@ abstract class BackupViewModelBase with Store {
39
40 final SecureStorage secureStorage;
41 final SecretStore secretStore;
41 - final BackupService backupService;
42 + final BackupServiceV3 backupService;
43
44 @observable
45 ExecutionState state;
@@ -59,14 +60,14 @@ abstract class BackupViewModelBase with Store {
60 Future<BackupExportFile?> exportBackup() async {
61 try {
62 state = IsExecutingState();
62 - final backupContent = await backupService.exportBackup(backupPassword);
63 + final backupFile = await backupService.exportBackupFile(backupPassword);
64 state = ExecutedSuccessfullyState();
65 final now = DateTime.now();
66 final formatter = DateFormat('yyyy-MM-dd_Hm');
67 final snakeAppName = approximatedAppName.replaceAll(' ', '_').toLowerCase();
67 - final fileName = '${snakeAppName}_backup_${formatter.format(now)}';
68 + final fileName = '${snakeAppName}_backup_${formatter.format(now)}.zip';
69
69 - return BackupExportFile(backupContent.toList(), name: fileName);
70 + return BackupExportFile(backupFile, name: fileName);
71 } catch (e) {
72 printV(e.toString());
73 state = FailureState(e.toString());
@@ -77,26 +78,35 @@ abstract class BackupViewModelBase with Store {
78 Future<String> saveBackupFileLocally(BackupExportFile backup) async {
79 final appDir = await getAppDir();
80 final path = '${appDir.path}/${backup.name}';
80 - final backupFile = File(path);
81 - await backupFile.writeAsBytes(backup.content);
81 + if (File(path).existsSync()) {
82 + File(path).deleteSync();
83 + }
84 + await backup.file.copy(path);
85 return path;
86 }
87
88 Future<void> removeBackupFileLocally(BackupExportFile backup) async {
89 final appDir = await getAppDir();
90 final path = '${appDir.path}/${backup.name}';
88 - final backupFile = File(path);
89 - await backupFile.delete();
91 + if (File(path).existsSync()) {
92 + File(path).deleteSync();
93 + }
94 }
95
96 @action
97 void showMasterPassword() => isBackupPasswordVisible = true;
98
99 @action
96 - Future<void> saveToDownload(String name, List<int> content) async {
100 + Future<void> saveToDownload(String name, File file) async {
101 + if (!Platform.isAndroid) {
102 + return;
103 + }
104 const downloadDirPath = '/storage/emulated/0/Download'; // For Android
105 final filePath = '$downloadDirPath/${name}';
99 - final file = File(filePath);
100 - await file.writeAsBytes(content);
106 + final downloadFile = File(filePath);
107 + if (downloadFile.existsSync()) {
108 + downloadFile.deleteSync();
109 + }
110 + await file.copy(filePath);
111 }
112 }
lib/view_model/restore_from_backup_view_model.dart
+3 -3
@@ -1,4 +1,5 @@
1 import 'dart:io';
2 +import 'package:cake_wallet/core/backup_service_v3.dart';
3 import 'package:cake_wallet/core/execution_state.dart';
4 import 'package:cake_wallet/utils/exception_handler.dart';
5 import 'package:flutter/material.dart';
@@ -20,7 +21,7 @@ abstract class RestoreFromBackupViewModelBase with Store {
21 : state = InitialExecutionState(),
22 filePath = '';
23
23 - final BackupService backupService;
24 + final BackupServiceV3 backupService;
25
26 @observable
27 String filePath;
@@ -42,10 +43,9 @@ abstract class RestoreFromBackupViewModelBase with Store {
43 }
44
45 final file = File(filePath);
45 - final data = await file.readAsBytes();
46
47
48 - await backupService.importBackup(data, password);
48 + await backupService.importBackupFile(file, password);
49
50 try {
51 await initializeAppAtRoot(reInitializing: true);
pubspec_base.yaml
+6 -7
@@ -45,7 +45,7 @@ dependencies:
45 url: https://github.com/MrCyjaneK/uni_links
46 ref: 8e9efa4d9beb19e4ac44009576337f1ce51c22e2
47 path: uni_links
48 - lottie: ^1.3.0
48 + lottie: ^3.3.1
49 animate_do: ^2.1.0
50 cupertino_icons: ^1.0.5
51 encrypt: 5.0.2
@@ -57,13 +57,13 @@ dependencies:
57 connectivity_plus: ^5.0.2
58 keyboard_actions: ^4.0.1
59 another_flushbar: ^1.12.29
60 - archive: ^3.3.0
60 + archive: ^4.0.3
61 cryptography: ^2.0.5
62 file_picker:
63 git:
64 url: https://github.com/cake-tech/flutter_file_picker.git
65 - ref: master
66 - permission_handler: ^10.0.0
65 + ref: c414574bc5ac349450f601e7f72c7b9f31b4d087
66 + permission_handler: 11.4.0
67 device_display_brightness:
68 git:
69 url: https://github.com/MrCyjaneK/device_display_brightness.git
@@ -72,7 +72,7 @@ dependencies:
72 flutter_mailer:
73 git:
74 url: https://github.com/taljacobson/flutter_mailer
75 - ref: 2a7d04d61f56e1ca166ab42e91e0daf1bfddfaf2
75 + ref: 9c4ed111a9151a2bbfb9afe2c18a37599c6f84f3
76 device_info_plus: ^9.1.0
77 base32: 2.1.3
78 in_app_review: ^2.0.6
@@ -96,7 +96,7 @@ dependencies:
96 git:
97 url: https://github.com/cake-tech/ens_dart.git
98 ref: main
99 - fluttertoast: 8.2.8
99 + fluttertoast: 8.2.12
100 # tor:
101 # git:
102 # url: https://github.com/cake-tech/tor.git
@@ -142,7 +142,6 @@ dev_dependencies:
142 git:
143 url: https://github.com/cake-tech/google-translator.git
144 version: 1.0.0
145 - archive: ^3.6.1
145
146 dependency_overrides:
147 bech32:
scripts/linux/.fvmrc
+1 -1
@@ -1,3 +1,3 @@
1 {
2 - "flutter": "3.24.0"
2 + "flutter": "3.27.4"
3 }
\ No newline at end of file
scripts/windows/Dockerfile.windows
+1 -1
@@ -4,7 +4,7 @@
4
5 FROM mcr.microsoft.com/windows/servercore:ltsc2022
6
7 -ENV FLUTTER_VERSION=3.24.0
7 +ENV FLUTTER_VERSION=3.27.4
8 ENV GIT_VERSION=2.47.1
9 ENV VS_INSTALLED_DIR="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools"
10 ENV PATH="C:\Users\ContainerAdministrator\.cargo\bin;C:\ProgramData\chocolatey\bin;C:\flutter\flutter\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Users\ContainerAdministrator\AppData\Local\Microsoft\WindowsApps"
tool/download_moneroc_prebuilds.dart
+1 -1
@@ -47,7 +47,7 @@ Future<void> main() async {
47 if (localFilename.endsWith(".xz")) {
48 printV(" extracting $localFilename");
49 final inputStream = InputFileStream(localFilename);
50 - final archive = XZDecoder().decodeBuffer(inputStream);
50 + final archive = XZDecoder().decodeBytes(inputStream.toUint8List());
51 final outputStream = OutputFileStream(localFilename.replaceAll(".xz", ""));
52 outputStream.writeBytes(archive);
53 }