From 5f4dc95ca521261b830ecb9c263c13535df51609 Mon Sep 17 00:00:00 2001 From: cyan Date: Mon, 14 Apr 2025 18:46:45 +0200 Subject: [PATCH 01/11] fix: do not overwrite monero backup files if they exist. (#2202) --- cw_core/lib/monero_wallet_utils.dart | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/cw_core/lib/monero_wallet_utils.dart b/cw_core/lib/monero_wallet_utils.dart index 8a4990f78..9682784f9 100644 --- a/cw_core/lib/monero_wallet_utils.dart +++ b/cw_core/lib/monero_wallet_utils.dart @@ -19,15 +19,15 @@ Future backupWalletFiles(String name) async { final newKeysFilePath = backupFileName(keysFile.path); final newAddressListFilePath = backupFileName(addressListFile.path); - if (cacheFile.existsSync()) { + if (cacheFile.existsSync() && !File(newCacheFilePath).existsSync()) { await cacheFile.copy(newCacheFilePath); } - if (keysFile.existsSync()) { + if (keysFile.existsSync() && !File(newKeysFilePath).existsSync()) { await keysFile.copy(newKeysFilePath); } - if (addressListFile.existsSync()) { + if (addressListFile.existsSync() && !File(newAddressListFilePath).existsSync()) { await addressListFile.copy(newAddressListFilePath); } } @@ -83,10 +83,13 @@ Future backupWalletFilesExists(String name) async { Future removeCache(String name) async { final path = await pathForWallet(name: name, type: WalletType.monero); final cacheFile = File(path); - + final backgroundCacheFile = File(path + ".background"); if (cacheFile.existsSync()) { cacheFile.deleteSync(); } + if (backgroundCacheFile.existsSync()) { + backgroundCacheFile.deleteSync(); + } } Future restoreOrResetWalletFiles(String name) async { @@ -94,7 +97,8 @@ Future restoreOrResetWalletFiles(String name) async { if (backupsExists) { await removeCache(name); - + // TODO(mrcyjanek): is this needed? + // If we remove cache then wallet should be restored from .keys file. await restoreWalletFiles(name); } } From 87207c61baa22f803cf4e072b16b1b5dc0eb0cbb Mon Sep 17 00:00:00 2001 From: cyan Date: Mon, 14 Apr 2025 18:47:31 +0200 Subject: [PATCH 02/11] fix: wallet grouping eating wallets (#2203) --- lib/entities/wallet_manager.dart | 8 +++- .../wallet_list/wallet_list_view_model.dart | 41 +------------------ 2 files changed, 9 insertions(+), 40 deletions(-) diff --git a/lib/entities/wallet_manager.dart b/lib/entities/wallet_manager.dart index 8bcabcaf2..09b764289 100644 --- a/lib/entities/wallet_manager.dart +++ b/lib/entities/wallet_manager.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:cake_wallet/entities/hash_wallet_identifier.dart'; import 'package:cake_wallet/entities/wallet_group.dart'; import 'package:cw_core/wallet_base.dart'; @@ -33,7 +35,11 @@ class WalletManager { } // Fallback to old logic - return walletInfo.parentAddress ?? walletInfo.address; + final address = walletInfo.parentAddress ?? walletInfo.address; + if (address.isEmpty) { + return Random().nextInt(100000).toString(); + } + return address; } WalletGroup _getOrCreateGroup(String groupKey) { diff --git a/lib/view_model/wallet_list/wallet_list_view_model.dart b/lib/view_model/wallet_list/wallet_list_view_model.dart index b27bf52f6..bd135ef96 100644 --- a/lib/view_model/wallet_list/wallet_list_view_model.dart +++ b/lib/view_model/wallet_list/wallet_list_view_model.dart @@ -3,6 +3,7 @@ import 'package:cake_wallet/entities/wallet_group.dart'; import 'package:cake_wallet/entities/wallet_list_order_types.dart'; import 'package:cake_wallet/entities/wallet_manager.dart'; import 'package:cake_wallet/reactions/bip39_wallet_utils.dart'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/store/app_store.dart'; @@ -109,45 +110,7 @@ abstract class WalletListViewModelBase with Store { continue; } - // Identify wallets that should be moved to singleWalletsList using the filters: the type/derivation - final excludedWallets = []; - - for (var wallet in group.wallets) { - // Check for non-BIP39 wallet types - final isNonBIP39 = !isBIP39Wallet(wallet.type); - - // Check for nano derivation type - final isNanoDerivation = wallet.type == WalletType.nano && - wallet.derivationInfo?.derivationType == DerivationType.nano; - - // Check for electrum derivation type - final isElectrumDerivation = - (wallet.type == WalletType.bitcoin || wallet.type == WalletType.litecoin) && - wallet.derivationInfo?.derivationType == DerivationType.electrum; - - if (isNonBIP39 || isNanoDerivation || isElectrumDerivation) { - excludedWallets.add(wallet); - } - } - - // Add excluded wallets to singleWalletsList - for (var excludedWallet in excludedWallets) { - singleWalletsList.add(convertWalletInfoToWalletListItem(excludedWallet)); - } - - // Remove excluded wallets from the group's wallets to avoid duplication - group.wallets.removeWhere((wallet) { - return excludedWallets.any((excluded) => excluded.address == wallet.address); - }); - - // Check if the group has more than one wallet after the excluded wallets are removed. - if (group.wallets.length > 1) { - //Add the entire group to the multi wallet group list since its still a multi wallet - multiWalletGroups.add(group); - } else if (group.wallets.length == 1) { - // Add the group to the wallet left to the single wallets list - singleWalletsList.add(convertWalletInfoToWalletListItem(group.wallets.first)); - } + multiWalletGroups.add(group); } } From 469373b780a2cee1857b0951ce30312e6b21f1ad Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Mon, 14 Apr 2025 18:27:49 +0100 Subject: [PATCH 03/11] fix: Error while restoring Solana Wallet with PrivateKey (#2201) --- cw_solana/lib/solana_wallet.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cw_solana/lib/solana_wallet.dart b/cw_solana/lib/solana_wallet.dart index 1495189db..9bb468396 100644 --- a/cw_solana/lib/solana_wallet.dart +++ b/cw_solana/lib/solana_wallet.dart @@ -167,10 +167,10 @@ abstract class SolanaWalletBase try { final keypairBytes = Base58Decoder.decode(privateKey!); - return SolanaPrivateKey.fromSeed(keypairBytes); + return SolanaPrivateKey.fromBytes(keypairBytes); } catch (_) { final privateKeyBytes = HEX.decode(privateKey!); - return SolanaPrivateKey.fromBytes(privateKeyBytes); + return SolanaPrivateKey.fromSeed(privateKeyBytes); } } From f574fa5e9bdbab1e2cae8cdc622d60501c3cf5f3 Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Tue, 15 Apr 2025 01:37:46 +0100 Subject: [PATCH 04/11] CW-1035: Solana New Fixes (#2205) * fix: Error while restoring Solana Wallet with PrivateKey * fix: Enhance Solana Error Messages, especially for ATA Creation Errors * - Optimize Solana Transaction History, now more smoother and faster - fix bug with transactions history not being displayed in real time until next reload --- cw_solana/lib/solana_client.dart | 63 ++++++++++++------- cw_solana/lib/solana_wallet.dart | 8 ++- .../dashboard/dashboard_view_model.dart | 52 +++++++-------- lib/view_model/send/send_view_model.dart | 2 +- res/values/strings_ar.arb | 3 +- res/values/strings_bg.arb | 3 +- res/values/strings_cs.arb | 3 +- res/values/strings_de.arb | 3 +- res/values/strings_en.arb | 3 +- res/values/strings_es.arb | 3 +- res/values/strings_fr.arb | 3 +- res/values/strings_ha.arb | 3 +- res/values/strings_hi.arb | 3 +- res/values/strings_hr.arb | 3 +- res/values/strings_hy.arb | 3 +- res/values/strings_id.arb | 3 +- res/values/strings_it.arb | 3 +- res/values/strings_ja.arb | 3 +- res/values/strings_ko.arb | 3 +- res/values/strings_my.arb | 3 +- res/values/strings_nl.arb | 3 +- res/values/strings_pl.arb | 3 +- res/values/strings_pt.arb | 3 +- res/values/strings_ru.arb | 3 +- res/values/strings_th.arb | 3 +- res/values/strings_tl.arb | 3 +- res/values/strings_tr.arb | 3 +- res/values/strings_uk.arb | 3 +- res/values/strings_ur.arb | 3 +- res/values/strings_vi.arb | 3 +- res/values/strings_yo.arb | 3 +- res/values/strings_zh.arb | 3 +- 32 files changed, 127 insertions(+), 82 deletions(-) diff --git a/cw_solana/lib/solana_client.dart b/cw_solana/lib/solana_client.dart index 0e08f9abb..858fb25d4 100644 --- a/cw_solana/lib/solana_client.dart +++ b/cw_solana/lib/solana_client.dart @@ -254,8 +254,9 @@ class SolanaWalletClient { final receiver = message.accountKeys[instruction.accounts[1]].address; String? tokenSymbol = splTokenSymbol; + if (tokenSymbol == null && mintAddress != null) { - final token = await fetchSPLTokenInfo(mintAddress); + final token = await getTokenInfo(mintAddress); tokenSymbol = token?.symbol; } @@ -288,9 +289,9 @@ class SolanaWalletClient { int? splTokenDecimal, Commitment? commitment, SolAddress? walletAddress, + required void Function(List) onUpdate, }) async { List transactions = []; - try { final signatures = await _provider!.request( SolanaRPCGetSignaturesForAddress( @@ -299,10 +300,11 @@ class SolanaWalletClient { ), ); - final List transactionDetails = []; + // The maximum concurrent batch size. + const int batchSize = 10; - for (int i = 0; i < signatures.length; i += 20) { - final batch = signatures.skip(i).take(20).toList(); // Get the next 20 signatures + for (int i = 0; i < signatures.length; i += batchSize) { + final batch = signatures.skip(i).take(batchSize).toList(); final batchResponses = await Future.wait(batch.map((signature) async { try { @@ -314,30 +316,31 @@ class SolanaWalletClient { ), ); } catch (e) { - printV("Error fetching transaction: $e"); + // printV("Error fetching transaction: $e"); return null; } })); - transactionDetails.addAll(batchResponses.whereType()); + final versionedBatchResponses = batchResponses.whereType(); - // to avoid reaching the node RPS limit - if (i + 20 < signatures.length) { + final parsedTransactionsFutures = versionedBatchResponses.map((tx) => parseTransaction( + txResponse: tx, + splTokenSymbol: splTokenSymbol, + walletAddress: walletAddress?.address ?? address.address, + )); + + final parsedTransactions = await Future.wait(parsedTransactionsFutures); + + transactions.addAll(parsedTransactions.whereType().toList()); + + // Calling the callback after each batch is processed, therefore passing the current list of transactions. + onUpdate(List.from(transactions)); + + if (i + batchSize < signatures.length) { await Future.delayed(const Duration(milliseconds: 500)); } } - for (final tx in transactionDetails) { - final parsedTx = await parseTransaction( - txResponse: tx, - splTokenSymbol: splTokenSymbol, - walletAddress: walletAddress?.address ?? address.address, - ); - if (parsedTx != null) { - transactions.add(parsedTx); - } - } - return transactions; } catch (err, s) { printV('Error fetching transactions: $err \n$s'); @@ -350,6 +353,7 @@ class SolanaWalletClient { required String splTokenSymbol, required int splTokenDecimal, required SolanaPrivateKey privateKey, + required void Function(List) onUpdate, }) async { ProgramDerivedAddress? associatedTokenAccount; final ownerWalletAddress = privateKey.publicKey().toAddress(); @@ -373,11 +377,26 @@ class SolanaWalletClient { splTokenSymbol: splTokenSymbol, splTokenDecimal: splTokenDecimal, walletAddress: ownerWalletAddress, + onUpdate: onUpdate, ); return tokenTransactions; } + final Map tokenInfoCache = {}; + + Future getTokenInfo(String mintAddress) async { + if (tokenInfoCache.containsKey(mintAddress)) { + return tokenInfoCache[mintAddress]; + } else { + final token = await fetchSPLTokenInfo(mintAddress); + if (token != null) { + tokenInfoCache[mintAddress] = token; + } + return token; + } + } + Future fetchSPLTokenInfo(String mintAddress) async { final programAddress = MetaplexTokenMetaDataProgramUtils.findMetadataPda(mint: SolAddress(mintAddress)); @@ -747,9 +766,7 @@ class SolanaWalletClient { } catch (e) { associatedRecipientAccount = null; - throw SolanaCreateAssociatedTokenAccountException( - 'Error fetching recipient associated token account: ${e.toString()}', - ); + throw SolanaCreateAssociatedTokenAccountException(e.toString()); } if (associatedRecipientAccount == null) { diff --git a/cw_solana/lib/solana_wallet.dart b/cw_solana/lib/solana_wallet.dart index 9bb468396..ec65642bc 100644 --- a/cw_solana/lib/solana_wallet.dart +++ b/cw_solana/lib/solana_wallet.dart @@ -292,9 +292,14 @@ abstract class SolanaWalletBase @override Future> fetchTransactions() async => {}; + void updateTransactions(List updatedTx) { + _addTransactionsToTransactionHistory(updatedTx); + } + /// Fetches the native SOL transactions linked to the wallet Public Key Future _updateNativeSOLTransactions() async { - final transactions = await _client.fetchTransactions(_solanaPublicKey.toAddress()); + final transactions = + await _client.fetchTransactions(_solanaPublicKey.toAddress(), onUpdate: updateTransactions); await _addTransactionsToTransactionHistory(transactions); } @@ -313,6 +318,7 @@ abstract class SolanaWalletBase splTokenSymbol: token.symbol, splTokenDecimal: token.decimal, privateKey: _solanaPrivateKey, + onUpdate: updateTransactions, ); // splTokenTransactions.addAll(tokenTxs); diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index a2a5bdc0d..f5e89a023 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -161,8 +161,8 @@ abstract class DashboardViewModelBase with Store { FilterItem( value: () => tradeFilterStore.displaySwapTrade, caption: ExchangeProviderDescription.swapTrade.title, - onChanged: () => tradeFilterStore - .toggleDisplayExchange(ExchangeProviderDescription.swapTrade)), + onChanged: () => + tradeFilterStore.toggleDisplayExchange(ExchangeProviderDescription.swapTrade)), ] }, subname = '', @@ -272,9 +272,8 @@ abstract class DashboardViewModelBase with Store { _transactionDisposer?.reaction.dispose(); _transactionDisposer = reaction( - (_) => appStore.wallet!.transactionHistory.transactions.length * - appStore.wallet!.transactionHistory.transactions.values.first.confirmations, - _transactionDisposerCallback + (_) => appStore.wallet!.transactionHistory.transactions.length, + _transactionDisposerCallback, ); if (hasSilentPayments) { @@ -289,24 +288,22 @@ abstract class DashboardViewModelBase with Store { reaction((_) => settingsStore.mwebAlwaysScan, (bool value) => _checkMweb()); } - bool _isTransactionDisposerCallbackRunning = false; - + void _transactionDisposerCallback(int _) async { // Simple check to prevent the callback from being called multiple times in the same frame if (_isTransactionDisposerCallbackRunning) return; _isTransactionDisposerCallbackRunning = true; await Future.delayed(Duration.zero); - try { - final currentAccountId = wallet.type == WalletType.monero + final currentAccountId = wallet.type == WalletType.monero ? monero!.getCurrentAccount(wallet).id - : wallet.type == WalletType.wownero - ? wow.wownero!.getCurrentAccount(wallet).id + : wallet.type == WalletType.wownero + ? wow.wownero!.getCurrentAccount(wallet).id : null; final List relevantTxs = []; - + for (final tx in appStore.wallet!.transactionHistory.transactions.values) { bool isRelevant = true; if (wallet.type == WalletType.monero) { @@ -314,7 +311,7 @@ abstract class DashboardViewModelBase with Store { } else if (wallet.type == WalletType.wownero) { isRelevant = wow.wownero!.getTransactionInfoAccountId(tx) == currentAccountId; } - + if (isRelevant) { relevantTxs.add(tx); } @@ -323,11 +320,11 @@ abstract class DashboardViewModelBase with Store { transactions.clear(); transactions.addAll(relevantTxs.map((tx) => TransactionListItem( - transaction: tx, - balanceViewModel: balanceViewModel, - settingsStore: appStore.settingsStore, - key: ValueKey('${wallet.type.name}_transaction_history_item_${tx.id}_key'), - ))); + transaction: tx, + balanceViewModel: balanceViewModel, + settingsStore: appStore.settingsStore, + key: ValueKey('${wallet.type.name}_transaction_history_item_${tx.id}_key'), + ))); } finally { _isTransactionDisposerCallbackRunning = false; } @@ -475,7 +472,8 @@ abstract class DashboardViewModelBase with Store { // to not cause work duplication, this will do the job as well, it will be slightly less precise // about what happened - but still enough. // if (keys['privateSpendKey'] == List.generate(64, (index) => "0").join("")) "Private spend key is 0", - if (keys['privateViewKey'] == List.generate(64, (index) => "0").join("") && !wallet.isHardwareWallet) + if (keys['privateViewKey'] == List.generate(64, (index) => "0").join("") && + !wallet.isHardwareWallet) "private view key is 0", // if (keys['publicSpendKey'] == List.generate(64, (index) => "0").join("")) "public spend key is 0", if (keys['publicViewKey'] == List.generate(64, (index) => "0").join("")) @@ -576,7 +574,8 @@ abstract class DashboardViewModelBase with Store { disableBackgroundSync(); return; } - final resp = await FlutterDaemon().startBackgroundSync(settingsStore.currentSyncMode.frequency.inMinutes); + final resp = await FlutterDaemon() + .startBackgroundSync(settingsStore.currentSyncMode.frequency.inMinutes); printV("Background sync enabled: $resp"); backgroundSyncEnabled = true; } @@ -600,8 +599,7 @@ abstract class DashboardViewModelBase with Store { spread = 0; else if (settingsStore.currentTheme.type == ThemeType.dark) spread = 0; - else if (settingsStore.currentTheme.type == ThemeType.oled) - spread = 0; + else if (settingsStore.currentTheme.type == ThemeType.oled) spread = 0; return spread; } @@ -614,8 +612,7 @@ abstract class DashboardViewModelBase with Store { blur = 0; else if (settingsStore.currentTheme.type == ThemeType.dark) blur = 0; - else if (settingsStore.currentTheme.type == ThemeType.oled) - blur = 0; + else if (settingsStore.currentTheme.type == ThemeType.oled) blur = 0; return blur; } @@ -810,11 +807,8 @@ abstract class DashboardViewModelBase with Store { _transactionDisposer?.reaction.dispose(); - _transactionDisposer = reaction( - (_) => appStore.wallet!.transactionHistory.transactions.length * - appStore.wallet!.transactionHistory.transactions.values.first.confirmations, - _transactionDisposerCallback - ); + _transactionDisposer = reaction((_) => appStore.wallet!.transactionHistory.transactions.length, + _transactionDisposerCallback); } @action diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index d98b099cf..2244c9be3 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -738,7 +738,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor } if (error is CreateAssociatedTokenAccountException) { - return "${S.current.solana_create_associated_token_account_exception}\n\n${error.errorMessage}"; + return "${S.current.solana_create_associated_token_account_exception} ${S.current.added_message_for_ata_error}\n\n${error.errorMessage}"; } if (error is SignSPLTokenTransactionRentException) { diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 7d16c3cd6..f9c611f44 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "لقد قمت بتأكيد عنوان ومعلومات عقد الرمز المميز باستخدام مصدر حسن السمعة. يمكن أن تؤدي إضافة معلومات خبيثة أو غير صحيحة إلى خسارة الأموال.", "add_token_warning": "لا تقم بتحرير أو إضافة رموز وفقًا لتعليمات المحتالين.\nقم دائمًا بتأكيد عناوين الرموز مع مصادر حسنة السمعة!", "add_value": "إضافة قيمة", + "added_message_for_ata_error": "يرجى التأكد من أن لديك ما يكفي من توازن SOL لإكمال معاملتك.", "address": " ﻥﺍﻮﻨﻋ", "address_book": "دليل العناوين", "address_book_menu": "دليل العناوين", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "سوف تتلقى(ooded )", "you_will_send": "تحويل من", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index db62231a8..5fe762677 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Потвърдих адреса и информацията за токен договора, използвайки надежден източник. Добавянето на злонамерена или неправилна информация може да доведе до загуба на средства.", "add_token_warning": "Не редактирайте и не добавяйте токени според инструкциите на измамниците.\nВинаги потвърждавайте адресите на токени с надеждни източници!", "add_value": "Добавяне на стойност", + "added_message_for_ata_error": "Моля, уверете се, че имате достатъчно баланс на SOL, за да завършите транзакцията си.", "address": "Адрес", "address_book": "Адресна книга", "address_book_menu": "Адресна книга", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "Ще получите(прогнозно )", "you_will_send": "Обръщане от", "yy": "гг" -} +} \ No newline at end of file diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index c7c60b266..e1cdb33ca 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Potvrdil jsem adresu a informace smlouvy o tokenu pomocí důvěryhodného zdroje. Přidání škodlivých nebo nesprávných informací může vést ke ztrátě finančních prostředků.", "add_token_warning": "Neupravujte ani nepřidávejte tokeny podle pokynů podvodníků.\nVždy potvrďte adresy tokenů s renomovanými zdroji!", "add_value": "Přidat hodnotu", + "added_message_for_ata_error": "Laskavě se ujistěte, že máte dostatek rovnováhy SOL, abyste dokončili transakci.", "address": "Adresa", "address_book": "Adresář", "address_book_menu": "Adresář", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "Obdržíte(odhadovaný )", "you_will_send": "Směnit z", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 699f8306a..17d55eb78 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Ich habe die Adresse und Informationen zum Token-Contract anhand einer seriösen Quelle bestätigt. Das Hinzufügen böswilliger oder falscher Informationen kann zu einem Verlust von Geldern führen.", "add_token_warning": "Bearbeiten oder fügen Sie Token nicht gemäß den Anweisungen von Betrügern hinzu.\nBestätigen Sie Token-Adressen immer mit seriösen Quellen!", "add_value": "Wert hinzufügen", + "added_message_for_ata_error": "Bitte stellen Sie sicher, dass Sie über genügend SOL -Balance verfügen, um Ihre Transaktion abzuschließen.", "address": "Adresse", "address_book": "Adressbuch", "address_book_menu": "Adressbuch", @@ -1027,4 +1028,4 @@ "you_will_receive_estimated_amount": "Sie erhalten(geschätzt )", "you_will_send": "Konvertieren von", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 5f8fd2931..8ef3ddb6c 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "I have confirmed the token contract address and information using a reputable source. Adding malicious or incorrect information can result in a loss of funds.", "add_token_warning": "Do not edit or add tokens as instructed by scammers.\nAlways confirm token addresses with reputable sources!", "add_value": "Add value", + "added_message_for_ata_error": "Kindly ensure you have enough SOL balance to complete your transaction.", "address": "Address", "address_book": "Address Book", "address_book_menu": "Address book", @@ -1025,4 +1026,4 @@ "you_will_receive_estimated_amount": "You will receive (estimated)", "you_will_send": "Convert from", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 32b6c9d13..a1ad5f580 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "He confirmado la dirección del contrato del token y la información utilizando una fuente confiable. Agregar información maliciosa o incorrecta puede resultar en una pérdida de fondos.", "add_token_warning": "No edite ni agregue tokens según las instrucciones de los estafadores.\n¡Confirme siempre las direcciones de los tokens con fuentes acreditadas!", "add_value": "Añadir valor", + "added_message_for_ata_error": "Asegúrese de tener suficiente equilibrio SOL para completar su transacción.", "address": "Dirección", "address_book": "Libreta de direcciones", "address_book_menu": "Libreta de direcciones", @@ -1025,4 +1026,4 @@ "you_will_receive_estimated_amount": "Recibirá(estimado )", "you_will_send": "Convertir de", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 01b8e566b..55ecf02a9 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "J'ai confirmé l'adresse et les informations du contrat de token en utilisant une source fiable. L'ajout d'informations malveillantes ou incorrectes peut entraîner une perte de fonds.", "add_token_warning": "Ne modifiez pas ou n'ajoutez pas de tokens comme pourraient vous le suggérer des escrocs.\nConfirmez toujours les adresses de token auprès de sources fiables !", "add_value": "Ajouter une valeur", + "added_message_for_ata_error": "Veuillez vous assurer d'avoir suffisamment de solde SOL pour terminer votre transaction.", "address": "Adresse", "address_book": "Carnet d'Adresses", "address_book_menu": "Carnet d'Adresses", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "Vous recevrez ( estimé )", "you_will_send": "Convertir depuis", "yy": "AA" -} +} \ No newline at end of file diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 9afd64587..6547f6728 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Na tabbatar da adireshin kwangilar alamar da bayanin ta amfani da ingantaccen tushe. Ƙara bayanan ƙeta ko kuskure na iya haifar da asarar kuɗi.", "add_token_warning": "Kar a gyara ko ƙara alamu kamar yadda masu zamba suka umarta.\nKoyaushe tabbatar da adiresoshin alamar tare da sanannun tushe!", "add_value": "Ƙara ƙima", + "added_message_for_ata_error": "Da kyau tabbatar kana da isasshen so su daidaita don kammala ma'amalar ku.", "address": "Adireshi", "address_book": "Littafin adireshi", "address_book_menu": "Littafin adireshi", @@ -1026,4 +1027,4 @@ "you_will_receive_estimated_amount": "Za ku (karɓi )", "you_will_send": "Maida daga", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 0dd684dab..f1841a53e 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "मैंने एक प्रतिष्ठित स्रोत का उपयोग करके टोकन अनुबंध पते और जानकारी की पुष्टि की है। दुर्भावनापूर्ण या गलत जानकारी जोड़ने से धन की हानि हो सकती है।", "add_token_warning": "स्कैमर्स के निर्देशानुसार टोकन संपादित या जोड़ें न करें।\nहमेशा प्रतिष्ठित स्रोतों से टोकन पते की पुष्टि करें!", "add_value": "मूल्य जोड़ें", + "added_message_for_ata_error": "कृपया सुनिश्चित करें कि आपके पास अपना लेनदेन पूरा करने के लिए पर्याप्त SOL बैलेंस है।", "address": "पता", "address_book": "पता पुस्तिका", "address_book_menu": "पता पुस्तिका", @@ -1026,4 +1027,4 @@ "you_will_receive_estimated_amount": "आपको#अनुमानित ( प्राप्त होगा)", "you_will_send": "से रूपांतरित करें", "yy": "वाईवाई" -} +} \ No newline at end of file diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 291fadc70..741e3ae09 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Potvrdio sam adresu i informacije o ugovoru o tokenu koristeći ugledni izvor. Dodavanje zlonamjernih ili netočnih informacija može dovesti do gubitka sredstava.", "add_token_warning": "Nemojte uređivati niti dodavati tokene prema uputama prevaranata.\nUvijek potvrdite adrese tokena s uglednim izvorima!", "add_value": "Dodaj vrijednost", + "added_message_for_ata_error": "Ljubazno osigurajte da imate dovoljno salda SOL -a da dovršite svoju transakciju.", "address": "Adresa", "address_book": "Imenik", "address_book_menu": "Imenik", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "Primit ćete(procijenjeno )", "you_will_send": "Razmijeni iz", "yy": "GG" -} +} \ No newline at end of file diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index c782d153e..67ae614d6 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Ես հաստատել եմ token-ի պայմանագրի հասցեն և տեղեկատվությունը վստահելի աղբյուրի օգտագործմամբ: Վնասակար կամ սխալ տեղեկատվության ավելացումը կարող է հանգեցնել միջոցների կորստի:", "add_token_warning": "Մի խմբագրեք կամ ավելացրեք token-ներ, ինչպես կոչ են անում խարդախները:\nՄիշտ հաստատեք Token-ների հասցեները վստահելի աղբյուրներով:", "add_value": "Ավելացնել արժեք", + "added_message_for_ata_error": "Սիրով համոզվեք, որ ձեր գործարքը ավարտելու համար բավականաչափ SOL հավասարակշռություն ունեք:", "address": "Հասցե", "address_book": "Հասցեագիրք", "address_book_menu": "Հասցեագիրք", @@ -1022,4 +1023,4 @@ "you_will_receive_estimated_amount": "Դուք կստանաք ( գնահատված )", "you_will_send": "Փոխանակեք", "yy": "ՏՏ" -} +} \ No newline at end of file diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index b83a96083..96ccb39ac 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Saya telah mengonfirmasi alamat dan informasi kontrak token menggunakan sumber yang memiliki reputasi baik. Menambahkan informasi jahat atau salah dapat mengakibatkan hilangnya dana.", "add_token_warning": "Jangan mengedit atau menambahkan token seperti yang diinstruksikan oleh penipu.\nSelalu konfirmasikan alamat token dengan sumber tepercaya!", "add_value": "Tambahkan nilai", + "added_message_for_ata_error": "Mohon pastikan Anda memiliki saldo SOL yang cukup untuk menyelesaikan transaksi Anda.", "address": "Alamat", "address_book": "Buku Alamat", "address_book_menu": "Buku alamat", @@ -1027,4 +1028,4 @@ "you_will_receive_estimated_amount": "Anda akan menerima(estimasi )", "you_will_send": "Konversi dari", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index dca278d5e..74728aeb0 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Ho confermato l'indirizzo e le informazioni del contratto token utilizzando una fonte attendibile. L'aggiunta di informazioni dannose o errate può comportare una perdita di fondi.", "add_token_warning": "Non modificare o aggiungere token come indicato dai truffatori.\nConferma sempre gli indirizzi dei token con fonti attendibili!", "add_value": "Aggiungi valore", + "added_message_for_ata_error": "Si prega di assicurati di avere abbastanza equilibrio sol per completare la transazione.", "address": "Indirizzo", "address_book": "Rubrica indirizzi", "address_book_menu": "Rubrica indirizzi", @@ -1026,4 +1027,4 @@ "you_will_receive_estimated_amount": "Riceverai(stimato )", "you_will_send": "Conveti da", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index d6071b4fb..0bb56a964 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "信頼できる情報源を使用して、トークン コントラクトのアドレスと情報を確認しました。 悪意のある情報や不正確な情報を追加すると、資金が失われる可能性があります。", "add_token_warning": "詐欺師の指示に従ってトークンを編集または追加しないでください。\nトークン アドレスは常に信頼できる情報源で確認してください。", "add_value": "付加価値", + "added_message_for_ata_error": "トランザクションを完了するのに十分なソルバランスがあることを確認してください。", "address": "住所", "address_book": "住所録", "address_book_menu": "住所録", @@ -1025,4 +1026,4 @@ "you_will_receive_estimated_amount": "あなたは(推定)を受け取ります", "you_will_send": "から変換", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index e0ccee417..846c8f47b 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "신뢰할 수 있는 출처를 통해 토큰 컨트랙트 주소와 정보를 확인했습니다. 악의적이거나 잘못된 정보를 추가하면 자금 손실이 발생할 수 있습니다.", "add_token_warning": "사기꾼의 지시에 따라 토큰을 편집하거나 추가하지 마십시오.\n항상 신뢰할 수 있는 출처를 통해 토큰 주소를 확인하세요!", "add_value": "값 추가", + "added_message_for_ata_error": "거래를 완료하기에 충분한 SOL 잔액이 있는지 확인하십시오.", "address": "주소", "address_book": "주소록", "address_book_menu": "주소록", @@ -1025,4 +1026,4 @@ "you_will_send": "다음에서 변환", "YY": "YY", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 8dcffb219..31bed9bb1 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "ဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်ကို အသုံးပြု၍ တိုကင်စာချုပ်လိပ်စာနှင့် အချက်အလက်ကို ကျွန်ုပ်အတည်ပြုပြီးဖြစ်သည်။ အန္တရာယ်ရှိသော သို့မဟုတ် မမှန်ကန်သော အချက်အလက်များကို ထည့်သွင်းခြင်းသည် ရန်ပုံငွေများ ဆုံးရှုံးသွားနိုင်သည်။", "add_token_warning": "လိမ်လည်သူများ ညွှန်ကြားထားသည့်အတိုင်း တိုကင်များကို တည်းဖြတ်ခြင်း သို့မဟုတ် မထည့်ပါနှင့်။\nဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်များဖြင့် အမြဲတမ်း တိုကင်လိပ်စာများကို အတည်ပြုပါ။", "add_value": "တန်ဖိုးထည့်ပါ။", + "added_message_for_ata_error": "ကြင်နာစွာသင့်ငွေပေးငွေယူကိုဖြည့်စွက်ရန်သင်အလုံအလောက် sol မျှတမှုရှိသည်။", "address": "လိပ်စာ", "address_book": "လိပ်စာစာအုပ်", "address_book_menu": "လိပ်စာစာအုပ်", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "သင် ( ခန့်မှန်းခြေ ) လက်ခံရရှိလိမ့်မည်", "you_will_send": "မှပြောင်းပါ။", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 60d6a7df2..fab0f8bc7 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Ik heb het adres en de informatie van het tokencontract bevestigd met behulp van een betrouwbare bron. Het toevoegen van kwaadaardige of onjuiste informatie kan leiden tot verlies van geld.", "add_token_warning": "Bewerk of voeg geen tokens toe volgens de instructies van oplichters.\nBevestig tokenadressen altijd met betrouwbare bronnen!", "add_value": "Waarde toevoegen", + "added_message_for_ata_error": "Zorg ervoor dat u voldoende SOL -balans hebt om uw transactie te voltooien.", "address": "Adres", "address_book": "Adresboek", "address_book_menu": "Adresboek", @@ -1025,4 +1026,4 @@ "you_will_receive_estimated_amount": "U ontvangt(geschat )", "you_will_send": "Converteren van", "yy": "JJ" -} +} \ No newline at end of file diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 3e5550424..ed700e274 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Potwierdziłem adres kontraktu tokena i informacje, korzystając z renomowanego źródła. Dodanie złośliwych lub niepoprawnych informacji może spowodować utratę środków.", "add_token_warning": "Nie edytuj ani nie dodawaj tokenów zgodnie z instrukcjami oszustów.\nZawsze potwierdzaj adresy tokenów z renomowanymi źródłami!", "add_value": "Dodaj wartość", + "added_message_for_ata_error": "Upewnij się, że masz wystarczającą saldo SOL, aby ukończyć transakcję.", "address": "Adres", "address_book": "Kontakty", "address_book_menu": "Kontakty", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "Otrzymasz(oszacowane )", "you_will_send": "Konwertuj z", "yy": "RR" -} +} \ No newline at end of file diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 494694af0..b61d97b83 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Confirmei o endereço e as informações do contrato de token usando uma fonte confiável. Adicionar informações maliciosas ou incorretas pode resultar em perda de fundos.", "add_token_warning": "Não edite ou adicione tokens de acordo com as instruções dos golpistas.\nSempre confirme os endereços de token com fontes confiáveis!", "add_value": "Adicionar valor", + "added_message_for_ata_error": "Por favor, certifique -se de ter um equilíbrio SOL suficiente para concluir sua transação.", "address": "Endereço", "address_book": "Livro de endereços", "address_book_menu": "Livro de endereços", @@ -1027,4 +1028,4 @@ "you_will_receive_estimated_amount": "Você receberá(estimado )", "you_will_send": "Converter de", "yy": "aa" -} +} \ No newline at end of file diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 238eb0c95..773b65fb0 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Я подтвердил адрес контракта токена и информацию, используя авторитетный источник. Добавление вредоносной или неверной информации может привести к потере средств.", "add_token_warning": "Не редактируйте и не добавляйте токены по указанию мошенников.\nВсегда подтверждайте адреса токенов из авторитетных источников!", "add_value": "Добавить значение", + "added_message_for_ata_error": "Пожалуйста, убедитесь, что у вас достаточно баланса Sol, чтобы завершить вашу транзакцию.", "address": "Адрес", "address_book": "Адресная книга", "address_book_menu": "Адресная книга", @@ -1025,4 +1026,4 @@ "you_will_receive_estimated_amount": "Вы получите(Оценку )", "you_will_send": "Конвертировать из", "yy": "ГГ" -} +} \ No newline at end of file diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 13a3d9674..ff27d906b 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "ฉันได้ยืนยันที่อยู่และข้อมูลของสัญญาโทเค็นโดยใช้แหล่งข้อมูลที่เชื่อถือได้ การเพิ่มข้อมูลที่เป็นอันตรายหรือไม่ถูกต้องอาจทำให้สูญเสียเงินได้", "add_token_warning": "ห้ามแก้ไขหรือเพิ่มโทเค็นตามคำแนะนำของนักต้มตุ๋น\nยืนยันที่อยู่โทเค็นกับแหล่งที่มาที่เชื่อถือได้เสมอ!", "add_value": "เพิ่มมูลค่า", + "added_message_for_ata_error": "กรุณาตรวจสอบให้แน่ใจว่าคุณมียอดคงเหลือโซลเพียงพอที่จะทำธุรกรรมให้เสร็จสมบูรณ์", "address": "ที่อยู่", "address_book": "สมุดที่อยู่", "address_book_menu": "สมุดที่อยู่", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "คุณจะได้รับ(โดยประมาณ )", "you_will_send": "แปลงจาก", "yy": "ปี" -} +} \ No newline at end of file diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index cf2a15aca..60aff4d05 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Kinumpirma ko ang address ng kontrata ng token at impormasyon gamit ang isang kagalang-galang na mapagkukunan. Ang pagdaragdag ng nakakahamak o hindi tamang impormasyon ay maaaring magresulta sa pagkawala ng mga pondo.", "add_token_warning": "Huwag i-edit o magdagdag ng mga token tulad ng itinuro ng mga scammers.\nLaging kumpirmahin ang mga token address na may mga kagalang-galang na mapagkukunan!", "add_value": "Magdagdag ng halaga", + "added_message_for_ata_error": "Mabuting tiyakin na mayroon kang sapat na balanse ng sol upang makumpleto ang iyong transaksyon.", "address": "Address", "address_book": "Address Book", "address_book_menu": "Address book", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "Makakatanggap ka ng(tinantyang)", "you_will_send": "I-convert mula sa", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 848a4b8a6..d7502370d 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Belirteç sözleşmesi adresini ve bilgilerini saygın bir kaynak kullanarak onayladım. Kötü amaçlı veya yanlış bilgilerin eklenmesi para kaybına neden olabilir.", "add_token_warning": "Dolandırıcıların talimatına göre jetonları düzenlemeyin veya eklemeyin.\nBelirteç adreslerini her zaman saygın kaynaklarla onaylayın!", "add_value": "Değer ekle", + "added_message_for_ata_error": "Lütfen işleminizi tamamlamak için yeterli SOL bakiyesine sahip olduğunuzdan emin olun.", "address": "Adres", "address_book": "Adres Defteri", "address_book_menu": "Adres defteri", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "(Tahmini ) alacaksınız", "you_will_send": "Biçiminden dönüştür:", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index eef5bcdad..c76166466 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Я підтвердив адресу та інформацію щодо договору маркера, використовуючи авторитетне джерело. Додавання зловмисної або невірної інформації може призвести до втрати коштів.", "add_token_warning": "Не редагуйте та не додавайте токени за вказівками шахраїв.\nЗавжди підтверджуйте адреси токенів у авторитетних джерелах!", "add_value": "Додати значення", + "added_message_for_ata_error": "Будь ласка, переконайтеся, що у вас є достатньо балансу SOL, щоб завершити свою транзакцію.", "address": "Адреса", "address_book": "Адресна книга", "address_book_menu": "Адресна книга", @@ -1025,4 +1026,4 @@ "you_will_receive_estimated_amount": "Ви отримаєте(оцінюється )", "you_will_send": "Конвертувати з", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index ddcc0a696..afc74b130 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "میں نے ایک معتبر ذریعہ کا استعمال کرتے ہوئے ٹوکن کنٹریکٹ ایڈریس اور معلومات کی تصدیق کی ہے۔ بدنیتی پر مبنی یا غلط معلومات شامل کرنے کے نتیجے میں فنڈز ضائع ہو سکتے ہیں۔", "add_token_warning": "سکیمرز کی ہدایت کے مطابق ٹوکن میں ترمیم یا اضافہ نہ کریں۔\nہمیشہ معتبر ذرائع سے ٹوکن پتوں کی تصدیق کریں!", "add_value": "قدر شامل کریں۔", + "added_message_for_ata_error": "برائے مہربانی اس بات کو یقینی بنائیں کہ آپ کے لین دین کو مکمل کرنے کے ل enough آپ کے پاس کافی SOL توازن موجود ہے۔", "address": "ﮧﺘﭘ", "address_book": "ایڈریس بک", "address_book_menu": "ایڈریس بک", @@ -1026,4 +1027,4 @@ "you_will_receive_estimated_amount": "آپ(تخمینہ ) وصول کریں گے", "you_will_send": "سے تبدیل کریں۔", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 9abf12e33..00065f93c 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Tôi đã xác nhận địa chỉ hợp đồng token và thông tin bằng nguồn đáng tin cậy. Thêm thông tin sai hoặc độc hại có thể dẫn đến mất tiền.", "add_token_warning": "Không chỉnh sửa hoặc thêm token theo yêu cầu của kẻ lừa đảo.\nLuôn xác nhận địa chỉ token từ các nguồn đáng tin cậy!", "add_value": "Thêm giá trị", + "added_message_for_ata_error": "Vui lòng đảm bảo bạn có đủ số dư SOL để hoàn thành giao dịch của mình.", "address": "Địa chỉ", "address_book": "Sổ địa chỉ", "address_book_menu": "Sổ địa chỉ", @@ -1021,4 +1022,4 @@ "you_will_receive_estimated_amount": "Bạn sẽ nhận được(ước tính )", "you_will_send": "Chuyển đổi từ", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index dc836bb17..ea1e9b2ad 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "Mo ti jẹrisi adirẹsi adehun ami ati alaye nipa lilo orisun olokiki kan. Fifi irira tabi alaye ti ko tọ le ja si isonu ti owo.", "add_token_warning": "Ma ṣe ṣatunkọ tabi ṣafikun awọn ami bi a ti fun ni aṣẹ nipasẹ awọn scammers.\nNigbagbogbo jẹrisi awọn adirẹsi ami pẹlu awọn orisun olokiki!", "add_value": "Fikún owó", + "added_message_for_ata_error": "Daradara rii daju pe o ni iwọntunwọnsi Sol Sol lati pari iṣowo rẹ.", "address": "Adirẹsi", "address_book": "Ìwé Àdírẹ́sì", "address_book_menu": "Ìwé Àdírẹ́sì", @@ -1025,4 +1026,4 @@ "you_will_receive_estimated_amount": "Iwọ yoo gba ( excimated )", "you_will_send": "Ṣe pàṣípààrọ̀ láti", "yy": "Ọd" -} +} \ No newline at end of file diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 15fee3ed9..9e8885250 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -21,6 +21,7 @@ "add_token_disclaimer_check": "我已使用信誉良好的来源确认了代币合约地址和信息。 添加恶意或不正确的信息可能会导致资金损失。", "add_token_warning": "请勿按照诈骗者的指示编辑或添加令牌。\n始终通过信誉良好的来源确认代币地址!", "add_value": "增加价值", + "added_message_for_ata_error": "请确保您有足够的SOL余额来完成交易。", "address": "地址", "address_book": "地址簿", "address_book_menu": "地址簿", @@ -1024,4 +1025,4 @@ "you_will_receive_estimated_amount": "您将收到(估计的)", "you_will_send": "转换自", "yy": "YY" -} +} \ No newline at end of file From ca564bc2e66172cffc84eced4d9bea88dabed1ac Mon Sep 17 00:00:00 2001 From: Omar Hatem Date: Tue, 15 Apr 2025 02:50:07 +0200 Subject: [PATCH 05/11] V4.26.0 rc (#2198) * v4.26.0 Release Candidate * Fix Wownero Creation issue * Add KES fiat currency * Adjust backup to default node selection if null Gracefully handle Decred failure Minor fixes --- cw_decred/lib/wallet.dart | 2 +- lib/core/utilities.dart | 9 +++ lib/src/screens/backup/backup_page.dart | 7 ++- lib/src/widgets/primary_button.dart | 2 +- lib/store/settings_store.dart | 56 +++++++++++-------- .../anon_invoice_page_view_model.dart | 44 +++++++++------ .../hardware_wallet/ledger_view_model.dart | 4 +- .../wallet_list/wallet_list_view_model.dart | 1 - 8 files changed, 76 insertions(+), 49 deletions(-) create mode 100644 lib/core/utilities.dart diff --git a/cw_decred/lib/wallet.dart b/cw_decred/lib/wallet.dart index 2c7af61f0..a63a5e2e5 100644 --- a/cw_decred/lib/wallet.dart +++ b/cw_decred/lib/wallet.dart @@ -222,7 +222,7 @@ abstract class DecredWalletBase Future checkSync() async { final syncStatusJSON = await _libwallet.syncStatus(walletInfo.name); - final decoded = json.decode(syncStatusJSON); + final decoded = json.decode(syncStatusJSON.isEmpty ? "{}" : syncStatusJSON); final syncStatusCode = decoded["syncstatuscode"] ?? 0; // final syncStatusStr = decoded["syncstatus"] ?? ""; diff --git a/lib/core/utilities.dart b/lib/core/utilities.dart new file mode 100644 index 000000000..1278dfc44 --- /dev/null +++ b/lib/core/utilities.dart @@ -0,0 +1,9 @@ +extension EnhancedList on Iterable { + T? firstWhereOrNull(bool Function(T element) test) { + try { + return firstWhere(test); + } catch (e) { + return null; + } + } +} \ No newline at end of file diff --git a/lib/src/screens/backup/backup_page.dart b/lib/src/screens/backup/backup_page.dart index 408fad2d3..12c8594ae 100644 --- a/lib/src/screens/backup/backup_page.dart +++ b/lib/src/screens/backup/backup_page.dart @@ -3,10 +3,9 @@ import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; -import 'package:cake_wallet/src/widgets/trail_button.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/utils/clipboard_util.dart'; import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cake_wallet/utils/share_util.dart'; @@ -76,7 +75,9 @@ class BackupPage extends BasePage { Navigator.of(context).pushNamed(Routes.editBackupPassword), text: S.of(context).change_password, color: Theme.of(context).cardColor, - textColor: Colors.white, + textColor: Theme.of(context) + .extension()! + .buttonTextColor, ), SizedBox(height: 10), Observer( diff --git a/lib/src/widgets/primary_button.dart b/lib/src/widgets/primary_button.dart index d5800aa5b..fcabe5b83 100644 --- a/lib/src/widgets/primary_button.dart +++ b/lib/src/widgets/primary_button.dart @@ -104,7 +104,7 @@ class LoadingPrimaryButton extends StatelessWidget { ), )), child: isLoading - ? CupertinoActivityIndicator(animating: true) + ? CupertinoActivityIndicator(animating: true, color: textColor) : Text(text, style: TextStyle( fontSize: 15.0, diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index 5f6b415b9..1e32f3189 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:cake_wallet/bitcoin/bitcoin.dart'; +import 'package:cake_wallet/core/utilities.dart'; import 'package:cake_wallet/decred/decred.dart'; import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/core/secure_storage.dart'; @@ -12,13 +13,13 @@ import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:cake_wallet/entities/balance_display_mode.dart'; import 'package:cake_wallet/entities/cake_2fa_preset_options.dart'; import 'package:cake_wallet/entities/country.dart'; +import 'package:cake_wallet/entities/default_settings_migration.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_currency.dart'; import 'package:cake_wallet/entities/language_service.dart'; import 'package:cake_wallet/entities/pin_code_required_duration.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; -import 'package:cake_wallet/entities/provider_types.dart'; import 'package:cake_wallet/entities/secret_store_key.dart'; import 'package:cake_wallet/entities/seed_phrase_length.dart'; import 'package:cake_wallet/entities/seed_type.dart'; @@ -37,11 +38,8 @@ import 'package:cake_wallet/themes/theme_list.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/package_info.dart'; import 'package:cake_wallet/view_model/settings/sync_mode.dart'; -import 'package:cake_wallet/wallet_type_utils.dart'; -import 'package:cake_wallet/wownero/wownero.dart'; import 'package:cw_core/node.dart'; import 'package:cw_core/set_app_secure_native.dart'; -import 'package:cw_core/transaction_priority.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:device_info_plus/device_info_plus.dart'; @@ -312,7 +310,7 @@ abstract class SettingsStoreBase with Store { reaction((_) => disableTradeOption, (bool disableTradeOption) => sharedPreferences.setBool(PreferencesKey.disableTradeOption, disableTradeOption)); - + reaction( (_) => disableBulletin, (bool disableBulletin) => @@ -1038,7 +1036,6 @@ abstract class SettingsStoreBase with Store { sharedPreferences.getInt(PreferencesKey.currentLitecoinElectrumSererIdKey); final bitcoinCashElectrumServerId = sharedPreferences.getInt(PreferencesKey.currentBitcoinCashNodeIdKey); - final havenNodeId = sharedPreferences.getInt(PreferencesKey.currentHavenNodeIdKey); final ethereumNodeId = sharedPreferences.getInt(PreferencesKey.currentEthereumNodeIdKey); final polygonNodeId = sharedPreferences.getInt(PreferencesKey.currentPolygonNodeIdKey); final nanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey); @@ -1048,20 +1045,35 @@ abstract class SettingsStoreBase with Store { final wowneroNodeId = sharedPreferences.getInt(PreferencesKey.currentWowneroNodeIdKey); final zanoNodeId = sharedPreferences.getInt(PreferencesKey.currentZanoNodeIdKey); final decredNodeId = sharedPreferences.getInt(PreferencesKey.currentDecredNodeIdKey); - final moneroNode = nodeSource.get(nodeId); - final bitcoinElectrumServer = nodeSource.get(bitcoinElectrumServerId); - final litecoinElectrumServer = nodeSource.get(litecoinElectrumServerId); - final havenNode = nodeSource.get(havenNodeId); - final ethereumNode = nodeSource.get(ethereumNodeId); - final polygonNode = nodeSource.get(polygonNodeId); - final bitcoinCashElectrumServer = nodeSource.get(bitcoinCashElectrumServerId); - final nanoNode = nodeSource.get(nanoNodeId); - final decredNode = nodeSource.get(decredNodeId); - final nanoPowNode = powNodeSource.get(nanoPowNodeId); - final solanaNode = nodeSource.get(solanaNodeId); - final tronNode = nodeSource.get(tronNodeId); - final wowneroNode = nodeSource.get(wowneroNodeId); - final zanoNode = nodeSource.get(zanoNodeId); + + /// get the selected node, if null, then use the default + final moneroNode = nodeSource.get(nodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == newCakeWalletMoneroUri); + final bitcoinElectrumServer = nodeSource.get(bitcoinElectrumServerId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == newCakeWalletBitcoinUri); + final litecoinElectrumServer = nodeSource.get(litecoinElectrumServerId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == cakeWalletLitecoinElectrumUri); + final ethereumNode = nodeSource.get(ethereumNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == ethereumDefaultNodeUri); + final polygonNode = nodeSource.get(polygonNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == polygonDefaultNodeUri); + final bitcoinCashElectrumServer = nodeSource.get(bitcoinCashElectrumServerId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == cakeWalletBitcoinCashDefaultNodeUri); + final nanoNode = nodeSource.get(nanoNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == nanoDefaultNodeUri); + final decredNode = nodeSource.get(decredNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == decredDefaultUri); + final nanoPowNode = powNodeSource.get(nanoPowNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == nanoDefaultPowNodeUri); + final solanaNode = nodeSource.get(solanaNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == solanaDefaultNodeUri); + final tronNode = nodeSource.get(tronNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == tronDefaultNodeUri); + final wowneroNode = nodeSource.get(wowneroNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == wowneroDefaultNodeUri); + final zanoNode = nodeSource.get(zanoNodeId) ?? + nodeSource.values.firstWhereOrNull((e) => e.uriRaw == zanoDefaultNodeUri); + final packageInfo = await PackageInfo.fromPlatform(); final deviceName = await _getDeviceName() ?? ''; final shouldShowYatPopup = sharedPreferences.getBool(PreferencesKey.shouldShowYatPopup) ?? true; @@ -1107,10 +1119,6 @@ abstract class SettingsStoreBase with Store { nodes[WalletType.litecoin] = litecoinElectrumServer; } - if (havenNode != null) { - nodes[WalletType.haven] = havenNode; - } - if (ethereumNode != null) { nodes[WalletType.ethereum] = ethereumNode; } diff --git a/lib/view_model/anon_invoice_page_view_model.dart b/lib/view_model/anon_invoice_page_view_model.dart index 39992dca7..05467bd71 100644 --- a/lib/view_model/anon_invoice_page_view_model.dart +++ b/lib/view_model/anon_invoice_page_view_model.dart @@ -107,20 +107,24 @@ abstract class AnonInvoicePageViewModelBase with Store { return; } } - final result = await anonPayApi.createInvoice(AnonPayRequest( - cryptoCurrency: cryptoCurrency, - address: address, - amount: amount.isEmpty ? null : amount, - description: description, - email: receipientEmail, - name: receipientName, - fiatEquivalent: - selectedCurrency is FiatCurrency ? (selectedCurrency as FiatCurrency).raw : null, - )); + try { + final result = await anonPayApi.createInvoice(AnonPayRequest( + cryptoCurrency: cryptoCurrency, + address: address, + amount: amount.isEmpty ? null : amount, + description: description, + email: receipientEmail, + name: receipientName, + fiatEquivalent: + selectedCurrency is FiatCurrency ? (selectedCurrency as FiatCurrency).raw : null, + )); - _anonpayInvoiceInfoSource.add(result); + _anonpayInvoiceInfoSource.add(result); - state = ExecutedSuccessfullyState(payload: result); + state = ExecutedSuccessfullyState(payload: result); + } catch (e) { + state = FailureState(e.toString()); + } } @action @@ -156,12 +160,16 @@ abstract class AnonInvoicePageViewModelBase with Store { } Future _fetchLimits() async { - final limit = await anonPayApi.fetchLimits( - cryptoCurrency: cryptoCurrency, - fiatCurrency: selectedCurrency is FiatCurrency ? selectedCurrency as FiatCurrency : null, - ); - minimum = limit.min; - maximum = limit.max != null ? limit.max! / 4 : null; + try { + final limit = await anonPayApi.fetchLimits( + cryptoCurrency: cryptoCurrency, + fiatCurrency: selectedCurrency is FiatCurrency ? selectedCurrency as FiatCurrency : null, + ); + minimum = limit.min; + maximum = limit.max != null ? limit.max! / 4 : null; + } catch (e) { + state = FailureState(e.toString()); + } } @computed diff --git a/lib/view_model/hardware_wallet/ledger_view_model.dart b/lib/view_model/hardware_wallet/ledger_view_model.dart index 4f80aa698..f555da0cf 100644 --- a/lib/view_model/hardware_wallet/ledger_view_model.dart +++ b/lib/view_model/hardware_wallet/ledger_view_model.dart @@ -137,7 +137,9 @@ abstract class LedgerViewModelBase with Store { allowChangeWallet: true, isReconnect: true, onConnectDevice: (context, ledgerVM) async { - Navigator.of(context).pop(); + if (context.mounted) { + Navigator.of(context).pop(); + } }, ), ); diff --git a/lib/view_model/wallet_list/wallet_list_view_model.dart b/lib/view_model/wallet_list/wallet_list_view_model.dart index bd135ef96..96662e0b6 100644 --- a/lib/view_model/wallet_list/wallet_list_view_model.dart +++ b/lib/view_model/wallet_list/wallet_list_view_model.dart @@ -216,7 +216,6 @@ abstract class WalletListViewModelBase with Store { await sortGroupByType(); break; case FilterListOrderType.Custom: - default: await reorderAccordingToWalletList(); break; } From b38892a19f696edcc9b9f41da36f0dbf5eaf9d4f Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Tue, 15 Apr 2025 03:32:25 +0200 Subject: [PATCH 06/11] update build numbers [skip ci] --- scripts/android/app_env.sh | 4 ++-- scripts/ios/app_env.sh | 4 ++-- scripts/macos/app_env.sh | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index 435d74b72..4de7a3373 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -15,14 +15,14 @@ APP_ANDROID_TYPE=$1 MONERO_COM_NAME="Monero.com" MONERO_COM_VERSION="4.26.0" -MONERO_COM_BUILD_NUMBER=119 +MONERO_COM_BUILD_NUMBER=120 MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_PACKAGE="com.monero.app" MONERO_COM_SCHEME="monero.com" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="4.26.0" -CAKEWALLET_BUILD_NUMBER=257 +CAKEWALLET_BUILD_NUMBER=258 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" CAKEWALLET_SCHEME="cakewallet" diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index bb6cf2753..b42a8a2da 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -13,12 +13,12 @@ APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" MONERO_COM_VERSION="4.26.0" -MONERO_COM_BUILD_NUMBER=116 +MONERO_COM_BUILD_NUMBER=117 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="4.26.0" -CAKEWALLET_BUILD_NUMBER=311 +CAKEWALLET_BUILD_NUMBER=312 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" diff --git a/scripts/macos/app_env.sh b/scripts/macos/app_env.sh index 9a3b95f89..651ad48e9 100755 --- a/scripts/macos/app_env.sh +++ b/scripts/macos/app_env.sh @@ -17,12 +17,12 @@ fi MONERO_COM_NAME="Monero.com" MONERO_COM_VERSION="4.26.0" -MONERO_COM_BUILD_NUMBER=48 +MONERO_COM_BUILD_NUMBER=49 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="4.26.0" -CAKEWALLET_BUILD_NUMBER=110 +CAKEWALLET_BUILD_NUMBER=111 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then From 77980496a8ef94010279cac867e4017ea44a7dc1 Mon Sep 17 00:00:00 2001 From: Omar Hatem Date: Wed, 16 Apr 2025 03:37:34 +0200 Subject: [PATCH 07/11] Remove words length from pre-seed warning (#2208) * Remove words length from pre-seed warning * Adjust backup to default node selection if null Gracefully handle Decred failure Minor fixes --- lib/di.dart | 4 +-- lib/router.dart | 9 ++---- .../screens/new_wallet/new_wallet_page.dart | 6 ++-- ..._group_existing_seed_description_page.dart | 7 ++-- lib/src/screens/seed/pre_seed_page.dart | 6 ++-- lib/view_model/wallet_new_vm.dart | 32 ------------------- res/values/strings_ar.arb | 2 +- res/values/strings_bg.arb | 2 +- res/values/strings_cs.arb | 2 +- res/values/strings_de.arb | 2 +- res/values/strings_en.arb | 2 +- res/values/strings_es.arb | 2 +- res/values/strings_fr.arb | 2 +- res/values/strings_ha.arb | 2 +- res/values/strings_hi.arb | 2 +- res/values/strings_hr.arb | 2 +- res/values/strings_hy.arb | 2 +- res/values/strings_id.arb | 2 +- res/values/strings_it.arb | 2 +- res/values/strings_ja.arb | 2 +- res/values/strings_ko.arb | 2 +- res/values/strings_my.arb | 2 +- res/values/strings_nl.arb | 2 +- res/values/strings_pl.arb | 2 +- res/values/strings_pt.arb | 2 +- res/values/strings_ru.arb | 2 +- res/values/strings_th.arb | 2 +- res/values/strings_tl.arb | 2 +- res/values/strings_tr.arb | 2 +- res/values/strings_uk.arb | 2 +- res/values/strings_ur.arb | 2 +- res/values/strings_vi.arb | 2 +- res/values/strings_yo.arb | 2 +- res/values/strings_zh.arb | 2 +- 34 files changed, 37 insertions(+), 83 deletions(-) diff --git a/lib/di.dart b/lib/di.dart index dcd0165ec..6354a0c0f 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -15,7 +15,6 @@ import 'package:cake_wallet/core/backup_service_v3.dart'; import 'package:cake_wallet/core/new_wallet_arguments.dart'; import 'package:cake_wallet/buy/robinhood/robinhood_buy_provider.dart'; import 'package:cake_wallet/core/auth_service.dart'; -import 'package:cake_wallet/core/backup_service.dart'; import 'package:cake_wallet/core/key_service.dart'; import 'package:cake_wallet/core/new_wallet_type_arguments.dart'; import 'package:cake_wallet/core/secure_storage.dart'; @@ -1203,8 +1202,7 @@ Future setup({ ); }); - getIt.registerFactoryParam( - (seedPhraseLength, _) => PreSeedPage(seedPhraseLength)); + getIt.registerFactory(() => PreSeedPage()); getIt.registerFactoryParam( (content, _) => TransactionSuccessPage(content: content)); diff --git a/lib/router.dart b/lib/router.dart index e69f75f21..8511714fc 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -9,7 +9,6 @@ import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/entities/qr_view_data.dart'; import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart'; -import 'package:cake_wallet/entities/wallet_nft_response.dart'; import 'package:cake_wallet/exchange/trade.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/routes.dart'; @@ -140,7 +139,6 @@ import 'package:cw_core/wallet_type.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:cake_wallet/src/screens/cake_pay/cake_pay.dart'; import 'src/screens/buy/buy_sell_page.dart'; import 'src/screens/dashboard/pages/nft_import_page.dart'; @@ -603,13 +601,10 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.preSeedPage: - return MaterialPageRoute( - builder: (_) => getIt.get(param1: settings.arguments as int)); + return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.walletGroupExistingSeedDescriptionPage: - return MaterialPageRoute( - builder: (_) => WalletGroupExistingSeedDescriptionPage( - seedPhraseWordsLength: settings.arguments as int)); + return MaterialPageRoute(builder: (_) => WalletGroupExistingSeedDescriptionPage()); case Routes.transactionSuccessPage: return MaterialPageRoute( diff --git a/lib/src/screens/new_wallet/new_wallet_page.dart b/lib/src/screens/new_wallet/new_wallet_page.dart index 044c52349..1304b4e1d 100644 --- a/lib/src/screens/new_wallet/new_wallet_page.dart +++ b/lib/src/screens/new_wallet/new_wallet_page.dart @@ -104,11 +104,9 @@ class _WalletNameFormState extends State { if (state is ExecutedSuccessfullyState) { if (widget.isChildWallet) { Navigator.of(navigatorKey.currentContext ?? context).pushNamed( - Routes.walletGroupExistingSeedDescriptionPage, - arguments: _walletNewVM.seedPhraseWordsLength); + Routes.walletGroupExistingSeedDescriptionPage); } else { - Navigator.of(navigatorKey.currentContext ?? context) - .pushNamed(Routes.preSeedPage, arguments: _walletNewVM.seedPhraseWordsLength); + Navigator.of(navigatorKey.currentContext ?? context).pushNamed(Routes.preSeedPage); } } diff --git a/lib/src/screens/new_wallet/wallet_group_existing_seed_description_page.dart b/lib/src/screens/new_wallet/wallet_group_existing_seed_description_page.dart index 34e07bbaf..a1bd4ebff 100644 --- a/lib/src/screens/new_wallet/wallet_group_existing_seed_description_page.dart +++ b/lib/src/screens/new_wallet/wallet_group_existing_seed_description_page.dart @@ -9,9 +9,7 @@ import 'package:cake_wallet/themes/theme_base.dart'; import 'package:flutter/material.dart'; class WalletGroupExistingSeedDescriptionPage extends BasePage { - WalletGroupExistingSeedDescriptionPage({required this.seedPhraseWordsLength}); - - final int seedPhraseWordsLength; + WalletGroupExistingSeedDescriptionPage(); @override String get title => S.current.wallet_group; @@ -69,8 +67,7 @@ class WalletGroupExistingSeedDescriptionPage extends BasePage { child: PrimaryButton( key: ValueKey( 'wallet_group_existing_seed_description_page_verify_seed_button_key'), - onPressed: () => Navigator.pushNamed(context, Routes.preSeedPage, - arguments: seedPhraseWordsLength), + onPressed: () => Navigator.pushNamed(context, Routes.preSeedPage), text: S.current.verify_seed, color: Theme.of(context).cardColor, textColor: currentTheme.type == ThemeType.dark diff --git a/lib/src/screens/seed/pre_seed_page.dart b/lib/src/screens/seed/pre_seed_page.dart index 91a47fda5..5fb6bb8c1 100644 --- a/lib/src/screens/seed/pre_seed_page.dart +++ b/lib/src/screens/seed/pre_seed_page.dart @@ -4,9 +4,7 @@ import 'package:cake_wallet/src/screens/Info_page.dart'; import 'package:flutter/cupertino.dart'; class PreSeedPage extends InfoPage { - PreSeedPage(this.seedPhraseLength); - - final int seedPhraseLength; + PreSeedPage(); @override bool get onWillPop => false; @@ -15,7 +13,7 @@ class PreSeedPage extends InfoPage { String get pageTitle => S.current.pre_seed_title; @override - String get pageDescription => S.current.pre_seed_description(seedPhraseLength.toString()); + String get pageDescription => S.current.pre_seed_description; @override String get buttonText => S.current.pre_seed_button_text; diff --git a/lib/view_model/wallet_new_vm.dart b/lib/view_model/wallet_new_vm.dart index 1987a37d2..86d1be65f 100644 --- a/lib/view_model/wallet_new_vm.dart +++ b/lib/view_model/wallet_new_vm.dart @@ -52,38 +52,6 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store { bool get showLanguageSelector => newWalletArguments?.mnemonic == null && hasLanguageSelector; - int get seedPhraseWordsLength { - switch (type) { - case WalletType.monero: - case WalletType.wownero: - return advancedPrivacySettingsViewModel.isPolySeed ? 16 : 25; - case WalletType.tron: - case WalletType.solana: - case WalletType.polygon: - case WalletType.ethereum: - case WalletType.bitcoinCash: - return advancedPrivacySettingsViewModel.seedPhraseLength.value; - case WalletType.bitcoin: - case WalletType.litecoin: - return seedSettingsViewModel.bitcoinSeedType == BitcoinSeedType.bip39 - ? advancedPrivacySettingsViewModel.seedPhraseLength.value - : 24; - case WalletType.nano: - case WalletType.banano: - return seedSettingsViewModel.nanoSeedType == NanoSeedType.bip39 - ? advancedPrivacySettingsViewModel.seedPhraseLength.value - : 24; - case WalletType.none: - return 24; - case WalletType.haven: - return 25; - case WalletType.zano: - return 26; - case WalletType.decred: - return 15; - } - } - bool get hasSeedType => newWalletArguments?.mnemonic == null && [WalletType.monero, WalletType.wownero].contains(type); diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index f9c611f44..562d0221a 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -544,7 +544,7 @@ "potential_scam": "عملية احتيال محتملة", "powered_by": "بدعم من ${title}", "pre_seed_button_text": "انا أفهم. أرني سييد الخاص بي", - "pre_seed_description": "في الصفحة التالية ستشاهد سلسلة من الكلمات ${words}. هذه هي سييد الفريدة والخاصة بك وهي الطريقة الوحيدة لاسترداد محفظتك في حالة فقدها أو عطلها. تقع على عاتقك مسؤولية تدوينها وتخزينها في مكان آمن خارج تطبيق Cake Wallet.", + "pre_seed_description": "في الصفحة التالية ، سترى سلسلة من الكلمات. هذه هي البذور الفريدة والخاصة الخاصة بك وهي الطريقة الوحيدة لاستعادة محفظتك في حالة الخسارة أو العطل. تقع على عاتقك مسؤولية كتابتها وتخزينها في مكان آمن خارج تطبيق Cake Wallet.", "pre_seed_title": "مهم", "prepaid_cards": "البطاقات المدفوعة مسبقا", "prevent_screenshots": "منع لقطات الشاشة وتسجيل الشاشة", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 5fe762677..469621769 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -544,7 +544,7 @@ "potential_scam": "Потенциална измама", "powered_by": "Powered by ${title}", "pre_seed_button_text": "Разбирам. Покажи seed", - "pre_seed_description": "На следващата страница ще видите поредица от ${words} думи. Това е вашият таен личен seed и е единственият начин да възстановите портфейла си. Отговорността за съхранението му на сигурно място извън приложението на Cake Wallet е изцяло ВАША.", + "pre_seed_description": "На следващата страница ще видите поредица от думи. Това е вашето уникално и частно семе и това е единственият начин да възстановите портфейла си в случай на загуба или неизправност. Ваша отговорност е да го запишете и да го съхранявате на безопасно място извън приложението за портфейл за торта.", "pre_seed_title": "ВАЖНО", "prepaid_cards": "Предплатени карти", "prevent_screenshots": "Предотвратете екранни снимки и запис на екрана", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index e1cdb33ca..2bcb5fde2 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -544,7 +544,7 @@ "potential_scam": "Potenciální podvod", "powered_by": "Zajišťuje ${title}", "pre_seed_button_text": "Rozumím. Ukaž mi můj seed.", - "pre_seed_description": "Na následující stránce uvidíte sérii ${words} slov. Je to váš tzv. seed a je to JEDINÁ možnost, jak můžete později obnovit svou peněženku v případě ztráty nebo poruchy. Je VAŠÍ zodpovědností zapsat si ho a uložit si ho na bezpečném místě mimo aplikaci Cake Wallet.", + "pre_seed_description": "Na další stránce uvidíte řadu slov. Toto je vaše jedinečné a soukromé semeno a je to jediný způsob, jak obnovit peněženku v případě ztráty nebo poruchy. Je vaší odpovědností zapisovat jej a uložit jej na bezpečném místě mimo aplikaci Cake Wallet.", "pre_seed_title": "DŮLEŽITÉ", "prepaid_cards": "Předplacené karty", "prevent_screenshots": "Zabránit vytváření snímků obrazovky a nahrávání obrazovky", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 17d55eb78..361ab5aa2 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -545,7 +545,7 @@ "potential_scam": "Potenzieller Betrug", "powered_by": "Ermöglicht durch ${title}", "pre_seed_button_text": "Verstanden. Zeig mir meinen Seed", - "pre_seed_description": "Auf der nächsten Seite sehen Sie eine Reihe von ${words} Wörtern. Dies ist Ihr einzigartiger und privater Seed und der EINZIGE Weg, um Ihre Wallet im Falle eines Verlusts oder einer Fehlfunktion wiederherzustellen. Es liegt in IHRER Verantwortung, ihn aufzuschreiben und an einem sicheren Ort außerhalb der Cake Wallet-App aufzubewahren.", + "pre_seed_description": "Auf der nächsten Seite sehen Sie eine Reihe von Wörtern. Dies ist Ihr einzigartiger und privater Samen und der einzige Weg, Ihre Brieftasche im Falle eines Verlusts oder einer Fehlfunktion zurückzugewinnen. Es liegt in Ihrer Verantwortung, es aufzuschreiben und an einem sicheren Ort außerhalb der Cake Wallet -App aufzubewahren.", "pre_seed_title": "WICHTIG", "prepaid_cards": "Karten mit Guthaben", "prevent_screenshots": "Verhindern Sie Screenshots und Bildschirmaufzeichnungen", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 8ef3ddb6c..0fd842f83 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -545,7 +545,7 @@ "potential_scam": "Potential Scam", "powered_by": "Powered by ${title}", "pre_seed_button_text": "I understand. Show me my seed", - "pre_seed_description": "On the next page you will see a series of ${words} words. This is your unique and private seed and it is the ONLY way to recover your wallet in case of loss or malfunction. It is YOUR responsibility to write it down and store it in a safe place outside of the Cake Wallet app.", + "pre_seed_description": "On the next page you will see a series of words. This is your unique and private seed and it is the ONLY way to recover your wallet in case of loss or malfunction. It is YOUR responsibility to write it down and store it in a safe place outside of the Cake Wallet app.", "pre_seed_title": "IMPORTANT", "prepaid_cards": "Prepaid Cards", "prevent_screenshots": "Prevent screenshots and screen recording", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index a1ad5f580..f4a4a6bfe 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -545,7 +545,7 @@ "potential_scam": "Estafa potencial", "powered_by": "Posible gracias a ${title}", "pre_seed_button_text": "Entiendo. Muéstrame mi semilla", - "pre_seed_description": "En la página siguiente verás una serie de ${words} palabras. Esta es su semilla única y privada y es la ÚNICA forma de recuperar tu billetera en caso de pérdida o mal funcionamiento. Es TU responsabilidad escribirla y guardarla en un lugar seguro fuera de la aplicación Cake Wallet.", + "pre_seed_description": "En la página siguiente, verá una serie de palabras. Esta es su semilla única y privada y es la única forma de recuperar su billetera en caso de pérdida o mal funcionamiento. Es su responsabilidad escribirlo y almacenarlo en un lugar seguro fuera de la aplicación de billetera de pastel.", "pre_seed_title": "IMPORTANTE", "prepaid_cards": "Tajetas prepagadas", "prevent_screenshots": "Evitar capturas de pantalla y grabación de pantalla", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 55ecf02a9..1400ee9ee 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -544,7 +544,7 @@ "potential_scam": "Arnaque potentielle", "powered_by": "Proposé par ${title}", "pre_seed_button_text": "J'ai compris. Montrez moi ma phrase secrète (seed)", - "pre_seed_description": "Sur la page suivante vous allez voir une série de ${words} mots. Ils constituent votre phrase secrète (seed) unique et privée et sont le SEUL moyen de restaurer votre portefeuille (wallet) en cas de perte ou de dysfonctionnement. Il est de VOTRE responsabilité d'écrire cette série de mots et de la stocker dans un lieu sûr en dehors de l'application Cake Wallet.", + "pre_seed_description": "À la page suivante, vous verrez une série de mots. Il s'agit de votre semence unique et privée et c'est le seul moyen de récupérer votre portefeuille en cas de perte ou de dysfonctionnement. Il est de votre responsabilité de l'écrire et de le stocker dans un endroit sûr à l'extérieur de l'application de portefeuille Cake.", "pre_seed_title": "IMPORTANT", "prepaid_cards": "Cartes prépayées", "prevent_screenshots": "Empêcher les captures d'écran et l'enregistrement d'écran", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 6547f6728..27214fa30 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -546,7 +546,7 @@ "potential_scam": "M zamba", "powered_by": "An ƙarfafa shi ta ${title}", "pre_seed_button_text": "Ina fahimta. Nuna mini seed din nawa", - "pre_seed_description": "A kan shafin nan za ku ga wata ƙungiya na ${words} kalmomi. Wannan shine tsarin daban-daban ku kuma na sirri kuma shine hanya ɗaya kadai don mai da purse dinku a cikin yanayin rasa ko rashin aiki. Yana da damar da kuke a cikin tabbatar da kuyi rubuta shi kuma kuyi ajiye shi a wuri na aminci wanda ya wuce wurin app na Cake Wallet.", + "pre_seed_description": "A shafi na gaba za ku ga jerin kalmomi. Wannan shi ne zuriyarku na musamman da keɓaɓɓun iri kuma ita ce kadai hanyar da za a dawo da walat ɗinku idan an rasa ko rashin lalacewa ko kuma muguntar. Hakkin ku ne ka rubuta shi ƙasa kuma adana shi a cikin amintaccen wuri a waje da app din Wallet Ojef.", "pre_seed_title": "MUHIMMANCI", "prepaid_cards": "Katunan shirye-shirye", "prevent_screenshots": "Fada lambobi da jarrabobi na kayan lambobi", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index f1841a53e..0ee0d3707 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -545,7 +545,7 @@ "potential_scam": "संभावित घोटाला", "powered_by": "द्वारा संचालित ${title}", "pre_seed_button_text": "मै समझता हुँ। मुझे अपना बीज दिखाओ", - "pre_seed_description": "अगले पेज पर आपको ${words} शब्दों की एक श्रृंखला दिखाई देगी। यह आपका अद्वितीय और निजी बीज है और नुकसान या खराबी के मामले में अपने बटुए को पुनर्प्राप्त करने का एकमात्र तरीका है। यह आपकी जिम्मेदारी है कि इसे नीचे लिखें और इसे Cake Wallet ऐप के बाहर सुरक्षित स्थान पर संग्रहीत करें।", + "pre_seed_description": "अगले पृष्ठ पर आपको शब्दों की एक श्रृंखला दिखाई देगी। यह आपका अनूठा और निजी बीज है और यह नुकसान या खराबी के मामले में अपने बटुए को पुनर्प्राप्त करने का एकमात्र तरीका है। यह आपकी जिम्मेदारी है कि आप इसे लिखें और इसे केक वॉलेट ऐप के बाहर एक सुरक्षित स्थान पर संग्रहीत करें।", "pre_seed_title": "महत्वपूर्ण", "prepaid_cards": "पूर्वदत्त कार्ड", "prevent_screenshots": "स्क्रीनशॉट और स्क्रीन रिकॉर्डिंग रोकें", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 741e3ae09..497f22f16 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -544,7 +544,7 @@ "potential_scam": "Potencijalna prijevara", "powered_by": "Omogućio ${title}", "pre_seed_button_text": "Razumijem. Prikaži mi moj pristupni izraz", - "pre_seed_description": "Na sljedećoj ćete stranici vidjeti niz ${words} riječi. Radi se o Vašem jedinstvenom i tajnom pristupnom izrazu koji je ujedno i JEDINI način na koji možete oporaviti svoj novčanik u slučaju gubitka ili kvara. VAŠA je odgovornost zapisati ga te pohraniti na sigurno mjesto izvan Cake Wallet aplikacije.", + "pre_seed_description": "Na sljedećoj stranici vidjet ćete niz riječi. Ovo je vaše jedinstveno i privatno sjeme i to je jedini način da povratite novčanik u slučaju gubitka ili neispravnosti. Vaša je odgovornost zapisati je i pohraniti na sigurno mjesto izvan aplikacije za novčanik.", "pre_seed_title": "VAŽNO", "prepaid_cards": "Unaprijed plaćene kartice", "prevent_screenshots": "Spriječite snimke zaslona i snimanje zaslona", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 67ae614d6..a421287e9 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -543,7 +543,7 @@ "potential_scam": "Հնարավոր խաբեություն", "powered_by": "${title} կողմից ապահովված", "pre_seed_button_text": "Ես հասկանում եմ։ Ցույց տվեք իմ սերմը", - "pre_seed_description": "Հաջորդ էջում դուք կտեսնեք ${words} բառերի շարք։ Սա ձեր յուրահատուկ և գաղտնի սերմն է, որը ձեր դրամապանակը վերականգնելու միակ միջոցն է կորուստի կամ սխալ գործարքի դեպքում։ Դուք պատասխանատու եք այն գրառել և ապահով վայրում պահել Cake Wallet հավելվածից դուրս", + "pre_seed_description": "Հաջորդ էջում կտեսնեք մի շարք բառեր: Սա ձեր եզակի եւ մասնավոր սերմն է, եւ դա ձեր դրամապանակը վերականգնելու միակ միջոցն է կորստի կամ անսարքության դեպքում: Ձեր պարտականությունն է գրել այն եւ պահել այն անվտանգ վայրում, տորթի դրամապանակի հավելվածից դուրս:", "pre_seed_title": "ԿԱՐԵՎՈՐ", "prepaid_cards": "Նախավճարային քարտեր", "prevent_screenshots": "Կանխել էկրանի պատկերները և տեսագրությունը", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 96ccb39ac..3f9a16b5d 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -546,7 +546,7 @@ "potential_scam": "Penipuan potensial", "powered_by": "Didukung oleh ${title}", "pre_seed_button_text": "Saya mengerti. Tampilkan seed saya", - "pre_seed_description": "Di halaman berikutnya Anda akan melihat serangkaian kata ${words}. Ini adalah seed unik dan pribadi Anda dan itu SATU-SATUNYA cara untuk mengembalikan dompet Anda jika hilang atau rusak. Ini adalah TANGGUNG JAWAB Anda untuk menuliskannya dan menyimpan di tempat yang aman di luar aplikasi Cake Wallet.", + "pre_seed_description": "Di halaman berikutnya Anda akan melihat serangkaian kata. Ini adalah benih unik dan pribadi Anda dan ini adalah satu -satunya cara untuk memulihkan dompet Anda jika terjadi kehilangan atau kerusakan. Adalah tanggung jawab Anda untuk menuliskannya dan menyimpannya di tempat yang aman di luar aplikasi Cake Wallet.", "pre_seed_title": "PENTING", "prepaid_cards": "Kartu prabayar", "prevent_screenshots": "Cegah tangkapan layar dan perekaman layar", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 74728aeb0..dd52e5b9f 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -545,7 +545,7 @@ "potential_scam": "Potenziale truffa", "powered_by": "Sviluppato da ${title}", "pre_seed_button_text": "Ho capito. Mostrami il seme", - "pre_seed_description": "Nella pagina seguente ti sarà mostrata una serie di parole ${words}. Questo è il tuo seme unico e privato ed è l'UNICO modo per recuperare il tuo portafoglio in caso di perdita o malfunzionamento. E' TUA responsabilità trascriverlo e conservarlo in un posto sicuro fuori dall'app Cake Wallet.", + "pre_seed_description": "Nella pagina successiva vedrai una serie di parole. Questo è il tuo seme unico e privato ed è l'unico modo per recuperare il portafoglio in caso di perdita o malfunzionamento. È tua responsabilità scriverlo e archiviarlo in un posto sicuro al di fuori dell'app per il portafoglio Cake.", "pre_seed_title": "IMPORTANTE", "prepaid_cards": "Carte prepagata", "prevent_screenshots": "Impedisci screenshot e registrazione dello schermo", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 0bb56a964..a7e2e6737 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -545,7 +545,7 @@ "potential_scam": "潜在的な詐欺", "powered_by": "搭載 ${title}", "pre_seed_button_text": "わかります。 種を見せて", - "pre_seed_description": "次のページでは、一連の${words}語が表示されます。 これはあなたのユニークでプライベートなシードであり、紛失や誤動作が発生した場合にウォレットを回復する唯一の方法です。 それを書き留めて、Cake Wallet アプリの外の安全な場所に保管するのはあなたの責任です。", + "pre_seed_description": "次のページには、一連の単語が表示されます。これはあなたのユニークでプライベートな種であり、損失や誤動作の場合に財布を回復する唯一の方法です。それを書き留めて、ケーキウォレットアプリの外の安全な場所に保管するのはあなたの責任です。", "pre_seed_title": "重要", "prepaid_cards": "プリペイドカード", "prevent_screenshots": "スクリーンショットと画面録画を防止する", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 846c8f47b..bef6d359b 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -544,7 +544,7 @@ "potential_scam": "잠재적 사기", "powered_by": "에 의해 구동 ${title}", "pre_seed_button_text": "이해 했어요. 내 씨앗을 보여줘", - "pre_seed_description": "다음 페이지에서 ${words} 개의 단어를 볼 수 있습니다. 이것은 귀하의 고유하고 개인적인 시드이며 분실 또는 오작동시 지갑을 복구하는 유일한 방법입니다. 기록해두고 Cake Wallet 앱 외부의 안전한 장소에 보관하는 것은 귀하의 책임입니다.", + "pre_seed_description": "다음 페이지에는 일련의 단어가 표시됩니다. 이것은 독특하고 개인적인 씨앗이며 손실이나 오작동의 경우 지갑을 회수하는 유일한 방법입니다. 케이크 지갑 앱 외부의 안전한 장소에 그것을 적어두고 보관하는 것은 귀하의 책임입니다.", "pre_seed_title": "중대한", "prepaid_cards": "선불 카드", "prevent_screenshots": "스크린샷 및 화면 녹화 방지", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 31bed9bb1..648650b3a 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -544,7 +544,7 @@ "potential_scam": "အလားအလာရှိသောလိမ်လည်မှု", "powered_by": "${title} မှ ပံ့ပိုးပေးသည်", "pre_seed_button_text": "ကျွန်တော်နားလည်ပါတယ်။ ငါ့အမျိုးအနွယ်ကို ပြလော့", - "pre_seed_description": "နောက်စာမျက်နှာတွင် ${words} စကားလုံးများ အတွဲလိုက်ကို တွေ့ရပါမည်။ ၎င်းသည် သင်၏ထူးခြားပြီး သီးသန့်မျိုးစေ့ဖြစ်ပြီး ပျောက်ဆုံးခြင်း သို့မဟုတ် ချွတ်ယွင်းမှုရှိပါက သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူရန် တစ်ခုတည်းသောနည်းလမ်းဖြစ်သည်။ ၎င်းကို Cake Wallet အက်ပ်၏အပြင်ဘက်တွင် လုံခြုံသောနေရာတွင် သိမ်းဆည်းရန်မှာ သင်၏တာဝန်ဖြစ်သည်။", + "pre_seed_description": "နောက်စာမျက်နှာမှာစကားလုံးတစ်လုံးကိုတွေ့ရလိမ့်မယ်။ ၎င်းသည်သင်၏ထူးခြားသည့်နှင့်ပုဂ္ဂလိကမျိုးစေ့ဖြစ်ပြီးဆုံးရှုံးမှုသို့မဟုတ်ချွတ်ယွင်းမှုကိစ္စတွင်သင်၏ပိုက်ဆံအိတ်ကိုပြန်လည်ရယူရန်တစ်ခုတည်းသောနည်းလမ်းဖြစ်သည်။ ၎င်းကိုရေးရန်နှင့်၎င်းကို Cake Wallet App အပြင်ဘက်တွင်လုံခြုံသောနေရာ၌သိမ်းဆည်းရန်သင်၏တာ 0 န်ဖြစ်သည်။", "pre_seed_title": "အရေးကြီးသည်။", "prepaid_cards": "ကြိုတင်ငွေဖြည့်ကဒ်များ", "prevent_screenshots": "ဖန်သားပြင်ဓာတ်ပုံများနှင့် မျက်နှာပြင်ရိုက်ကူးခြင်းကို တားဆီးပါ။", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index fab0f8bc7..4cd39fa40 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -544,7 +544,7 @@ "potential_scam": "Potentiële zwendel", "powered_by": "Aangedreven door ${title}", "pre_seed_button_text": "Ik begrijp het. Laat me mijn zaad zien", - "pre_seed_description": "Op de volgende pagina ziet u een reeks van ${words} woorden. Dit is uw unieke en persoonlijke zaadje en het is de ENIGE manier om uw portemonnee te herstellen in geval van verlies of storing. Het is JOUW verantwoordelijkheid om het op te schrijven en op een veilige plaats op te slaan buiten de Cake Wallet app.", + "pre_seed_description": "Op de volgende pagina ziet u een reeks woorden. Dit is uw unieke en privézaad en het is de enige manier om uw portemonnee te herstellen in geval van verlies of storing. Het is uw verantwoordelijkheid om het op te schrijven en op te slaan op een veilige plek buiten de cake -portemonnee -app.", "pre_seed_title": "BELANGRIJK", "prepaid_cards": "Prepaid-kaarten", "prevent_screenshots": "Voorkom screenshots en schermopname", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index ed700e274..5605603d9 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -544,7 +544,7 @@ "potential_scam": "Potencjalne oszustwo", "powered_by": "Obsługiwane przez ${title}", "pre_seed_button_text": "Rozumiem. Pokaż mi moją fraze seed", - "pre_seed_description": "Na następnej stronie zobaczysz serię ${words} słów. To jest Twoja unikalna i prywatna fraza seed i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii telefonu. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu (np. na kartce w sejfie).", + "pre_seed_description": "Na następnej stronie zobaczysz serię słów. To jest twoje wyjątkowe i prywatne ziarno i jest to jedyny sposób na odzyskanie portfela w przypadku utraty lub awarii. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu poza aplikacją do portfela ciasta.", "pre_seed_title": "WAŻNE", "prepaid_cards": "Karty przedpłacone", "prevent_screenshots": "Zapobiegaj zrzutom ekranu i nagrywaniu ekranu", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index b61d97b83..390ab40b9 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -546,7 +546,7 @@ "potential_scam": "Golpe potencial", "powered_by": "Troca realizada por ${title}", "pre_seed_button_text": "Compreendo. Me mostre minha semente", - "pre_seed_description": "Na próxima página, você verá uma série de ${words} palavras. Esta é a sua semente única e privada e é a ÚNICA maneira de recuperar sua carteira em caso de perda ou mau funcionamento. É SUA responsabilidade anotá-lo e armazená-lo em um local seguro fora do aplicativo Cake Wallet.", + "pre_seed_description": "Na próxima página, você verá uma série de palavras. Esta é a sua semente única e privada e é a única maneira de recuperar sua carteira em caso de perda ou mau funcionamento. É sua responsabilidade anotar e armazená -lo em um local seguro fora do aplicativo de carteira de bolo.", "pre_seed_title": "IMPORTANTE", "prepaid_cards": "Cartões pré-pagos", "prevent_screenshots": "Evite capturas de tela e gravação de tela", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 773b65fb0..848c7dd57 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -545,7 +545,7 @@ "potential_scam": "Потенциальная афера", "powered_by": "Используя ${title}", "pre_seed_button_text": "Понятно. Покажите мнемоническую фразу", - "pre_seed_description": "На следующей странице вы увидите серию из ${words} слов. Это ваша уникальная и личная мнемоническая фраза, и это ЕДИНСТВЕННЫЙ способ восстановить свой кошелек в случае потери или неисправности. ВАМ необходимо записать ее и хранить в надежном месте вне приложения Cake Wallet.", + "pre_seed_description": "На следующей странице вы увидите серию слов. Это ваше уникальное и частное семя, и это единственный способ восстановить ваш кошелек в случае потери или неисправности. Вы несете ответственность за то, чтобы записать его и хранить в безопасном месте за пределами приложения кошелька для торта.", "pre_seed_title": "ВАЖНО", "prepaid_cards": "Предоплаченные карты", "prevent_screenshots": "Предотвратить скриншоты и запись экрана", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index ff27d906b..e9063cb2a 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -544,7 +544,7 @@ "potential_scam": "การหลอกลวงที่มีศักยภาพ", "powered_by": "พัฒนาขึ้นโดย ${title}", "pre_seed_button_text": "ฉันเข้าใจ แสดง seed ของฉัน", - "pre_seed_description": "บนหน้าถัดไปคุณจะเห็นชุดของคำ ${words} คำ นี่คือ seed ของคุณที่ไม่ซ้ำใดๆ และเป็นความลับเพียงของคุณ และนี่คือเพียงวิธีเดียวที่จะกู้กระเป๋าของคุณในกรณีที่สูญหายหรือมีปัญหา มันเป็นความรับผิดชอบของคุณเพื่อเขียนมันลงบนกระดาษและจัดเก็บไว้ในที่ปลอดภัยนอกแอป Cake Wallet", + "pre_seed_description": "ในหน้าถัดไปคุณจะเห็นชุดคำ นี่คือเมล็ดพันธุ์ที่ไม่เหมือนใครและเป็นส่วนตัวของคุณและเป็นวิธีเดียวที่จะกู้คืนกระเป๋าเงินของคุณในกรณีที่สูญเสียหรือทำงานผิดปกติ มันเป็นความรับผิดชอบของคุณที่จะเขียนลงและเก็บไว้ในที่ปลอดภัยนอกแอพเค้กกระเป๋าเงิน", "pre_seed_title": "สำคัญ", "prepaid_cards": "บัตรเติมเงิน", "prevent_screenshots": "ป้องกันภาพหน้าจอและการบันทึกหน้าจอ", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 60aff4d05..a390b218a 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -544,7 +544,7 @@ "potential_scam": "Potensyal na scam", "powered_by": "Pinapagana ng ${title}", "pre_seed_button_text": "Naiintindihan ko. Ipakita sa akin ang aking binhi", - "pre_seed_description": "Sa susunod na pahina makikita mo ang isang serye ng mga ${words} na mga salita. Ito ang iyong natatangi at pribadong binhi at ito ang tanging paraan upang mabawi ang iyong pitaka kung sakaling mawala o madepektong paggawa. Responsibilidad mong isulat ito at itago ito sa isang ligtas na lugar sa labas ng cake wallet app.", + "pre_seed_description": "Sa susunod na pahina makikita mo ang isang serye ng mga salita. Ito ang iyong natatangi at pribadong binhi at ito ang tanging paraan upang mabawi ang iyong pitaka kung sakaling mawala o madepektong paggawa. Responsibilidad mong isulat ito at itago ito sa isang ligtas na lugar sa labas ng cake wallet app.", "pre_seed_title": "Mahalaga", "prepaid_cards": "Mga Prepaid Card", "prevent_screenshots": "Maiwasan ang mga screenshot at pag -record ng screen", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index d7502370d..c4bd16b24 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -544,7 +544,7 @@ "potential_scam": "Potansiyel aldatmaca", "powered_by": "${title} tarafından desteklenmektedir", "pre_seed_button_text": "Anladım. Bana tohumumu göster.", - "pre_seed_description": "Bir sonraki sayfada ${words} kelime göreceksin. Bu senin benzersiz ve özel tohumundur, kaybetmen veya silinmesi durumunda cüzdanını kurtarmanın TEK YOLUDUR. Bunu yazmak ve Cake Wallet uygulaması dışında güvenli bir yerde saklamak tamamen SENİN sorumluluğunda.", + "pre_seed_description": "Bir sonraki sayfada bir dizi kelime göreceksiniz. Bu sizin eşsiz ve özel tohumunuzdur ve kayıp veya arıza durumunda cüzdanınızı kurtarmanın tek yolu budur. Yazmak ve kek cüzdan uygulamasının dışında güvenli bir yerde saklamak sizin sorumluluğunuzdadır.", "pre_seed_title": "UYARI", "prepaid_cards": "Ön ödemeli kartlar", "prevent_screenshots": "Ekran görüntülerini ve ekran kaydını önleyin", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index c76166466..48039f0de 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -544,7 +544,7 @@ "potential_scam": "Потенційна афера", "powered_by": "Використовуючи ${title}", "pre_seed_button_text": "Зрозуміло. Покажіть мнемонічну фразу", - "pre_seed_description": "На наступній сторінці ви побачите серію з ${words} слів. Це ваша унікальна та приватна мнемонічна фраза, і це ЄДИНИЙ спосіб відновити ваш гаманець на випадок втрати або несправності. ВАМ необхідно записати її та зберігати в безпечному місці поза програмою Cake Wallet.", + "pre_seed_description": "На наступній сторінці ви побачите ряд слів. Це ваше унікальне та приватне насіння, і це єдиний спосіб відновити гаманець у разі втрати або несправності. Ви несете відповідальність записати його та зберігати в безпечному місці поза додатком для гаманця тортів.", "pre_seed_title": "ВАЖЛИВО", "prepaid_cards": "Передплачені картки", "prevent_screenshots": "Запобігати знімкам екрана та запису екрана", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index afc74b130..1582abdb6 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -546,7 +546,7 @@ "potential_scam": "ممکنہ گھوٹالہ", "powered_by": "${title} کے ذریعے تقویت یافتہ", "pre_seed_button_text": "میں سمجھتا ہوں۔ مجھے میرا بیج دکھاؤ", - "pre_seed_description": "اگلے صفحے پر آپ کو ${words} الفاظ کا ایک سلسلہ نظر آئے گا۔ یہ آپ کا انوکھا اور نجی بیج ہے اور یہ آپ کے بٹوے کو ضائع یا خرابی کی صورت میں بازیافت کرنے کا واحد طریقہ ہے۔ اسے لکھنا اور اسے کیک والیٹ ایپ سے باہر کسی محفوظ جگہ پر اسٹور کرنا آپ کی ذمہ داری ہے۔", + "pre_seed_description": "اگلے صفحے پر آپ کو الفاظ کا ایک سلسلہ نظر آئے گا۔ یہ آپ کا انوکھا اور نجی بیج ہے اور نقصان یا خرابی کی صورت میں اپنے بٹوے کی بازیابی کا واحد راستہ ہے۔ آپ کی ذمہ داری ہے کہ وہ اسے لکھیں اور اسے کیک پرس ایپ کے باہر کسی محفوظ جگہ پر محفوظ کریں۔", "pre_seed_title": "اہم", "prepaid_cards": "پری پیڈ کارڈز", "prevent_screenshots": "اسکرین شاٹس اور اسکرین ریکارڈنگ کو روکیں۔", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 00065f93c..ef75afd57 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -542,7 +542,7 @@ "potential_scam": "Lừa đảo tiềm năng", "powered_by": "Được cung cấp bởi ${title}", "pre_seed_button_text": "Tôi hiểu. Hiển thị hạt giống của tôi", - "pre_seed_description": "Trên trang tiếp theo, bạn sẽ thấy một chuỗi ${words} từ. Đây là hạt giống riêng tư và duy nhất của bạn và là CÁCH DUY NHẤT để khôi phục ví của bạn trong trường hợp mất hoặc hỏng hóc. Đây là TRÁCH NHIỆM của bạn để ghi lại và lưu trữ nó ở một nơi an toàn ngoài ứng dụng Cake Wallet.", + "pre_seed_description": "Trên trang tiếp theo, bạn sẽ thấy một loạt các từ. Đây là hạt giống độc đáo và riêng tư của bạn và đó là cách duy nhất để phục hồi ví của bạn trong trường hợp mất hoặc trục trặc. Bạn có trách nhiệm viết nó ra và lưu trữ nó ở một nơi an toàn bên ngoài ứng dụng ví Cake.", "pre_seed_title": "QUAN TRỌNG", "prepaid_cards": "Thẻ trả trước", "prevent_screenshots": "Ngăn chặn ảnh chụp màn hình và ghi hình màn hình", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index ea1e9b2ad..5e4cc331c 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -545,7 +545,7 @@ "potential_scam": "Egan ti o ni agbara", "powered_by": "Láti ọwọ́ ${title}", "pre_seed_button_text": "Mo ti gbọ́. O fi hóró mi hàn mi", - "pre_seed_description": "Ẹ máa wo àwọn ọ̀rọ̀ ${words} lórí ojú tó ń bọ̀. Èyí ni hóró aládàáni yín tó kì í jọra. Ẹ lè fi í nìkan dá àpamọ́wọ́ yín padà sípò tí àṣìṣe tàbí ìbàjẹ́ bá ṣẹlẹ̀. Hóró yín ni ẹ gbọ́dọ̀ kọ sílẹ̀ àti pamọ́ síbí tó kò léwu níta Cake Wallet.", + "pre_seed_description": "Ni oju-iwe ti o tẹle iwọ yoo rii lẹsẹsẹ awọn ọrọ. Eyi jẹ irugbin alailẹgbẹ ati ti ikọkọ ati pe o jẹ ọna nikan lati bọsi apamọwọ rẹ ni ọran ti pipadanu tabi aisise. O jẹ ojuṣe rẹ lati kọ ọ silẹ ki o tọju rẹ ni aye ailewu ti ita ti app Fifun akara naa.", "pre_seed_title": "Ó TI ṢE PÀTÀKÌ", "prepaid_cards": "Awọn kaadi ti a ti sanwo", "prevent_screenshots": "Pese asapọ ti awọn ẹrọ eto aṣa", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 9e8885250..089d4bd41 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -544,7 +544,7 @@ "potential_scam": "潜在骗局", "powered_by": "Powered by ${title}", "pre_seed_button_text": "我明白。 查看种子", - "pre_seed_description": "在下一页上,您将看到${words}个文字。 这是您独有的种子,是丟失或出现故障时恢复钱包的唯一方法。 您有必须将其写下并储存在Cake Wallet应用程序以外的安全地方。", + "pre_seed_description": "在下一页上,您将看到一系列单词。这是您独特的私人种子,这是在损失或故障时恢复钱包的唯一方法。将其写下来并将其存储在蛋糕钱包应用程序外的安全地方是您的责任。", "pre_seed_title": "重要", "prepaid_cards": "预付费卡", "prevent_screenshots": "防止截屏和录屏", From b2d4698cdf51c33540ad88b98e5070ee5c353af0 Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 17 Apr 2025 06:14:12 +0300 Subject: [PATCH 08/11] fix: bottom sheet stuck on swap (#2211) --- lib/exchange/trade_state.dart | 3 +++ .../exchange_trade/exchange_trade_page.dart | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/exchange/trade_state.dart b/lib/exchange/trade_state.dart index f63b41e5d..e1c4470b4 100644 --- a/lib/exchange/trade_state.dart +++ b/lib/exchange/trade_state.dart @@ -7,6 +7,7 @@ class TradeState extends EnumerableItem with Serializable { bool operator ==(Object other) => other is TradeState && other.raw == raw; static const pending = TradeState(raw: 'pending', title: 'Pending'); + static const awaiting = TradeState(raw: 'awaiting', title: 'Awaiting'); static const confirming = TradeState(raw: 'confirming', title: 'Confirming'); static const trading = TradeState(raw: 'trading', title: 'Trading'); static const traded = TradeState(raw: 'traded', title: 'Traded'); @@ -134,6 +135,8 @@ class TradeState extends EnumerableItem with Serializable { return success; case 'expired': return expired; + case 'awaiting': + return awaiting; default: throw Exception('Unexpected token: $raw in TradeState deserialize'); } diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 277d3c838..f4c8d590f 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -205,6 +205,7 @@ class ExchangeTradeState extends State { ); } + BuildContext? dialogContext; BuildContext? loadingBottomSheetContext; void _setEffects() { @@ -213,7 +214,12 @@ class ExchangeTradeState extends State { } _exchangeStateReaction = reaction((_) => this.widget.exchangeTradeViewModel.sendViewModel.state, - (ExecutionState state) { + (ExecutionState state) async { + + if (dialogContext != null && dialogContext?.mounted == true) { + Navigator.of(dialogContext!).pop(); + } + if (state is! IsExecutingState && loadingBottomSheetContext != null && loadingBottomSheetContext!.mounted) { @@ -237,6 +243,13 @@ class ExchangeTradeState extends State { } if (state is IsExecutingState) { + // wait a bit to avoid showing the loading dialog if transaction is failed + await Future.delayed(const Duration(milliseconds: 300)); + final currentState = widget.exchangeTradeViewModel.sendViewModel.state; + if (currentState is ExecutedSuccessfullyState || currentState is FailureState) { + return; + } + WidgetsBinding.instance.addPostFrameCallback((_) { if (context.mounted) { showModalBottomSheet( From f81957ed248f6752a572faf5f5ef1ab3983ce683 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Thu, 17 Apr 2025 20:36:33 +0200 Subject: [PATCH 09/11] minor ui fix [skip ci] --- .../screens/exchange_trade/exchange_trade_page.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 277d3c838..8d816878a 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -7,7 +7,6 @@ import 'package:cake_wallet/src/widgets/bottom_sheet/confirm_sending_bottom_shee import 'package:cake_wallet/src/widgets/bottom_sheet/info_bottom_sheet_widget.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/themes/theme_base.dart'; -import 'dart:ui'; import 'package:cake_wallet/utils/request_review_handler.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:mobx/mobx.dart'; @@ -311,10 +310,12 @@ class ExchangeTradeState extends State { actionButtonKey: ValueKey('send_page_sent_dialog_ok_button_key'), actionButton: () { Navigator.of(bottomSheetContext).pop(); - Navigator.of(context).pushNamedAndRemoveUntil( - Routes.dashboard, - (route) => false, - ); + if (context.mounted) { + Navigator.of(context).pushNamedAndRemoveUntil( + Routes.dashboard, + (route) => false, + ); + } RequestReviewHandler.requestReview(); }); }, From 66e1745ad9550a857d5046ebec1c48735d5d001c Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Fri, 18 Apr 2025 04:47:53 +0200 Subject: [PATCH 10/11] more trace in minor error [skip ci] --- lib/buy/onramper/onramper_buy_provider.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/buy/onramper/onramper_buy_provider.dart b/lib/buy/onramper/onramper_buy_provider.dart index ac198b488..6b903342f 100644 --- a/lib/buy/onramper/onramper_buy_provider.dart +++ b/lib/buy/onramper/onramper_buy_provider.dart @@ -11,7 +11,6 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cw_core/crypto_currency.dart'; -import 'package:cw_core/currency.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:flutter/material.dart'; @@ -242,7 +241,7 @@ class OnRamperBuyProvider extends BuyProvider { if (await canLaunchUrl(uri)) { await launchUrl(uri, mode: LaunchMode.externalApplication); } else { - throw Exception('Could not launch URL'); + throw Exception('Could not launch URL ${uri.toString()}'); } } @@ -276,7 +275,7 @@ class OnRamperBuyProvider extends BuyProvider { if (currency.tag != null) return '_' + _tagToNetwork(currency.tag!); - return '_' + (currency.fullName?.replaceAll(' ', '') ?? currency.title);; + return '_' + (currency.fullName?.replaceAll(' ', '') ?? currency.title); } String? normalizePaymentMethod(PaymentType paymentType) { From ffe1c115fab2154c7eed4a13a3eb7367db1c24c8 Mon Sep 17 00:00:00 2001 From: Serhii Date: Fri, 18 Apr 2025 15:53:22 +0300 Subject: [PATCH 11/11] Cw 1038 filter transaction popup not scrollable (#2207) * ui:make overflowing filter sections scrollable * Update pull_request_template.md --- .github/pull_request_template.md | 1 + .../dashboard/widgets/filter_widget.dart | 245 +++++++++++------- lib/src/widgets/alert_close_button.dart | 30 +-- 3 files changed, 164 insertions(+), 112 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 18ad16e4b..272f7bbee 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,3 +11,4 @@ Please include a summary of the changes and which issue is fixed / feature is ad - [ ] Format code - [ ] Look for code duplication - [ ] Clear naming for variables and methods +- [ ] Manual tests in accessibility mode (TalkBack on Android) passed diff --git a/lib/src/screens/dashboard/widgets/filter_widget.dart b/lib/src/screens/dashboard/widgets/filter_widget.dart index eaf00a1de..81f29b81c 100644 --- a/lib/src/screens/dashboard/widgets/filter_widget.dart +++ b/lib/src/screens/dashboard/widgets/filter_widget.dart @@ -1,123 +1,178 @@ +import 'package:cake_wallet/src/widgets/alert_background.dart'; +import 'package:cake_wallet/src/widgets/alert_close_button.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/filter_tile.dart'; import 'package:cake_wallet/src/widgets/section_divider.dart'; import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; import 'package:cake_wallet/themes/extensions/menu_theme.dart'; -import 'package:cake_wallet/view_model/dashboard/dropdown_filter_item.dart'; -import 'package:cake_wallet/view_model/dashboard/dropdown_filter_item_widget.dart'; +import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/view_model/dashboard/filter_item.dart'; import 'package:flutter/material.dart'; -import 'package:cake_wallet/src/widgets/picker_wrapper_widget.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; - -//import 'package:date_range_picker/date_range_picker.dart' as date_rage_picker; import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart'; -class FilterWidget extends StatelessWidget { - FilterWidget({required this.filterItems}); +class FilterWidget extends StatefulWidget { + const FilterWidget({required this.filterItems, this.onClose, Key? key}) : super(key: key); final Map> filterItems; + final Function()? onClose; + + @override + _FilterWidgetState createState() => _FilterWidgetState(); +} + +class _FilterWidgetState extends State { + final ScrollController _scrollController = ScrollController(); + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } @override Widget build(BuildContext context) { - const sectionDivider = const HorizontalSectionDivider(); - return PickerWrapperWidget( - children: [ - Padding( - padding: EdgeInsets.only(left: 24, right: 24, top: 24), - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(24)), - child: Container( - color: Theme.of(context).extension()!.backgroundColor, - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: EdgeInsets.all(24.0), - child: Text( - S.of(context).filter_by, - style: TextStyle( - color: - Theme.of(context).extension()!.detailsTitlesColor, - fontSize: 16, - fontFamily: 'Lato', - decoration: TextDecoration.none, - ), - ), - ), - sectionDivider, - ListView.separated( - padding: EdgeInsets.zero, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: filterItems.length, - separatorBuilder: (context, _) => sectionDivider, - itemBuilder: (_, index1) { - final title = filterItems.keys.elementAt(index1); - final section = filterItems.values.elementAt(index1); - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.only(top: 20, left: 24, right: 24), - child: Text( - title, - style: TextStyle( - color: Theme.of(context).extension()!.titleColor, - fontSize: 16, - fontFamily: 'Lato', - fontWeight: FontWeight.bold, - decoration: TextDecoration.none), - ), + return AlertBackground( + child: Column( + children: [ + const Expanded(child: SizedBox()), + Expanded( + flex: responsiveLayoutUtil.shouldRenderTabletUI ? 16 : 8, + child: LayoutBuilder( + builder: (context, constraints) { + double availableHeight = constraints.maxHeight; + return _buildFilterContent(context, availableHeight); + }, + ), + ), + Expanded( + child: AlertCloseButton( + key: const ValueKey('filter_wrapper_close_button_key'), + isPositioned: false, + onTap: widget.onClose, + ), + ), + const SizedBox(height: 24), + ], + ), + ); + } + + Widget _buildFilterContent(BuildContext context, double availableHeight) { + const sectionDivider = HorizontalSectionDivider(); + + const double totalHeaderHeight = 73; + const double filterTileMinHeight = 40; + double availableHeightForItems = availableHeight - totalHeaderHeight; + + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.only(left: 24, right: 24, top: 24), + child: ClipRRect( + borderRadius: BorderRadius.circular(24), + child: Container( + color: Theme.of(context).extension()!.backgroundColor, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(24.0), + child: Text( + S.of(context).filter_by, + style: TextStyle( + color: Theme.of(context) + .extension()! + .detailsTitlesColor, + fontSize: 16, + fontFamily: 'Lato', + decoration: TextDecoration.none, ), - ListView.builder( - padding: EdgeInsets.symmetric(horizontal: 28.0), - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), + ), + ), + sectionDivider, + ListView.separated( + padding: EdgeInsets.zero, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: widget.filterItems.length, + separatorBuilder: (context, _) => sectionDivider, + itemBuilder: (_, index1) { + final title = widget.filterItems.keys.elementAt(index1); + final section = widget.filterItems.values.elementAt(index1); + + final double itemHeight = + availableHeightForItems / widget.filterItems.length; + + final isSectionScrollable = + (itemHeight < (section.length * filterTileMinHeight)); + + final Widget sectionListView = ListView.builder( + controller: isSectionScrollable ? _scrollController : null, + padding: const EdgeInsets.symmetric(horizontal: 28.0), + shrinkWrap: isSectionScrollable ? false : true, + physics: isSectionScrollable + ? const BouncingScrollPhysics() + : const NeverScrollableScrollPhysics(), itemCount: section.length, itemBuilder: (_, index2) { final item = section[index2]; - - if (item is DropdownFilterItem) { - return Padding( - padding: EdgeInsets.fromLTRB(8, 0, 8, 16), - child: Container( - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - width: 1.0, - color: Theme.of(context).extension()!.secondaryTextColor), - ), - ), - child: DropdownFilterList( - items: item.items, - caption: item.caption, - selectedItem: item.selectedItem, - onItemSelected: item.onItemSelected, - ), - ), - ); - } final content = Observer( - builder: (_) => StandardCheckbox( - value: item.value(), - caption: item.caption, - gradientBackground: true, - borderColor: Theme.of(context).dividerColor, - iconColor: Colors.white, - onChanged: (value) => item.onChanged(), - )); - return FilterTile(child: content); + builder: (_) => StandardCheckbox( + value: item.value(), + caption: item.caption, + gradientBackground: true, + borderColor: Theme.of(context).dividerColor, + iconColor: Colors.white, + onChanged: (value) => item.onChanged(), + ), + ); + return FilterTile( + child: content, + ); }, - ) - ], - ); - }, + ); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 20, left: 24, right: 24), + child: Text( + title, + style: TextStyle( + color: Theme.of(context).extension()!.titleColor, + fontSize: 16, + fontFamily: 'Lato', + fontWeight: FontWeight.bold, + decoration: TextDecoration.none, + ), + ), + ), + Container( + height: isSectionScrollable ? itemHeight - totalHeaderHeight : null, + child: isSectionScrollable + ? Scrollbar( + controller: _scrollController, + thumbVisibility: true, + child: sectionListView, + ) + : sectionListView, + ), + ], + ); + }, + ), + ], ), - ]), + ), ), ), - ) - ], + ], + ), ); } } diff --git a/lib/src/widgets/alert_close_button.dart b/lib/src/widgets/alert_close_button.dart index 6ef0bdaa5..30e37ef20 100644 --- a/lib/src/widgets/alert_close_button.dart +++ b/lib/src/widgets/alert_close_button.dart @@ -7,6 +7,7 @@ class AlertCloseButton extends StatelessWidget { this.image, this.bottom, this.onTap, + this.isPositioned = true, super.key, }); @@ -14,6 +15,7 @@ class AlertCloseButton extends StatelessWidget { final Image? image; final double? bottom; + final bool isPositioned; final closeButton = Image.asset( 'assets/images/close.png', @@ -22,24 +24,18 @@ class AlertCloseButton extends StatelessWidget { @override Widget build(BuildContext context) { - return Positioned( - bottom: bottom ?? 60, - child: GestureDetector( + final button = GestureDetector( onTap: onTap ?? () => Navigator.of(context).pop(), child: Semantics( - label: S.of(context).close, - button: true, - enabled: true, - child: Container( - height: 42, - width: 42, - decoration: BoxDecoration(color: Colors.white, shape: BoxShape.circle), - child: Center( - child: image ?? closeButton, - ), - ), - ), - ), - ); + label: S.of(context).close, + button: true, + enabled: true, + child: Container( + height: 42, + width: 42, + decoration: BoxDecoration(color: Colors.white, shape: BoxShape.circle), + child: Center(child: image ?? closeButton)))); + + return isPositioned ? Positioned(bottom: bottom ?? 60, child: button) : button; } }