Merge branch 'cake-tech:main' into keystone-integration

This commit is contained in:
Charon-Fan 2024-12-18 09:56:58 +08:00 committed by GitHub
commit 88bcfc66f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 449 additions and 431 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

@ -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

@ -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,47 +99,54 @@ 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) {
if (_connectionChangeListener == null) { _connectionChangeSubscription = ledger.deviceStateChanges
_connectionChangeListener = ledger.deviceStateChanges.listen((event) { .listen(_connectionChangeListener);
printV('Ledger Device State Changed: $event');
if (event == sdk.BleConnectionState.disconnected) {
_connection = null;
if (type == WalletType.monero) {
monero!.resetLedgerConnection();
Navigator.of( navigatorKey.currentContext!).pushNamed(
Routes.connectDevices,
arguments: ConnectDevicePageParams(
walletType: WalletType.monero,
allowChangeWallet: true,
isReconnect: true,
onConnectDevice: (context, ledgerVM) async {
Navigator.of(context).pop();
},
),
);
}
}
});
} }
_connection = await ledger.connect(device); _connection = await ledger.connect(device);
_isConnecting = false;
} }
StreamSubscription<sdk.BleConnectionState>? _connectionChangeListener; StreamSubscription<sdk.BleConnectionState>? _connectionChangeSubscription;
sdk.LedgerConnection? _connection; sdk.LedgerConnection? _connection;
bool _isConnecting = true;
WalletType? _connectingWalletType;
void _connectionChangeListener(
sdk.BleConnectionState event, ) {
printV('Ledger Device State Changed: $event');
if (event == sdk.BleConnectionState.disconnected && !_isConnecting) {
_connection = null;
if (_connectingWalletType == WalletType.monero) {
monero!.resetLedgerConnection();
Navigator.of(navigatorKey.currentContext!).pushNamed(
Routes.connectDevices,
arguments: ConnectDevicePageParams(
walletType: WalletType.monero,
allowChangeWallet: true,
isReconnect: true,
onConnectDevice: (context, ledgerVM) async {
Navigator.of(context).pop();
},
),
);
}
}
}
bool get isConnected => _connection != null && !(_connection!.isDisconnected); bool get isConnected => _connection != null && !(_connection!.isDisconnected);

View file

@ -11,102 +11,99 @@ class SupportViewModel = SupportViewModelBase with _$SupportViewModel;
abstract class SupportViewModelBase with Store { abstract class SupportViewModelBase with Store {
SupportViewModelBase() SupportViewModelBase()
: items = [ : items = [
LinkListItem( LinkListItem(
title: 'Email', title: 'Email',
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'), LinkListItem(
if (!isMoneroOnly) title: 'Forum',
LinkListItem( icon: 'assets/images/discourse.png',
title: 'GitHub', linkTitle: 'forum.cakewallet.com',
icon: 'assets/images/github.png', link: 'https://forum.cakewallet.com'),
hasIconColor: true, LinkListItem(
linkTitle: S.current.apk_update, title: 'GitHub',
link: 'https://github.com/cake-tech/cake_wallet/releases'), icon: 'assets/images/github.png',
LinkListItem( hasIconColor: true,
title: 'Discord', linkTitle: S.current.apk_update,
icon: 'assets/images/discord.png', link: 'https://github.com/cake-tech/cake_wallet/releases'),
linkTitle: 'discord.gg/pwmWa6aFpX', LinkListItem(
link: 'https://discord.gg/pwmWa6aFpX'), title: 'Discord',
LinkListItem( icon: 'assets/images/discord.png',
title: 'Telegram', linkTitle: 'discord.gg/pwmWa6aFpX',
icon: 'assets/images/Telegram.png', link: 'https://discord.gg/pwmWa6aFpX'),
linkTitle: 't.me/cakewallet', LinkListItem(
link: 'https://t.me/cakewalletannouncements'), title: 'Telegram',
LinkListItem( icon: 'assets/images/Telegram.png',
title: 'Telegram Support Bot', linkTitle: 't.me/cakewallet',
icon: 'assets/images/Telegram.png', link: 'https://t.me/cakewalletannouncements'),
linkTitle: '@cakewallet_bot', LinkListItem(
link: 'https://t.me/cakewallet_bot'), title: 'Telegram Support Bot',
LinkListItem( icon: 'assets/images/Telegram.png',
title: 'ChangeNow', linkTitle: '@cakewallet_bot',
icon: 'assets/images/change_now.png', link: 'https://t.me/cakewallet_bot'),
linkTitle: 'support@changenow.io', LinkListItem(
link: 'mailto:support@changenow.io'), title: 'ChangeNow',
LinkListItem( icon: 'assets/images/change_now.png',
title: 'SideShift', linkTitle: 'support@changenow.io',
icon: 'assets/images/sideshift.png', link: 'mailto:support@changenow.io'),
linkTitle: 'help.sideshift.ai', LinkListItem(
link: 'https://help.sideshift.ai/en/'), title: 'SideShift',
LinkListItem( icon: 'assets/images/sideshift.png',
title: 'SimpleSwap', linkTitle: 'help.sideshift.ai',
icon: 'assets/images/simpleSwap.png', link: 'https://help.sideshift.ai/en/'),
linkTitle: 'support@simpleswap.io', LinkListItem(
link: 'mailto:support@simpleswap.io'), title: 'SimpleSwap',
LinkListItem( icon: 'assets/images/simpleSwap.png',
title: 'Exolix', linkTitle: 'support@simpleswap.io',
icon: 'assets/images/exolix.png', link: 'mailto:support@simpleswap.io'),
linkTitle: 'support@exolix.com', LinkListItem(
link: 'mailto:support@exolix.com'), title: 'Exolix',
LinkListItem( icon: 'assets/images/exolix.png',
title: 'Quantex', linkTitle: 'support@exolix.com',
icon: 'assets/images/quantex.png', link: 'mailto:support@exolix.com'),
linkTitle: 'help.myquantex.com', LinkListItem(
link: 'mailto:support@exolix.com'), title: 'Quantex',
LinkListItem( icon: 'assets/images/quantex.png',
title: 'Trocador', linkTitle: 'help.myquantex.com',
icon: 'assets/images/trocador.png', link: 'mailto:support@exolix.com'),
linkTitle: 'mail@trocador.app', LinkListItem(
link: 'mailto:mail@trocador.app'), title: 'Trocador',
LinkListItem( icon: 'assets/images/trocador.png',
title: 'Onramper', linkTitle: 'mail@trocador.app',
icon: 'assets/images/onramper_dark.png', link: 'mailto:mail@trocador.app'),
lightIcon: 'assets/images/onramper_light.png', LinkListItem(
linkTitle: 'View exchanges', title: 'Onramper',
link: 'https://docs.cakewallet.com/support/buy/#onramper'), icon: 'assets/images/onramper_dark.png',
LinkListItem( lightIcon: 'assets/images/onramper_light.png',
title: 'DFX', linkTitle: 'View exchanges',
icon: 'assets/images/dfx_dark.png', link: 'https://docs.cakewallet.com/support/buy/#onramper'),
lightIcon: 'assets/images/dfx_light.png', LinkListItem(
linkTitle: 'support@dfx.swiss', title: 'DFX',
link: 'mailto:support@dfx.swiss'), icon: 'assets/images/dfx_dark.png',
if (!isMoneroOnly) ... [ lightIcon: 'assets/images/dfx_light.png',
LinkListItem( linkTitle: 'support@dfx.swiss',
title: 'MoonPay', link: 'mailto:support@dfx.swiss'),
icon: 'assets/images/moonpay.png', if (!isMoneroOnly) ...[
linkTitle: S.current.submit_request, LinkListItem(
link: 'https://support.moonpay.com/hc/en-gb/requests/new'), title: 'MoonPay',
LinkListItem( icon: 'assets/images/moonpay.png',
title: 'Robinhood Connect', linkTitle: S.current.submit_request,
icon: 'assets/images/robinhood_dark.png', link: 'https://support.moonpay.com/hc/en-gb/requests/new'),
lightIcon: 'assets/images/robinhood_light.png', LinkListItem(
linkTitle: S.current.submit_request, title: 'Robinhood Connect',
link: 'https://robinhood.com/contact') icon: 'assets/images/robinhood_dark.png',
] lightIcon: 'assets/images/robinhood_light.png',
//LinkListItem( linkTitle: S.current.submit_request,
// title: 'Yat', link: 'https://robinhood.com/contact')
// 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;
} }