diff --git a/android/app/build.gradle b/android/app/build.gradle index 238dc769d5..b65c541087 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -99,4 +99,4 @@ configurations { implementation.exclude module:'proto-google-common-protos' implementation.exclude module:'protolite-well-known-types' implementation.exclude module:'protobuf-javalite' -} \ No newline at end of file +} diff --git a/cw_bitcoin/lib/electrum.dart b/cw_bitcoin/lib/electrum.dart index 28e3f47be7..4fc4c1ad8e 100644 --- a/cw_bitcoin/lib/electrum.dart +++ b/cw_bitcoin/lib/electrum.dart @@ -235,21 +235,21 @@ class ElectrumClient { return []; }); - Future>> getListUnspent(String scriptHash) => - call(method: 'blockchain.scripthash.listunspent', params: [scriptHash]) - .then((dynamic result) { - if (result is List) { - return result.map((dynamic val) { - if (val is Map) { - return val; - } + Future>> getListUnspent(String scriptHash) async { + final result = await call(method: 'blockchain.scripthash.listunspent', params: [scriptHash]); - return {}; - }).toList(); + if (result is List) { + return result.map((dynamic val) { + if (val is Map) { + return val; } - return []; - }); + return {}; + }).toList(); + } + + return []; + } Future>> getMempool(String scriptHash) => call(method: 'blockchain.scripthash.get_mempool', params: [scriptHash]) diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index a5bb9c6552..d9041cba4f 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -1382,8 +1382,9 @@ abstract class ElectrumWalletBase })); unspentCoins = updatedUnspentCoins; - - final currentWalletUnspentCoins = unspentCoinsInfo.values.where((element) => element.walletId == id); + + final currentWalletUnspentCoins = + unspentCoinsInfo.values.where((element) => element.walletId == id); if (currentWalletUnspentCoins.length != updatedUnspentCoins.length) { unspentCoins.forEach((coin) => addCoinInfo(coin)); @@ -1450,10 +1451,9 @@ abstract class ElectrumWalletBase @action Future addCoinInfo(BitcoinUnspent coin) async { - // Check if the coin is already in the unspentCoinsInfo for the wallet - final existingCoinInfo = unspentCoinsInfo.values.firstWhereOrNull( - (element) => element.walletId == walletInfo.id && element == coin); + final existingCoinInfo = unspentCoinsInfo.values + .firstWhereOrNull((element) => element.walletId == walletInfo.id && element == coin); if (existingCoinInfo == null) { final newInfo = UnspentCoinsInfo( @@ -1475,19 +1475,18 @@ abstract class ElectrumWalletBase Future _refreshUnspentCoinsInfo() async { try { - final List keys = []; + final List keys = []; final currentWalletUnspentCoins = - unspentCoinsInfo.values.where((element) => element.walletId.contains(id)); + unspentCoinsInfo.values.where((record) => record.walletId == id); - if (currentWalletUnspentCoins.isNotEmpty) { - currentWalletUnspentCoins.forEach((element) { - final existUnspentCoins = unspentCoins - .where((coin) => element.hash.contains(coin.hash) && element.vout == coin.vout); + for (final element in currentWalletUnspentCoins) { + if (RegexUtils.addressTypeFromStr(element.address, network) is MwebAddress) continue; - if (existUnspentCoins.isEmpty) { - keys.add(element.key); - } - }); + final existUnspentCoins = unspentCoins.where((coin) => element == coin); + + if (existUnspentCoins.isEmpty) { + keys.add(element.key); + } } if (keys.isNotEmpty) { @@ -1499,7 +1498,8 @@ abstract class ElectrumWalletBase } Future cleanUpDuplicateUnspentCoins() async { - final currentWalletUnspentCoins = unspentCoinsInfo.values.where((element) => element.walletId == id); + final currentWalletUnspentCoins = + unspentCoinsInfo.values.where((element) => element.walletId == id); final Map uniqueUnspentCoins = {}; final List duplicateKeys = []; @@ -1535,7 +1535,8 @@ abstract class ElectrumWalletBase final ownAddresses = walletAddresses.allAddresses.map((addr) => addr.address).toSet(); final receiverAmount = outputs - .where((output) => !ownAddresses.contains(addressFromOutputScript(output.scriptPubKey, network))) + .where((output) => + !ownAddresses.contains(addressFromOutputScript(output.scriptPubKey, network))) .fold(0, (sum, output) => sum + output.amount.toInt()); if (receiverAmount == 0) { @@ -1584,7 +1585,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, @@ -1602,7 +1603,7 @@ abstract class ElectrumWalletBase scriptType: _getScriptType(btcAddress), ), ownerDetails: - UtxoAddressDetails(publicKey: privkey.getPublic().toHex(), address: btcAddress), + UtxoAddressDetails(publicKey: privkey.getPublic().toHex(), address: btcAddress), ), ); } @@ -1630,7 +1631,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; @@ -1686,7 +1687,7 @@ abstract class ElectrumWalletBase vout: utxo.vout, scriptType: _getScriptType(address)), ownerDetails: - UtxoAddressDetails(publicKey: privkey.getPublic().toHex(), address: address), + UtxoAddressDetails(publicKey: privkey.getPublic().toHex(), address: address), )); allInputsAmount += utxo.value; @@ -1743,11 +1744,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; @@ -1764,7 +1765,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"); } @@ -1774,7 +1775,6 @@ abstract class ElectrumWalletBase } else { return key.signInput(txDigest, sigHash: sighash); } - }); return PendingBitcoinTransaction( @@ -1787,16 +1787,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.transactions.values.forEach((tx) { + if (tx.id == hash) { + tx.isReplaced = true; + tx.isPending = false; + transactionHistory.addOne(tx); + } + }); + transactionHistory.addOne(transaction); + await updateBalance(); }); - transactionHistory.addOne(transaction); - await updateBalance(); - }); } catch (e) { throw e; } diff --git a/cw_core/lib/hardware/device_connection_type.dart b/cw_core/lib/hardware/device_connection_type.dart index 466d58e2a9..76a501af13 100644 --- a/cw_core/lib/hardware/device_connection_type.dart +++ b/cw_core/lib/hardware/device_connection_type.dart @@ -7,7 +7,7 @@ enum DeviceConnectionType { static List supportedConnectionTypes(WalletType walletType, [bool isIOS = false]) { switch (walletType) { - // case WalletType.monero: + case WalletType.monero: case WalletType.bitcoin: case WalletType.litecoin: case WalletType.ethereum: diff --git a/cw_monero/lib/api/transaction_history.dart b/cw_monero/lib/api/transaction_history.dart index aa6cac18a4..854ee01c32 100644 --- a/cw_monero/lib/api/transaction_history.dart +++ b/cw_monero/lib/api/transaction_history.dart @@ -200,9 +200,16 @@ String? commitTransactionFromPointerAddress({required int address, required bool commitTransaction(transactionPointer: monero.PendingTransaction.fromAddress(address), useUR: useUR); String? commitTransaction({required monero.PendingTransaction transactionPointer, required bool useUR}) { + final transactionPointerAddress = transactionPointer.address; final txCommit = useUR - ? monero.PendingTransaction_commitUR(transactionPointer, 120) - : monero.PendingTransaction_commit(transactionPointer, filename: '', overwrite: false); + ? monero.PendingTransaction_commitUR(transactionPointer, 120) + : Isolate.run(() { + monero.PendingTransaction_commit( + Pointer.fromAddress(transactionPointerAddress), + filename: '', + overwrite: false, + ); + }); String? error = (() { final status = monero.PendingTransaction_status(transactionPointer.cast()); @@ -221,7 +228,7 @@ String? commitTransaction({required monero.PendingTransaction transactionPointer })(); } - if (error != null) { + if (error != null && error != "no tx keys found for this txid") { throw CreationTransactionException(message: error); } if (useUR) { diff --git a/cw_monero/lib/ledger.dart b/cw_monero/lib/ledger.dart index e7af9f390a..b95c655a07 100644 --- a/cw_monero/lib/ledger.dart +++ b/cw_monero/lib/ledger.dart @@ -2,11 +2,12 @@ import 'dart:async'; import 'dart:ffi'; import 'dart:typed_data'; +import 'package:collection/collection.dart'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:ffi/ffi.dart'; import 'package:ledger_flutter_plus/ledger_flutter_plus.dart'; import 'package:ledger_flutter_plus/ledger_flutter_plus_dart.dart'; import 'package:monero/monero.dart' as monero; -// import 'package:polyseed/polyseed.dart'; LedgerConnection? gLedger; @@ -28,9 +29,16 @@ void enableLedgerExchange(monero.wallet ptr, LedgerConnection connection) { ptr, emptyPointer.cast(), 0); malloc.free(emptyPointer); - // printV("> ${ledgerRequest.toHexString()}"); + _logLedgerCommand(ledgerRequest, false); final response = await exchange(connection, ledgerRequest); - // printV("< ${response.toHexString()}"); + _logLedgerCommand(response, true); + + if (ListEquality().equals(response, [0x55, 0x15])) { + await connection.disconnect(); + // // TODO: Show POPUP pls unlock your device + // await Future.delayed(Duration(seconds: 15)); + // response = await exchange(connection, ledgerRequest); + } final Pointer result = malloc(response.length); for (var i = 0; i < response.length; i++) { @@ -82,3 +90,59 @@ class ExchangeOperation extends LedgerRawOperation { @override Future> write(ByteDataWriter writer) async => [inputData]; } + +const _ledgerMoneroCommands = { + 0x00: "INS_NONE", + 0x02: "INS_RESET", + 0x20: "INS_GET_KEY", + 0x21: "INS_DISPLAY_ADDRESS", + 0x22: "INS_PUT_KEY", + 0x24: "INS_GET_CHACHA8_PREKEY", + 0x26: "INS_VERIFY_KEY", + 0x28: "INS_MANAGE_SEEDWORDS", + 0x30: "INS_SECRET_KEY_TO_PUBLIC_KEY", + 0x32: "INS_GEN_KEY_DERIVATION", + 0x34: "INS_DERIVATION_TO_SCALAR", + 0x36: "INS_DERIVE_PUBLIC_KEY", + 0x38: "INS_DERIVE_SECRET_KEY", + 0x3A: "INS_GEN_KEY_IMAGE", + 0x3B: "INS_DERIVE_VIEW_TAG", + 0x3C: "INS_SECRET_KEY_ADD", + 0x3E: "INS_SECRET_KEY_SUB", + 0x40: "INS_GENERATE_KEYPAIR", + 0x42: "INS_SECRET_SCAL_MUL_KEY", + 0x44: "INS_SECRET_SCAL_MUL_BASE", + 0x46: "INS_DERIVE_SUBADDRESS_PUBLIC_KEY", + 0x48: "INS_GET_SUBADDRESS", + 0x4A: "INS_GET_SUBADDRESS_SPEND_PUBLIC_KEY", + 0x4C: "INS_GET_SUBADDRESS_SECRET_KEY", + 0x70: "INS_OPEN_TX", + 0x72: "INS_SET_SIGNATURE_MODE", + 0x74: "INS_GET_ADDITIONAL_KEY", + 0x76: "INS_STEALTH", + 0x77: "INS_GEN_COMMITMENT_MASK", + 0x78: "INS_BLIND", + 0x7A: "INS_UNBLIND", + 0x7B: "INS_GEN_TXOUT_KEYS", + 0x7D: "INS_PREFIX_HASH", + 0x7C: "INS_VALIDATE", + 0x7E: "INS_MLSAG", + 0x7F: "INS_CLSAG", + 0x80: "INS_CLOSE_TX", + 0xA0: "INS_GET_TX_PROOF", + 0xC0: "INS_GET_RESPONSE" +}; + +void _logLedgerCommand(Uint8List command, [bool isResponse = true]) { + String toHexString(Uint8List data) => + data.map((e) => e.toRadixString(16).padLeft(2, '0')).join(); + + + + if (isResponse) { + printV("< ${toHexString(command)}"); + } else { + printV( + "> ${_ledgerMoneroCommands[command[1]]} ${toHexString(command.sublist(2))}"); + } +} diff --git a/cw_monero/lib/monero_wallet_service.dart b/cw_monero/lib/monero_wallet_service.dart index 6f24352581..18171a568f 100644 --- a/cw_monero/lib/monero_wallet_service.dart +++ b/cw_monero/lib/monero_wallet_service.dart @@ -1,5 +1,7 @@ import 'dart:ffi'; import 'dart:io'; + +import 'package:cw_core/get_height_by_date.dart'; import 'package:cw_core/monero_wallet_utils.dart'; import 'package:cw_core/pathForWallet.dart'; import 'package:cw_core/unspent_coins_info.dart'; @@ -9,16 +11,16 @@ import 'package:cw_core/wallet_credentials.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_service.dart'; import 'package:cw_core/wallet_type.dart'; -import 'package:cw_core/get_height_by_date.dart'; import 'package:cw_monero/api/account_list.dart'; import 'package:cw_monero/api/wallet_manager.dart' as monero_wallet_manager; import 'package:cw_monero/api/wallet_manager.dart'; import 'package:cw_monero/ledger.dart'; import 'package:cw_monero/monero_wallet.dart'; +import 'package:collection/collection.dart'; import 'package:hive/hive.dart'; import 'package:ledger_flutter_plus/ledger_flutter_plus.dart'; -import 'package:polyseed/polyseed.dart'; import 'package:monero/monero.dart' as monero; +import 'package:polyseed/polyseed.dart'; class MoneroNewWalletCredentials extends WalletCredentials { MoneroNewWalletCredentials( @@ -133,14 +135,12 @@ class MoneroWalletService extends WalletService< try { final path = await pathForWallet(name: name, type: getType()); - if (walletFilesExist(path)) { - await repairOldAndroidWallet(name); - } + if (walletFilesExist(path)) await repairOldAndroidWallet(name); await monero_wallet_manager .openWalletAsync({'path': path, 'password': password}); - final walletInfo = walletInfoSource.values.firstWhere( - (info) => info.id == WalletBase.idFor(name, getType())); + final walletInfo = walletInfoSource.values + .firstWhere((info) => info.id == WalletBase.idFor(name, getType())); final wallet = MoneroWallet( walletInfo: walletInfo, unspentCoinsInfo: unspentCoinsInfoSource, @@ -204,7 +204,7 @@ class MoneroWalletService extends WalletService< @override Future rename(String currentName, String password, String newName) async { final currentWalletInfo = walletInfoSource.values.firstWhere( - (info) => info.id == WalletBase.idFor(currentName, getType())); + (info) => info.id == WalletBase.idFor(currentName, getType())); final currentWallet = MoneroWallet( walletInfo: currentWalletInfo, unspentCoinsInfo: unspentCoinsInfoSource, @@ -255,14 +255,14 @@ class MoneroWalletService extends WalletService< final password = credentials.password; final height = credentials.height; - if (wptr == null ) monero_wallet_manager.createWalletPointer(); + if (wptr == null) monero_wallet_manager.createWalletPointer(); enableLedgerExchange(wptr!, credentials.ledgerConnection); await monero_wallet_manager.restoreWalletFromHardwareWallet( - path: path, - password: password!, - restoreHeight: height!, - deviceName: 'Ledger'); + path: path, + password: password!, + restoreHeight: height!, + deviceName: 'Ledger'); final wallet = MoneroWallet( walletInfo: credentials.walletInfo!, @@ -279,7 +279,8 @@ class MoneroWalletService extends WalletService< } @override - Future restoreFromSeed(MoneroRestoreWalletFromSeedCredentials credentials, + Future restoreFromSeed( + MoneroRestoreWalletFromSeedCredentials credentials, {bool? isTestnet}) async { // Restore from Polyseed if (Polyseed.isValidSeed(credentials.mnemonic)) { @@ -313,7 +314,8 @@ class MoneroWalletService extends WalletService< final path = await pathForWallet(name: credentials.name, type: getType()); final polyseedCoin = PolyseedCoin.POLYSEED_MONERO; final lang = PolyseedLang.getByPhrase(credentials.mnemonic); - final polyseed = Polyseed.decode(credentials.mnemonic, lang, polyseedCoin); + final polyseed = + Polyseed.decode(credentials.mnemonic, lang, polyseedCoin); return _restoreFromPolyseed( path, credentials.password!, polyseed, credentials.walletInfo!, lang); @@ -355,24 +357,18 @@ class MoneroWalletService extends WalletService< Future repairOldAndroidWallet(String name) async { try { - if (!Platform.isAndroid) { - return; - } + if (!Platform.isAndroid) return; final oldAndroidWalletDirPath = await outdatedAndroidPathForWalletDir(name: name); final dir = Directory(oldAndroidWalletDirPath); - if (!dir.existsSync()) { - return; - } + if (!dir.existsSync()) return; final newWalletDirPath = await pathForWalletDir(name: name, type: getType()); dir.listSync().forEach((f) { final file = File(f.path); - final name = f.path - .split('/') - .last; + final name = f.path.split('/').last; final newPath = newWalletDirPath + '/$name'; final newFile = File(newPath); @@ -391,9 +387,7 @@ class MoneroWalletService extends WalletService< try { final path = await pathForWallet(name: name, type: getType()); - if (walletFilesExist(path)) { - await repairOldAndroidWallet(name); - } + if (walletFilesExist(path)) await repairOldAndroidWallet(name); await monero_wallet_manager.openWalletAsync({'path': path, 'password': password}); final walletInfo = walletInfoSource.values @@ -412,8 +406,10 @@ class MoneroWalletService extends WalletService< @override bool requireHardwareWalletConnection(String name) { - final walletInfo = walletInfoSource.values - .firstWhere((info) => info.id == WalletBase.idFor(name, getType())); - return walletInfo.isHardwareWallet; + return walletInfoSource.values + .firstWhereOrNull( + (info) => info.id == WalletBase.idFor(name, getType())) + ?.isHardwareWallet ?? + false; } } diff --git a/cw_solana/lib/solana_client.dart b/cw_solana/lib/solana_client.dart index 175d131956..95376c5637 100644 --- a/cw_solana/lib/solana_client.dart +++ b/cw_solana/lib/solana_client.dart @@ -1,12 +1,13 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:math'; +import 'dart:math' as math; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/node.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_solana/pending_solana_transaction.dart'; import 'package:cw_solana/solana_balance.dart'; +import 'package:cw_solana/solana_exceptions.dart'; import 'package:cw_solana/solana_transaction_model.dart'; import 'package:http/http.dart' as http; import 'package:solana/dto.dart'; @@ -180,7 +181,7 @@ class SolanaWalletClient { bool isOutgoingTx = transfer.source == publicKey.toBase58(); double amount = (double.tryParse(transfer.amount) ?? 0.0) / - pow(10, splTokenDecimal ?? 9); + math.pow(10, splTokenDecimal ?? 9); transactions.add( SolanaTransactionModel( @@ -276,6 +277,7 @@ class SolanaWalletClient { required String destinationAddress, required Ed25519HDKeyPair ownerKeypair, required bool isSendAll, + required double solBalance, String? tokenMint, List references = const [], }) async { @@ -290,6 +292,7 @@ class SolanaWalletClient { ownerKeypair: ownerKeypair, commitment: commitment, isSendAll: isSendAll, + solBalance: solBalance, ); return pendingNativeTokenTransaction; } else { @@ -301,6 +304,7 @@ class SolanaWalletClient { destinationAddress: destinationAddress, ownerKeypair: ownerKeypair, commitment: commitment, + solBalance: solBalance, ); return pendingSPLTokenTransaction; } @@ -353,6 +357,23 @@ class SolanaWalletClient { return fee; } + Future hasSufficientFundsLeftForRent({ + required double inputAmount, + required double solBalance, + required double fee, + }) async { + final rent = + await _client!.getMinimumBalanceForMintRentExemption(commitment: Commitment.confirmed); + + final rentInSol = (rent / lamportsPerSol).toDouble(); + + final remnant = solBalance - (inputAmount + fee); + + if (remnant > rentInSol) return true; + + return false; + } + Future _signNativeTokenTransaction({ required String tokenTitle, required int tokenDecimals, @@ -361,6 +382,7 @@ class SolanaWalletClient { required Ed25519HDKeyPair ownerKeypair, required Commitment commitment, required bool isSendAll, + required double solBalance, }) async { // Convert SOL to lamport int lamports = (inputAmount * lamportsPerSol).toInt(); @@ -378,6 +400,16 @@ class SolanaWalletClient { commitment, ); + bool hasSufficientFundsLeft = await hasSufficientFundsLeftForRent( + inputAmount: inputAmount, + fee: fee, + solBalance: solBalance, + ); + + if (!hasSufficientFundsLeft) { + throw SolanaSignNativeTokenTransactionRentException(); + } + SignedTx signedTx; if (isSendAll) { final feeInLamports = (fee * lamportsPerSol).toInt(); @@ -425,6 +457,7 @@ class SolanaWalletClient { required String destinationAddress, required Ed25519HDKeyPair ownerKeypair, required Commitment commitment, + required double solBalance, }) async { final destinationOwner = Ed25519HDPublicKey.fromBase58(destinationAddress); final mint = Ed25519HDPublicKey.fromBase58(tokenMint); @@ -447,7 +480,7 @@ class SolanaWalletClient { // Throw an appropriate exception if the sender has no associated // token account if (associatedSenderAccount == null) { - throw NoAssociatedTokenAccountException(ownerKeypair.address, mint.toBase58()); + throw SolanaNoAssociatedTokenAccountException(ownerKeypair.address, mint.toBase58()); } try { @@ -457,11 +490,11 @@ class SolanaWalletClient { funder: ownerKeypair, ); } catch (e) { - throw Exception('Insufficient SOL balance to complete this transaction: ${e.toString()}'); + throw SolanaCreateAssociatedTokenAccountException(e.toString()); } // Input by the user - final amount = (inputAmount * pow(10, tokenDecimals)).toInt(); + final amount = (inputAmount * math.pow(10, tokenDecimals)).toInt(); final instruction = TokenInstruction.transfer( source: Ed25519HDPublicKey.fromBase58(associatedSenderAccount.pubkey), @@ -483,6 +516,16 @@ class SolanaWalletClient { commitment, ); + bool hasSufficientFundsLeft = await hasSufficientFundsLeftForRent( + inputAmount: inputAmount, + fee: fee, + solBalance: solBalance, + ); + + if (!hasSufficientFundsLeft) { + throw SolanaSignSPLTokenTransactionRentException(); + } + final signedTx = await _signTransactionInternal( message: message, signers: signers, diff --git a/cw_solana/lib/solana_exceptions.dart b/cw_solana/lib/solana_exceptions.dart index 7409b0500f..888c950685 100644 --- a/cw_solana/lib/solana_exceptions.dart +++ b/cw_solana/lib/solana_exceptions.dart @@ -19,3 +19,20 @@ class SolanaTransactionWrongBalanceException implements Exception { @override String toString() => exceptionMessage; } + +class SolanaSignNativeTokenTransactionRentException implements Exception {} + +class SolanaCreateAssociatedTokenAccountException implements Exception { + final String exceptionMessage; + + SolanaCreateAssociatedTokenAccountException(this.exceptionMessage); +} + +class SolanaSignSPLTokenTransactionRentException implements Exception {} + +class SolanaNoAssociatedTokenAccountException implements Exception { + const SolanaNoAssociatedTokenAccountException(this.account, this.mint); + + final String account; + final String mint; +} diff --git a/cw_solana/lib/solana_wallet.dart b/cw_solana/lib/solana_wallet.dart index c884d8e825..33a2e7df41 100644 --- a/cw_solana/lib/solana_wallet.dart +++ b/cw_solana/lib/solana_wallet.dart @@ -228,6 +228,8 @@ abstract class SolanaWalletBase final walletBalanceForCurrency = balance[transactionCurrency]!.balance; + final solBalance = balance[CryptoCurrency.sol]!.balance; + double totalAmount = 0.0; bool isSendAll = false; @@ -279,6 +281,7 @@ abstract class SolanaWalletBase ? solCredentials.outputs.first.extractedAddress! : solCredentials.outputs.first.address, isSendAll: isSendAll, + solBalance: solBalance, ); return pendingSolanaTransaction; diff --git a/lib/cake_pay/cake_pay_api.dart b/lib/cake_pay/cake_pay_api.dart index cc04a0ca1b..f9aa2f0f12 100644 --- a/lib/cake_pay/cake_pay_api.dart +++ b/lib/cake_pay/cake_pay_api.dart @@ -93,6 +93,9 @@ class CakePayApi { required int quantity, required String userEmail, required String token, + required bool confirmsNoVpn, + required bool confirmsVoidedRefund, + required bool confirmsTermsAgreed, }) async { final uri = Uri.https(baseCakePayUri, createOrderPath); final headers = { @@ -106,7 +109,10 @@ class CakePayApi { 'quantity': quantity, 'user_email': userEmail, 'token': token, - 'send_email': true + 'send_email': true, + 'confirms_no_vpn': confirmsNoVpn, + 'confirms_voided_refund': confirmsVoidedRefund, + 'confirms_terms_agreed': confirmsTermsAgreed, }; try { diff --git a/lib/cake_pay/cake_pay_service.dart b/lib/cake_pay/cake_pay_service.dart index 9e43c23c76..768588775e 100644 --- a/lib/cake_pay/cake_pay_service.dart +++ b/lib/cake_pay/cake_pay_service.dart @@ -90,17 +90,27 @@ class CakePayService { } /// Purchase Gift Card - Future createOrder( - {required int cardId, required String price, required int quantity}) async { + Future createOrder({ + required int cardId, + required String price, + required int quantity, + required bool confirmsNoVpn, + required bool confirmsVoidedRefund, + required bool confirmsTermsAgreed, + }) async { final userEmail = (await secureStorage.read(key: cakePayEmailStorageKey))!; final token = (await secureStorage.read(key: cakePayUserTokenKey))!; return await cakePayApi.createOrder( - apiKey: cakePayApiKey, - cardId: cardId, - price: price, - quantity: quantity, - token: token, - userEmail: userEmail); + apiKey: cakePayApiKey, + cardId: cardId, + price: price, + quantity: quantity, + token: token, + userEmail: userEmail, + confirmsNoVpn: confirmsNoVpn, + confirmsVoidedRefund: confirmsVoidedRefund, + confirmsTermsAgreed: confirmsTermsAgreed, + ); } ///Simulate Purchase Gift Card diff --git a/lib/di.dart b/lib/di.dart index 6ba8b8d0be..358f72a775 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -40,6 +40,7 @@ import 'package:cake_wallet/src/screens/buy/buy_sell_options_page.dart'; import 'package:cake_wallet/src/screens/buy/payment_method_options_page.dart'; import 'package:cake_wallet/src/screens/receive/address_list_page.dart'; import 'package:cake_wallet/src/screens/seed/seed_verification/seed_verification_page.dart'; +import 'package:cake_wallet/src/screens/send/transaction_success_info_page.dart'; import 'package:cake_wallet/src/screens/wallet_list/wallet_list_page.dart'; import 'package:cake_wallet/src/screens/settings/mweb_logs_page.dart'; import 'package:cake_wallet/src/screens/settings/mweb_node_page.dart'; @@ -1176,6 +1177,9 @@ Future setup({ getIt.registerFactoryParam( (seedPhraseLength, _) => PreSeedPage(seedPhraseLength)); + getIt.registerFactoryParam( + (content, _) => TransactionSuccessPage(content: content)); + getIt.registerFactoryParam((trade, _) => TradeDetailsViewModel( tradeForDetails: trade, diff --git a/lib/reactions/on_authentication_state_change.dart b/lib/reactions/on_authentication_state_change.dart index 88b03ca59c..c05f6fb0dc 100644 --- a/lib/reactions/on_authentication_state_change.dart +++ b/lib/reactions/on_authentication_state_change.dart @@ -44,13 +44,16 @@ void startAuthenticationStateChange( } catch (error, stack) { loginError = error; await ExceptionHandler.resetLastPopupDate(); - await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); + await ExceptionHandler.onError( + FlutterErrorDetails(exception: error, stack: stack)); } return; } - if (state == AuthenticationState.allowed) { - if (requireHardwareWalletConnection()) { + if ([AuthenticationState.allowed, AuthenticationState.allowedCreate] + .contains(state)) { + if (state == AuthenticationState.allowed && + requireHardwareWalletConnection()) { await navigatorKey.currentState!.pushNamedAndRemoveUntil( Routes.connectDevices, (route) => false, @@ -58,14 +61,14 @@ void startAuthenticationStateChange( walletType: WalletType.monero, onConnectDevice: (context, ledgerVM) async { monero!.setGlobalLedgerConnection(ledgerVM.connection); - showPopUp( - context: context, - builder: (BuildContext context) => AlertWithOneAction( - alertTitle: S.of(context).proceed_on_device, - alertContent: S.of(context).proceed_on_device_description, - buttonText: S.of(context).cancel, - buttonAction: () => Navigator.of(context).pop()), - ); + showPopUp( + context: context, + builder: (BuildContext context) => AlertWithOneAction( + alertTitle: S.of(context).proceed_on_device, + alertContent: S.of(context).proceed_on_device_description, + buttonText: S.of(context).cancel, + buttonAction: () => Navigator.of(context).pop()), + ); await loadCurrentWallet(); getIt.get().resetCurrentSheet(); await navigatorKey.currentState! diff --git a/lib/router.dart b/lib/router.dart index ee489aad3b..315c171783 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -70,6 +70,7 @@ import 'package:cake_wallet/src/screens/seed/seed_verification/seed_verification import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart'; import 'package:cake_wallet/src/screens/send/send_page.dart'; import 'package:cake_wallet/src/screens/send/send_template_page.dart'; +import 'package:cake_wallet/src/screens/send/transaction_success_info_page.dart'; import 'package:cake_wallet/src/screens/settings/connection_sync_page.dart'; import 'package:cake_wallet/src/screens/settings/desktop_settings/desktop_settings_page.dart'; import 'package:cake_wallet/src/screens/settings/display_settings_page.dart'; @@ -586,6 +587,10 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get(param1: settings.arguments as int)); + case Routes.transactionSuccessPage: + return MaterialPageRoute( + builder: (_) => getIt.get(param1: settings.arguments as String)); + case Routes.backup: return CupertinoPageRoute( fullscreenDialog: true, builder: (_) => getIt.get()); diff --git a/lib/routes.dart b/lib/routes.dart index 8ca888e7bd..517efca296 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -53,6 +53,7 @@ class Routes { static const restoreWalletType = '/restore_wallet_type'; static const restoreWallet = '/restore_wallet'; static const preSeedPage = '/pre_seed_page'; + static const transactionSuccessPage = '/transaction_success_info_page'; static const backup = '/backup'; static const editBackupPassword = '/edit_backup_passowrd'; static const restoreFromBackup = '/restore_from_backup'; diff --git a/lib/src/screens/cake_pay/cards/cake_pay_confirm_purchase_card_page.dart b/lib/src/screens/cake_pay/cards/cake_pay_confirm_purchase_card_page.dart index 9357df2c3f..fc36791047 100644 --- a/lib/src/screens/cake_pay/cards/cake_pay_confirm_purchase_card_page.dart +++ b/lib/src/screens/cake_pay/cards/cake_pay_confirm_purchase_card_page.dart @@ -10,8 +10,10 @@ import 'package:cake_wallet/src/screens/cake_pay/widgets/text_icon_button.dart'; import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; +import 'package:cake_wallet/src/widgets/base_alert_dialog.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; +import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/themes/extensions/picker_theme.dart'; import 'package:cake_wallet/themes/extensions/receive_page_theme.dart'; @@ -23,6 +25,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:mobx/mobx.dart'; +import 'package:url_launcher/url_launcher.dart'; class CakePayBuyCardDetailPage extends BasePage { CakePayBuyCardDetailPage(this.cakePayPurchaseViewModel); @@ -207,8 +210,10 @@ class CakePayBuyCardDetailPage extends BasePage { padding: EdgeInsets.only(bottom: 12), child: Observer(builder: (_) { return LoadingPrimaryButton( - isLoading: cakePayPurchaseViewModel.sendViewModel.state is IsExecutingState, - onPressed: () => purchaseCard(context), + isDisabled: cakePayPurchaseViewModel.isPurchasing, + isLoading: cakePayPurchaseViewModel.isPurchasing || + cakePayPurchaseViewModel.sendViewModel.state is IsExecutingState, + onPressed: () => confirmPurchaseFirst(context), text: S.of(context).purchase_gift_card, color: Theme.of(context).primaryColor, textColor: Colors.white, @@ -253,6 +258,48 @@ class CakePayBuyCardDetailPage extends BasePage { }); } + Future _showconfirmPurchaseFirstAlert(BuildContext context) async { + if (!cakePayPurchaseViewModel.confirmsNoVpn || + !cakePayPurchaseViewModel.confirmsVoidedRefund || + !cakePayPurchaseViewModel.confirmsTermsAgreed) { + await showPopUp( + context: context, + builder: (BuildContext context) => ThreeCheckboxAlert( + alertTitle: S.of(context).cakepay_confirm_purchase, + leftButtonText: S.of(context).cancel, + rightButtonText: S.of(context).confirm, + actionLeftButton: () { + cakePayPurchaseViewModel.isPurchasing = false; + Navigator.of(context).pop(); + }, + actionRightButton: (confirmsNoVpn, confirmsVoidedRefund, confirmsTermsAgreed) { + cakePayPurchaseViewModel.confirmsNoVpn = confirmsNoVpn; + cakePayPurchaseViewModel.confirmsVoidedRefund = confirmsVoidedRefund; + cakePayPurchaseViewModel.confirmsTermsAgreed = confirmsTermsAgreed; + + Navigator.of(context).pop(); + }, + ), + ); + } + + if (cakePayPurchaseViewModel.confirmsNoVpn && + cakePayPurchaseViewModel.confirmsVoidedRefund && + cakePayPurchaseViewModel.confirmsTermsAgreed) { + await purchaseCard(context); + } + } + + Future confirmPurchaseFirst(BuildContext context) async { + bool isLogged = await cakePayPurchaseViewModel.cakePayService.isLogged(); + if (!isLogged) { + Navigator.of(context).pushNamed(Routes.cakePayWelcomePage); + } else { + cakePayPurchaseViewModel.isPurchasing = true; + await _showconfirmPurchaseFirstAlert(context); + } + } + Future purchaseCard(BuildContext context) async { bool isLogged = await cakePayPurchaseViewModel.cakePayService.isLogged(); if (!isLogged) { @@ -263,7 +310,9 @@ class CakePayBuyCardDetailPage extends BasePage { } catch (_) { await cakePayPurchaseViewModel.cakePayService.logout(); } - } + + } + cakePayPurchaseViewModel.isPurchasing = false; } void _showHowToUseCard( @@ -428,3 +477,201 @@ class CakePayBuyCardDetailPage extends BasePage { } } } + +class ThreeCheckboxAlert extends BaseAlertDialog { + ThreeCheckboxAlert({ + required this.alertTitle, + required this.leftButtonText, + required this.rightButtonText, + required this.actionLeftButton, + required this.actionRightButton, + this.alertBarrierDismissible = true, + Key? key, + }); + + final String alertTitle; + final String leftButtonText; + final String rightButtonText; + final VoidCallback actionLeftButton; + final Function(bool, bool, bool) actionRightButton; + final bool alertBarrierDismissible; + + bool checkbox1 = false; + void toggleCheckbox1() => checkbox1 = !checkbox1; + bool checkbox2 = false; + void toggleCheckbox2() => checkbox2 = !checkbox2; + bool checkbox3 = false; + void toggleCheckbox3() => checkbox3 = !checkbox3; + + bool showValidationMessage = true; + + @override + String get titleText => alertTitle; + + @override + bool get isDividerExists => true; + + @override + String get leftActionButtonText => leftButtonText; + + @override + String get rightActionButtonText => rightButtonText; + + @override + VoidCallback get actionLeft => actionLeftButton; + + @override + VoidCallback get actionRight => () { + actionRightButton(checkbox1, checkbox2, checkbox3); + }; + + @override + bool get barrierDismissible => alertBarrierDismissible; + + @override + Widget content(BuildContext context) { + return ThreeCheckboxAlertContent( + checkbox1: checkbox1, + toggleCheckbox1: toggleCheckbox1, + checkbox2: checkbox2, + toggleCheckbox2: toggleCheckbox2, + checkbox3: checkbox3, + toggleCheckbox3: toggleCheckbox3, + ); + } +} + +class ThreeCheckboxAlertContent extends StatefulWidget { + ThreeCheckboxAlertContent({ + required this.checkbox1, + required this.toggleCheckbox1, + required this.checkbox2, + required this.toggleCheckbox2, + required this.checkbox3, + required this.toggleCheckbox3, + Key? key, + }) : super(key: key); + + bool checkbox1; + void Function() toggleCheckbox1; + bool checkbox2; + void Function() toggleCheckbox2; + bool checkbox3; + void Function() toggleCheckbox3; + + @override + _ThreeCheckboxAlertContentState createState() => _ThreeCheckboxAlertContentState( + checkbox1: checkbox1, + toggleCheckbox1: toggleCheckbox1, + checkbox2: checkbox2, + toggleCheckbox2: toggleCheckbox2, + checkbox3: checkbox3, + toggleCheckbox3: toggleCheckbox3, + ); + + static _ThreeCheckboxAlertContentState? of(BuildContext context) { + return context.findAncestorStateOfType<_ThreeCheckboxAlertContentState>(); + } +} + +class _ThreeCheckboxAlertContentState extends State { + _ThreeCheckboxAlertContentState({ + required this.checkbox1, + required this.toggleCheckbox1, + required this.checkbox2, + required this.toggleCheckbox2, + required this.checkbox3, + required this.toggleCheckbox3, + }); + + bool checkbox1; + void Function() toggleCheckbox1; + bool checkbox2; + void Function() toggleCheckbox2; + bool checkbox3; + void Function() toggleCheckbox3; + + bool showValidationMessage = true; + + bool get areAllCheckboxesChecked => checkbox1 && checkbox2 && checkbox3; + + @override + Widget build(BuildContext context) { + return Form( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + StandardCheckbox( + value: checkbox1, + caption: S.of(context).cakepay_confirm_no_vpn, + onChanged: (bool? value) { + setState(() { + checkbox1 = value ?? false; + toggleCheckbox1(); + showValidationMessage = !areAllCheckboxesChecked; + }); + }, + ), + StandardCheckbox( + value: checkbox2, + caption: S.of(context).cakepay_confirm_voided_refund, + onChanged: (bool? value) { + setState(() { + checkbox2 = value ?? false; + toggleCheckbox2(); + showValidationMessage = !areAllCheckboxesChecked; + }); + }, + ), + StandardCheckbox( + value: checkbox3, + caption: S.of(context).cakepay_confirm_terms_agreed, + onChanged: (bool? value) { + setState(() { + checkbox3 = value ?? false; + toggleCheckbox3(); + showValidationMessage = !areAllCheckboxesChecked; + }); + }, + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => launchUrl( + Uri.parse("https://cakepay.com/cakepay-web-terms.txt"), + mode: LaunchMode.externalApplication, + ), + child: Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + S.of(context).settings_terms_and_conditions, + style: TextStyle( + fontSize: 16, + fontFamily: 'Lato', + fontWeight: FontWeight.w400, + color: Theme.of(context).primaryColor, + decoration: TextDecoration.none, + height: 1, + ), + softWrap: true, + ), + ), + ), + if (showValidationMessage) + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + 'Please confirm all checkboxes', + style: TextStyle( + color: Colors.red, + fontSize: 14, + fontFamily: 'Lato', + fontWeight: FontWeight.w400, + decoration: TextDecoration.none, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/src/screens/connect_device/connect_device_page.dart b/lib/src/screens/connect_device/connect_device_page.dart index 109c5eee20..5e94c78a41 100644 --- a/lib/src/screens/connect_device/connect_device_page.dart +++ b/lib/src/screens/connect_device/connect_device_page.dart @@ -22,11 +22,13 @@ class ConnectDevicePageParams { final WalletType walletType; final OnConnectDevice onConnectDevice; final bool allowChangeWallet; + final bool isReconnect; ConnectDevicePageParams({ required this.walletType, required this.onConnectDevice, this.allowChangeWallet = false, + this.isReconnect = false, }); } @@ -34,19 +36,33 @@ class ConnectDevicePage extends BasePage { final WalletType walletType; final OnConnectDevice onConnectDevice; final bool allowChangeWallet; + final bool isReconnect; final LedgerViewModel ledgerVM; ConnectDevicePage(ConnectDevicePageParams params, this.ledgerVM) : walletType = params.walletType, onConnectDevice = params.onConnectDevice, - allowChangeWallet = params.allowChangeWallet; + allowChangeWallet = params.allowChangeWallet, + isReconnect = params.isReconnect; @override - String get title => S.current.restore_title_from_hardware_wallet; + String get title => isReconnect + ? S.current.reconnect_your_hardware_wallet + : S.current.restore_title_from_hardware_wallet; @override - Widget body(BuildContext context) => ConnectDevicePageBody( - walletType, onConnectDevice, allowChangeWallet, ledgerVM); + Widget? leading(BuildContext context) => + !isReconnect ? super.leading(context) : null; + + @override + Widget body(BuildContext context) => PopScope( + canPop: !isReconnect, + child: ConnectDevicePageBody( + walletType, + onConnectDevice, + allowChangeWallet, + ledgerVM, + )); } class ConnectDevicePageBody extends StatefulWidget { @@ -75,6 +91,8 @@ class ConnectDevicePageBodyState extends State { late Timer? _bleStateTimer = null; late StreamSubscription? _bleRefresh = null; + bool longWait = false; + @override void initState() { super.initState(); @@ -89,6 +107,11 @@ class ConnectDevicePageBodyState extends State { _usbRefreshTimer = Timer.periodic(Duration(seconds: 1), (_) => _refreshUsbDevices()); } + + Future.delayed(Duration(seconds: 10), () { + if (widget.ledgerVM.bleIsEnabled && bleDevices.isEmpty) + setState(() => longWait = true); + }); }); } @@ -98,6 +121,8 @@ class ConnectDevicePageBodyState extends State { _bleStateTimer?.cancel(); _usbRefreshTimer?.cancel(); _bleRefresh?.cancel(); + + widget.ledgerVM.stopScanning(); super.dispose(); } @@ -118,12 +143,14 @@ class ConnectDevicePageBodyState extends State { Future _refreshBleDevices() async { try { if (widget.ledgerVM.bleIsEnabled) { - _bleRefresh = widget.ledgerVM - .scanForBleDevices() - .listen((device) => setState(() => bleDevices.add(device))) - ..onError((e) { - throw e.toString(); - }); + _bleRefresh = + widget.ledgerVM.scanForBleDevices().listen((device) => setState(() { + bleDevices.add(device); + if (longWait) longWait = false; + })) + ..onError((e) { + throw e.toString(); + }); _bleRefreshTimer?.cancel(); _bleRefreshTimer = null; } @@ -175,15 +202,21 @@ class ConnectDevicePageBodyState extends State { textAlign: TextAlign.center, ), ), - // DeviceTile( - // onPressed: () => Navigator.of(context).push( - // MaterialPageRoute( - // builder: (BuildContext context) => DebugDevicePage(), - // ), - // ), - // title: "Debug Ledger", - // leading: imageLedger, - // ), + Offstage( + offstage: !longWait, + child: Padding( + padding: EdgeInsets.only(left: 20, right: 20, bottom: 20), + child: Text(S.of(context).if_you_dont_see_your_device, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context) + .extension()! + .titleColor), + textAlign: TextAlign.center, + ), + ), + ), Observer( builder: (_) => Offstage( offstage: widget.ledgerVM.bleIsEnabled, diff --git a/lib/src/screens/dashboard/pages/balance_page.dart b/lib/src/screens/dashboard/pages/balance_page.dart index 46c01254a7..a0886ab9b9 100644 --- a/lib/src/screens/dashboard/pages/balance_page.dart +++ b/lib/src/screens/dashboard/pages/balance_page.dart @@ -320,7 +320,7 @@ class CryptoBalanceWidget extends StatelessWidget { behavior: HitTestBehavior.opaque, onTap: () => launchUrl( Uri.parse( - "https://guides.cakewallet.com/docs/cryptos/bitcoin/#silent-payments"), + "https://docs.cakewallet.com/cryptos/bitcoin#silent-payments"), mode: LaunchMode.externalApplication, ), child: Row( @@ -894,7 +894,7 @@ class BalanceRowWidget extends StatelessWidget { behavior: HitTestBehavior.opaque, onTap: () => launchUrl( Uri.parse( - "https://guides.cakewallet.com/docs/cryptos/litecoin/#mweb"), + "https://docs.cakewallet.com/cryptos/litecoin.html#mweb"), mode: LaunchMode.externalApplication, ), child: Row( diff --git a/lib/src/screens/dashboard/pages/transactions_page.dart b/lib/src/screens/dashboard/pages/transactions_page.dart index 0db9ac35b6..9472110ea7 100644 --- a/lib/src/screens/dashboard/pages/transactions_page.dart +++ b/lib/src/screens/dashboard/pages/transactions_page.dart @@ -53,7 +53,7 @@ class TransactionsPage extends StatelessWidget { onTap: () { try { final uri = Uri.parse( - "https://guides.cakewallet.com/docs/FAQ/why_are_my_funds_not_appearing/"); + "https://docs.cakewallet.com/faq/funds-not-appearing"); launchUrl(uri, mode: LaunchMode.externalApplication); } catch (_) {} }, diff --git a/lib/src/screens/restore/restore_options_page.dart b/lib/src/screens/restore/restore_options_page.dart index 79714aa059..2e9e04acdf 100644 --- a/lib/src/screens/restore/restore_options_page.dart +++ b/lib/src/screens/restore/restore_options_page.dart @@ -56,9 +56,8 @@ class _RestoreOptionsBodyState extends State<_RestoreOptionsBody> { } if (isMoneroOnly) { - // return DeviceConnectionType.supportedConnectionTypes(WalletType.monero, Platform.isIOS) - // .isNotEmpty; - return false; + return DeviceConnectionType.supportedConnectionTypes(WalletType.monero, Platform.isIOS) + .isNotEmpty; } return true; diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index 4b1227751a..ca471c4f23 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -500,95 +500,6 @@ class SendPage extends BasePage { actionRightButton: () async { Navigator.of(_dialogContext).pop(); sendViewModel.commitTransaction(context); - await showPopUp( - context: context, - builder: (BuildContext _dialogContext) { - return Observer(builder: (_) { - final state = sendViewModel.state; - - if (state is FailureState) { - Navigator.of(_dialogContext).pop(); - } - - if (state is TransactionCommitted) { - newContactAddress = - newContactAddress ?? sendViewModel.newContactAddress(); - - if (sendViewModel.coinTypeToSpendFrom != UnspentCoinType.any) { - newContactAddress = null; - } - - final successMessage = S.of(_dialogContext).send_success( - sendViewModel.selectedCryptoCurrency.toString()); - - final waitMessage = sendViewModel.walletType == WalletType.solana - ? '. ${S.of(_dialogContext).waitFewSecondForTxUpdate}' - : ''; - - final newContactMessage = newContactAddress != null && sendViewModel.showAddressBookPopup - ? '\n${S.of(_dialogContext).add_contact_to_address_book}' - : ''; - - String alertContent = - "$successMessage$waitMessage$newContactMessage"; - - if (newContactMessage.isNotEmpty) { - return AlertWithTwoActions( - alertDialogKey: ValueKey('send_page_sent_dialog_key'), - alertTitle: '', - alertContent: alertContent, - rightButtonText: S.of(_dialogContext).add_contact, - leftButtonText: S.of(_dialogContext).ignor, - alertLeftActionButtonKey: - ValueKey('send_page_sent_dialog_ignore_button_key'), - alertRightActionButtonKey: ValueKey( - 'send_page_sent_dialog_add_contact_button_key'), - actionRightButton: () { - Navigator.of(_dialogContext).pop(); - RequestReviewHandler.requestReview(); - Navigator.of(context).pushNamed( - Routes.addressBookAddContact, - arguments: newContactAddress); - newContactAddress = null; - }, - actionLeftButton: () { - Navigator.of(_dialogContext).pop(); - RequestReviewHandler.requestReview(); - newContactAddress = null; - }); - } else { - if (initialPaymentRequest?.callbackMessage?.isNotEmpty ?? - false) { - alertContent = initialPaymentRequest!.callbackMessage!; - } - return AlertWithOneAction( - alertTitle: '', - alertContent: alertContent, - buttonText: S.of(_dialogContext).ok, - buttonAction: () { - Navigator.of(_dialogContext).pop(); - RequestReviewHandler.requestReview(); - }); - } - } - - return Offstage(); - }); - }); - if (state is TransactionCommitted) { - if (initialPaymentRequest?.callbackUrl?.isNotEmpty ?? false) { - // wait a second so it's not as jarring: - await Future.delayed(Duration(seconds: 1)); - try { - launchUrl( - Uri.parse(initialPaymentRequest!.callbackUrl!), - mode: LaunchMode.externalApplication, - ); - } catch (e) { - printV(e); - } - } - } }, actionLeftButton: () => Navigator.of(_dialogContext).pop()); }); @@ -597,7 +508,64 @@ class SendPage extends BasePage { } if (state is TransactionCommitted) { - WidgetsBinding.instance.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) async { + + final successMessage = S.of(context).send_success( + sendViewModel.selectedCryptoCurrency.toString()); + + final waitMessage = sendViewModel.walletType == WalletType.solana + ? '. ${S.of(context).waitFewSecondForTxUpdate}' + : ''; + + String alertContent = "$successMessage$waitMessage"; + + await Navigator.of(context).pushNamed( + Routes.transactionSuccessPage, + arguments: alertContent + ); + + newContactAddress = newContactAddress ?? sendViewModel.newContactAddress(); + if (sendViewModel.coinTypeToSpendFrom != UnspentCoinType.any) newContactAddress = null; + + if (newContactAddress != null && sendViewModel.showAddressBookPopup) { + await showPopUp( + context: context, + builder: (BuildContext _dialogContext) => AlertWithTwoActions( + alertDialogKey: ValueKey('send_page_sent_dialog_key'), + alertTitle: '', + alertContent: S.of(_dialogContext).add_contact_to_address_book, + rightButtonText: S.of(_dialogContext).add_contact, + leftButtonText: S.of(_dialogContext).ignor, + alertLeftActionButtonKey: ValueKey('send_page_sent_dialog_ignore_button_key'), + alertRightActionButtonKey: + ValueKey('send_page_sent_dialog_add_contact_button_key'), + actionRightButton: () { + Navigator.of(_dialogContext).pop(); + RequestReviewHandler.requestReview(); + Navigator.of(context) + .pushNamed(Routes.addressBookAddContact, arguments: newContactAddress); + newContactAddress = null; + }, + actionLeftButton: () { + Navigator.of(_dialogContext).pop(); + RequestReviewHandler.requestReview(); + newContactAddress = null; + })); + } + + if (initialPaymentRequest?.callbackUrl?.isNotEmpty ?? false) { + // wait a second so it's not as jarring: + await Future.delayed(Duration(seconds: 1)); + try { + launchUrl( + Uri.parse(initialPaymentRequest!.callbackUrl!), + mode: LaunchMode.externalApplication, + ); + } catch (e) { + printV(e); + } + } + sendViewModel.clearOutputs(); }); } @@ -612,7 +580,10 @@ class SendPage extends BasePage { alertTitle: S.of(context).proceed_on_device, alertContent: S.of(context).proceed_on_device_description, buttonText: S.of(context).cancel, - buttonAction: () => Navigator.of(context).pop()); + buttonAction: () { + sendViewModel.state = InitialExecutionState(); + Navigator.of(context).pop(); + }); }); }); } diff --git a/lib/src/screens/send/transaction_success_info_page.dart b/lib/src/screens/send/transaction_success_info_page.dart new file mode 100644 index 0000000000..628cc03936 --- /dev/null +++ b/lib/src/screens/send/transaction_success_info_page.dart @@ -0,0 +1,32 @@ +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/src/screens/Info_page.dart'; +import 'package:flutter/cupertino.dart'; + +class TransactionSuccessPage extends InfoPage { + TransactionSuccessPage({required this.content}) + : super( + imageLightPath: 'assets/images/birthday_cake.png', + imageDarkPath: 'assets/images/birthday_cake.png', + ); + + final String content; + + @override + bool get onWillPop => false; + + @override + String get pageTitle => 'Transaction Sent Successfully'; + + @override + String get pageDescription => content; + + @override + String get buttonText => S.current.ok; + + @override + Key? get buttonKey => ValueKey('transaction_success_info_page_button_key'); + + @override + void Function(BuildContext) get onPressed => + (BuildContext context) => Navigator.of(context).pop(); +} diff --git a/lib/src/screens/setup_2fa/setup_2fa.dart b/lib/src/screens/setup_2fa/setup_2fa.dart index 5fa5cabb86..f74c2bf365 100644 --- a/lib/src/screens/setup_2fa/setup_2fa.dart +++ b/lib/src/screens/setup_2fa/setup_2fa.dart @@ -20,7 +20,7 @@ class Setup2FAPage extends BasePage { Widget body(BuildContext context) { final cake2FAGuideTitle = 'Cake 2FA Guide'; final cake2FAGuideUri = - Uri.parse('https://guides.cakewallet.com/docs/advanced-features/authentication'); + Uri.parse('https://docs.cakewallet.com/features/advanced/authentication/'); return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ diff --git a/lib/src/screens/setup_2fa/setup_2fa_qr_page.dart b/lib/src/screens/setup_2fa/setup_2fa_qr_page.dart index 3ce10b596e..48a90b3297 100644 --- a/lib/src/screens/setup_2fa/setup_2fa_qr_page.dart +++ b/lib/src/screens/setup_2fa/setup_2fa_qr_page.dart @@ -6,7 +6,6 @@ import 'package:cake_wallet/src/widgets/standard_list.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; -import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart'; import 'package:cake_wallet/utils/clipboard_util.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/view_model/set_up_2fa_viewmodel.dart'; @@ -30,7 +29,7 @@ class Setup2FAQRPage extends BasePage { width: 16, color: Theme.of(context).extension()!.titleColor); final cake2FAHowToUseUrl = Uri.parse( - 'https://guides.cakewallet.com/docs/advanced-features/authentication/#enabling-cake-2fa'); + 'https://docs.cakewallet.com/features/advanced/authentication/#enabling-cake-2fa'); return Padding( padding: const EdgeInsets.symmetric(horizontal: 24), child: Column( diff --git a/lib/src/screens/support/support_page.dart b/lib/src/screens/support/support_page.dart index 049ab2fb78..88154e91df 100644 --- a/lib/src/screens/support/support_page.dart +++ b/lib/src/screens/support/support_page.dart @@ -70,7 +70,7 @@ class SupportPage extends BasePage { ), title: S.of(context).support_title_guides, description: S.of(context).support_description_guides, - onPressed: () => _launchUrl(supportViewModel.guidesUrl), + onPressed: () => _launchUrl(supportViewModel.docsUrl), ), ), Padding( 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 f26a2a17fd..d44107939e 100644 --- a/lib/src/screens/unspent_coins/unspent_coins_list_page.dart +++ b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart @@ -154,7 +154,7 @@ class UnspentCoinsListFormState extends State { SizedBox(height: 15), Expanded( child: unspentCoinsListViewModel.items.isEmpty - ? Center(child: Text('No unspent coins available\ntry to reconnect',textAlign: TextAlign.center)) + ? Center(child: Text('No unspent coins available',textAlign: TextAlign.center)) : ListView.separated( itemCount: unspentCoinsListViewModel.items.length, separatorBuilder: (_, __) => SizedBox(height: 15), diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart index 63f28d285c..9bf924f61d 100644 --- a/lib/src/screens/wallet_list/wallet_list_page.dart +++ b/lib/src/screens/wallet_list/wallet_list_page.dart @@ -422,8 +422,9 @@ class WalletListBodyState extends State { if (!isAuthenticatedSuccessfully) return; try { - if (widget.walletListViewModel - .requireHardwareWalletConnection(wallet)) { + final requireHardwareWalletConnection = widget.walletListViewModel + .requireHardwareWalletConnection(wallet); + if (requireHardwareWalletConnection) { await Navigator.of(context).pushNamed( Routes.connectDevices, arguments: ConnectDevicePageParams( @@ -445,8 +446,6 @@ class WalletListBodyState extends State { ); } - - changeProcessText( S.of(context).wallet_list_loading_wallet(wallet.name)); await widget.walletListViewModel.loadWallet(wallet); @@ -456,6 +455,9 @@ class WalletListBodyState extends State { if (responsiveLayoutUtil.shouldRenderMobileUI) { WidgetsBinding.instance.addPostFrameCallback((_) { if (this.mounted) { + if (requireHardwareWalletConnection) { + Navigator.of(context).pop(); + } widget.onWalletLoaded.call(context); } }); diff --git a/lib/src/widgets/standard_checkbox.dart b/lib/src/widgets/standard_checkbox.dart index 46c5f8a341..d61b84d1dd 100644 --- a/lib/src/widgets/standard_checkbox.dart +++ b/lib/src/widgets/standard_checkbox.dart @@ -26,7 +26,9 @@ class StandardCheckbox extends StatelessWidget { ], begin: Alignment.centerLeft, end: Alignment.centerRight); final boxBorder = Border.all( - color: borderColor ?? Theme.of(context).extension()!.secondaryTextColor, width: 1.0); + color: borderColor ?? Theme.of(context).extension()!.secondaryTextColor, + width: 1.0, + ); final checkedBoxDecoration = BoxDecoration( gradient: gradientBackground ? baseGradient : null, @@ -41,6 +43,7 @@ class StandardCheckbox extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( height: 24.0, @@ -55,13 +58,22 @@ class StandardCheckbox extends StatelessWidget { : Offstage(), ), if (caption.isNotEmpty) - Padding( + Flexible( + child: Padding( padding: EdgeInsets.only(left: 10), child: Text( caption, + softWrap: true, style: TextStyle( - fontSize: 16.0, color: Theme.of(context).extension()!.titleColor), - )) + fontSize: 16.0, + fontFamily: 'Lato', + fontWeight: FontWeight.normal, + color: Theme.of(context).extension()!.titleColor, + decoration: TextDecoration.none, + ), + ), + ), + ) ], ), ); diff --git a/lib/store/authentication_store.dart b/lib/store/authentication_store.dart index 815b1ed602..db4c4861ec 100644 --- a/lib/store/authentication_store.dart +++ b/lib/store/authentication_store.dart @@ -4,7 +4,7 @@ part 'authentication_store.g.dart'; class AuthenticationStore = AuthenticationStoreBase with _$AuthenticationStore; -enum AuthenticationState { uninitialized, installed, allowed, _reset } +enum AuthenticationState { uninitialized, installed, allowed, allowedCreate, _reset } abstract class AuthenticationStoreBase with Store { AuthenticationStoreBase() : state = AuthenticationState.uninitialized; @@ -23,4 +23,10 @@ abstract class AuthenticationStoreBase with Store { state = AuthenticationState._reset; state = AuthenticationState.allowed; } + + @action + void allowedCreate() { + state = AuthenticationState._reset; + state = AuthenticationState.allowedCreate; + } } diff --git a/lib/view_model/cake_pay/cake_pay_purchase_view_model.dart b/lib/view_model/cake_pay/cake_pay_purchase_view_model.dart index a580db054b..f95f9e2b74 100644 --- a/lib/view_model/cake_pay/cake_pay_purchase_view_model.dart +++ b/lib/view_model/cake_pay/cake_pay_purchase_view_model.dart @@ -49,6 +49,13 @@ abstract class CakePayPurchaseViewModelBase with Store { String get fiatCurrency => paymentCredential.fiatCurrency; + bool confirmsNoVpn = false; + bool confirmsVoidedRefund = false; + bool confirmsTermsAgreed = false; + + @observable + bool isPurchasing = false; + CryptoPaymentData? get cryptoPaymentData { if (order == null) return null; @@ -86,9 +93,13 @@ abstract class CakePayPurchaseViewModelBase with Store { } try { order = await cakePayService.createOrder( - cardId: card.id, - price: paymentCredential.amount.toString(), - quantity: paymentCredential.quantity); + cardId: card.id, + price: paymentCredential.amount.toString(), + quantity: paymentCredential.quantity, + confirmsNoVpn: confirmsNoVpn, + confirmsVoidedRefund: confirmsVoidedRefund, + confirmsTermsAgreed: confirmsTermsAgreed, + ); await confirmSending(); expirationTime = order!.paymentData.expirationTime; updateRemainingTime(); diff --git a/lib/view_model/hardware_wallet/ledger_view_model.dart b/lib/view_model/hardware_wallet/ledger_view_model.dart index 9a4bb6a457..b48f641a21 100644 --- a/lib/view_model/hardware_wallet/ledger_view_model.dart +++ b/lib/view_model/hardware_wallet/ledger_view_model.dart @@ -4,14 +4,18 @@ import 'dart:io'; import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/ethereum/ethereum.dart'; import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/polygon/polygon.dart'; +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/wallet_type_utils.dart'; import 'package:cw_core/hardware/device_connection_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; +import 'package:flutter/widgets.dart'; import 'package:ledger_flutter_plus/ledger_flutter_plus.dart' as sdk; import 'package:mobx/mobx.dart'; @@ -59,15 +63,18 @@ abstract class LedgerViewModelBase with Store { bool _bleIsInitialized = false; Future _initBLE() async { if (bleIsEnabled && !_bleIsInitialized) { - ledgerPlusBLE = sdk.LedgerInterface.ble(onPermissionRequest: (_) async { - Map statuses = await [ - Permission.bluetoothScan, - Permission.bluetoothConnect, - Permission.bluetoothAdvertise, - ].request(); - - return statuses.values.where((status) => status.isDenied).isEmpty; - }); + ledgerPlusBLE = sdk.LedgerInterface.ble( + onPermissionRequest: (_) async { + Map statuses = await [ + Permission.bluetoothScan, + Permission.bluetoothConnect, + Permission.bluetoothAdvertise, + ].request(); + + return statuses.values.where((status) => status.isDenied).isEmpty; + }, + bleOptions: + sdk.BluetoothOptions(maxScanDuration: Duration(minutes: 5))); _bleIsInitialized = true; } } @@ -84,16 +91,26 @@ abstract class LedgerViewModelBase with Store { Stream scanForUsbDevices() => ledgerPlusUSB.scan(); + Future stopScanning() async { + await ledgerPlusBLE.stopScanning(); + if (!Platform.isIOS) { + await ledgerPlusUSB.stopScanning(); + } + } + Future connectLedger(sdk.LedgerDevice device, WalletType type) async { if (isConnected) { try { - await _connection!.disconnect(); + await _connectionChangeListener?.cancel(); + _connectionChangeListener = null; + await _connection!.disconnect().catchError((_) {}); } catch (_) {} } final ledger = device.connectionType == sdk.ConnectionType.ble ? ledgerPlusBLE : ledgerPlusUSB; + if (_connectionChangeListener == null) { _connectionChangeListener = ledger.deviceStateChanges.listen((event) { printV('Ledger Device State Changed: $event'); @@ -101,6 +118,18 @@ abstract class LedgerViewModelBase with Store { _connection = null; if (type == WalletType.monero) { monero!.resetLedgerConnection(); + + Navigator.of( navigatorKey.currentContext!).pushNamed( + Routes.connectDevices, + arguments: ConnectDevicePageParams( + walletType: WalletType.monero, + allowChangeWallet: true, + isReconnect: true, + onConnectDevice: (context, ledgerVM) async { + Navigator.of(context).pop(); + }, + ), + ); } } }); diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index dc3b2701dd..40f877fefe 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -1,4 +1,3 @@ -import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/entities/contact.dart'; import 'package:cake_wallet/entities/evm_transaction_error_fees_handler.dart'; import 'package:cake_wallet/entities/priority_for_wallet_type.dart'; @@ -14,7 +13,6 @@ import 'package:cake_wallet/polygon/polygon.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/solana/solana.dart'; -import 'package:cake_wallet/src/screens/ur/animated_ur_page.dart'; import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/tron/tron.dart'; import 'package:cake_wallet/view_model/contact_list/contact_list_view_model.dart'; @@ -29,6 +27,7 @@ import 'package:cw_core/unspent_coin_type.dart'; import 'package:cake_wallet/view_model/send/output.dart'; import 'package:cake_wallet/view_model/send/send_template_view_model.dart'; import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_solana/solana_exceptions.dart'; import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; @@ -427,7 +426,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor // // state = FailureState(errorMsg); // } else { - state = FailureState(translateErrorMessage(e, wallet.type, wallet.currency)); + state = FailureState(translateErrorMessage(e, wallet.type, wallet.currency)); // } } return null; @@ -487,10 +486,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor try { state = TransactionCommitting(); - + if (pendingTransaction!.shouldCommitUR()) { final urstr = await pendingTransaction!.commitUR(); - final result = await Navigator.of(context).pushNamed(Routes.urqrAnimatedPage, arguments: urstr); + final result = + await Navigator.of(context).pushNamed(Routes.urqrAnimatedPage, arguments: urstr); if (result == null) { state = FailureState("Canceled by user"); return; @@ -507,12 +507,9 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor final descriptionKey = '${pendingTransaction!.id}_${wallet.walletAddresses.primaryAddress}'; _settingsStore.shouldSaveRecipientAddress ? await transactionDescriptionBox.add(TransactionDescription( - id: descriptionKey, - recipientAddress: address, - transactionNote: note)) - : await transactionDescriptionBox.add(TransactionDescription( - id: descriptionKey, - transactionNote: note)); + id: descriptionKey, recipientAddress: address, transactionNote: note)) + : await transactionDescriptionBox + .add(TransactionDescription(id: descriptionKey, transactionNote: note)); } state = TransactionCommitted(); @@ -674,10 +671,26 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor lamportsNeeded != null ? ((lamportsNeeded + 5000) / lamportsPerSol) : 0.0; return S.current.insufficient_lamports(solValueNeeded.toString()); } else { - printV("No match found."); return S.current.insufficient_lamport_for_tx; } } + + if (error is SolanaSignNativeTokenTransactionRentException) { + return S.current.solana_sign_native_transaction_rent_exception; + } + + if (error is SolanaCreateAssociatedTokenAccountException) { + return S.current.solana_create_associated_token_account_exception; + } + + if (error is SolanaSignSPLTokenTransactionRentException) { + return S.current.solana_sign_spl_token_transaction_rent_exception; + } + + if (error is SolanaNoAssociatedTokenAccountException) { + return S.current.solana_no_associated_token_account_exception; + } + if (errorMessage.contains('insufficient funds for rent')) { return S.current.insufficientFundsForRentError; } diff --git a/lib/view_model/support_view_model.dart b/lib/view_model/support_view_model.dart index 45b9cb9bfe..f6f1cba0ff 100644 --- a/lib/view_model/support_view_model.dart +++ b/lib/view_model/support_view_model.dart @@ -31,10 +31,15 @@ abstract class SupportViewModelBase with Store { linkTitle: S.current.apk_update, link: 'https://github.com/cake-tech/cake_wallet/releases'), LinkListItem( - title: 'Telegram Community', - icon: 'assets/images/Telegram.png', - linkTitle: 't.me/cakewallet', - link: 'https://t.me/cakewallet'), + title: 'Discord', + icon: 'assets/images/discord.png', + linkTitle: 'discord.gg/pwmWa6aFpX', + link: 'https://discord.gg/pwmWa6aFpX'), + LinkListItem( + title: 'Telegram', + icon: 'assets/images/Telegram.png', + linkTitle: 't.me/cakewallet', + link: 'https://t.me/cakewalletannouncements'), LinkListItem( title: 'Telegram Support Bot', icon: 'assets/images/Telegram.png', @@ -75,7 +80,7 @@ abstract class SupportViewModelBase with Store { icon: 'assets/images/onramper_dark.png', lightIcon: 'assets/images/onramper_light.png', linkTitle: 'View exchanges', - link: 'https://guides.cakewallet.com/docs/service-support/buy/#onramper'), + link: 'https://docs.cakewallet.com/support/buy/#onramper'), LinkListItem( title: 'DFX', icon: 'assets/images/dfx_dark.png', @@ -103,7 +108,7 @@ abstract class SupportViewModelBase with Store { // link: 'mailto:support@y.at') ]; - final guidesUrl = 'https://guides.cakewallet.com'; + final docsUrl = 'https://docs.cakewallet.com'; String fetchUrl({String locale = "en", String authToken = ""}) { var supportUrl = diff --git a/lib/view_model/wallet_creation_vm.dart b/lib/view_model/wallet_creation_vm.dart index 68548b64a1..c2cfcbd243 100644 --- a/lib/view_model/wallet_creation_vm.dart +++ b/lib/view_model/wallet_creation_vm.dart @@ -8,7 +8,6 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/nano/nano.dart'; import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/settings_store.dart'; -import 'package:cake_wallet/view_model/restore/restore_mode.dart'; import 'package:cake_wallet/view_model/restore/restore_wallet.dart'; import 'package:cake_wallet/view_model/seed_settings_view_model.dart'; import 'package:cw_core/pathForWallet.dart'; @@ -114,7 +113,7 @@ abstract class WalletCreationVMBase with Store { await _walletInfoSource.add(walletInfo); await _appStore.changeCurrentWallet(wallet); getIt.get().registerSyncTask(); - _appStore.authenticationStore.allowed(); + _appStore.authenticationStore.allowedCreate(); state = ExecutedSuccessfullyState(); } catch (e, s) { printV("error: $e"); diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index c1ec483cbe..3a91d2cb0c 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "بطاقات Cake Pay Web", "cake_seeds_save_disclaimer": "يرجى حفظ هذه الكلمات في مكان آمن! ستحتاج إلى هذه الكلمات لاستعادة محفظتك على جهاز جديد.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "أؤكد أنني لا أستخدم وكيلًا أو VPN", + "cakepay_confirm_purchase": "تأكيد الشراء", + "cakepay_confirm_terms_agreed": "أوافق على الشروط والأحكام المقدمة هنا:", + "cakepay_confirm_voided_refund": "أفهم أن محاولات الفداء من بلد محظور سوف تبطل أي استرداد", "cakepay_ios_not_available": "آسف ، بطاقة الهدايا هذه غير متوفرة على iOS. يمكنك شرائه على Android أو من خلال موقعنا بدلاً من ذلك.", "cakepay_prepaid_card": "بطاقة ائتمان CakePay مسبقة الدفع", "camera_consent": ".ﻞﻴﺻﺎﻔﺘﻟﺍ ﻰﻠﻋ ﻝﻮﺼﺤﻠﻟ ﻢﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﺻﻮﺼﺨﻟﺍ ﺔﺳﺎﻴﺳ ﻦﻣ ﻖﻘﺤﺘﻟﺍ ﻰﺟﺮﻳ .${provider} ﻝﻮﻠ", @@ -355,6 +359,7 @@ "how_to_use": " ﻞﻤﻌﺘﺴﺗ ﻒﻴﻛ", "how_to_use_card": "كيفية استخدام هذه البطاقة", "id": "رقم المعرف:", + "if_you_dont_see_your_device": "إذا كنت لا ترى جهازك أعلاه ، فيرجى التأكد من أن دفتر الأستاذ الخاص بك مستيقظًا ومؤمنًا!", "ignor": "تجاهل", "import": "ﺩﺭﻮﺘﺴﻳ", "importNFTs": "NFTs ﺩﺍﺮﻴﺘﺳﺍ", @@ -541,6 +546,7 @@ "recipient_address": "عنوان المستلم", "reconnect": "أعد الاتصال", "reconnect_alert_text": "هل أنت متأكد من رغبتك في إعادة الاتصال؟", + "reconnect_your_hardware_wallet": "أعد توصيل محفظة الأجهزة الخاصة بك", "reconnection": "إعادة الاتصال", "red_dark_theme": "موضوع الظلام الأحمر", "red_light_theme": "موضوع الضوء الأحمر", @@ -749,6 +755,10 @@ "silent_payments_settings": "إعدادات المدفوعات الصامتة", "single_seed_wallets_group": "محافظ بذرة واحدة", "slidable": "قابل للانزلاق", + "solana_create_associated_token_account_exception": "خطأ في إنشاء حساب رمز المرتبط بعنوان المستلم.", + "solana_no_associated_token_account_exception": "لا يوجد حساب مميز مرتبط بهذا العنوان.", + "solana_sign_native_transaction_rent_exception": "لا يمكن إكمال المعاملة. غادر SOL غير كاف للإيجار بعد المعاملة. يرجى أن تصل إلى رصيد SOL أو تقليل كمية SOL التي ترسلها.", + "solana_sign_spl_token_transaction_rent_exception": "لا يمكن إكمال المعاملة. غادر SOL غير كاف للإيجار بعد المعاملة. يرجى أن تصل إلى توازن سولك.", "sort_by": "ترتيب حسب", "spend_key_private": "مفتاح الإنفاق (خاص)", "spend_key_public": "مفتاح الإنفاق (عام)", @@ -761,7 +771,7 @@ "support_description_guides": "توثيق ودعم القضايا المشتركة", "support_description_live_chat": "حرة وسريعة! ممثلو الدعم المدربين متاحون للمساعدة", "support_description_other_links": "انضم إلى مجتمعاتنا أو تصل إلينا شركائنا من خلال أساليب أخرى", - "support_title_guides": "أدلة محفظة كعكة", + "support_title_guides": "مستندات محفظة كعكة", "support_title_live_chat": "الدعم المباشر", "support_title_other_links": "روابط دعم أخرى", "sweeping_wallet": "كنس المحفظة", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index ce79c865df..9d86f74e40 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Онлайн Карти", "cake_seeds_save_disclaimer": "Моля, запазете тези думи на сигурно място! Ще ви трябват тези думи, за да възстановите портфейла си на ново устройство.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Потвърждавам, че не използвам прокси или VPN", + "cakepay_confirm_purchase": "Потвърдете покупката", + "cakepay_confirm_terms_agreed": "Съгласен съм с условията, представени тук:", + "cakepay_confirm_voided_refund": "Разбирам, че опитите за обратно изкупуване от ограничена държава ще анулират всяко възстановяване", "cakepay_ios_not_available": "За съжаление тази карта за подарък не се предлага в iOS. Можете да го закупите на Android или чрез нашия уебсайт вместо това.", "cakepay_prepaid_card": "CakePay предплатена дебитна карта", "camera_consent": "Вашият фотоапарат ще бъде използван за заснемане на изображение с цел идентификация от ${provider}. Моля, проверете тяхната политика за поверителност за подробности.", @@ -355,6 +359,7 @@ "how_to_use": "Как да използвам", "how_to_use_card": "Как се ползва тази карта", "id": "ID: ", + "if_you_dont_see_your_device": "Ако не виждате устройството си по -горе, моля, уверете се, че вашата книга е будна и отключена!", "ignor": "Игнориране", "import": "Импортиране", "importNFTs": "Импортирайте NFT", @@ -541,6 +546,7 @@ "recipient_address": "Адрес на получател", "reconnect": "Reconnect", "reconnect_alert_text": "Сигурни ли сте, че искате да се свържете отново?", + "reconnect_your_hardware_wallet": "Свържете отново хардуерния си портфейл", "reconnection": "Свързване отново", "red_dark_theme": "Червена тъмна тема", "red_light_theme": "Тема на червената светлина", @@ -749,6 +755,10 @@ "silent_payments_settings": "Настройки за безшумни плащания", "single_seed_wallets_group": "Портфейли с единични семена", "slidable": "Плъзгащ се", + "solana_create_associated_token_account_exception": "Грешка Създаване на свързана сметка за жетони за адреса на получател.", + "solana_no_associated_token_account_exception": "Няма свързана сметка за този адрес.", + "solana_sign_native_transaction_rent_exception": "Транзакцията не може да бъде завършена. Недостатъчен сол оставен под наем след транзакция. Любезно допълнете баланса си на SOL или намалете количеството SOL, което изпращате.", + "solana_sign_spl_token_transaction_rent_exception": "Транзакцията не може да бъде завършена. Недостатъчен сол оставен под наем след транзакция. Любезно допълнете баланса си на SOL.", "sort_by": "Сортирай по", "spend_key_private": "Spend key (таен)", "spend_key_public": "Spend key (публичен)", @@ -761,7 +771,7 @@ "support_description_guides": "Документация и подкрепа за общи проблеми", "support_description_live_chat": "Безплатно и бързо! Обучени представители на подкрепата са на разположение за подпомагане", "support_description_other_links": "Присъединете се към нашите общности или се свържете с нас нашите партньори чрез други методи", - "support_title_guides": "Ръководства за портфейл за торта", + "support_title_guides": "Документи за портфейл за торта", "support_title_live_chat": "Подкрепа на живо", "support_title_other_links": "Други връзки за поддръжка", "sweeping_wallet": "Метещ портфейл", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index cbf35aee05..25a4845d9f 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay webové karty", "cake_seeds_save_disclaimer": "Uložte tato slova na bezpečném místě! Tato slova budete potřebovat k obnovení peněženky na novém zařízení.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Potvrzuji, že nepoužívám proxy nebo VPN", + "cakepay_confirm_purchase": "Potvrďte nákup", + "cakepay_confirm_terms_agreed": "Souhlasím s zde uvedenými podmínkami:", + "cakepay_confirm_voided_refund": "Chápu, že pokusy o vykoupení z omezené země zruší jakékoli vrácení peněz", "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ů.", @@ -355,6 +359,7 @@ "how_to_use": "Jak používat", "how_to_use_card": "Jak použít tuto kartu", "id": "ID: ", + "if_you_dont_see_your_device": "Pokud vaše zařízení nevidíte výše, ujistěte se, že vaše kniha je vzhůru a odemknutá!", "ignor": "Ignorovat", "import": "Import", "importNFTs": "Importujte NFT", @@ -541,6 +546,7 @@ "recipient_address": "Adresa příjemce", "reconnect": "Znovu připojit", "reconnect_alert_text": "Opravdu se chcete znovu připojit?", + "reconnect_your_hardware_wallet": "Znovu připojte svou hardwarovou peněženku", "reconnection": "Znovu připojit", "red_dark_theme": "Červené temné téma", "red_light_theme": "Téma červeného světla", @@ -749,6 +755,10 @@ "silent_payments_settings": "Nastavení tichých plateb", "single_seed_wallets_group": "Jednorázové peněženky", "slidable": "Posuvné", + "solana_create_associated_token_account_exception": "Vytvoření chyby přidruženého účtu tokenů pro adresu příjmu.", + "solana_no_associated_token_account_exception": "Pro tuto adresu není přidružen žádný přidružený token.", + "solana_sign_native_transaction_rent_exception": "Transakce nelze dokončit. Po transakci nedostatek Sol odešel k pronájmu. Laskavě doplňte rovnováhu SOL nebo snižte množství SOL, které odesíláte.", + "solana_sign_spl_token_transaction_rent_exception": "Transakce nelze dokončit. Po transakci nedostatek Sol odešel k pronájmu. Laskavě doplňte rovnováhu SOL.", "sort_by": "Seřazeno podle", "spend_key_private": "Klíč pro platby (soukromý)", "spend_key_public": "Klíč pro platby (veřejný)", @@ -761,7 +771,7 @@ "support_description_guides": "Dokumentace a podpora běžných otázek", "support_description_live_chat": "Zdarma a rychle! K dispozici jsou zástupci vyškolených podpůrných podpory", "support_description_other_links": "Připojte se k našim komunitám nebo se k nám oslovte další metody", - "support_title_guides": "Průvodce peněženkami dortu", + "support_title_guides": "Dokumenty peněženky dortu", "support_title_live_chat": "Živá podpora", "support_title_other_links": "Další odkazy na podporu", "sweeping_wallet": "Zametací peněženka", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 2158768048..cf44ab05d2 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay-Webkarten", "cake_seeds_save_disclaimer": "Bitte speichern Sie diese Wörter an einem sicheren Ort! Sie benötigen diese Wörter, um Ihre Brieftasche auf einem neuen Gerät wiederherzustellen.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Ich bestätige, dass ich keinen Proxy oder VPN benutze", + "cakepay_confirm_purchase": "Kauf bestätigen", + "cakepay_confirm_terms_agreed": "Ich stimme den hier vorgestellten Bedingungen zu:", + "cakepay_confirm_voided_refund": "Ich verstehe", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Wie benutzt man", "how_to_use_card": "Wie man diese Karte benutzt", "id": "ID: ", + "if_you_dont_see_your_device": "Wenn Sie Ihr Gerät nicht sehen, stellen Sie bitte sicher, dass Ihr Ledger an und entsperrt ist!", "ignor": "Ignorieren", "import": "Importieren", "importNFTs": "NFTs importieren", @@ -542,6 +547,7 @@ "recipient_address": "Empfängeradresse", "reconnect": "Erneut verbinden", "reconnect_alert_text": "Sind Sie sicher, dass Sie sich neu verbinden möchten?", + "reconnect_your_hardware_wallet": "Hardware-Wallet neu verbinden", "reconnection": "Neu verbinden", "red_dark_theme": "Red Dark Thema", "red_light_theme": "Red Light Thema", @@ -750,6 +756,10 @@ "silent_payments_settings": "Einstellungen für stille Zahlungen", "single_seed_wallets_group": "Einzelne Wallets", "slidable": "Verschiebbar", + "solana_create_associated_token_account_exception": "Fehler beim Erstellen des zugehörigen Token -Kontos für die Empfängeradresse.", + "solana_no_associated_token_account_exception": "Für diese Adresse ist kein Token -Konto zugeordnet.", + "solana_sign_native_transaction_rent_exception": "Transaktion kann nicht abgeschlossen werden. Unzureichende Sol ließen nach der Transaktion zur Miete gelassen. Bitte geben Sie Ihre SOL -Balance auf oder reduzieren Sie die Menge an SOL, die Sie senden.", + "solana_sign_spl_token_transaction_rent_exception": "Transaktion kann nicht abgeschlossen werden. Unzureichende Sol ließen nach der Transaktion zur Miete gelassen. Bitte geben Sie Ihre SOL -Balance auf.", "sort_by": "Sortiere nach", "spend_key_private": "Spend Key (geheim)", "spend_key_public": "Spend Key (öffentlich)", @@ -762,7 +772,7 @@ "support_description_guides": "Dokumentation und Hilfe für bekannte Probleme", "support_description_live_chat": "Kostenlos und schnell! Ausgebildete Mitarbeiter stehen zur Unterstützung bereit, um zu helfen", "support_description_other_links": "Treten Sie unseren Communities bei oder erreichen Sie uns oder unsere Partner über andere Methoden", - "support_title_guides": "Cake Wallet Guides", + "support_title_guides": "Kuchenbrieftasche Docs", "support_title_live_chat": "Live Support", "support_title_other_links": "Andere Support-Links", "sweeping_wallet": "Wallet leeren", @@ -978,4 +988,4 @@ "you_will_get": "Konvertieren zu", "you_will_send": "Konvertieren von", "yy": "YY" -} \ No newline at end of file +} diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 6fdc8c23c4..69ba98f349 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_seeds_save_disclaimer": "Please save these words in a secure place! You will need these words to restore your wallet on a new device.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "I confirm I am not using a Proxy or VPN", + "cakepay_confirm_purchase": "Confirm Purchase", + "cakepay_confirm_terms_agreed": "I agree to the terms and conditions presented here:", + "cakepay_confirm_voided_refund": "I understand redemption attempts from a restricted country will void any refund", "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.", @@ -355,6 +359,7 @@ "how_to_use": "How to use", "how_to_use_card": "How to use this card", "id": "ID: ", + "if_you_dont_see_your_device": "If you don't see your device above, please be sure your Ledger is awake and unlocked!", "ignor": "Ignore", "import": "Import", "importNFTs": "Import NFTs", @@ -541,6 +546,7 @@ "recipient_address": "Recipient address", "reconnect": "Reconnect", "reconnect_alert_text": "Are you sure you want to reconnect?", + "reconnect_your_hardware_wallet": "Reconnect your Hardware Wallet", "reconnection": "Reconnection", "red_dark_theme": "Red Dark Theme", "red_light_theme": "Red Light Theme", @@ -749,6 +755,10 @@ "silent_payments_settings": "Silent Payments settings", "single_seed_wallets_group": "Single Seed Wallets", "slidable": "Slidable", + "solana_create_associated_token_account_exception": "Error creating associated token account for receipient address.", + "solana_no_associated_token_account_exception": "There is no associated token account for this address.", + "solana_sign_native_transaction_rent_exception": "Transaction cannot be completed. Insufficient SOL left for rent after transaction. Kindly top up your SOL balance or reduce the amount of SOL you are sending.", + "solana_sign_spl_token_transaction_rent_exception": "Transaction cannot be completed. Insufficient SOL left for rent after transaction. Kindly top up your SOL balance.", "sort_by": "Sort by", "spend_key_private": "Spend key (private)", "spend_key_public": "Spend key (public)", @@ -761,7 +771,7 @@ "support_description_guides": "Documentation and support for common issues", "support_description_live_chat": "Free and fast! Trained support representatives are available to assist", "support_description_other_links": "Join our communities or reach us or our partners through other methods", - "support_title_guides": "Cake Wallet guides", + "support_title_guides": "Cake Wallet docs", "support_title_live_chat": "Live support", "support_title_other_links": "Other support links", "sweeping_wallet": "Sweeping wallet", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 0ae05e090a..3ab98c5f5d 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Tarjetas Web Cake Pay", "cake_seeds_save_disclaimer": "¡Guarde estas palabras en un lugar seguro! Necesitará estas palabras para restaurar su billetera en un nuevo dispositivo.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Confirmo que no estoy usando un proxy o VPN", + "cakepay_confirm_purchase": "Confirmar la compra", + "cakepay_confirm_terms_agreed": "Estoy de acuerdo con los términos y condiciones presentados aquí:", + "cakepay_confirm_voided_refund": "Entiendo que los intentos de redención de un país restringido anularán cualquier reembolso", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Cómo utilizar", "how_to_use_card": "Cómo usar esta tarjeta", "id": "ID: ", + "if_you_dont_see_your_device": "Si no ve su dispositivo arriba, ¡asegúrese de que su libro mayor esté despierto y desbloqueado!", "ignor": "Pasar por alto", "import": "Importar", "importNFTs": "Importar NFT", @@ -542,6 +547,7 @@ "recipient_address": "Dirección del receptor", "reconnect": "Volver a conectar", "reconnect_alert_text": "¿Estás seguro de reconectar?", + "reconnect_your_hardware_wallet": "Vuelva a conectar su billetera de hardware", "reconnection": "Reconexión", "red_dark_theme": "Tema rojo oscuro", "red_light_theme": "Tema de la luz roja", @@ -750,6 +756,10 @@ "silent_payments_settings": "Configuración de pagos silenciosos", "single_seed_wallets_group": "Billeteras de semillas individuales", "slidable": "deslizable", + "solana_create_associated_token_account_exception": "Error a crear una cuenta de token asociada para la dirección recibida.", + "solana_no_associated_token_account_exception": "No hay una cuenta de token asociada para esta dirección.", + "solana_sign_native_transaction_rent_exception": "La transacción no se puede completar. Sol insuficiente que queda en alquiler después de la transacción. Por favor, supere su saldo de sol o reduzca la cantidad de sol que está enviando.", + "solana_sign_spl_token_transaction_rent_exception": "La transacción no se puede completar. Sol insuficiente que queda en alquiler después de la transacción. Por favor, supere su balance de sol.", "sort_by": "Ordenar por", "spend_key_private": "Llave de gasto (privada)", "spend_key_public": "Llave de gasto (pública)", @@ -762,7 +772,7 @@ "support_description_guides": "Documentación y apoyo para problemas comunes", "support_description_live_chat": "¡GRATIS y RÁPIDO! Los representantes de apoyo capacitado están disponibles para ayudar", "support_description_other_links": "Únete a nuestras comunidades o comunícate con nosotros nuestros socios a través de otros métodos", - "support_title_guides": "Guías de billetera para pastel", + "support_title_guides": "Documentos de billetera de pastel", "support_title_live_chat": "Soporte en tiempo real", "support_title_other_links": "Otros enlaces de soporte", "sweeping_wallet": "Barrer billetera (gastar todos los fondos disponibles)", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 38afd28929..50fb6c3dbe 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cartes Web Cake Pay", "cake_seeds_save_disclaimer": "Veuillez enregistrer ces mots dans un endroit sécurisé! Vous aurez besoin de ces mots pour restaurer votre portefeuille sur un nouvel appareil.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Je confirme que je n'utilise pas de proxy ou de VPN", + "cakepay_confirm_purchase": "Confirmer l'achat", + "cakepay_confirm_terms_agreed": "J'accepte les termes et conditions présentés ici:", + "cakepay_confirm_voided_refund": "Je comprends que les tentatives de rachat d'un pays restreint annulent tout remboursement", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Comment utiliser", "how_to_use_card": "Comment utiliser cette carte", "id": "ID : ", + "if_you_dont_see_your_device": "Si vous ne voyez pas votre appareil ci-dessus, assurez-vous que votre grand livre est éveillé et déverrouillé!", "ignor": "Ignorer", "import": "Importer", "importNFTs": "Importer des NFT", @@ -541,6 +546,7 @@ "recipient_address": "Adresse bénéficiaire", "reconnect": "Reconnecter", "reconnect_alert_text": "Êtes vous certain de vouloir vous reconnecter ?", + "reconnect_your_hardware_wallet": "Reconnectez votre portefeuille matériel", "reconnection": "Reconnexion", "red_dark_theme": "Thème rouge sombre", "red_light_theme": "Thème rouge clair", @@ -749,6 +755,10 @@ "silent_payments_settings": "Paramètres de paiement silencieux", "single_seed_wallets_group": "Portefeuilles de semences simples", "slidable": "Glissable", + "solana_create_associated_token_account_exception": "Création d'erreur Création de jetons associés pour l'adresse détenue.", + "solana_no_associated_token_account_exception": "Il n'y a pas de compte de jeton associé pour cette adresse.", + "solana_sign_native_transaction_rent_exception": "La transaction ne peut pas être terminée. Sol insuffisant laissé à la location après la transaction. Veuillez compléter votre solde SOL ou réduire la quantité de Sol que vous envoyez.", + "solana_sign_spl_token_transaction_rent_exception": "La transaction ne peut pas être terminée. Sol insuffisant laissé à la location après la transaction. Veuillez compléter votre solde de Sol.", "sort_by": "Trier par", "spend_key_private": "Clef de dépense (spend key) (privée)", "spend_key_public": "Clef de dépense (spend key) (publique)", @@ -761,7 +771,7 @@ "support_description_guides": "Documentation et support pour les problèmes communs", "support_description_live_chat": "GRATUIT ET RAPIDE ! Des représentants de soutien formé sont disponibles pour aider", "support_description_other_links": "Rejoignez nos communautés ou contactez-nous ou nos partenaires à travers d'autres méthodes", - "support_title_guides": "Guides de Cake Wallet", + "support_title_guides": "Docs de portefeuille à gâteau", "support_title_live_chat": "Support en direct", "support_title_other_links": "Autres liens d'assistance", "sweeping_wallet": "Portefeuille (wallet) de consolidation", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 902017916e..a532a54b79 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_seeds_save_disclaimer": "Da fatan za a ceci waɗannan kalmomin a cikin amintaccen wuri! Kuna buƙatar waɗannan kalmomin don dawo da walat ɗinku a kan sabon na'ura.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Na tabbatar ba na amfani da wakili ko VPN", + "cakepay_confirm_purchase": "Tabbatar da sayan", + "cakepay_confirm_terms_agreed": "Na yarda da sharuɗɗan da sharuɗɗan da aka gabatar anan:", + "cakepay_confirm_voided_refund": "Na fahimci fansa daga ƙasar da aka ƙuntata ba za ta yi amfani da wani maida ba", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Yadda ake amfani da shi", "how_to_use_card": "Yadda ake amfani da wannan kati", "id": "ID:", + "if_you_dont_see_your_device": "Idan baku ga na'urarka da ke sama ba, da fatan za a tabbata Ledger dinku yana farkawa kuma a buɗe!", "ignor": "Yi watsi da shi", "import": "Shigo da", "importNFTs": "Shigo da NFTs", @@ -543,6 +548,7 @@ "recipient_address": "Adireshin mai karɓa", "reconnect": "Sake haɗawa", "reconnect_alert_text": "Shin kun tabbata kuna son sake haɗawa?", + "reconnect_your_hardware_wallet": "Sake kunnawa kayan aiki", "reconnection": "Sake haɗawa", "red_dark_theme": "Ja duhu taken", "red_light_theme": "Ja mai haske", @@ -751,6 +757,10 @@ "silent_payments_settings": "Saitunan Silent", "single_seed_wallets_group": "Guaro", "slidable": "Mai iya zamewa", + "solana_create_associated_token_account_exception": "Kuskuren ƙirƙirar asusun Asusun da aka danganta don Adireshin karɓar karɓa.", + "solana_no_associated_token_account_exception": "Babu wani haɗin yanar gizo mai alaƙa don wannan adireshin.", + "solana_sign_native_transaction_rent_exception": "Ma'amala ba za a iya kammala ba. Rashin cancanta na Sol ya bar haya bayan ma'amala. Da kyau a saman ma'auni na Solku ko rage adadin Sol da kuke aikawa.", + "solana_sign_spl_token_transaction_rent_exception": "Ma'amala ba za a iya kammala ba. Rashin cancanta na Sol ya bar haya bayan ma'amala. Da kyau sama da ma'auni na Sol.", "sort_by": "Kasa", "spend_key_private": "makullin biya (maɓallin kalmar sirri)", "spend_key_public": "makullin biya (maɓallin jama'a)", @@ -763,7 +773,7 @@ "support_description_guides": "Tallafi da tallafi don batutuwa na yau da kullun", "support_description_live_chat": "Kyauta da sauri! An horar da wakilan tallafi na tallafi don taimakawa", "support_description_other_links": "Kasance tare da al'ummominmu ko kuma ka kai mu abokanmu ta hanyar wasu hanyoyi", - "support_title_guides": "Jagorar Cake", + "support_title_guides": "Docs Bakin", "support_title_live_chat": "Tallafi na Live", "support_title_other_links": "Sauran hanyoyin tallafi", "sweeping_wallet": "Kashi na kasa", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 4fa9c13de1..b20291df71 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "केक भुगतान वेब कार्ड", "cake_seeds_save_disclaimer": "कृपया इन शब्दों को सुरक्षित स्थान पर सहेजें! एक नए डिवाइस पर अपने बटुए को पुनर्स्थापित करने के लिए आपको इन शब्दों की आवश्यकता होगी।", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "मैं पुष्टि करता हूं कि मैं एक प्रॉक्सी या वीपीएन का उपयोग नहीं कर रहा हूं", + "cakepay_confirm_purchase": "खरीद की पुष्टि करें", + "cakepay_confirm_terms_agreed": "मैं यहां प्रस्तुत नियमों और शर्तों से सहमत हूं:", + "cakepay_confirm_voided_refund": "मैं समझता हूं कि एक प्रतिबंधित देश से मोचन प्रयास किसी भी धनवापसी को शून्य कर देंगे", "cakepay_ios_not_available": "क्षमा करें, यह उपहार कार्ड iOS पर उपलब्ध नहीं है। आप इसे Android पर या हमारी वेबसाइट के बजाय खरीद सकते हैं।", "cakepay_prepaid_card": "केकपे प्रीपेड डेबिट कार्ड", "camera_consent": "आपके कैमरे का उपयोग ${provider} द्वारा पहचान उद्देश्यों के लिए एक छवि कैप्चर करने के लिए किया जाएगा। विवरण के लिए कृपया उनकी गोपनीयता नीति जांचें।", @@ -355,6 +359,7 @@ "how_to_use": "का उपयोग कैसे करें", "how_to_use_card": "इस कार्ड का उपयोग कैसे करें", "id": "ID: ", + "if_you_dont_see_your_device": "यदि आप अपने डिवाइस को ऊपर नहीं देखते हैं, तो कृपया सुनिश्चित करें कि आपका लेजर जागृत और अनलॉक हो गया है!", "ignor": "नज़रअंदाज़ करना", "import": "आयात", "importNFTs": "एनएफटी आयात करें", @@ -543,6 +548,7 @@ "recipient_address": "प्राप्तकर्ता का पता", "reconnect": "रिकनेक्ट", "reconnect_alert_text": "क्या आप पुन: कनेक्ट होना सुनिश्चित करते हैं?", + "reconnect_your_hardware_wallet": "अपने हार्डवेयर वॉलेट को फिर से कनेक्ट करें", "reconnection": "पुनर्संयोजन", "red_dark_theme": "लाल डार्क थीम", "red_light_theme": "लाल प्रकाश थीम", @@ -751,6 +757,10 @@ "silent_payments_settings": "मूक भुगतान सेटिंग्स", "single_seed_wallets_group": "एकल बीज बटुए", "slidable": "फिसलने लायक", + "solana_create_associated_token_account_exception": "रसीद पते के लिए संबद्ध टोकन खाता बनाने में त्रुटि।", + "solana_no_associated_token_account_exception": "इस पते के लिए कोई जुड़ा हुआ टोकन खाता नहीं है।", + "solana_sign_native_transaction_rent_exception": "लेन -देन पूरा नहीं किया जा सकता है। अपर्याप्त सोल लेनदेन के बाद किराए के लिए छोड़ दिया। कृपया अपने सोल बैलेंस को टॉप करें या आपके द्वारा भेजे जा रहे सोल की मात्रा को कम करें।", + "solana_sign_spl_token_transaction_rent_exception": "लेन -देन पूरा नहीं किया जा सकता है। अपर्याप्त सोल लेनदेन के बाद किराए के लिए छोड़ दिया। कृपया अपने सोल बैलेंस को ऊपर रखें।", "sort_by": "इसके अनुसार क्रमबद्ध करें", "spend_key_private": "खर्च करना (निजी)", "spend_key_public": "खर्च करना (जनता)", @@ -763,7 +773,7 @@ "support_description_guides": "सामान्य मुद्दों के लिए प्रलेखन और समर्थन", "support_description_live_chat": "मुक्त और तेजी से! प्रशिक्षित सहायता प्रतिनिधि सहायता के लिए उपलब्ध हैं", "support_description_other_links": "हमारे समुदायों में शामिल हों या अन्य तरीकों के माध्यम से हमारे साथी तक पहुंचें", - "support_title_guides": "केक वॉलेट गाइड", + "support_title_guides": "केक बटुए डॉक्स", "support_title_live_chat": "लाइव सहायता", "support_title_other_links": "अन्य समर्थन लिंक", "sweeping_wallet": "स्वीपिंग वॉलेट", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 91197d99cf..9b228d8434 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Web kartice", "cake_seeds_save_disclaimer": "Molimo spremite ove riječi na sigurno mjesto! Trebat će vam ove riječi da biste vratili novčanik na novi uređaj.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Potvrđujem da ne koristim proxy ili vpn", + "cakepay_confirm_purchase": "Potvrdi kupnju", + "cakepay_confirm_terms_agreed": "Slažem se s ovdje predstavljenim uvjetima:", + "cakepay_confirm_voided_refund": "Razumijem da će pokušaji otkupa od ograničene zemlje poništiti bilo koji povrat novca", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Kako koristiti", "how_to_use_card": "Kako koristiti ovu karticu", "id": "ID: ", + "if_you_dont_see_your_device": "Ako svoj uređaj ne vidite gore, budite sigurni da je vaša knjiga budna i otključana!", "ignor": "Zanemariti", "import": "Uvoz", "importNFTs": "Uvoz NFT-ova", @@ -541,6 +546,7 @@ "recipient_address": "Primateljeva adresa", "reconnect": "Ponovno povezivanje", "reconnect_alert_text": "Jeste li sigurni da se želite ponovno povezati?", + "reconnect_your_hardware_wallet": "Ponovno spojite svoj hardverski novčanik", "reconnection": "Ponovno povezivanje", "red_dark_theme": "Crvena tamna tema", "red_light_theme": "Tema crvenog svjetla", @@ -749,6 +755,10 @@ "silent_payments_settings": "Postavke tihih plaćanja", "single_seed_wallets_group": "Jednostruki novčanici", "slidable": "Klizna", + "solana_create_associated_token_account_exception": "Pogreška u stvaranju povezanog token računa za adresu primanja.", + "solana_no_associated_token_account_exception": "Za ovu adresu ne postoji povezani token račun.", + "solana_sign_native_transaction_rent_exception": "Transakcija se ne može završiti. Nedovoljno sol ostao je za najam nakon transakcije. Ljubazno nadopunite svoj SOL saldo ili smanjite količinu SOL -a koju šaljete.", + "solana_sign_spl_token_transaction_rent_exception": "Transakcija se ne može završiti. Nedovoljno sol ostao je za najam nakon transakcije. Ljubazno nadopunite svoju sol ravnotežu.", "sort_by": "Poredaj po", "spend_key_private": "Spend key (privatni)", "spend_key_public": "Spend key (javni)", @@ -761,7 +771,7 @@ "support_description_guides": "Dokumentacija i podrška za uobičajena pitanja", "support_description_live_chat": "Besplatno i brzo! Obučeni predstavnici podrške dostupni su za pomoć", "support_description_other_links": "Pridružite se našim zajednicama ili nam dosegnu naše partnere drugim metodama", - "support_title_guides": "Vodiči za torte", + "support_title_guides": "Dokumenti s kolačem kolača", "support_title_live_chat": "Podrška uživo", "support_title_other_links": "Ostale veze za podršku", "sweeping_wallet": "Čisti novčanik", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index a802bbbe2d..668c99a144 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Վեբ Քարտեր", "cake_seeds_save_disclaimer": "Խնդրում ենք պահպանել այս բառերը անվտանգ տեղում: Ձեզ հարկավոր կլինի այս բառերը `ձեր դրամապանակը նոր սարքում վերականգնելու համար:", "cake_wallet": "Cake Գաղտնապահոց", + "cakepay_confirm_no_vpn": "Ես հաստատում եմ, որ ես չեմ օգտագործում վստահված անձ կամ VPN", + "cakepay_confirm_purchase": "Հաստատեք գնումը", + "cakepay_confirm_terms_agreed": "Ես համաձայն եմ այստեղ ներկայացված պայմաններին.", + "cakepay_confirm_voided_refund": "Ես հասկանում եմ, որ սահմանափակված երկրի մարման փորձերը կվերականգնեն ցանկացած փոխհատուցում", "cakepay_ios_not_available": "Ներեցեք, այս նվեր քարտը հասանելի չէ iOS- ում: Փոխարենը կարող եք այն գնել Android- ում կամ մեր կայքում:", "cakepay_prepaid_card": "CakePay Նախավճարային Դեբետային Քարտ", "camera_consent": "Ձեր տեսախցիկը կօգտագործվի ${provider}-ի կողմից ինքնությունը հաստատելու նպատակով: Խնդրում ենք ծանոթանալ նրանց Գաղտնիության Քաղաքականության հետ:", @@ -355,6 +359,7 @@ "how_to_use": "Ինչպես օգտագործել", "how_to_use_card": "Ինչպես օգտագործել այս քարտը", "id": "ID: ", + "if_you_dont_see_your_device": "Եթե ​​ձեր սարքը վերեւում չեք տեսնում, համոզվեք, որ ձեր Ledger- ը արթուն է եւ բացված:", "ignor": "Անտեսել", "import": "Ներմուծել", "importNFTs": "Ներմուծել NFT-ներ", @@ -541,6 +546,7 @@ "recipient_address": "Ստացողի հասցե", "reconnect": "Վերակապվել", "reconnect_alert_text": "Դուք վստահ եք, որ ուզում եք վերակապվել?", + "reconnect_your_hardware_wallet": "Միացրեք ձեր ապարատային դրամապանակը", "reconnection": "Վերակապում", "red_dark_theme": "Կարմիր մութ տեսք", "red_light_theme": "Կարմիր պայծառ տեսք", @@ -749,6 +755,10 @@ "silent_payments_settings": "Լուռ Վճարումներ Կարգավորումներ", "single_seed_wallets_group": "Մեկ սերմերի դրամապանակներ", "slidable": "Սահելի", + "solana_create_associated_token_account_exception": "Recesient Advent- ի համար հարակից նշանների հաշիվ ստեղծելու սխալ:", + "solana_no_associated_token_account_exception": "Այս հասցեի համար կապված նշանների հաշիվ չկա:", + "solana_sign_native_transaction_rent_exception": "Գործարքը հնարավոր չէ լրացնել: Անբավարար սոլը գործարքից հետո վարձով է մնացել: Սիրով վերացրեք ձեր SOL հավասարակշռությունը կամ նվազեցրեք ձեր ուղարկած սոլի քանակը:", + "solana_sign_spl_token_transaction_rent_exception": "Գործարքը հնարավոր չէ լրացնել: Անբավարար սոլը գործարքից հետո վարձով է մնացել: Սիրով վերացրեք ձեր SOL հավասարակշռությունը:", "sort_by": "Դասավորել ըստ", "spend_key_private": "Վճարման բանալի (գախտնի)", "spend_key_public": "Վճարման բանալի (հանրային)", @@ -761,7 +771,7 @@ "support_description_guides": "Տարածված խնդիրների փաստաթղթավորում և աջակցություն", "support_description_live_chat": "Անվճար և արագ աջակցություն! Պատրաստված մասնագետները պատրաստ են օգնել", "support_description_other_links": "Միացեք մեր համայնքին կամ հասեք մեզ այլ միջոցներով", - "support_title_guides": "Cake Wallet ուղեցույց", + "support_title_guides": "Տորթ դրամապանակի փաստաթղթեր", "support_title_live_chat": "Անմիջական աջակցություն", "support_title_other_links": "Այլ աջակցության հղումներ", "sweeping_wallet": "Դրամապանակը մաքրվում է", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index d4388c454a..3102ea2e0b 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Kartu Web Cake Pay", "cake_seeds_save_disclaimer": "Harap simpan kata -kata ini di tempat yang aman! Anda akan membutuhkan kata -kata ini untuk mengembalikan dompet Anda pada perangkat baru.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Saya mengkonfirmasi saya tidak menggunakan proxy atau vpn", + "cakepay_confirm_purchase": "Konfirmasi pembelian", + "cakepay_confirm_terms_agreed": "Saya setuju dengan syarat dan ketentuan yang disajikan di sini:", + "cakepay_confirm_voided_refund": "Saya mengerti upaya penebusan dari negara terbatas akan membatalkan pengembalian dana", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Cara Penggunaan", "how_to_use_card": "Bagaimana menggunakan kartu ini", "id": "ID: ", + "if_you_dont_see_your_device": "Jika Anda tidak melihat perangkat Anda di atas, pastikan buku besar Anda terjaga dan tidak terkunci!", "ignor": "Abaikan", "import": "Impor", "importNFTs": "Impor NFT", @@ -543,6 +548,7 @@ "recipient_address": "Alamat penerima", "reconnect": "Sambungkan kembali", "reconnect_alert_text": "Apakah Anda yakin ingin menyambungkan kembali?", + "reconnect_your_hardware_wallet": "Hubungkan kembali dompet perangkat keras Anda", "reconnection": "Koneksi kembali", "red_dark_theme": "Tema gelap merah", "red_light_theme": "Tema lampu merah", @@ -752,6 +758,10 @@ "silent_payments_settings": "Pengaturan pembayaran diam", "single_seed_wallets_group": "Dompet biji tunggal", "slidable": "Dapat digeser", + "solana_create_associated_token_account_exception": "Kesalahan Membuat Akun Token Terkait untuk Alamat Penerima.", + "solana_no_associated_token_account_exception": "Tidak ada akun token terkait untuk alamat ini.", + "solana_sign_native_transaction_rent_exception": "Transaksi tidak dapat diselesaikan. SOL yang tidak mencukupi pergi untuk disewa setelah transaksi. Mohon tambah saldo SOL Anda atau kurangi jumlah SOL yang Anda kirim.", + "solana_sign_spl_token_transaction_rent_exception": "Transaksi tidak dapat diselesaikan. SOL yang tidak mencukupi pergi untuk disewa setelah transaksi. Mohon tambah saldo SOL Anda.", "sort_by": "Sortir dengan", "spend_key_private": "Kunci pengeluaran (privat)", "spend_key_public": "Kunci pengeluaran (publik)", @@ -764,7 +774,7 @@ "support_description_guides": "Dokumentasi dan dukungan untuk masalah umum", "support_description_live_chat": "Gratis dan Cepat! Perwakilan dukungan terlatih tersedia untuk membantu", "support_description_other_links": "Bergabunglah dengan komunitas kami atau hubungi kami mitra kami melalui metode lain", - "support_title_guides": "Panduan Dompet Kue", + "support_title_guides": "DOKS DOKO CAKE", "support_title_live_chat": "Dukungan langsung", "support_title_other_links": "Tautan dukungan lainnya", "sweeping_wallet": "Dompet menyapu", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index e715a94736..cbeaa191d1 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Carte Web Cake Pay", "cake_seeds_save_disclaimer": "Si prega di salvare queste parole in un posto sicuro! Avrai bisogno di queste parole per ripristinare il portafoglio su un nuovo dispositivo.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Conferma che non sto usando un proxy o una VPN", + "cakepay_confirm_purchase": "Conferma l'acquisto", + "cakepay_confirm_terms_agreed": "Accetto i termini e le condizioni presentati qui:", + "cakepay_confirm_voided_refund": "Capisco che i tentativi di rimborso da un paese limitato annullano qualsiasi rimborso", "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.", @@ -356,6 +360,7 @@ "how_to_use": "Come usare", "how_to_use_card": "Come usare questa carta", "id": "ID: ", + "if_you_dont_see_your_device": "Se non vedi il tuo dispositivo sopra, assicurati che il tuo libro mastro sia sveglio e sbloccato!", "ignor": "Ignorare", "import": "Importare", "importNFTs": "Importa NFT", @@ -543,6 +548,7 @@ "recipient_address": "Indirizzo di destinazione", "reconnect": "Riconnetti", "reconnect_alert_text": "Sei sicuro di volerti riconnettere?", + "reconnect_your_hardware_wallet": "Ricollega il tuo portafoglio hardware", "reconnection": "Riconnessione", "red_dark_theme": "Red Dark Theme", "red_light_theme": "Tema della luce rossa", @@ -751,6 +757,10 @@ "silent_payments_settings": "Impostazioni di pagamenti silenziosi", "single_seed_wallets_group": "Portafogli singoli", "slidable": "Scorrevole", + "solana_create_associated_token_account_exception": "Errore Creazione di account token associato per l'indirizzo dei ricevimenti.", + "solana_no_associated_token_account_exception": "Non esiste un account token associato per questo indirizzo.", + "solana_sign_native_transaction_rent_exception": "La transazione non può essere completata. Sol insufficiente lasciato in affitto dopo la transazione. Si prega di ricaricare il saldo SOL o ridurre la quantità di sol che stai inviando.", + "solana_sign_spl_token_transaction_rent_exception": "La transazione non può essere completata. Sol insufficiente lasciato in affitto dopo la transazione. Si prega di ricaricare il tuo equilibrio sol.", "sort_by": "Ordina per", "spend_key_private": "Chiave di spesa (privata)", "spend_key_public": "Chiave di spesa (pubblica)", @@ -763,7 +773,7 @@ "support_description_guides": "Documentazione e supporto per problemi comuni", "support_description_live_chat": "Gratuito e veloce! I rappresentanti di supporto qualificati sono disponibili per assistere", "support_description_other_links": "Unisciti alle nostre comunità o raggiungici i nostri partner attraverso altri metodi", - "support_title_guides": "Guide del portafoglio per torte", + "support_title_guides": "Documenti del portafoglio per torta", "support_title_live_chat": "Supporto dal vivo", "support_title_other_links": "Altri collegamenti di supporto", "sweeping_wallet": "Portafoglio ampio", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index ba512205ec..95ae7b6725 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay ウェブカード", "cake_seeds_save_disclaimer": "これらの言葉を安全な場所に保存してください!新しいデバイスで財布を復元するには、これらの単語が必要です。", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "私はプロキシまたはVPNを使用していないことを確認します", + "cakepay_confirm_purchase": "購入を確認します", + "cakepay_confirm_terms_agreed": "ここに提示されている条件に同意します。", + "cakepay_confirm_voided_refund": "制限された国からの償還の試みが払い戻しを無効にすることを理解しています", "cakepay_ios_not_available": "申し訳ありませんが、このギフトカードはiOSでは利用できません。代わりにAndroidまたは当社のWebサイトから購入できます。", "cakepay_prepaid_card": "CakePayプリペイドデビットカード", "camera_consent": "あなたのカメラは、${provider}_ までに識別目的で画像を撮影するために使用されます。詳細については、プライバシー ポリシーをご確認ください。", @@ -356,6 +360,7 @@ "how_to_use": "使い方", "how_to_use_card": "このカードの使用方法", "id": "ID: ", + "if_you_dont_see_your_device": "上記のデバイスが表示されない場合は、元帳が目を覚ましてロック解除されていることを確認してください!", "ignor": "無視", "import": "輸入", "importNFTs": "NFTのインポート", @@ -542,6 +547,7 @@ "recipient_address": "受信者のアドレス", "reconnect": "再接続", "reconnect_alert_text": "再接続しますか?", + "reconnect_your_hardware_wallet": "ハードウェアウォレットを再接続します", "reconnection": "再接続", "red_dark_theme": "赤い暗いテーマ", "red_light_theme": "赤色光のテーマ", @@ -750,6 +756,10 @@ "silent_payments_settings": "サイレントペイメント設定", "single_seed_wallets_group": "シングルシードウォレット", "slidable": "スライド可能", + "solana_create_associated_token_account_exception": "関連するトークンの作成エラー受信アドレスのアカウント。", + "solana_no_associated_token_account_exception": "このアドレスに関連付けられたトークンアカウントはありません。", + "solana_sign_native_transaction_rent_exception": "トランザクションは完了できません。取引後にレンタルのために残された不十分なソル。ソルバランスを補充するか、送信するソルの量を減らしてください。", + "solana_sign_spl_token_transaction_rent_exception": "トランザクションは完了できません。取引後にレンタルのために残された不十分なソル。ソルバランスを補充してください。", "sort_by": "並び替え", "spend_key_private": "キーを使う (プライベート)", "spend_key_public": "キーを使う (パブリック)", @@ -762,7 +772,7 @@ "support_description_guides": "一般的な問題のドキュメントとサポート", "support_description_live_chat": "無料で速い!訓練されたサポート担当者が支援することができます", "support_description_other_links": "私たちのコミュニティに参加するか、他の方法を通して私たちのパートナーに連絡してください", - "support_title_guides": "ケーキウォレットガイド", + "support_title_guides": "ケーキウォレットドキュメント", "support_title_live_chat": "ライブサポート", "support_title_other_links": "その他のサポートリンク", "sweeping_wallet": "スイープウォレット", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index cb21ee623f..4e9a7cff70 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "케이크페이 웹카드", "cake_seeds_save_disclaimer": "이 단어를 안전한 장소에 저장하십시오! 새 장치에서 지갑을 복원하려면이 단어가 필요합니다.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "프록시 나 VPN을 사용하지 않는지 확인합니다.", + "cakepay_confirm_purchase": "구매 확인", + "cakepay_confirm_terms_agreed": "여기에 제시된 이용 약관에 동의합니다.", + "cakepay_confirm_voided_refund": "제한된 국가의 상환 시도는 환불을 무효화한다는 것을 이해합니다.", "cakepay_ios_not_available": "죄송합니다.이 기프트 카드는 iOS에서 사용할 수 없습니다. Android 또는 웹 사이트를 통해 구매할 수 있습니다.", "cakepay_prepaid_card": "CakePay 선불 직불 카드", "camera_consent": "귀하의 카메라는 ${provider}의 식별 목적으로 이미지를 캡처하는 데 사용됩니다. 자세한 내용은 해당 개인정보 보호정책을 확인하세요.", @@ -355,6 +359,7 @@ "how_to_use": "사용하는 방법", "how_to_use_card": "이 카드를 사용하는 방법", "id": "ID: ", + "if_you_dont_see_your_device": "위의 장치가 표시되지 않으면 원장이 깨어 있고 잠금 해제되었는지 확인하십시오!", "ignor": "무시하다", "import": "수입", "importNFTs": "NFT 가져오기", @@ -542,6 +547,7 @@ "recipient_address": "받는 사람 주소", "reconnect": "다시 연결", "reconnect_alert_text": "다시 연결 하시겠습니까?", + "reconnect_your_hardware_wallet": "하드웨어 지갑을 다시 연결하십시오", "reconnection": "재 연결", "red_dark_theme": "빨간 어두운 테마", "red_light_theme": "빨간불 테마", @@ -750,6 +756,10 @@ "silent_payments_settings": "조용한 지불 설정", "single_seed_wallets_group": "단일 씨앗 지갑", "slidable": "슬라이딩 가능", + "solana_create_associated_token_account_exception": "오류 생성 관련 토큰 계정 수령자 주소에 대한 계정.", + "solana_no_associated_token_account_exception": "이 주소에는 관련 토큰 계정이 없습니다.", + "solana_sign_native_transaction_rent_exception": "거래는 완료 될 수 없습니다. 거래 후 SOL이 임대료로 남았습니다. SOL 밸런스를 친절하게 위로 올리거나 보내는 솔의 양을 줄입니다.", + "solana_sign_spl_token_transaction_rent_exception": "거래는 완료 될 수 없습니다. 거래 후 SOL이 임대료로 남았습니다. SOL 균형을 친절하게 위에 올리십시오.", "sort_by": "정렬 기준", "spend_key_private": "지출 키 (은밀한)", "spend_key_public": "지출 키 (공공의)", @@ -762,7 +772,7 @@ "support_description_guides": "일반적인 문제에 대한 문서화 및 지원", "support_description_live_chat": "자유롭고 빠릅니다! 훈련 된 지원 담당자가 지원할 수 있습니다", "support_description_other_links": "다른 방법을 통해 커뮤니티에 가입하거나 파트너에게 연락하십시오.", - "support_title_guides": "케이크 지갑 가이드", + "support_title_guides": "케이크 지갑 문서", "support_title_live_chat": "실시간 지원", "support_title_other_links": "다른 지원 링크", "sweeping_wallet": "스위핑 지갑", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 017ab171af..c73db85dd2 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay ဝဘ်ကတ်များ", "cake_seeds_save_disclaimer": "ကျေးဇူးပြုပြီးဒီစကားလုံးတွေကိုလုံခြုံတဲ့နေရာမှာသိမ်းထားပါ။ သင်၏ပိုက်ဆံအိတ်ကိုကိရိယာအသစ်တစ်ခုတွင်သင်၏ပိုက်ဆံအိတ်ကိုပြန်လည်ရယူရန်ဤစကားလုံးများကိုသင်လိုအပ်လိမ့်မည်။", "cake_wallet": "Cake ပိုက်ဆံအိတ်", + "cakepay_confirm_no_vpn": "ငါ proxy သို့မဟုတ် vpn ကိုမသုံးပါ", + "cakepay_confirm_purchase": "ဝယ်ယူမှုအတည်ပြုပါ", + "cakepay_confirm_terms_agreed": "ဒီမှာတင်ပြထားတဲ့စည်းကမ်းချက်များကိုငါသဘောတူတယ်။", + "cakepay_confirm_voided_refund": "ကန့်သတ်ထားသောနိုင်ငံမှရွေးနုတ်ခြင်းကြိုးပမ်းမှုများကိုကျွန်ုပ်နားလည်ပါသည်", "cakepay_ios_not_available": "တောင်းပန်ပါတယ်, ဒီလက်ဆောင်ကဒ်ကို iOS မှာမရနိုင်ပါ။ ၎င်းကို Android တွင်သို့မဟုတ်ကျွန်ုပ်တို့၏ဝက်ဘ်ဆိုက်တွင် 0 ယ်နိုင်သည်။", "cakepay_prepaid_card": "CakePay ကြိုတင်ငွေဖြည့်ဒက်ဘစ်ကတ်", "camera_consent": "မှတ်ပုံတင်ခြင်းရည်ရွယ်ချက်များအတွက် ${provider} တွင် သင့်ကင်မရာကို အသုံးပြုပါမည်။ အသေးစိတ်အတွက် ၎င်းတို့၏ ကိုယ်ရေးကိုယ်တာမူဝါဒကို စစ်ဆေးပါ။", @@ -355,6 +359,7 @@ "how_to_use": "အသုံးပြုနည်း", "how_to_use_card": "ဒီကတ်ကို ဘယ်လိုသုံးမလဲ။", "id": "ID:", + "if_you_dont_see_your_device": "သင်၏စက်ကိုအထက်တွင်မတွေ့ပါကသင်၏ Ledger သည်နိုးလာပြီးသော့ဖွင့်နေသည်ကိုသေချာပါစေ။", "ignor": "လျစ်လျူရှုပါ။", "import": "သွင်းကုန်", "importNFTs": "NFTs များကို တင်သွင်းပါ။", @@ -541,6 +546,7 @@ "recipient_address": "လက်ခံသူလိပ်စာ", "reconnect": "ပြန်လည်ချိတ်ဆက်ပါ။", "reconnect_alert_text": "ပြန်လည်ချိတ်ဆက်လိုသည်မှာ သေချာပါသလား။ ?", + "reconnect_your_hardware_wallet": "သင့်ရဲ့ hardware ပိုက်ဆံအိတ်ကိုပြန်လည်ချိတ်ဆက်ပါ", "reconnection": "ပြန်လည်ချိတ်ဆက်မှု", "red_dark_theme": "အနီရောင်မှောင်မိုက်ဆောင်ပုဒ်", "red_light_theme": "အနီရောင်အလင်းအကြောင်းအရာ", @@ -749,6 +755,10 @@ "silent_payments_settings": "အသံတိတ်ငွေပေးချေမှုဆက်တင်များ", "single_seed_wallets_group": "တစ်ခုတည်းမျိုးစေ့ပိုက်ဆံအိတ်", "slidable": "လျှောချနိုင်သည်။", + "solana_create_associated_token_account_exception": "Encipient Token အကောင့်ကိုလက်ခံသည့်လိပ်စာအတွက်အကောင့်များဖန်တီးခြင်းအတွက်အမှားအယွင်းများဖန်တီးခြင်း။", + "solana_no_associated_token_account_exception": "ဒီလိပ်စာအတွက်မပေါင်းသင်းတဲ့လက်ခဏာသက်သေအကောင့်မရှိဘူး။", + "solana_sign_native_transaction_rent_exception": "ငွေပေးငွေယူကိုမပြီးစီးနိုင်ပါ။ ငွေပေးငွေယူပြီးနောက်ငှားရန် Sol မလုံလောက်ပါ။ ကြင်နာစွာသင်၏ SOR ချိန်ခွင်လျှာကိုငွေဖြည့်ပါသို့မဟုတ်သင်ပို့နေသည့်ပမာဏကိုလျှော့ချပါ။", + "solana_sign_spl_token_transaction_rent_exception": "ငွေပေးငွေယူကိုမပြီးစီးနိုင်ပါ။ ငွေပေးငွေယူပြီးနောက်ငှားရန် Sol မလုံလောက်ပါ။ ကြင်နာစွာသင်၏ s ကိုချိန်ခွင်လျှာကိုတက်ပါ။", "sort_by": "အလိုက်စဥ်သည်", "spend_key_private": "သော့သုံးရန် (သီးသန့်)", "spend_key_public": "သုံးစွဲရန်သော့ (အများပြည်သူ)", @@ -761,7 +771,7 @@ "support_description_guides": "ဘုံပြ issues နာများအတွက်စာရွက်စာတမ်းများနှင့်ထောက်ခံမှု", "support_description_live_chat": "အခမဲ့နှင့်အစာရှောင်ခြင်း! လေ့ကျင့်ထားသောထောက်ခံသူကိုယ်စားလှယ်များသည်ကူညီနိုင်သည်", "support_description_other_links": "ကျွန်ုပ်တို့၏လူမှုအသိုင်းအဝိုင်းများသို့ 0 င်ရောက်ပါ", - "support_title_guides": "ကိတ်မုန့်ပိုက်ဆံအိတ်လမ်းညွှန်များ", + "support_title_guides": "ကိတ်မုန့်ပိုက်ဆံအိတ်များ", "support_title_live_chat": "တိုက်ရိုက်ပံ့ပိုးမှု", "support_title_other_links": "အခြားအထောက်အပံ့လင့်များ", "sweeping_wallet": "ိုက်ဆံအိတ် တံမြက်လှည်း", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 6350f9a079..367b8f6252 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay-webkaarten", "cake_seeds_save_disclaimer": "Bewaar deze woorden op een veilige plek! U hebt deze woorden nodig om uw portemonnee op een nieuw apparaat te herstellen.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Ik bevestig dat ik geen proxy of VPN gebruik", + "cakepay_confirm_purchase": "Bevestig aankoop", + "cakepay_confirm_terms_agreed": "Ik ga akkoord met de hier gepresenteerde algemene voorwaarden:", + "cakepay_confirm_voided_refund": "Ik begrijp dat de aflossingspogingen van een beperkt land elke terugbetaling zullen ongeldig maken", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Hoe te gebruiken", "how_to_use_card": "Hoe deze kaart te gebruiken", "id": "ID: ", + "if_you_dont_see_your_device": "Als u uw apparaat hierboven niet ziet, zorg er dan voor dat uw grootboek wakker is en ontgrendeld is!", "ignor": "Negeren", "import": "Importeren", "importNFTs": "NFT's importeren", @@ -541,6 +546,7 @@ "recipient_address": "Adres ontvanger", "reconnect": "Sluit", "reconnect_alert_text": "Weet u zeker dat u opnieuw verbinding wilt maken?", + "reconnect_your_hardware_wallet": "Sluit uw hardware -portemonnee opnieuw aan", "reconnection": "Reconnection", "red_dark_theme": "Rood donker thema", "red_light_theme": "Rood licht thema", @@ -749,6 +755,10 @@ "silent_payments_settings": "Stille betalingsinstellingen", "single_seed_wallets_group": "Enkele zaadportefeuilles", "slidable": "Verschuifbaar", + "solana_create_associated_token_account_exception": "Fout bij het maken van een geassocieerd tokenaccount voor ontvangingsadres.", + "solana_no_associated_token_account_exception": "Er is geen bijbehorende tokenaccount voor dit adres.", + "solana_sign_native_transaction_rent_exception": "Transactie kan niet worden voltooid. Onvoldoende Sol vertrok naar huur na transactie. Vul uw SOL -balans aan of verminder de hoeveelheid SOL die u verzendt.", + "solana_sign_spl_token_transaction_rent_exception": "Transactie kan niet worden voltooid. Onvoldoende Sol vertrok naar huur na transactie. Vul uw SOL -balans op.", "sort_by": "Sorteer op", "spend_key_private": "Sleutel uitgeven (privaat)", "spend_key_public": "Sleutel uitgeven (openbaar)", @@ -761,7 +771,7 @@ "support_description_guides": "Documentatie en ondersteuning voor gemeenschappelijke problemen", "support_description_live_chat": "Gratis en snel! Getrainde ondersteuningsvertegenwoordigers zijn beschikbaar om te helpen", "support_description_other_links": "Word lid van onze gemeenschappen of bereik ons ​​onze partners via andere methoden", - "support_title_guides": "Cake -portemonnee gidsen", + "support_title_guides": "Cake -portemonnee documenten", "support_title_live_chat": "Live ondersteuning", "support_title_other_links": "Andere ondersteuningslinks", "sweeping_wallet": "Vegende portemonnee", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 84ed32184d..ad797bb247 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_seeds_save_disclaimer": "Zapisz te słowa w bezpiecznym miejscu! Będziesz potrzebować tych słów, aby przywrócić portfel na nowym urządzeniu.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Potwierdzam, że nie używam proxy ani VPN", + "cakepay_confirm_purchase": "Potwierdź zakup", + "cakepay_confirm_terms_agreed": "Zgadzam się na przedstawione tutaj warunki:", + "cakepay_confirm_voided_refund": "Rozumiem, że próby odkupienia z ograniczonego kraju nie unieważają wszelkich", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Jak używać", "how_to_use_card": "Jak korzystać z tej karty?", "id": "ID: ", + "if_you_dont_see_your_device": "Jeśli nie widzisz swojego urządzenia powyżej, upewnij się, że Twoja księga nie śpi i odblokowana!", "ignor": "Ignorować", "import": "Import", "importNFTs": "Importuj NFT", @@ -541,6 +546,7 @@ "recipient_address": "Adres odbiorcy", "reconnect": "Połącz ponownie", "reconnect_alert_text": "Czy na pewno ponownie się ponownie połączysz?", + "reconnect_your_hardware_wallet": "Ponownie podłącz portfel sprzętowy", "reconnection": "Ponowne łączenie", "red_dark_theme": "Czerwony Mroczny motyw", "red_light_theme": "Motyw czerwony światło", @@ -749,6 +755,10 @@ "silent_payments_settings": "Ustawienia o cichej płatności", "single_seed_wallets_group": "Pojedyncze portfele nasion", "slidable": "Przesuwne", + "solana_create_associated_token_account_exception": "Błąd tworzenia powiązanego konta tokena dla adresu wpływającego.", + "solana_no_associated_token_account_exception": "Nie ma powiązanego konta tokena dla tego adresu.", + "solana_sign_native_transaction_rent_exception": "Transakcji nie można zakończyć. Niewystarczający SOL w lewo do czynszu po transakcji. Uprzejmie uzupełnij saldo Sol lub zmniejsz ilość wysyłanej przez Ciebie rozwiązania.", + "solana_sign_spl_token_transaction_rent_exception": "Transakcji nie można zakończyć. Niewystarczający SOL w lewo do czynszu po transakcji. Uprzejmie uzupełnij saldo Sol.", "sort_by": "Sortuj według", "spend_key_private": "Klucz prywatny", "spend_key_public": "Klucz publiczny", @@ -761,7 +771,7 @@ "support_description_guides": "Dokumentacja i wsparcie dla typowych problemów", "support_description_live_chat": "Darmowe i szybkie! Do pomocy są dostępni przeszkoleni przedstawiciele wsparcia", "support_description_other_links": "Dołącz do naszych społeczności lub skontaktuj się z nami naszymi partnerami za pomocą innych metod", - "support_title_guides": "Przewodniki portfela ciasta", + "support_title_guides": "Dokumenty portfela ciasta", "support_title_live_chat": "Wsparcie na żywo", "support_title_other_links": "Inne linki wsparcia", "sweeping_wallet": "Zamiatanie portfela", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index bdd2928e61..d9df7e2eea 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cartões Cake Pay Web", "cake_seeds_save_disclaimer": "Por favor, salve estas palavras em um local seguro! Você precisará dessas palavras para restaurar sua carteira em um novo dispositivo.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Eu confirmo que não estou usando um proxy ou VPN", + "cakepay_confirm_purchase": "Confirme a compra", + "cakepay_confirm_terms_agreed": "Eu concordo com os termos e condições apresentados aqui:", + "cakepay_confirm_voided_refund": "Eu entendo que as tentativas de resgate de um país restrito anularão qualquer reembolso", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Como usar", "how_to_use_card": "Como usar este cartão", "id": "ID: ", + "if_you_dont_see_your_device": "Se você não vê seu dispositivo acima, certifique -se de que seu livro esteja acordado e desbloqueado!", "ignor": "Ignorar", "import": "Importar", "importNFTs": "Importar NFTs", @@ -543,6 +548,7 @@ "recipient_address": "Endereço do destinatário", "reconnect": "Reconectar", "reconnect_alert_text": "Você tem certeza de que deseja reconectar?", + "reconnect_your_hardware_wallet": "Reconecte sua carteira de hardware", "reconnection": "Reconectar", "red_dark_theme": "Tema escuro vermelho", "red_light_theme": "Tema da luz vermelha", @@ -751,6 +757,10 @@ "silent_payments_settings": "Configurações de pagamentos silenciosos", "single_seed_wallets_group": "Carteiras de sementes únicas", "slidable": "Deslizável", + "solana_create_associated_token_account_exception": "Erro a criação de um token associado Conta do endereço de recebimento.", + "solana_no_associated_token_account_exception": "Não existe uma conta de token associada para este endereço.", + "solana_sign_native_transaction_rent_exception": "A transação não pode ser concluída. Sol insuficiente deixou para alugar após a transação. Por favor, complete seu saldo sol ou reduza a quantidade de sol que você está enviando.", + "solana_sign_spl_token_transaction_rent_exception": "A transação não pode ser concluída. Sol insuficiente deixou para alugar após a transação. Por favor, complete seu equilíbrio sol.", "sort_by": "Ordenar por", "spend_key_private": "Chave de gastos (privada)", "spend_key_public": "Chave de gastos (pública)", @@ -763,7 +773,7 @@ "support_description_guides": "Documentação e suporte para problemas comuns", "support_description_live_chat": "Livre e rápido! Representantes de suporte treinado estão disponíveis para ajudar", "support_description_other_links": "Junte -se às nossas comunidades ou chegue a nós nossos parceiros por meio de outros métodos", - "support_title_guides": "Guias da carteira de bolo", + "support_title_guides": "Documentos da carteira de bolo", "support_title_live_chat": "Apoio ao vivo", "support_title_other_links": "Outros links de suporte", "sweeping_wallet": "Carteira varrendo", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index a571a7a3ea..d9468f148d 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Веб-карты Cake Pay", "cake_seeds_save_disclaimer": "Пожалуйста, сохраните эти слова в безопасном месте! Вам понадобятся эти слова, чтобы восстановить свой кошелек на новом устройстве.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Я подтверждаю, что не использую прокси или VPN", + "cakepay_confirm_purchase": "Подтвердите покупку", + "cakepay_confirm_terms_agreed": "Я согласен с условиями, представленными здесь:", + "cakepay_confirm_voided_refund": "Я понимаю, что попытки выкупа из ограниченной страны будут аннулировать любые возмещение", "cakepay_ios_not_available": "Извините, эта подарочная карта недоступна на iOS. Вместо этого вы можете приобрести его на Android или через наш веб -сайт.", "cakepay_prepaid_card": "Предоплаченная дебетовая карта CakePay", "camera_consent": "Ваша камера будет использоваться для захвата изображения в целях идентификации ${provider}. Пожалуйста, ознакомьтесь с их Политикой конфиденциальности для получения подробной информации.", @@ -355,6 +359,7 @@ "how_to_use": "Как использовать", "how_to_use_card": "Как использовать эту карту", "id": "ID: ", + "if_you_dont_see_your_device": "Если вы не видите свое устройство выше, пожалуйста, убедитесь, что ваша бухгалтерская книга бодрствует и разблокирована!", "ignor": "Игнорировать", "import": "Импортировать", "importNFTs": "Импортировать NFT", @@ -542,6 +547,7 @@ "recipient_address": "Адрес получателя", "reconnect": "Переподключиться", "reconnect_alert_text": "Вы хотите переподключиться?", + "reconnect_your_hardware_wallet": "Воссоедините свой аппаратный кошелек", "reconnection": "Переподключение", "red_dark_theme": "Красная темная тема", "red_light_theme": "Тема красного света", @@ -750,6 +756,10 @@ "silent_payments_settings": "Silent Payments Settings", "single_seed_wallets_group": "Одиночные кошельки", "slidable": "Скользящий", + "solana_create_associated_token_account_exception": "Ошибка создания ассоциированной учетной записи для адреса для адреса.", + "solana_no_associated_token_account_exception": "Для этого адреса нет связанной учетной записи токена.", + "solana_sign_native_transaction_rent_exception": "Сделка не может быть завершена. Недостаточный соль ушел в аренду после транзакции. Пожалуйста, поместите свой баланс Sol или уменьшите количество Sol, которое вы отправляете.", + "solana_sign_spl_token_transaction_rent_exception": "Сделка не может быть завершена. Недостаточный соль ушел в аренду после транзакции. Пожалуйста, пополните свой баланс Sol.", "sort_by": "Сортировать по", "spend_key_private": "Приватный ключ траты", "spend_key_public": "Публичный ключ траты", @@ -762,7 +772,7 @@ "support_description_guides": "Документация и поддержка общих вопросов", "support_description_live_chat": "Бесплатно и быстро! Обученные представители поддержки доступны для оказания помощи", "support_description_other_links": "Присоединяйтесь к нашим сообществам или охватите нас наших партнеров с помощью других методов", - "support_title_guides": "Корт -гиды", + "support_title_guides": "Корт кошелек документов", "support_title_live_chat": "Живая поддержка", "support_title_other_links": "Другие ссылки на поддержку", "sweeping_wallet": "Подметание кошелька", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index ee146093f5..649d59d59c 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_seeds_save_disclaimer": "โปรดบันทึกคำเหล่านี้ในสถานที่ที่ปลอดภัย! คุณจะต้องใช้คำเหล่านี้เพื่อกู้คืนกระเป๋าเงินของคุณในอุปกรณ์ใหม่", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "ฉันยืนยันว่าฉันไม่ได้ใช้พร็อกซีหรือ VPN", + "cakepay_confirm_purchase": "ยืนยันการซื้อ", + "cakepay_confirm_terms_agreed": "ฉันเห็นด้วยกับข้อกำหนดและเงื่อนไขที่นำเสนอที่นี่:", + "cakepay_confirm_voided_refund": "ฉันเข้าใจความพยายามในการไถ่ถอนจากประเทศที่ถูก จำกัด จะทำให้คืนเงินใด ๆ", "cakepay_ios_not_available": "ขออภัยบัตรของขวัญนี้ไม่มีใน iOS คุณสามารถซื้อได้บน Android หรือผ่านเว็บไซต์ของเราแทน", "cakepay_prepaid_card": "บัตรเดบิตเติมเงินของ CakePay", "camera_consent": "กล้องของคุณจะถูกนำมาใช้เพื่อจับภาพเพื่อวัตถุประสงค์ในการระบุตัวตนภายใน ${provider} โปรดตรวจสอบนโยบายความเป็นส่วนตัวเพื่อดูรายละเอียด", @@ -355,6 +359,7 @@ "how_to_use": "วิธีใช้", "how_to_use_card": "วิธีใช้บัตรนี้", "id": "ID: ", + "if_you_dont_see_your_device": "หากคุณไม่เห็นอุปกรณ์ของคุณด้านบนโปรดตรวจสอบให้แน่ใจว่าบัญชีแยกประเภทของคุณตื่นและปลดล็อค!", "ignor": "ละเว้น", "import": "นำเข้า", "importNFTs": "นำเข้า NFT", @@ -541,6 +546,7 @@ "recipient_address": "ที่อยู่ผู้รับ", "reconnect": "เชื่อมต่อใหม่", "reconnect_alert_text": "คุณแน่ใจหรือไม่ว่าต้องการเชื่อมต่อใหม่?", + "reconnect_your_hardware_wallet": "เชื่อมต่อกระเป๋าเงินฮาร์ดแวร์ของคุณอีกครั้ง", "reconnection": "เชื่อมต่อใหม่", "red_dark_theme": "ธีมสีแดงเข้ม", "red_light_theme": "ธีมแสงสีแดง", @@ -749,6 +755,10 @@ "silent_payments_settings": "การตั้งค่าการชำระเงินแบบเงียบ", "single_seed_wallets_group": "กระเป๋าเงินเดียว", "slidable": "เลื่อนได้", + "solana_create_associated_token_account_exception": "ข้อผิดพลาดในการสร้างบัญชีโทเค็นที่เกี่ยวข้องสำหรับที่อยู่รับ", + "solana_no_associated_token_account_exception": "ไม่มีบัญชีโทเค็นที่เกี่ยวข้องสำหรับที่อยู่นี้", + "solana_sign_native_transaction_rent_exception": "การทำธุรกรรมไม่สามารถเสร็จสิ้นได้ SOL ไม่เพียงพอเหลือให้เช่าหลังการทำธุรกรรม กรุณาเติมยอดคงเหลือโซลของคุณหรือลดจำนวนโซลที่คุณกำลังส่ง", + "solana_sign_spl_token_transaction_rent_exception": "การทำธุรกรรมไม่สามารถเสร็จสิ้นได้ SOL ไม่เพียงพอเหลือให้เช่าหลังการทำธุรกรรม กรุณาเติมยอดสมดุลโซลของคุณ", "sort_by": "เรียงตาม", "spend_key_private": "คีย์จ่าย (ส่วนตัว)", "spend_key_public": "คีย์จ่าย (สาธารณะ)", @@ -761,7 +771,7 @@ "support_description_guides": "เอกสารและการสนับสนุนสำหรับปัญหาทั่วไป", "support_description_live_chat": "ฟรีและรวดเร็ว! ตัวแทนฝ่ายสนับสนุนที่ผ่านการฝึกอบรมพร้อมให้ความช่วยเหลือ", "support_description_other_links": "เข้าร่วมชุมชนของเราหรือเข้าถึงเราพันธมิตรของเราผ่านวิธีการอื่น ๆ", - "support_title_guides": "คู่มือกระเป๋าเงินเค้ก", + "support_title_guides": "เอกสารกระเป๋าเงินเค้ก", "support_title_live_chat": "การสนับสนุนสด", "support_title_other_links": "ลิงค์สนับสนุนอื่น ๆ", "sweeping_wallet": "กวาดกระเป๋าสตางค์", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 9c43e21f70..33b4d23d6a 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_seeds_save_disclaimer": "Mangyaring i -save ang mga salitang ito sa isang ligtas na lugar! Kakailanganin mo ang mga salitang ito upang maibalik ang iyong pitaka sa isang bagong aparato.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Kinukumpirma kong hindi ako gumagamit ng isang proxy o vpn", + "cakepay_confirm_purchase": "Kumpirmahin ang pagbili", + "cakepay_confirm_terms_agreed": "Sumasang -ayon ako sa mga termino at kundisyon na ipinakita dito:", + "cakepay_confirm_voided_refund": "Naiintindihan ko ang mga pagtatangka sa pagtubos mula sa isang pinigilan na bansa ay walang bisa sa anumang refund", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Paano gamitin", "how_to_use_card": "Paano gamitin ang card na ito", "id": "ID: ", + "if_you_dont_see_your_device": "Kung hindi mo nakikita ang iyong aparato sa itaas, siguraduhin na ang iyong ledger ay gising at naka -lock!", "ignor": "Huwag pansinin", "import": "Mag-import", "importNFTs": "Mag-import ng mga NFT", @@ -541,6 +546,7 @@ "recipient_address": "Address ng tatanggap", "reconnect": "Kumonekta muli", "reconnect_alert_text": "Sigurado ka bang gusto mong kumonekta uli?", + "reconnect_your_hardware_wallet": "Ikonekta muli ang iyong wallet ng hardware", "reconnection": "Muling pagkakakonekta", "red_dark_theme": "Red Dark Theme", "red_light_theme": "Red Light Theme", @@ -749,6 +755,10 @@ "silent_payments_settings": "Mga setting ng tahimik na pagbabayad", "single_seed_wallets_group": "Solong mga pitaka ng binhi", "slidable": "Slidable", + "solana_create_associated_token_account_exception": "Error sa paglikha ng nauugnay na token account para sa resibo address.", + "solana_no_associated_token_account_exception": "Walang nauugnay na token account para sa address na ito.", + "solana_sign_native_transaction_rent_exception": "Hindi makumpleto ang transaksyon. Hindi sapat na SOL na naiwan para sa upa pagkatapos ng transaksyon. Mabuting itaas ang iyong balanse sa sol o bawasan ang dami ng sol na iyong ipinapadala.", + "solana_sign_spl_token_transaction_rent_exception": "Hindi makumpleto ang transaksyon. Hindi sapat na SOL na naiwan para sa upa pagkatapos ng transaksyon. Mabuting itaas ang iyong balanse sa sol.", "sort_by": "Pag-uri-uriin sa pamamagitan ng", "spend_key_private": "Spend key (private)", "spend_key_public": "Spend key (public)", @@ -761,7 +771,7 @@ "support_description_guides": "Dokumentasyon at suporta para sa mga karaniwang isyu", "support_description_live_chat": "Libre at mabilis! Ang mga bihasang kinatawan ng suporta ay magagamit upang tulungan", "support_description_other_links": "Sumali sa aming mga komunidad o maabot sa amin ang aming mga kasosyo sa pamamagitan ng iba pang mga pamamaraan", - "support_title_guides": "Mga guide sa Cake Wallet", + "support_title_guides": "Cake wallet doc", "support_title_live_chat": "Live na suporta", "support_title_other_links": "Iba pang mga link sa suporta", "sweeping_wallet": "Sweeping wallet", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 367f59dcad..7b27ded8ad 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake Pay Web Kartları", "cake_seeds_save_disclaimer": "Lütfen bu kelimeleri güvenli bir yerde kaydedin! Cüzdanınızı yeni bir cihazda geri yüklemek için bu kelimelere ihtiyacınız olacak.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Bir proxy veya vpn kullanmadığımı onaylıyorum", + "cakepay_confirm_purchase": "Satın Alma Onay", + "cakepay_confirm_terms_agreed": "Burada sunulan şartlar ve koşulları kabul ediyorum:", + "cakepay_confirm_voided_refund": "Kısıtlı bir ülkeden kurtuluş girişimlerinin herhangi bir geri ödemeyi geçersiz kılacağını anlıyorum", "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.", @@ -355,6 +359,7 @@ "how_to_use": "Nasıl kullanılır", "how_to_use_card": "Bu kart nasıl kullanılır", "id": "ID: ", + "if_you_dont_see_your_device": "Cihazınızı yukarıda görmüyorsanız, lütfen defterinizin uyanık olduğundan ve kilidinin açıldığından emin olun!", "ignor": "Yoksay", "import": "İçe aktarmak", "importNFTs": "NFT'leri içe aktar", @@ -541,6 +546,7 @@ "recipient_address": "Alıcı adresi", "reconnect": "Yeniden Bağlan", "reconnect_alert_text": "Yeniden bağlanmak istediğinden emin misin?", + "reconnect_your_hardware_wallet": "Donanım cüzdanınızı yeniden bağlayın", "reconnection": "Yeniden bağlantı", "red_dark_theme": "Kırmızı Karanlık Tema", "red_light_theme": "Kırmızı Işık Teması", @@ -749,6 +755,10 @@ "silent_payments_settings": "Sessiz Ödeme Ayarları", "single_seed_wallets_group": "Tek tohum cüzdanları", "slidable": "kaydırılabilir", + "solana_create_associated_token_account_exception": "ALIPITIENT ADRESİ İÇİN BAŞLANGIÇ HESABI oluşturma Hata.", + "solana_no_associated_token_account_exception": "Bu adres için ilişkili belirteç hesabı yoktur.", + "solana_sign_native_transaction_rent_exception": "İşlem tamamlanamaz. Yetersiz Sol işlemden sonra kira için kaldı. Lütfen sol bakiyenizi doldurun veya gönderdiğiniz Sol miktarını azaltın.", + "solana_sign_spl_token_transaction_rent_exception": "İşlem tamamlanamaz. Yetersiz Sol işlemden sonra kira için kaldı. Lütfen sol bakiyenizi doldurun.", "sort_by": "Göre sırala", "spend_key_private": "Harcama anahtarı (özel)", "spend_key_public": "Harcama anahtarı (genel)", @@ -761,7 +771,7 @@ "support_description_guides": "Ortak sorunlara belge ve destek", "support_description_live_chat": "Ücretsiz ve hızlı! Eğitimli destek temsilcileri yardımcı olmak için mevcuttur", "support_description_other_links": "Topluluklarımıza katılın veya ortaklarımıza diğer yöntemlerle bize ulaşın", - "support_title_guides": "Kek Cüzdan Kılavuzları", + "support_title_guides": "Kek Cüzdan Dokümanlar", "support_title_live_chat": "Canlı destek", "support_title_other_links": "Diğer destek bağlantıları", "sweeping_wallet": "Süpürme cüzdanı", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index e4c37ea3b1..cdf169a5a4 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Веб-картки Cake Pay", "cake_seeds_save_disclaimer": "Збережіть ці слова в безпечному місці! Вам знадобляться ці слова, щоб відновити гаманець на новому пристрої.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Я підтверджую, що не використовую проксі або VPN", + "cakepay_confirm_purchase": "Підтвердьте покупку", + "cakepay_confirm_terms_agreed": "Я погоджуюся з представленими тут умовами та умовами:", + "cakepay_confirm_voided_refund": "Я розумію, що спроби викупу з обмеженої країни пошкодять будь -яке повернення коштів", "cakepay_ios_not_available": "Вибачте, ця подарункова карта недоступна на iOS. Ви можете придбати його на Android або через наш веб -сайт.", "cakepay_prepaid_card": "Передплачена дебетова картка CakePay", "camera_consent": "Ваша камера використовуватиметься для зйомки зображення з метою ідентифікації ${provider}. Будь ласка, ознайомтеся з їхньою політикою конфіденційності, щоб дізнатися більше.", @@ -355,6 +359,7 @@ "how_to_use": "Як використовувати", "how_to_use_card": "Як використовувати цю картку", "id": "ID: ", + "if_you_dont_see_your_device": "Якщо ви не бачите свого пристрою вище, будь ласка, переконайтеся, що ваша книга прокинеться і розблокована!", "ignor": "Ігнорувати", "import": "Імпорт", "importNFTs": "Імпорт NFT", @@ -541,6 +546,7 @@ "recipient_address": "Адреса одержувача", "reconnect": "Перепідключитися", "reconnect_alert_text": "Ви хочете перепідключитися?", + "reconnect_your_hardware_wallet": "Повторно підключіть свій апаратний гаманець", "reconnection": "Перепідключення", "red_dark_theme": "Червона темна тема", "red_light_theme": "Тема червоного світла", @@ -750,6 +756,10 @@ "silent_payments_settings": "Налаштування мовчазних платежів", "single_seed_wallets_group": "Поодинокі насінні гаманці", "slidable": "Розсувний", + "solana_create_associated_token_account_exception": "Помилка створення пов’язаного облікового запису Token для адреси приймання.", + "solana_no_associated_token_account_exception": "Для цієї адреси немає пов’язаного облікового запису маркера.", + "solana_sign_native_transaction_rent_exception": "Транзакція не може бути завершена. Недостатня SOL залишила оренду після транзакції. Будь ласка, поповніть свій баланс SOL або зменшіть кількість SOL, який ви надсилаєте.", + "solana_sign_spl_token_transaction_rent_exception": "Транзакція не може бути завершена. Недостатня SOL залишила оренду після транзакції. Будь ласка, наповніть свій баланс SOL.", "sort_by": "Сортувати за", "spend_key_private": "Приватний ключ витрати", "spend_key_public": "Публічний ключ витрати", @@ -762,7 +772,7 @@ "support_description_guides": "Документація та підтримка загальних питань", "support_description_live_chat": "Безкоштовно і швидко! Навчені представники підтримки доступні для надання допомоги", "support_description_other_links": "Приєднуйтесь до наших спільнот або досягайте нас нашими партнерами іншими методами", - "support_title_guides": "Поклики для гаманців тортів", + "support_title_guides": "Торт гаманці", "support_title_live_chat": "Жива підтримка", "support_title_other_links": "Інші посилання на підтримку", "sweeping_wallet": "Підмітаня гаманця", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 292167c51e..5213cbaebe 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Cake پے ویب کارڈز", "cake_seeds_save_disclaimer": "براہ کرم ان الفاظ کو ایک محفوظ جگہ پر محفوظ کریں! اپنے بٹوے کو کسی نئے آلے پر بحال کرنے کے ل You آپ کو ان الفاظ کی ضرورت ہوگی۔", "cake_wallet": "Cake والیٹ", + "cakepay_confirm_no_vpn": "میں تصدیق کرتا ہوں کہ میں پراکسی یا وی پی این استعمال نہیں کر رہا ہوں", + "cakepay_confirm_purchase": "خریداری کی تصدیق کریں", + "cakepay_confirm_terms_agreed": "میں یہاں پیش کردہ شرائط و ضوابط سے اتفاق کرتا ہوں:", + "cakepay_confirm_voided_refund": "میں سمجھتا ہوں کہ کسی محدود ملک سے چھٹکارے کی کوششیں کسی بھی رقم کی واپسی کو کالعدم کردیں گی", "cakepay_ios_not_available": "معذرت ، یہ گفٹ کارڈ iOS پر دستیاب نہیں ہے۔ اس کے بجائے آپ اسے اینڈروئیڈ پر یا ہماری ویب سائٹ کے ذریعے خرید سکتے ہیں۔", "cakepay_prepaid_card": "Cake پے پری پیڈ ڈیبٹ کارڈ", "camera_consent": "۔ﮟﯿﮭﮑﯾﺩ ﯽﺴﯿﻟﺎﭘ ﯽﺴﯾﻮﯿﺋﺍﺮﭘ ﯽﮐ ﻥﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﺕﻼ${provider}ﯿﺼﻔﺗ ۔ﺎﮔ ﮯﺋﺎﺟ ﺎﯿﮐ ﻝﺎﻤﻌﺘﺳﺍ ﮯﯿﻟ", @@ -355,6 +359,7 @@ "how_to_use": " ﮧﻘﯾﺮﻃ ﺎﮐ ﮯﻧﺮﮐ ﻝﺎﻤﻌﺘﺳﺍ", "how_to_use_card": "اس کارڈ کو استعمال کرنے کا طریقہ", "id": "ID:", + "if_you_dont_see_your_device": "اگر آپ اوپر اپنا آلہ نہیں دیکھتے ہیں تو ، براہ کرم یقینی بنائیں کہ آپ کا لیجر بیدار اور غیر مقفل ہے!", "ignor": "نظر انداز کرنا", "import": " ۔ﮟﯾﺮﮐ ﺪﻣﺁﺭﺩ", "importNFTs": "NFTs ۔ﮟﯾﺮﮐ ﺪﻣﺁﺭﺩ", @@ -543,6 +548,7 @@ "recipient_address": "وصول کنندہ کا پتہ", "reconnect": "دوبارہ جڑیں۔", "reconnect_alert_text": "کیا آپ واقعی دوبارہ جڑنا چاہتے ہیں؟", + "reconnect_your_hardware_wallet": "اپنے ہارڈ ویئر پرس کو دوبارہ مربوط کریں", "reconnection": "دوبارہ رابطہ", "red_dark_theme": "ریڈ ڈارک تھیم", "red_light_theme": "ریڈ لائٹ تھیم", @@ -751,6 +757,10 @@ "silent_payments_settings": "خاموش ادائیگی کی ترتیبات", "single_seed_wallets_group": "سنگل بیج کے بٹوے", "slidable": "سلائیڈ ایبل", + "solana_create_associated_token_account_exception": "وصول کنندہ ایڈریس کے لئے وابستہ ٹوکن اکاؤنٹ بنانے میں غلطی۔", + "solana_no_associated_token_account_exception": "اس پتے کے لئے کوئی وابستہ ٹوکن اکاؤنٹ نہیں ہے۔", + "solana_sign_native_transaction_rent_exception": "لین دین مکمل نہیں کیا جاسکتا۔ ٹرانزیکشن کے بعد کرایہ کے لئے ناکافی SOL چھوڑ دیا گیا ہے۔ برائے مہربانی اپنے سول توازن کو اوپر کریں یا آپ بھیج رہے ہیں اس کی مقدار کو کم کریں۔", + "solana_sign_spl_token_transaction_rent_exception": "لین دین مکمل نہیں کیا جاسکتا۔ ٹرانزیکشن کے بعد کرایہ کے لئے ناکافی SOL چھوڑ دیا گیا ہے۔ برائے مہربانی اپنے سول توازن کو اوپر رکھیں۔", "sort_by": "ترتیب دیں", "spend_key_private": "خرچ کی کلید (نجی)", "spend_key_public": "خرچ کی کلید (عوامی)", @@ -763,7 +773,7 @@ "support_description_guides": "عام مسائل کے لئے دستاویزات اور مدد", "support_description_live_chat": "مفت اور تیز! تربیت یافتہ معاون نمائندے مدد کے لئے دستیاب ہیں", "support_description_other_links": "ہماری برادریوں میں شامل ہوں یا دوسرے طریقوں سے ہمارے شراکت داروں تک پہنچیں", - "support_title_guides": "کیک پرس گائڈز", + "support_title_guides": "کیک پرس کے دستاویزات", "support_title_live_chat": "براہ راست مدد", "support_title_other_links": "دوسرے سپورٹ لنکس", "sweeping_wallet": "جھاڑو دینے والا پرس", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 8d56e8e2a6..963c3002a3 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Thẻ Cake Pay Web", "cake_seeds_save_disclaimer": "Vui lòng lưu những từ này ở một nơi an toàn! Bạn sẽ cần những từ này để khôi phục ví của bạn trên một thiết bị mới.", "cake_wallet": "Ví Cake", + "cakepay_confirm_no_vpn": "Tôi xác nhận tôi không sử dụng proxy hoặc VPN", + "cakepay_confirm_purchase": "Xác nhận mua hàng", + "cakepay_confirm_terms_agreed": "Tôi đồng ý với các điều khoản và điều kiện được trình bày ở đây:", + "cakepay_confirm_voided_refund": "Tôi hiểu những nỗ lực cứu chuộc từ một quốc gia bị hạn chế sẽ vô hiệu hóa bất kỳ khoản hoàn trả nào", "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.", @@ -354,6 +358,7 @@ "how_to_use": "Cách sử dụng", "how_to_use_card": "Cách sử dụng thẻ này", "id": "ID: ", + "if_you_dont_see_your_device": "Nếu bạn không thấy thiết bị của mình ở trên, xin hãy chắc chắn rằng sổ cái của bạn đã tỉnh táo và mở khóa!", "ignor": "Bỏ qua", "import": "Nhập", "importNFTs": "Nhập NFT", @@ -540,6 +545,7 @@ "recipient_address": "Địa chỉ người nhận", "reconnect": "Kết nối lại", "reconnect_alert_text": "Bạn có chắc chắn muốn kết nối lại không?", + "reconnect_your_hardware_wallet": "Kết nối lại ví phần cứng của bạn", "reconnection": "Kết nối lại", "red_dark_theme": "Chủ đề tối đỏ", "red_light_theme": "Chủ đề sáng đỏ", @@ -748,6 +754,10 @@ "silent_payments_settings": "Cài đặt thanh toán im lặng", "single_seed_wallets_group": "Ví hạt đơn", "slidable": "Có thể kéo", + "solana_create_associated_token_account_exception": "Lỗi Tạo tài khoản mã thông báo liên quan cho địa chỉ biên lai.", + "solana_no_associated_token_account_exception": "Không có tài khoản mã thông báo liên quan cho địa chỉ này.", + "solana_sign_native_transaction_rent_exception": "Giao dịch không thể được hoàn thành. Không đủ Sol còn lại cho thuê sau khi giao dịch. Vui lòng tăng số dư Sol của bạn hoặc giảm số lượng sol bạn đang gửi.", + "solana_sign_spl_token_transaction_rent_exception": "Giao dịch không thể được hoàn thành. Không đủ Sol còn lại cho thuê sau khi giao dịch. Vui lòng lên cân bằng sol của bạn.", "sort_by": "Sắp xếp theo", "spend_key_private": "Khóa chi tiêu (riêng tư)", "spend_key_public": "Khóa chi tiêu (công khai)", @@ -760,7 +770,7 @@ "support_description_guides": "Tài liệu và hỗ trợ cho các vấn đề phổ biến", "support_description_live_chat": "Miễn phí và nhanh chóng! Các đại diện hỗ trợ được đào tạo sẵn sàng hỗ trợ", "support_description_other_links": "Tham gia cộng đồng của chúng tôi hoặc liên hệ với chúng tôi hoặc các đối tác của chúng tôi qua các phương pháp khác", - "support_title_guides": "Hướng dẫn Cake Wallet", + "support_title_guides": "Cake Wallet Docs", "support_title_live_chat": "Hỗ trợ trực tiếp", "support_title_other_links": "Liên kết hỗ trợ khác", "sweeping_wallet": "Quét ví", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 4d1e0f60d4..dd9c163474 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "Àwọn káàdì wẹ́ẹ̀bù ti Cake Pay", "cake_seeds_save_disclaimer": "Jọwọ fi awọn ọrọ wọnyi pamọ ni aaye aabo! Iwọ yoo nilo awọn ọrọ wọnyi lati mu pada apamọwọ rẹ sori ẹrọ tuntun.", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "Mo jẹrisi pe Emi ko lo aṣoju tabi VPN", + "cakepay_confirm_purchase": "Jẹrisi rira", + "cakepay_confirm_terms_agreed": "Mo gba si awọn ofin ati ipo ti a ṣafihan nibi:", + "cakepay_confirm_voided_refund": "Mo ye awọn igbiyanju irapada lati orilẹ-ede ihamọ kan yoo di agbapada eyikeyi", "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.", @@ -356,6 +360,7 @@ "how_to_use": "Bawo ni lati lo", "how_to_use_card": "Báyìí ni wọ́n ṣe ń lo káàdì yìí.", "id": "Àmì Ìdánimọ̀: ", + "if_you_dont_see_your_device": "Ti o ko ba ri ẹrọ rẹ loke, jọwọ rii daju pe a le jiji rẹ ati ṣiṣi!", "ignor": "Ṣàìfiyèsí", "import": "gbe wọle", "importNFTs": "Gbe awọn NFT wọle", @@ -542,6 +547,7 @@ "recipient_address": "Àdírẹ́sì olùgbà", "reconnect": "Ṣe àtúnse", "reconnect_alert_text": "Ṣó dá ẹ lójú pé ẹ fẹ́ ṣe àtúnse?", + "reconnect_your_hardware_wallet": "Ṣe atunṣe apamọwọ ohun elo rẹ", "reconnection": "Àtúnṣe", "red_dark_theme": "Akọle dudu pupa", "red_light_theme": "Akori ina pupa", @@ -750,6 +756,10 @@ "silent_payments_settings": "Awọn eto isanwo ti o dakẹ", "single_seed_wallets_group": "Awọn Wowei Awọn gige", "slidable": "Slidable", + "solana_create_associated_token_account_exception": "Aṣiṣe ṣiṣẹda akọọlẹ token ti o ni ibatan fun adirẹsi gbigba.", + "solana_no_associated_token_account_exception": "Ko si iroyin token ti o ni ibatan fun adirẹsi yii.", + "solana_sign_native_transaction_rent_exception": "Idunadura ko le pari. Solusi ti ko to ju fun iyalo lẹhin idunadura. Jowo oke iwọntunwọnsi rẹ tabi dinku iye sol ti o firanṣẹ.", + "solana_sign_spl_token_transaction_rent_exception": "Idunadura ko le pari. Solusi ti ko to ju fun iyalo lẹhin idunadura. Sanra si oke ni iwọntunwọnsi Sol rẹ.", "sort_by": "Sa pelu", "spend_key_private": "Kọ́kọ́rọ́ sísan (àdáni)", "spend_key_public": "Kọ́kọ́rọ́ sísan (kò àdáni)", @@ -762,7 +772,7 @@ "support_description_guides": "Iwe ati atilẹyin fun awọn ọran ti o wọpọ", "support_description_live_chat": "Free ati sare! Ti oṣiṣẹ awọn aṣoju wa lati ṣe iranlọwọ", "support_description_other_links": "Darapọ mọ awọn agbegbe wa tabi de wa awọn alabaṣepọ wa nipasẹ awọn ọna miiran", - "support_title_guides": "Akara oyinbo Awọn Itọsọna Awọki oyinbo", + "support_title_guides": "Awọn iwe apamọwọ oyinbo akara oyinbo", "support_title_live_chat": "Atilẹyin ifiwe", "support_title_other_links": "Awọn ọna asopọ atilẹyin miiran", "sweeping_wallet": "Fi owo iwe iwe wofo", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 476082a087..2d70c2325b 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -103,6 +103,10 @@ "cake_pay_web_cards_title": "蛋糕支付网络卡", "cake_seeds_save_disclaimer": "请在安全的地方保存这些单词!您将需要这些单词来恢复新设备上的钱包。", "cake_wallet": "Cake Wallet", + "cakepay_confirm_no_vpn": "我确认我不使用代理或VPN", + "cakepay_confirm_purchase": "确认购买", + "cakepay_confirm_terms_agreed": "我同意此处介绍的条款和条件:", + "cakepay_confirm_voided_refund": "我了解限制国家的赎回尝试将使任何退款无效", "cakepay_ios_not_available": "抱歉,这张礼品卡在iOS上不可用。您可以在Android或通过我们的网站上购买它。", "cakepay_prepaid_card": "CakePay 预付借记卡", "camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。", @@ -355,6 +359,7 @@ "how_to_use": "如何使用", "how_to_use_card": "如何使用这张卡", "id": "ID: ", + "if_you_dont_see_your_device": "如果您在上面看不到设备,请确保您的分类帐已经清醒并解锁!", "ignor": "忽视", "import": "进口", "importNFTs": "导入 NFT", @@ -541,6 +546,7 @@ "recipient_address": "收件人地址", "reconnect": "重新连接", "reconnect_alert_text": "您确定要重新连接吗?", + "reconnect_your_hardware_wallet": "重新连接您的硬件钱包", "reconnection": "重新连接", "red_dark_theme": "红色的黑暗主题", "red_light_theme": "红灯主题", @@ -749,6 +755,10 @@ "silent_payments_settings": "无声付款设置", "single_seed_wallets_group": "单个种子钱包", "slidable": "可滑动", + "solana_create_associated_token_account_exception": "错误创建有关接收地址的关联令牌帐户。", + "solana_no_associated_token_account_exception": "该地址没有关联的令牌帐户。", + "solana_sign_native_transaction_rent_exception": "交易无法完成。交易后剩下的溶胶不足。请增强您的溶胶余额或减少您发送的SOL的量。", + "solana_sign_spl_token_transaction_rent_exception": "交易无法完成。交易后剩下的溶胶不足。请增强您的溶液余额。", "sort_by": "排序方式", "spend_key_private": "Spend 密钥 (私钥)", "spend_key_public": "Spend 密钥 (公钥)", @@ -761,7 +771,7 @@ "support_description_guides": "对常见问题的文档和支持", "support_description_live_chat": "免费快速!训练有素的支持代表可以协助", "support_description_other_links": "加入我们的社区或通过其他方法与我们联系我们的合作伙伴", - "support_title_guides": "蛋糕钱包指南", + "support_title_guides": "蛋糕钱包文档", "support_title_live_chat": "实时支持", "support_title_other_links": "其他支持链接", "sweeping_wallet": "扫一扫钱包",