diff --git a/.github/workflows/cache_dependencies.yml b/.github/workflows/cache_dependencies.yml
index 5373bbc87..bf0d0f7bc 100644
--- a/.github/workflows/cache_dependencies.yml
+++ b/.github/workflows/cache_dependencies.yml
@@ -14,7 +14,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
- java-version: '8.x'
+ java-version: '11.x'
- name: Flutter action
uses: subosito/flutter-action@v1
diff --git a/.github/workflows/pr_test_build.yml b/.github/workflows/pr_test_build.yml
index c8827d545..d74b85ce4 100644
--- a/.github/workflows/pr_test_build.yml
+++ b/.github/workflows/pr_test_build.yml
@@ -2,11 +2,10 @@ name: PR Test Build
on:
pull_request:
- branches: [ main ]
+ branches: [main]
jobs:
PR_test_build:
-
runs-on: ubuntu-20.04
env:
STORE_PASS: test@cake_wallet
@@ -23,12 +22,12 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
- java-version: '8.x'
+ java-version: "11.x"
- name: Flutter action
uses: subosito/flutter-action@v1
with:
- flutter-version: '3.10.x'
+ flutter-version: "3.10.x"
channel: stable
- name: Install package dependencies
@@ -39,10 +38,13 @@ jobs:
sudo mkdir -p /opt/android
sudo chown $USER /opt/android
cd /opt/android
+ -y curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+ cargo install cargo-ndk
git clone https://github.com/cake-tech/cake_wallet.git --branch $GITHUB_HEAD_REF
cd cake_wallet/scripts/android/
./install_ndk.sh
source ./app_env.sh cakewallet
+ chmod +x pubspec_gen.sh
./app_config.sh
- name: Cache Externals
@@ -93,6 +95,7 @@ jobs:
cd cw_bitcoin && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
cd cw_haven && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
cd cw_ethereum && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
+ cd cw_bitcoin_cash && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
cd cw_nano && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
flutter packages pub run build_runner build --delete-conflicting-outputs
@@ -129,6 +132,10 @@ jobs:
echo "const payfuraApiKey = '${{ secrets.PAYFURA_API_KEY }}';" >> lib/.secrets.g.dart
echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_ethereum/lib/.secrets.g.dart
echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart
+ echo "const exolixApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
+ echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart
+ echo "const robinhoodCIdApiSecret = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
+ echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart
- name: Rename app
run: echo -e "id=com.cakewallet.test\nname=$GITHUB_HEAD_REF" > /opt/android/cake_wallet/android/app.properties
@@ -138,18 +145,18 @@ jobs:
cd /opt/android/cake_wallet
flutter build apk --release
-# - name: Push to App Center
-# run: |
-# echo 'Installing App Center CLI tools'
-# npm install -g appcenter-cli
-# echo "Publishing test to App Center"
-# appcenter distribute release \
-# --group "Testers" \
-# --file "/opt/android/cake_wallet/build/app/outputs/apk/release/app-release.apk" \
-# --release-notes ${GITHUB_HEAD_REF} \
-# --app Cake-Labs/Cake-Wallet \
-# --token ${{ secrets.APP_CENTER_TOKEN }} \
-# --quiet
+# - name: Push to App Center
+# run: |
+# echo 'Installing App Center CLI tools'
+# npm install -g appcenter-cli
+# echo "Publishing test to App Center"
+# appcenter distribute release \
+# --group "Testers" \
+# --file "/opt/android/cake_wallet/build/app/outputs/apk/release/app-release.apk" \
+# --release-notes ${GITHUB_HEAD_REF} \
+# --app Cake-Labs/Cake-Wallet \
+# --token ${{ secrets.APP_CENTER_TOKEN }} \
+# --quiet
- name: Rename apk file
run: |
@@ -169,6 +176,6 @@ jobs:
token: ${{ secrets.SLACK_APP_TOKEN }}
path: /opt/android/cake_wallet/build/app/outputs/apk/release/app-release.apk
channel: ${{ secrets.SLACK_APK_CHANNEL }}
- title: '${{github.head_ref}}.apk'
+ title: "${{github.head_ref}}.apk"
filename: ${{github.head_ref}}.apk
initial_comment: ${{ github.event.head_commit.message }}
diff --git a/.gitignore b/.gitignore
index 09583004b..c735d4058 100644
--- a/.gitignore
+++ b/.gitignore
@@ -124,6 +124,8 @@ lib/bitcoin/bitcoin.dart
lib/monero/monero.dart
lib/haven/haven.dart
lib/ethereum/ethereum.dart
+lib/bitcoin_cash/bitcoin_cash.dart
+lib/nano/nano.dart
ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_180.png
ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_120.png
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 946c53697..e6b9eb2f8 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -75,7 +75,6 @@ android {
shrinkResources false
minifyEnabled false
- useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
diff --git a/android/app/src/main/AndroidManifestBase.xml b/android/app/src/main/AndroidManifestBase.xml
index b40aeb7c8..910149f60 100644
--- a/android/app/src/main/AndroidManifestBase.xml
+++ b/android/app/src/main/AndroidManifestBase.xml
@@ -3,6 +3,7 @@
+
@@ -25,10 +26,6 @@
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
android:exported="true">
-
@@ -46,6 +43,7 @@
+
@@ -55,6 +53,15 @@
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/drawable/ic_launcher_adaptive_back.xml b/android/app/src/main/res/drawable/ic_launcher_adaptive_back.xml
new file mode 100644
index 000000000..ca3826a46
--- /dev/null
+++ b/android/app/src/main/res/drawable/ic_launcher_adaptive_back.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
index 304732f88..50af1a418 100644
--- a/android/app/src/main/res/drawable/launch_background.xml
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -1,12 +1,6 @@
-
-
-
-
-
+ -
+
+
diff --git a/android/build.gradle b/android/build.gradle
index bd4ebd770..8286d9cb9 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,12 +1,12 @@
buildscript {
- ext.kotlin_version = '1.6.21'
+ ext.kotlin_version = '1.7.10'
repositories {
google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.1.3'
+ classpath 'com.android.tools.build:gradle:7.3.0'
classpath 'com.google.gms:google-services:4.3.8'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
diff --git a/android/gradle.properties b/android/gradle.properties
index a5965ab8d..38c8d4544 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,4 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
-android.enableJetifier=true
\ No newline at end of file
+android.enableJetifier=true
diff --git a/assets/bitcoin_cash_electrum_server_list.yml b/assets/bitcoin_cash_electrum_server_list.yml
new file mode 100644
index 000000000..d76668169
--- /dev/null
+++ b/assets/bitcoin_cash_electrum_server_list.yml
@@ -0,0 +1,3 @@
+-
+ uri: bitcoincash.stackwallet.com:50002
+ is_default: true
\ No newline at end of file
diff --git a/assets/faq/faq_de.json b/assets/faq/faq_de.json
index be9b567b7..14d703e4f 100644
--- a/assets/faq/faq_de.json
+++ b/assets/faq/faq_de.json
@@ -1,7 +1,7 @@
[
{
"question" : "Was ist der Unterschied zwischen verfügbarem Guthaben und vollständigem Guthaben?",
- "answer" : "Nachdem Sie eine Transaktion getätigt oder Monero erhalten haben, muss die Transaktion noch bestätigt werden. In ungefähr 20 Minuten sollte Ihr \"verfügbares Guthaben\" aktualisiert werden!\nWenn Sie Monero senden, verringert sich manchmal Ihr verfügbares Guthaben um mehr als den Betrag, den Sie gesendet haben. Dies ist normal und zum Schutz Ihrer Privatsphäre erforderlich. Ihr \"vollständiges Gleichgewicht\" sollte in 20 Minuten wieder normal sein.\n"
+ "answer" : "Nachdem Sie eine Transaktion getätigt oder Monero erhalten haben, muss die Transaktion noch bestätigt werden. In ungefähr 20 Minuten sollte Ihr \"verfügbares Guthaben\" aktualisiert werden!\nWenn Sie Monero senden, verringert sich manchmal Ihr verfügbares Guthaben um mehr als den Betrag, den Sie gesendet haben. Dies ist normal und zum Schutz Ihrer Privatsphäre erforderlich. Ihr \"vollständiges Guthaben\" sollte in 20 Minuten wieder normal sein.\n"
},
{
"question" : "Wie sende ich Monero an eine Börse, für die eine Zahlungs-ID erforderlich ist?",
@@ -12,24 +12,24 @@
"answer" : "Obwohl unser Support Sie bei diesem Problem nicht direkt unterstützen kann, ist es ein sehr häufiges Problem, mit dem die meisten Börsen vertraut sind. Wenden Sie sich einfach an den Support der Börse, erklären Sie, dass Sie vergessen haben, Ihre Zahlungs-ID anzugeben, und senden Sie ihnen dann Ihre Transaktions-ID als Nachweis. Sie finden die Transaktions-ID, indem Sie auf die Transaktion in Ihrem Wallet-Bildschirm tippen.\n"
},
{
- "question" : "Was bedeuten \"Samen\" und \"Schlüssel\"?",
- "answer" : "Ihre Schlüssel verschlüsseln die privaten Informationen in Ihrer Brieftasche und ermöglichen es Ihnen, Münzen auszugeben und eingehende Transaktionen anzuzeigen.\nIhr Startwert ist nur eine Version Ihres privaten Schlüssels, die so geschrieben wurde, dass Sie sie leichter notieren können. Ihr Same und Schlüssel sind tatsächlich dasselbe, nur in verschiedenen Formen!\nGeben Sie niemals Ihren Samen oder Schlüssel an jemanden weiter. Ihr Geld wird gestohlen, wenn Sie Ihren Samen oder Schlüssel herausgeben. Bitte notieren Sie sich jedoch Ihren Samen und bewahren Sie ihn an einem sicheren Ort auf (so können Sie Ihre Brieftasche wiederherstellen, wenn Sie Ihr Telefon verlieren.)\n"
+ "question" : "Was bedeuten \"Seed\" und \"Schlüssel\"?",
+ "answer" : "Ihre Schlüssel verschlüsseln die privaten Informationen in Ihrer Brieftasche und ermöglichen es Ihnen, Münzen auszugeben und eingehende Transaktionen anzuzeigen.\nIhr Startwert ist nur eine Version Ihres privaten Schlüssels, die so geschrieben wurde, dass Sie sie leichter notieren können. Ihr Same und Schlüssel sind tatsächlich dasselbe, nur in verschiedenen Formen!\nGeben Sie niemals Ihren Seed oder Schlüssel an jemanden weiter. Ihr Geld wird gestohlen, wenn Sie Ihren Seed oder Schlüssel herausgeben. Bitte notieren Sie sich jedoch Ihren Seed und bewahren Sie ihn an einem sicheren Ort auf (so können Sie Ihr Wallet wiederherstellen, wenn Sie Ihr Telefon verlieren.)\n"
},
{
"question" : "Wie viele Geldbörsen kann ich erstellen?",
"answer" : "Es gibt keine Grenzen! Sie können so viele Brieftaschen erstellen, wie Sie möchten.\n"
},
{
- "question" : "Wie kann ich meine Brieftasche wiederherstellen?",
- "answer" : "Tippen Sie auf das Menü •••, wählen Sie „Brieftaschen“ und dann „Brieftasche wiederherstellen“. Geben Sie dann Ihren Startwert (oder Ihre Schlüssel) und optional ein Datum vor der ersten Transaktion in Ihrer Brieftasche ein (dies beschleunigt den Synchronisierungsvorgang) .) Möglicherweise müssen Sie die App 15 bis 30 Minuten geöffnet lassen, um Ihr Portemonnaie vollständig wiederherzustellen.\n"
+ "question" : "Wie kann ich mein Wallet wiederherstellen?",
+ "answer" : "Tippen Sie auf das Menü •••, wählen Sie „Wallest“ und dann „Wallet wiederherstellen“. Geben Sie dann Ihren Seed (oder Ihre Schlüssel) und optional ein Datum vor der ersten Transaktion in Ihrem Wallet ein (dies beschleunigt den Synchronisierungsvorgang) .) Möglicherweise müssen Sie die App 15 bis 30 Minuten geöffnet lassen, um Ihr Wallet vollständig wiederherzustellen.\n"
},
{
- "question" : "Was kann ich tun, wenn ich meinen Samen verliere?",
- "answer" : "Wenn Sie Ihren Samen vergessen haben, haben Sie ihn wahrscheinlich irgendwo aufgeschrieben. Bitte überprüfen Sie Ihre Notizen und schauen Sie sich auf Ihrem Computer um. Wenn Sie es nirgendwo finden, haben Sie möglicherweise Cake Wallet gesichert (in diesem Fall können Sie es aus diesem Backup wiederherstellen.) Wenn keines dieser Probleme auftritt, können wir leider nichts tun.\n"
+ "question" : "Was kann ich tun, wenn ich meinen Seed verliere?",
+ "answer" : "Wenn Sie Ihren Seed vergessen haben, haben Sie ihn wahrscheinlich irgendwo aufgeschrieben. Bitte überprüfen Sie Ihre Notizen und schauen Sie sich auf Ihrem Computer um. Wenn Sie es nirgendwo finden, haben Sie möglicherweise Cake Wallet gesichert (in diesem Fall können Sie es aus diesem Backup wiederherstellen.) Wenn keines dieser Probleme auftritt, können wir leider nichts tun.\n"
},
{
- "question" : "Sammeln Sie Informationen zu meiner Brieftasche?",
- "answer" : "Cake Wallet sammelt oder zeichnet keine Informationen über Ihre Brieftasche auf. Ihre Privatsphäre ist uns wichtig.\n"
+ "question" : "Sammeln Sie Informationen zu meinem Wallet?",
+ "answer" : "Cake Wallet sammelt oder zeichnet keine Informationen über Ihr Wallet auf. Ihre Privatsphäre ist uns wichtig.\n"
},
{
"question" : "Kann ich eine Transaktion stornieren?",
@@ -37,7 +37,7 @@
},
{
"question" : "Was sind Subadressen und wie verwende ich sie?",
- "answer" : "Eine Unteradresse ist im Grunde eine eindeutige Adresse, die Sie jederzeit generieren können. An sie gesendete Münzen landen weiterhin in Ihrer Hauptbrieftasche, aber die Person, die die Münzen sendet, kann Ihre Hauptadresse nicht ermitteln. Unteradressen beginnen immer mit „8“.\nSie können eine neue Unteradresse im Empfangsbildschirm erstellen, indem Sie auf das „+“ neben der Schaltfläche Unteradressen tippen. Geben Sie einen Namen für die Unteradresse ein und tippen Sie auf \"Hinzufügen\". Dann tippen Sie einfach auf den Namen der Subadresse, wenn Sie ihn verwenden möchten!\nWenn Sie paranoid sind, sollten Sie wahrscheinlich jedes Mal, wenn Sie Monero erhalten, eine neue Unteradresse erstellen.\n"
+ "answer" : "Eine Unteradresse ist im Grunde eine eindeutige Adresse, die Sie jederzeit generieren können. An sie gesendete Münzen landen weiterhin in Ihrer Hauptwallet, aber die Person, die die Coins sendet, kann Ihre Hauptadresse nicht ermitteln. Unteradressen beginnen immer mit „8“.\nSie können eine neue Unteradresse im Empfangsbildschirm erstellen, indem Sie auf das „+“ neben der Schaltfläche Unteradressen tippen. Geben Sie einen Namen für die Unteradresse ein und tippen Sie auf \"Hinzufügen\". Dann tippen Sie einfach auf den Namen der Subadresse, wenn Sie ihn verwenden möchten!\nWenn Sie paranoid sind, sollten Sie wahrscheinlich jedes Mal, wenn Sie Monero erhalten, eine neue Unteradresse erstellen.\n"
},
{
"question" : "Was ist eine Transaktions-ID?",
@@ -48,11 +48,11 @@
"answer" : "Wenn Sie Ihren Monero nicht erhalten haben, möchten Sie möglicherweise auf das Menü ••• tippen und auf Reconnect (Neu verbinden) klicken. Wenn dies nicht funktioniert, gehen Sie in das Einstellungsmenü, tippen Sie auf das Feld \"Aktueller Knoten\" und wählen Sie einen Knoten mit einem grünen Punkt daneben aus.\n"
},
{
- "question" : "Ich habe in der App keine Münzen aus dem Umtausch erhalten. Was kann ich tun?",
- "answer" : "Wenn Sie Probleme mit einem Austausch haben, wenden Sie sich am besten an den Austausch. Wir sind eine Partnerschaft mit XMR.TO, Morph und ChangeNow eingegangen. Rufen Sie daher am besten http://xmr.to, http://changenow.io oder http://morphtoken.com auf und wenden Sie sich an deren Support.\n"
+ "question" : "Ich habe in der App keine Coins aus dem Umtausch erhalten. Was kann ich tun?",
+ "answer" : "Wenn Sie Probleme mit einem Austausch haben, besteht die beste Option, den Austausch selbst zu kontaktieren. Wir haben uns mit Chechenow, Simpleswap, Sideshift und Trocador zusammengetan. Am besten wechseln Sie zu https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ und kontaktieren Sie ihre Unterstützung.\n"
},
{
"question" : "Wie kontaktiere ich den Cake Wallet-Support?",
"answer" : "Senden Sie eine E-Mail an support@cakewallet.com, schließen Sie sich dem Telegramm unter @cakewallet_bot an oder twittern Sie @CakeWalletXMR!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_en.json b/assets/faq/faq_en.json
index aae40802c..741d31798 100644
--- a/assets/faq/faq_en.json
+++ b/assets/faq/faq_en.json
@@ -49,10 +49,10 @@
},
{
"question" : "I didn't receive my coins from the exchange in the app. What can I do?",
- "answer" : "If you're having issues with an exchange, the best option is to contact the exchange itself. We're partnered with XMR.TO, Morph and ChangeNow, so your best bet is to go to http://xmr.to, http://changenow.io, or http://morphtoken.com and contact their support.\n"
+ "answer" : "If you're having issues with an exchange, the best option is to contact the exchange itself. We're partnered with ChangeNow, SimpleSwap, SideShift and Trocador. So your best bet is to go to https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ and contact their support.\n"
},
{
"question" : "How do I contact Cake Wallet support?",
"answer" : "Email support@cakewallet.com, join the Telegram at @cakewallet_bot, or tweet @CakeWalletXMR!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_es.json b/assets/faq/faq_es.json
index 28074662c..968853a0b 100644
--- a/assets/faq/faq_es.json
+++ b/assets/faq/faq_es.json
@@ -49,10 +49,10 @@
},
{
"question" : "No recibí mis monedas del intercambio en la aplicación. ¿Que puedo hacer?",
- "answer" : "Si tiene problemas con un intercambio, la mejor opción es ponerse en contacto con el intercambio en sí. Estamos asociados con XMR.TO, Morph y ChangeNow, por lo que su mejor opción es ir a http://xmr.to, http://changenow.io o http://morphtoken.com y contactar a su soporte.\n"
+ "answer" : "Si tiene problemas con un intercambio, la mejor opción es comunicarse con el intercambio en sí. Estamos asociados con ChangeNow, SimpleSwap, SideShift y Trocador. Entonces, su mejor opción es ir a https://changenow.io, https://simplewap.io/, https://sideshift.ai/, https://trocador.app/ y contactar su soporte.\n"
},
{
"question" : "¿Cómo contacto al soporte de Cake Wallet?",
"answer" : "¡Envíe un correo electrónico a support@cakewallet.com, únase al Telegram en @cakewallet_bot o envíe un tweet a @CakeWalletXMR!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_fr.json b/assets/faq/faq_fr.json
index cc4e52873..6b6ac5227 100644
--- a/assets/faq/faq_fr.json
+++ b/assets/faq/faq_fr.json
@@ -50,7 +50,7 @@
},
{
"question" : "Je n'ai pas reçu mes fonds en provenance de la plateforme d'échange dans l'application. Que puis-je faire ?",
- "answer" : "Si vous avez des soucis avec une plateforme d'échange, le mieux est de contacter la plateforme d'échange directement. Nous avons des partenariats avec XMR.TO, Morph et ChangeNow, donc essayez http://xmr.to, http://changenow.io, ou http://morphtoken.com et contactez leur support.\n"
+ "answer" : "Si vous rencontrez des problèmes avec un échange, la meilleure option est de contacter l'échange lui-même. Nous sommes en partenariat avec Changenow, Simpleswap, Sideshift et le Trocador. Donc, votre meilleur pari est d'aller sur https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ et contactez leur support.\n"
},
{
"question" : "Comment puis-je contacter le support de Cake Wallet ?",
diff --git a/assets/faq/faq_hi.json b/assets/faq/faq_hi.json
index cd9eb3fb9..f1ede3374 100644
--- a/assets/faq/faq_hi.json
+++ b/assets/faq/faq_hi.json
@@ -49,10 +49,10 @@
},
{
"question" : "मुझे ऐप में एक्सचेंज से मेरे सिक्के नहीं मिले। मैं क्या कर सकता हूँ?",
- "answer" : "यदि आप एक एक्सचेंज के साथ समस्या कर रहे हैं, तो सबसे अच्छा विकल्प एक्सचेंज से संपर्क करना है। हम XMR.TO, Morph और ChangeNow के साथ भागीदारी कर रहे हैं, इसलिए आपका सबसे अच्छा दांव http://xmr.to, http://changenow.io, या http://morphtoken.com पर जाना है और उनके समर्थन से संपर्क करना है।\n"
+ "answer" : "यदि आप एक एक्सचेंज के साथ समस्याएं कर रहे हैं, तो सबसे अच्छा विकल्प एक्सचेंज से संपर्क करना है। हम चंगेनो, सिम्प्लेवैप, सिडशिफ्ट और ट्रोकैडर के साथ भागीदारी कर रहे हैं। तो आपका सबसे अच्छा दांव https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ पर जाना और उनके समर्थन से संपर्क करना है।\n"
},
{
"question" : "मैं केक वॉलेट से कैसे संपर्क करूं?",
"answer" : "ईमेल support@cakewallet.com, @cakewallet_bot पर टेलीग्राम में शामिल हों, या @CakeWalletXMR पर ट्वीट करें!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_ja.json b/assets/faq/faq_ja.json
index 8a5b48763..6d83e61d3 100644
--- a/assets/faq/faq_ja.json
+++ b/assets/faq/faq_ja.json
@@ -49,10 +49,10 @@
},
{
"question" : "アプリの取引所からコインを受け取りませんでした。 私に何ができる?",
- "answer" : "取引所に問題がある場合、最良の選択肢は取引所自体に連絡することです。 XMR.TO、Morph、ChangeNowと提携しているため、最善の策はhttp://xmr.to、http://changenow.io、またはhttp://morphtoken.comにアクセスしてサポートに連絡することです。\n"
+ "answer" : "交換に問題がある場合、最良の選択肢は、交換自体に連絡することです。 Changenow、SimpleSwap、Sideshift、Trocadorと提携しています。したがって、あなたの最善の策は、https://changenow.io、https://simpleswap.io/、https://sideshift.ai/、https://trocador.app/に行くことです。\n"
},
{
"question" : "Cake Walletサポートに連絡するにはどうすればよいですか?",
"answer" : "support@cakewallet.comにメールを送信するか、@cakewallet_botで電報に参加するか、@CakeWalletXMRにツイートしてください。\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_ko.json b/assets/faq/faq_ko.json
index 7d6f36589..640567284 100644
--- a/assets/faq/faq_ko.json
+++ b/assets/faq/faq_ko.json
@@ -49,10 +49,10 @@
},
{
"question" : "앱의 거래소에서 동전을받지 못했습니다. 내가 무엇을 할 수 있을지?",
- "answer" : "교환에 문제가있는 경우 교환기에 연락하는 것이 가장 좋습니다. 우리는 XMR.TO, Morph 및 ChangeNow와 파트너 관계를 맺고 있으므로 가장 좋은 방법은 http://xmr.to, http://changenow.io 또는 http://morphtoken.com으로 이동하여 지원 부서에 문의하는 것입니다.\n"
+ "answer" : "교환에 문제가있는 경우 가장 좋은 선택은 Exchange 자체에 연락하는 것입니다. 우리는 Changenow, Simpleswap, Sideshift 및 Trocador와 파트너 관계를 맺고 있습니다. 따라서 가장 좋은 방법은 https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/로 이동하여 지원에 연락하는 것입니다.\n"
},
{
"question" : "Cake Wallet 지원팀에 연락하려면 어떻게해야합니까?",
"answer" : "support@cakewallet.com로 이메일을 보내거나 @cakewallet_bot에서 전보에 가입하거나 @CakeWalletXMR을 트윗하십시오!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_nl.json b/assets/faq/faq_nl.json
index bb4f70216..47cf8fdf0 100644
--- a/assets/faq/faq_nl.json
+++ b/assets/faq/faq_nl.json
@@ -49,10 +49,10 @@
},
{
"question" : "Ik heb mijn munten niet ontvangen van de beurs in de app. Wat kan ik doen?",
- "answer" : "Als u problemen ondervindt met een uitwisseling, kunt u het beste contact opnemen met de uitwisseling zelf. We werken samen met XMR.TO, Morph en ChangeNow, dus u kunt het beste naar http://xmr.to, http://changenow.io of http://morphtoken.com gaan en contact opnemen met hun ondersteuning.\n"
+ "answer" : "Als u problemen heeft met een uitwisseling, is de beste optie om contact op te nemen met de uitwisseling zelf. We werken samen met ChangeNow, SimpleSwap, SideShift en Trocador. Dus het beste is om naar https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ te gaan en contact op te nemen met hun ondersteuning.\n"
},
{
"question" : "Hoe neem ik contact op met Cake Wallet-ondersteuning?",
"answer" : "E-mail support@cakewallet.com, word lid van het Telegram op @cakewallet_bot of tweet @CakeWalletXMR!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_pl.json b/assets/faq/faq_pl.json
index 1934f4d1a..a38d79068 100644
--- a/assets/faq/faq_pl.json
+++ b/assets/faq/faq_pl.json
@@ -49,10 +49,10 @@
},
{
"question" : "Nie otrzymałem moich monet z wymiany w aplikacji. Co mogę zrobić?",
- "answer" : "Jeśli masz problemy z wymianą, najlepszym rozwiązaniem jest skontaktowanie się z samą giełdą. Współpracujemy z XMR.TO, Morph i ChangeNow, więc najlepiej postawić się na stronie http://xmr.to, http://changenow.io lub http://morphtoken.com i skontaktować się z ich wsparciem.\n"
+ "answer" : "Jeśli masz problemy z wymianą, najlepszą opcją jest skontaktowanie się z samą wymianą. Współpracujemy z Changenow, Simpleswap, Sideshift i Trocador. Więc najlepszym rozwiązaniem jest przejście na https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ i skontaktować się z ich obsługą.\n"
},
{
"question" : "Jak skontaktować się z obsługą Cake Wallet?",
"answer" : "Wyślij e-mail na adres support@cakewallet.com, dołącz do telegramu na @cakewallet_bot lub tweet @CakeWalletXMR!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_pt.json b/assets/faq/faq_pt.json
index 06ddab25e..66d3a6aaf 100644
--- a/assets/faq/faq_pt.json
+++ b/assets/faq/faq_pt.json
@@ -49,10 +49,10 @@
},
{
"question" : "Não recebi minhas moedas da troca no aplicativo. O que eu posso fazer?",
- "answer" : "Se você estiver tendo problemas com uma troca, a melhor opção é entrar em contato com a troca. Somos parceiros do XMR.TO, Morph e ChangeNow, portanto, sua melhor aposta é ir para http://xmr.to, http://changenow.io ou http://morphtoken.com e entrar em contato com o suporte deles.\n"
+ "answer" : "Se você estiver com problemas com uma troca, a melhor opção é entrar em contato com a própria troca. Estamos em parceria com ChangeNow, SimpleSwap, Sideshift e Trocador. Portanto, sua melhor aposta é ir para https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ e entre em contato com seu suporte.\n"
},
{
"question" : "Como entro em contato com o suporte da Cake Wallet?",
"answer" : "Envie um e-mail para support@cakewallet.com, participe do Telegram em @cakewallet_bot ou envie um tweet para @CakeWalletXMR!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_ru.json b/assets/faq/faq_ru.json
index 4b8b18e32..af5ba32a6 100644
--- a/assets/faq/faq_ru.json
+++ b/assets/faq/faq_ru.json
@@ -49,10 +49,10 @@
},
{
"question" : "Я не получил свои монеты после обмена в приложении. Что я могу сделать?",
- "answer" : "Если у вас возникли проблемы с обменом, лучше всего связаться с провайдером обмена. Мы сотрудничаем с XMR.TO, Morph и ChangeNow, поэтому вам лучше всего зайти на http://xmr.to, http://changenow.io или http://morphtoken.com и связаться с их поддержкой.\n"
+ "answer" : "Если у вас есть проблемы с обменом, лучший вариант - связаться с самой биржей. Мы сотрудничаем с Changenow, Simpleswap, SideShift и Trocador. Так что лучше всего пойти по адресу https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ и свяжитесь с их поддержкой.\n"
},
{
"question" : "Как мне связаться со службой поддержки Cake Wallet?",
"answer" : "По электронной почте support@cakewallet.com, присоединитесь к Telegram по адресу @cakewallet_bot или отправьте твит @CakeWalletXMR!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_uk.json b/assets/faq/faq_uk.json
index c481e0538..3e209d2ad 100644
--- a/assets/faq/faq_uk.json
+++ b/assets/faq/faq_uk.json
@@ -49,10 +49,10 @@
},
{
"question" : "Я не отримав свої монети після обміну в додатку. Що я можу зробити?",
- "answer" : "Якщо у вас виникли проблеми з обміном, найкраще зв'язатися з провайдером обміну. Ми співпрацюємо з XMR.TO, Morph і ChangeNow, тому вам найкраще зайти на http://xmr.to, http://changenow.io або http://morphtoken.com і зв'язатися з їх підтримкою.\n"
+ "answer" : "Якщо у вас є проблеми з обміном, найкращим варіантом є зв’язок із самою біржею. Ми співпрацюємо з Changenow, Simplewap, Sideshift та Trocador. Тож найкраща ставка - перейти на https://changenow.io, https://simpleswap.io/, https://sideshift.ai/, https://trocador.app/ та звернутися до їх підтримки.\n"
},
{
"question" : "Як мені зв'язатися зі службою підтримки Cake Wallet?",
"answer" : "По електронній пошті support@cakewallet.com, приєднайтеся до Telegram за адресою @cakewallet_bot або надішліть твіт @CakeWalletXMR!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/faq/faq_zh.json b/assets/faq/faq_zh.json
index 22977f22c..8debe1873 100644
--- a/assets/faq/faq_zh.json
+++ b/assets/faq/faq_zh.json
@@ -49,10 +49,10 @@
},
{
"question" : "我没有从应用程序中的交易所收到硬币。 我能做什么?",
- "answer" : "如果您对交易所有疑问,最好的选择是与交易所本身联系。 我们与XMR.TO,Morph和ChangeNow合作,因此最好的选择是访问http://xmr.to、http://changenow.io或http://morphtoken.com,并与他们的支持部门联系。\n"
+ "answer" : "如果您对交易所有问题,最好的选择是与交易所本身联系。我们与ChangeNow,SimplesWap,SideShift和Trocador合作。因此,最好的选择是访问https://changenow.io,https://simpleswap.io/,https://sideshift.ai/,https://trocador.app/并联系他们的支持。\n"
},
{
"question" : "如何联系蛋糕钱包支持?",
"answer" : "电子邮件support@cakewallet.com,通过@cakewallet_bot加入电报,或在@CakeWalletXMR上发布推文!\n"
}
-]
\ No newline at end of file
+]
diff --git a/assets/images/cakewallet_android_icon.png b/assets/images/cakewallet_android_icon.png
index a96724f1c..59cc69414 100755
Binary files a/assets/images/cakewallet_android_icon.png and b/assets/images/cakewallet_android_icon.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-anydpi-v26/ic_launcher.xml b/assets/images/cakewallet_android_icon/mipmap-anydpi-v26/ic_launcher.xml
index 90f958096..00d924171 100644
--- a/assets/images/cakewallet_android_icon/mipmap-anydpi-v26/ic_launcher.xml
+++ b/assets/images/cakewallet_android_icon/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,5 +1,5 @@
-
-
+
+
\ No newline at end of file
diff --git a/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher.png b/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher.png
index 2bcdb4427..10d0a1a82 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher.png and b/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher_adaptive_back.png b/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher_adaptive_back.png
index a025d330c..5b0fde827 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher_adaptive_back.png and b/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher_adaptive_fore.png b/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher_adaptive_fore.png
index 32891557d..9c16f0a27 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher_adaptive_fore.png and b/assets/images/cakewallet_android_icon/mipmap-hdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher.png b/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher.png
index 4c4131065..8c59ec33e 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher.png and b/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher_adaptive_back.png b/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher_adaptive_back.png
index 9f0bf4907..5d25e42e7 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher_adaptive_back.png and b/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher_adaptive_fore.png b/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher_adaptive_fore.png
index af6a1e312..021fe65de 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher_adaptive_fore.png and b/assets/images/cakewallet_android_icon/mipmap-mdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher.png b/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher.png
index f857a604e..10c3acd7f 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher.png and b/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher_adaptive_back.png b/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher_adaptive_back.png
index 65a3f3a1c..c4b66dc58 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher_adaptive_back.png and b/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher_adaptive_fore.png b/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher_adaptive_fore.png
index 5e783f26f..b440b154d 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher_adaptive_fore.png and b/assets/images/cakewallet_android_icon/mipmap-xhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher.png b/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher.png
index 7fe35095c..813a3678d 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher.png and b/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_back.png b/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_back.png
index 66e3bf6b9..75dc0219d 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_back.png and b/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_fore.png b/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_fore.png
index 2c0ecc492..90afb19e8 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_fore.png and b/assets/images/cakewallet_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher.png b/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher.png
index 7f632717c..671422b96 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher.png and b/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_back.png b/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_back.png
index 9e40681b1..46b1e2cb1 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_back.png and b/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png b/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png
index a2104217c..0a2025220 100644
Binary files a/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png and b/assets/images/cakewallet_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/cakewallet_app_logo.png b/assets/images/cakewallet_app_logo.png
index 64682cd1d..59cc69414 100644
Binary files a/assets/images/cakewallet_app_logo.png and b/assets/images/cakewallet_app_logo.png differ
diff --git a/assets/images/exolix.png b/assets/images/exolix.png
new file mode 100644
index 000000000..29e5f2db1
Binary files /dev/null and b/assets/images/exolix.png differ
diff --git a/assets/images/monero.com_android_icon.png b/assets/images/monero.com_android_icon.png
index af47453c1..9e1fa0a65 100644
Binary files a/assets/images/monero.com_android_icon.png and b/assets/images/monero.com_android_icon.png differ
diff --git a/assets/images/monero.com_logo.png b/assets/images/monero.com_logo.png
index ecc703781..9e1fa0a65 100644
Binary files a/assets/images/monero.com_logo.png and b/assets/images/monero.com_logo.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-anydpi-v26/ic_launcher.xml b/assets/images/monerocom_android_icon/mipmap-anydpi-v26/ic_launcher.xml
index 90f958096..00d924171 100644
--- a/assets/images/monerocom_android_icon/mipmap-anydpi-v26/ic_launcher.xml
+++ b/assets/images/monerocom_android_icon/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,5 +1,5 @@
-
-
+
+
\ No newline at end of file
diff --git a/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher.png b/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher.png
index 583765d8f..1785f4b05 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher.png and b/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher_adaptive_back.png b/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher_adaptive_back.png
index a025d330c..5b0fde827 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher_adaptive_back.png and b/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher_adaptive_fore.png b/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher_adaptive_fore.png
index 646a13ff0..884745809 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher_adaptive_fore.png and b/assets/images/monerocom_android_icon/mipmap-hdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher.png b/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher.png
index 50e1973f5..12c31ef57 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher.png and b/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher_adaptive_back.png b/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher_adaptive_back.png
index 9f0bf4907..5d25e42e7 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher_adaptive_back.png and b/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher_adaptive_fore.png b/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher_adaptive_fore.png
index 2230fe0ec..28bbd57b8 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher_adaptive_fore.png and b/assets/images/monerocom_android_icon/mipmap-mdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher.png b/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher.png
index 505971bbb..2d8878946 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher.png and b/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher_adaptive_back.png b/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher_adaptive_back.png
index 65a3f3a1c..c4b66dc58 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher_adaptive_back.png and b/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher_adaptive_fore.png b/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher_adaptive_fore.png
index 3d414fcd3..811848c27 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher_adaptive_fore.png and b/assets/images/monerocom_android_icon/mipmap-xhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher.png b/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher.png
index 1ad794a7b..2ceba55ad 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher.png and b/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_back.png b/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_back.png
index 66e3bf6b9..75dc0219d 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_back.png and b/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_fore.png b/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_fore.png
index cab647d0c..e078655c9 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_fore.png and b/assets/images/monerocom_android_icon/mipmap-xxhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher.png b/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher.png
index 43ab3ac30..beca2d29b 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher.png and b/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_back.png b/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_back.png
index 9e40681b1..46b1e2cb1 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_back.png and b/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_back.png differ
diff --git a/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png b/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png
index a790c3a74..255b1b71f 100644
Binary files a/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png and b/assets/images/monerocom_android_icon/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/assets/images/onramper_dark.png b/assets/images/onramper_dark.png
new file mode 100644
index 000000000..62f37cd29
Binary files /dev/null and b/assets/images/onramper_dark.png differ
diff --git a/assets/images/onramper_light.png b/assets/images/onramper_light.png
new file mode 100644
index 000000000..f07fc3709
Binary files /dev/null and b/assets/images/onramper_light.png differ
diff --git a/assets/images/robinhood_dark.png b/assets/images/robinhood_dark.png
new file mode 100644
index 000000000..0d7273fc4
Binary files /dev/null and b/assets/images/robinhood_dark.png differ
diff --git a/assets/images/robinhood_light.png b/assets/images/robinhood_light.png
new file mode 100644
index 000000000..24aa345f1
Binary files /dev/null and b/assets/images/robinhood_light.png differ
diff --git a/assets/images/walletconnect_logo.png b/assets/images/walletconnect_logo.png
new file mode 100644
index 000000000..9024b972c
Binary files /dev/null and b/assets/images/walletconnect_logo.png differ
diff --git a/assets/nano_pow_node_list.yml b/assets/nano_pow_node_list.yml
index 674518073..3bbc7c3fb 100644
--- a/assets/nano_pow_node_list.yml
+++ b/assets/nano_pow_node_list.yml
@@ -5,4 +5,5 @@
-
uri: workers.perish.co
-
- uri: worker.nanoriver.cc:443
\ No newline at end of file
+ uri: worker.nanoriver.cc
+ useSSL: true
diff --git a/assets/node_list.yml b/assets/node_list.yml
index 2cbd7f780..bc7a9dc4a 100644
--- a/assets/node_list.yml
+++ b/assets/node_list.yml
@@ -5,7 +5,8 @@
uri: cakexmrl7bonq7ovjka5kuwuyd3f7qnkz6z6s6dmsy3uckwra7bvggyd.onion:18081
is_default: false
-
- uri: node.sethforprivacy.com:18089
+ uri: node.sethforprivacy.com:443
+ useSSL: true
is_default: false
-
uri: nodes.hashvault.pro:18081
diff --git a/assets/text/Monerocom_Release_Notes.txt b/assets/text/Monerocom_Release_Notes.txt
index a8b55383d..9c09278a5 100644
--- a/assets/text/Monerocom_Release_Notes.txt
+++ b/assets/text/Monerocom_Release_Notes.txt
@@ -1,5 +1,4 @@
-Ability to Auto generate new Monero subaddress when used
-Coin Control for Monero
-In-app Live Chat support
-Additional themes
-Bug Fixes and performance enhancements
\ No newline at end of file
+UI enhancements
+Privacy settings enhancements
+Tablet/iPad fixes
+Bug fixes
\ No newline at end of file
diff --git a/assets/text/Release_Notes.txt b/assets/text/Release_Notes.txt
index 263689318..8b8ab36a1 100644
--- a/assets/text/Release_Notes.txt
+++ b/assets/text/Release_Notes.txt
@@ -1,6 +1,5 @@
-Restore Ethereum from private key and QR
-Ability to Auto generate new Monero subaddress when used
-Coin Control for Monero
-In-app Live Chat support
-Additional themes
-Bug Fixes and performance enhancements
\ No newline at end of file
+WalletConnect enhancements
+UI enhancements
+Privacy settings enhancements
+Tablet/iPad fixes
+Bug fixes
\ No newline at end of file
diff --git a/configure_cake_wallet_android.sh b/configure_cake_wallet_android.sh
index b80ebc46e..b8aa433de 100755
--- a/configure_cake_wallet_android.sh
+++ b/configure_cake_wallet_android.sh
@@ -7,4 +7,6 @@ cd cw_monero && flutter pub get && flutter packages pub run build_runner build -
cd cw_bitcoin && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
cd cw_haven && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
cd cw_ethereum && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
+cd cw_nano && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
+cd cw_bitcoin_cash && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd ..
flutter packages pub run build_runner build --delete-conflicting-outputs
diff --git a/cw_bitcoin/lib/bitcoin_mnemonic.dart b/cw_bitcoin/lib/bitcoin_mnemonic.dart
index d3bc23c06..48a0bc875 100644
--- a/cw_bitcoin/lib/bitcoin_mnemonic.dart
+++ b/cw_bitcoin/lib/bitcoin_mnemonic.dart
@@ -2304,4 +2304,4 @@ final englishWordlist = [
'zero',
'zone',
'zoo'
-];
+];
\ No newline at end of file
diff --git a/cw_bitcoin/lib/bitcoin_transaction_priority.dart b/cw_bitcoin/lib/bitcoin_transaction_priority.dart
index d82ea429e..10953a2e0 100644
--- a/cw_bitcoin/lib/bitcoin_transaction_priority.dart
+++ b/cw_bitcoin/lib/bitcoin_transaction_priority.dart
@@ -1,5 +1,4 @@
import 'package:cw_core/transaction_priority.dart';
-//import 'package:cake_wallet/generated/i18n.dart';
class BitcoinTransactionPriority extends TransactionPriority {
const BitcoinTransactionPriority({required String title, required int raw})
@@ -100,4 +99,55 @@ class LitecoinTransactionPriority extends BitcoinTransactionPriority {
return label;
}
+
}
+class BitcoinCashTransactionPriority extends BitcoinTransactionPriority {
+ const BitcoinCashTransactionPriority({required String title, required int raw})
+ : super(title: title, raw: raw);
+
+ static const List all = [fast, medium, slow];
+ static const BitcoinCashTransactionPriority slow =
+ BitcoinCashTransactionPriority(title: 'Slow', raw: 0);
+ static const BitcoinCashTransactionPriority medium =
+ BitcoinCashTransactionPriority(title: 'Medium', raw: 1);
+ static const BitcoinCashTransactionPriority fast =
+ BitcoinCashTransactionPriority(title: 'Fast', raw: 2);
+
+ static BitcoinCashTransactionPriority deserialize({required int raw}) {
+ switch (raw) {
+ case 0:
+ return slow;
+ case 1:
+ return medium;
+ case 2:
+ return fast;
+ default:
+ throw Exception('Unexpected token: $raw for BitcoinCashTransactionPriority deserialize');
+ }
+ }
+
+ @override
+ String get units => 'Satoshi';
+
+ @override
+ String toString() {
+ var label = '';
+
+ switch (this) {
+ case BitcoinCashTransactionPriority.slow:
+ label = 'Slow'; // S.current.transaction_priority_slow;
+ break;
+ case BitcoinCashTransactionPriority.medium:
+ label = 'Medium'; // S.current.transaction_priority_medium;
+ break;
+ case BitcoinCashTransactionPriority.fast:
+ label = 'Fast'; // S.current.transaction_priority_fast;
+ break;
+ default:
+ break;
+ }
+
+ return label;
+ }
+}
+
diff --git a/cw_bitcoin/lib/bitcoin_unspent.dart b/cw_bitcoin/lib/bitcoin_unspent.dart
index e5a0e8cac..9c198c27c 100644
--- a/cw_bitcoin/lib/bitcoin_unspent.dart
+++ b/cw_bitcoin/lib/bitcoin_unspent.dart
@@ -1,24 +1,15 @@
import 'package:cw_bitcoin/bitcoin_address_record.dart';
+import 'package:cw_core/unspent_transaction_output.dart';
-class BitcoinUnspent {
- BitcoinUnspent(this.address, this.hash, this.value, this.vout)
- : isSending = true,
- isFrozen = false,
- note = '';
+class BitcoinUnspent extends Unspent {
+ BitcoinUnspent(BitcoinAddressRecord addressRecord, String hash, int value, int vout)
+ : bitcoinAddressRecord = addressRecord,
+ super(addressRecord.address, hash, value, vout, null);
factory BitcoinUnspent.fromJSON(
- BitcoinAddressRecord address, Map json) =>
+ BitcoinAddressRecord address, Map json) =>
BitcoinUnspent(address, json['tx_hash'] as String, json['value'] as int,
json['tx_pos'] as int);
- final BitcoinAddressRecord address;
- final String hash;
- final int value;
- final int vout;
-
- bool get isP2wpkh =>
- address.address.startsWith('bc') || address.address.startsWith('ltc');
- bool isSending;
- bool isFrozen;
- String note;
+ final BitcoinAddressRecord bitcoinAddressRecord;
}
diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart
index 2b445b696..0fa105eac 100644
--- a/cw_bitcoin/lib/bitcoin_wallet.dart
+++ b/cw_bitcoin/lib/bitcoin_wallet.dart
@@ -125,4 +125,4 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
initialRegularAddressIndex: snp.regularAddressIndex,
initialChangeAddressIndex: snp.changeAddressIndex);
}
-}
+}
\ No newline at end of file
diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart
index de3fdfbca..36d37127d 100644
--- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart
+++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart
@@ -1,39 +1,34 @@
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
-import 'package:cw_bitcoin/electrum.dart';
-import 'package:cw_bitcoin/utils.dart';
import 'package:cw_bitcoin/bitcoin_address_record.dart';
+import 'package:cw_bitcoin/electrum.dart';
import 'package:cw_bitcoin/electrum_wallet_addresses.dart';
+import 'package:cw_bitcoin/utils.dart';
import 'package:cw_core/wallet_info.dart';
-import 'package:flutter/foundation.dart';
import 'package:mobx/mobx.dart';
part 'bitcoin_wallet_addresses.g.dart';
-class BitcoinWalletAddresses = BitcoinWalletAddressesBase
- with _$BitcoinWalletAddresses;
+class BitcoinWalletAddresses = BitcoinWalletAddressesBase with _$BitcoinWalletAddresses;
-abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses
- with Store {
- BitcoinWalletAddressesBase(
- WalletInfo walletInfo,
+abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with Store {
+ BitcoinWalletAddressesBase(WalletInfo walletInfo,
{required bitcoin.HDWallet mainHd,
- required bitcoin.HDWallet sideHd,
- required bitcoin.NetworkType networkType,
- required ElectrumClient electrumClient,
- List? initialAddresses,
- int initialRegularAddressIndex = 0,
- int initialChangeAddressIndex = 0})
- : super(
- walletInfo,
- initialAddresses: initialAddresses,
- initialRegularAddressIndex: initialRegularAddressIndex,
- initialChangeAddressIndex: initialChangeAddressIndex,
- mainHd: mainHd,
- sideHd: sideHd,
- electrumClient: electrumClient,
- networkType: networkType);
+ required bitcoin.HDWallet sideHd,
+ required bitcoin.NetworkType networkType,
+ required ElectrumClient electrumClient,
+ List? initialAddresses,
+ int initialRegularAddressIndex = 0,
+ int initialChangeAddressIndex = 0})
+ : super(walletInfo,
+ initialAddresses: initialAddresses,
+ initialRegularAddressIndex: initialRegularAddressIndex,
+ initialChangeAddressIndex: initialChangeAddressIndex,
+ mainHd: mainHd,
+ sideHd: sideHd,
+ electrumClient: electrumClient,
+ networkType: networkType);
@override
String getAddress({required int index, required bitcoin.HDWallet hd}) =>
generateP2WPKHAddress(hd: hd, index: index, networkType: networkType);
-}
\ No newline at end of file
+}
diff --git a/cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart b/cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart
index 450ed31dd..6eaf55586 100644
--- a/cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart
+++ b/cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart
@@ -31,4 +31,4 @@ class BitcoinRestoreWalletFromWIFCredentials extends WalletCredentials {
: super(name: name, password: password, walletInfo: walletInfo);
final String wif;
-}
+}
\ No newline at end of file
diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart
index f9437e668..05486aa20 100644
--- a/cw_bitcoin/lib/electrum_wallet.dart
+++ b/cw_bitcoin/lib/electrum_wallet.dart
@@ -2,45 +2,49 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:math';
-import 'package:cw_core/unspent_coins_info.dart';
-import 'package:hive/hive.dart';
-import 'package:cw_bitcoin/electrum_wallet_addresses.dart';
-import 'package:mobx/mobx.dart';
-import 'package:rxdart/subjects.dart';
-import 'package:flutter/foundation.dart';
+
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
-import 'package:cw_bitcoin/electrum_transaction_info.dart';
-import 'package:cw_core/pathForWallet.dart';
+import 'package:collection/collection.dart';
import 'package:cw_bitcoin/address_to_output_script.dart';
import 'package:cw_bitcoin/bitcoin_address_record.dart';
-import 'package:cw_bitcoin/electrum_balance.dart';
import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart';
-import 'package:cw_bitcoin/electrum_transaction_history.dart';
import 'package:cw_bitcoin/bitcoin_transaction_no_inputs_exception.dart';
import 'package:cw_bitcoin/bitcoin_transaction_priority.dart';
import 'package:cw_bitcoin/bitcoin_transaction_wrong_balance_exception.dart';
import 'package:cw_bitcoin/bitcoin_unspent.dart';
import 'package:cw_bitcoin/bitcoin_wallet_keys.dart';
+import 'package:cw_bitcoin/electrum.dart';
+import 'package:cw_bitcoin/electrum_balance.dart';
+import 'package:cw_bitcoin/electrum_transaction_history.dart';
+import 'package:cw_bitcoin/electrum_transaction_info.dart';
+import 'package:cw_bitcoin/electrum_wallet_addresses.dart';
import 'package:cw_bitcoin/file.dart';
import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
import 'package:cw_bitcoin/script_hash.dart';
import 'package:cw_bitcoin/utils.dart';
-import 'package:cw_core/wallet_base.dart';
-import 'package:cw_core/node.dart';
-import 'package:cw_core/sync_status.dart';
-import 'package:cw_core/transaction_priority.dart';
-import 'package:cw_core/wallet_info.dart';
-import 'package:cw_bitcoin/electrum.dart';
-import 'package:hex/hex.dart';
import 'package:cw_core/crypto_currency.dart';
-import 'package:collection/collection.dart';
+import 'package:cw_core/node.dart';
+import 'package:cw_core/pathForWallet.dart';
+import 'package:cw_core/pending_transaction.dart';
+import 'package:cw_core/sync_status.dart';
+import 'package:cw_core/transaction_direction.dart';
+import 'package:cw_core/transaction_priority.dart';
+import 'package:cw_core/unspent_coins_info.dart';
+import 'package:cw_core/wallet_base.dart';
+import 'package:cw_core/wallet_info.dart';
+import 'package:flutter/foundation.dart';
+import 'package:hex/hex.dart';
+import 'package:hive/hive.dart';
+import 'package:mobx/mobx.dart';
+import 'package:rxdart/subjects.dart';
part 'electrum_wallet.g.dart';
class ElectrumWallet = ElectrumWalletBase with _$ElectrumWallet;
-abstract class ElectrumWalletBase extends WalletBase with Store {
+abstract class ElectrumWalletBase
+ extends WalletBase
+ with Store {
ElectrumWalletBase(
{required String password,
required WalletInfo walletInfo,
@@ -52,27 +56,31 @@ abstract class ElectrumWalletBase extends WalletBase[],
_isTransactionUpdating = false,
unspentCoins = [],
_scripthashesUpdateSubject = {},
- balance = ObservableMap.of(
- currency != null
- ? {currency: initialBalance ?? const ElectrumBalance(confirmed: 0, unconfirmed: 0,
- frozen: 0)}
- : {}),
+ balance = ObservableMap.of(currency != null
+ ? {
+ currency:
+ initialBalance ?? const ElectrumBalance(confirmed: 0, unconfirmed: 0, frozen: 0)
+ }
+ : {}),
this.unspentCoinsInfo = unspentCoinsInfo,
super(walletInfo) {
this.electrumClient = electrumClient ?? ElectrumClient();
this.walletInfo = walletInfo;
- transactionHistory =
- ElectrumTransactionHistory(walletInfo: walletInfo, password: password);
+ transactionHistory = ElectrumTransactionHistory(walletInfo: walletInfo, password: password);
}
+ static bitcoin.HDWallet bitcoinCashHDWallet(Uint8List seedBytes) =>
+ bitcoin.HDWallet.fromSeed(seedBytes).derivePath("m/44'/145'/0'/0");
+
static int estimatedTransactionSize(int inputsCount, int outputsCounts) =>
inputsCount * 146 + outputsCounts * 33 + 8;
@@ -98,9 +106,9 @@ abstract class ElectrumWalletBase extends WalletBase get publicScriptHashes => walletAddresses.addresses
- .where((addr) => !addr.isHidden)
- .map((addr) => scriptHash(addr.address, networkType: networkType))
- .toList();
+ .where((addr) => !addr.isHidden)
+ .map((addr) => scriptHash(addr.address, networkType: networkType))
+ .toList();
String get xpub => hd.base58!;
@@ -110,8 +118,8 @@ abstract class ElectrumWalletBase extends WalletBase BitcoinWalletKeys(
- wif: hd.wif!, privateKey: hd.privKey!, publicKey: hd.pubKey!);
+ BitcoinWalletKeys get keys =>
+ BitcoinWalletKeys(wif: hd.wif!, privateKey: hd.privKey!, publicKey: hd.pubKey!);
String _password;
List unspentCoins;
@@ -139,8 +147,8 @@ abstract class ElectrumWalletBase extends WalletBase _feeRates = await electrumClient.feeRates());
+ Timer.periodic(
+ const Duration(minutes: 1), (timer) async => _feeRates = await electrumClient.feeRates());
syncStatus = SyncedSyncStatus();
} catch (e, stacktrace) {
@@ -169,8 +177,7 @@ abstract class ElectrumWalletBase extends WalletBase createTransaction(
- Object credentials) async {
+ Future createTransaction(Object credentials) async {
const minAmount = 546;
final transactionCredentials = credentials as BitcoinTransactionCredentials;
final inputs = [];
@@ -204,13 +211,11 @@ abstract class ElectrumWalletBase extends WalletBase item.sendAll
- || item.formattedCryptoAmount! <= 0)) {
+ if (outputs.any((item) => item.sendAll || item.formattedCryptoAmount! <= 0)) {
throw BitcoinTransactionWrongBalanceException(currency);
}
- credentialsAmount = outputs.fold(0, (acc, value) =>
- acc + value.formattedCryptoAmount!);
+ credentialsAmount = outputs.fold(0, (acc, value) => acc + value.formattedCryptoAmount!);
if (allAmount - credentialsAmount < minAmount) {
throw BitcoinTransactionWrongBalanceException(currency);
@@ -227,9 +232,7 @@ abstract class ElectrumWalletBase extends WalletBase allAmount) {
throw BitcoinTransactionWrongBalanceException(currency);
@@ -290,10 +293,12 @@ abstract class ElectrumWalletBase extends WalletBase
+ int feeAmountForPriority(
+ BitcoinTransactionPriority priority, int inputsCount, int outputsCount) =>
feeRate(priority) * estimatedTransactionSize(inputsCount, outputsCount);
- int feeAmountWithFeeRate(int feeRate, int inputsCount,
- int outputsCount) =>
+ int feeAmountWithFeeRate(int feeRate, int inputsCount, int outputsCount) =>
feeRate * estimatedTransactionSize(inputsCount, outputsCount);
@override
- int calculateEstimatedFee(TransactionPriority? priority, int? amount,
- {int? outputsCount}) {
+ int calculateEstimatedFee(TransactionPriority? priority, int? amount, {int? outputsCount}) {
if (priority is BitcoinTransactionPriority) {
- return calculateEstimatedFeeWithFeeRate(
- feeRate(priority),
- amount,
- outputsCount: outputsCount);
+ return calculateEstimatedFeeWithFeeRate(feeRate(priority), amount,
+ outputsCount: outputsCount);
}
return 0;
}
- int calculateEstimatedFeeWithFeeRate(int feeRate, int? amount,
- {int? outputsCount}) {
+ int calculateEstimatedFeeWithFeeRate(int feeRate, int? amount, {int? outputsCount}) {
int inputsCount = 0;
if (amount != null) {
@@ -420,8 +413,7 @@ abstract class ElectrumWalletBase extends WalletBase makePath() async =>
- pathForWallet(name: walletInfo.name, type: walletInfo.type);
+ Future makePath() async => pathForWallet(name: walletInfo.name, type: walletInfo.type);
Future updateUnspent() async {
- final unspent = await Future.wait(walletAddresses
- .addresses.map((address) => electrumClient
+ final unspent = await Future.wait(walletAddresses.addresses.map((address) => electrumClient
.getListUnspentWithAddress(address.address, networkType)
- .then((unspent) => unspent
- .map((unspent) {
+ .then((unspent) => unspent.map((unspent) {
try {
return BitcoinUnspent.fromJSON(address, unspent);
- } catch(_) {
+ } catch (_) {
return null;
}
}).whereNotNull())));
unspentCoins = unspent.expand((e) => e).toList();
+ unspentCoins.forEach((coin) async {
+ final tx = await fetchTransactionInfo(hash: coin.hash, height: 0);
+ coin.isChange = tx!.direction == TransactionDirection.outgoing;
+ });
if (unspentCoinsInfo.isEmpty) {
unspentCoins.forEach((coin) => _addCoinInfo(coin));
@@ -498,8 +490,8 @@ abstract class ElectrumWalletBase extends WalletBase
- element.walletId.contains(id) && element.hash.contains(coin.hash));
+ final coinInfoList = unspentCoinsInfo.values
+ .where((element) => element.walletId.contains(id) && element.hash.contains(coin.hash));
if (coinInfoList.isNotEmpty) {
final coinInfo = coinInfoList.first;
@@ -518,14 +510,15 @@ abstract class ElectrumWalletBase extends WalletBase _addCoinInfo(BitcoinUnspent coin) async {
final newInfo = UnspentCoinsInfo(
- walletId: id,
- hash: coin.hash,
- isFrozen: coin.isFrozen,
- isSending: coin.isSending,
- noteRaw: coin.note,
- address: coin.address.address,
- value: coin.value,
- vout: coin.vout,
+ walletId: id,
+ hash: coin.hash,
+ isFrozen: coin.isFrozen,
+ isSending: coin.isSending,
+ noteRaw: coin.note,
+ address: coin.bitcoinAddressRecord.address,
+ value: coin.value,
+ vout: coin.vout,
+ isChange: coin.isChange,
);
await unspentCoinsInfo.add(newInfo);
@@ -534,8 +527,8 @@ abstract class ElectrumWalletBase extends WalletBase _refreshUnspentCoinsInfo() async {
try {
final List keys = [];
- final currentWalletUnspentCoins = unspentCoinsInfo.values
- .where((element) => element.walletId.contains(id));
+ final currentWalletUnspentCoins =
+ unspentCoinsInfo.values.where((element) => element.walletId.contains(id));
if (currentWalletUnspentCoins.isNotEmpty) {
currentWalletUnspentCoins.forEach((element) {
@@ -571,27 +564,19 @@ abstract class ElectrumWalletBase extends WalletBase fetchTransactionInfo(
{required String hash, required int height}) async {
- try {
- final tx = await getTransactionExpanded(hash: hash, height: height);
- final addresses = walletAddresses.addresses.map((addr) => addr.address).toSet();
- return ElectrumTransactionInfo.fromElectrumBundle(
- tx,
- walletInfo.type,
- networkType,
- addresses: addresses,
- height: height);
- } catch(_) {
- return null;
- }
+ try {
+ final tx = await getTransactionExpanded(hash: hash, height: height);
+ final addresses = walletAddresses.addresses.map((addr) => addr.address).toSet();
+ return ElectrumTransactionInfo.fromElectrumBundle(tx, walletInfo.type, networkType,
+ addresses: addresses, height: height);
+ } catch (_) {
+ return null;
+ }
}
@override
@@ -602,10 +587,8 @@ abstract class ElectrumWalletBase extends WalletBase electrumClient
- .getHistory(scriptHash)
- .then((history) => {scriptHash: history}));
+ final histories = addressHashes.keys.map((scriptHash) =>
+ electrumClient.getHistory(scriptHash).then((history) => {scriptHash: history}));
final historyResults = await Future.wait(histories);
historyResults.forEach((history) {
history.entries.forEach((historyItem) {
@@ -616,19 +599,16 @@ abstract class ElectrumWalletBase extends WalletBase>(
- {}, (acc, tx) {
+ final historiesWithDetails = await Future.wait(normalizedHistories.map((transaction) {
+ try {
+ return fetchTransactionInfo(
+ hash: transaction['tx_hash'] as String, height: transaction['height'] as int);
+ } catch (_) {
+ return Future.value(null);
+ }
+ }));
+ return historiesWithDetails
+ .fold