Merge branch 'main' into zano-pr

This commit is contained in:
cyan 2024-12-18 18:28:44 +01:00 committed by GitHub
commit be786635b6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 521 additions and 475 deletions

View file

@ -4,7 +4,7 @@ contact_links:
url: https://github.com/cake-tech/cake_wallet/discussions/new?category=feature-requests url: https://github.com/cake-tech/cake_wallet/discussions/new?category=feature-requests
about: Suggest an idea for Cake Wallet about: Suggest an idea for Cake Wallet
- name: Not sure where to start? - name: Not sure where to start?
url: https://guides.cakewallet.com url: https://docs.cakewallet.com
about: Start by reading checking out the guides! about: Start by reading checking out the guides!
- name: Need help? - name: Need help?
url: https://cakewallet.com/#contact url: https://cakewallet.com/#contact

View file

@ -1,298 +1,298 @@
#name: Automated Integration Tests name: Automated Integration Tests
#
#on: on:
# pull_request: # pull_request:
# branches: [main, CW-659-Transaction-History-Automated-Tests] # branches: [main, CW-659-Transaction-History-Automated-Tests]
# workflow_dispatch: workflow_dispatch:
# inputs: inputs:
# branch: branch:
# description: "Branch name to build" description: "Branch name to build"
# required: true required: true
# default: "main" default: "main"
#
#jobs: jobs:
# Automated_integration_test: Automated_integration_test:
# runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
# strategy: strategy:
# fail-fast: false fail-fast: false
# matrix: matrix:
# api-level: [29] api-level: [29]
# # arch: [x86, x86_64] # arch: [x86, x86_64]
# env: env:
# STORE_PASS: test@cake_wallet STORE_PASS: test@cake_wallet
# KEY_PASS: test@cake_wallet KEY_PASS: test@cake_wallet
# PR_NUMBER: ${{ github.event.number }} PR_NUMBER: ${{ github.event.number }}
#
# steps: steps:
# - name: is pr - name: is pr
# if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
# run: echo "BRANCH_NAME=${GITHUB_HEAD_REF}" >> $GITHUB_ENV run: echo "BRANCH_NAME=${GITHUB_HEAD_REF}" >> $GITHUB_ENV
#
# - name: is not pr - name: is not pr
# if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
# run: echo "BRANCH_NAME=${{ github.event.inputs.branch }}" >> $GITHUB_ENV run: echo "BRANCH_NAME=${{ github.event.inputs.branch }}" >> $GITHUB_ENV
#
# - name: Free Disk Space (Ubuntu) - name: Free Disk Space (Ubuntu)
# uses: insightsengineering/disk-space-reclaimer@v1 uses: insightsengineering/disk-space-reclaimer@v1
# with: with:
# tools-cache: true tools-cache: true
# android: false android: false
# dotnet: true dotnet: true
# haskell: true haskell: true
# large-packages: true large-packages: true
# swap-storage: true swap-storage: true
# docker-images: true docker-images: true
#
# - uses: actions/checkout@v2 - uses: actions/checkout@v2
# - uses: actions/setup-java@v2 - uses: actions/setup-java@v2
# with: with:
# distribution: "temurin" distribution: "temurin"
# java-version: "17" java-version: "17"
# - name: Configure placeholder git details - name: Configure placeholder git details
# run: | run: |
# git config --global user.email "CI@cakewallet.com" git config --global user.email "CI@cakewallet.com"
# git config --global user.name "Cake Github Actions" git config --global user.name "Cake Github Actions"
# - name: Flutter action - name: Flutter action
# uses: subosito/flutter-action@v1 uses: subosito/flutter-action@v1
# with: with:
# flutter-version: "3.24.0" flutter-version: "3.24.0"
# channel: stable channel: stable
#
# - name: Install package dependencies - name: Install package dependencies
# run: | run: |
# sudo apt update sudo apt update
# sudo apt-get install -y curl unzip automake build-essential file pkg-config git python libtool libtinfo5 cmake clang sudo apt-get install -y curl unzip automake build-essential file pkg-config git python libtool libtinfo5 cmake clang
#
# - name: Execute Build and Setup Commands - name: Execute Build and Setup Commands
# run: | run: |
# sudo mkdir -p /opt/android sudo mkdir -p /opt/android
# sudo chown $USER /opt/android sudo chown $USER /opt/android
# cd /opt/android cd /opt/android
# -y curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -y curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# cargo install cargo-ndk cargo install cargo-ndk
# git clone https://github.com/cake-tech/cake_wallet.git --branch ${{ env.BRANCH_NAME }} git clone https://github.com/cake-tech/cake_wallet.git --branch ${{ env.BRANCH_NAME }}
# cd cake_wallet/scripts/android/ cd cake_wallet/scripts/android/
# ./install_ndk.sh ./install_ndk.sh
# source ./app_env.sh cakewallet source ./app_env.sh cakewallet
# chmod +x pubspec_gen.sh chmod +x pubspec_gen.sh
# ./app_config.sh ./app_config.sh
#
# - name: Cache Externals - name: Cache Externals
# id: cache-externals id: cache-externals
# uses: actions/cache@v3 uses: actions/cache@v3
# with: with:
# path: | path: |
# /opt/android/cake_wallet/cw_haven/android/.cxx /opt/android/cake_wallet/cw_haven/android/.cxx
# /opt/android/cake_wallet/scripts/monero_c/release /opt/android/cake_wallet/scripts/monero_c/release
# key: ${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh' ,'**/cache_dependencies.yml') }} key: ${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh' ,'**/cache_dependencies.yml') }}
#
# - if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }} - if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
# name: Generate Externals name: Generate Externals
# run: | run: |
# cd /opt/android/cake_wallet/scripts/android/ cd /opt/android/cake_wallet/scripts/android/
# source ./app_env.sh cakewallet source ./app_env.sh cakewallet
# ./build_monero_all.sh ./build_monero_all.sh
#
# - name: Install Flutter dependencies - name: Install Flutter dependencies
# run: | run: |
# cd /opt/android/cake_wallet cd /opt/android/cake_wallet
# flutter pub get flutter pub get
#
#
# - name: Install go and gomobile - name: Install go and gomobile
# run: | run: |
# # install go > 1.23: # install go > 1.23:
# wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz
# sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.1.linux-amd64.tar.gz sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.1.linux-amd64.tar.gz
# export PATH=$PATH:/usr/local/go/bin export PATH=$PATH:/usr/local/go/bin
# export PATH=$PATH:~/go/bin export PATH=$PATH:~/go/bin
# go install golang.org/x/mobile/cmd/gomobile@latest go install golang.org/x/mobile/cmd/gomobile@latest
# gomobile init gomobile init
#
# - name: Build mwebd - name: Build mwebd
# run: | run: |
# # paths are reset after each step, so we need to set them again: # paths are reset after each step, so we need to set them again:
# export PATH=$PATH:/usr/local/go/bin export PATH=$PATH:/usr/local/go/bin
# export PATH=$PATH:~/go/bin export PATH=$PATH:~/go/bin
# cd /opt/android/cake_wallet/scripts/android/ cd /opt/android/cake_wallet/scripts/android/
# ./build_mwebd.sh --dont-install ./build_mwebd.sh --dont-install
#
# - name: Generate KeyStore - name: Generate KeyStore
# run: | run: |
# cd /opt/android/cake_wallet/android/app cd /opt/android/cake_wallet/android/app
# keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias testKey -noprompt -dname "CN=CakeWallet, OU=CakeWallet, O=CakeWallet, L=Florida, S=America, C=USA" -storepass $STORE_PASS -keypass $KEY_PASS keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias testKey -noprompt -dname "CN=CakeWallet, OU=CakeWallet, O=CakeWallet, L=Florida, S=America, C=USA" -storepass $STORE_PASS -keypass $KEY_PASS
#
# - name: Generate key properties - name: Generate key properties
# run: | run: |
# cd /opt/android/cake_wallet cd /opt/android/cake_wallet
# flutter packages pub run tool/generate_android_key_properties.dart keyAlias=testKey storeFile=key.jks storePassword=$STORE_PASS keyPassword=$KEY_PASS flutter packages pub run tool/generate_android_key_properties.dart keyAlias=testKey storeFile=key.jks storePassword=$STORE_PASS keyPassword=$KEY_PASS
#
# - name: Generate localization - name: Generate localization
# run: | run: |
# cd /opt/android/cake_wallet cd /opt/android/cake_wallet
# flutter packages pub run tool/generate_localization.dart flutter packages pub run tool/generate_localization.dart
#
# - name: Build generated code - name: Build generated code
# run: | run: |
# cd /opt/android/cake_wallet cd /opt/android/cake_wallet
# ./model_generator.sh ./model_generator.sh
#
# - name: Add secrets - name: Add secrets
# run: | run: |
# cd /opt/android/cake_wallet cd /opt/android/cake_wallet
# touch lib/.secrets.g.dart touch lib/.secrets.g.dart
# touch cw_evm/lib/.secrets.g.dart touch cw_evm/lib/.secrets.g.dart
# touch cw_solana/lib/.secrets.g.dart touch cw_solana/lib/.secrets.g.dart
# touch cw_core/lib/.secrets.g.dart touch cw_core/lib/.secrets.g.dart
# touch cw_nano/lib/.secrets.g.dart touch cw_nano/lib/.secrets.g.dart
# touch cw_tron/lib/.secrets.g.dart touch cw_tron/lib/.secrets.g.dart
# echo "const salt = '${{ secrets.SALT }}';" > lib/.secrets.g.dart echo "const salt = '${{ secrets.SALT }}';" > lib/.secrets.g.dart
# echo "const keychainSalt = '${{ secrets.KEY_CHAIN_SALT }}';" >> lib/.secrets.g.dart echo "const keychainSalt = '${{ secrets.KEY_CHAIN_SALT }}';" >> lib/.secrets.g.dart
# echo "const key = '${{ secrets.KEY }}';" >> lib/.secrets.g.dart echo "const key = '${{ secrets.KEY }}';" >> lib/.secrets.g.dart
# echo "const walletSalt = '${{ secrets.WALLET_SALT }}';" >> lib/.secrets.g.dart echo "const walletSalt = '${{ secrets.WALLET_SALT }}';" >> lib/.secrets.g.dart
# echo "const shortKey = '${{ secrets.SHORT_KEY }}';" >> lib/.secrets.g.dart echo "const shortKey = '${{ secrets.SHORT_KEY }}';" >> lib/.secrets.g.dart
# echo "const backupSalt = '${{ secrets.BACKUP_SALT }}';" >> lib/.secrets.g.dart echo "const backupSalt = '${{ secrets.BACKUP_SALT }}';" >> lib/.secrets.g.dart
# echo "const backupKeychainSalt = '${{ secrets.BACKUP_KEY_CHAIN_SALT }}';" >> lib/.secrets.g.dart echo "const backupKeychainSalt = '${{ secrets.BACKUP_KEY_CHAIN_SALT }}';" >> lib/.secrets.g.dart
# echo "const changeNowApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart echo "const changeNowApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const changeNowApiKeyDesktop = '${{ secrets.CHANGE_NOW_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart echo "const changeNowApiKeyDesktop = '${{ secrets.CHANGE_NOW_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
# echo "const wyreSecretKey = '${{ secrets.WYRE_SECRET_KEY }}';" >> lib/.secrets.g.dart echo "const wyreSecretKey = '${{ secrets.WYRE_SECRET_KEY }}';" >> lib/.secrets.g.dart
# echo "const wyreApiKey = '${{ secrets.WYRE_API_KEY }}';" >> lib/.secrets.g.dart echo "const wyreApiKey = '${{ secrets.WYRE_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const wyreAccountId = '${{ secrets.WYRE_ACCOUNT_ID }}';" >> lib/.secrets.g.dart echo "const wyreAccountId = '${{ secrets.WYRE_ACCOUNT_ID }}';" >> lib/.secrets.g.dart
# echo "const moonPayApiKey = '${{ secrets.MOON_PAY_API_KEY }}';" >> lib/.secrets.g.dart echo "const moonPayApiKey = '${{ secrets.MOON_PAY_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const moonPaySecretKey = '${{ secrets.MOON_PAY_SECRET_KEY }}';" >> lib/.secrets.g.dart echo "const moonPaySecretKey = '${{ secrets.MOON_PAY_SECRET_KEY }}';" >> lib/.secrets.g.dart
# echo "const sideShiftAffiliateId = '${{ secrets.SIDE_SHIFT_AFFILIATE_ID }}';" >> lib/.secrets.g.dart echo "const sideShiftAffiliateId = '${{ secrets.SIDE_SHIFT_AFFILIATE_ID }}';" >> lib/.secrets.g.dart
# echo "const simpleSwapApiKey = '${{ secrets.SIMPLE_SWAP_API_KEY }}';" >> lib/.secrets.g.dart echo "const simpleSwapApiKey = '${{ secrets.SIMPLE_SWAP_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const simpleSwapApiKeyDesktop = '${{ secrets.SIMPLE_SWAP_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart echo "const simpleSwapApiKeyDesktop = '${{ secrets.SIMPLE_SWAP_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
# echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const anypayToken = '${{ secrets.ANY_PAY_TOKEN }}';" >> lib/.secrets.g.dart echo "const anypayToken = '${{ secrets.ANY_PAY_TOKEN }}';" >> lib/.secrets.g.dart
# echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart
# echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart
# echo "const trocadorApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart echo "const trocadorApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const trocadorExchangeMarkup = '${{ secrets.TROCADOR_EXCHANGE_MARKUP }}';" >> lib/.secrets.g.dart echo "const trocadorExchangeMarkup = '${{ secrets.TROCADOR_EXCHANGE_MARKUP }}';" >> lib/.secrets.g.dart
# echo "const anonPayReferralCode = '${{ secrets.ANON_PAY_REFERRAL_CODE }}';" >> lib/.secrets.g.dart echo "const anonPayReferralCode = '${{ secrets.ANON_PAY_REFERRAL_CODE }}';" >> lib/.secrets.g.dart
# echo "const fiatApiKey = '${{ secrets.FIAT_API_KEY }}';" >> lib/.secrets.g.dart echo "const fiatApiKey = '${{ secrets.FIAT_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const payfuraApiKey = '${{ secrets.PAYFURA_API_KEY }}';" >> lib/.secrets.g.dart echo "const payfuraApiKey = '${{ secrets.PAYFURA_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> lib/.secrets.g.dart echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> lib/.secrets.g.dart echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> lib/.secrets.g.dart echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
# echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
# echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> 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 exolixApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart
# echo "const exchangeHelperApiKey = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart echo "const exchangeHelperApiKey = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
# echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart
# echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
# echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart
# echo "const testCakePayApiKey = '${{ secrets.TEST_CAKE_PAY_API_KEY }}';" >> lib/.secrets.g.dart echo "const testCakePayApiKey = '${{ secrets.TEST_CAKE_PAY_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const cakePayApiKey = '${{ secrets.CAKE_PAY_API_KEY }}';" >> lib/.secrets.g.dart echo "const cakePayApiKey = '${{ secrets.CAKE_PAY_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const authorization = '${{ secrets.CAKE_PAY_AUTHORIZATION }}';" >> lib/.secrets.g.dart echo "const authorization = '${{ secrets.CAKE_PAY_AUTHORIZATION }}';" >> lib/.secrets.g.dart
# echo "const CSRFToken = '${{ secrets.CSRF_TOKEN }}';" >> lib/.secrets.g.dart echo "const CSRFToken = '${{ secrets.CSRF_TOKEN }}';" >> lib/.secrets.g.dart
# echo "const quantexExchangeMarkup = '${{ secrets.QUANTEX_EXCHANGE_MARKUP }}';" >> lib/.secrets.g.dart echo "const quantexExchangeMarkup = '${{ secrets.QUANTEX_EXCHANGE_MARKUP }}';" >> lib/.secrets.g.dart
# echo "const nano2ApiKey = '${{ secrets.NANO2_API_KEY }}';" >> cw_nano/lib/.secrets.g.dart echo "const nano2ApiKey = '${{ secrets.NANO2_API_KEY }}';" >> cw_nano/lib/.secrets.g.dart
# echo "const nanoNowNodesApiKey = '${{ secrets.NANO_NOW_NODES_API_KEY }}';" >> cw_nano/lib/.secrets.g.dart echo "const nanoNowNodesApiKey = '${{ secrets.NANO_NOW_NODES_API_KEY }}';" >> cw_nano/lib/.secrets.g.dart
# echo "const tronGridApiKey = '${{ secrets.TRON_GRID_API_KEY }}';" >> cw_tron/lib/.secrets.g.dart echo "const tronGridApiKey = '${{ secrets.TRON_GRID_API_KEY }}';" >> cw_tron/lib/.secrets.g.dart
# echo "const tronNowNodesApiKey = '${{ secrets.TRON_NOW_NODES_API_KEY }}';" >> cw_tron/lib/.secrets.g.dart echo "const tronNowNodesApiKey = '${{ secrets.TRON_NOW_NODES_API_KEY }}';" >> cw_tron/lib/.secrets.g.dart
# echo "const meldTestApiKey = '${{ secrets.MELD_TEST_API_KEY }}';" >> lib/.secrets.g.dart echo "const meldTestApiKey = '${{ secrets.MELD_TEST_API_KEY }}';" >> lib/.secrets.g.dart
# echo "const meldTestPublicKey = '${{ secrets.MELD_TEST_PUBLIC_KEY}}';" >> lib/.secrets.g.dart echo "const meldTestPublicKey = '${{ secrets.MELD_TEST_PUBLIC_KEY}}';" >> lib/.secrets.g.dart
# echo "const letsExchangeBearerToken = '${{ secrets.LETS_EXCHANGE_TOKEN }}';" >> lib/.secrets.g.dart echo "const letsExchangeBearerToken = '${{ secrets.LETS_EXCHANGE_TOKEN }}';" >> lib/.secrets.g.dart
# echo "const letsExchangeAffiliateId = '${{ secrets.LETS_EXCHANGE_AFFILIATE_ID }}';" >> lib/.secrets.g.dart echo "const letsExchangeAffiliateId = '${{ secrets.LETS_EXCHANGE_AFFILIATE_ID }}';" >> lib/.secrets.g.dart
# echo "const stealthExBearerToken = '${{ secrets.STEALTH_EX_BEARER_TOKEN }}';" >> lib/.secrets.g.dart echo "const stealthExBearerToken = '${{ secrets.STEALTH_EX_BEARER_TOKEN }}';" >> lib/.secrets.g.dart
# echo "const stealthExAdditionalFeePercent = '${{ secrets.STEALTH_EX_ADDITIONAL_FEE_PERCENT }}';" >> lib/.secrets.g.dart echo "const stealthExAdditionalFeePercent = '${{ secrets.STEALTH_EX_ADDITIONAL_FEE_PERCENT }}';" >> lib/.secrets.g.dart
# echo "const moneroTestWalletSeeds ='${{ secrets.MONERO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const moneroTestWalletSeeds ='${{ secrets.MONERO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const moneroLegacyTestWalletSeeds = '${{ secrets.MONERO_LEGACY_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const moneroLegacyTestWalletSeeds = '${{ secrets.MONERO_LEGACY_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const bitcoinTestWalletSeeds = '${{ secrets.BITCOIN_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const bitcoinTestWalletSeeds = '${{ secrets.BITCOIN_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const ethereumTestWalletSeeds = '${{ secrets.ETHEREUM_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const ethereumTestWalletSeeds = '${{ secrets.ETHEREUM_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const litecoinTestWalletSeeds = '${{ secrets.LITECOIN_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const litecoinTestWalletSeeds = '${{ secrets.LITECOIN_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const bitcoinCashTestWalletSeeds = '${{ secrets.BITCOIN_CASH_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const bitcoinCashTestWalletSeeds = '${{ secrets.BITCOIN_CASH_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const polygonTestWalletSeeds = '${{ secrets.POLYGON_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const polygonTestWalletSeeds = '${{ secrets.POLYGON_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const solanaTestWalletSeeds = '${{ secrets.SOLANA_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const solanaTestWalletSeeds = '${{ secrets.SOLANA_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const tronTestWalletSeeds = '${{ secrets.TRON_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const tronTestWalletSeeds = '${{ secrets.TRON_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const nanoTestWalletSeeds = '${{ secrets.NANO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const nanoTestWalletSeeds = '${{ secrets.NANO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const wowneroTestWalletSeeds = '${{ secrets.WOWNERO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart echo "const wowneroTestWalletSeeds = '${{ secrets.WOWNERO_TEST_WALLET_SEEDS }}';" >> lib/.secrets.g.dart
# echo "const moneroTestWalletReceiveAddress = '${{ secrets.MONERO_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const moneroTestWalletReceiveAddress = '${{ secrets.MONERO_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const bitcoinTestWalletReceiveAddress = '${{ secrets.BITCOIN_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const bitcoinTestWalletReceiveAddress = '${{ secrets.BITCOIN_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const ethereumTestWalletReceiveAddress = '${{ secrets.ETHEREUM_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const ethereumTestWalletReceiveAddress = '${{ secrets.ETHEREUM_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const litecoinTestWalletReceiveAddress = '${{ secrets.LITECOIN_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const litecoinTestWalletReceiveAddress = '${{ secrets.LITECOIN_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const bitcoinCashTestWalletReceiveAddress = '${{ secrets.BITCOIN_CASH_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const bitcoinCashTestWalletReceiveAddress = '${{ secrets.BITCOIN_CASH_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const polygonTestWalletReceiveAddress = '${{ secrets.POLYGON_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const polygonTestWalletReceiveAddress = '${{ secrets.POLYGON_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const solanaTestWalletReceiveAddress = '${{ secrets.SOLANA_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const solanaTestWalletReceiveAddress = '${{ secrets.SOLANA_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const tronTestWalletReceiveAddress = '${{ secrets.TRON_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const tronTestWalletReceiveAddress = '${{ secrets.TRON_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const nanoTestWalletReceiveAddress = '${{ secrets.NANO_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const nanoTestWalletReceiveAddress = '${{ secrets.NANO_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const wowneroTestWalletReceiveAddress = '${{ secrets.WOWNERO_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart echo "const wowneroTestWalletReceiveAddress = '${{ secrets.WOWNERO_TEST_WALLET_RECEIVE_ADDRESS }}';" >> lib/.secrets.g.dart
# echo "const moneroTestWalletBlockHeight = '${{ secrets.MONERO_TEST_WALLET_BLOCK_HEIGHT }}';" >> lib/.secrets.g.dart echo "const moneroTestWalletBlockHeight = '${{ secrets.MONERO_TEST_WALLET_BLOCK_HEIGHT }}';" >> lib/.secrets.g.dart
#
# - name: Rename app - name: Rename app
# run: | run: |
# echo -e "id=com.cakewallet.test_${{ env.PR_NUMBER }}\nname=${{ env.BRANCH_NAME }}" > /opt/android/cake_wallet/android/app.properties echo -e "id=com.cakewallet.test_${{ env.PR_NUMBER }}\nname=${{ env.BRANCH_NAME }}" > /opt/android/cake_wallet/android/app.properties
#
# - name: Build - name: Build
# run: | run: |
# cd /opt/android/cake_wallet cd /opt/android/cake_wallet
# flutter build apk --release --split-per-abi flutter build apk --release --split-per-abi
#
# # - name: Rename apk file # - name: Rename apk file
# # run: | # run: |
# # cd /opt/android/cake_wallet/build/app/outputs/flutter-apk # cd /opt/android/cake_wallet/build/app/outputs/flutter-apk
# # mkdir test-apk # mkdir test-apk
# # cp app-arm64-v8a-release.apk test-apk/${{env.BRANCH_NAME}}.apk # cp app-arm64-v8a-release.apk test-apk/${{env.BRANCH_NAME}}.apk
# # cp app-x86_64-release.apk test-apk/${{env.BRANCH_NAME}}_x86.apk # cp app-x86_64-release.apk test-apk/${{env.BRANCH_NAME}}_x86.apk
#
# # - name: Upload Artifact # - name: Upload Artifact
# # uses: kittaakos/upload-artifact-as-is@v0 # uses: kittaakos/upload-artifact-as-is@v0
# # with: # with:
# # path: /opt/android/cake_wallet/build/app/outputs/flutter-apk/test-apk/ # path: /opt/android/cake_wallet/build/app/outputs/flutter-apk/test-apk/
#
# # - name: Send Test APK # - name: Send Test APK
# # continue-on-error: true # continue-on-error: true
# # uses: adrey/slack-file-upload-action@1.0.5 # uses: adrey/slack-file-upload-action@1.0.5
# # with: # with:
# # token: ${{ secrets.SLACK_APP_TOKEN }} # token: ${{ secrets.SLACK_APP_TOKEN }}
# # path: /opt/android/cake_wallet/build/app/outputs/flutter-apk/test-apk/${{env.BRANCH_NAME}}.apk # path: /opt/android/cake_wallet/build/app/outputs/flutter-apk/test-apk/${{env.BRANCH_NAME}}.apk
# # channel: ${{ secrets.SLACK_APK_CHANNEL }} # channel: ${{ secrets.SLACK_APK_CHANNEL }}
# # title: "${{ env.BRANCH_NAME }}.apk" # title: "${{ env.BRANCH_NAME }}.apk"
# # filename: ${{ env.BRANCH_NAME }}.apk # filename: ${{ env.BRANCH_NAME }}.apk
# # initial_comment: ${{ github.event.head_commit.message }} # initial_comment: ${{ github.event.head_commit.message }}
#
# - name: 🦾 Enable KVM - name: 🦾 Enable KVM
# run: | run: |
# echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
# sudo udevadm control --reload-rules sudo udevadm control --reload-rules
# sudo udevadm trigger --name-match=kvm sudo udevadm trigger --name-match=kvm
#
# - name: 🦾 Cache gradle - name: 🦾 Cache gradle
# uses: gradle/actions/setup-gradle@v3 uses: gradle/actions/setup-gradle@v3
#
# - name: 🦾 Cache AVD - name: 🦾 Cache AVD
# uses: actions/cache@v4 uses: actions/cache@v4
# id: avd-cache id: avd-cache
# with: with:
# path: | path: |
# ~/.android/avd/* ~/.android/avd/*
# ~/.android/adb* ~/.android/adb*
# key: avd-${{ matrix.api-level }} key: avd-${{ matrix.api-level }}
#
# - name: 🦾 Create AVD and generate snapshot for caching - name: 🦾 Create AVD and generate snapshot for caching
# if: steps.avd-cache.outputs.cache-hit != 'true' if: steps.avd-cache.outputs.cache-hit != 'true'
# uses: reactivecircus/android-emulator-runner@v2 uses: reactivecircus/android-emulator-runner@v2
# with: with:
# api-level: ${{ matrix.api-level }} api-level: ${{ matrix.api-level }}
# force-avd-creation: false force-avd-creation: false
# # arch: ${{ matrix.arch }} # arch: ${{ matrix.arch }}
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# working-directory: /opt/android/cake_wallet working-directory: /opt/android/cake_wallet
# disable-animations: false disable-animations: false
# script: echo "Generated AVD snapshot for caching." script: echo "Generated AVD snapshot for caching."
#
# - name: 🚀 Integration tests on Android Emulator - name: 🚀 Integration tests on Android Emulator
# uses: reactivecircus/android-emulator-runner@v2 uses: reactivecircus/android-emulator-runner@v2
# with: with:
# api-level: ${{ matrix.api-level }} api-level: ${{ matrix.api-level }}
# force-avd-creation: false force-avd-creation: false
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: true disable-animations: true
# working-directory: /opt/android/cake_wallet working-directory: /opt/android/cake_wallet
# script: | script: |
# chmod a+rx integration_test_runner.sh chmod a+rx integration_test_runner.sh
# ./integration_test_runner.sh ./integration_test_runner.sh

BIN
assets/images/discord.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
assets/images/discourse.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View file

@ -1,6 +1,5 @@
- -
uri: rpc.ankr.com uri: rpc.ankr.com
is_default: true
useSSL: true useSSL: true
- -
uri: api.mainnet-beta.solana.com:443 uri: api.mainnet-beta.solana.com:443
@ -8,3 +7,4 @@
- -
uri: solana-rpc.publicnode.com:443 uri: solana-rpc.publicnode.com:443
useSSL: true useSSL: true
is_default: true

View file

@ -1,2 +1,3 @@
UI/UX enhancements Support Monero Ledger
Bug fixes and app improvements Bug fixes
New designs and better user experience

View file

@ -1,2 +1,5 @@
UI/UX enhancements Support Monero Ledger
Bug fixes and app improvements Prepare for Haven removal
Improve Ethereum and Polygon sending process
Bug fixes
New designs and better user experience

View file

@ -4,9 +4,8 @@
useSSL: true useSSL: true
- -
uri: api.trongrid.io uri: api.trongrid.io
is_default: false is_default: true
useSSL: true useSSL: true
- -
uri: trx.nownodes.io uri: trx.nownodes.io
is_default: true
useSSL: true useSSL: true

View file

@ -1099,6 +1099,7 @@ abstract class ElectrumWalletBase
)..addListener((transaction) async { )..addListener((transaction) async {
transactionHistory.addOne(transaction); transactionHistory.addOne(transaction);
await updateBalance(); await updateBalance();
await updateAllUnspents();
}); });
} }
@ -1191,6 +1192,7 @@ abstract class ElectrumWalletBase
.removeWhere((utxo) => estimatedTx.utxos.any((e) => e.utxo.txHash == utxo.hash)); .removeWhere((utxo) => estimatedTx.utxos.any((e) => e.utxo.txHash == utxo.hash));
await updateBalance(); await updateBalance();
await updateAllUnspents();
}); });
} catch (e) { } catch (e) {
throw e; throw e;
@ -1796,6 +1798,7 @@ abstract class ElectrumWalletBase
}); });
transactionHistory.addOne(transaction); transactionHistory.addOne(transaction);
await updateBalance(); await updateBalance();
await updateAllUnspents();
}); });
} catch (e) { } catch (e) {
throw e; throw e;

View file

@ -758,6 +758,13 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
if (!mwebEnabled) return false; if (!mwebEnabled) return false;
if (!tx.isPending) return false; if (!tx.isPending) return false;
final isMwebTx = (tx.inputAddresses?.any((addr) => addr.contains("mweb")) ?? false) ||
(tx.outputAddresses?.any((addr) => addr.contains("mweb")) ?? false);
if (!isMwebTx) {
return false;
}
final outputId = <String>[], target = <String>{}; final outputId = <String>[], target = <String>{};
final isHash = RegExp(r'^[a-f0-9]{64}$').hasMatch; final isHash = RegExp(r'^[a-f0-9]{64}$').hasMatch;
final spendingOutputIds = tx.inputAddresses?.where(isHash) ?? []; final spendingOutputIds = tx.inputAddresses?.where(isHash) ?? [];

View file

@ -732,10 +732,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.2.4"
watcher: watcher:
dependency: "direct overridden" dependency: "direct overridden"
description: description:

View file

@ -845,10 +845,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.2.4"
watcher: watcher:
dependency: "direct overridden" dependency: "direct overridden"
description: description:

View file

@ -874,10 +874,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.2.4"
watcher: watcher:
dependency: "direct overridden" dependency: "direct overridden"
description: description:

View file

@ -22,11 +22,11 @@ class PolygonClient extends EVMChainClient {
from: from, from: from,
to: to, to: to,
value: amount, value: amount,
data: data, // data: data,
maxGas: maxGas, maxGas: maxGas,
gasPrice: gasPrice, // gasPrice: gasPrice,
maxFeePerGas: maxFeePerGas, // maxFeePerGas: maxFeePerGas,
maxPriorityFeePerGas: maxPriorityFeePerGas, // maxPriorityFeePerGas: maxPriorityFeePerGas,
); );
} }

View file

@ -773,10 +773,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.2.4"
watcher: watcher:
dependency: "direct overridden" dependency: "direct overridden"
description: description:

View file

@ -1,13 +1,11 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io' show Directory, File, Platform; import 'dart:io' show Directory, File, Platform;
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/core/key_service.dart';
import 'package:cake_wallet/core/secure_storage.dart'; import 'package:cake_wallet/core/secure_storage.dart';
import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cake_wallet/entities/exchange_api_mode.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cake_wallet/entities/haven_seed_store.dart'; import 'package:cake_wallet/entities/haven_seed_store.dart';
import 'package:cake_wallet/haven/haven.dart'; import 'package:cake_wallet/haven/haven.dart';
import 'package:cw_core/cake_hive.dart';
import 'package:cw_core/pathForWallet.dart'; import 'package:cw_core/pathForWallet.dart';
import 'package:cake_wallet/entities/secret_store_key.dart'; import 'package:cake_wallet/entities/secret_store_key.dart';
import 'package:cw_core/root_dir.dart'; import 'package:cw_core/root_dir.dart';
@ -42,8 +40,8 @@ const polygonDefaultNodeUri = 'polygon-bor.publicnode.com';
const cakeWalletBitcoinCashDefaultNodeUri = 'bitcoincash.stackwallet.com:50002'; const cakeWalletBitcoinCashDefaultNodeUri = 'bitcoincash.stackwallet.com:50002';
const nanoDefaultNodeUri = 'nano.nownodes.io'; const nanoDefaultNodeUri = 'nano.nownodes.io';
const nanoDefaultPowNodeUri = 'rpc.nano.to'; const nanoDefaultPowNodeUri = 'rpc.nano.to';
const solanaDefaultNodeUri = 'rpc.ankr.com'; const solanaDefaultNodeUri = 'solana-rpc.publicnode.com:443';
const tronDefaultNodeUri = 'trx.nownodes.io'; const tronDefaultNodeUri = 'api.trongrid.io';
const newCakeWalletBitcoinUri = 'btc-electrum.cakewallet.com:50002'; const newCakeWalletBitcoinUri = 'btc-electrum.cakewallet.com:50002';
const wowneroDefaultNodeUri = 'node3.monerodevs.org:34568'; const wowneroDefaultNodeUri = 'node3.monerodevs.org:34568';
const zanoDefaultNodeUri = '195.201.107.230:33340'; const zanoDefaultNodeUri = '195.201.107.230:33340';
@ -314,10 +312,32 @@ Future<void> defaultSettingsMigration(
useSSL: true, useSSL: true,
); );
case 47: case 47:
_changeDefaultNode(
nodes: nodes,
sharedPreferences: sharedPreferences,
type: WalletType.tron,
newDefaultUri: tronDefaultNodeUri,
currentNodePreferenceKey: PreferencesKey.currentTronNodeIdKey,
useSSL: true,
oldUri: [
'tron-rpc.publicnode.com:443',
'trx.nownodes.io',
],
);
_changeDefaultNode(
nodes: nodes,
sharedPreferences: sharedPreferences,
type: WalletType.solana,
newDefaultUri: solanaDefaultNodeUri,
currentNodePreferenceKey: PreferencesKey.currentSolanaNodeIdKey,
useSSL: true,
oldUri: ['rpc.ankr.com'],
);
case 48:
await addZanoNodeList(nodes: nodes); await addZanoNodeList(nodes: nodes);
await changeZanoCurrentNodeToDefault(sharedPreferences: sharedPreferences, nodes: nodes); await changeZanoCurrentNodeToDefault(sharedPreferences: sharedPreferences, nodes: nodes);
break; break;
default: default:
break; break;
} }
@ -339,6 +359,7 @@ Future<void> _backupHavenSeeds(Box<HavenSeedStore> havenSeedStore) async {
} }
return; return;
} }
/// generic function for changing any wallet default node /// generic function for changing any wallet default node
/// instead of making a new function for each change /// instead of making a new function for each change
Future<void> _changeDefaultNode({ Future<void> _changeDefaultNode({

View file

@ -92,6 +92,7 @@ class ConnectDevicePageBodyState extends State<ConnectDevicePageBody> {
late StreamSubscription<LedgerDevice>? _bleRefresh = null; late StreamSubscription<LedgerDevice>? _bleRefresh = null;
bool longWait = false; bool longWait = false;
Timer? _longWaitTimer;
@override @override
void initState() { void initState() {
@ -108,7 +109,7 @@ class ConnectDevicePageBodyState extends State<ConnectDevicePageBody> {
Timer.periodic(Duration(seconds: 1), (_) => _refreshUsbDevices()); Timer.periodic(Duration(seconds: 1), (_) => _refreshUsbDevices());
} }
Future.delayed(Duration(seconds: 10), () { _longWaitTimer = Timer(Duration(seconds: 10), () {
if (widget.ledgerVM.bleIsEnabled && bleDevices.isEmpty) if (widget.ledgerVM.bleIsEnabled && bleDevices.isEmpty)
setState(() => longWait = true); setState(() => longWait = true);
}); });
@ -121,6 +122,7 @@ class ConnectDevicePageBodyState extends State<ConnectDevicePageBody> {
_bleStateTimer?.cancel(); _bleStateTimer?.cancel();
_usbRefreshTimer?.cancel(); _usbRefreshTimer?.cancel();
_bleRefresh?.cancel(); _bleRefresh?.cancel();
_longWaitTimer?.cancel();
widget.ledgerVM.stopScanning(); widget.ledgerVM.stopScanning();
super.dispose(); super.dispose();
@ -206,7 +208,8 @@ class ConnectDevicePageBodyState extends State<ConnectDevicePageBody> {
offstage: !longWait, offstage: !longWait,
child: Padding( child: Padding(
padding: EdgeInsets.only(left: 20, right: 20, bottom: 20), padding: EdgeInsets.only(left: 20, right: 20, bottom: 20),
child: Text(S.of(context).if_you_dont_see_your_device, child: Text(
S.of(context).if_you_dont_see_your_device,
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
@ -235,7 +238,6 @@ class ConnectDevicePageBodyState extends State<ConnectDevicePageBody> {
), ),
), ),
), ),
if (bleDevices.length > 0) ...[ if (bleDevices.length > 0) ...[
Padding( Padding(
padding: EdgeInsets.only(left: 20, right: 20, bottom: 20), padding: EdgeInsets.only(left: 20, right: 20, bottom: 20),
@ -277,7 +279,9 @@ class ConnectDevicePageBodyState extends State<ConnectDevicePageBody> {
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: 14,
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor, color: Theme.of(context)
.extension<CakeTextTheme>()!
.titleColor,
), ),
), ),
), ),
@ -299,8 +303,12 @@ class ConnectDevicePageBodyState extends State<ConnectDevicePageBody> {
if (widget.allowChangeWallet) ...[ if (widget.allowChangeWallet) ...[
PrimaryButton( PrimaryButton(
text: S.of(context).wallets, text: S.of(context).wallets,
color: Theme.of(context).extension<WalletListTheme>()!.createNewWalletButtonBackgroundColor, color: Theme.of(context)
textColor: Theme.of(context).extension<WalletListTheme>()!.restoreWalletButtonTextColor, .extension<WalletListTheme>()!
.createNewWalletButtonBackgroundColor,
textColor: Theme.of(context)
.extension<WalletListTheme>()!
.restoreWalletButtonTextColor,
onPressed: _onChangeWallet, onPressed: _onChangeWallet,
) )
], ],

View file

@ -384,7 +384,7 @@ class CryptoBalanceWidget extends StatelessWidget {
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () => launchUrl( onTap: () => launchUrl(
Uri.parse( Uri.parse(
"https://guides.cakewallet.com/docs/cryptos/litecoin/#mweb"), "https://docs.cakewallet.com/cryptos/litecoin/#mweb"),
mode: LaunchMode.externalApplication, mode: LaunchMode.externalApplication,
), ),
child: Text( child: Text(

View file

@ -25,7 +25,7 @@ class WelcomePage extends BasePage {
@override @override
Widget trailing(BuildContext context) { Widget trailing(BuildContext context) {
final Uri _url = Uri.parse('https://guides.cakewallet.com/docs/basic-features/basic-features/'); final Uri _url = Uri.parse('https://docs.cakewallet.com/get-started/setup/create-first-wallet/');
return IconButton( return IconButton(
icon: Icon(Icons.info_outline), icon: Icon(Icons.info_outline),
onPressed: () async { onPressed: () async {

View file

@ -99,27 +99,41 @@ abstract class LedgerViewModelBase with Store {
} }
Future<void> connectLedger(sdk.LedgerDevice device, WalletType type) async { Future<void> connectLedger(sdk.LedgerDevice device, WalletType type) async {
_isConnecting = true;
_connectingWalletType = type;
if (isConnected) { if (isConnected) {
try { try {
await _connectionChangeListener?.cancel();
_connectionChangeListener = null;
await _connection!.disconnect().catchError((_) {}); await _connection!.disconnect().catchError((_) {});
} catch (_) {} } catch (_) {}
} }
final ledger = device.connectionType == sdk.ConnectionType.ble final ledger = device.connectionType == sdk.ConnectionType.ble
? ledgerPlusBLE ? ledgerPlusBLE
: ledgerPlusUSB; : ledgerPlusUSB;
if (_connectionChangeSubscription == null) {
_connectionChangeSubscription = ledger.deviceStateChanges
.listen(_connectionChangeListener);
}
if (_connectionChangeListener == null) { _connection = await ledger.connect(device);
_connectionChangeListener = ledger.deviceStateChanges.listen((event) { _isConnecting = false;
}
StreamSubscription<sdk.BleConnectionState>? _connectionChangeSubscription;
sdk.LedgerConnection? _connection;
bool _isConnecting = true;
WalletType? _connectingWalletType;
void _connectionChangeListener(
sdk.BleConnectionState event, ) {
printV('Ledger Device State Changed: $event'); printV('Ledger Device State Changed: $event');
if (event == sdk.BleConnectionState.disconnected) { if (event == sdk.BleConnectionState.disconnected && !_isConnecting) {
_connection = null; _connection = null;
if (type == WalletType.monero) { if (_connectingWalletType == WalletType.monero) {
monero!.resetLedgerConnection(); monero!.resetLedgerConnection();
Navigator.of( navigatorKey.currentContext!).pushNamed( Navigator.of(navigatorKey.currentContext!).pushNamed(
Routes.connectDevices, Routes.connectDevices,
arguments: ConnectDevicePageParams( arguments: ConnectDevicePageParams(
walletType: WalletType.monero, walletType: WalletType.monero,
@ -132,15 +146,8 @@ abstract class LedgerViewModelBase with Store {
); );
} }
} }
});
} }
_connection = await ledger.connect(device);
}
StreamSubscription<sdk.BleConnectionState>? _connectionChangeListener;
sdk.LedgerConnection? _connection;
bool get isConnected => _connection != null && !(_connection!.isDisconnected); bool get isConnected => _connection != null && !(_connection!.isDisconnected);
sdk.LedgerConnection get connection => _connection!; sdk.LedgerConnection get connection => _connection!;

View file

@ -27,7 +27,6 @@ import 'package:cw_core/transaction_priority.dart';
import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/unspent_coin_type.dart';
import 'package:cake_wallet/view_model/send/output.dart'; import 'package:cake_wallet/view_model/send/output.dart';
import 'package:cake_wallet/view_model/send/send_template_view_model.dart'; import 'package:cake_wallet/view_model/send/send_template_view_model.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:cw_solana/solana_exceptions.dart'; import 'package:cw_solana/solana_exceptions.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
@ -103,6 +102,8 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
outputs outputs
.add(Output(wallet, _settingsStore, _fiatConversationStore, () => selectedCryptoCurrency)); .add(Output(wallet, _settingsStore, _fiatConversationStore, () => selectedCryptoCurrency));
unspentCoinsListViewModel.initialSetup();
} }
@observable @observable
@ -723,9 +724,9 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
return return
'''${S.current.insufficient_funds_for_tx} \n\n''' '''${S.current.insufficient_funds_for_tx} \n\n'''
'''${S.current.balance}: ${parsedErrorMessageResult.balanceEth} ETH (${parsedErrorMessageResult.balanceUsd} USD)\n\n''' '''${S.current.balance}: ${parsedErrorMessageResult.balanceEth} ${walletType == WalletType.polygon ? "POL" : "ETH"} (${parsedErrorMessageResult.balanceUsd} ${fiatFromSettings.name})\n\n'''
'''${S.current.transaction_cost}: ${parsedErrorMessageResult.txCostEth} ETH (${parsedErrorMessageResult.txCostUsd} USD)\n\n''' '''${S.current.transaction_cost}: ${parsedErrorMessageResult.txCostEth} ${walletType == WalletType.polygon ? "POL" : "ETH"} (${parsedErrorMessageResult.txCostUsd} ${fiatFromSettings.name})\n\n'''
'''${S.current.overshot}: ${parsedErrorMessageResult.overshotEth} ETH (${parsedErrorMessageResult.overshotUsd} USD)'''; '''${S.current.overshot}: ${parsedErrorMessageResult.overshotEth} ${walletType == WalletType.polygon ? "POL" : "ETH"} (${parsedErrorMessageResult.overshotUsd} ${fiatFromSettings.name})''';
} }
return errorMessage; return errorMessage;

View file

@ -17,13 +17,16 @@ abstract class SupportViewModelBase with Store {
icon: 'assets/images/support_icon.png', icon: 'assets/images/support_icon.png',
linkTitle: 'support@cakewallet.com', linkTitle: 'support@cakewallet.com',
link: 'mailto:support@cakewallet.com'), link: 'mailto:support@cakewallet.com'),
if (!isMoneroOnly)
LinkListItem( LinkListItem(
title: 'Website', title: 'Website',
icon: 'assets/images/global.png', icon: 'assets/images/global.png',
linkTitle: 'cakewallet.com', linkTitle: 'cakewallet.com',
link: 'https://cakewallet.com'), link: 'https://cakewallet.com'),
if (!isMoneroOnly) LinkListItem(
title: 'Forum',
icon: 'assets/images/discourse.png',
linkTitle: 'forum.cakewallet.com',
link: 'https://forum.cakewallet.com'),
LinkListItem( LinkListItem(
title: 'GitHub', title: 'GitHub',
icon: 'assets/images/github.png', icon: 'assets/images/github.png',
@ -87,7 +90,7 @@ abstract class SupportViewModelBase with Store {
lightIcon: 'assets/images/dfx_light.png', lightIcon: 'assets/images/dfx_light.png',
linkTitle: 'support@dfx.swiss', linkTitle: 'support@dfx.swiss',
link: 'mailto:support@dfx.swiss'), link: 'mailto:support@dfx.swiss'),
if (!isMoneroOnly) ... [ if (!isMoneroOnly) ...[
LinkListItem( LinkListItem(
title: 'MoonPay', title: 'MoonPay',
icon: 'assets/images/moonpay.png', icon: 'assets/images/moonpay.png',
@ -100,12 +103,6 @@ abstract class SupportViewModelBase with Store {
linkTitle: S.current.submit_request, linkTitle: S.current.submit_request,
link: 'https://robinhood.com/contact') link: 'https://robinhood.com/contact')
] ]
//LinkListItem(
// title: 'Yat',
// icon: 'assets/images/yat_mini_logo.png',
// hasIconColor: true,
// linkTitle: 'support@y.at',
// link: 'mailto:support@y.at')
]; ];
final docsUrl = 'https://docs.cakewallet.com'; final docsUrl = 'https://docs.cakewallet.com';
@ -114,8 +111,7 @@ abstract class SupportViewModelBase with Store {
var supportUrl = var supportUrl =
"https://app.chatwoot.com/widget?website_token=${secrets.chatwootWebsiteToken}&locale=${locale}"; "https://app.chatwoot.com/widget?website_token=${secrets.chatwootWebsiteToken}&locale=${locale}";
if (authToken.isNotEmpty) if (authToken.isNotEmpty) supportUrl += "&cw_conversation=$authToken";
supportUrl += "&cw_conversation=$authToken";
return supportUrl; return supportUrl;
} }

View file

@ -15,15 +15,15 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
APP_ANDROID_TYPE=$1 APP_ANDROID_TYPE=$1
MONERO_COM_NAME="Monero.com" MONERO_COM_NAME="Monero.com"
MONERO_COM_VERSION="1.18.2" MONERO_COM_VERSION="1.19.0"
MONERO_COM_BUILD_NUMBER=108 MONERO_COM_BUILD_NUMBER=109
MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_BUNDLE_ID="com.monero.app"
MONERO_COM_PACKAGE="com.monero.app" MONERO_COM_PACKAGE="com.monero.app"
MONERO_COM_SCHEME="monero.com" MONERO_COM_SCHEME="monero.com"
CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="4.21.2" CAKEWALLET_VERSION="4.22.0"
CAKEWALLET_BUILD_NUMBER=239 CAKEWALLET_BUILD_NUMBER=240
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
CAKEWALLET_SCHEME="cakewallet" CAKEWALLET_SCHEME="cakewallet"

View file

@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
APP_IOS_TYPE=$1 APP_IOS_TYPE=$1
MONERO_COM_NAME="Monero.com" MONERO_COM_NAME="Monero.com"
MONERO_COM_VERSION="1.18.2" MONERO_COM_VERSION="1.19.0"
MONERO_COM_BUILD_NUMBER=105 MONERO_COM_BUILD_NUMBER=106
MONERO_COM_BUNDLE_ID="com.cakewallet.monero" MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="4.21.2" CAKEWALLET_VERSION="4.22.0"
CAKEWALLET_BUILD_NUMBER=284 CAKEWALLET_BUILD_NUMBER=287
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
HAVEN_NAME="Haven" HAVEN_NAME="Haven"

View file

@ -14,8 +14,8 @@ if [ -n "$1" ]; then
fi fi
CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="1.11.2" CAKEWALLET_VERSION="1.12.0"
CAKEWALLET_BUILD_NUMBER=40 CAKEWALLET_BUILD_NUMBER=41
if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then
echo "Wrong app type." echo "Wrong app type."

View file

@ -16,13 +16,13 @@ if [ -n "$1" ]; then
fi fi
MONERO_COM_NAME="Monero.com" MONERO_COM_NAME="Monero.com"
MONERO_COM_VERSION="1.8.1" MONERO_COM_VERSION="1.9.0"
MONERO_COM_BUILD_NUMBER=37 MONERO_COM_BUILD_NUMBER=39
MONERO_COM_BUNDLE_ID="com.cakewallet.monero" MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_NAME="Cake Wallet"
CAKEWALLET_VERSION="1.14.2" CAKEWALLET_VERSION="1.15.0"
CAKEWALLET_BUILD_NUMBER=98 CAKEWALLET_BUILD_NUMBER=99
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then

View file

@ -1,5 +1,5 @@
#define MyAppName "Cake Wallet" #define MyAppName "Cake Wallet"
#define MyAppVersion "0.2.1" #define MyAppVersion "0.3.0"
#define MyAppPublisher "Cake Labs LLC" #define MyAppPublisher "Cake Labs LLC"
#define MyAppURL "https://cakewallet.com/" #define MyAppURL "https://cakewallet.com/"
#define MyAppExeName "CakeWallet.exe" #define MyAppExeName "CakeWallet.exe"