From 4ca50b5e6329dd5be066396ccb2e5a4c0483df53 Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 28 Nov 2024 02:42:46 +0200 Subject: [PATCH 1/7] Cw 649 rbf improvements opt in (#1772) * initial commit * revert changes * allow adding inputs to RBF transactions * address review comments[skip ci] --------- Co-authored-by: Omar Hatem --- cw_bitcoin/lib/electrum_wallet.dart | 145 ++++++++++++++++++++++------ 1 file changed, 113 insertions(+), 32 deletions(-) diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index c29df3c4a..17ced5adf 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -1503,14 +1503,21 @@ abstract class ElectrumWalletBase final bundle = await getTransactionExpanded(hash: txId); final outputs = bundle.originalTransaction.outputs; - final changeAddresses = walletAddresses.allAddresses.where((element) => element.isHidden); + final ownAddresses = walletAddresses.allAddresses.map((addr) => addr.address).toSet(); - // look for a change address in the outputs - final changeOutput = outputs.firstWhereOrNull((output) => changeAddresses.any( - (element) => element.address == addressFromOutputScript(output.scriptPubKey, network))); + final receiverAmount = outputs + .where((output) => !ownAddresses.contains(addressFromOutputScript(output.scriptPubKey, network))) + .fold(0, (sum, output) => sum + output.amount.toInt()); - var allInputsAmount = 0; + if (receiverAmount == 0) { + throw Exception("Receiver output not found."); + } + final availableInputs = unspentCoins.where((utxo) => utxo.isSending && !utxo.isFrozen).toList(); + int totalBalance = availableInputs.fold( + 0, (previousValue, element) => previousValue + element.value.toInt()); + + int allInputsAmount = 0; for (int i = 0; i < bundle.originalTransaction.inputs.length; i++) { final input = bundle.originalTransaction.inputs[i]; final inputTransaction = bundle.ins[i]; @@ -1521,12 +1528,10 @@ abstract class ElectrumWalletBase int totalOutAmount = bundle.originalTransaction.outputs .fold(0, (previousValue, element) => previousValue + element.amount.toInt()); - var currentFee = allInputsAmount - totalOutAmount; int remainingFee = (newFee - currentFee > 0) ? newFee - currentFee : newFee; - - return changeOutput != null && changeOutput.amount.toInt() - remainingFee >= 0; + return totalBalance - receiverAmount - remainingFee >= _dustAmount; } Future replaceByFee(String hash, int newFee) async { @@ -1534,12 +1539,13 @@ abstract class ElectrumWalletBase final bundle = await getTransactionExpanded(hash: hash); final utxos = []; + final outputs = []; List privateKeys = []; var allInputsAmount = 0; String? memo; - // Add inputs + // Add original inputs for (var i = 0; i < bundle.originalTransaction.inputs.length; i++) { final input = bundle.originalTransaction.inputs[i]; final inputTransaction = bundle.ins[i]; @@ -1549,8 +1555,7 @@ abstract class ElectrumWalletBase allInputsAmount += outTransaction.amount.toInt(); final addressRecord = - walletAddresses.allAddresses.firstWhere((element) => element.address == address); - + walletAddresses.allAddresses.firstWhere((element) => element.address == address); final btcAddress = RegexUtils.addressTypeFromStr(addressRecord.address, network); final privkey = generateECPrivate( hd: addressRecord.isHidden ? walletAddresses.sideHd : walletAddresses.mainHd, @@ -1568,15 +1573,13 @@ abstract class ElectrumWalletBase scriptType: _getScriptType(btcAddress), ), ownerDetails: - UtxoAddressDetails(publicKey: privkey.getPublic().toHex(), address: btcAddress), + UtxoAddressDetails(publicKey: privkey.getPublic().toHex(), address: btcAddress), ), ); } - // Create a list of available outputs - final outputs = []; + // Add original outputs for (final out in bundle.originalTransaction.outputs) { - // Check if the script contains OP_RETURN final script = out.scriptPubKey.script; if (script.contains('OP_RETURN') && memo == null) { final index = script.indexOf('OP_RETURN'); @@ -1598,7 +1601,7 @@ abstract class ElectrumWalletBase // Calculate the total amount and fees int totalOutAmount = - outputs.fold(0, (previousValue, output) => previousValue + output.value.toInt()); + outputs.fold(0, (previousValue, output) => previousValue + output.value.toInt()); int currentFee = allInputsAmount - totalOutAmount; int remainingFee = newFee - currentFee; @@ -1606,17 +1609,95 @@ abstract class ElectrumWalletBase throw Exception("New fee must be higher than the current fee."); } - // Deduct Remaining Fee from Main Outputs + // Deduct fee from change outputs first, if possible if (remainingFee > 0) { + final changeAddresses = walletAddresses.allAddresses.where((element) => element.isHidden); for (int i = outputs.length - 1; i >= 0; i--) { - int outputAmount = outputs[i].value.toInt(); + final output = outputs[i]; + final isChange = changeAddresses + .any((element) => element.address == output.address.toAddress(network)); + + if (isChange) { + int outputAmount = output.value.toInt(); + if (outputAmount > _dustAmount) { + int deduction = (outputAmount - _dustAmount >= remainingFee) + ? remainingFee + : outputAmount - _dustAmount; + outputs[i] = BitcoinOutput( + address: output.address, value: BigInt.from(outputAmount - deduction)); + remainingFee -= deduction; + + if (remainingFee <= 0) break; + } + } + } + } + + // If still not enough, add UTXOs until the fee is covered + if (remainingFee > 0) { + final unusedUtxos = unspentCoins + .where((utxo) => utxo.isSending && !utxo.isFrozen && utxo.confirmations! > 0) + .toList(); + + for (final utxo in unusedUtxos) { + final address = RegexUtils.addressTypeFromStr(utxo.address, network); + final privkey = generateECPrivate( + hd: utxo.bitcoinAddressRecord.isHidden + ? walletAddresses.sideHd + : walletAddresses.mainHd, + index: utxo.bitcoinAddressRecord.index, + network: network, + ); + privateKeys.add(privkey); + + utxos.add(UtxoWithAddress( + utxo: BitcoinUtxo( + txHash: utxo.hash, + value: BigInt.from(utxo.value), + vout: utxo.vout, + scriptType: _getScriptType(address)), + ownerDetails: + UtxoAddressDetails(publicKey: privkey.getPublic().toHex(), address: address), + )); + + allInputsAmount += utxo.value; + remainingFee -= utxo.value; + + if (remainingFee < 0) { + final changeOutput = outputs.firstWhereOrNull((output) => walletAddresses.allAddresses + .any((addr) => addr.address == output.address.toAddress(network))); + if (changeOutput != null) { + final newValue = changeOutput.value.toInt() + (-remainingFee); + outputs[outputs.indexOf(changeOutput)] = + BitcoinOutput(address: changeOutput.address, value: BigInt.from(newValue)); + } else { + final changeAddress = await walletAddresses.getChangeAddress(); + outputs.add(BitcoinOutput( + address: RegexUtils.addressTypeFromStr(changeAddress.address, network), + value: BigInt.from(-remainingFee))); + } + + remainingFee = 0; + break; + } + + if (remainingFee <= 0) break; + } + } + + // Deduct from the receiver's output if remaining fee is still greater than 0 + if (remainingFee > 0) { + for (int i = 0; i < outputs.length; i++) { + final output = outputs[i]; + int outputAmount = output.value.toInt(); if (outputAmount > _dustAmount) { int deduction = (outputAmount - _dustAmount >= remainingFee) ? remainingFee : outputAmount - _dustAmount; + outputs[i] = BitcoinOutput( - address: outputs[i].address, value: BigInt.from(outputAmount - deduction)); + address: output.address, value: BigInt.from(outputAmount - deduction)); remainingFee -= deduction; if (remainingFee <= 0) break; @@ -1633,11 +1714,11 @@ abstract class ElectrumWalletBase final changeAddresses = walletAddresses.allAddresses.where((element) => element.isHidden); final List changeOutputs = outputs .where((output) => changeAddresses - .any((element) => element.address == output.address.toAddress(network))) + .any((element) => element.address == output.address.toAddress(network))) .toList(); int totalChangeAmount = - changeOutputs.fold(0, (sum, output) => sum + output.value.toInt()); + changeOutputs.fold(0, (sum, output) => sum + output.value.toInt()); // The final amount that the receiver will receive int sendingAmount = allInputsAmount - newFee - totalChangeAmount; @@ -1654,8 +1735,7 @@ abstract class ElectrumWalletBase final transaction = txb.buildTransaction((txDigest, utxo, publicKey, sighash) { final key = - privateKeys.firstWhereOrNull((element) => element.getPublic().toHex() == publicKey); - + privateKeys.firstWhereOrNull((element) => element.getPublic().toHex() == publicKey); if (key == null) { throw Exception("Cannot find private key"); } @@ -1665,6 +1745,7 @@ abstract class ElectrumWalletBase } else { return key.signInput(txDigest, sigHash: sighash); } + }); return PendingBitcoinTransaction( @@ -1677,16 +1758,16 @@ abstract class ElectrumWalletBase hasChange: changeOutputs.isNotEmpty, feeRate: newFee.toString(), )..addListener((transaction) async { - transactionHistory.transactions.values.forEach((tx) { - if (tx.id == hash) { - tx.isReplaced = true; - tx.isPending = false; - transactionHistory.addOne(tx); - } - }); - transactionHistory.addOne(transaction); - await updateBalance(); + transactionHistory.transactions.values.forEach((tx) { + if (tx.id == hash) { + tx.isReplaced = true; + tx.isPending = false; + transactionHistory.addOne(tx); + } }); + transactionHistory.addOne(transaction); + await updateBalance(); + }); } catch (e) { throw e; } From 9cd69c4ba3649a1a928de806d925f540b07b5ad6 Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 28 Nov 2024 17:53:03 +0200 Subject: [PATCH 2/7] Cw 830 coin control getting cleared (#1825) * init commit * add select all button * localisation all coins * fix isSending and isFrozen state updates * fix: clean up electrum UTXOs * ui fixes * address the review comments[skip ci] * remove onPopInvoked[skip ci] --------- Co-authored-by: Omar Hatem --- cw_bitcoin/lib/bitcoin_wallet_service.dart | 9 + cw_bitcoin/lib/electrum_wallet.dart | 57 +++-- cw_bitcoin/lib/litecoin_wallet_service.dart | 9 + .../lib/src/bitcoin_cash_wallet_service.dart | 9 + cw_core/lib/unspent_coins_info.dart | 3 +- cw_core/lib/unspent_comparable_mixin.dart | 27 +++ cw_core/lib/unspent_transaction_output.dart | 4 +- .../unspent_coins_list_page.dart | 194 +++++++++++++++--- .../widgets/alert_with_no_action.dart.dart | 8 +- lib/src/widgets/base_alert_dialog.dart | 7 +- .../unspent_coins/unspent_coins_item.dart | 7 +- .../unspent_coins_list_view_model.dart | 163 +++++++++------ res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 1 + res/values/strings_fr.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_hy.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 3 +- res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 1 + res/values/strings_pt.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_vi.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + 40 files changed, 402 insertions(+), 125 deletions(-) create mode 100644 cw_core/lib/unspent_comparable_mixin.dart diff --git a/cw_bitcoin/lib/bitcoin_wallet_service.dart b/cw_bitcoin/lib/bitcoin_wallet_service.dart index 06f2082e4..7ee1534bf 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_service.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_service.dart @@ -106,6 +106,15 @@ class BitcoinWalletService extends WalletService< final walletInfo = walletInfoSource.values .firstWhereOrNull((info) => info.id == WalletBase.idFor(wallet, getType()))!; await walletInfoSource.delete(walletInfo.key); + + final unspentCoinsToDelete = unspentCoinsInfoSource.values.where( + (unspentCoin) => unspentCoin.walletId == walletInfo.id).toList(); + + final keysToDelete = unspentCoinsToDelete.map((unspentCoin) => unspentCoin.key).toList(); + + if (keysToDelete.isNotEmpty) { + await unspentCoinsInfoSource.deleteAll(keysToDelete); + } } @override diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 17ced5adf..771d135a0 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -304,6 +304,7 @@ abstract class ElectrumWalletBase Future init() async { await walletAddresses.init(); await transactionHistory.init(); + await cleanUpDuplicateUnspentCoins(); await save(); _autoSaveTimer = @@ -1379,10 +1380,11 @@ abstract class ElectrumWalletBase })); unspentCoins = updatedUnspentCoins; + + final currentWalletUnspentCoins = unspentCoinsInfo.values.where((element) => element.walletId == id); - if (unspentCoinsInfo.length != updatedUnspentCoins.length) { + if (currentWalletUnspentCoins.length != updatedUnspentCoins.length) { unspentCoins.forEach((coin) => addCoinInfo(coin)); - return; } await updateCoins(unspentCoins); @@ -1408,6 +1410,7 @@ abstract class ElectrumWalletBase coin.isFrozen = coinInfo.isFrozen; coin.isSending = coinInfo.isSending; coin.note = coinInfo.note; + if (coin.bitcoinAddressRecord is! BitcoinSilentPaymentAddressRecord) coin.bitcoinAddressRecord.balance += coinInfo.value; } else { @@ -1445,20 +1448,27 @@ abstract class ElectrumWalletBase @action Future addCoinInfo(BitcoinUnspent coin) async { - final newInfo = UnspentCoinsInfo( - walletId: id, - hash: coin.hash, - isFrozen: coin.isFrozen, - isSending: coin.isSending, - noteRaw: coin.note, - address: coin.bitcoinAddressRecord.address, - value: coin.value, - vout: coin.vout, - isChange: coin.isChange, - isSilentPayment: coin is BitcoinSilentPaymentsUnspent, - ); - await unspentCoinsInfo.add(newInfo); + // Check if the coin is already in the unspentCoinsInfo for the wallet + final existingCoinInfo = unspentCoinsInfo.values.firstWhereOrNull( + (element) => element.walletId == walletInfo.id && element == coin); + + if (existingCoinInfo == null) { + final newInfo = UnspentCoinsInfo( + walletId: id, + hash: coin.hash, + isFrozen: coin.isFrozen, + isSending: coin.isSending, + noteRaw: coin.note, + address: coin.bitcoinAddressRecord.address, + value: coin.value, + vout: coin.vout, + isChange: coin.isChange, + isSilentPayment: coin is BitcoinSilentPaymentsUnspent, + ); + + await unspentCoinsInfo.add(newInfo); + } } Future _refreshUnspentCoinsInfo() async { @@ -1486,6 +1496,23 @@ abstract class ElectrumWalletBase } } + Future cleanUpDuplicateUnspentCoins() async { + final currentWalletUnspentCoins = unspentCoinsInfo.values.where((element) => element.walletId == id); + final Map uniqueUnspentCoins = {}; + final List duplicateKeys = []; + + for (final unspentCoin in currentWalletUnspentCoins) { + final key = '${unspentCoin.hash}:${unspentCoin.vout}'; + if (!uniqueUnspentCoins.containsKey(key)) { + uniqueUnspentCoins[key] = unspentCoin; + } else { + duplicateKeys.add(unspentCoin.key); + } + } + + if (duplicateKeys.isNotEmpty) await unspentCoinsInfo.deleteAll(duplicateKeys); + } + int transactionVSize(String transactionHex) => BtcTransaction.fromRaw(transactionHex).getVSize(); Future canReplaceByFee(ElectrumTransactionInfo tx) async { diff --git a/cw_bitcoin/lib/litecoin_wallet_service.dart b/cw_bitcoin/lib/litecoin_wallet_service.dart index d519f4d0a..89ae384d4 100644 --- a/cw_bitcoin/lib/litecoin_wallet_service.dart +++ b/cw_bitcoin/lib/litecoin_wallet_service.dart @@ -126,6 +126,15 @@ class LitecoinWalletService extends WalletService< mwebdLogs.deleteSync(); } } + + final unspentCoinsToDelete = unspentCoinsInfoSource.values.where( + (unspentCoin) => unspentCoin.walletId == walletInfo.id).toList(); + + final keysToDelete = unspentCoinsToDelete.map((unspentCoin) => unspentCoin.key).toList(); + + if (keysToDelete.isNotEmpty) { + await unspentCoinsInfoSource.deleteAll(keysToDelete); + } } @override diff --git a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart index d14dc582d..931893ef8 100644 --- a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart +++ b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_service.dart @@ -85,6 +85,15 @@ class BitcoinCashWalletService extends WalletService< final walletInfo = walletInfoSource.values .firstWhereOrNull((info) => info.id == WalletBase.idFor(wallet, getType()))!; await walletInfoSource.delete(walletInfo.key); + + final unspentCoinsToDelete = unspentCoinsInfoSource.values.where( + (unspentCoin) => unspentCoin.walletId == walletInfo.id).toList(); + + final keysToDelete = unspentCoinsToDelete.map((unspentCoin) => unspentCoin.key).toList(); + + if (keysToDelete.isNotEmpty) { + await unspentCoinsInfoSource.deleteAll(keysToDelete); + } } @override diff --git a/cw_core/lib/unspent_coins_info.dart b/cw_core/lib/unspent_coins_info.dart index ed09e17e0..a60feb634 100644 --- a/cw_core/lib/unspent_coins_info.dart +++ b/cw_core/lib/unspent_coins_info.dart @@ -1,10 +1,11 @@ import 'package:cw_core/hive_type_ids.dart'; +import 'package:cw_core/unspent_comparable_mixin.dart'; import 'package:hive/hive.dart'; part 'unspent_coins_info.g.dart'; @HiveType(typeId: UnspentCoinsInfo.typeId) -class UnspentCoinsInfo extends HiveObject { +class UnspentCoinsInfo extends HiveObject with UnspentComparable { UnspentCoinsInfo({ required this.walletId, required this.hash, diff --git a/cw_core/lib/unspent_comparable_mixin.dart b/cw_core/lib/unspent_comparable_mixin.dart new file mode 100644 index 000000000..ee0c05496 --- /dev/null +++ b/cw_core/lib/unspent_comparable_mixin.dart @@ -0,0 +1,27 @@ +mixin UnspentComparable { + String get address; + + String get hash; + + int get value; + + int get vout; + + String? get keyImage; + + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is UnspentComparable && + other.hash == hash && + other.address == address && + other.value == value && + other.vout == vout && + other.keyImage == keyImage; + } + + @override + int get hashCode { + return Object.hash(address, hash, value, vout, keyImage); + } +} diff --git a/cw_core/lib/unspent_transaction_output.dart b/cw_core/lib/unspent_transaction_output.dart index d225493e9..da71f6983 100644 --- a/cw_core/lib/unspent_transaction_output.dart +++ b/cw_core/lib/unspent_transaction_output.dart @@ -1,4 +1,6 @@ -class Unspent { +import 'package:cw_core/unspent_comparable_mixin.dart'; + +class Unspent with UnspentComparable { Unspent(this.address, this.hash, this.value, this.vout, this.keyImage) : isSending = true, isFrozen = false, diff --git a/lib/src/screens/unspent_coins/unspent_coins_list_page.dart b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart index ee6d6dc73..f26a2a17f 100644 --- a/lib/src/screens/unspent_coins/unspent_coins_list_page.dart +++ b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart @@ -1,13 +1,14 @@ -import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart'; +import 'package:cake_wallet/src/widgets/alert_with_no_action.dart.dart'; +import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; +import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart'; -import 'package:cw_core/wallet_type.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:mobx/mobx.dart'; class UnspentCoinsListPage extends BasePage { UnspentCoinsListPage({required this.unspentCoinsListViewModel}); @@ -15,16 +16,53 @@ class UnspentCoinsListPage extends BasePage { @override String get title => S.current.unspent_coins_title; + @override + Widget leading(BuildContext context) { + return MergeSemantics( + child: SizedBox( + height: 37, + width: 37, + child: ButtonTheme( + minWidth: double.minPositive, + child: Semantics( + label: S.of(context).seed_alert_back, + child: TextButton( + style: ButtonStyle( + overlayColor: WidgetStateColor.resolveWith((states) => Colors.transparent), + ), + onPressed: () async => await handleOnPopInvoked(context), + child: backButton(context), + ), + ), + ), + ), + ); + } + final UnspentCoinsListViewModel unspentCoinsListViewModel; + Future handleOnPopInvoked(BuildContext context) async { + final hasChanged = unspentCoinsListViewModel.hasAdjustableFieldChanged; + if (unspentCoinsListViewModel.items.isEmpty || !hasChanged) { + Navigator.of(context).pop(); + } else { + unspentCoinsListViewModel.setIsDisposing(true); + await unspentCoinsListViewModel.dispose(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + } + } + @override - Widget body(BuildContext context) => UnspentCoinsListForm(unspentCoinsListViewModel); + Widget body(BuildContext context) => + UnspentCoinsListForm(unspentCoinsListViewModel, handleOnPopInvoked); } class UnspentCoinsListForm extends StatefulWidget { - UnspentCoinsListForm(this.unspentCoinsListViewModel); + UnspentCoinsListForm(this.unspentCoinsListViewModel, this.handleOnPopInvoked); final UnspentCoinsListViewModel unspentCoinsListViewModel; + final Future Function(BuildContext context) handleOnPopInvoked; @override UnspentCoinsListFormState createState() => UnspentCoinsListFormState(unspentCoinsListViewModel); @@ -35,36 +73,126 @@ class UnspentCoinsListFormState extends State { final UnspentCoinsListViewModel unspentCoinsListViewModel; + late Future _initialization; + ReactionDisposer? _disposer; + + @override + void initState() { + super.initState(); + _initialization = unspentCoinsListViewModel.initialSetup(); + _setupReactions(); + } + + void _setupReactions() { + _disposer = reaction( + (_) => unspentCoinsListViewModel.isDisposing, + (isDisposing) { + if (isDisposing) { + _showSavingDataAlert(); + } + }, + ); + } + + void _showSavingDataAlert() { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertWithNoAction( + alertContent: 'Updating, please wait…', + alertBarrierDismissible: false, + ); + }, + ); + } + + @override + void dispose() { + _disposer?.call(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.fromLTRB(24, 12, 24, 24), - child: Observer( - builder: (_) => ListView.separated( - itemCount: unspentCoinsListViewModel.items.length, - separatorBuilder: (_, __) => SizedBox(height: 15), - itemBuilder: (_, int index) { - return Observer(builder: (_) { - final item = unspentCoinsListViewModel.items[index]; + return PopScope( + canPop: false, + onPopInvokedWithResult: (bool didPop, Object? result) async { + if (didPop) return; + if(mounted) + await widget.handleOnPopInvoked(context); + }, + child: FutureBuilder( + future: _initialization, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Center(child: CircularProgressIndicator()); + } - return GestureDetector( - onTap: () => Navigator.of(context).pushNamed(Routes.unspentCoinsDetails, - arguments: [item, unspentCoinsListViewModel]), - child: UnspentCoinsListItem( - note: item.note, - amount: item.amount, - address: item.address, - isSending: item.isSending, - isFrozen: item.isFrozen, - isChange: item.isChange, - isSilentPayment: item.isSilentPayment, - onCheckBoxTap: item.isFrozen - ? null - : () async { - item.isSending = !item.isSending; - await unspentCoinsListViewModel.saveUnspentCoinInfo(item); - })); - }); - }))); + if (snapshot.hasError) return Center(child: Text('Failed to load unspent coins')); + + return Container( + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12), + child: Observer( + builder: (_) => Column( + children: [ + if (unspentCoinsListViewModel.items.isNotEmpty) + Row( + children: [ + SizedBox(width: 12), + StandardCheckbox( + iconColor: Theme.of(context).extension()!.buttonTextColor, + value: unspentCoinsListViewModel.isAllSelected, + onChanged: (value) => unspentCoinsListViewModel.toggleSelectAll(value), + ), + SizedBox(width: 12), + Text( + S.current.all_coins, + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ], + ), + SizedBox(height: 15), + Expanded( + child: unspentCoinsListViewModel.items.isEmpty + ? Center(child: Text('No unspent coins available\ntry to reconnect',textAlign: TextAlign.center)) + : ListView.separated( + itemCount: unspentCoinsListViewModel.items.length, + separatorBuilder: (_, __) => SizedBox(height: 15), + itemBuilder: (_, int index) { + final item = unspentCoinsListViewModel.items[index]; + return Observer( + builder: (_) => GestureDetector( + onTap: () => Navigator.of(context).pushNamed( + Routes.unspentCoinsDetails, + arguments: [item, unspentCoinsListViewModel], + ), + child: UnspentCoinsListItem( + note: item.note, + amount: item.amount, + address: item.address, + isSending: item.isSending, + isFrozen: item.isFrozen, + isChange: item.isChange, + isSilentPayment: item.isSilentPayment, + onCheckBoxTap: item.isFrozen + ? null + : () async { + item.isSending = !item.isSending; + await unspentCoinsListViewModel + .saveUnspentCoinInfo(item); + }, + ), + ), + ); + }, + ), + ), + ], + ), + ), + ); + }, + ), + ); } } diff --git a/lib/src/widgets/alert_with_no_action.dart.dart b/lib/src/widgets/alert_with_no_action.dart.dart index 623656397..75c1785cd 100644 --- a/lib/src/widgets/alert_with_no_action.dart.dart +++ b/lib/src/widgets/alert_with_no_action.dart.dart @@ -3,18 +3,18 @@ import 'package:cake_wallet/src/widgets/base_alert_dialog.dart'; class AlertWithNoAction extends BaseAlertDialog { AlertWithNoAction({ - required this.alertTitle, + this.alertTitle, required this.alertContent, this.alertBarrierDismissible = true, Key? key, }); - final String alertTitle; + final String? alertTitle; final String alertContent; final bool alertBarrierDismissible; @override - String get titleText => alertTitle; + String? get titleText => alertTitle; @override String get contentText => alertContent; @@ -26,5 +26,5 @@ class AlertWithNoAction extends BaseAlertDialog { bool get isBottomDividerExists => false; @override - Widget actionButtons(BuildContext context) => Container(height: 60); + Widget actionButtons(BuildContext context) => Container(); } diff --git a/lib/src/widgets/base_alert_dialog.dart b/lib/src/widgets/base_alert_dialog.dart index 1b521a427..53b7a9cbf 100644 --- a/lib/src/widgets/base_alert_dialog.dart +++ b/lib/src/widgets/base_alert_dialog.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; class BaseAlertDialog extends StatelessWidget { String? get headerText => ''; - String get titleText => ''; + String? get titleText => ''; String get contentText => ''; @@ -43,7 +43,7 @@ class BaseAlertDialog extends StatelessWidget { Widget title(BuildContext context) { return Text( - titleText, + titleText!, textAlign: TextAlign.center, style: TextStyle( fontSize: 20, @@ -191,10 +191,11 @@ class BaseAlertDialog extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ if (headerText?.isNotEmpty ?? false) headerTitle(context), + titleText != null ? Padding( padding: EdgeInsets.fromLTRB(24, 20, 24, 0), child: title(context), - ), + ) : SizedBox(height: 16), isDividerExists ? Padding( padding: EdgeInsets.only(top: 16, bottom: 8), diff --git a/lib/view_model/unspent_coins/unspent_coins_item.dart b/lib/view_model/unspent_coins/unspent_coins_item.dart index 4ca5a10a2..70488f8ee 100644 --- a/lib/view_model/unspent_coins/unspent_coins_item.dart +++ b/lib/view_model/unspent_coins/unspent_coins_item.dart @@ -1,10 +1,11 @@ +import 'package:cw_core/unspent_comparable_mixin.dart'; import 'package:mobx/mobx.dart'; part 'unspent_coins_item.g.dart'; class UnspentCoinsItem = UnspentCoinsItemBase with _$UnspentCoinsItem; -abstract class UnspentCoinsItemBase with Store { +abstract class UnspentCoinsItemBase with Store, UnspentComparable { UnspentCoinsItemBase({ required this.address, required this.amount, @@ -13,7 +14,7 @@ abstract class UnspentCoinsItemBase with Store { required this.note, required this.isSending, required this.isChange, - required this.amountRaw, + required this.value, required this.vout, required this.keyImage, required this.isSilentPayment, @@ -41,7 +42,7 @@ abstract class UnspentCoinsItemBase with Store { bool isChange; @observable - int amountRaw; + int value; @observable int vout; diff --git a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart index f16b8390f..6c15511b5 100644 --- a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart +++ b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart @@ -10,6 +10,7 @@ import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/cupertino.dart'; import 'package:hive/hive.dart'; +import 'package:collection/collection.dart'; import 'package:mobx/mobx.dart'; part 'unspent_coins_list_view_model.g.dart'; @@ -22,55 +23,66 @@ abstract class UnspentCoinsListViewModelBase with Store { required Box unspentCoinsInfo, this.coinTypeToSpendFrom = UnspentCoinType.any, }) : _unspentCoinsInfo = unspentCoinsInfo, - _items = ObservableList() { - _updateUnspentCoinsInfo(); - _updateUnspents(); - } + items = ObservableList(), + _originalState = {}; - WalletBase wallet; + final WalletBase wallet; final Box _unspentCoinsInfo; final UnspentCoinType coinTypeToSpendFrom; @observable - ObservableList _items; + ObservableList items; + + final Map> _originalState; + + @observable + bool isDisposing = false; @computed - ObservableList get items => _items; + bool get isAllSelected => items.every((element) => element.isFrozen || element.isSending); - Future saveUnspentCoinInfo(UnspentCoinsItem item) async { - try { - final info = - getUnspentCoinInfo(item.hash, item.address, item.amountRaw, item.vout, item.keyImage); + Future initialSetup() async { + await _updateUnspents(); + _storeOriginalState(); + } - if (info == null) { - return; - } - - info.isFrozen = item.isFrozen; - info.isSending = item.isSending; - info.note = item.note; - - await info.save(); - await _updateUnspents(); - await wallet.updateBalance(); - } catch (e) { - print(e.toString()); + void _storeOriginalState() { + _originalState.clear(); + for (final item in items) { + _originalState[item.hash] = { + 'isFrozen': item.isFrozen, + 'note': item.note, + 'isSending': item.isSending, + }; } } - UnspentCoinsInfo? getUnspentCoinInfo( - String hash, String address, int value, int vout, String? keyImage) { + bool _hasAdjustableFieldChanged(UnspentCoinsItem item) { + final original = _originalState[item.hash]; + if (original == null) return false; + return original['isFrozen'] != item.isFrozen || + original['note'] != item.note || + original['isSending'] != item.isSending; + } + + bool get hasAdjustableFieldChanged => items.any(_hasAdjustableFieldChanged); + + + Future saveUnspentCoinInfo(UnspentCoinsItem item) async { try { - return _unspentCoinsInfo.values.firstWhere((element) => - element.walletId == wallet.id && - element.hash == hash && - element.address == address && - element.value == value && - element.vout == vout && - element.keyImage == keyImage); + final existingInfo = _unspentCoinsInfo.values + .firstWhereOrNull((element) => element.walletId == wallet.id && element == item); + if (existingInfo == null) return; + + existingInfo.isFrozen = item.isFrozen; + existingInfo.isSending = item.isSending; + existingInfo.note = item.note; + + + await existingInfo.save(); + _updateUnspentCoinsInfo(); } catch (e) { - print("UnspentCoinsInfo not found for coin: $e"); - return null; + print('Error saving coin info: $e'); } } @@ -115,37 +127,60 @@ abstract class UnspentCoinsListViewModelBase with Store { @action void _updateUnspentCoinsInfo() { - _items.clear(); + items.clear(); - List unspents = []; - _getUnspents().forEach((Unspent elem) { - try { - final info = - getUnspentCoinInfo(elem.hash, elem.address, elem.value, elem.vout, elem.keyImage); - if (info == null) { - return; - } + final unspents = _getUnspents() + .map((elem) { + try { + final existingItem = _unspentCoinsInfo.values + .firstWhereOrNull((item) => item.walletId == wallet.id && item == elem); - unspents.add(UnspentCoinsItem( - address: elem.address, - amount: '${formatAmountToString(elem.value)} ${wallet.currency.title}', - hash: elem.hash, - isFrozen: info.isFrozen, - note: info.note, - isSending: info.isSending, - amountRaw: elem.value, - vout: elem.vout, - keyImage: elem.keyImage, - isChange: elem.isChange, - isSilentPayment: info.isSilentPayment ?? false, - )); - } catch (e, s) { - print(s); - print(e.toString()); - ExceptionHandler.onError(FlutterErrorDetails(exception: e, stack: s)); - } - }); + if (existingItem == null) return null; - _items.addAll(unspents); + return UnspentCoinsItem( + address: elem.address, + amount: '${formatAmountToString(elem.value)} ${wallet.currency.title}', + hash: elem.hash, + isFrozen: existingItem.isFrozen, + note: existingItem.note, + isSending: existingItem.isSending, + value: elem.value, + vout: elem.vout, + keyImage: elem.keyImage, + isChange: elem.isChange, + isSilentPayment: existingItem.isSilentPayment ?? false, + ); + } catch (e, s) { + print('Error: $e\nStack: $s'); + ExceptionHandler.onError( + FlutterErrorDetails(exception: e, stack: s), + ); + return null; + } + }) + .whereType() + .toList(); + + unspents.sort((a, b) => b.value.compareTo(a.value)); + + items.addAll(unspents); + } + + @action + void toggleSelectAll(bool value) { + for (final item in items) { + if (item.isFrozen || item.isSending == value) continue; + item.isSending = value; + saveUnspentCoinInfo(item); + } + } + + @action + void setIsDisposing(bool value) => isDisposing = value; + + @action + Future dispose() async { + await _updateUnspents(); + await wallet.updateBalance(); } } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 25a3d5fa5..968f627ca 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -38,6 +38,7 @@ "agree_to": "من خلال إنشاء حساب فإنك توافق على", "alert_notice": "يلاحظ", "all": "الكل", + "all_coins": "كل العملات المعدنية", "all_trades": "جميع عمليات التداول", "all_transactions": "كل التحركات المالية", "alphabetical": "مرتب حسب الحروف الأبجدية", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index ef3dc48df..24a7cf803 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -38,6 +38,7 @@ "agree_to": "Чрез създаването на акаунт вие се съгласявате с ", "alert_notice": "Забележете", "all": "ALL", + "all_coins": "Всички монети", "all_trades": "Всички сделкки", "all_transactions": "Всички транзакции", "alphabetical": "Азбучен ред", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 1e8e9eff6..6626a3119 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -38,6 +38,7 @@ "agree_to": "Vytvořením účtu souhlasíte s ", "alert_notice": "Oznámení", "all": "VŠE", + "all_coins": "Všechny mince", "all_trades": "Všechny obchody", "all_transactions": "Všechny transakce", "alphabetical": "Abecední", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 871301833..78431ff5f 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -38,6 +38,7 @@ "agree_to": "Indem Sie ein Konto erstellen, stimmen Sie den ", "alert_notice": "Beachten", "all": "ALLES", + "all_coins": "Alle Münzen", "all_trades": "Alle Trades", "all_transactions": "Alle Transaktionen", "alphabetical": "Alphabetisch", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 057bc6d6b..8acf49d76 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -38,6 +38,7 @@ "agree_to": "By creating account you agree to the ", "alert_notice": "Notice", "all": "ALL", + "all_coins": "All Coins", "all_trades": "All trades", "all_transactions": "All transactions", "alphabetical": "Alphabetical", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index c9135f054..3c009c5ea 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -38,6 +38,7 @@ "agree_to": "Al crear una cuenta, aceptas ", "alert_notice": "Aviso", "all": "Todos", + "all_coins": "Todas las monedas", "all_trades": "Todos los oficios", "all_transactions": "Todas las transacciones", "alphabetical": "Alfabético", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index eaeac58a9..17408cd44 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -38,6 +38,7 @@ "agree_to": "En créant un compte, vous acceptez les ", "alert_notice": "Avis", "all": "TOUT", + "all_coins": "Toutes les pièces", "all_trades": "Tous échanges", "all_transactions": "Toutes transactions", "alphabetical": "Alphabétique", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 6a0713d6d..2fa206298 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -38,6 +38,7 @@ "agree_to": "Ta hanyar ƙirƙirar asusu kun yarda da", "alert_notice": "Sanarwa", "all": "DUK", + "all_coins": "Duk tsabar kudi", "all_trades": "Duk ciniki", "all_transactions": "Dukan Ma'amaloli", "alphabetical": "Harafi", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index f1e294d22..f31635c75 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -38,6 +38,7 @@ "agree_to": "खाता बनाकर आप इससे सहमत होते हैं ", "alert_notice": "सूचना", "all": "सब", + "all_coins": "सभी सिक्के", "all_trades": "सभी व्यापार", "all_transactions": "सभी लेन - देन", "alphabetical": "वर्णमाला", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 6b9f20259..17f161ce3 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -38,6 +38,7 @@ "agree_to": "Stvaranjem računa pristajete na ", "alert_notice": "Obavijest", "all": "SVE", + "all_coins": "Sve kovanice", "all_trades": "Svi obrti", "all_transactions": "Sve transakcije", "alphabetical": "Abecedno", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index d3d7987d2..8736f1fc2 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -38,6 +38,7 @@ "agree_to": "Ստեղծելով հաշիվ դուք համաձայնում եք ", "alert_notice": "Ծանուցում", "all": "Բոլորը", + "all_coins": "Բոլոր մետաղադրամները", "all_trades": "Բոլոր գործարքները", "all_transactions": "Բոլոր գործառնությունները", "alphabetical": "Այբբենական", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index fae208549..44a04ae9b 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -38,6 +38,7 @@ "agree_to": "Dengan membuat akun Anda setuju dengan ", "alert_notice": "Melihat", "all": "SEMUA", + "all_coins": "Semua koin", "all_trades": "Semua perdagangan", "all_transactions": "Semua transaksi", "alphabetical": "Alfabetis", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index e6e4928c5..44358c450 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -38,6 +38,7 @@ "agree_to": "Creando un account accetti il ​​", "alert_notice": "Avviso", "all": "TUTTO", + "all_coins": "Tutte le monete", "all_trades": "Svi obrti", "all_transactions": "Sve transakcije", "alphabetical": "Alfabetico", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index fd4d83cc8..6bcde5a09 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -38,6 +38,7 @@ "agree_to": "アカウントを作成することにより、", "alert_notice": "知らせ", "all": "すべて", + "all_coins": "すべてのコイン", "all_trades": "すべての取引", "all_transactions": "全取引", "alphabetical": "アルファベット順", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 6fce665ec..b18657bc9 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -38,6 +38,7 @@ "agree_to": "계정을 생성하면 ", "alert_notice": "알아채다", "all": "모든", + "all_coins": "모든 동전", "all_trades": "A모든 거래", "all_transactions": "모든 거래 창구", "alphabetical": "알파벳순", @@ -495,8 +496,8 @@ "placeholder_transactions": "거래가 여기에 표시됩니다", "please_fill_totp": "다른 기기에 있는 8자리 코드를 입력하세요.", "please_make_selection": "아래에서 선택하십시오 지갑 만들기 또는 복구.", - "Please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.", "please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.", + "Please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.", "please_select": "선택 해주세요:", "please_select_backup_file": "백업 파일을 선택하고 백업 암호를 입력하십시오.", "please_try_to_connect_to_another_node": "다른 노드에 연결을 시도하십시오", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index e933010fd..45bad4d13 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -38,6 +38,7 @@ "agree_to": "အကောင့်ဖန်တီးခြင်းဖြင့် သင်သည် ဤအရာကို သဘောတူပါသည်။", "alert_notice": "မှတ်သား", "all": "အားလုံး", + "all_coins": "အားလုံးဒင်္ဂါးများ", "all_trades": "ကုန်သွယ်မှုအားလုံး", "all_transactions": "အရောင်းအဝယ်အားလုံး", "alphabetical": "အက္ခရာစဉ်", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index fc6496c3f..c332956c6 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -38,6 +38,7 @@ "agree_to": "Door een account aan te maken gaat u akkoord met de ", "alert_notice": "Kennisgeving", "all": "ALLE", + "all_coins": "Alle munten", "all_trades": "Alle transacties", "all_transactions": "Alle transacties", "alphabetical": "Alfabetisch", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index c7cf09cd8..26cbf7ac7 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -38,6 +38,7 @@ "agree_to": "Tworząc konto wyrażasz zgodę na ", "alert_notice": "Ogłoszenie", "all": "WSZYSTKO", + "all_coins": "Wszystkie monety", "all_trades": "Wszystkie operacje", "all_transactions": "Wszystkie transakcje", "alphabetical": "Alfabetyczny", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 50c7f4d6c..74d0d3cf5 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -38,6 +38,7 @@ "agree_to": "Ao criar conta você concorda com ", "alert_notice": "Perceber", "all": "TUDO", + "all_coins": "Todas as moedas", "all_trades": "Todas as negociações", "all_transactions": "Todas as transacções", "alphabetical": "alfabética", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 639ddfe63..d454bddbe 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -38,6 +38,7 @@ "agree_to": "Создавая аккаунт, вы соглашаетесь с ", "alert_notice": "Уведомление", "all": "ВСЕ", + "all_coins": "Все монеты", "all_trades": "Все сделки", "all_transactions": "Все транзакции", "alphabetical": "Алфавитный", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index e0b352fea..b9c51258e 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -38,6 +38,7 @@ "agree_to": "การสร้างบัญชีของคุณยอมรับเงื่อนไขของ", "alert_notice": "สังเกต", "all": "ทั้งหมด", + "all_coins": "เหรียญทั้งหมด", "all_trades": "การซื้อขายทั้งหมด", "all_transactions": "การทำธุรกรรมทั้งหมด", "alphabetical": "ตามตัวอักษร", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 5f05e3d51..45080b80d 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -38,6 +38,7 @@ "agree_to": "Sa pamamagitan ng paggawa ng account sumasang-ayon ka sa ", "alert_notice": "PAUNAWA", "all": "LAHAT", + "all_coins": "Lahat ng mga barya", "all_trades": "Lahat ng mga trade", "all_transactions": "Lahat ng mga transaksyon", "alphabetical": "Alpabeto", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 80990ae2d..6e990ab09 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -38,6 +38,7 @@ "agree_to": "Hesap oluşturarak bunları kabul etmiş olursunuz ", "alert_notice": "Fark etme", "all": "HEPSİ", + "all_coins": "Tüm Paralar", "all_trades": "Tüm takaslar", "all_transactions": "Tüm transferler", "alphabetical": "Alfabetik", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index b2d7a22e5..c66b7e4d7 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -38,6 +38,7 @@ "agree_to": "Створюючи обліковий запис, ви погоджуєтеся з ", "alert_notice": "Ув'язнення", "all": "ВСЕ", + "all_coins": "Всі монети", "all_trades": "Всі операції", "all_transactions": "Всі транзакції", "alphabetical": "Алфавітний", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 289bfb958..3da895eae 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -38,6 +38,7 @@ "agree_to": "اکاؤنٹ بنا کر آپ اس سے اتفاق کرتے ہیں۔", "alert_notice": "نوٹس", "all": "تمام", + "all_coins": "تمام سکے", "all_trades": "تمام تجارت", "all_transactions": "تمام لین دین", "alphabetical": "حروف تہجی کے مطابق", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index e7c95b8ec..9003be56c 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -38,6 +38,7 @@ "agree_to": "Bằng cách tạo tài khoản, bạn đồng ý với ", "alert_notice": "Để ý", "all": "TẤT CẢ", + "all_coins": "Tất cả các đồng tiền", "all_trades": "Tất cả giao dịch", "all_transactions": "Tất cả giao dịch", "alphabetical": "Theo thứ tự chữ cái", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index c9b8c4cbd..fdb574432 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -38,6 +38,7 @@ "agree_to": "Tẹ́ ẹ bá dá àkáǹtì ẹ jọ rò ", "alert_notice": "Akiyesi", "all": "Gbogbo", + "all_coins": "Gbogbo awọn owó", "all_trades": "Gbogbo àwọn pàṣípààrọ̀", "all_transactions": "Gbogbo àwọn àránṣẹ́", "alphabetical": "Labidibi", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 37b35ea6d..b75b4be68 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -38,6 +38,7 @@ "agree_to": "创建账户即表示您同意 ", "alert_notice": "注意", "all": "全部", + "all_coins": "所有硬币", "all_trades": "所有的变化", "all_transactions": "所有交易", "alphabetical": "按字母顺序", From 63f26c034f63012f77e4aa6a9875ed016987d3fb Mon Sep 17 00:00:00 2001 From: Rafael Date: Thu, 28 Nov 2024 13:50:30 -0300 Subject: [PATCH 3/7] [Cakepay] alert iOS availability (#1837) * feat: alert iOS availability * feat: use regex, check iOS --- lib/cake_pay/cake_pay_api.dart | 12 ++-- lib/cake_pay/cake_pay_service.dart | 5 +- .../cards/cake_pay_buy_card_page.dart | 67 ++++++++++++++++++- res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 1 + res/values/strings_fr.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_hy.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 1 + res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 1 + res/values/strings_pt.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_vi.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + 31 files changed, 100 insertions(+), 12 deletions(-) diff --git a/lib/cake_pay/cake_pay_api.dart b/lib/cake_pay/cake_pay_api.dart index a39fbe085..ea44d3335 100644 --- a/lib/cake_pay/cake_pay_api.dart +++ b/lib/cake_pay/cake_pay_api.dart @@ -172,14 +172,12 @@ class CakePayApi { } /// Get Countries - Future> getCountries( - {required String CSRFToken, required String authorization}) async { + Future> getCountries({required String apiKey}) async { final uri = Uri.https(baseCakePayUri, countriesPath); final headers = { 'accept': 'application/json', - 'authorization': authorization, - 'X-CSRFToken': CSRFToken, + 'Authorization': 'Api-Key $apiKey', }; final response = await http.get(uri, headers: headers); @@ -198,8 +196,7 @@ class CakePayApi { /// Get Vendors Future> getVendors({ - required String CSRFToken, - required String authorization, + required String apiKey, int? page, String? country, String? countryCode, @@ -226,8 +223,7 @@ class CakePayApi { var headers = { 'accept': 'application/json; charset=UTF-8', - 'authorization': authorization, - 'X-CSRFToken': CSRFToken, + 'Authorization': 'Api-Key $apiKey', }; var response = await http.get(uri, headers: headers); diff --git a/lib/cake_pay/cake_pay_service.dart b/lib/cake_pay/cake_pay_service.dart index cf2ec254c..9e43c23c7 100644 --- a/lib/cake_pay/cake_pay_service.dart +++ b/lib/cake_pay/cake_pay_service.dart @@ -25,7 +25,7 @@ class CakePayService { /// Get Available Countries Future> getCountries() async => - await cakePayApi.getCountries(CSRFToken: CSRFToken, authorization: authorization); + await cakePayApi.getCountries(apiKey: cakePayApiKey); /// Get Vendors Future> getVendors({ @@ -40,8 +40,7 @@ class CakePayService { bool? custom, }) async { final result = await cakePayApi.getVendors( - CSRFToken: CSRFToken, - authorization: authorization, + apiKey: cakePayApiKey, page: page, country: country, countryCode: countryCode, diff --git a/lib/src/screens/cake_pay/cards/cake_pay_buy_card_page.dart b/lib/src/screens/cake_pay/cards/cake_pay_buy_card_page.dart index 6e1af1c32..21e35359b 100644 --- a/lib/src/screens/cake_pay/cards/cake_pay_buy_card_page.dart +++ b/lib/src/screens/cake_pay/cards/cake_pay_buy_card_page.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:auto_size_text/auto_size_text.dart'; import 'package:cake_wallet/cake_pay/cake_pay_card.dart'; import 'package:cake_wallet/cake_pay/cake_pay_payment_credantials.dart'; @@ -7,6 +9,7 @@ import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/cake_pay/widgets/image_placeholder.dart'; import 'package:cake_wallet/src/screens/cake_pay/widgets/link_extractor.dart'; +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; import 'package:cake_wallet/src/widgets/number_text_fild_widget.dart'; @@ -17,6 +20,7 @@ import 'package:cake_wallet/themes/extensions/keyboard_theme.dart'; import 'package:cake_wallet/themes/extensions/send_page_theme.dart'; import 'package:cake_wallet/typography.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/cake_pay/cake_pay_buy_card_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/dropdown_filter_item_widget.dart'; import 'package:flutter/material.dart'; @@ -226,7 +230,9 @@ class CakePayBuyCardPage extends BasePage { return Padding( padding: EdgeInsets.only(bottom: 12), child: PrimaryButton( - onPressed: () => navigateToCakePayBuyCardDetailPage(context, card), + onPressed: () => isIOSUnavailable(card) + ? alertIOSAvailability(context, card) + : navigateToCakePayBuyCardDetailPage(context, card), text: S.of(context).buy_now, isDisabled: !cakePayBuyCardViewModel.isEnablePurchase, color: Theme.of(context).primaryColor, @@ -241,6 +247,65 @@ class CakePayBuyCardPage extends BasePage { ); } + bool isWordInCardsName(CakePayCard card, String word) { + // word must be followed by a space or beginning of the string + final regex = RegExp(r'(^|\s)' + word + r'(\s|$)', caseSensitive: false); + + return regex.hasMatch(card.name.toLowerCase()); + } + + bool isIOSUnavailable(CakePayCard card) { + if (!Platform.isIOS) { + return false; + } + + final isDigitalGameStores = isWordInCardsName(card, 'playstation') || + isWordInCardsName(card, 'xbox') || + isWordInCardsName(card, 'steam') || + isWordInCardsName(card, 'meta quest') || + isWordInCardsName(card, 'kigso') || + isWordInCardsName(card, 'game world') || + isWordInCardsName(card, 'google') || + isWordInCardsName(card, 'nintendo'); + final isGCodes = isWordInCardsName(card, 'gcodes'); + final isApple = isWordInCardsName(card, 'itunes') || isWordInCardsName(card, 'apple'); + final isTidal = isWordInCardsName(card, 'tidal'); + final isVPNServices = isWordInCardsName(card, 'nordvpn') || + isWordInCardsName(card, 'expressvpn') || + isWordInCardsName(card, 'surfshark') || + isWordInCardsName(card, 'proton'); + final isStreamingServices = isWordInCardsName(card, 'netflix') || + isWordInCardsName(card, 'spotify') || + isWordInCardsName(card, 'hulu') || + isWordInCardsName(card, 'hbo') || + isWordInCardsName(card, 'soundcloud') || + isWordInCardsName(card, 'twitch'); + final isDatingServices = isWordInCardsName(card, 'tinder'); + + return isDigitalGameStores || + isGCodes || + isApple || + isTidal || + isVPNServices || + isStreamingServices || + isDatingServices; + } + + Future alertIOSAvailability(BuildContext context, CakePayCard card) async { + return await showPopUp( + context: context, + builder: (BuildContext context) { + return AlertWithOneAction( + alertTitle: S.of(context).error, + alertContent: S.of(context).cakepay_ios_not_available, + buttonText: S.of(context).ok, + buttonAction: () { + // _walletHardwareRestoreVM.error = null; + Navigator.of(context).pop(); + }); + }); + } + Future navigateToCakePayBuyCardDetailPage(BuildContext context, CakePayCard card) async { final userName = await cakePayService.getUserEmail(); final paymentCredential = PaymentCredential( diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 968f627ca..6a5ecf6ae 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "اشتري بطاقات مدفوعة مسبقا وبطاقات هدايا في جميع أنحاء العالم", "cake_pay_web_cards_title": "بطاقات Cake Pay Web", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "آسف ، بطاقة الهدايا هذه غير متوفرة على iOS. يمكنك شرائه على Android أو من خلال موقعنا بدلاً من ذلك.", "cakepay_prepaid_card": "بطاقة ائتمان CakePay مسبقة الدفع", "camera_consent": ".ﻞﻴﺻﺎﻔﺘﻟﺍ ﻰﻠﻋ ﻝﻮﺼﺤﻠﻟ ﻢﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﺻﻮﺼﺨﻟﺍ ﺔﺳﺎﻴﺳ ﻦﻣ ﻖﻘﺤﺘﻟﺍ ﻰﺟﺮﻳ .${provider} ﻝﻮﻠ", "camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 24a7cf803..11182d1d7 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Купете световно признати предплатени и гифт карти", "cake_pay_web_cards_title": "Cake Pay Онлайн Карти", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "За съжаление тази карта за подарък не се предлага в iOS. Можете да го закупите на Android или чрез нашия уебсайт вместо това.", "cakepay_prepaid_card": "CakePay предплатена дебитна карта", "camera_consent": "Вашият фотоапарат ще бъде използван за заснемане на изображение с цел идентификация от ${provider}. Моля, проверете тяхната политика за поверителност за подробности.", "camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 6626a3119..57ab06a61 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Kupte si celosvětové předplacené a dárkové karty", "cake_pay_web_cards_title": "Cake Pay webové karty", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Je nám líto, tato dárková karta není k dispozici na iOS. Místo toho si jej můžete zakoupit na Androidu nebo prostřednictvím našeho webu.", "cakepay_prepaid_card": "CakePay předplacená debetní karta", "camera_consent": "Váš fotoaparát použije k pořízení snímku pro účely identifikace ${provider}. Podrobnosti najdete v jejich Zásadách ochrany osobních údajů.", "camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 78431ff5f..ffdbfb11d 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Kaufen Sie weltweit Prepaid-Karten und Geschenkkarten", "cake_pay_web_cards_title": "Cake Pay-Webkarten", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Entschuldigung, diese Geschenkkarte ist auf iOS nicht erhältlich. Sie können es stattdessen auf Android oder über unsere Website kaufen.", "cakepay_prepaid_card": "CakePay-Prepaid-Debitkarte", "camera_consent": "Mit Ihrer Kamera wird bis zum ${provider} ein Bild zur Identifizierung aufgenommen. Weitere Informationen finden Sie in deren Datenschutzbestimmungen.", "camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 8acf49d76..bbf6e7d8e 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Buy worldwide prepaid cards and gift cards", "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Sorry, this gift card is not available on iOS. You can purchase it on Android or through our website instead.", "cakepay_prepaid_card": "CakePay Prepaid Debit Card", "camera_consent": "Your camera will be used to capture an image for identification purposes by ${provider}. Please check their Privacy Policy for details.", "camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 3c009c5ea..2e9445db5 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Compra tarjetas de prepago y tarjetas de regalo en todo el mundo", "cake_pay_web_cards_title": "Tarjetas Web Cake Pay", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Lo siento, esta tarjeta de regalo no está disponible en iOS. Puede comprarlo en Android o a través de nuestro sitio web.", "cakepay_prepaid_card": "Tarjeta de Débito Prepago CakePay", "camera_consent": "Su cámara será utilizada para capturar una imagen con fines de identificación por ${provider}. Consulta tu Política de privacidad para obtener más detalles.", "camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítalo desde la configuración de la aplicación.", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 17408cd44..245736406 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Achetez des cartes prépayées et des cartes-cadeaux dans le monde entier", "cake_pay_web_cards_title": "Cartes Web Cake Pay", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Désolé, cette carte-cadeau n'est pas disponible sur iOS. Vous pouvez l'acheter sur Android ou via notre site Web à la place.", "cakepay_prepaid_card": "Carte de débit prépayée Cake Pay", "camera_consent": "Votre appareil photo sera utilisé pour capturer une image à des fins d'identification par ${provider}. Veuillez consulter leur politique de confidentialité pour plus de détails.", "camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 2fa206298..6492e5f5f 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Sayi katunan da aka riga aka biya na duniya da katunan kyauta", "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Yi haƙuri, wannan katin kyautar ba a samuwa akan iOS. Kuna iya sayan shi a kan Android ko ta yanar gizo a maimakon.", "cakepay_prepaid_card": "Katin zare kudi na CakePay", "camera_consent": "Za a yi amfani da kyamarar ku don ɗaukar hoto don dalilai na tantancewa ta ${provider}. Da fatan za a duba Manufar Sirri don cikakkun bayanai.", "camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index f31635c75..e21f4c418 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "दुनिया भर में प्रीपेड कार्ड और गिफ्ट कार्ड खरीदें", "cake_pay_web_cards_title": "केक भुगतान वेब कार्ड", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "क्षमा करें, यह उपहार कार्ड iOS पर उपलब्ध नहीं है। आप इसे Android पर या हमारी वेबसाइट के बजाय खरीद सकते हैं।", "cakepay_prepaid_card": "केकपे प्रीपेड डेबिट कार्ड", "camera_consent": "आपके कैमरे का उपयोग ${provider} द्वारा पहचान उद्देश्यों के लिए एक छवि कैप्चर करने के लिए किया जाएगा। विवरण के लिए कृपया उनकी गोपनीयता नीति जांचें।", "camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 17f161ce3..bd0caa15e 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Kupujte prepaid kartice i poklon kartice diljem svijeta", "cake_pay_web_cards_title": "Cake Pay Web kartice", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Oprostite, ova poklon kartica nije dostupna na iOS -u. Umjesto toga, možete ga kupiti na Androidu ili putem naše web stranice.", "cakepay_prepaid_card": "CakePay unaprijed plaćena debitna kartica", "camera_consent": "Vaš će fotoaparat koristiti za snimanje slike u svrhu identifikacije od strane ${provider}. Pojedinosti potražite u njihovoj politici privatnosti.", "camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 8736f1fc2..1900ac459 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Գնեք համաշխարհային նախավճարային քարտեր և նվեր քարտեր", "cake_pay_web_cards_title": "Cake Pay Վեբ Քարտեր", "cake_wallet": "Cake Գաղտնապահոց", + "cakepay_ios_not_available": "Ներեցեք, այս նվեր քարտը հասանելի չէ iOS- ում: Փոխարենը կարող եք այն գնել Android- ում կամ մեր կայքում:", "cakepay_prepaid_card": "CakePay Նախավճարային Դեբետային Քարտ", "camera_consent": "Ձեր տեսախցիկը կօգտագործվի ${provider}-ի կողմից ինքնությունը հաստատելու նպատակով: Խնդրում ենք ծանոթանալ նրանց Գաղտնիության Քաղաքականության հետ:", "camera_permission_is_required": "Տեսախցիկի թույլտվություն է պահանջվում: \nԽնդրում ենք այն ակտիվացնել հավելվածի կարգավորումներից:", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 44a04ae9b..04ff42395 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Beli kartu prabayar dan kartu hadiah secara global", "cake_pay_web_cards_title": "Kartu Web Cake Pay", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Maaf, kartu hadiah ini tidak tersedia di iOS. Anda dapat membelinya di Android atau melalui situs web kami sebagai gantinya.", "cakepay_prepaid_card": "Kartu Debit Prabayar CakePay", "camera_consent": "Kamera Anda akan digunakan untuk mengambil gambar untuk tujuan identifikasi oleh ${provider}. Silakan periksa Kebijakan Privasi mereka untuk detailnya.", "camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 44358c450..6bac1d008 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Acquista carte prepagate e carte regalo in tutto il mondo", "cake_pay_web_cards_title": "Carte Web Cake Pay", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Mi dispiace, questa carta regalo non è disponibile su iOS. Puoi acquistarlo su Android o tramite il nostro sito Web.", "cakepay_prepaid_card": "Carta di debito prepagata CakePay", "camera_consent": "La tua fotocamera verrà utilizzata per acquisire un'immagine a scopo identificativo da ${provider}. Si prega di controllare la loro Informativa sulla privacy per i dettagli.", "camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 6bcde5a09..72f9e0203 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "世界中のプリペイド カードとギフト カードを購入する", "cake_pay_web_cards_title": "Cake Pay ウェブカード", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "申し訳ありませんが、このギフトカードはiOSでは利用できません。代わりにAndroidまたは当社のWebサイトから購入できます。", "cakepay_prepaid_card": "CakePayプリペイドデビットカード", "camera_consent": "あなたのカメラは、${provider}_ までに識別目的で画像を撮影するために使用されます。詳細については、プライバシー ポリシーをご確認ください。", "camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index b18657bc9..45db37781 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "전 세계 선불 카드 및 기프트 카드 구매", "cake_pay_web_cards_title": "케이크페이 웹카드", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "죄송합니다.이 기프트 카드는 iOS에서 사용할 수 없습니다. Android 또는 웹 사이트를 통해 구매할 수 있습니다.", "cakepay_prepaid_card": "CakePay 선불 직불 카드", "camera_consent": "귀하의 카메라는 ${provider}의 식별 목적으로 이미지를 캡처하는 데 사용됩니다. 자세한 내용은 해당 개인정보 보호정책을 확인하세요.", "camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 45bad4d13..76fa28477 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "ကမ္ဘာတစ်ဝှမ်း ကြိုတင်ငွေပေးကတ်များနှင့် လက်ဆောင်ကတ်များကို ဝယ်ယူပါ။", "cake_pay_web_cards_title": "Cake Pay ဝဘ်ကတ်များ", "cake_wallet": "Cake ပိုက်ဆံအိတ်", + "cakepay_ios_not_available": "တောင်းပန်ပါတယ်, ဒီလက်ဆောင်ကဒ်ကို iOS မှာမရနိုင်ပါ။ ၎င်းကို Android တွင်သို့မဟုတ်ကျွန်ုပ်တို့၏ဝက်ဘ်ဆိုက်တွင် 0 ယ်နိုင်သည်။", "cakepay_prepaid_card": "CakePay ကြိုတင်ငွေဖြည့်ဒက်ဘစ်ကတ်", "camera_consent": "မှတ်ပုံတင်ခြင်းရည်ရွယ်ချက်များအတွက် ${provider} တွင် သင့်ကင်မရာကို အသုံးပြုပါမည်။ အသေးစိတ်အတွက် ၎င်းတို့၏ ကိုယ်ရေးကိုယ်တာမူဝါဒကို စစ်ဆေးပါ။", "camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index c332956c6..659f78baa 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Koop wereldwijd prepaidkaarten en cadeaubonnen", "cake_pay_web_cards_title": "Cake Pay-webkaarten", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Sorry, deze cadeaubon is niet beschikbaar op iOS. U kunt het in plaats daarvan kopen op Android of via onze website.", "cakepay_prepaid_card": "CakePay Prepaid Debetkaart", "camera_consent": "Uw camera wordt gebruikt om vóór ${provider} een beeld vast te leggen voor identificatiedoeleinden. Raadpleeg hun privacybeleid voor meer informatie.", "camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 26cbf7ac7..9d8f94651 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Kupuj na całym świecie karty przedpłacone i karty podarunkowe", "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Przepraszam, ta karta podarunkowa nie jest dostępna na iOS. Zamiast tego możesz go kupić na Android lub za pośrednictwem naszej strony internetowej.", "cakepay_prepaid_card": "Przedpłacona karta debetowa CakePay", "camera_consent": "Twój aparat zostanie użyty do przechwycenia obrazu w celach identyfikacyjnych przez ${provider}. Aby uzyskać szczegółowe informacje, sprawdź ich Politykę prywatności.", "camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 74d0d3cf5..df03bd405 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Compre cartões pré-pagos e cartões-presente em todo o mundo", "cake_pay_web_cards_title": "Cartões Cake Pay Web", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Desculpe, este cartão -presente não está disponível no iOS. Você pode comprá -lo no Android ou através do nosso site.", "cakepay_prepaid_card": "Cartão de débito pré-pago CakePay", "camera_consent": "Sua câmera será usada para capturar uma imagem para fins de identificação por ${provider}. Por favor, verifique a Política de Privacidade para obter detalhes.", "camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index d454bddbe..5197bd29c 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Покупайте карты предоплаты и подарочные карты по всему миру", "cake_pay_web_cards_title": "Веб-карты Cake Pay", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Извините, эта подарочная карта недоступна на iOS. Вместо этого вы можете приобрести его на Android или через наш веб -сайт.", "cakepay_prepaid_card": "Предоплаченная дебетовая карта CakePay", "camera_consent": "Ваша камера будет использоваться для захвата изображения в целях идентификации ${provider}. Пожалуйста, ознакомьтесь с их Политикой конфиденциальности для получения подробной информации.", "camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index b9c51258e..dabd90506 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "ซื้อบัตรพร้อมเงินระดับโลกและบัตรของขวัญ", "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "ขออภัยบัตรของขวัญนี้ไม่มีใน iOS คุณสามารถซื้อได้บน Android หรือผ่านเว็บไซต์ของเราแทน", "cakepay_prepaid_card": "บัตรเดบิตเติมเงินของ CakePay", "camera_consent": "กล้องของคุณจะถูกนำมาใช้เพื่อจับภาพเพื่อวัตถุประสงค์ในการระบุตัวตนภายใน ${provider} โปรดตรวจสอบนโยบายความเป็นส่วนตัวเพื่อดูรายละเอียด", "camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 45080b80d..94be4ca80 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Bumili ng mga pandaigdigang prepaid card at gift card", "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Paumanhin, ang gift card na ito ay hindi magagamit sa iOS. Maaari mo itong bilhin sa Android o sa pamamagitan ng aming website sa halip.", "cakepay_prepaid_card": "CakePay Prepaid Debit Card", "camera_consent": "Gagamitin ang iyong camera upang kumuha ng larawan para sa mga layunin ng pagkakakilanlan sa pamamagitan ng ${provider}. Pakisuri ang kanilang Patakaran sa Privacy para sa mga detalye.", "camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 6e990ab09..e02d7cf25 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Dünya çapında ön ödemeli kartlar ve hediye kartları satın alın", "cake_pay_web_cards_title": "Cake Pay Web Kartları", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Üzgünüm, bu hediye kartı iOS'ta mevcut değil. Bunun yerine Android'de veya web sitemizden satın alabilirsiniz.", "cakepay_prepaid_card": "CakePay Ön Ödemeli Kart", "camera_consent": "Kameranız ${provider} tarihine kadar tanımlama amacıyla bir görüntü yakalamak için kullanılacaktır. Ayrıntılar için lütfen Gizlilik Politikalarını kontrol edin.", "camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index c66b7e4d7..bfa4475ae 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Купуйте передоплачені та подарункові картки по всьому світу", "cake_pay_web_cards_title": "Веб-картки Cake Pay", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Вибачте, ця подарункова карта недоступна на iOS. Ви можете придбати його на Android або через наш веб -сайт.", "cakepay_prepaid_card": "Передплачена дебетова картка CakePay", "camera_consent": "Ваша камера використовуватиметься для зйомки зображення з метою ідентифікації ${provider}. Будь ласка, ознайомтеся з їхньою політикою конфіденційності, щоб дізнатися більше.", "camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 3da895eae..27f66c57a 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "دنیا بھر میں پری پیڈ کارڈز اور گفٹ کارڈز خریدیں۔", "cake_pay_web_cards_title": "Cake پے ویب کارڈز", "cake_wallet": "Cake والیٹ", + "cakepay_ios_not_available": "معذرت ، یہ گفٹ کارڈ iOS پر دستیاب نہیں ہے۔ اس کے بجائے آپ اسے اینڈروئیڈ پر یا ہماری ویب سائٹ کے ذریعے خرید سکتے ہیں۔", "cakepay_prepaid_card": "Cake پے پری پیڈ ڈیبٹ کارڈ", "camera_consent": "۔ﮟﯿﮭﮑﯾﺩ ﯽﺴﯿﻟﺎﭘ ﯽﺴﯾﻮﯿﺋﺍﺮﭘ ﯽﮐ ﻥﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﺕﻼ${provider}ﯿﺼﻔﺗ ۔ﺎﮔ ﮯﺋﺎﺟ ﺎﯿﮐ ﻝﺎﻤﻌﺘﺳﺍ ﮯﯿﻟ", "camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 9003be56c..949e40c09 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Mua thẻ trả trước toàn cầu và thẻ quà tặng", "cake_pay_web_cards_title": "Thẻ Cake Pay Web", "cake_wallet": "Ví Cake", + "cakepay_ios_not_available": "Xin lỗi, thẻ quà tặng này không có sẵn trên iOS. Thay vào đó, bạn có thể mua nó trên Android hoặc thông qua trang web của chúng tôi.", "cakepay_prepaid_card": "Thẻ Ghi Nợ Trả Trước CakePay", "camera_consent": "Máy ảnh của bạn sẽ được sử dụng để chụp hình nhằm mục đích xác minh danh tính bởi ${provider}. Vui lòng kiểm tra Chính sách quyền riêng tư của họ để biết thêm chi tiết.", "camera_permission_is_required": "Cần có quyền truy cập máy ảnh. \nVui lòng bật nó từ cài đặt ứng dụng.", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index fdb574432..5a206afb2 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "Ra àwọn káàdì ìrajà t'á lò nínú ìtajà kan àti àwọn káàdì náà t'á lè lò níbikíbi", "cake_pay_web_cards_title": "Àwọn káàdì wẹ́ẹ̀bù ti Cake Pay", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "Ma binu, kaadi ẹbun yii ko wa lori iOS. O le ra lori Android tabi nipasẹ oju opo wẹẹbu wa dipo.", "cakepay_prepaid_card": "Káàdì ìrajà ti CakePay", "camera_consent": "Kamẹra rẹ yoo ṣee lo lati ya aworan kan fun awọn idi idanimọ nipasẹ ${provider}. Jọwọ ṣayẹwo Ilana Aṣiri wọn fun awọn alaye.", "camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index b75b4be68..83c86bda8 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -102,6 +102,7 @@ "cake_pay_web_cards_subtitle": "购买全球预付卡和礼品卡", "cake_pay_web_cards_title": "蛋糕支付网络卡", "cake_wallet": "Cake Wallet", + "cakepay_ios_not_available": "抱歉,这张礼品卡在iOS上不可用。您可以在Android或通过我们的网站上购买它。", "cakepay_prepaid_card": "CakePay 预付借记卡", "camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。", "camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。", From d8d41906084d2ee6ef0bcc1e5fcd18da024eeac1 Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 28 Nov 2024 21:02:10 +0200 Subject: [PATCH 4/7] prevent calling unsupported payment method (#1836) --- lib/buy/robinhood/robinhood_buy_provider.dart | 3 ++- lib/view_model/buy/buy_sell_view_model.dart | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/buy/robinhood/robinhood_buy_provider.dart b/lib/buy/robinhood/robinhood_buy_provider.dart index e8de5a59c..a64c9d736 100644 --- a/lib/buy/robinhood/robinhood_buy_provider.dart +++ b/lib/buy/robinhood/robinhood_buy_provider.dart @@ -145,7 +145,7 @@ class RobinhoodBuyProvider extends BuyProvider { if (paymentType != null && paymentType != PaymentType.all) { paymentMethod = normalizePaymentMethod(paymentType); - if (paymentMethod == null) paymentMethod = paymentType.name; + if (paymentMethod == null) return null; } final action = isBuyAction ? 'buy' : 'sell'; @@ -185,6 +185,7 @@ class RobinhoodBuyProvider extends BuyProvider { return null; } + // Supported payment methods: // ● buying_power // ● crypto_balance // ● debit_card diff --git a/lib/view_model/buy/buy_sell_view_model.dart b/lib/view_model/buy/buy_sell_view_model.dart index 4d7151fac..d16307134 100644 --- a/lib/view_model/buy/buy_sell_view_model.dart +++ b/lib/view_model/buy/buy_sell_view_model.dart @@ -155,13 +155,11 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S final hasSelectedPaymentMethod = selectedPaymentMethod != null; final isPaymentMethodLoaded = paymentMethodState is PaymentMethodLoaded; final isBuySellQuotLoaded = buySellQuotState is BuySellQuotLoaded; - final isBuySellQuotFailed = buySellQuotState is BuySellQuotFailed; return hasSelectedQuote && hasSelectedPaymentMethod && isPaymentMethodLoaded && - isBuySellQuotLoaded && - !isBuySellQuotFailed; + isBuySellQuotLoaded; } @computed From 17d34beae95e5caf4942a5a177331b604a96a1e4 Mon Sep 17 00:00:00 2001 From: cyan Date: Thu, 28 Nov 2024 20:28:31 +0100 Subject: [PATCH 5/7] CW-782: Show error report popup without cooldown (#1739) * improve exception throwing on broken wallets - put _lastOpenedWallet to avoid issues on windows (file is currently open by) - don't throw corruptedWalletsSeed - instead store it inside of secureStorage - await ExceptionHandler.onError calls where possible to makse sure that popup won't be canceled by some UI element - adjust BaseAlertDialog to be scrollable if the text is too long - add ExceptionHandler.resetLastPopupDate - that can be called when we want to show error report screen (bypassing cooldown) * fix: HiveError: Box has already been closed. * await the alerts to be sure that each one of them is being shown fix typo in secure storage * Update lib/core/backup_service.dart Co-authored-by: Omar Hatem * address comments on github * don't store seeds in secure storage * fix wallet password * update monero_c update corrupted seeds UI prevent app from crashing when wallet is corrupted * show alert with seeds * Update corrupted wallet UI Fix wallet opening cache * remove unused code --------- Co-authored-by: Omar Hatem --- cw_monero/lib/api/wallet_manager.dart | 15 +++- cw_monero/lib/monero_wallet_service.dart | 2 +- cw_monero/pubspec.lock | 4 +- cw_monero/pubspec.yaml | 2 +- cw_wownero/pubspec.lock | 4 +- cw_wownero/pubspec.yaml | 2 +- lib/anypay/anypay_api.dart | 2 +- lib/core/backup_service.dart | 18 ++--- lib/core/wallet_loading_service.dart | 64 +++++++++++++--- lib/di.dart | 6 +- lib/main.dart | 2 +- .../on_authentication_state_change.dart | 6 +- lib/src/screens/auth/auth_page.dart | 23 +++++- lib/src/screens/backup/backup_page.dart | 2 +- .../desktop_wallet_selection_dropdown.dart | 1 + .../screens/wallet_list/wallet_list_page.dart | 5 ++ lib/src/widgets/base_alert_dialog.dart | 25 ++++--- lib/utils/exception_handler.dart | 73 +++++++++++-------- .../restore_from_backup_view_model.dart | 2 +- linux/flutter/generated_plugins.cmake | 1 - macos/Flutter/GeneratedPluginRegistrant.swift | 2 - res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 1 + res/values/strings_fr.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_hy.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 1 + res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 1 + res/values/strings_pt.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_vi.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + scripts/prepare_moneroc.sh | 2 +- windows/flutter/generated_plugins.cmake | 1 - 51 files changed, 205 insertions(+), 87 deletions(-) diff --git a/cw_monero/lib/api/wallet_manager.dart b/cw_monero/lib/api/wallet_manager.dart index d10f7e25a..3a47132c5 100644 --- a/cw_monero/lib/api/wallet_manager.dart +++ b/cw_monero/lib/api/wallet_manager.dart @@ -81,6 +81,7 @@ void createWalletSync( wptr = newWptr; monero.Wallet_store(wptr!, path: path); openedWalletsByPath[path] = wptr!; + _lastOpenedWallet = path; // is the line below needed? // setupNodeSync(address: "node.moneroworld.com:18089"); @@ -116,6 +117,7 @@ void restoreWalletFromSeedSync( wptr = newWptr; openedWalletsByPath[path] = wptr!; + _lastOpenedWallet = path; } void restoreWalletFromKeysSync( @@ -183,6 +185,7 @@ void restoreWalletFromKeysSync( wptr = newWptr; openedWalletsByPath[path] = wptr!; + _lastOpenedWallet = path; } void restoreWalletFromSpendKeySync( @@ -231,6 +234,7 @@ void restoreWalletFromSpendKeySync( storeSync(); openedWalletsByPath[path] = wptr!; + _lastOpenedWallet = path; } String _lastOpenedWallet = ""; @@ -260,7 +264,7 @@ Future restoreWalletFromHardwareWallet( throw WalletRestoreFromSeedException(message: error); } wptr = newWptr; - + _lastOpenedWallet = path; openedWalletsByPath[path] = wptr!; } @@ -295,6 +299,11 @@ Future loadWallet( password: password, kdfRounds: 1, ); + final status = monero.WalletManager_errorString(wmPtr); + if (status != "") { + print("loadWallet:"+status); + throw WalletOpeningException(message: status); + } } else { deviceType = 0; } @@ -314,15 +323,15 @@ Future loadWallet( final newWptr = Pointer.fromAddress(newWptrAddr); - _lastOpenedWallet = path; final status = monero.Wallet_status(newWptr); if (status != 0) { final err = monero.Wallet_errorString(newWptr); - print(err); + print("loadWallet:"+err); throw WalletOpeningException(message: err); } wptr = newWptr; + _lastOpenedWallet = path; openedWalletsByPath[path] = wptr!; } } diff --git a/cw_monero/lib/monero_wallet_service.dart b/cw_monero/lib/monero_wallet_service.dart index 6f49640be..0fb2e9aee 100644 --- a/cw_monero/lib/monero_wallet_service.dart +++ b/cw_monero/lib/monero_wallet_service.dart @@ -168,7 +168,7 @@ class MoneroWalletService extends WalletService< } await restoreOrResetWalletFiles(name); - return openWallet(name, password, retryOnFailure: false); + return await openWallet(name, password, retryOnFailure: false); } } diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock index 551108adc..f4be439b7 100644 --- a/cw_monero/pubspec.lock +++ b/cw_monero/pubspec.lock @@ -503,8 +503,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: d72c15f4339791a7bbdf17e9d827b7b56ca144e4 - resolved-ref: d72c15f4339791a7bbdf17e9d827b7b56ca144e4 + ref: c41c4dad9aa5003a914cfb2c528c76386f952665 + resolved-ref: c41c4dad9aa5003a914cfb2c528c76386f952665 url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_monero/pubspec.yaml b/cw_monero/pubspec.yaml index d8e506f58..36b002988 100644 --- a/cw_monero/pubspec.yaml +++ b/cw_monero/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: d72c15f4339791a7bbdf17e9d827b7b56ca144e4 + ref: c41c4dad9aa5003a914cfb2c528c76386f952665 # ref: 6eb571ea498ed7b854934785f00fabfd0dadf75b # monero_c hash path: impls/monero.dart mutex: ^3.1.0 diff --git a/cw_wownero/pubspec.lock b/cw_wownero/pubspec.lock index 7e2c3c76f..c565348e1 100644 --- a/cw_wownero/pubspec.lock +++ b/cw_wownero/pubspec.lock @@ -463,8 +463,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: d72c15f4339791a7bbdf17e9d827b7b56ca144e4 - resolved-ref: d72c15f4339791a7bbdf17e9d827b7b56ca144e4 + ref: c41c4dad9aa5003a914cfb2c528c76386f952665 + resolved-ref: c41c4dad9aa5003a914cfb2c528c76386f952665 url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_wownero/pubspec.yaml b/cw_wownero/pubspec.yaml index 48e65453a..fc5782645 100644 --- a/cw_wownero/pubspec.yaml +++ b/cw_wownero/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: d72c15f4339791a7bbdf17e9d827b7b56ca144e4 + ref: c41c4dad9aa5003a914cfb2c528c76386f952665 # ref: 6eb571ea498ed7b854934785f00fabfd0dadf75b # monero_c hash path: impls/monero.dart mutex: ^3.1.0 diff --git a/lib/anypay/anypay_api.dart b/lib/anypay/anypay_api.dart index 8af3be08c..0b81d24c2 100644 --- a/lib/anypay/anypay_api.dart +++ b/lib/anypay/anypay_api.dart @@ -56,7 +56,7 @@ class AnyPayApi { final response = await post(url, headers: headers, body: utf8.encode(json.encode(body))); if (response.statusCode != 200) { - ExceptionHandler.onError(FlutterErrorDetails(exception: response)); + await ExceptionHandler.onError(FlutterErrorDetails(exception: response)); throw Exception('Unexpected response http code: ${response.statusCode}'); } diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 992ed6288..3413ec1d3 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -230,17 +230,15 @@ class BackupService { json.decode(transactionDescriptionFile.readAsStringSync()) as Map; final descriptionsMap = jsonData.map((key, value) => MapEntry(key, TransactionDescription.fromJson(value as Map))); - - if (!_transactionDescriptionBox.isOpen) { - final transactionDescriptionsBoxKey = await getEncryptionKey(secureStorage: secureStorageShared, forKey: TransactionDescription.boxKey); - final transactionDescriptionBox = await CakeHive.openBox( + var box = _transactionDescriptionBox; + if (!box.isOpen) { + final transactionDescriptionsBoxKey = + await getEncryptionKey(secureStorage: _secureStorage, forKey: TransactionDescription.boxKey); + box = await CakeHive.openBox( TransactionDescription.boxName, - encryptionKey: transactionDescriptionsBoxKey, - ); - await transactionDescriptionBox.putAll(descriptionsMap); - return; - } - await _transactionDescriptionBox.putAll(descriptionsMap); + encryptionKey: transactionDescriptionsBoxKey); + } + await box.putAll(descriptionsMap); } Future _importPreferencesDump() async { diff --git a/lib/core/wallet_loading_service.dart b/lib/core/wallet_loading_service.dart index 10e438e0c..3a60197de 100644 --- a/lib/core/wallet_loading_service.dart +++ b/lib/core/wallet_loading_service.dart @@ -2,15 +2,22 @@ import 'dart:async'; import 'package:cake_wallet/core/generate_wallet_password.dart'; import 'package:cake_wallet/core/key_service.dart'; +import 'package:cake_wallet/core/secure_storage.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/reactions/on_authentication_state_change.dart'; +import 'package:cake_wallet/src/screens/auth/auth_page.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/utils/exception_handler.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cw_core/cake_hive.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_service.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; class WalletLoadingService { @@ -58,24 +65,25 @@ class WalletLoadingService { return wallet; } catch (error, stack) { - ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); + await ExceptionHandler.resetLastPopupDate(); + await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); // try fetching the seeds of the corrupted wallet to show it to the user String corruptedWalletsSeeds = "Corrupted wallets seeds (if retrievable, empty otherwise):"; try { corruptedWalletsSeeds += await _getCorruptedWalletSeeds(name, type); } catch (e) { - corruptedWalletsSeeds += "\nFailed to fetch $name seeds: $e"; + corruptedWalletsSeeds += "\nFailed to fetch $name seeds: $e"; } // try opening another wallet that is not corrupted to give user access to the app final walletInfoSource = await CakeHive.openBox(WalletInfo.boxName); - + WalletBase? wallet; for (var walletInfo in walletInfoSource.values) { try { final walletService = walletServiceFactory.call(walletInfo.type); - final walletPassword = password ?? (await keyService.getWalletPassword(walletName: name)); - final wallet = await walletService.openWallet(walletInfo.name, walletPassword); + final walletPassword = await keyService.getWalletPassword(walletName: walletInfo.name); + wallet = await walletService.openWallet(walletInfo.name, walletPassword); if (walletInfo.type == WalletType.monero) { await updateMoneroWalletPassword(wallet); @@ -88,8 +96,6 @@ class WalletLoadingService { // if found a wallet that is not corrupted, then still display the seeds of the corrupted ones authenticatedErrorStreamController.add(corruptedWalletsSeeds); - - return wallet; } catch (e) { print(e); // save seeds and show corrupted wallets' seeds to the user @@ -99,16 +105,56 @@ class WalletLoadingService { corruptedWalletsSeeds += seeds; } } catch (e) { - corruptedWalletsSeeds += "\nFailed to fetch $name seeds: $e"; + corruptedWalletsSeeds += "\nFailed to fetch $name seeds: $e"; } } } // if all user's wallets are corrupted throw exception - throw error.toString() + "\n\n" + corruptedWalletsSeeds; + final msg = error.toString() + "\n" + corruptedWalletsSeeds; + if (navigatorKey.currentContext != null) { + await showPopUp( + context: navigatorKey.currentContext!, + builder: (BuildContext context) { + return AlertWithTwoActions( + alertTitle: "Corrupted seeds", + alertContent: S.of(context).corrupted_seed_notice, + leftButtonText: S.of(context).cancel, + rightButtonText: S.of(context).show_seed, + actionLeftButton: () => Navigator.of(context).pop(), + actionRightButton: () => showSeedsPopup(context, msg), + ); + }); + } else { + throw msg; + } + if (wallet == null) { + throw Exception("Wallet is null"); + } + return wallet; } } + Future showSeedsPopup(BuildContext context, String message) async { + Navigator.of(context).pop(); + await showPopUp( + context: context, + builder: (BuildContext context) { + return AlertWithTwoActions( + alertTitle: "Corrupted seeds", + alertContent: message, + leftButtonText: S.of(context).copy, + rightButtonText: S.of(context).ok, + actionLeftButton: () async { + await Clipboard.setData(ClipboardData(text: message)); + }, + actionRightButton: () async { + Navigator.of(context).pop(); + }, + ); + }); + } + Future updateMoneroWalletPassword(WalletBase wallet) async { final key = PreferencesKey.moneroWalletUpdateV1Key(wallet.name); var isPasswordUpdated = sharedPreferences.getBool(key) ?? false; diff --git a/lib/di.dart b/lib/di.dart index 7b1cf3d07..6531c411f 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -575,7 +575,7 @@ Future setup({ totpAuthPageState.changeProcessText('Loading the wallet'); if (loginError != null) { - totpAuthPageState.changeProcessText('ERROR: ${loginError.toString()}'); + totpAuthPageState.changeProcessText('ERROR: ${loginError.toString()}'.trim()); } ReactionDisposer? _reaction; @@ -604,7 +604,7 @@ Future setup({ authPageState.changeProcessText('Loading the wallet'); if (loginError != null) { - authPageState.changeProcessText('ERROR: ${loginError.toString()}'); + authPageState.changeProcessText('ERROR: ${loginError.toString()}'.trim()); loginError = null; } @@ -624,7 +624,7 @@ Future setup({ } if (loginError != null) { - authPageState.changeProcessText('ERROR: ${loginError.toString()}'); + authPageState.changeProcessText('ERROR: ${loginError.toString()}'.trim()); timer.cancel(); } }); diff --git a/lib/main.dart b/lib/main.dart index d67fda098..72818a1d4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -89,7 +89,7 @@ Future runAppWithZone({Key? topLevelKey}) async { ); } - ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stackTrace)); + await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stackTrace)); }); } diff --git a/lib/reactions/on_authentication_state_change.dart b/lib/reactions/on_authentication_state_change.dart index b411c5a15..88b03ca59 100644 --- a/lib/reactions/on_authentication_state_change.dart +++ b/lib/reactions/on_authentication_state_change.dart @@ -43,8 +43,8 @@ void startAuthenticationStateChange( if (!requireHardwareWalletConnection()) await loadCurrentWallet(); } catch (error, stack) { loginError = error; - ExceptionHandler.onError( - FlutterErrorDetails(exception: error, stack: stack)); + await ExceptionHandler.resetLastPopupDate(); + await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); } return; } @@ -81,7 +81,7 @@ void startAuthenticationStateChange( .pushNamedAndRemoveUntil(Routes.dashboard, (route) => false); } if (!(await authenticatedErrorStreamController.stream.isEmpty)) { - ExceptionHandler.showError( + await ExceptionHandler.showError( (await authenticatedErrorStreamController.stream.first).toString()); authenticatedErrorStreamController.stream.drain(); } diff --git a/lib/src/screens/auth/auth_page.dart b/lib/src/screens/auth/auth_page.dart index d14a12527..e2bc1f075 100644 --- a/lib/src/screens/auth/auth_page.dart +++ b/lib/src/screens/auth/auth_page.dart @@ -1,5 +1,6 @@ import 'package:another_flushbar/flushbar.dart'; import 'package:cake_wallet/utils/show_bar.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; @@ -9,6 +10,8 @@ import 'package:cake_wallet/view_model/auth_view_model.dart'; import 'package:cake_wallet/src/screens/pin_code/pin_code.dart'; import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart'; import 'package:cake_wallet/core/execution_state.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; +import 'package:flutter/services.dart'; typedef OnAuthenticationFinished = void Function(bool, AuthPageState); @@ -66,7 +69,6 @@ class AuthPagePinCodeStateImpl extends AuthPageState { dismissFlushBar(_authBar); showBar( context, S.of(context).failed_authentication(state.error)); - widget.onAuthenticationFinished(false, this); }); } @@ -77,12 +79,12 @@ class AuthPagePinCodeStateImpl extends AuthPageState { dismissFlushBar(_authBar); showBar( context, S.of(context).failed_authentication(state.error)); - widget.onAuthenticationFinished(false, this); }); } }); + if (widget.authViewModel.isBiometricalAuthenticationAllowed) { WidgetsBinding.instance.addPostFrameCallback((_) async { await Future.delayed(Duration(milliseconds: 100)); @@ -93,6 +95,23 @@ class AuthPagePinCodeStateImpl extends AuthPageState { super.initState(); } + Future _showSeedsPopup(BuildContext context, String message) async { + await showPopUp( + context: context, + builder: (BuildContext context) { + return AlertWithTwoActions( + alertTitle: "Corrupted seeds", + alertContent: message, + leftButtonText: S.of(context).copy, + rightButtonText: S.of(context).ok, + actionLeftButton: () async { + await Clipboard.setData(ClipboardData(text: message)); + }, + actionRightButton: () => Navigator.of(context).pop(), + ); + }); + } + @override void dispose() { _reaction?.reaction.dispose(); diff --git a/lib/src/screens/backup/backup_page.dart b/lib/src/screens/backup/backup_page.dart index d17702724..b8065cf36 100644 --- a/lib/src/screens/backup/backup_page.dart +++ b/lib/src/screens/backup/backup_page.dart @@ -154,7 +154,7 @@ class BackupPage extends BasePage { File returnedFile = File(outputFile!); await returnedFile.writeAsBytes(backup.content); } catch (exception, stackTrace) { - ExceptionHandler.onError(FlutterErrorDetails( + await ExceptionHandler.onError(FlutterErrorDetails( exception: exception, stack: stackTrace, library: "Export Backup", diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart index 0fb629685..e5f38010d 100644 --- a/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart +++ b/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart @@ -11,6 +11,7 @@ import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.da import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/themes/extensions/menu_theme.dart'; +import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart index 46eaa6143..f7e6515de 100644 --- a/lib/src/screens/wallet_list/wallet_list_page.dart +++ b/lib/src/screens/wallet_list/wallet_list_page.dart @@ -1,6 +1,7 @@ import 'package:another_flushbar/flushbar.dart'; import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/core/new_wallet_arguments.dart'; +import 'package:cake_wallet/core/secure_storage.dart'; import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart'; import 'package:cake_wallet/entities/wallet_list_order_types.dart'; import 'package:cake_wallet/generated/i18n.dart'; @@ -20,6 +21,7 @@ import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/themes/extensions/filter_theme.dart'; import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart'; +import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; @@ -459,6 +461,9 @@ class WalletListBodyState extends State { }); } } catch (e) { + await ExceptionHandler.resetLastPopupDate(); + final err = e.toString(); + await ExceptionHandler.onError(FlutterErrorDetails(exception: err)); if (this.mounted) { changeProcessText(S .of(context) diff --git a/lib/src/widgets/base_alert_dialog.dart b/lib/src/widgets/base_alert_dialog.dart index 53b7a9cbf..bede33ebf 100644 --- a/lib/src/widgets/base_alert_dialog.dart +++ b/lib/src/widgets/base_alert_dialog.dart @@ -73,15 +73,22 @@ class BaseAlertDialog extends StatelessWidget { } Widget content(BuildContext context) { - return Text( - contentText, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.normal, - fontFamily: 'Lato', - color: Theme.of(context).extension()!.titleColor, - decoration: TextDecoration.none, + return SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + contentText, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + fontFamily: 'Lato', + color: Theme.of(context).extension()!.titleColor, + decoration: TextDecoration.none, + ), + ), + ], ), ); } diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart index 41ae91d41..6f1ed35a0 100644 --- a/lib/utils/exception_handler.dart +++ b/lib/utils/exception_handler.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:cake_wallet/core/secure_storage.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/main.dart'; @@ -20,7 +21,7 @@ class ExceptionHandler { static const _coolDownDurationInDays = 7; static File? _file; - static void _saveException(String? error, StackTrace? stackTrace, {String? library}) async { + static Future _saveException(String? error, StackTrace? stackTrace, {String? library}) async { final appDocDir = await getAppDir(); if (_file == null) { @@ -90,7 +91,12 @@ class ExceptionHandler { } } - static void onError(FlutterErrorDetails errorDetails) async { + static Future resetLastPopupDate() async { + final sharedPrefs = await SharedPreferences.getInstance(); + await sharedPrefs.setString(PreferencesKey.lastPopupDate, DateTime(1971).toString()); + } + + static Future onError(FlutterErrorDetails errorDetails) async { if (kDebugMode || kProfileMode) { FlutterError.presentError(errorDetails); debugPrint(errorDetails.toString()); @@ -124,35 +130,40 @@ class ExceptionHandler { } _hasError = true; - sharedPrefs.setString(PreferencesKey.lastPopupDate, DateTime.now().toString()); + await sharedPrefs.setString(PreferencesKey.lastPopupDate, DateTime.now().toString()); - WidgetsBinding.instance.addPostFrameCallback( - (timeStamp) async { - if (navigatorKey.currentContext != null) { - await showPopUp( - context: navigatorKey.currentContext!, - builder: (context) { - return AlertWithTwoActions( - isDividerExist: true, - alertTitle: S.of(context).error, - alertContent: S.of(context).error_dialog_content, - rightButtonText: S.of(context).send, - leftButtonText: S.of(context).do_not_send, - actionRightButton: () { - Navigator.of(context).pop(); - _sendExceptionFile(); - }, - actionLeftButton: () { - Navigator.of(context).pop(); - }, - ); + // Instead of using WidgetsBinding.instance.addPostFrameCallback we + // await Future.delayed(Duration.zero), which does essentially the same ( + // but doesn't wait for actual frame to be rendered), but it allows us to + // properly await the execution - which is what we want, without awaiting + // other code may call functions like Navigator.pop(), and close the alert + // instead of the intended UI. + // WidgetsBinding.instance.addPostFrameCallback( + // (timeStamp) async { + await Future.delayed(Duration.zero); + if (navigatorKey.currentContext != null) { + await showPopUp( + context: navigatorKey.currentContext!, + builder: (context) { + return AlertWithTwoActions( + isDividerExist: true, + alertTitle: S.of(context).error, + alertContent: S.of(context).error_dialog_content, + rightButtonText: S.of(context).send, + leftButtonText: S.of(context).do_not_send, + actionRightButton: () { + Navigator.of(context).pop(); + _sendExceptionFile(); + }, + actionLeftButton: () { + Navigator.of(context).pop(); }, ); - } + }, + ); + } - _hasError = false; - }, - ); + _hasError = false; } /// Ignore User related errors or system errors @@ -272,20 +283,18 @@ class ExceptionHandler { }; } - static void showError(String error, {int? delayInSeconds}) async { + static Future showError(String error, {int? delayInSeconds}) async { if (_hasError) { return; } _hasError = true; - if (delayInSeconds != null) { Future.delayed(Duration(seconds: delayInSeconds), () => _showCopyPopup(error)); return; } - WidgetsBinding.instance.addPostFrameCallback( - (_) async => _showCopyPopup(error), - ); + await Future.delayed(Duration.zero); + await _showCopyPopup(error); } static Future _showCopyPopup(String content) async { diff --git a/lib/view_model/restore_from_backup_view_model.dart b/lib/view_model/restore_from_backup_view_model.dart index 432cac67e..247e6d43d 100644 --- a/lib/view_model/restore_from_backup_view_model.dart +++ b/lib/view_model/restore_from_backup_view_model.dart @@ -68,7 +68,7 @@ abstract class RestoreFromBackupViewModelBase with Store { if (msg.toLowerCase().contains("message authentication code (mac)")) { msg = 'Incorrect backup password'; } else { - ExceptionHandler.onError(FlutterErrorDetails( + await ExceptionHandler.onError(FlutterErrorDetails( exception: e, stack: s, library: this.toString(), diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index f52be7481..4b9eb3b2d 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -10,7 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST - sp_scanner ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 42b9fa84c..52b44e53e 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,7 +6,6 @@ import FlutterMacOS import Foundation import connectivity_plus -import cw_mweb import device_info_plus import devicelocale import fast_scanner @@ -24,7 +23,6 @@ import wakelock_plus func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) - CwMwebPlugin.register(with: registry.registrar(forPlugin: "CwMwebPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DevicelocalePlugin.register(with: registry.registrar(forPlugin: "DevicelocalePlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 6a5ecf6ae..9c0774155 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -177,6 +177,7 @@ "copy_address": "نسخ العنوان", "copy_id": "نسخ معرف العملية", "copyWalletConnectLink": "ﺎﻨﻫ ﻪﻘﺼﻟﺍﻭ dApp ﻦﻣ WalletConnect ﻂﺑﺍﺭ ﺦﺴﻧﺍ", + "corrupted_seed_notice": "تالف ملفات هذه المحفظة ولا يمكن فتحها. يرجى الاطلاع على عبارة البذور وحفظها واستعادة المحفظة.\n\nإذا كانت القيمة فارغة ، لم تتمكن البذور من استردادها بشكل صحيح.", "countries": "بلدان", "create_account": "إنشاء حساب", "create_backup": "انشئ نسخة احتياطية", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 11182d1d7..dc57086c4 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -177,6 +177,7 @@ "copy_address": "Copy Address", "copy_id": "Копиране на ID", "copyWalletConnectLink": "Копирайте връзката WalletConnect от dApp и я поставете тук", + "corrupted_seed_notice": "Файловете за този портфейл са повредени и не могат да бъдат отворени. Моля, прегледайте фразата за семена, запазете я и възстановете портфейла.\n\nАко стойността е празна, тогава семето не успя да бъде правилно възстановено.", "countries": "Държави", "create_account": "Създаване на профил", "create_backup": "Създаване на резервно копие", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 57ab06a61..8702f8fe1 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -177,6 +177,7 @@ "copy_address": "Zkopírovat adresu", "copy_id": "Kopírovat ID", "copyWalletConnectLink": "Zkopírujte odkaz WalletConnect z dApp a vložte jej sem", + "corrupted_seed_notice": "Soubory pro tuto peněženku jsou poškozeny a nemohou být otevřeny. Podívejte se prosím na osivo, uložte ji a obnovte peněženku.\n\nPokud je hodnota prázdná, pak semeno nebylo možné správně obnovit.", "countries": "Země", "create_account": "Vytvořit účet", "create_backup": "Vytvořit zálohu", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index ffdbfb11d..c2dde5521 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -177,6 +177,7 @@ "copy_address": "Adresse kopieren", "copy_id": "ID kopieren", "copyWalletConnectLink": "Kopieren Sie den WalletConnect-Link von dApp und fügen Sie ihn hier ein", + "corrupted_seed_notice": "Die Dateien für diese Brieftasche sind beschädigt und können nicht geöffnet werden. Bitte sehen Sie sich die Saatgutphrase an, speichern Sie sie und stellen Sie die Brieftasche wieder her.\n\nWenn der Wert leer ist, konnte der Samen nicht korrekt wiederhergestellt werden.", "countries": "Länder", "create_account": "Konto erstellen", "create_backup": "Backup erstellen", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index bbf6e7d8e..a971b797e 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -177,6 +177,7 @@ "copy_address": "Copy Address", "copy_id": "Copy ID", "copyWalletConnectLink": "Copy the WalletConnect link from dApp and paste here", + "corrupted_seed_notice": "The files for this wallet are corrupted and are unable to be opened. Please view the seed phrase, save it, and restore the wallet.\n\nIf the value is empty, then the seed was unable to be correctly recovered.", "countries": "Countries", "create_account": "Create Account", "create_backup": "Create backup", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 2e9445db5..990e3c154 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -177,6 +177,7 @@ "copy_address": "Copiar dirección ", "copy_id": "Copiar ID", "copyWalletConnectLink": "Copie el enlace de WalletConnect de dApp y péguelo aquí", + "corrupted_seed_notice": "Los archivos para esta billetera están dañados y no pueden abrirse. Vea la frase de semillas, guárdela y restaura la billetera.\n\nSi el valor está vacío, entonces la semilla no pudo recuperarse correctamente.", "countries": "Países", "create_account": "Crear Cuenta", "create_backup": "Crear copia de seguridad", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 245736406..6b0e58846 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -177,6 +177,7 @@ "copy_address": "Copier l'Adresse", "copy_id": "Copier l'ID", "copyWalletConnectLink": "Copiez le lien WalletConnect depuis l'application décentralisée (dApp) et collez-le ici", + "corrupted_seed_notice": "Les fichiers de ce portefeuille sont corrompus et ne peuvent pas être ouverts. Veuillez consulter la phrase de graines, sauver et restaurer le portefeuille.\n\nSi la valeur est vide, la graine n'a pas pu être correctement récupérée.", "countries": "Des pays", "create_account": "Créer un compte", "create_backup": "Créer une sauvegarde", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 6492e5f5f..8d2a66062 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -177,6 +177,7 @@ "copy_address": "Kwafi Adireshin", "copy_id": "Kwafi ID", "copyWalletConnectLink": "Kwafi hanyar haɗin WalletConnect daga dApp kuma liƙa a nan", + "corrupted_seed_notice": "Fayilolin don wannan walat ɗin sun lalata kuma ba za a iya buɗe su ba. Da fatan za a duba kalmar iri, adana shi, da dawo da walat.\n\nIdan darajar ta kasance fanko, to sai zuriyar da ba ta iya murmurewa daidai ba.", "countries": "Kasashe", "create_account": "Kirkira ajiya", "create_backup": "Ƙirƙiri madadin", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index e21f4c418..ceede03fb 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -177,6 +177,7 @@ "copy_address": "पता कॉपी करें", "copy_id": "प्रतिलिपि ID", "copyWalletConnectLink": "dApp से वॉलेटकनेक्ट लिंक को कॉपी करें और यहां पेस्ट करें", + "corrupted_seed_notice": "इस वॉलेट की फाइलें दूषित हैं और उन्हें खोलने में असमर्थ हैं। कृपया बीज वाक्यांश देखें, इसे बचाएं, और बटुए को पुनर्स्थापित करें।\n\nयदि मूल्य खाली है, तो बीज सही ढंग से पुनर्प्राप्त करने में असमर्थ था।", "countries": "देशों", "create_account": "खाता बनाएं", "create_backup": "बैकअप बनाएँ", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index bd0caa15e..f0ee38a9e 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -177,6 +177,7 @@ "copy_address": "Kopiraj adresu", "copy_id": "Kopirati ID", "copyWalletConnectLink": "Kopirajte vezu WalletConnect iz dApp-a i zalijepite je ovdje", + "corrupted_seed_notice": "Datoteke za ovaj novčanik su oštećene i nisu u mogućnosti otvoriti. Molimo pogledajte sjemensku frazu, spremite je i vratite novčanik.\n\nAko je vrijednost prazna, tada sjeme nije bilo u stanju ispravno oporaviti.", "countries": "Zemalja", "create_account": "Stvori račun", "create_backup": "Stvori sigurnosnu kopiju", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 1900ac459..d4abeaace 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -177,6 +177,7 @@ "copy_address": "Պատճենել հասցեն", "copy_id": "Պատճենել ID", "copyWalletConnectLink": "Պատճենել WalletConnect հղումը dApp-ից և տեղադրել այստեղ", + "corrupted_seed_notice": "Այս դրամապանակի համար ֆայլերը կոռումպացված են եւ չեն կարողանում բացվել: Խնդրում ենք դիտել սերմերի արտահայտությունը, պահպանել այն եւ վերականգնել դրամապանակը:\n\nԵթե ​​արժեքը դատարկ է, ապա սերմը չկարողացավ ճիշտ վերականգնվել:", "countries": "Երկրներ", "create_account": "Ստեղծել հաշիվ", "create_backup": "Ստեղծել կրկնօրինակ", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 04ff42395..022d31989 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -177,6 +177,7 @@ "copy_address": "Salin Alamat", "copy_id": "Salin ID", "copyWalletConnectLink": "Salin tautan WalletConnect dari dApp dan tempel di sini", + "corrupted_seed_notice": "File untuk dompet ini rusak dan tidak dapat dibuka. Silakan lihat frasa benih, simpan, dan kembalikan dompet.\n\nJika nilainya kosong, maka benih tidak dapat dipulihkan dengan benar.", "countries": "Negara", "create_account": "Buat Akun", "create_backup": "Buat cadangan", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 6bac1d008..62da65a1e 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -178,6 +178,7 @@ "copy_address": "Copia Indirizzo", "copy_id": "Copia ID", "copyWalletConnectLink": "Copia il collegamento WalletConnect dalla dApp e incollalo qui", + "corrupted_seed_notice": "I file per questo portafoglio sono corrotti e non sono in grado di essere aperti. Visualizza la frase del seme, salvala e ripristina il portafoglio.\n\nSe il valore è vuoto, il seme non è stato in grado di essere recuperato correttamente.", "countries": "Paesi", "create_account": "Crea account", "create_backup": "Crea backup", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 72f9e0203..e3f6dfb30 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -177,6 +177,7 @@ "copy_address": "住所をコピー", "copy_id": "IDをコピー", "copyWalletConnectLink": "dApp から WalletConnect リンクをコピーし、ここに貼り付けます", + "corrupted_seed_notice": "このウォレットのファイルは破損しており、開くことができません。シードフレーズを表示し、保存し、財布を復元してください。\n\n値が空の場合、種子を正しく回復することができませんでした。", "countries": "国", "create_account": "アカウントの作成", "create_backup": "バックアップを作成", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 45db37781..55174df01 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -177,6 +177,7 @@ "copy_address": "주소 복사", "copy_id": "부 ID", "copyWalletConnectLink": "dApp에서 WalletConnect 링크를 복사하여 여기에 붙여넣으세요.", + "corrupted_seed_notice": "이 지갑의 파일은 손상되어 열 수 없습니다. 씨앗 문구를보고 저장하고 지갑을 복원하십시오.\n\n값이 비어 있으면 씨앗을 올바르게 회수 할 수 없었습니다.", "countries": "국가", "create_account": "계정 만들기", "create_backup": "백업 생성", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 76fa28477..7da19d093 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -177,6 +177,7 @@ "copy_address": "လိပ်စာကို ကူးယူပါ။", "copy_id": "ID ကူးယူပါ။", "copyWalletConnectLink": "dApp မှ WalletConnect လင့်ခ်ကို ကူးယူပြီး ဤနေရာတွင် ကူးထည့်ပါ။", + "corrupted_seed_notice": "ဤပိုက်ဆံအိတ်အတွက်ဖိုင်များသည်အကျင့်ပျက်ခြစားမှုများနှင့်မဖွင့်နိုင်ပါ။ ကျေးဇူးပြု. မျိုးစေ့များကိုကြည့်ပါ, ၎င်းကိုသိမ်းဆည်းပါ, ပိုက်ဆံအိတ်ကိုပြန်ယူပါ။\n\nအကယ်. တန်ဖိုးသည်အချည်းနှီးဖြစ်ပါကမျိုးစေ့ကိုမှန်ကန်စွာပြန်လည်ကောင်းမွန်မရရှိနိုင်ပါ။", "countries": "နိုင်ငံများ", "create_account": "အကောင့်ပြုလုပ်ပါ", "create_backup": "အရန်သိမ်းခြင်းကို ဖန်တီးပါ။", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 659f78baa..38fedd52f 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -177,6 +177,7 @@ "copy_address": "Adres kopiëren", "copy_id": "ID kopiëren", "copyWalletConnectLink": "Kopieer de WalletConnect-link van dApp en plak deze hier", + "corrupted_seed_notice": "De bestanden voor deze portemonnee zijn beschadigd en kunnen niet worden geopend. Bekijk de zaadzin, bewaar deze en herstel de portemonnee.\n\nAls de waarde leeg is, kon het zaad niet correct worden hersteld.", "countries": "Landen", "create_account": "Account aanmaken", "create_backup": "Maak een back-up", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 9d8f94651..c1f805790 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -177,6 +177,7 @@ "copy_address": "Skopiuj adress", "copy_id": "skopiuj ID", "copyWalletConnectLink": "Skopiuj link do WalletConnect z dApp i wklej tutaj", + "corrupted_seed_notice": "Pliki dla tego portfela są uszkodzone i nie można ich otworzyć. Zobacz wyrażenie nasion, zapisz je i przywróć portfel.\n\nJeśli wartość jest pusta, ziarno nie można było poprawnie odzyskać.", "countries": "Kraje", "create_account": "Utwórz konto", "create_backup": "Utwórz kopię zapasową", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index df03bd405..534af19a9 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -177,6 +177,7 @@ "copy_address": "Copiar endereço", "copy_id": "Copiar ID", "copyWalletConnectLink": "Copie o link WalletConnect do dApp e cole aqui", + "corrupted_seed_notice": "Os arquivos para esta carteira estão corrompidos e não podem ser abertos. Veja a frase das sementes, salve -a e restaure a carteira.\n\nSe o valor estiver vazio, a semente não pôde ser recuperada corretamente.", "countries": "Países", "create_account": "Criar conta", "create_backup": "Criar backup", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 5197bd29c..b292ab8f6 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -177,6 +177,7 @@ "copy_address": "Cкопировать адрес", "copy_id": "Скопировать ID", "copyWalletConnectLink": "Скопируйте ссылку WalletConnect из dApp и вставьте сюда.", + "corrupted_seed_notice": "Файлы для этого кошелька повреждены и не могут быть открыты. Пожалуйста, просмотрите семенную фразу, сохраните ее и восстановите кошелек.\n\nЕсли значение пустое, то семя не смог правильно восстановить.", "countries": "Страны", "create_account": "Создать аккаунт", "create_backup": "Создать резервную копию", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index dabd90506..7647d51a3 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -177,6 +177,7 @@ "copy_address": "คัดลอกที่อยู่", "copy_id": "คัดลอก ID", "copyWalletConnectLink": "คัดลอกลิงก์ WalletConnect จาก dApp แล้ววางที่นี่", + "corrupted_seed_notice": "ไฟล์สำหรับกระเป๋าเงินนี้เสียหายและไม่สามารถเปิดได้ โปรดดูวลีเมล็ดบันทึกและกู้คืนกระเป๋าเงิน\n\nหากค่าว่างเปล่าเมล็ดก็ไม่สามารถกู้คืนได้อย่างถูกต้อง", "countries": "ประเทศ", "create_account": "สร้างบัญชี", "create_backup": "สร้างการสำรองข้อมูล", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 94be4ca80..1d8897507 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -177,6 +177,7 @@ "copy_address": "Kopyahin ang Address", "copy_id": "Kopyahin ang ID", "copyWalletConnectLink": "Kopyahin ang link ng WalletConnect mula sa dApp at i-paste dito", + "corrupted_seed_notice": "Ang mga file para sa pitaka na ito ay nasira at hindi mabubuksan. Mangyaring tingnan ang parirala ng binhi, i -save ito, at ibalik ang pitaka.\n\nKung ang halaga ay walang laman, kung gayon ang binhi ay hindi ma -recover nang tama.", "countries": "Mga bansa", "create_account": "Lumikha ng Account", "create_backup": "Lumikha ng backup", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index e02d7cf25..b69a957fb 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -177,6 +177,7 @@ "copy_address": "Adresi kopyala", "copy_id": "ID'yi kopyala", "copyWalletConnectLink": "WalletConnect bağlantısını dApp'ten kopyalayıp buraya yapıştırın", + "corrupted_seed_notice": "Bu cüzdanın dosyaları bozuk ve açılamıyor. Lütfen tohum ifadesini görüntüleyin, kaydedin ve cüzdanı geri yükleyin.\n\nDeğer boşsa, tohum doğru bir şekilde geri kazanılamadı.", "countries": "Ülkeler", "create_account": "Hesap oluştur", "create_backup": "Yedek oluştur", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index bfa4475ae..12dcd2af9 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -177,6 +177,7 @@ "copy_address": "Cкопіювати адресу", "copy_id": "Скопіювати ID", "copyWalletConnectLink": "Скопіюйте посилання WalletConnect із dApp і вставте сюди", + "corrupted_seed_notice": "Файли для цього гаманця пошкоджені і не можуть бути відкриті. Перегляньте насіннєву фразу, збережіть її та відновіть гаманець.\n\nЯкщо значення порожнє, то насіння не могло бути правильно відновленим.", "countries": "Країни", "create_account": "Створити обліковий запис", "create_backup": "Створити резервну копію", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 27f66c57a..28194915f 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -177,6 +177,7 @@ "copy_address": "ایڈریس کاپی کریں۔", "copy_id": "کاپی ID", "copyWalletConnectLink": "dApp ﮯﺳ WalletConnect ۔ﮟﯾﺮﮐ ﭧﺴﯿﭘ ﮞﺎﮩﯾ ﺭﻭﺍ ﮟﯾﺮﮐ ﯽﭘﺎﮐ ﻮﮐ ﮏﻨﻟ", + "corrupted_seed_notice": "اس پرس کے لئے فائلیں خراب ہیں اور کھولنے سے قاصر ہیں۔ براہ کرم بیج کے فقرے کو دیکھیں ، اسے بچائیں ، اور بٹوے کو بحال کریں۔\n\nاگر قیمت خالی ہے ، تو بیج صحیح طور پر بازیافت کرنے سے قاصر تھا۔", "countries": "ممالک", "create_account": "اکاؤنٹ بنائیں", "create_backup": "بیک اپ بنائیں", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 949e40c09..762b5989a 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -176,6 +176,7 @@ "copy_address": "Sao chép Địa chỉ", "copy_id": "Sao chép ID", "copyWalletConnectLink": "Sao chép liên kết WalletConnect từ dApp và dán vào đây", + "corrupted_seed_notice": "Các tệp cho ví này bị hỏng và không thể mở. Vui lòng xem cụm từ hạt giống, lưu nó và khôi phục ví.\n\nNếu giá trị trống, thì hạt giống không thể được phục hồi chính xác.", "countries": "Quốc gia", "create_account": "Tạo tài khoản", "create_backup": "Tạo sao lưu", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 5a206afb2..9bb2142b5 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -177,6 +177,7 @@ "copy_address": "Ṣẹ̀dà àdírẹ́sì", "copy_id": "Ṣẹ̀dà àmì ìdánimọ̀", "copyWalletConnectLink": "Daakọ ọna asopọ WalletConnect lati dApp ki o si lẹẹmọ nibi", + "corrupted_seed_notice": "Awọn faili fun apamọwọ yii jẹ ibajẹ ati pe ko lagbara lati ṣii. Jọwọ wo ọrọ iseda, fipamọ rẹ, ki o mu apamọwọ naa pada.\n\nTi iye ba ṣofo, lẹhinna irugbin naa ko lagbara lati gba pada ni deede.", "countries": "Awọn orilẹ-ede", "create_account": "Dá àkáǹtì", "create_backup": "Ṣẹ̀dà nípamọ́", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 83c86bda8..cb8f89d3c 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -177,6 +177,7 @@ "copy_address": "复制地址", "copy_id": "复制ID", "copyWalletConnectLink": "从 dApp 复制 WalletConnect 链接并粘贴到此处", + "corrupted_seed_notice": "该钱包的文件被损坏,无法打开。请查看种子短语,保存并恢复钱包。\n\n如果该值为空,则种子无法正确恢复。", "countries": "国家", "create_account": "创建账户", "create_backup": "创建备份", diff --git a/scripts/prepare_moneroc.sh b/scripts/prepare_moneroc.sh index 3596bd18b..41b12570c 100755 --- a/scripts/prepare_moneroc.sh +++ b/scripts/prepare_moneroc.sh @@ -8,7 +8,7 @@ if [[ ! -d "monero_c" ]]; then git clone https://github.com/mrcyjanek/monero_c --branch master cd monero_c - git checkout d72c15f4339791a7bbdf17e9d827b7b56ca144e4 + git checkout c41c4dad9aa5003a914cfb2c528c76386f952665 git reset --hard git submodule update --init --force --recursive ./apply_patches.sh monero diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index e0f2c11c0..f8f89611c 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -14,7 +14,6 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST - sp_scanner ) set(PLUGIN_BUNDLED_LIBRARIES) From 79f20c28478d44e26de015034ebd949247b1c919 Mon Sep 17 00:00:00 2001 From: Omar Hatem Date: Fri, 29 Nov 2024 12:43:10 +0200 Subject: [PATCH 6/7] update versions (#1835) * update versions * android fix trial * minor translation fix [skip ci] * update monero_c --- android/app/build.gradle | 2 +- android/app/src/main/AndroidManifestBase.xml | 3 +- assets/text/Monerocom_Release_Notes.txt | 5 +- assets/text/Release_Notes.txt | 7 +-- ios/Podfile.lock | 59 +++++++++++++++++--- macos/Runner/AppDelegate.swift | 2 +- 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 +- scripts/android/app_env.sh | 8 +-- scripts/ios/app_env.sh | 8 +-- scripts/linux/app_env.sh | 4 +- scripts/windows/build_exe_installer.iss | 2 +- 38 files changed, 97 insertions(+), 59 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 628e2ffe6..c19211117 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -44,7 +44,7 @@ android { disable 'InvalidPackage' } - namespace 'com.cakewallet.cake_wallet' + namespace appProperties['id'] defaultConfig { applicationId appProperties['id'] diff --git a/android/app/src/main/AndroidManifestBase.xml b/android/app/src/main/AndroidManifestBase.xml index 5b080e3ec..a92f493df 100644 --- a/android/app/src/main/AndroidManifestBase.xml +++ b/android/app/src/main/AndroidManifestBase.xml @@ -1,5 +1,4 @@ - + diff --git a/assets/text/Monerocom_Release_Notes.txt b/assets/text/Monerocom_Release_Notes.txt index 46f21e172..556010062 100644 --- a/assets/text/Monerocom_Release_Notes.txt +++ b/assets/text/Monerocom_Release_Notes.txt @@ -1,3 +1,2 @@ -Add airgapped Monero wallet support (best used with our new offline app Cupcake) -New Buy & Sell flow -Bug fixes \ No newline at end of file +UI/UX enhancements +Bug fixes and app improvements \ No newline at end of file diff --git a/assets/text/Release_Notes.txt b/assets/text/Release_Notes.txt index 6764826a7..556010062 100644 --- a/assets/text/Release_Notes.txt +++ b/assets/text/Release_Notes.txt @@ -1,5 +1,2 @@ -Add Litecoin Ledger support -Add airgapped Monero wallet support (best used with our new offline app Cupcake) -MWEB fixes and enhancements -New Buy & Sell flow -Bug fixes \ No newline at end of file +UI/UX enhancements +Bug fixes and app improvements \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index bb55b01c6..8046ba307 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3,6 +3,38 @@ PODS: - Flutter - ReachabilitySwift - CryptoSwift (1.8.3) + - cw_haven (0.0.1): + - cw_haven/Boost (= 0.0.1) + - cw_haven/Haven (= 0.0.1) + - cw_haven/OpenSSL (= 0.0.1) + - cw_haven/Sodium (= 0.0.1) + - cw_shared_external + - Flutter + - cw_haven/Boost (0.0.1): + - cw_shared_external + - Flutter + - cw_haven/Haven (0.0.1): + - cw_shared_external + - Flutter + - cw_haven/OpenSSL (0.0.1): + - cw_shared_external + - Flutter + - cw_haven/Sodium (0.0.1): + - cw_shared_external + - Flutter + - cw_mweb (0.0.1): + - Flutter + - cw_shared_external (0.0.1): + - cw_shared_external/Boost (= 0.0.1) + - cw_shared_external/OpenSSL (= 0.0.1) + - cw_shared_external/Sodium (= 0.0.1) + - Flutter + - cw_shared_external/Boost (0.0.1): + - Flutter + - cw_shared_external/OpenSSL (0.0.1): + - Flutter + - cw_shared_external/Sodium (0.0.1): + - Flutter - device_display_brightness (0.0.1): - Flutter - device_info_plus (0.0.1): @@ -62,11 +94,10 @@ PODS: - fluttertoast (0.0.2): - Flutter - Toast - - in_app_review (0.2.0): + - in_app_review (2.0.0): - Flutter - integration_test (0.0.1): - Flutter - - MTBBarcodeScanner (5.0.11) - OrderedSet (6.0.3) - package_info_plus (0.4.5): - Flutter @@ -86,7 +117,6 @@ PODS: - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - - SwiftProtobuf (1.28.2) - sp_scanner (0.0.1): - Flutter - SwiftyGif (5.4.5) @@ -106,6 +136,9 @@ PODS: DEPENDENCIES: - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - CryptoSwift + - cw_haven (from `.symlinks/plugins/cw_haven/ios`) + - cw_mweb (from `.symlinks/plugins/cw_mweb/ios`) + - cw_shared_external (from `.symlinks/plugins/cw_shared_external/ios`) - device_display_brightness (from `.symlinks/plugins/device_display_brightness/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - devicelocale (from `.symlinks/plugins/devicelocale/ios`) @@ -125,6 +158,7 @@ DEPENDENCIES: - sensitive_clipboard (from `.symlinks/plugins/sensitive_clipboard/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - sp_scanner (from `.symlinks/plugins/sp_scanner/ios`) - uni_links (from `.symlinks/plugins/uni_links/ios`) - universal_ble (from `.symlinks/plugins/universal_ble/darwin`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) @@ -145,6 +179,12 @@ SPEC REPOS: EXTERNAL SOURCES: connectivity_plus: :path: ".symlinks/plugins/connectivity_plus/ios" + cw_haven: + :path: ".symlinks/plugins/cw_haven/ios" + cw_mweb: + :path: ".symlinks/plugins/cw_mweb/ios" + cw_shared_external: + :path: ".symlinks/plugins/cw_shared_external/ios" device_display_brightness: :path: ".symlinks/plugins/device_display_brightness/ios" device_info_plus: @@ -183,6 +223,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/share_plus/ios" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + sp_scanner: + :path: ".symlinks/plugins/sp_scanner/ios" uni_links: :path: ".symlinks/plugins/uni_links/ios" universal_ble: @@ -197,9 +239,12 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d CryptoSwift: 967f37cea5a3294d9cce358f78861652155be483 + cw_haven: b3e54e1fbe7b8e6fda57a93206bc38f8e89b898a + cw_mweb: 87af74f9659fed0c1a2cbfb44413f1070e79e3ae + cw_shared_external: 2972d872b8917603478117c9957dfca611845a92 device_display_brightness: 1510e72c567a1f6ce6ffe393dcd9afd1426034f7 device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 - devicelocale: b22617f40038496deffba44747101255cee005b0 + devicelocale: 35ba84dc7f45f527c3001535d8c8d104edd5d926 DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 fast_scanner: 44c00940355a51258cd6c2085734193cd23d95bc @@ -209,10 +254,9 @@ SPEC CHECKSUMS: flutter_local_authentication: 1172a4dd88f6306dadce067454e2c4caf07977bb flutter_mailer: 2ef5a67087bc8c6c4cefd04a178bf1ae2c94cd83 flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be - fluttertoast: 48c57db1b71b0ce9e6bba9f31c940ff4b001293c - in_app_review: 318597b3a06c22bb46dc454d56828c85f444f99d + fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c + in_app_review: a31b5257259646ea78e0e35fc914979b0031d011 integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 - MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 @@ -222,7 +266,6 @@ SPEC CHECKSUMS: sensitive_clipboard: d4866e5d176581536c27bb1618642ee83adca986 share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 - SwiftProtobuf: 4dbaffec76a39a8dc5da23b40af1a5dc01a4c02d sp_scanner: eaa617fa827396b967116b7f1f43549ca62e9a12 SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index cd7f006e6..42212fdc0 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -2,7 +2,7 @@ import Cocoa import FlutterMacOS import IOKit.pwr_mgt -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 9c0774155..308427296 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -259,7 +259,7 @@ "enterTokenID": "ﺰﻴﻤﻤﻟﺍ ﺰﻣﺮﻟﺍ ﻑﺮﻌﻣ ﻞﺧﺩﺃ", "enterWalletConnectURI": "WalletConnect ـﻟ URI ﻞﺧﺩﺃ", "error": "خطأ", - "error_dialog_content": "عفوًا ، لقد حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير التعطل إلى فريق الدعم لدينا لتحسين التطبيق.", + "error_dialog_content": "عفوًا ، حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير الخطأ إلى فريق الدعم الخاص بنا لجعل التطبيق أفضل.", "error_text_account_name": "يجب أن يحتوي اسم الحساب على أحرف وأرقام فقط\nويجب أن يتراوح بين حرف واحد و 15 حرفًا", "error_text_address": "يجب أن يتوافق عنوان المحفظة مع نوع\nالعملة المشفرة", "error_text_amount": "يجب أن يحتوي المبلغ على أرقام فقط", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index dc57086c4..a2a5e6485 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -259,7 +259,7 @@ "enterTokenID": "Въведете идентификатора на токена", "enterWalletConnectURI": "Въведете URI на WalletConnect", "error": "Грешка", - "error_dialog_content": "Получихме грешка.\n\nМоля, изпратете доклада до нашия отдел поддръжка, за да подобрим приложението.", + "error_dialog_content": "Ами сега, получихме някаква грешка.\n\nМоля, изпратете отчета за грешки до нашия екип за поддръжка, за да подобрите приложението.", "error_text_account_name": "Името на профила може да съдържа само букви и числа \nи трябва да е между 1 и 15 символа", "error_text_address": "Адресът на портфейла трябва да отговаря \n на вида криптовалута", "error_text_amount": "Сумата може да съдържа само числа", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 8702f8fe1..0234be2b6 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -259,7 +259,7 @@ "enterTokenID": "Zadejte ID tokenu", "enterWalletConnectURI": "Zadejte identifikátor URI WalletConnect", "error": "Chyba", - "error_dialog_content": "Nastala chyba.\n\nProsím odešlete zprávu o chybě naší podpoře, aby mohli zajistit opravu.", + "error_dialog_content": "Jejda, dostali jsme nějakou chybu.\n\nZašlete prosím chybovou zprávu našemu týmu podpory, abyste aplikaci vylepšili.", "error_text_account_name": "Název účtu může obsahovat jen písmena a čísla\na musí mít délku 1 až 15 znaků", "error_text_address": "Adresa peněženky musí odpovídat typu\nkryptoměny", "error_text_amount": "Částka může obsahovat pouze čísla", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index c2dde5521..55c26e4db 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -259,7 +259,7 @@ "enterTokenID": "Geben Sie die Token-ID ein", "enterWalletConnectURI": "Geben Sie den WalletConnect-URI ein", "error": "Fehler", - "error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Absturzbericht an unser Support-Team, um die Anwendung zu verbessern.", + "error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Fehlerbericht an unser Support -Team, um die Anwendung zu verbessern.", "error_text_account_name": "Der Kontoname darf nur Buchstaben und Zahlen enthalten\nund muss zwischen 1 und 15 Zeichen lang sein", "error_text_address": "Die Walletadresse muss dem Typ der Kryptowährung\nentsprechen", "error_text_amount": "Betrag darf nur Zahlen enthalten", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index a971b797e..f2ddb3c9b 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -259,7 +259,7 @@ "enterTokenID": "Enter the token ID", "enterWalletConnectURI": "Enter WalletConnect URI", "error": "Error", - "error_dialog_content": "Oops, we got some error.\n\nPlease send the crash report to our support team to make the application better.", + "error_dialog_content": "Oops, we got some error.\n\nPlease send the error report to our support team to make the application better.", "error_text_account_name": "Account name can only contain letters, numbers\nand must be between 1 and 15 characters long", "error_text_address": "Wallet address must correspond to the type\nof cryptocurrency", "error_text_amount": "Amount can only contain numbers", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 990e3c154..32ee3d8d1 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -259,7 +259,7 @@ "enterTokenID": "Ingresa el ID del token", "enterWalletConnectURI": "Ingresa el URI de WalletConnect", "error": "Error", - "error_dialog_content": "Vaya, tenemos un error.\n\nEnvía el informe de error a nuestro equipo de soporte para mejorar la aplicación.", + "error_dialog_content": "Vaya, recibimos algo de error.\n\nEnvíe el informe de error a nuestro equipo de soporte para mejorar la aplicación.", "error_text_account_name": "El nombre de la cuenta solo puede contener letras, números \ny debe tener entre 1 y 15 caracteres de longitud", "error_text_address": "La dirección de la billetera debe corresponder al tipo \nde criptomoneda", "error_text_amount": "La cantidad solo puede contener números", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 6b0e58846..c03682ada 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -259,7 +259,7 @@ "enterTokenID": "Entrez l'ID du jeton", "enterWalletConnectURI": "Saisissez l'URI de WalletConnect.", "error": "Erreur", - "error_dialog_content": "Oups, nous avons rencontré une erreur.\n\nMerci d'envoyer le rapport d'erreur à notre équipe d'assistance afin de nous permettre d'améliorer l'application.", + "error_dialog_content": "Oups, nous avons eu une erreur.\n\nVeuillez envoyer le rapport d'erreur à notre équipe d'assistance pour améliorer l'application.", "error_text_account_name": "Le nom de compte ne peut contenir que des lettres et des chiffres\net sa longueur doit être comprise entre 1 et 15 caractères", "error_text_address": "L'adresse du portefeuille (wallet) doit correspondre au type de\ncryptomonnaie", "error_text_amount": "Le montant ne peut comporter que des nombres", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 8d2a66062..3586998af 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -259,7 +259,7 @@ "enterTokenID": "Shigar da alamar alama", "enterWalletConnectURI": "Shigar da WalletConnect URI", "error": "Kuskure", - "error_dialog_content": "Ai, yanzu muka ga alamar kuskure. \n\nDa fatan, aika rahoton kuskuren da muka kira zuwa gasar tsarinmu don gaskiyar shirya.", + "error_dialog_content": "Oops, mun sami kuskure.\n\nDon Allah a aika rahoton kuskuren zuwa ga ƙungiyar goyon bayanmu don yin aikace-aikacen da kyau.", "error_text_account_name": "Sunan ajiya zai iya ɗauka ne kawai da haruffa, lambobi\nkuma ya zama tsakanin 1 zuwa 15 haruffa", "error_text_address": "Adireshin hujja ya kamata ya dace da irin\nna cryptocurrency", "error_text_amount": "Adadin biya zai iya ƙunsar lambobi kawai", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index ceede03fb..f812caf0e 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -259,7 +259,7 @@ "enterTokenID": "टोकन आईडी दर्ज करें", "enterWalletConnectURI": "वॉलेटकनेक्ट यूआरआई दर्ज करें", "error": "त्रुटि", - "error_dialog_content": "ओह, हमसे कुछ गड़बड़ी हुई है.\n\nएप्लिकेशन को बेहतर बनाने के लिए कृपया क्रैश रिपोर्ट हमारी सहायता टीम को भेजें।", + "error_dialog_content": "उफ़, हमें कुछ त्रुटि मिली।\n\nकृपया आवेदन को बेहतर बनाने के लिए हमारी सहायता टीम को त्रुटि रिपोर्ट भेजें।", "error_text_account_name": "खाता नाम में केवल अक्षर, संख्याएं हो सकती हैं\nऔर 1 और 15 वर्णों के बीच लंबा होना चाहिए", "error_text_address": "वॉलेट पता प्रकार के अनुरूप होना चाहिए\nक्रिप्टोकरेंसी का", "error_text_amount": "राशि में केवल संख्याएँ हो सकती हैं", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index f0ee38a9e..9252b19bf 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -259,7 +259,7 @@ "enterTokenID": "Unesite ID tokena", "enterWalletConnectURI": "Unesite WalletConnect URI", "error": "Greška", - "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju.", + "error_dialog_content": "Ups, dobili smo pogrešku.\n\nMolimo pošaljite izvještaj o pogrešci našem timu za podršku kako biste poboljšali aplikaciju.", "error_text_account_name": "Ime računa smije sadržavati samo slova i brojeve\nte mora biti dužine između 1 i 15 znakova", "error_text_address": "Adresa novčanika mora odgovarati\nvrsti kriptovalute", "error_text_amount": "Iznos smije sadržavati samo brojeve", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index d4abeaace..b442defbc 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -259,7 +259,7 @@ "enterTokenID": "Մուտքագրեք Token ID֊ն", "enterWalletConnectURI": "Մուտքագրեք WalletConnect URI", "error": "Սխալ", - "error_dialog_content": "Օպս, մենք սխալ ենք ստացել: \n\nԽնդրում ենք ուղարկել սխալի հաշվետվությունը մեր աջակցության թիմին ծրագիրը բարելավելու համար:", + "error_dialog_content": "Վայ, մենք որոշակի սխալ ստացանք:\n\nԽնդրում ենք ուղարկել սխալի մասին զեկույցը մեր աջակցության թիմին `դիմումը ավելի լավ դարձնելու համար:", "error_text_account_name": "Հաշվի անունը կարող է պարունակել միայն տառեր և թվեր և պետք է լինի 1-15 նիշ", "error_text_address": "Դրամապանակի հասցեն պետք է համապատասխանի կրիպտոարժույթի տեսակին", "error_text_amount": "Գումարը կարող է պարունակել միայն թվեր", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 022d31989..a730832dc 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -259,7 +259,7 @@ "enterTokenID": "Masukkan ID tokennya", "enterWalletConnectURI": "Masukkan URI WalletConnect", "error": "Kesalahan", - "error_dialog_content": "Ups, kami mendapat kesalahan.\n\nSilakan kirim laporan crash ke tim dukungan kami untuk membuat aplikasi lebih baik.", + "error_dialog_content": "Ups, kami mendapat kesalahan.\n\nSilakan kirim laporan kesalahan ke tim dukungan kami untuk membuat aplikasi lebih baik.", "error_text_account_name": "Nama akun hanya dapat berisi huruf, angka\ndan harus antara 1 dan 15 karakter panjang", "error_text_address": "Alamat dompet harus sesuai dengan tipe\nmata uang kripto", "error_text_amount": "Jumlah hanya dapat berisi angka", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 62da65a1e..00b9810b2 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -260,7 +260,7 @@ "enterTokenID": "Inserisci l'ID del token", "enterWalletConnectURI": "Inserisci l'URI di WalletConnect", "error": "Errore", - "error_dialog_content": "Spiacenti, abbiamo riscontrato un errore.\n\nSi prega di inviare il rapporto sull'arresto anomalo al nostro team di supporto per migliorare l'applicazione.", + "error_dialog_content": "Oops, abbiamo ricevuto qualche errore.\n\nSi prega di inviare il rapporto di errore al nostro team di supporto per migliorare l'applicazione.", "error_text_account_name": "Il nome del conto può contenere solo lettere, numeri\ne deve avere una lunghezza compresa tra 1 e 15 caratteri", "error_text_address": "L'indirizzo del Portafoglio deve corrispondere alla tipologia\ndi criptovaluta", "error_text_amount": "L'ammontare può contenere solo numeri", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index e3f6dfb30..df1a47c51 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -259,7 +259,7 @@ "enterTokenID": "トークンIDを入力してください", "enterWalletConnectURI": "WalletConnect URI を入力してください", "error": "エラー", - "error_dialog_content": "エラーが発生しました。\n\nアプリケーションを改善するために、クラッシュ レポートをサポート チームに送信してください。", + "error_dialog_content": "おっと、エラーが発生しました。\n\nサポートチームにエラーレポートを送信して、アプリケーションを改善してください。", "error_text_account_name": "アカウント名には文字のみを含めることができます \n1〜15文字である必要があります", "error_text_address": "ウォレットアドレスは、\n暗号通貨", "error_text_amount": "金額には数字のみを含めることができます", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 55174df01..bea17fb4b 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -259,7 +259,7 @@ "enterTokenID": "토큰 ID를 입력하세요", "enterWalletConnectURI": "WalletConnect URI를 입력하세요.", "error": "오류", - "error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n응용 프로그램을 개선하려면 지원 팀에 충돌 보고서를 보내주십시오.", + "error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n오류 보고서를 지원 팀에 보내 응용 프로그램을 개선하십시오.", "error_text_account_name": "계정 이름은 문자, 숫자 만 포함 할 수 있습니다\n1 ~ 15 자 사이 여야합니다", "error_text_address": "지갑 주소는 유형과 일치해야합니다\n암호 화폐", "error_text_amount": "금액은 숫자 만 포함 할 수 있습니다", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 7da19d093..05ed163c4 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -259,7 +259,7 @@ "enterTokenID": "တိုကင် ID ကိုထည့်ပါ။", "enterWalletConnectURI": "WalletConnect URI ကိုရိုက်ထည့်ပါ။", "error": "အမှား", - "error_dialog_content": "အိုး၊ ကျွန်ုပ်တို့တွင် အမှားအယွင်းအချို့ရှိသည်။\n\nအပလီကေးရှင်းကို ပိုမိုကောင်းမွန်စေရန်အတွက် ပျက်စီးမှုအစီရင်ခံစာကို ကျွန်ုပ်တို့၏ပံ့ပိုးကူညီရေးအဖွဲ့ထံ ပေးပို့ပါ။", + "error_dialog_content": "အိုး, ငါတို့အမှားအယွင်းတွေရတယ်။\n\nလျှောက်လွှာကိုပိုကောင်းအောင်လုပ်ရန်ကျွန်ုပ်တို့၏ထောက်ခံမှုအဖွဲ့သို့အမှားအယွင်းများပေးပို့ပါ။", "error_text_account_name": "အကောင့်အမည်သည် အက္ခရာများ၊ နံပါတ်များသာ ပါဝင်နိုင်သည်\nနှင့် စာလုံးရေ 1 နှင့် 15 ကြားရှိရပါမည်။", "error_text_address": "Wallet လိပ်စာသည် အမျိုးအစား\no cryptocurrency နှင့် ကိုက်ညီရပါမည်။", "error_text_amount": "ပမာဏသည် နံပါတ်များသာ ပါဝင်နိုင်သည်။", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 38fedd52f..449e1ad27 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -259,7 +259,7 @@ "enterTokenID": "Voer de token-ID in", "enterWalletConnectURI": "Voer WalletConnect-URI in", "error": "Fout", - "error_dialog_content": "Oeps, er is een fout opgetreden.\n\nStuur het crashrapport naar ons ondersteuningsteam om de applicatie te verbeteren.", + "error_dialog_content": "Oeps, we hebben wat fout.\n\nStuur het foutrapport naar ons ondersteuningsteam om de applicatie beter te maken.", "error_text_account_name": "Accountnaam mag alleen letters, cijfers bevatten\nen moet tussen de 1 en 15 tekens lang zijn", "error_text_address": "Portemonnee-adres moet overeenkomen met het type\nvan cryptocurrency", "error_text_amount": "Bedrag kan alleen cijfers bevatten", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index c1f805790..67ef4f50c 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -259,7 +259,7 @@ "enterTokenID": "Wprowadź identyfikator tokena", "enterWalletConnectURI": "Wprowadź identyfikator URI WalletConnect", "error": "Błąd", - "error_dialog_content": "Ups, wystąpił błąd.\n\nPrześlij raport o awarii do naszego zespołu wsparcia, aby ulepszyć aplikację.", + "error_dialog_content": "Ups, mamy trochę błędu.\n\nProszę o przesłanie raportu o błędach do naszego zespołu wsparcia, aby aplikacja była lepsza.", "error_text_account_name": "Nazwa konta może zawierać tylko litery, cyfry\ni musi mieć od 1 do 15 znaków", "error_text_address": "Adres musi odpowiadać typowi kryptowaluty", "error_text_amount": "Kwota może zawierać tylko liczby", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 534af19a9..b910d49b2 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -259,7 +259,7 @@ "enterTokenID": "Insira o ID do token", "enterWalletConnectURI": "Insira o URI do WalletConnect", "error": "Erro", - "error_dialog_content": "Ops, houve algum erro.\n\nPor favor, envie o relatório de falha para nossa equipe de suporte para melhorar o aplicativo.", + "error_dialog_content": "Opa, recebemos algum erro.\n\nEnvie o relatório de erro à nossa equipe de suporte para melhorar o aplicativo.", "error_text_account_name": "O nome da conta só pode conter letras, números\ne deve ter entre 1 e 15 caracteres", "error_text_address": "O endereço da carteira deve corresponder à\ncriptomoeda selecionada", "error_text_amount": "A quantia deve conter apenas números", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index b292ab8f6..daa615f6c 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -259,7 +259,7 @@ "enterTokenID": "Введите идентификатор токена", "enterWalletConnectURI": "Введите URI WalletConnect", "error": "Ошибка", - "error_dialog_content": "Ой, у нас какая-то ошибка.\n\nПожалуйста, отправьте отчет о сбое в нашу службу поддержки, чтобы сделать приложение лучше.", + "error_dialog_content": "Упс, мы получили некоторую ошибку.\n\nПожалуйста, отправьте отчет об ошибках в нашу команду поддержки, чтобы сделать приложение лучше.", "error_text_account_name": "Имя аккаунта может содержать только буквы, цифры\nи должно быть от 1 до 15 символов в длину", "error_text_address": "Адрес кошелька должен соответствовать типу\nкриптовалюты", "error_text_amount": "Баланс может содержать только цифры", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 7647d51a3..28a25d88b 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -259,7 +259,7 @@ "enterTokenID": "ป้อนรหัสโทเค็น", "enterWalletConnectURI": "เข้าสู่ WalletConnect URI", "error": "ข้อผิดพลาด", - "error_dialog_content": "อ๊ะ เราพบข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อขัดข้องไปยังทีมสนับสนุนของเราเพื่อปรับปรุงแอปพลิเคชันให้ดียิ่งขึ้น", + "error_dialog_content": "อ๊ะเรามีข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อผิดพลาดไปยังทีมสนับสนุนของเราเพื่อให้แอปพลิเคชันดีขึ้น", "error_text_account_name": "ชื่อบัญชีสามารถเป็นเพียงตัวอักษรหรือตัวเลขเท่านั้น\nและต้องมีความยาวระหว่าง 1 ถึง 15 ตัวอักษร", "error_text_address": "ที่อยู่กระเป๋าจะต้องสอดคล้องกับประเภท\nของเหรียญคริปโตเนียม", "error_text_amount": "จำนวนจะต้องประกอบด้วยตัวเลขเท่านั้น", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 1d8897507..e0ac804a5 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -259,7 +259,7 @@ "enterTokenID": "Ipasok ang token ID", "enterWalletConnectURI": "Ipasok ang WalletConnect URI", "error": "Error", - "error_dialog_content": "Oops, nakakuha kami ng ilang error.\n\nMangyaring ipadala ang crash report sa aming koponan ng suporta upang maging mas mahusay ang application.", + "error_dialog_content": "Oops, nakakuha kami ng ilang error.\n\nMangyaring ipadala ang ulat ng error sa aming koponan ng suporta upang maging mas mahusay ang application.", "error_text_account_name": "Ang pangalan ng account ay maaari lamang maglaman ng mga titik, numero\nat dapat sa pagitan ng 1 at 15 character ang haba", "error_text_address": "Ang wallet address ay dapat na tumutugma sa uri\nng cryptocurrency", "error_text_amount": "Ang halaga ay maaari lamang maglaman ng mga numero", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index b69a957fb..87ad65450 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -259,7 +259,7 @@ "enterTokenID": "Belirteç kimliğini girin", "enterWalletConnectURI": "WalletConnect URI'sini girin", "error": "Hata", - "error_dialog_content": "Hay aksi, bir hatamız var.\n\nUygulamayı daha iyi hale getirmek için lütfen kilitlenme raporunu destek ekibimize gönderin.", + "error_dialog_content": "Oops, biraz hata aldık.\n\nLütfen uygulamayı daha iyi hale getirmek için hata raporunu destek ekibimize gönderin.", "error_text_account_name": "Hesap ismi yalnızca harf, rakam \nve 1 ile 15 uzunluğunda karakter içermelidir.", "error_text_address": "Cüzdan adresi kripto para biriminin\ntürüne karşılık gelmelidir", "error_text_amount": "Miktar sadece sayı içerebilir", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 12dcd2af9..876ae8993 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -259,7 +259,7 @@ "enterTokenID": "Введіть ідентифікатор токена", "enterWalletConnectURI": "Введіть URI WalletConnect", "error": "Помилка", - "error_dialog_content": "На жаль, ми отримали помилку.\n\nБудь ласка, надішліть звіт про збій нашій команді підтримки, щоб покращити додаток.", + "error_dialog_content": "На жаль, ми отримали певну помилку.\n\nБудь ласка, надішліть звіт про помилку нашій команді підтримки, щоб зробити заявку кращим.", "error_text_account_name": "Ім'я акаунту може містити тільки букви, цифри\nі повинно бути від 1 до 15 символів в довжину", "error_text_address": "Адреса гаманця повинна відповідати типу\nкриптовалюти", "error_text_amount": "Баланс може містити тільки цифри", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 28194915f..7bb22a0d0 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -259,7 +259,7 @@ "enterTokenID": " ۔ﮟﯾﺮﮐ ﺝﺭﺩ ID ﻦﮐﻮﭨ", "enterWalletConnectURI": "WalletConnect URI ۔ﮟﯾﺮﮐ ﺝﺭﺩ", "error": "خرابی", - "error_dialog_content": "افوہ، ہمیں کچھ خرابی ملی۔\n\nایپلی کیشن کو بہتر بنانے کے لیے براہ کرم کریش رپورٹ ہماری سپورٹ ٹیم کو بھیجیں۔", + "error_dialog_content": "افوہ ، ہمیں کچھ غلطی ہوئی۔\n\nبراہ کرم درخواست کو بہتر بنانے کے لئے ہماری سپورٹ ٹیم کو غلطی کی رپورٹ بھیجیں۔", "error_text_account_name": "اکاؤنٹ کا نام صرف حروف، اعداد پر مشتمل ہو سکتا ہے\\nاور 1 سے 15 حروف کے درمیان ہونا چاہیے۔", "error_text_address": "والیٹ کا پتہ cryptocurrency کی قسم\\nکے مطابق ہونا چاہیے۔", "error_text_amount": "رقم صرف اعداد پر مشتمل ہو سکتی ہے۔", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 762b5989a..6eeed916e 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -258,7 +258,7 @@ "enterTokenID": "Nhập ID token", "enterWalletConnectURI": "Nhập URI WalletConnect", "error": "Lỗi", - "error_dialog_content": "Oops, chúng tôi gặp một số lỗi.\n\nVui lòng gửi báo cáo sự cố cho nhóm hỗ trợ của chúng tôi để cải thiện ứng dụng.", + "error_dialog_content": "Rất tiếc, chúng tôi đã gặp một số lỗi.\n\nVui lòng gửi báo cáo lỗi cho nhóm hỗ trợ của chúng tôi để làm cho ứng dụng tốt hơn.", "error_text_account_name": "Tên tài khoản chỉ được chứa chữ cái, số\nvà phải từ 1 đến 15 ký tự", "error_text_address": "Địa chỉ ví phải tương ứng với loại tiền điện tử", "error_text_amount": "Số tiền chỉ được chứa số", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 9bb2142b5..cb446b421 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -260,7 +260,7 @@ "enterTokenID": "Tẹ ID ami sii", "enterWalletConnectURI": "Tẹ WalletConnect URI sii", "error": "Àṣìṣe", - "error_dialog_content": "Àṣìṣe ti dé.\n\nẸ jọ̀wọ́, fi àkọsílẹ̀ àṣìṣe ránṣẹ́ sí ẹgbẹ́ ìranlọ́wọ́ wa kí áàpù wa bá túbọ̀ dára.", + "error_dialog_content": "Oops, a ni aṣiṣe diẹ.\n\nJọwọ fi aṣiṣe naa ranṣẹ si ẹgbẹ atilẹyin wa lati jẹ ki ohun elo naa dara julọ.", "error_text_account_name": "Orúkọ àkáǹtì lè ni nìkan nínú ẹyọ ọ̀rọ̀ àti òǹkà\nGígun rẹ̀ kò gbọ́dọ̀ kéré ju oókan. Gígun rẹ̀ sì kò gbọ́dọ̀ tóbi ju márùndínlógún.", "error_text_address": "Àdírẹ́sì àpamọ́wọ́ gbọ́dọ̀ báramu irú owó", "error_text_amount": "Iye lè ni nìkan nínú àwọn òǹkà", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index cb8f89d3c..86090f11f 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -259,7 +259,7 @@ "enterTokenID": "输入令牌 ID", "enterWalletConnectURI": "输入 WalletConnect URI", "error": "错误", - "error_dialog_content": "糟糕,我们遇到了一些错误。\n\n请将崩溃报告发送给我们的支持团队,以改进应用程序。", + "error_dialog_content": "糟糕,我们有一些错误。\n\n请将错误报告发送给我们的支持团队,以使应用程序更好。", "error_text_account_name": "帐户名称只能包含字母数字\n且必须介于1到15个字符之间", "error_text_address": "钱包地址必须与类型对应\n加密货币", "error_text_amount": "金额只能包含数字", diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index 7eee6d6ae..a11df5503 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -15,15 +15,15 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_ANDROID_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.18.0" -MONERO_COM_BUILD_NUMBER=105 +MONERO_COM_VERSION="1.18.1" +MONERO_COM_BUILD_NUMBER=106 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.21.0" -CAKEWALLET_BUILD_NUMBER=236 +CAKEWALLET_VERSION="4.21.1" +CAKEWALLET_BUILD_NUMBER=237 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 fe18758c8..d4cc7cbe7 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.18.0" -MONERO_COM_BUILD_NUMBER=103 +MONERO_COM_VERSION="1.18.1" +MONERO_COM_BUILD_NUMBER=104 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="4.21.0" -CAKEWALLET_BUILD_NUMBER=281 +CAKEWALLET_VERSION="4.21.1" +CAKEWALLET_BUILD_NUMBER=282 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" HAVEN_NAME="Haven" diff --git a/scripts/linux/app_env.sh b/scripts/linux/app_env.sh index 1cdb43ced..77a33ccfd 100755 --- a/scripts/linux/app_env.sh +++ b/scripts/linux/app_env.sh @@ -14,8 +14,8 @@ if [ -n "$1" ]; then fi CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="1.11.0" -CAKEWALLET_BUILD_NUMBER=38 +CAKEWALLET_VERSION="1.11.1" +CAKEWALLET_BUILD_NUMBER=39 if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then echo "Wrong app type." diff --git a/scripts/windows/build_exe_installer.iss b/scripts/windows/build_exe_installer.iss index 25f94cb1f..2cdd8c47c 100644 --- a/scripts/windows/build_exe_installer.iss +++ b/scripts/windows/build_exe_installer.iss @@ -1,5 +1,5 @@ #define MyAppName "Cake Wallet" -#define MyAppVersion "0.2.0" +#define MyAppVersion "0.2.1" #define MyAppPublisher "Cake Labs LLC" #define MyAppURL "https://cakewallet.com/" #define MyAppExeName "CakeWallet.exe" From de970fcb805bb9003bd460fa0660c294e715dcb6 Mon Sep 17 00:00:00 2001 From: Omar Hatem Date: Fri, 29 Nov 2024 13:16:59 +0200 Subject: [PATCH 7/7] test (#1838) * update versions * android fix trial * minor translation fix [skip ci] * update monero_c * minor --- cw_bitcoin/pubspec.lock | 4 +-- cw_core/pubspec.lock | 4 +-- .../.plugin_symlinks/path_provider_linux | 2 +- cw_monero/pubspec.lock | 4 +-- cw_wownero/pubspec.lock | 4 +-- linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 ++ macos/Podfile.lock | 27 ++++++++++++------- scripts/ios/app_env.sh | 2 +- windows/flutter/generated_plugins.cmake | 1 + 10 files changed, 31 insertions(+), 20 deletions(-) diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index aa9f3ba05..c65f056bb 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -1031,10 +1031,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.4" watcher: dependency: "direct overridden" description: diff --git a/cw_core/pubspec.lock b/cw_core/pubspec.lock index 44ef15a41..c12839a19 100644 --- a/cw_core/pubspec.lock +++ b/cw_core/pubspec.lock @@ -722,10 +722,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.4" watcher: dependency: "direct overridden" description: diff --git a/cw_monero/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux b/cw_monero/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux index a2b4915e7..17553f81e 120000 --- a/cw_monero/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux +++ b/cw_monero/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux @@ -1 +1 @@ -/Users/user/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file +/Users/omarhatem/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock index f4be439b7..d8a3a4ff8 100644 --- a/cw_monero/pubspec.lock +++ b/cw_monero/pubspec.lock @@ -829,10 +829,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.4" watcher: dependency: "direct overridden" description: diff --git a/cw_wownero/pubspec.lock b/cw_wownero/pubspec.lock index c565348e1..70f1f1e1d 100644 --- a/cw_wownero/pubspec.lock +++ b/cw_wownero/pubspec.lock @@ -757,10 +757,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.4" watcher: dependency: "direct overridden" description: diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 4b9eb3b2d..f52be7481 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -10,6 +10,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + sp_scanner ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 52b44e53e..42b9fa84c 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,6 +6,7 @@ import FlutterMacOS import Foundation import connectivity_plus +import cw_mweb import device_info_plus import devicelocale import fast_scanner @@ -23,6 +24,7 @@ import wakelock_plus func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) + CwMwebPlugin.register(with: registry.registrar(forPlugin: "CwMwebPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DevicelocalePlugin.register(with: registry.registrar(forPlugin: "DevicelocalePlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 001d75696..4445e5976 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -12,21 +12,21 @@ PODS: - FlutterMacOS - flutter_inappwebview_macos (0.0.1): - FlutterMacOS - - OrderedSet (~> 5.0) + - OrderedSet (~> 6.0.3) - flutter_local_authentication (1.2.0): - FlutterMacOS - flutter_secure_storage_macos (6.1.1): - FlutterMacOS - FlutterMacOS (1.0.0) - - in_app_review (0.2.0): + - in_app_review (2.0.0): - FlutterMacOS - - OrderedSet (5.0.0) + - OrderedSet (6.0.3) - package_info_plus (0.0.1): - FlutterMacOS - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - ReachabilitySwift (5.0.0) + - ReachabilitySwift (5.2.4) - share_plus (0.0.1): - FlutterMacOS - shared_preferences_foundation (0.0.1): @@ -34,6 +34,9 @@ PODS: - FlutterMacOS - sp_scanner (0.0.1): - FlutterMacOS + - universal_ble (0.0.1): + - Flutter + - FlutterMacOS - url_launcher_macos (0.0.1): - FlutterMacOS - wakelock_plus (0.0.1): @@ -55,6 +58,7 @@ DEPENDENCIES: - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sp_scanner (from `Flutter/ephemeral/.symlinks/plugins/sp_scanner/macos`) + - universal_ble (from `Flutter/ephemeral/.symlinks/plugins/universal_ble/darwin`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) @@ -94,6 +98,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin sp_scanner: :path: Flutter/ephemeral/.symlinks/plugins/sp_scanner/macos + universal_ble: + :path: Flutter/ephemeral/.symlinks/plugins/universal_ble/darwin url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos wakelock_plus: @@ -105,18 +111,19 @@ SPEC CHECKSUMS: device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225 fast_scanner: d31bae07e2653403a69dac99fb710c1722b16a97 - flutter_inappwebview_macos: 9600c9df9fdb346aaa8933812009f8d94304203d + flutter_inappwebview_macos: bdf207b8f4ebd58e86ae06cd96b147de99a67c9b flutter_local_authentication: 85674893931e1c9cfa7c9e4f5973cb8c56b018b0 flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - in_app_review: a850789fad746e89bce03d4aeee8078b45a53fd0 - OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c - package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c + in_app_review: a6a031b9acd03c7d103e341aa334adf2c493fb93 + OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 + package_info_plus: 12f1c5c2cfe8727ca46cbd0b26677728972d9a5b path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 - ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 - share_plus: 36537c04ce0c3e3f5bd297ce4318b6d5ee5fd6cf + ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda + share_plus: 1fa619de8392a4398bfaf176d441853922614e89 shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sp_scanner: 269d96e0ec3173e69156be7239b95182be3b8303 + universal_ble: cf52a7b3fd2e7c14d6d7262e9fdadb72ab6b88a6 url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index d4cc7cbe7..2ca0df21d 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -19,7 +19,7 @@ MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="4.21.1" -CAKEWALLET_BUILD_NUMBER=282 +CAKEWALLET_BUILD_NUMBER=283 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" HAVEN_NAME="Haven" diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index f8f89611c..e0f2c11c0 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -14,6 +14,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + sp_scanner ) set(PLUGIN_BUNDLED_LIBRARIES)