-## Open Source Multi-Currency Wallet
+
-## Links
+
-* Website: https://cakewallet.com
-* App Store (iOS / MacOS): https://cakewallet.com/ios
-* Google Play: https://cakewallet.com/gp
-* F-Droid: https://fdroid.cakelabs.com
-* APK: https://github.com/cake-tech/cake_wallet/releases
-* Linux: https://github.com/cake-tech/cake_wallet/releases
+
+
+
+
+[

](https://apps.apple.com/us/app/cake-wallet/id1334702542?platform=iphone)
+[

](https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet)
+[

](https://fdroid.cakelabs.com)
+[

](https://apps.apple.com/us/app/cake-wallet/id1334702542?platform=mac)
+[

](https://github.com/cake-tech/cake_wallet/releases)
+
+
+
+# Cake Wallet
+
+[Cake Wallet](https://cakewallet.com) is an open-source, non-custodial, and private multi-currency crypto wallet for Android, iOS, macOS, and Linux.
+
+Cake Wallet includes support for several cryptocurrencies, including:
+* Monero (XMR)
+* Bitcoin (BTC)
+* Ethereum (ETH)
+* Litecoin (LTC)
+* Bitcoin Cash (BCH)
+* Polygon (POL)
+* Solana (SOL)
+* Tron (TRX)
+* Nano (XNO)
+* Zano (ZANO)
+* Decred (DCR)
+* Wownero (WOW)
## Features
@@ -24,7 +47,7 @@
* Create several wallets
* Select your own custom nodes/servers
* Address book
-* Backup to external location or iCloud
+* Backup to an external location or iCloud
* Send to OpenAlias, Unstoppable Domains, Yats, and FIO Crypto Handles
* Set desired network fee level
* Store local transaction notes
@@ -61,10 +84,6 @@
* Automatically generate new addresses
* Specify multiple recipients for batch sending
-### Haven Specific Features
-
-* Send, receive, and store XHV and all xAssets like xUSD, xEUR, xAG, etc.
-
# Monero.com by Cake Wallet for Android and iOS
## Open Source Monero-Only Wallet
@@ -79,6 +98,17 @@
* F-Droid: https://fdroid.cakelabs.com
* APK: https://github.com/cake-tech/cake_wallet/releases
+### APK Verification
+
+APK releases on GitHub, Accrescent, and F-Droid use the same key. They can easily be verified using [apksigner](https://developer.android.com/tools/apksigner#options-verify) or [AppVerifier](https://github.com/soupslurpr/AppVerifier).
+
+See below for Cake Wallet's SHA-256 signing certificate hash:
+
+```
+com.cakewallet.cake_wallet
+C5:40:53:AB:0F:10:D9:54:17:62:A3:DA:76:65:AE:3D:BA:5E:7C:74:3A:B4:F1:08:A5:34:9D:62:AC:10:6E:F5
+```
+
# Support
We have 24/7 free support. Please contact support@cakewallet.com
@@ -141,7 +171,9 @@ The only parts to be translated, if needed, are the values m and s after the var
4. Add the language to `lib/entities/language_service.dart` under both `supportedLocales` and `localeCountryCode`. Use the name of the language in the local language and in English in parentheses after for `supportedLocales`. Use the [ISO 3166-1 alpha-3 code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) for `localeCountryCode`. You must choose one country, so choose the country with the most native speakers of this language or is otherwise best associated with this language.
-5. Add a relevant flag to `assets/images/flags/XXXX.png`, replacing XXXX with the 3 digit localeCountryCode. The image must be 42x26 pixels with a 3 pixels of transparent margin on all 4 sides. You can resize the flag with [paint.net](https://www.getpaint.net/) to 36x20 pixels, expand the canvas to 42x26 pixels with the flag anchored in the middle, and then manually delete the 3 pixels on each side to make transparent. Or you can use another program like Photoshop.
+5. Add a relevant flag to `assets/images/flags/XXXX.png`, replacing XXXX with the 3 letters localeCountryCode. The image must be 42x26 pixels with 3 pixels of transparent margin on all 4 sides. You can resize the flag with [paint.net](https://www.getpaint.net/) to 36x20 pixels, expand the canvas to 42x26 pixels with the flag anchored in the middle, and then manually delete the 3 pixels on each side to make it transparent. Or you can use another program like Photoshop.
+
+6. Add the new language code to `tool/utils/translation/translation_constants.dart`
## Add a new fiat currency
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 396904041..bd35233ba 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,5 +1,6 @@
include: package:lints/recommended.yaml
+
analyzer:
exclude: [
build/**,
@@ -10,7 +11,19 @@ analyzer:
lib/generated/*.dart,
cw_monero/ios/External/**,
cw_shared_external/**,
- shared_external/**]
+ shared_external/**,
+ lib/bitcoin/cw_bitcoin.dart,
+ lib/bitcoin_cash/cw_bitcoin_cash.dart,
+ lib/ethereum/cw_ethereum.dart,
+ lib/haven/cw_haven.dart,
+ lib/monero/cw_monero.dart,
+ lib/nano/cw_nano.dart,
+ lib/polygon/cw_polygon.dart,
+ lib/solana/cw_solana.dart,
+ lib/tron/cw_tron.dart,
+ lib/wownero/cw_wownero.dart,
+ lib/zano/cw_zano.dart,
+ ]
language:
strict-casts: true
strict-raw-types: true
@@ -72,4 +85,4 @@ linter:
# - unawaited_futures
# - unnecessary_getters_setters
# - unrelated_type_equality_checks
-# - valid_regexps
\ No newline at end of file
+# - valid_regexps
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 5e27aeb9e..4a8045bb3 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,3 +1,9 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
@@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) {
}
}
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
@@ -21,9 +22,6 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
-apply plugin: 'com.android.application'
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
@@ -37,16 +35,27 @@ if (appPropertiesFile.exists()) {
}
android {
- compileSdkVersion 34
+ compileSdkVersion 35
+ buildToolsVersion "35.0.0"
lintOptions {
disable 'InvalidPackage'
}
+ compileOptions {
+ coreLibraryDesugaringEnabled true
+
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+
+
+ namespace "com.cakewallet.cake_wallet"
+
defaultConfig {
applicationId appProperties['id']
minSdkVersion 24
- targetSdkVersion 33
+ targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -72,15 +81,14 @@ android {
buildTypes {
release {
signingConfig signingConfigs.release
-
- shrinkResources false
- minifyEnabled false
-
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
+ debug {
+ signingConfig signingConfigs.release
+ }
}
- ndkVersion "25.1.8937393"
+ ndkVersion "27.0.12077973"
}
flutter {
@@ -91,5 +99,10 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
- implementation 'com.unstoppabledomains:resolution:5.0.0'
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
+}
+configurations {
+ implementation.exclude module:'proto-google-common-protos'
+ implementation.exclude module:'protolite-well-known-types'
+ implementation.exclude module:'protobuf-javalite'
}
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
index d24d7f10a..a733bae9e 100644
--- a/android/app/proguard-rules.pro
+++ b/android/app/proguard-rules.pro
@@ -5,4 +5,98 @@
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
--dontwarn io.flutter.embedding.**
\ No newline at end of file
+-dontwarn io.flutter.embedding.**
+-dontwarn com.google.android.play.core.splitcompat.SplitCompatApplication
+
+# start reown
+-dontwarn com.github.luben.zstd.BufferPool
+-dontwarn com.github.luben.zstd.ZstdInputStream
+-dontwarn com.github.luben.zstd.ZstdOutputStream
+-dontwarn com.google.api.client.http.GenericUrl
+-dontwarn com.google.api.client.http.HttpHeaders
+-dontwarn com.google.api.client.http.HttpRequest
+-dontwarn com.google.api.client.http.HttpRequestFactory
+-dontwarn com.google.api.client.http.HttpResponse
+-dontwarn com.google.api.client.http.HttpTransport
+-dontwarn com.google.api.client.http.javanet.NetHttpTransport$Builder
+-dontwarn com.google.api.client.http.javanet.NetHttpTransport
+-dontwarn java.awt.Color
+-dontwarn java.awt.Dimension
+-dontwarn java.awt.Graphics2D
+-dontwarn java.awt.Graphics
+-dontwarn java.awt.Image
+-dontwarn java.awt.Point
+-dontwarn java.awt.Polygon
+-dontwarn java.awt.Shape
+-dontwarn java.awt.color.ColorSpace
+-dontwarn java.awt.geom.AffineTransform
+-dontwarn java.awt.image.BufferedImage
+-dontwarn java.awt.image.ColorModel
+-dontwarn java.awt.image.ComponentColorModel
+-dontwarn java.awt.image.ComponentSampleModel
+-dontwarn java.awt.image.DataBuffer
+-dontwarn java.awt.image.DataBufferByte
+-dontwarn java.awt.image.DataBufferInt
+-dontwarn java.awt.image.DataBufferUShort
+-dontwarn java.awt.image.ImageObserver
+-dontwarn java.awt.image.MultiPixelPackedSampleModel
+-dontwarn java.awt.image.Raster
+-dontwarn java.awt.image.RenderedImage
+-dontwarn java.awt.image.SampleModel
+-dontwarn java.awt.image.SinglePixelPackedSampleModel
+-dontwarn java.awt.image.WritableRaster
+-dontwarn java.beans.BeanInfo
+-dontwarn java.beans.FeatureDescriptor
+-dontwarn java.beans.IntrospectionException
+-dontwarn java.beans.Introspector
+-dontwarn java.beans.PropertyDescriptor
+-dontwarn java.lang.reflect.InaccessibleObjectException
+-dontwarn javax.imageio.IIOImage
+-dontwarn javax.imageio.ImageIO
+-dontwarn javax.imageio.ImageWriteParam
+-dontwarn javax.imageio.ImageWriter
+-dontwarn javax.imageio.metadata.IIOMetadata
+-dontwarn javax.imageio.stream.ImageOutputStream
+-dontwarn javax.swing.JComponent
+-dontwarn javax.swing.JFileChooser
+-dontwarn javax.swing.JFrame
+-dontwarn javax.swing.JPanel
+-dontwarn javax.swing.ProgressMonitor
+-dontwarn javax.swing.SwingUtilities
+-dontwarn org.brotli.dec.BrotliInputStream
+-dontwarn org.joda.time.Instant
+-dontwarn org.objectweb.asm.AnnotationVisitor
+-dontwarn org.objectweb.asm.Attribute
+-dontwarn org.objectweb.asm.ClassReader
+-dontwarn org.objectweb.asm.ClassVisitor
+-dontwarn org.objectweb.asm.FieldVisitor
+-dontwarn org.objectweb.asm.Label
+-dontwarn org.objectweb.asm.MethodVisitor
+-dontwarn org.objectweb.asm.Type
+-dontwarn org.tukaani.xz.ARMOptions
+-dontwarn org.tukaani.xz.ARMThumbOptions
+-dontwarn org.tukaani.xz.DeltaOptions
+-dontwarn org.tukaani.xz.FilterOptions
+-dontwarn org.tukaani.xz.FinishableOutputStream
+-dontwarn org.tukaani.xz.FinishableWrapperOutputStream
+-dontwarn org.tukaani.xz.IA64Options
+-dontwarn org.tukaani.xz.LZMA2InputStream
+-dontwarn org.tukaani.xz.LZMA2Options
+-dontwarn org.tukaani.xz.LZMAInputStream
+-dontwarn org.tukaani.xz.LZMAOutputStream
+-dontwarn org.tukaani.xz.MemoryLimitException
+-dontwarn org.tukaani.xz.PowerPCOptions
+-dontwarn org.tukaani.xz.SPARCOptions
+-dontwarn org.tukaani.xz.SingleXZInputStream
+-dontwarn org.tukaani.xz.UnsupportedOptionsException
+-dontwarn org.tukaani.xz.X86Options
+-dontwarn org.tukaani.xz.XZ
+-dontwarn org.tukaani.xz.XZInputStream
+-dontwarn org.tukaani.xz.XZOutputStream
+-dontwarn us.hebi.matlab.mat.ejml.Mat5Ejml
+-dontwarn us.hebi.matlab.mat.format.Mat5
+-dontwarn us.hebi.matlab.mat.format.Mat5File
+-dontwarn us.hebi.matlab.mat.types.Array
+-dontwarn us.hebi.matlab.mat.types.MatFile$Entry
+-dontwarn us.hebi.matlab.mat.types.MatFile
+# end reown
\ No newline at end of file
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index dc767a55d..f880684a6 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -1,5 +1,4 @@
-