mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-01-30 22:46:10 +00:00
WIP: CW-665 Implement AirGapped Monero Transactions (#1535)
* replace qr scanner with fast_scanner * bump java version * fix qr code scanning * add flashlight and camera switch * airgap work * commitTransactionUR * bump fast_scanner, fix configure script * add option to restore wallet from NERO qr format * fixes to the flow and logic use gsed or otherwise it fails? * remove Expanded() to fix URQR on release builds * cache key to allow app updates * rename cache key * [skip ci] cache key.jks in cache_dependencies * update fast_scanner to work on ios, with light mlkit dependency * ui fixes * error handling fix * update fast_scanner to drop iOS dependency * changes from review * Update lib/entities/qr_scanner.dart * changes from review * remove useless commit * don't set state multiple times remove return Container() for non monero wallets * return on fail don't handle empty qr codes * set node as trusted display primary address in seed screen * fix wow and haven * migrate node to trusted * - update trusted node for existing users - update locales - fix conflicts - move menu item --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
This commit is contained in:
parent
8e12fb1ad9
commit
cea3084bb3
84 changed files with 1318 additions and 141 deletions
3
.github/workflows/cache_dependencies.yml
vendored
3
.github/workflows/cache_dependencies.yml
vendored
|
@ -62,10 +62,9 @@ jobs:
|
|||
/opt/android/cake_wallet/cw_haven/android/.cxx
|
||||
/opt/android/cake_wallet/scripts/monero_c/release
|
||||
key: ${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh' ,'**/cache_dependencies.yml') }}
|
||||
|
||||
- if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
|
||||
name: Generate Externals
|
||||
run: |
|
||||
cd /opt/android/cake_wallet/scripts/android/
|
||||
source ./app_env.sh cakewallet
|
||||
./build_monero_all.sh
|
||||
./build_monero_all.sh
|
4
.github/workflows/pr_test_build_android.yml
vendored
4
.github/workflows/pr_test_build_android.yml
vendored
|
@ -82,7 +82,8 @@ jobs:
|
|||
path: |
|
||||
/opt/android/cake_wallet/cw_haven/android/.cxx
|
||||
/opt/android/cake_wallet/scripts/monero_c/release
|
||||
key: ${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh' ,'**/cache_dependencies.yml') }}
|
||||
/opt/android/cake_wallet/android/app/key.jks
|
||||
key: android_${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh' ,'**/cache_dependencies.yml') }}
|
||||
|
||||
- if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
|
||||
name: Generate Externals
|
||||
|
@ -116,6 +117,7 @@ jobs:
|
|||
./build_mwebd.sh --dont-install
|
||||
|
||||
- name: Generate KeyStore
|
||||
if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
|
||||
run: |
|
||||
cd /opt/android/cake_wallet/android/app
|
||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias testKey -noprompt -dname "CN=CakeWallet, OU=CakeWallet, O=CakeWallet, L=Florida, S=America, C=USA" -storepass $STORE_PASS -keypass $KEY_PASS
|
||||
|
|
|
@ -92,3 +92,8 @@ dependencies {
|
|||
androidTestImplementation 'androidx.test:runner:1.3.0'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||
}
|
||||
configurations {
|
||||
implementation.exclude module:'proto-google-common-protos'
|
||||
implementation.exclude module:'protolite-well-known-types'
|
||||
implementation.exclude module:'protobuf-javalite'
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
org.gradle.jvmargs=-Xmx1536M
|
||||
org.gradle.jvmargs=-Xmx3072M
|
||||
android.enableR8=true
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
-
|
||||
uri: xmr-node.cakewallet.com:18081
|
||||
is_default: true
|
||||
trusted: true
|
||||
-
|
||||
uri: cakexmrl7bonq7ovjka5kuwuyd3f7qnkz6z6s6dmsy3uckwra7bvggyd.onion:18081
|
||||
is_default: false
|
||||
|
|
|
@ -153,4 +153,9 @@ class PendingBitcoinTransaction with PendingTransaction {
|
|||
inputAddresses: _tx.inputs.map((input) => input.txId).toList(),
|
||||
outputAddresses: outputAddresses,
|
||||
fee: fee);
|
||||
|
||||
@override
|
||||
Future<String?> commitUR() {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,4 +85,8 @@ class PendingBitcoinCashTransaction with PendingTransaction {
|
|||
fee: fee,
|
||||
isReplaced: false,
|
||||
);
|
||||
@override
|
||||
Future<String?> commitUR() {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
class MoneroWalletKeys {
|
||||
const MoneroWalletKeys(
|
||||
{required this.privateSpendKey,
|
||||
{required this.primaryAddress,
|
||||
required this.privateSpendKey,
|
||||
required this.privateViewKey,
|
||||
required this.publicSpendKey,
|
||||
required this.publicViewKey});
|
||||
|
||||
final String primaryAddress;
|
||||
final String publicViewKey;
|
||||
final String privateViewKey;
|
||||
final String publicSpendKey;
|
||||
|
|
|
@ -14,5 +14,8 @@ mixin PendingTransaction {
|
|||
int? get outputCount => null;
|
||||
PendingChange? change;
|
||||
|
||||
bool shouldCommitUR() => false;
|
||||
|
||||
Future<void> commit();
|
||||
Future<String?> commitUR();
|
||||
}
|
||||
|
|
|
@ -47,4 +47,9 @@ class PendingEVMChainTransaction with PendingTransaction {
|
|||
|
||||
return '0x${Hex.HEX.encode(txid)}';
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String?> commitUR() {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,4 +2,9 @@ class WalletRestoreFromKeysException implements Exception {
|
|||
WalletRestoreFromKeysException({required this.message});
|
||||
|
||||
final String message;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return message;
|
||||
}
|
||||
}
|
|
@ -73,6 +73,7 @@ abstract class HavenWalletBase
|
|||
|
||||
@override
|
||||
MoneroWalletKeys get keys => MoneroWalletKeys(
|
||||
primaryAddress: haven_wallet.getAddress(accountIndex: 0, addressIndex: 0),
|
||||
privateSpendKey: haven_wallet.getSecretSpendKey(),
|
||||
privateViewKey: haven_wallet.getSecretViewKey(),
|
||||
publicSpendKey: haven_wallet.getPublicSpendKey(),
|
||||
|
|
|
@ -48,4 +48,9 @@ class PendingHavenTransaction with PendingTransaction {
|
|||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String?> commitUR() {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ import 'package:cw_monero/api/wallet.dart';
|
|||
import 'package:monero/monero.dart' as monero;
|
||||
|
||||
monero.wallet? wptr = null;
|
||||
bool get isViewOnly => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0;
|
||||
|
||||
int _wlptrForW = 0;
|
||||
monero.WalletListener? _wlptr = null;
|
||||
|
|
|
@ -13,7 +13,13 @@ import 'package:mutex/mutex.dart';
|
|||
|
||||
|
||||
String getTxKey(String txId) {
|
||||
return monero.Wallet_getTxKey(wptr!, txid: txId);
|
||||
final txKey = monero.Wallet_getTxKey(wptr!, txid: txId);
|
||||
final status = monero.Wallet_status(wptr!);
|
||||
if (status != 0) {
|
||||
final error = monero.Wallet_errorString(wptr!);
|
||||
return txId+"_"+error;
|
||||
}
|
||||
return txKey;
|
||||
}
|
||||
final txHistoryMutex = Mutex();
|
||||
monero.TransactionHistory? txhistory;
|
||||
|
@ -178,12 +184,13 @@ PendingTransactionDescription createTransactionMultDestSync(
|
|||
);
|
||||
}
|
||||
|
||||
void commitTransactionFromPointerAddress({required int address}) =>
|
||||
commitTransaction(transactionPointer: monero.PendingTransaction.fromAddress(address));
|
||||
String? commitTransactionFromPointerAddress({required int address, required bool useUR}) =>
|
||||
commitTransaction(transactionPointer: monero.PendingTransaction.fromAddress(address), useUR: useUR);
|
||||
|
||||
void commitTransaction({required monero.PendingTransaction transactionPointer}) {
|
||||
|
||||
final txCommit = monero.PendingTransaction_commit(transactionPointer, filename: '', overwrite: false);
|
||||
String? commitTransaction({required monero.PendingTransaction transactionPointer, required bool useUR}) {
|
||||
final txCommit = useUR
|
||||
? monero.PendingTransaction_commitUR(transactionPointer, 120)
|
||||
: monero.PendingTransaction_commit(transactionPointer, filename: '', overwrite: false);
|
||||
|
||||
final String? error = (() {
|
||||
final status = monero.PendingTransaction_status(transactionPointer.cast());
|
||||
|
@ -196,6 +203,11 @@ void commitTransaction({required monero.PendingTransaction transactionPointer})
|
|||
if (error != null) {
|
||||
throw CreationTransactionException(message: error);
|
||||
}
|
||||
if (useUR) {
|
||||
return txCommit as String?;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Future<PendingTransactionDescription> _createTransactionSync(Map args) async {
|
||||
|
|
|
@ -425,3 +425,5 @@ Future<void> restoreFromSpendKey(
|
|||
});
|
||||
|
||||
bool isWalletExist({required String path}) => _isWalletExist(path);
|
||||
|
||||
bool isViewOnlyBySpendKey() => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0;
|
|
@ -19,6 +19,7 @@ import 'package:cw_core/transaction_direction.dart';
|
|||
import 'package:cw_core/unspent_coins_info.dart';
|
||||
import 'package:cw_core/wallet_base.dart';
|
||||
import 'package:cw_core/wallet_info.dart';
|
||||
import 'package:cw_monero/api/account_list.dart';
|
||||
import 'package:cw_monero/api/coins_info.dart';
|
||||
import 'package:cw_monero/api/monero_output.dart';
|
||||
import 'package:cw_monero/api/structs/pending_transaction.dart';
|
||||
|
@ -121,6 +122,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
|
|||
|
||||
@override
|
||||
MoneroWalletKeys get keys => MoneroWalletKeys(
|
||||
primaryAddress: monero_wallet.getAddress(accountIndex: 0, addressIndex: 0),
|
||||
privateSpendKey: monero_wallet.getSecretSpendKey(),
|
||||
privateViewKey: monero_wallet.getSecretViewKey(),
|
||||
publicSpendKey: monero_wallet.getPublicSpendKey(),
|
||||
|
@ -230,6 +232,36 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
|
|||
}
|
||||
}
|
||||
|
||||
Future<bool> submitTransactionUR(String ur) async {
|
||||
final retStatus = monero.Wallet_submitTransactionUR(wptr!, ur);
|
||||
final status = monero.Wallet_status(wptr!);
|
||||
if (status != 0) {
|
||||
final err = monero.Wallet_errorString(wptr!);
|
||||
throw MoneroTransactionCreationException("unable to broadcast signed transaction: $err");
|
||||
}
|
||||
return retStatus;
|
||||
}
|
||||
|
||||
bool importKeyImagesUR(String ur) {
|
||||
final retStatus = monero.Wallet_importKeyImagesUR(wptr!, ur);
|
||||
final status = monero.Wallet_status(wptr!);
|
||||
if (status != 0) {
|
||||
final err = monero.Wallet_errorString(wptr!);
|
||||
throw Exception("unable to import key images: $err");
|
||||
}
|
||||
return retStatus;
|
||||
}
|
||||
|
||||
String exportOutputsUR(bool all) {
|
||||
final str = monero.Wallet_exportOutputsUR(wptr!, all: all);
|
||||
final status = monero.Wallet_status(wptr!);
|
||||
if (status != 0) {
|
||||
final err = monero.Wallet_errorString(wptr!);
|
||||
throw MoneroTransactionCreationException("unable to export UR: $err");
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<PendingTransaction> createTransaction(Object credentials) async {
|
||||
final _credentials = credentials as MoneroTransactionCreationCredentials;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:cw_monero/api/account_list.dart';
|
||||
import 'package:cw_monero/api/structs/pending_transaction.dart';
|
||||
import 'package:cw_monero/api/transaction_history.dart'
|
||||
as monero_transaction_history;
|
||||
|
@ -35,11 +36,32 @@ class PendingMoneroTransaction with PendingTransaction {
|
|||
String get feeFormatted => AmountConverter.amountIntToString(
|
||||
CryptoCurrency.xmr, pendingTransactionDescription.fee);
|
||||
|
||||
bool shouldCommitUR() => isViewOnly;
|
||||
|
||||
@override
|
||||
Future<void> commit() async {
|
||||
try {
|
||||
monero_transaction_history.commitTransactionFromPointerAddress(
|
||||
address: pendingTransactionDescription.pointerAddress);
|
||||
address: pendingTransactionDescription.pointerAddress,
|
||||
useUR: false);
|
||||
} catch (e) {
|
||||
final message = e.toString();
|
||||
|
||||
if (message.contains('Reason: double spend')) {
|
||||
throw DoubleSpendException();
|
||||
}
|
||||
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String?> commitUR() async {
|
||||
try {
|
||||
final ret = monero_transaction_history.commitTransactionFromPointerAddress(
|
||||
address: pendingTransactionDescription.pointerAddress,
|
||||
useUR: true);
|
||||
return ret;
|
||||
} catch (e) {
|
||||
final message = e.toString();
|
||||
|
||||
|
|
|
@ -37,4 +37,9 @@ class PendingNanoTransaction with PendingTransaction {
|
|||
await nanoClient.processBlock(block, "send");
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String?> commitUR() {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
|
189
cw_shared_external/pubspec.lock
Normal file
189
cw_shared_external/pubspec.lock
Normal file
|
@ -0,0 +1,189 @@
|
|||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.11.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.18.0"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
leak_tracker:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.4"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
leak_tracker_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_testing
|
||||
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.16+1"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.0"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.12.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.0"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.11.1"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.0"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
vm_service:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.2.1"
|
||||
sdks:
|
||||
dart: ">=3.3.0 <4.0.0"
|
||||
flutter: ">=3.18.0-18.0.pre.54"
|
|
@ -40,4 +40,9 @@ class PendingSolanaTransaction with PendingTransaction {
|
|||
|
||||
@override
|
||||
String get id => '';
|
||||
|
||||
@override
|
||||
Future<String?> commitUR() {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,4 +30,9 @@ class PendingTronTransaction with PendingTransaction {
|
|||
|
||||
@override
|
||||
String get id => '';
|
||||
|
||||
@override
|
||||
Future<String?> commitUR() {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,5 +3,6 @@ class WalletRestoreFromKeysException implements Exception {
|
|||
|
||||
final String message;
|
||||
|
||||
@override
|
||||
String toString() => message;
|
||||
}
|
|
@ -50,4 +50,9 @@ class PendingWowneroTransaction with PendingTransaction {
|
|||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String?> commitUR() {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -120,6 +120,7 @@ abstract class WowneroWalletBase
|
|||
|
||||
@override
|
||||
MoneroWalletKeys get keys => MoneroWalletKeys(
|
||||
primaryAddress: wownero_wallet.getAddress(accountIndex: 0, addressIndex: 0),
|
||||
privateSpendKey: wownero_wallet.getSecretSpendKey(),
|
||||
privateViewKey: wownero_wallet.getSecretViewKey(),
|
||||
publicSpendKey: wownero_wallet.getPublicSpendKey(),
|
||||
|
|
|
@ -125,6 +125,7 @@ import 'package:cake_wallet/src/screens/subaddress/address_edit_or_create_page.d
|
|||
import 'package:cake_wallet/src/screens/support/support_page.dart';
|
||||
import 'package:cake_wallet/src/screens/support_chat/support_chat_page.dart';
|
||||
import 'package:cake_wallet/src/screens/support_other_links/support_other_links_page.dart';
|
||||
import 'package:cake_wallet/src/screens/ur/animated_ur_page.dart';
|
||||
import 'package:cake_wallet/src/screens/wallet/wallet_edit_page.dart';
|
||||
import 'package:cake_wallet/src/screens/wallet_connect/wc_connections_listing_view.dart';
|
||||
import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart';
|
||||
|
@ -134,6 +135,7 @@ import 'package:cake_wallet/utils/device_info.dart';
|
|||
import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
|
||||
import 'package:cake_wallet/utils/payment_request.dart';
|
||||
import 'package:cake_wallet/utils/responsive_layout_util.dart';
|
||||
import 'package:cake_wallet/view_model/animated_ur_model.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
|
||||
import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart';
|
||||
import 'package:cake_wallet/view_model/anonpay_details_view_model.dart';
|
||||
|
@ -903,6 +905,11 @@ Future<void> setup({
|
|||
getIt.registerFactory(() => WalletKeysViewModel(getIt.get<AppStore>()));
|
||||
|
||||
getIt.registerFactory(() => WalletKeysPage(getIt.get<WalletKeysViewModel>()));
|
||||
|
||||
getIt.registerFactory(() => AnimatedURModel(getIt.get<AppStore>()));
|
||||
|
||||
getIt.registerFactoryParam<AnimatedURPage, String, void>((String urQr, _) =>
|
||||
AnimatedURPage(getIt.get<AnimatedURModel>(), urQr: urQr));
|
||||
|
||||
getIt.registerFactoryParam<ContactViewModel, ContactRecord?, void>(
|
||||
(ContactRecord? contact, _) => ContactViewModel(_contactSource, contact: contact));
|
||||
|
|
|
@ -259,6 +259,10 @@ Future<void> defaultSettingsMigration(
|
|||
case 42:
|
||||
updateBtcElectrumNodeToUseSSL(nodes, sharedPreferences);
|
||||
break;
|
||||
case 43:
|
||||
_updateCakeXmrNode(nodes);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -273,6 +277,15 @@ Future<void> defaultSettingsMigration(
|
|||
await sharedPreferences.setInt(PreferencesKey.currentDefaultSettingsMigrationVersion, version);
|
||||
}
|
||||
|
||||
void _updateCakeXmrNode(Box<Node> nodes) {
|
||||
final node = nodes.values.firstWhereOrNull((element) => element.uriRaw == newCakeWalletMoneroUri);
|
||||
|
||||
if (node != null && !node.trusted) {
|
||||
node.trusted = true;
|
||||
node.save();
|
||||
}
|
||||
}
|
||||
|
||||
void updateBtcElectrumNodeToUseSSL(Box<Node> nodes, SharedPreferences sharedPreferences) {
|
||||
final btcElectrumNode = nodes.values.firstWhereOrNull((element) => element.uriRaw == newCakeWalletBitcoinUri);
|
||||
|
||||
|
@ -843,7 +856,7 @@ Future<void> changeDefaultMoneroNode(
|
|||
}
|
||||
});
|
||||
|
||||
final newCakeWalletNode = Node(uri: newCakeWalletMoneroUri, type: WalletType.monero);
|
||||
final newCakeWalletNode = Node(uri: newCakeWalletMoneroUri, type: WalletType.monero, trusted: true);
|
||||
|
||||
await nodeSource.add(newCakeWalletNode);
|
||||
|
||||
|
|
|
@ -1,15 +1,376 @@
|
|||
import 'package:barcode_scan2/barcode_scan2.dart';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/main.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/utils/show_pop_up.dart';
|
||||
import 'package:fast_scanner/fast_scanner.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
|
||||
var isQrScannerShown = false;
|
||||
|
||||
Future<String> presentQRScanner() async {
|
||||
Future<String> presentQRScanner(BuildContext context) async {
|
||||
isQrScannerShown = true;
|
||||
try {
|
||||
final result = await BarcodeScanner.scan();
|
||||
final result = await Navigator.of(context).push<String>(
|
||||
MaterialPageRoute(
|
||||
builder:(context) {
|
||||
return BarcodeScannerSimple();
|
||||
},
|
||||
),
|
||||
);
|
||||
isQrScannerShown = false;
|
||||
return result.rawContent.trim();
|
||||
return result??'';
|
||||
} catch (e) {
|
||||
isQrScannerShown = false;
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/MrCyjaneK/fast_scanner/blob/master/example/lib/barcode_scanner_simple.dart
|
||||
class BarcodeScannerSimple extends StatefulWidget {
|
||||
const BarcodeScannerSimple({super.key});
|
||||
|
||||
@override
|
||||
State<BarcodeScannerSimple> createState() => _BarcodeScannerSimpleState();
|
||||
}
|
||||
|
||||
class _BarcodeScannerSimpleState extends State<BarcodeScannerSimple> {
|
||||
Barcode? _barcode;
|
||||
bool popped = false;
|
||||
|
||||
List<String> urCodes = [];
|
||||
late var ur = URQRToURQRData(urCodes);
|
||||
|
||||
void _handleBarcode(BarcodeCapture barcodes) {
|
||||
try {
|
||||
_handleBarcodeInternal(barcodes);
|
||||
} catch (e) {
|
||||
showPopUp<void>(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).error,
|
||||
alertContent: S.of(context).error_dialog_content,
|
||||
buttonText: 'ok',
|
||||
buttonAction: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
print(e);
|
||||
}
|
||||
}
|
||||
|
||||
void _handleBarcodeInternal(BarcodeCapture barcodes) {
|
||||
for (final barcode in barcodes.barcodes) {
|
||||
// don't handle unknown QR codes
|
||||
if (barcode.rawValue?.trim().isEmpty??false == false) continue;
|
||||
if (barcode.rawValue!.startsWith("ur:")) {
|
||||
if (urCodes.contains(barcode.rawValue)) continue;
|
||||
setState(() {
|
||||
urCodes.add(barcode.rawValue!);
|
||||
ur = URQRToURQRData(urCodes);
|
||||
});
|
||||
if (ur.progress == 1) {
|
||||
setState(() {
|
||||
popped = true;
|
||||
});
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||
Navigator.of(context).pop(ur.inputs.join("\n"));
|
||||
});
|
||||
};
|
||||
}
|
||||
}
|
||||
if (urCodes.isNotEmpty) return;
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_barcode = barcodes.barcodes.firstOrNull;
|
||||
});
|
||||
if (_barcode != null && popped != true) {
|
||||
setState(() {
|
||||
popped = true;
|
||||
});
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||
Navigator.of(context).pop(_barcode?.rawValue ?? "");
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final MobileScannerController ctrl = MobileScannerController();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Scan'),
|
||||
actions: [
|
||||
SwitchCameraButton(controller: ctrl),
|
||||
ToggleFlashlightButton(controller: ctrl),
|
||||
],
|
||||
),
|
||||
backgroundColor: Colors.black,
|
||||
body: Stack(
|
||||
children: [
|
||||
MobileScanner(
|
||||
onDetect: _handleBarcode,
|
||||
controller: ctrl,
|
||||
),
|
||||
if (ur.inputs.length != 0)
|
||||
Center(child:
|
||||
Text(
|
||||
"${ur.inputs.length}/${ur.count}",
|
||||
style: Theme.of(context).textTheme.displayLarge?.copyWith(color: Colors.white)
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
child: Center(
|
||||
child: SizedBox(
|
||||
width: 250,
|
||||
height: 250,
|
||||
child: CustomPaint(
|
||||
painter: ProgressPainter(
|
||||
urQrProgress: URQrProgress(
|
||||
expectedPartCount: ur.count - 1,
|
||||
processedPartsCount: ur.inputs.length,
|
||||
receivedPartIndexes: _urParts(),
|
||||
percentage: ur.progress,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
List<int> _urParts() {
|
||||
List<int> l = [];
|
||||
for (var inp in ur.inputs) {
|
||||
try {
|
||||
l.add(int.parse(inp.split("/")[1].split("-")[0]));
|
||||
} catch (e) {}
|
||||
}
|
||||
return l;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ToggleFlashlightButton extends StatelessWidget {
|
||||
const ToggleFlashlightButton({required this.controller, super.key});
|
||||
|
||||
final MobileScannerController controller;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ValueListenableBuilder(
|
||||
valueListenable: controller,
|
||||
builder: (context, state, child) {
|
||||
if (!state.isInitialized || !state.isRunning) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
switch (state.torchState) {
|
||||
case TorchState.auto:
|
||||
return IconButton(
|
||||
iconSize: 32.0,
|
||||
icon: const Icon(Icons.flash_auto),
|
||||
onPressed: () async {
|
||||
await controller.toggleTorch();
|
||||
},
|
||||
);
|
||||
case TorchState.off:
|
||||
return IconButton(
|
||||
iconSize: 32.0,
|
||||
icon: const Icon(Icons.flash_off),
|
||||
onPressed: () async {
|
||||
await controller.toggleTorch();
|
||||
},
|
||||
);
|
||||
case TorchState.on:
|
||||
return IconButton(
|
||||
iconSize: 32.0,
|
||||
icon: const Icon(Icons.flash_on),
|
||||
onPressed: () async {
|
||||
await controller.toggleTorch();
|
||||
},
|
||||
);
|
||||
case TorchState.unavailable:
|
||||
return const Icon(
|
||||
Icons.no_flash,
|
||||
color: Colors.grey,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class SwitchCameraButton extends StatelessWidget {
|
||||
const SwitchCameraButton({required this.controller, super.key});
|
||||
|
||||
final MobileScannerController controller;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ValueListenableBuilder(
|
||||
valueListenable: controller,
|
||||
builder: (context, state, child) {
|
||||
if (!state.isInitialized || !state.isRunning) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
final int? availableCameras = state.availableCameras;
|
||||
|
||||
if (availableCameras != null && availableCameras < 2) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
final Widget icon;
|
||||
|
||||
switch (state.cameraDirection) {
|
||||
case CameraFacing.front:
|
||||
icon = const Icon(Icons.camera_front);
|
||||
case CameraFacing.back:
|
||||
icon = const Icon(Icons.camera_rear);
|
||||
}
|
||||
|
||||
return IconButton(
|
||||
iconSize: 32.0,
|
||||
icon: icon,
|
||||
onPressed: () async {
|
||||
await controller.switchCamera();
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class URQRData {
|
||||
URQRData(
|
||||
{required this.tag,
|
||||
required this.str,
|
||||
required this.progress,
|
||||
required this.count,
|
||||
required this.error,
|
||||
required this.inputs});
|
||||
final String tag;
|
||||
final String str;
|
||||
final double progress;
|
||||
final int count;
|
||||
final String error;
|
||||
final List<String> inputs;
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
"tag": tag,
|
||||
"str": str,
|
||||
"progress": progress,
|
||||
"count": count,
|
||||
"error": error,
|
||||
"inputs": inputs,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
URQRData URQRToURQRData(List<String> urqr_) {
|
||||
final urqr = urqr_.toSet().toList();
|
||||
urqr.sort((s1, s2) {
|
||||
final s1s = s1.split("/");
|
||||
final s1frameStr = s1s[1].split("-");
|
||||
final s1curFrame = int.parse(s1frameStr[0]);
|
||||
final s2s = s2.split("/");
|
||||
final s2frameStr = s2s[1].split("-");
|
||||
final s2curFrame = int.parse(s2frameStr[0]);
|
||||
return s1curFrame - s2curFrame;
|
||||
});
|
||||
|
||||
String tag = '';
|
||||
int count = 0;
|
||||
String bw = '';
|
||||
for (var elm in urqr) {
|
||||
final s = elm.substring(elm.indexOf(":") + 1); // strip down ur: prefix
|
||||
final s2 = s.split("/");
|
||||
tag = s2[0];
|
||||
final frameStr = s2[1].split("-");
|
||||
// final curFrame = int.parse(frameStr[0]);
|
||||
count = int.parse(frameStr[1]);
|
||||
final byteWords = s2[2];
|
||||
bw += byteWords;
|
||||
}
|
||||
String? error;
|
||||
|
||||
return URQRData(
|
||||
tag: tag,
|
||||
str: bw,
|
||||
progress: count == 0 ? 0 : (urqr.length / count),
|
||||
count: count,
|
||||
error: error ?? "",
|
||||
inputs: urqr,
|
||||
);
|
||||
}
|
||||
|
||||
class ProgressPainter extends CustomPainter {
|
||||
final URQrProgress urQrProgress;
|
||||
|
||||
ProgressPainter({required this.urQrProgress});
|
||||
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
final c = Offset(size.width / 2.0, size.height / 2.0);
|
||||
final radius = size.width * 0.9;
|
||||
final rect = Rect.fromCenter(center: c, width: radius, height: radius);
|
||||
const fullAngle = 360.0;
|
||||
var startAngle = 0.0;
|
||||
for (int i = 0; i < urQrProgress.expectedPartCount.toInt(); i++) {
|
||||
var sweepAngle =
|
||||
(1 / urQrProgress.expectedPartCount) * fullAngle * pi / 180.0;
|
||||
drawSector(canvas, urQrProgress.receivedPartIndexes.contains(i), rect,
|
||||
startAngle, sweepAngle);
|
||||
startAngle += sweepAngle;
|
||||
}
|
||||
}
|
||||
|
||||
void drawSector(Canvas canvas, bool isActive, Rect rect, double startAngle,
|
||||
double sweepAngle) {
|
||||
final paint = Paint()
|
||||
..style = PaintingStyle.stroke
|
||||
..strokeWidth = 8
|
||||
..strokeCap = StrokeCap.round
|
||||
..strokeJoin = StrokeJoin.round
|
||||
..color = isActive ? const Color(0xffff6600) : Colors.white70;
|
||||
canvas.drawArc(rect, startAngle, sweepAngle, false, paint);
|
||||
}
|
||||
|
||||
@override
|
||||
bool shouldRepaint(covariant ProgressPainter oldDelegate) {
|
||||
return urQrProgress != oldDelegate.urQrProgress;
|
||||
}
|
||||
}
|
||||
|
||||
class URQrProgress {
|
||||
int expectedPartCount;
|
||||
int processedPartsCount;
|
||||
List<int> receivedPartIndexes;
|
||||
double percentage;
|
||||
|
||||
URQrProgress({
|
||||
required this.expectedPartCount,
|
||||
required this.processedPartsCount,
|
||||
required this.receivedPartIndexes,
|
||||
required this.percentage,
|
||||
});
|
||||
|
||||
bool equals(URQrProgress? progress) {
|
||||
if (progress == null) {
|
||||
return false;
|
||||
}
|
||||
return processedPartsCount == progress.processedPartsCount;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -204,7 +204,7 @@ Future<void> initializeAppConfigs() async {
|
|||
transactionDescriptions: transactionDescriptions,
|
||||
secureStorage: secureStorage,
|
||||
anonpayInvoiceInfo: anonpayInvoiceInfo,
|
||||
initialMigrationVersion: 42,
|
||||
initialMigrationVersion: 43,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -248,6 +248,7 @@ class CWMonero extends Monero {
|
|||
final moneroWallet = wallet as MoneroWallet;
|
||||
final keys = moneroWallet.keys;
|
||||
return <String, String>{
|
||||
'primaryAddress': keys.primaryAddress,
|
||||
'privateSpendKey': keys.privateSpendKey,
|
||||
'privateViewKey': keys.privateViewKey,
|
||||
'publicSpendKey': keys.publicSpendKey,
|
||||
|
@ -357,9 +358,32 @@ class CWMonero extends Monero {
|
|||
Future<int> getCurrentHeight() async {
|
||||
return monero_wallet_api.getCurrentHeight();
|
||||
}
|
||||
|
||||
@override
|
||||
bool importKeyImagesUR(Object wallet, String ur) {
|
||||
final moneroWallet = wallet as MoneroWallet;
|
||||
return moneroWallet.importKeyImagesUR(ur);
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
Future<bool> commitTransactionUR(Object wallet, String ur) {
|
||||
final moneroWallet = wallet as MoneroWallet;
|
||||
return moneroWallet.submitTransactionUR(ur);
|
||||
}
|
||||
|
||||
@override
|
||||
String exportOutputsUR(Object wallet, bool all) {
|
||||
final moneroWallet = wallet as MoneroWallet;
|
||||
return moneroWallet.exportOutputsUR(all);
|
||||
}
|
||||
|
||||
@override
|
||||
void monerocCheck() {
|
||||
checkIfMoneroCIsFine();
|
||||
}
|
||||
|
||||
bool isViewOnly() {
|
||||
return isViewOnlyBySpendKey();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -96,6 +96,7 @@ import 'package:cake_wallet/src/screens/transaction_details/rbf_details_page.dar
|
|||
import 'package:cake_wallet/src/screens/transaction_details/transaction_details_page.dart';
|
||||
import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_details_page.dart';
|
||||
import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart';
|
||||
import 'package:cake_wallet/src/screens/ur/animated_ur_page.dart';
|
||||
import 'package:cake_wallet/src/screens/wallet/wallet_edit_page.dart';
|
||||
import 'package:cake_wallet/src/screens/wallet_connect/wc_connections_listing_view.dart';
|
||||
import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
|
||||
|
@ -732,6 +733,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
case Routes.setup2faInfoPage:
|
||||
return MaterialPageRoute<void>(builder: (_) => getIt.get<Setup2FAInfoPage>());
|
||||
|
||||
case Routes.urqrAnimatedPage:
|
||||
return MaterialPageRoute<void>(builder: (_) => getIt.get<AnimatedURPage>(param1: settings.arguments));
|
||||
|
||||
case Routes.homeSettings:
|
||||
return CupertinoPageRoute<void>(
|
||||
builder: (_) => getIt.get<HomeSettingsPage>(param1: settings.arguments),
|
||||
|
|
|
@ -108,6 +108,7 @@ class Routes {
|
|||
|
||||
static const signPage = '/sign_page';
|
||||
static const connectDevices = '/device/connect';
|
||||
static const urqrAnimatedPage = '/urqr/animated_page';
|
||||
static const walletGroupsDisplayPage = '/wallet_groups_display_page';
|
||||
static const walletGroupDescription = '/wallet_group_description';
|
||||
}
|
||||
|
|
|
@ -347,8 +347,8 @@ class CakePayBuyCardDetailPage extends BasePage {
|
|||
rightButtonText: S.of(popupContext).send,
|
||||
leftButtonText: S.of(popupContext).cancel,
|
||||
actionRightButton: () async {
|
||||
Navigator.of(popupContext).pop();
|
||||
await cakePayPurchaseViewModel.sendViewModel.commitTransaction();
|
||||
Navigator.of(context).pop();
|
||||
await cakePayPurchaseViewModel.sendViewModel.commitTransaction(context);
|
||||
},
|
||||
actionLeftButton: () => Navigator.of(popupContext).pop()));
|
||||
},
|
||||
|
|
|
@ -101,6 +101,9 @@ class MenuWidgetState extends State<MenuWidget> {
|
|||
if (!widget.dashboardViewModel.hasSilentPayments) {
|
||||
items.removeWhere((element) => element.name(context) == S.of(context).silent_payments_settings);
|
||||
}
|
||||
if (!widget.dashboardViewModel.isMoneroViewOnly) {
|
||||
items.removeWhere((element) => element.name(context) == S.of(context).export_outputs);
|
||||
}
|
||||
if (!widget.dashboardViewModel.hasMweb) {
|
||||
items.removeWhere((element) => element.name(context) == S.of(context).litecoin_mweb_settings);
|
||||
}
|
||||
|
@ -189,7 +192,6 @@ class MenuWidgetState extends State<MenuWidget> {
|
|||
index--;
|
||||
|
||||
final item = items[index];
|
||||
|
||||
final isLastTile = index == itemCount - 1;
|
||||
|
||||
return SettingActionButton(
|
||||
|
|
|
@ -277,7 +277,7 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
|
|||
actionRightButton: () async {
|
||||
Navigator.of(popupContext).pop();
|
||||
await widget.exchangeTradeViewModel.sendViewModel
|
||||
.commitTransaction();
|
||||
.commitTransaction(context);
|
||||
transactionStatePopup();
|
||||
},
|
||||
actionLeftButton: () => Navigator.of(popupContext).pop(),
|
||||
|
|
|
@ -498,7 +498,7 @@ class SendPage extends BasePage {
|
|||
ValueKey('send_page_confirm_sending_dialog_cancel_button_key'),
|
||||
actionRightButton: () async {
|
||||
Navigator.of(_dialogContext).pop();
|
||||
sendViewModel.commitTransaction();
|
||||
sendViewModel.commitTransaction(context);
|
||||
await showPopUp<void>(
|
||||
context: context,
|
||||
builder: (BuildContext _dialogContext) {
|
||||
|
|
|
@ -4,6 +4,7 @@ import 'package:cake_wallet/src/widgets/setting_action_button.dart';
|
|||
import 'package:cake_wallet/src/widgets/setting_actions.dart';
|
||||
import 'package:cake_wallet/typography.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/router.dart' as Router;
|
||||
import 'package:cake_wallet/themes/extensions/menu_theme.dart';
|
||||
|
@ -60,8 +61,10 @@ class _DesktopSettingsPageState extends State<DesktopSettingsPage> {
|
|||
return Container();
|
||||
}
|
||||
|
||||
if (!widget.dashboardViewModel.hasMweb &&
|
||||
item.name(context) == S.of(context).litecoin_mweb_settings) {
|
||||
if ((!widget.dashboardViewModel.isMoneroViewOnly &&
|
||||
item.name(context) == S.of(context).export_outputs) ||
|
||||
(!widget.dashboardViewModel.hasMweb &&
|
||||
item.name(context) == S.of(context).litecoin_mweb_settings)) {
|
||||
return Container();
|
||||
}
|
||||
|
||||
|
|
|
@ -168,7 +168,7 @@ class RBFDetailsPage extends BasePage {
|
|||
leftButtonText: S.of(popupContext).cancel,
|
||||
actionRightButton: () async {
|
||||
Navigator.of(popupContext).pop();
|
||||
await transactionDetailsViewModel.sendViewModel.commitTransaction();
|
||||
await transactionDetailsViewModel.sendViewModel.commitTransaction(context);
|
||||
try {
|
||||
Navigator.of(popupContext).pop();
|
||||
} catch (_) {}
|
||||
|
|
184
lib/src/screens/ur/animated_ur_page.dart
Normal file
184
lib/src/screens/ur/animated_ur_page.dart
Normal file
|
@ -0,0 +1,184 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:cake_wallet/di.dart';
|
||||
import 'package:cake_wallet/entities/qr_scanner.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/monero/monero.dart';
|
||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||
import 'package:cake_wallet/src/screens/receive/widgets/qr_image.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/primary_button.dart';
|
||||
import 'package:cake_wallet/utils/show_pop_up.dart';
|
||||
import 'package:cake_wallet/view_model/animated_ur_model.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/wallet_balance.dart';
|
||||
import 'package:cw_core/balance.dart';
|
||||
import 'package:cw_core/transaction_history.dart';
|
||||
import 'package:cw_core/transaction_info.dart';
|
||||
import 'package:cw_core/wallet_base.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
// ur:xmr-txunsigned - unsigned transaction
|
||||
// should show a scanner afterwards.
|
||||
|
||||
class AnimatedURPage extends BasePage {
|
||||
final bool isAll;
|
||||
AnimatedURPage(this.animatedURmodel, {required String urQr, this.isAll = false}) {
|
||||
if (urQr == "export-outputs") {
|
||||
this.urQr = monero!.exportOutputsUR(animatedURmodel.wallet, false);
|
||||
} else if (urQr == "export-outputs-all") {
|
||||
this.urQr = monero!.exportOutputsUR(animatedURmodel.wallet, true);
|
||||
} else {
|
||||
this.urQr = urQr;
|
||||
}
|
||||
}
|
||||
|
||||
late String urQr;
|
||||
|
||||
final AnimatedURModel animatedURmodel;
|
||||
|
||||
String get urQrType {
|
||||
final first = urQr.trim().split("\n")[0];
|
||||
return first.split('/')[0];
|
||||
}
|
||||
|
||||
@override
|
||||
Widget body(BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 64.0),
|
||||
child: URQR(
|
||||
frames: urQr.trim().split("\n"),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 32),
|
||||
if (urQrType == "ur:xmr-txunsigned" || urQrType == "ur:xmr-output")
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||
child: SizedBox(
|
||||
width: double.maxFinite,
|
||||
child: PrimaryButton(
|
||||
onPressed: () => _continue(context),
|
||||
text: "Continue",
|
||||
color: Theme.of(context).primaryColor,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 32),
|
||||
if (urQrType == "ur:xmr-output" && !isAll) Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0),
|
||||
child: SizedBox(
|
||||
width: double.maxFinite,
|
||||
child: PrimaryButton(
|
||||
onPressed: () => _exportAll(context),
|
||||
text: "Export all",
|
||||
color: Theme.of(context).colorScheme.secondary,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
void _exportAll(BuildContext context) {
|
||||
Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute(
|
||||
builder: (context) {
|
||||
return AnimatedURPage(animatedURmodel, urQr: "export-outputs-all", isAll: true);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _continue(BuildContext context) async {
|
||||
try {
|
||||
switch (urQrType) {
|
||||
case "ur:xmr-txunsigned": // ur:xmr-txsigned
|
||||
final ur = await presentQRScanner(context);
|
||||
final result = await monero!.commitTransactionUR(animatedURmodel.wallet, ur);
|
||||
if (result) {
|
||||
Navigator.of(context).pop(true);
|
||||
}
|
||||
break;
|
||||
case "ur:xmr-output": // xmr-keyimage
|
||||
final ur = await presentQRScanner(context);
|
||||
final result = await monero!.importKeyImagesUR(animatedURmodel.wallet, ur);
|
||||
if (result) {
|
||||
Navigator.of(context).pop(true);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw UnimplementedError("unable to handle UR: ${urQrType}");
|
||||
}
|
||||
} catch (e) {
|
||||
await showPopUp<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).error,
|
||||
alertContent: e.toString(),
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () => Navigator.pop(context, true));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class URQR extends StatefulWidget {
|
||||
URQR({super.key, required this.frames});
|
||||
|
||||
List<String> frames;
|
||||
|
||||
@override
|
||||
// ignore: library_private_types_in_public_api
|
||||
_URQRState createState() => _URQRState();
|
||||
}
|
||||
|
||||
const urFrameTime = 1000 ~/ 5;
|
||||
|
||||
class _URQRState extends State<URQR> {
|
||||
Timer? t;
|
||||
int frame = 0;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
setState(() {
|
||||
t = Timer.periodic(const Duration(milliseconds: urFrameTime), (timer) {
|
||||
_nextFrame();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void _nextFrame() {
|
||||
setState(() {
|
||||
frame++;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
t?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Center(
|
||||
child: QrImage(
|
||||
data: widget.frames[frame % widget.frames.length], version: -1,
|
||||
size: 400,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
|
@ -65,7 +65,7 @@ class WCPairingsWidget extends BasePage {
|
|||
bool isCameraPermissionGranted =
|
||||
await PermissionHandler.checkPermission(Permission.camera, context);
|
||||
if (!isCameraPermissionGranted) return;
|
||||
uri = await presentQRScanner();
|
||||
uri = await presentQRScanner(context);
|
||||
} else {
|
||||
uri = await _showEnterWalletConnectURIPopUp(context);
|
||||
}
|
||||
|
|
|
@ -231,7 +231,7 @@ class AddressTextField extends StatelessWidget {
|
|||
bool isCameraPermissionGranted =
|
||||
await PermissionHandler.checkPermission(Permission.camera, context);
|
||||
if (!isCameraPermissionGranted) return;
|
||||
final code = await presentQRScanner();
|
||||
final code = await presentQRScanner(context);
|
||||
if (code.isEmpty) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ class SettingActions {
|
|||
addressBookSettingAction,
|
||||
silentPaymentsSettingAction,
|
||||
litecoinMwebSettingAction,
|
||||
exportOutputsAction,
|
||||
securityBackupSettingAction,
|
||||
privacySettingAction,
|
||||
displaySettingAction,
|
||||
|
@ -50,6 +51,16 @@ class SettingActions {
|
|||
},
|
||||
);
|
||||
|
||||
static SettingActions exportOutputsAction = SettingActions._(
|
||||
key: ValueKey('dashboard_page_menu_widget_export_outputs_settings_button_key'),
|
||||
name: (context) => S.of(context).export_outputs,
|
||||
image: 'assets/images/monero_menu.png',
|
||||
onTap: (BuildContext context) {
|
||||
Navigator.pop(context);
|
||||
Navigator.of(context).pushNamed(Routes.urqrAnimatedPage, arguments: 'export-outputs');
|
||||
},
|
||||
);
|
||||
|
||||
static SettingActions litecoinMwebSettingAction = SettingActions._(
|
||||
key: ValueKey('dashboard_page_menu_widget_litecoin_mweb_settings_button_key'),
|
||||
name: (context) => S.of(context).litecoin_mweb_settings,
|
||||
|
|
10
lib/view_model/animated_ur_model.dart
Normal file
10
lib/view_model/animated_ur_model.dart
Normal file
|
@ -0,0 +1,10 @@
|
|||
import 'package:cake_wallet/store/app_store.dart';
|
||||
import 'package:cw_core/wallet_base.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
|
||||
class AnimatedURModel with Store {
|
||||
AnimatedURModel(this.appStore)
|
||||
: wallet = appStore.wallet!;
|
||||
final AppStore appStore;
|
||||
final WalletBase wallet;
|
||||
}
|
|
@ -393,6 +393,12 @@ abstract class DashboardViewModelBase with Store {
|
|||
wallet.type == WalletType.wownero ||
|
||||
wallet.type == WalletType.haven;
|
||||
|
||||
@computed
|
||||
bool get isMoneroViewOnly {
|
||||
if (wallet.type != WalletType.monero) return false;
|
||||
return monero!.isViewOnly();
|
||||
}
|
||||
|
||||
@computed
|
||||
String? get getMoneroError {
|
||||
if (wallet.type != WalletType.monero) return null;
|
||||
|
|
|
@ -213,7 +213,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
|
|||
bool isCameraPermissionGranted =
|
||||
await PermissionHandler.checkPermission(Permission.camera, context);
|
||||
if (!isCameraPermissionGranted) return;
|
||||
String code = await presentQRScanner();
|
||||
String code = await presentQRScanner(context);
|
||||
|
||||
if (code.isEmpty) {
|
||||
throw Exception('Unexpected scan QR code value: value is empty');
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:cake_wallet/view_model/restore/restore_mode.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
|
||||
|
@ -32,6 +34,16 @@ class RestoredWallet {
|
|||
final String? privateKey;
|
||||
|
||||
factory RestoredWallet.fromKey(Map<String, dynamic> json) {
|
||||
try {
|
||||
final codeParsed = jsonDecode(json['raw_qr'].toString());
|
||||
if (codeParsed["version"] == 0) {
|
||||
json['address'] = codeParsed["primaryAddress"];
|
||||
json['view_key'] = codeParsed["privateViewKey"];
|
||||
json['height'] = codeParsed["restoreHeight"].toString();
|
||||
}
|
||||
} catch (e) {
|
||||
// fine, we don't care, it is only for monero anyway
|
||||
}
|
||||
final height = json['height'] as String?;
|
||||
return RestoredWallet(
|
||||
restoreMode: json['mode'] as WalletRestoreMode,
|
||||
|
@ -39,7 +51,7 @@ class RestoredWallet {
|
|||
address: json['address'] as String?,
|
||||
spendKey: json['spend_key'] as String?,
|
||||
viewKey: json['view_key'] as String?,
|
||||
height: height != null ? int.parse(height) : 0,
|
||||
height: height != null ? int.tryParse(height)??0 : 0,
|
||||
privateKey: json['private_key'] as String?,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:cake_wallet/core/seed_validator.dart';
|
||||
import 'package:cake_wallet/entities/parse_address_from_domain.dart';
|
||||
import 'package:cake_wallet/entities/qr_scanner.dart';
|
||||
|
@ -48,6 +50,17 @@ class WalletRestoreFromQRCode {
|
|||
|
||||
final extracted = sortedKeys.firstWhereOrNull((key) => code.toLowerCase().contains(key));
|
||||
|
||||
if (extracted == null) {
|
||||
// Special case for view-only monero wallet
|
||||
final codeParsed = json.decode(code);
|
||||
if (codeParsed["version"] == 0 &&
|
||||
codeParsed["primaryAddress"] != null &&
|
||||
codeParsed["privateViewKey"] != null &&
|
||||
codeParsed["restoreHeight"] != null) {
|
||||
return WalletType.monero;
|
||||
}
|
||||
}
|
||||
|
||||
return _walletTypeMap[extracted];
|
||||
}
|
||||
|
||||
|
@ -75,7 +88,7 @@ class WalletRestoreFromQRCode {
|
|||
}
|
||||
|
||||
static Future<RestoredWallet> scanQRCodeForRestoring(BuildContext context) async {
|
||||
String code = await presentQRScanner();
|
||||
String code = await presentQRScanner(context);
|
||||
if (code.isEmpty) throw Exception('Unexpected scan QR code value: value is empty');
|
||||
|
||||
WalletType? walletType;
|
||||
|
@ -109,7 +122,7 @@ class WalletRestoreFromQRCode {
|
|||
queryParameters['address'] = _extractAddressFromUrl(code, walletType!);
|
||||
}
|
||||
|
||||
Map<String, dynamic> credentials = {'type': walletType, ...queryParameters};
|
||||
Map<String, dynamic> credentials = {'type': walletType, ...queryParameters, 'raw_qr': code};
|
||||
|
||||
credentials['mode'] = _determineWalletRestoreMode(credentials);
|
||||
|
||||
|
@ -205,6 +218,17 @@ class WalletRestoreFromQRCode {
|
|||
return WalletRestoreMode.keys;
|
||||
}
|
||||
|
||||
if (type == WalletType.monero) {
|
||||
final codeParsed = json.decode(credentials['raw_qr'].toString());
|
||||
if (codeParsed["version"] != 0) throw UnimplementedError("Found view-only restore with unsupported version");
|
||||
if (codeParsed["primaryAddress"] == null ||
|
||||
codeParsed["privateViewKey"] == null ||
|
||||
codeParsed["restoreHeight"] == null) {
|
||||
throw UnimplementedError("Missing one or more attributes in the JSON");
|
||||
}
|
||||
return WalletRestoreMode.keys;
|
||||
}
|
||||
|
||||
throw Exception('Unexpected restore mode: restore params are invalid');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:cake_wallet/di.dart';
|
||||
import 'package:cake_wallet/entities/contact.dart';
|
||||
import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
|
||||
import 'package:cake_wallet/entities/transaction_description.dart';
|
||||
|
@ -10,7 +11,9 @@ import 'package:cake_wallet/entities/contact_record.dart';
|
|||
import 'package:cake_wallet/entities/wallet_contact.dart';
|
||||
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';
|
||||
|
@ -23,6 +26,7 @@ import 'package:cw_core/transaction_priority.dart';
|
|||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
import 'package:cake_wallet/view_model/send/output.dart';
|
||||
import 'package:cake_wallet/view_model/send/send_template_view_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:cake_wallet/entities/template.dart';
|
||||
|
@ -457,7 +461,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
|||
}
|
||||
|
||||
@action
|
||||
Future<void> commitTransaction() async {
|
||||
Future<void> commitTransaction(BuildContext context) async {
|
||||
if (pendingTransaction == null) {
|
||||
throw Exception("Pending transaction doesn't exist. It should not be happened.");
|
||||
}
|
||||
|
@ -476,7 +480,17 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
|||
|
||||
try {
|
||||
state = TransactionCommitting();
|
||||
await pendingTransaction!.commit();
|
||||
|
||||
if (pendingTransaction!.shouldCommitUR()) {
|
||||
final urstr = await pendingTransaction!.commitUR();
|
||||
final result = await Navigator.of(context).pushNamed(Routes.urqrAnimatedPage, arguments: urstr);
|
||||
if (result == null) {
|
||||
state = FailureState("Canceled by user");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
await pendingTransaction!.commit();
|
||||
}
|
||||
|
||||
if (walletType == WalletType.nano) {
|
||||
nano!.updateTransactions(wallet);
|
||||
|
|
|
@ -72,6 +72,10 @@ abstract class WalletKeysViewModelBase with Store {
|
|||
final keys = monero!.getKeys(_appStore.wallet!);
|
||||
|
||||
items.addAll([
|
||||
if (keys['primaryAddress'] != null)
|
||||
StandartListItem(
|
||||
title: S.current.primary_address,
|
||||
value: keys['primaryAddress']!),
|
||||
if (keys['publicSpendKey'] != null)
|
||||
StandartListItem(
|
||||
key: ValueKey('${_walletName}_wallet_public_spend_key_item_key'),
|
||||
|
@ -131,6 +135,10 @@ abstract class WalletKeysViewModelBase with Store {
|
|||
final keys = haven!.getKeys(_appStore.wallet!);
|
||||
|
||||
items.addAll([
|
||||
if (keys['primaryAddress'] != null)
|
||||
StandartListItem(
|
||||
title: S.current.primary_address,
|
||||
value: keys['primaryAddress']!),
|
||||
if (keys['publicSpendKey'] != null)
|
||||
StandartListItem(
|
||||
key: ValueKey('${_walletName}_wallet_public_spend_key_item_key'),
|
||||
|
@ -168,6 +176,10 @@ abstract class WalletKeysViewModelBase with Store {
|
|||
final keys = wownero!.getKeys(_appStore.wallet!);
|
||||
|
||||
items.addAll([
|
||||
if (keys['primaryAddress'] != null)
|
||||
StandartListItem(
|
||||
title: S.current.primary_address,
|
||||
value: keys['primaryAddress']!),
|
||||
if (keys['publicSpendKey'] != null)
|
||||
StandartListItem(
|
||||
key: ValueKey('${_walletName}_wallet_public_spend_key_item_key'),
|
||||
|
|
|
@ -10,7 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
|||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
sp_scanner
|
||||
)
|
||||
|
||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||
|
|
|
@ -6,9 +6,9 @@ import FlutterMacOS
|
|||
import Foundation
|
||||
|
||||
import connectivity_plus
|
||||
import cw_mweb
|
||||
import device_info_plus
|
||||
import devicelocale
|
||||
import fast_scanner
|
||||
import flutter_inappwebview_macos
|
||||
import flutter_local_authentication
|
||||
import flutter_secure_storage_macos
|
||||
|
@ -23,9 +23,9 @@ import wakelock_plus
|
|||
|
||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
|
||||
CwMwebPlugin.register(with: registry.registrar(forPlugin: "CwMwebPlugin"))
|
||||
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||
DevicelocalePlugin.register(with: registry.registrar(forPlugin: "DevicelocalePlugin"))
|
||||
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
|
||||
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
|
||||
FlutterLocalAuthenticationPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalAuthenticationPlugin"))
|
||||
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
|
||||
|
|
|
@ -8,6 +8,8 @@ PODS:
|
|||
- FlutterMacOS
|
||||
- devicelocale (0.0.1):
|
||||
- FlutterMacOS
|
||||
- fast_scanner (5.1.1):
|
||||
- FlutterMacOS
|
||||
- flutter_inappwebview_macos (0.0.1):
|
||||
- FlutterMacOS
|
||||
- OrderedSet (~> 5.0)
|
||||
|
@ -42,6 +44,7 @@ DEPENDENCIES:
|
|||
- cw_mweb (from `Flutter/ephemeral/.symlinks/plugins/cw_mweb/macos`)
|
||||
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
|
||||
- devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`)
|
||||
- fast_scanner (from `Flutter/ephemeral/.symlinks/plugins/fast_scanner/macos`)
|
||||
- flutter_inappwebview_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos`)
|
||||
- flutter_local_authentication (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_authentication/macos`)
|
||||
- flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`)
|
||||
|
@ -69,6 +72,8 @@ EXTERNAL SOURCES:
|
|||
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
|
||||
devicelocale:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/devicelocale/macos
|
||||
fast_scanner:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/fast_scanner/macos
|
||||
flutter_inappwebview_macos:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos
|
||||
flutter_local_authentication:
|
||||
|
@ -99,6 +104,7 @@ SPEC CHECKSUMS:
|
|||
cw_mweb: 7440b12ead811dda972a9918442ea2a458e8742c
|
||||
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
|
||||
devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225
|
||||
fast_scanner: d31bae07e2653403a69dac99fb710c1722b16a97
|
||||
flutter_inappwebview_macos: 9600c9df9fdb346aaa8933812009f8d94304203d
|
||||
flutter_local_authentication: 85674893931e1c9cfa7c9e4f5973cb8c56b018b0
|
||||
flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea
|
||||
|
|
|
@ -14,8 +14,10 @@ dependencies:
|
|||
# provider: ^6.0.3
|
||||
rxdart: ^0.28.0
|
||||
yaml: ^3.1.1
|
||||
#barcode_scan: any
|
||||
barcode_scan2: ^4.2.1
|
||||
fast_scanner:
|
||||
git:
|
||||
url: https://github.com/MrCyjaneK/fast_scanner
|
||||
ref: c8311b46cc67dd02250970a54d2a4526168187f3
|
||||
http: ^1.1.0
|
||||
path_provider: ^2.0.11
|
||||
mobx: ^2.1.4
|
||||
|
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "رابط Clearnet",
|
||||
"close": "يغلق",
|
||||
"coin_control": "التحكم في العملة (اختياري)",
|
||||
"cold_or_recover_wallet": "أضف محفظة باردة أو استعد محفظة ورقية",
|
||||
"cold_or_recover_wallet": "أضف محفظة للقراءة فقط من Cupcake أو محفظة باردة أو استعاد محفظة ورقية",
|
||||
"color_theme": "سمة اللون",
|
||||
"commit_transaction_amount_fee": "تنفيذ الصفقة\nالمبلغ: ${amount}\nالرسوم: ${fee}",
|
||||
"confirm": "تأكيد",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "جهات الاتصال",
|
||||
"contact_list_wallets": "محافظ",
|
||||
"contact_name": "اسم جهة الاتصال",
|
||||
"contact_name_exists": " .ﻒﻠﺘﺨﻣ ﻢﺳﺍ ﺭﺎﻴﺘﺧﺍ ءﺎﺟﺮﻟﺍ .ﻞﻌﻔﻟﺎﺑ ﺓﺩﻮﺟﻮﻣ ﻢﺳﻻﺍ ﺍﺬﻬﺑ ﻝﺎﺼﺗﺍ ﺔﻬﺟ",
|
||||
"contact_support": "اتصل بالدعم",
|
||||
"continue_text": "التالي",
|
||||
"contract_warning": "تم وضع علامة على عنوان العقد هذا على أنه احتيالي محتمل. يرجى المعالجة بحذر.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "انتهاء الصلاحية والصلاحية",
|
||||
"export_backup": "تصدير نسخة احتياطية",
|
||||
"export_logs": "سجلات التصدير",
|
||||
"export_outputs": "مخرجات التصدير",
|
||||
"extra_id": "معرف إضافي:",
|
||||
"extracted_address_content": "سوف ترسل الأموال إلى\n${recipient_name}",
|
||||
"failed_authentication": "${state_error} فشل المصادقة.",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven بواسطة Cake Wallet",
|
||||
"haven_app_wallet_text": "محفظة رائعة ل Haven",
|
||||
"help": "مساعده",
|
||||
"hidden_addresses": "العناوين المخفية",
|
||||
"hidden_balance": "الميزان الخفي",
|
||||
"hide": "يخفي",
|
||||
"hide_details": "أخف التفاصيل",
|
||||
"high_contrast_theme": "موضوع عالي التباين",
|
||||
"home_screen_settings": "إعدادات الشاشة الرئيسية",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "مهم",
|
||||
"prepaid_cards": "البطاقات المدفوعة مسبقا",
|
||||
"prevent_screenshots": "منع لقطات الشاشة وتسجيل الشاشة",
|
||||
"primary_address": "العنوان الأساسي",
|
||||
"privacy": "خصوصية",
|
||||
"privacy_policy": "سياسة الخصوصية",
|
||||
"privacy_settings": "إعدادات الخصوصية",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "يشارك",
|
||||
"share_address": "شارك العنوان",
|
||||
"shared_seed_wallet_groups": "مجموعات محفظة البذور المشتركة",
|
||||
"show": "يعرض",
|
||||
"show_details": "اظهر التفاصيل",
|
||||
"show_keys": "اظهار السييد / المفاتيح",
|
||||
"show_market_place": "إظهار السوق",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "انت تدفع",
|
||||
"you_will_get": "حول الى",
|
||||
"you_will_send": "تحويل من",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": " .ﻒﻠﺘﺨﻣ ﻢﺳﺍ ﺭﺎﻴﺘﺧﺍ ءﺎﺟﺮﻟﺍ .ﻞﻌﻔﻟﺎﺑ ﺓﺩﻮﺟﻮﻣ ﻢﺳﻻﺍ ﺍﺬﻬﺑ ﻝﺎﺼﺗﺍ ﺔﻬﺟ"
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Clearnet връзка",
|
||||
"close": "затвори",
|
||||
"coin_control": "Управление на монетите (не е задължително)",
|
||||
"cold_or_recover_wallet": "Добавете студен портфейл или възстановете хартиен портфейл",
|
||||
"cold_or_recover_wallet": "Добавете портфейл само за четене от Cupcake или студен портфейл или възстановете хартиен портфейл",
|
||||
"color_theme": "Цвят",
|
||||
"commit_transaction_amount_fee": "Изпълняване на транзакция\nСума: ${amount}\nТакса: ${fee}",
|
||||
"confirm": "Потвърждаване",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Контакти",
|
||||
"contact_list_wallets": "Моите портфейли",
|
||||
"contact_name": "Име на контакт",
|
||||
"contact_name_exists": "Вече съществува контакт с това име. Моля, изберете друго име.",
|
||||
"contact_support": "Свържи се с отдел поддръжка",
|
||||
"continue_text": "Напред",
|
||||
"contract_warning": "Този адрес на договора е маркиран като потенциално измамник. Моля, обработете с повишено внимание.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Изтичане и валидност",
|
||||
"export_backup": "Експортиране на резервно копие",
|
||||
"export_logs": "Експортни дневници",
|
||||
"export_outputs": "Експортни резултати",
|
||||
"extra_id": "Допълнително ID:",
|
||||
"extracted_address_content": "Ще изпратите средства на \n${recipient_name}",
|
||||
"failed_authentication": "Неуспешно удостоверяване. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven от Cake Wallet",
|
||||
"haven_app_wallet_text": "Невероятен портфейл за Haven",
|
||||
"help": "Помощ",
|
||||
"hidden_addresses": "Скрити адреси",
|
||||
"hidden_balance": "Скрит баланс",
|
||||
"hide": "Скрий",
|
||||
"hide_details": "Скриване на подробностите",
|
||||
"high_contrast_theme": "Тема с висок контраст",
|
||||
"home_screen_settings": "Настройки на началния екран",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "ВАЖНО",
|
||||
"prepaid_cards": "Предплатени карти",
|
||||
"prevent_screenshots": "Предотвратете екранни снимки и запис на екрана",
|
||||
"primary_address": "Първичен адрес",
|
||||
"privacy": "Поверителност",
|
||||
"privacy_policy": "Политика за поверителността",
|
||||
"privacy_settings": "Настройки за поверителност",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "Дял",
|
||||
"share_address": "Сподели адрес",
|
||||
"shared_seed_wallet_groups": "Споделени групи за портфейли за семена",
|
||||
"show": "Показване",
|
||||
"show_details": "Показване на подробностите",
|
||||
"show_keys": "Покажи seed/keys",
|
||||
"show_market_place": "Покажи пазар",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "Вие плащате",
|
||||
"you_will_get": "Обръщане в",
|
||||
"you_will_send": "Обръщане от",
|
||||
"yy": "гг",
|
||||
"contact_name_exists": "Вече съществува контакт с това име. Моля, изберете друго име."
|
||||
}
|
||||
"yy": "гг"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Odkaz na Clearnet",
|
||||
"close": "zavřít",
|
||||
"coin_control": "Volba mincí (nepovinné)",
|
||||
"cold_or_recover_wallet": "Přidejte studenou peněženku nebo obnovte papírovou peněženku",
|
||||
"cold_or_recover_wallet": "Přidejte peněženku pouze pro čtení z Cupcake nebo studené peněženky nebo obnovte papírovou peněženku",
|
||||
"color_theme": "Barevný motiv",
|
||||
"commit_transaction_amount_fee": "Odeslat transakci\nČástka: ${amount}\nPoplatek: ${fee}",
|
||||
"confirm": "Potvrdit",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Kontakty",
|
||||
"contact_list_wallets": "Moje peněženky",
|
||||
"contact_name": "Jméno kontaktu",
|
||||
"contact_name_exists": "Kontakt s tímto jménem již existuje. Vyberte prosím jiný název.",
|
||||
"contact_support": "Kontaktovat podporu",
|
||||
"continue_text": "Pokračovat",
|
||||
"contract_warning": "Tato adresa smlouvy byla označena jako potenciálně podvodná. Zpracovejte prosím opatrně.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Vypršení a platnost",
|
||||
"export_backup": "Exportovat zálohu",
|
||||
"export_logs": "Vývozní protokoly",
|
||||
"export_outputs": "Vývozní výstupy",
|
||||
"extra_id": "Extra ID:",
|
||||
"extracted_address_content": "Prostředky budete posílat na\n${recipient_name}",
|
||||
"failed_authentication": "Ověřování selhalo. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven od Cake Wallet",
|
||||
"haven_app_wallet_text": "Úžasná peněženka pro Haven",
|
||||
"help": "pomoc",
|
||||
"hidden_addresses": "Skryté adresy",
|
||||
"hidden_balance": "Skrytý zůstatek",
|
||||
"hide": "Skrýt",
|
||||
"hide_details": "Skrýt detaily",
|
||||
"high_contrast_theme": "Téma s vysokým kontrastem",
|
||||
"home_screen_settings": "Nastavení domovské obrazovky",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "DŮLEŽITÉ",
|
||||
"prepaid_cards": "Předplacené karty",
|
||||
"prevent_screenshots": "Zabránit vytváření snímků obrazovky a nahrávání obrazovky",
|
||||
"primary_address": "Primární adresa",
|
||||
"privacy": "Soukromí",
|
||||
"privacy_policy": "Zásady ochrany soukromí",
|
||||
"privacy_settings": "Nastavení soukromí",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "Podíl",
|
||||
"share_address": "Sdílet adresu",
|
||||
"shared_seed_wallet_groups": "Skupiny sdílených semen",
|
||||
"show": "Show",
|
||||
"show_details": "Zobrazit detaily",
|
||||
"show_keys": "Zobrazit seed/klíče",
|
||||
"show_market_place": "Zobrazit trh",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "Zaplatíte",
|
||||
"you_will_get": "Směnit na",
|
||||
"you_will_send": "Směnit z",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "Kontakt s tímto jménem již existuje. Vyberte prosím jiný název."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Clearnet-Link",
|
||||
"close": "Schließen",
|
||||
"coin_control": "Coin Control (optional)",
|
||||
"cold_or_recover_wallet": "Fügen Sie eine Cold Wallet hinzu oder stellen Sie eine Paper Wallet wieder her",
|
||||
"cold_or_recover_wallet": "Fügen Sie eine schreibgeschützte Brieftasche von Cupcake oder eine kalte Brieftasche hinzu oder erholen Sie sich eine Brieftasche",
|
||||
"color_theme": "Farbthema",
|
||||
"commit_transaction_amount_fee": "Transaktion absenden\nBetrag: ${amount}\nGebühr: ${fee}",
|
||||
"confirm": "Bestätigen",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Kontakte",
|
||||
"contact_list_wallets": "Meine Wallets",
|
||||
"contact_name": "Name des Kontakts",
|
||||
"contact_name_exists": "Ein Kontakt mit diesem Namen besteht bereits. Bitte wählen Sie einen anderen Namen.",
|
||||
"contact_support": "Support kontaktieren",
|
||||
"continue_text": "Weiter",
|
||||
"contract_warning": "Diese Vertragsadresse wurde als potenziell betrügerisch gekennzeichnet. Bitte verarbeiten Sie mit Vorsicht.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Ablauf und Gültigkeit",
|
||||
"export_backup": "Sicherung exportieren",
|
||||
"export_logs": "Exportprotokolle",
|
||||
"export_outputs": "Exportausgaben",
|
||||
"extra_id": "Extra ID:",
|
||||
"extracted_address_content": "Sie senden Geld an\n${recipient_name}",
|
||||
"failed_authentication": "Authentifizierung fehlgeschlagen. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven von Cake Wallet",
|
||||
"haven_app_wallet_text": "Eine großartige Wallet für Haven",
|
||||
"help": "hilfe",
|
||||
"hidden_addresses": "Versteckte Adressen",
|
||||
"hidden_balance": "Verstecktes Guthaben",
|
||||
"hide": "Verstecken",
|
||||
"hide_details": "Details ausblenden",
|
||||
"high_contrast_theme": "Kontrastreiches Thema",
|
||||
"home_screen_settings": "Einstellungen für den Startbildschirm",
|
||||
|
@ -501,6 +505,7 @@
|
|||
"pre_seed_title": "WICHTIG",
|
||||
"prepaid_cards": "Karten mit Guthaben",
|
||||
"prevent_screenshots": "Verhindern Sie Screenshots und Bildschirmaufzeichnungen",
|
||||
"primary_address": "Primäradresse",
|
||||
"privacy": "Datenschutz",
|
||||
"privacy_policy": "Datenschutzrichtlinie",
|
||||
"privacy_settings": "Datenschutzeinstellungen",
|
||||
|
@ -697,6 +702,7 @@
|
|||
"share": "Teilen",
|
||||
"share_address": "Adresse teilen ",
|
||||
"shared_seed_wallet_groups": "Gemeinsame Walletsseed Gruppen",
|
||||
"show": "Zeigen",
|
||||
"show_details": "Details anzeigen",
|
||||
"show_keys": "Seed/Schlüssel anzeigen",
|
||||
"show_market_place": "Marktplatz anzeigen",
|
||||
|
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Clearnet link",
|
||||
"close": "Close",
|
||||
"coin_control": "Coin control (optional)",
|
||||
"cold_or_recover_wallet": "Add a cold wallet or recover a paper wallet",
|
||||
"cold_or_recover_wallet": "Add a read-only wallet from Cupcake or a cold wallet or recover a paper wallet",
|
||||
"color_theme": "Color theme",
|
||||
"commit_transaction_amount_fee": "Commit transaction\nAmount: ${amount}\nFee: ${fee}",
|
||||
"confirm": "Confirm",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Contacts",
|
||||
"contact_list_wallets": "My Wallets",
|
||||
"contact_name": "Contact Name",
|
||||
"contact_name_exists": "A contact with that name already exists. Please choose a different name.",
|
||||
"contact_support": "Contact Support",
|
||||
"continue_text": "Continue",
|
||||
"contract_warning": "This contract address has been flagged as potentially fraudulent. Please process with caution.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Expiry and Validity",
|
||||
"export_backup": "Export backup",
|
||||
"export_logs": "Export logs",
|
||||
"export_outputs": "Export outputs",
|
||||
"extra_id": "Extra ID:",
|
||||
"extracted_address_content": "You will be sending funds to\n${recipient_name}",
|
||||
"failed_authentication": "Failed authentication. ${state_error}",
|
||||
|
@ -502,6 +504,7 @@
|
|||
"pre_seed_title": "IMPORTANT",
|
||||
"prepaid_cards": "Prepaid Cards",
|
||||
"prevent_screenshots": "Prevent screenshots and screen recording",
|
||||
"primary_address": "Primary Address",
|
||||
"privacy": "Privacy",
|
||||
"privacy_policy": "Privacy Policy",
|
||||
"privacy_settings": "Privacy settings",
|
||||
|
@ -945,6 +948,5 @@
|
|||
"you_pay": "You Pay",
|
||||
"you_will_get": "Convert to",
|
||||
"you_will_send": "Convert from",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "A contact with that name already exists. Please choose a different name."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "enlace Clearnet",
|
||||
"close": "Cerca",
|
||||
"coin_control": "Control de monedas (opcional)",
|
||||
"cold_or_recover_wallet": "Agrega una billetera fría o recupera una billetera de papel",
|
||||
"cold_or_recover_wallet": "Agregue una billetera de solo lectura de Cupcake o una billetera en frío o recupere una billetera de papel",
|
||||
"color_theme": "Tema de color",
|
||||
"commit_transaction_amount_fee": "Confirmar transacción\nCantidad: ${amount}\nCuota: ${fee}",
|
||||
"confirm": "Confirmar",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Contactos",
|
||||
"contact_list_wallets": "Mis billeteras",
|
||||
"contact_name": "Nombre de contacto",
|
||||
"contact_name_exists": "Ya existe un contacto con ese nombre. Elija un nombre diferente.",
|
||||
"contact_support": "Contactar con Soporte",
|
||||
"continue_text": "Continuar",
|
||||
"contract_warning": "Esta dirección de contrato ha sido marcada como potencialmente fraudulenta. Por favor, procese con precaución.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Vencimiento y validez",
|
||||
"export_backup": "Exportar copia de seguridad",
|
||||
"export_logs": "Registros de exportación",
|
||||
"export_outputs": "Exportaciones de exportación",
|
||||
"extra_id": "ID adicional:",
|
||||
"extracted_address_content": "Enviará fondos a\n${recipient_name}",
|
||||
"failed_authentication": "Autenticación fallida. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Increíble billetera para Haven",
|
||||
"help": "ayuda",
|
||||
"hidden_addresses": "Direcciones ocultas",
|
||||
"hidden_balance": "Balance oculto",
|
||||
"hide": "Esconder",
|
||||
"hide_details": "Ocultar detalles",
|
||||
"high_contrast_theme": "Tema de alto contraste",
|
||||
"home_screen_settings": "Configuración de la pantalla de inicio",
|
||||
|
@ -501,6 +505,7 @@
|
|||
"pre_seed_title": "IMPORTANTE",
|
||||
"prepaid_cards": "Tajetas prepagadas",
|
||||
"prevent_screenshots": "Evitar capturas de pantalla y grabación de pantalla",
|
||||
"primary_address": "Dirección principal",
|
||||
"privacy": "Privacidad",
|
||||
"privacy_policy": "Política de privacidad",
|
||||
"privacy_settings": "Configuración de privacidad",
|
||||
|
@ -697,6 +702,7 @@
|
|||
"share": "Compartir",
|
||||
"share_address": "Compartir dirección",
|
||||
"shared_seed_wallet_groups": "Grupos de billetera de semillas compartidas",
|
||||
"show": "Espectáculo",
|
||||
"show_details": "Mostrar detalles",
|
||||
"show_keys": "Mostrar semilla/claves",
|
||||
"show_market_place": "Mostrar mercado",
|
||||
|
@ -943,6 +949,5 @@
|
|||
"you_pay": "Tú pagas",
|
||||
"you_will_get": "Convertir a",
|
||||
"you_will_send": "Convertir de",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "Ya existe un contacto con ese nombre. Elija un nombre diferente."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Lien Clearnet",
|
||||
"close": "Fermer",
|
||||
"coin_control": "Contrôle optionnel des pièces (coins)",
|
||||
"cold_or_recover_wallet": "Ajoutez un portefeuille froid (cold wallet) ou récupérez un portefeuille papier (paper wallet)",
|
||||
"cold_or_recover_wallet": "Ajoutez un portefeuille en lecture seule de Cupcake ou d'un portefeuille froid ou récupérez un portefeuille en papier",
|
||||
"color_theme": "Thème",
|
||||
"commit_transaction_amount_fee": "Valider la transaction\nMontant : ${amount}\nFrais : ${fee}",
|
||||
"confirm": "Confirmer",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Contacts",
|
||||
"contact_list_wallets": "Mes portefeuilles (wallets)",
|
||||
"contact_name": "Nom de Contact",
|
||||
"contact_name_exists": "Un contact portant ce nom existe déjà. Veuillez choisir un autre nom.",
|
||||
"contact_support": "Contacter l'assistance",
|
||||
"continue_text": "Continuer",
|
||||
"contract_warning": "Cette adresse contractuelle a été signalée comme potentiellement frauduleuse. Veuillez traiter avec prudence.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Expiration et validité",
|
||||
"export_backup": "Exporter la sauvegarde",
|
||||
"export_logs": "Journaux d'exportation",
|
||||
"export_outputs": "Exportation des sorties",
|
||||
"extra_id": "ID supplémentaire :",
|
||||
"extracted_address_content": "Vous allez envoyer des fonds à\n${recipient_name}",
|
||||
"failed_authentication": "Échec d'authentification. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven par Cake Wallet",
|
||||
"haven_app_wallet_text": "Super portefeuille (wallet) pour Haven",
|
||||
"help": "aide",
|
||||
"hidden_addresses": "Adresses cachées",
|
||||
"hidden_balance": "Solde Caché",
|
||||
"hide": "Cacher",
|
||||
"hide_details": "Masquer les détails",
|
||||
"high_contrast_theme": "Thème à contraste élevé",
|
||||
"home_screen_settings": "Paramètres de l'écran d'accueil",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "IMPORTANT",
|
||||
"prepaid_cards": "Cartes prépayées",
|
||||
"prevent_screenshots": "Empêcher les captures d'écran et l'enregistrement d'écran",
|
||||
"primary_address": "Adresse primaire",
|
||||
"privacy": "Confidentialité",
|
||||
"privacy_policy": "Politique de confidentialité",
|
||||
"privacy_settings": "Paramètres de confidentialité",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "Partager",
|
||||
"share_address": "Partager l'adresse",
|
||||
"shared_seed_wallet_groups": "Groupes de portefeuilles partagés",
|
||||
"show": "Montrer",
|
||||
"show_details": "Afficher les détails",
|
||||
"show_keys": "Visualiser la phrase secrète (seed) et les clefs",
|
||||
"show_market_place": "Afficher la place de marché",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "Vous payez",
|
||||
"you_will_get": "Convertir vers",
|
||||
"you_will_send": "Convertir depuis",
|
||||
"yy": "AA",
|
||||
"contact_name_exists": "Un contact portant ce nom existe déjà. Veuillez choisir un autre nom."
|
||||
}
|
||||
"yy": "AA"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Lambar makomar kwayoyi",
|
||||
"close": "Rufa",
|
||||
"coin_control": "Sarrafa tsabar kuɗi (na zaɓi)",
|
||||
"cold_or_recover_wallet": "Samun kashi na baya ko samun kashi na kasa",
|
||||
"cold_or_recover_wallet": "Aara wani walat mai karanta-kawai Cupcake ko walat ɗin mai sanyi ko murmurewa takarda takarda",
|
||||
"color_theme": "Jigon launi",
|
||||
"commit_transaction_amount_fee": "Aikata ciniki\nAdadi: ${amount}\nKuda: ${fee}",
|
||||
"confirm": "Tabbatar",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Lambobin sadarwa",
|
||||
"contact_list_wallets": "Wallets dina",
|
||||
"contact_name": "Sunan Tuntuɓi",
|
||||
"contact_name_exists": "An riga an sami lamba tare da wannan sunan. Da fatan za a zaɓi suna daban.",
|
||||
"contact_support": "Tuntuɓi Support",
|
||||
"continue_text": "Ci gaba",
|
||||
"contract_warning": "An kafa wannan adireshin kwantaragin kwangilar yayin da yuwuwar zamba. Da fatan za a aiwatar da taka tsantsan.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Karewa da inganci",
|
||||
"export_backup": "Ajiyayyen fitarwa",
|
||||
"export_logs": "Injin fitarwa",
|
||||
"export_outputs": "Fitarwar fitarwa",
|
||||
"extra_id": "Karin ID:",
|
||||
"extracted_address_content": "Za ku aika da kudade zuwa\n${recipient_name}",
|
||||
"failed_authentication": "Binne wajen shiga. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven da Cake Wallet",
|
||||
"haven_app_wallet_text": "Aikace-aikacen e-wallet ga Haven",
|
||||
"help": "taimako",
|
||||
"hidden_addresses": "Adireshin ɓoye",
|
||||
"hidden_balance": "BOYE KUDI",
|
||||
"hide": "Ɓoye",
|
||||
"hide_details": "Ɓoye cikakkun bayanai",
|
||||
"high_contrast_theme": "Babban Jigon Kwatance",
|
||||
"home_screen_settings": "Saitunan allo na gida",
|
||||
|
@ -502,6 +506,7 @@
|
|||
"pre_seed_title": "MUHIMMANCI",
|
||||
"prepaid_cards": "Katunan shirye-shirye",
|
||||
"prevent_screenshots": "Fada lambobi da jarrabobi na kayan lambobi",
|
||||
"primary_address": "Adireshin farko",
|
||||
"privacy": "Keɓantawa",
|
||||
"privacy_policy": "takardar kebantawa",
|
||||
"privacy_settings": "Saitunan sirri",
|
||||
|
@ -698,6 +703,7 @@
|
|||
"share": "Raba",
|
||||
"share_address": "Raba adireshin",
|
||||
"shared_seed_wallet_groups": "Raba ƙungiya walat",
|
||||
"show": "Nuna",
|
||||
"show_details": "Nuna Cikakkun bayanai",
|
||||
"show_keys": "Nuna iri/maɓallai",
|
||||
"show_market_place": "Nuna dan kasuwa",
|
||||
|
@ -944,6 +950,5 @@
|
|||
"you_pay": "Ka Bayar",
|
||||
"you_will_get": "Maida zuwa",
|
||||
"you_will_send": "Maida daga",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "An riga an sami lamba tare da wannan sunan. Da fatan za a zaɓi suna daban."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "क्लियरनेट लिंक",
|
||||
"close": "बंद करना",
|
||||
"coin_control": "सिक्का नियंत्रण (वैकल्पिक)",
|
||||
"cold_or_recover_wallet": "कोल्ड वॉलेट जोड़ें या पेपर वॉलेट पुनर्प्राप्त करें",
|
||||
"cold_or_recover_wallet": "Cupcake या एक कोल्ड वॉलेट से एक रीड-ओनली वॉलेट जोड़ें या एक पेपर वॉलेट को पुनर्प्राप्त करें",
|
||||
"color_theme": "रंग विषय",
|
||||
"commit_transaction_amount_fee": "लेन-देन करें\nरकम: ${amount}\nशुल्क: ${fee}",
|
||||
"confirm": "की पुष्टि करें",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "संपर्क",
|
||||
"contact_list_wallets": "मेरा बटुआ",
|
||||
"contact_name": "संपर्क नाम",
|
||||
"contact_name_exists": "उस नाम का एक संपर्क पहले से मौजूद है. कृपया कोई भिन्न नाम चुनें.",
|
||||
"contact_support": "सहायता से संपर्क करें",
|
||||
"continue_text": "जारी रहना",
|
||||
"contract_warning": "इस अनुबंध के पते को संभावित रूप से धोखाधड़ी के रूप में चिह्नित किया गया है। कृपया सावधानी के साथ प्रक्रिया करें।",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "समाप्ति और वैधता",
|
||||
"export_backup": "निर्यात बैकअप",
|
||||
"export_logs": "निर्यात लॉग",
|
||||
"export_outputs": "निर्यात आउटपुट",
|
||||
"extra_id": "अतिरिक्त आईडी:",
|
||||
"extracted_address_content": "आपको धनराशि भेजी जाएगी\n${recipient_name}",
|
||||
"failed_authentication": "प्रमाणीकरण विफल. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "मदद करना",
|
||||
"hidden_addresses": "छिपे हुए पते",
|
||||
"hidden_balance": "छिपा हुआ संतुलन",
|
||||
"hide": "छिपाना",
|
||||
"hide_details": "विवरण छुपाएं",
|
||||
"high_contrast_theme": "उच्च कंट्रास्ट थीम",
|
||||
"home_screen_settings": "होम स्क्रीन सेटिंग्स",
|
||||
|
@ -501,6 +505,7 @@
|
|||
"pre_seed_title": "महत्वपूर्ण",
|
||||
"prepaid_cards": "पूर्वदत्त कार्ड",
|
||||
"prevent_screenshots": "स्क्रीनशॉट और स्क्रीन रिकॉर्डिंग रोकें",
|
||||
"primary_address": "प्राथमिक पता",
|
||||
"privacy": "गोपनीयता",
|
||||
"privacy_policy": "गोपनीयता नीति",
|
||||
"privacy_settings": "गोपनीयता सेटिंग्स",
|
||||
|
@ -698,6 +703,7 @@
|
|||
"share": "शेयर करना",
|
||||
"share_address": "पता साझा करें",
|
||||
"shared_seed_wallet_groups": "साझा बीज बटुए समूह",
|
||||
"show": "दिखाओ",
|
||||
"show_details": "विवरण दिखाएं",
|
||||
"show_keys": "बीज / कुंजियाँ दिखाएँ",
|
||||
"show_market_place": "बाज़ार दिखाएँ",
|
||||
|
@ -944,6 +950,5 @@
|
|||
"you_pay": "आप भुगतान करते हैं",
|
||||
"you_will_get": "में बदलें",
|
||||
"you_will_send": "से रूपांतरित करें",
|
||||
"yy": "वाईवाई",
|
||||
"contact_name_exists": "उस नाम का एक संपर्क पहले से मौजूद है. कृपया कोई भिन्न नाम चुनें."
|
||||
}
|
||||
"yy": "वाईवाई"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Clearnet veza",
|
||||
"close": "Zatvoriti",
|
||||
"coin_control": "Kontrola novca (nije obavezno)",
|
||||
"cold_or_recover_wallet": "Dodajte hladni novčanik ili povratite papirnati novčanik",
|
||||
"cold_or_recover_wallet": "Dodajte novčanik samo za čitanje od Cupcake ili hladnog novčanika ili oporavite papirni novčanik",
|
||||
"color_theme": "Shema boja",
|
||||
"commit_transaction_amount_fee": "Izvrši transakciju \nAmount: ${amount}\nFee: ${fee}",
|
||||
"confirm": "Potvrdi",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Kontakti",
|
||||
"contact_list_wallets": "Moji novčanici",
|
||||
"contact_name": "Ime kontakta",
|
||||
"contact_name_exists": "Kontakt s tim imenom već postoji. Odaberite drugo ime.",
|
||||
"contact_support": "Kontaktirajte podršku",
|
||||
"continue_text": "Nastavak",
|
||||
"contract_warning": "Ova adresa ugovora označena je kao potencijalno lažna. Molimo obradite s oprezom.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Istek i valjanost",
|
||||
"export_backup": "Izvezi sigurnosnu kopiju",
|
||||
"export_logs": "Izvozni trupci",
|
||||
"export_outputs": "Izvoz izlaza",
|
||||
"extra_id": "Dodatni ID:",
|
||||
"extracted_address_content": "Poslat ćete sredstva primatelju\n${recipient_name}",
|
||||
"failed_authentication": "Autentifikacija neuspješna. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "pomozite",
|
||||
"hidden_addresses": "Skrivene adrese",
|
||||
"hidden_balance": "Skriven iznos",
|
||||
"hide": "Sakriti",
|
||||
"hide_details": "Sakrij pojedinosti",
|
||||
"high_contrast_theme": "Tema visokog kontrasta",
|
||||
"home_screen_settings": "Postavke početnog zaslona",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "VAŽNO",
|
||||
"prepaid_cards": "Unaprijed plaćene kartice",
|
||||
"prevent_screenshots": "Spriječite snimke zaslona i snimanje zaslona",
|
||||
"primary_address": "Primarna adresa",
|
||||
"privacy": "Privatnost",
|
||||
"privacy_policy": "Pravila privatnosti",
|
||||
"privacy_settings": "Postavke privatnosti",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "Udio",
|
||||
"share_address": "Podijeli adresu",
|
||||
"shared_seed_wallet_groups": "Zajedničke grupe za sjeme novčanika",
|
||||
"show": "Pokazati",
|
||||
"show_details": "Prikaži pojedinosti",
|
||||
"show_keys": "Prikaži pristupni izraz/ključ",
|
||||
"show_market_place": "Prikaži tržište",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "Vi plaćate",
|
||||
"you_will_get": "Razmijeni u",
|
||||
"you_will_send": "Razmijeni iz",
|
||||
"yy": "GG",
|
||||
"contact_name_exists": "Kontakt s tim imenom već postoji. Odaberite drugo ime."
|
||||
}
|
||||
"yy": "GG"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Բաց ցանցի հղում",
|
||||
"close": "Փակել",
|
||||
"coin_control": "Մետաղադրամի վերահսկում (ըստ ցանկության)",
|
||||
"cold_or_recover_wallet": "Ավելացնել սառը դրամապանակ կամ վերականգնել թղթային դրամապանակ",
|
||||
"cold_or_recover_wallet": "Cupcake կամ ցուրտ դրամապանակից ավելացնել միայն ընթերցված դրամապանակ կամ վերականգնել թղթի դրամապանակը",
|
||||
"color_theme": "Գույների տեսք",
|
||||
"commit_transaction_amount_fee": "Հաստատել գործարքը\nՍկզբնական գումար. ${amount}\nՄիջնորդավճար. ${fee}",
|
||||
"confirm": "Հաստատել",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Կոնտակտներ",
|
||||
"contact_list_wallets": "Իմ դրամապանակներ",
|
||||
"contact_name": "Կոնտակտի անուն",
|
||||
"contact_name_exists": "Այդ անվանման հետ կապ կա արդեն: Խնդրում ենք ընտրել այլ անուն:",
|
||||
"contact_support": "Հետադարձ կապ",
|
||||
"continue_text": "Շարունակել",
|
||||
"contract_warning": "Պայմանագրի այս հասցեն դրոշմել է որպես հնարավոր կեղծ: Խնդրում ենք զգուշությամբ մշակել:",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Վավերականություն և լրացում",
|
||||
"export_backup": "Արտահանել կրկնօրինակը",
|
||||
"export_logs": "Արտահանման տեղեկամատյաններ",
|
||||
"export_outputs": "Արտահանման արդյունքներ",
|
||||
"extra_id": "Լրացուցիչ ID",
|
||||
"extracted_address_content": "Դուք կուղարկեք գումար ${recipient_name}",
|
||||
"failed_authentication": "Վավերացումը ձախողվեց. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven ծրագիր",
|
||||
"haven_app_wallet_text": "Հիանալի հաշվեհամար Haven համար",
|
||||
"help": "Օգնություն",
|
||||
"hidden_addresses": "Թաքնված հասցեներ",
|
||||
"hidden_balance": "Թաքնված մնացորդ",
|
||||
"hide": "Թաքցնել",
|
||||
"hide_details": "Թաքցնել մանրամասները",
|
||||
"high_contrast_theme": "Բարձր հակադրության տեսք",
|
||||
"home_screen_settings": "Գլխավոր էկրանի կարգավորումներ",
|
||||
|
@ -366,14 +370,22 @@
|
|||
"ledger_error_wrong_app": "Խնդրում ենք համոզվել, որ դուք բացել եք ճիշտ ծրագիրը ձեր Ledger-ում",
|
||||
"ledger_please_enable_bluetooth": "Խնդրում ենք միացնել Bluetooth-ը ձեր Ledger-ը հայտնաբերելու համար",
|
||||
"light_theme": "Լուսավոր",
|
||||
"litecoin_enable_mweb_sync": "Միացնել MWEB սկան",
|
||||
"litecoin_mweb": "Մուեբ",
|
||||
"litecoin_mweb_always_scan": "Սահմանեք Mweb Միշտ սկանավորում",
|
||||
"litecoin_mweb_description": "Mweb- ը նոր արձանագրություն է, որը բերում է ավելի արագ, ավելի էժան եւ ավելի մասնավոր գործարքներ դեպի LITECOIN",
|
||||
"litecoin_mweb_dismiss": "Հեռացնել",
|
||||
"litecoin_mweb_display_card": "Show ույց տալ Mweb քարտը",
|
||||
"litecoin_mweb_enable": "Միացնել Mweb- ը",
|
||||
"litecoin_mweb_enable_later": "Կարող եք ընտրել Mweb- ը կրկին միացնել ցուցադրման պարամետրերը:",
|
||||
"litecoin_mweb_logs": "Mweb տեղեկամատյաններ",
|
||||
"litecoin_mweb_node": "Mweb հանգույց",
|
||||
"litecoin_mweb_pegin": "Peg in",
|
||||
"litecoin_mweb_pegout": "Հափշտակել",
|
||||
"litecoin_mweb_scanning": "Mweb սկանավորում",
|
||||
"litecoin_mweb_settings": "Mweb- ի պարամետրերը",
|
||||
"litecoin_mweb_warning": "Mweb- ի օգտագործումը սկզբում ներբեռնվի 600 ՄԲ տվյալներ եւ կարող է տեւել 30 րոպե, կախված ցանցի արագությունից: Այս նախնական տվյալները միայն մեկ անգամ ներբեռնելու են եւ հասանելի կլինեն բոլոր Litecoin դրամապանակների համար",
|
||||
"litecoin_what_is_mweb": "Ինչ է Mweb- ը:",
|
||||
"live_fee_rates": "Ապակի վարձավճարներ API- ի միջոցով",
|
||||
"load_more": "Բեռնել ավելին",
|
||||
"loading_your_wallet": "Ձեր հաշվեհամարը բեռնում է",
|
||||
|
@ -492,6 +504,7 @@
|
|||
"pre_seed_title": "ԿԱՐԵՎՈՐ",
|
||||
"prepaid_cards": "Նախավճարային քարտեր",
|
||||
"prevent_screenshots": "Կանխել էկրանի պատկերները և տեսագրությունը",
|
||||
"primary_address": "Առաջնային հասցե",
|
||||
"privacy": "Գաղտնիություն",
|
||||
"privacy_policy": "Գաղտնիության քաղաքականություն",
|
||||
"privacy_settings": "Գաղտնիության կարգավորումներ",
|
||||
|
@ -688,6 +701,7 @@
|
|||
"share": "Կիսվել",
|
||||
"share_address": "Կիսվել հասցեով",
|
||||
"shared_seed_wallet_groups": "Համօգտագործված սերմերի դրամապանակների խմբեր",
|
||||
"show": "Ցուցահանդես",
|
||||
"show_details": "Ցուցադրել մանրամասներ",
|
||||
"show_keys": "Ցուցադրել բանալիներ",
|
||||
"show_market_place": "Ցուցադրել շուկան",
|
||||
|
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Tautan clearnet",
|
||||
"close": "Menutup",
|
||||
"coin_control": "Kontrol koin (opsional)",
|
||||
"cold_or_recover_wallet": "Tambahkan dompet dingin atau pulihkan dompet kertas",
|
||||
"cold_or_recover_wallet": "Tambahkan dompet hanya baca dari Cupcake atau dompet dingin atau memulihkan dompet kertas",
|
||||
"color_theme": "Tema warna",
|
||||
"commit_transaction_amount_fee": "Lakukan transaksi\nJumlah: ${amount}\nBiaya: ${fee}",
|
||||
"confirm": "Konfirmasi",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Kontak",
|
||||
"contact_list_wallets": "Dompet Saya",
|
||||
"contact_name": "Nama Kontak",
|
||||
"contact_name_exists": "Kontak dengan nama tersebut sudah ada. Silakan pilih nama lain.",
|
||||
"contact_support": "Hubungi Dukungan",
|
||||
"continue_text": "Lanjutkan",
|
||||
"contract_warning": "Alamat kontrak ini telah ditandai sebagai berpotensi curang. Silakan memproses dengan hati -hati.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Kedaluwarsa dan validitas",
|
||||
"export_backup": "Ekspor cadangan",
|
||||
"export_logs": "Log ekspor",
|
||||
"export_outputs": "Ekspor output",
|
||||
"extra_id": "ID tambahan:",
|
||||
"extracted_address_content": "Anda akan mengirim dana ke\n${recipient_name}",
|
||||
"failed_authentication": "Otentikasi gagal. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven Oleh Cake Wallet",
|
||||
"haven_app_wallet_text": "Dompet luar biasa untuk Haven",
|
||||
"help": "bantuan",
|
||||
"hidden_addresses": "Alamat tersembunyi",
|
||||
"hidden_balance": "Saldo Tersembunyi",
|
||||
"hide": "Bersembunyi",
|
||||
"hide_details": "Sembunyikan Rincian",
|
||||
"high_contrast_theme": "Tema Kontras Tinggi",
|
||||
"home_screen_settings": "Pengaturan layar awal",
|
||||
|
@ -502,6 +506,7 @@
|
|||
"pre_seed_title": "PENTING",
|
||||
"prepaid_cards": "Kartu prabayar",
|
||||
"prevent_screenshots": "Cegah tangkapan layar dan perekaman layar",
|
||||
"primary_address": "Alamat utama",
|
||||
"privacy": "Privasi",
|
||||
"privacy_policy": "Kebijakan Privasi",
|
||||
"privacy_settings": "Pengaturan privasi",
|
||||
|
@ -699,6 +704,7 @@
|
|||
"share": "Membagikan",
|
||||
"share_address": "Bagikan alamat",
|
||||
"shared_seed_wallet_groups": "Kelompok dompet benih bersama",
|
||||
"show": "Menunjukkan",
|
||||
"show_details": "Tampilkan Rincian",
|
||||
"show_keys": "Tampilkan seed/kunci",
|
||||
"show_market_place": "Tampilkan Pasar",
|
||||
|
@ -945,6 +951,5 @@
|
|||
"you_pay": "Anda Membayar",
|
||||
"you_will_get": "Konversi ke",
|
||||
"you_will_send": "Konversi dari",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "Kontak dengan nama tersebut sudah ada. Silakan pilih nama lain."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Collegamento Clearnet",
|
||||
"close": "Chiudere",
|
||||
"coin_control": "Controllo monete (opzionale)",
|
||||
"cold_or_recover_wallet": "Aggiungi un cold wallet o recupera un paper wallet",
|
||||
"cold_or_recover_wallet": "Aggiungi un portafoglio di sola lettura da Cupcake o un portafoglio freddo o recupera un portafoglio di carta",
|
||||
"color_theme": "Colore tema",
|
||||
"commit_transaction_amount_fee": "Invia transazione\nAmmontare: ${amount}\nCommissione: ${fee}",
|
||||
"confirm": "Conferma",
|
||||
|
@ -162,6 +162,7 @@
|
|||
"contact_list_contacts": "Contatti",
|
||||
"contact_list_wallets": "I miei portafogli",
|
||||
"contact_name": "Nome Contatto",
|
||||
"contact_name_exists": "Esiste già un contatto con quel nome. Scegli un nome diverso.",
|
||||
"contact_support": "Contatta l'assistenza",
|
||||
"continue_text": "Continua",
|
||||
"contract_warning": "Questo indirizzo del contratto è stato contrassegnato come potenzialmente fraudolento. Si prega di elaborare con cautela.",
|
||||
|
@ -297,6 +298,7 @@
|
|||
"expiry_and_validity": "Scadenza e validità",
|
||||
"export_backup": "Esporta backup",
|
||||
"export_logs": "Registri di esportazione",
|
||||
"export_outputs": "Output di esportazione",
|
||||
"extra_id": "Extra ID:",
|
||||
"extracted_address_content": "Invierai i tuoi fondi a\n${recipient_name}",
|
||||
"failed_authentication": "Autenticazione fallita. ${state_error}",
|
||||
|
@ -337,7 +339,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Portafoglio fantastico per Haven",
|
||||
"help": "aiuto",
|
||||
"hidden_addresses": "Indirizzi nascosti",
|
||||
"hidden_balance": "Saldo Nascosto",
|
||||
"hide": "Nascondere",
|
||||
"hide_details": "Nascondi dettagli",
|
||||
"high_contrast_theme": "Tema ad alto contrasto",
|
||||
"home_screen_settings": "Impostazioni della schermata iniziale",
|
||||
|
@ -502,6 +506,7 @@
|
|||
"pre_seed_title": "IMPORTANTE",
|
||||
"prepaid_cards": "Carte prepagata",
|
||||
"prevent_screenshots": "Impedisci screenshot e registrazione dello schermo",
|
||||
"primary_address": "Indirizzo primario",
|
||||
"privacy": "Privacy",
|
||||
"privacy_policy": "Informativa sulla privacy",
|
||||
"privacy_settings": "Impostazioni privacy",
|
||||
|
@ -698,6 +703,7 @@
|
|||
"share": "Condividere",
|
||||
"share_address": "Condividi indirizzo",
|
||||
"shared_seed_wallet_groups": "Gruppi di portafoglio di semi condivisi",
|
||||
"show": "Spettacolo",
|
||||
"show_details": "Mostra dettagli",
|
||||
"show_keys": "Mostra seme/chiavi",
|
||||
"show_market_place": "Mostra mercato",
|
||||
|
@ -945,6 +951,5 @@
|
|||
"you_pay": "Tu paghi",
|
||||
"you_will_get": "Converti a",
|
||||
"you_will_send": "Conveti da",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "Esiste già un contatto con quel nome. Scegli un nome diverso."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "クリアネット リンク",
|
||||
"close": "近い",
|
||||
"coin_control": "コインコントロール(オプション)",
|
||||
"cold_or_recover_wallet": "コールド ウォレットを追加するか、ペーパー ウォレットを復元する",
|
||||
"cold_or_recover_wallet": "Cupcakeまたはコールドウォレットから読み取り専用ウォレットを追加するか、紙の財布を回収する",
|
||||
"color_theme": "カラーテーマ",
|
||||
"commit_transaction_amount_fee": "トランザクションをコミット\n量: ${amount}\n費用: ${fee}",
|
||||
"confirm": "確認する",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "連絡先",
|
||||
"contact_list_wallets": "マイウォレット",
|
||||
"contact_name": "連絡先",
|
||||
"contact_name_exists": "その名前の連絡先はすでに存在します。別の名前を選択してください。",
|
||||
"contact_support": "サポートに連絡する",
|
||||
"continue_text": "持続する",
|
||||
"contract_warning": "この契約住所は、潜在的に不正としてフラグが立てられています。注意して処理してください。",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "有効期限と有効性",
|
||||
"export_backup": "バックアップのエクスポート",
|
||||
"export_logs": "ログをエクスポートします",
|
||||
"export_outputs": "エクスポート出力",
|
||||
"extra_id": "追加ID:",
|
||||
"extracted_address_content": "に送金します\n${recipient_name}",
|
||||
"failed_authentication": "認証失敗. ${state_error}",
|
||||
|
@ -337,7 +339,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "ヘルプ",
|
||||
"hidden_addresses": "隠されたアドレス",
|
||||
"hidden_balance": "隠れたバランス",
|
||||
"hide": "隠れる",
|
||||
"hide_details": "詳細を非表示",
|
||||
"high_contrast_theme": "ハイコントラストテーマ",
|
||||
"home_screen_settings": "ホーム画面の設定",
|
||||
|
@ -501,6 +505,7 @@
|
|||
"pre_seed_title": "重要",
|
||||
"prepaid_cards": "プリペイドカード",
|
||||
"prevent_screenshots": "スクリーンショットと画面録画を防止する",
|
||||
"primary_address": "主なアドレス",
|
||||
"privacy": "プライバシー",
|
||||
"privacy_policy": "プライバシーポリシー",
|
||||
"privacy_settings": "プライバシー設定",
|
||||
|
@ -697,6 +702,7 @@
|
|||
"share": "共有",
|
||||
"share_address": "住所を共有する",
|
||||
"shared_seed_wallet_groups": "共有シードウォレットグループ",
|
||||
"show": "見せる",
|
||||
"show_details": "詳細を表示",
|
||||
"show_keys": "シード/キーを表示する",
|
||||
"show_market_place": "マーケットプレイスを表示",
|
||||
|
@ -943,6 +949,5 @@
|
|||
"you_pay": "あなたが支払う",
|
||||
"you_will_get": "に変換",
|
||||
"you_will_send": "から変換",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "その名前の連絡先はすでに存在します。別の名前を選択してください。"
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "클리어넷 링크",
|
||||
"close": "닫다",
|
||||
"coin_control": "코인 제어 (옵션)",
|
||||
"cold_or_recover_wallet": "콜드 지갑 추가 또는 종이 지갑 복구",
|
||||
"cold_or_recover_wallet": "Cupcake 또는 차가운 지갑에서 읽기 전용 지갑을 추가하거나 종이 지갑을 복구하십시오.",
|
||||
"color_theme": "색상 테마",
|
||||
"commit_transaction_amount_fee": "커밋 거래\n양: ${amount}\n보수: ${fee}",
|
||||
"confirm": "확인",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "콘택트 렌즈",
|
||||
"contact_list_wallets": "내 지갑",
|
||||
"contact_name": "담당자 이름",
|
||||
"contact_name_exists": "해당 이름을 가진 연락처가 이미 존재합니다. 다른 이름을 선택하세요.",
|
||||
"contact_support": "지원팀에 문의",
|
||||
"continue_text": "잇다",
|
||||
"contract_warning": "이 계약 주소는 잠재적으로 사기성으로 표시되었습니다. 주의해서 처리하십시오.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "만료와 타당성",
|
||||
"export_backup": "백업 내보내기",
|
||||
"export_logs": "내보내기 로그",
|
||||
"export_outputs": "내보내기 출력",
|
||||
"extra_id": "추가 ID:",
|
||||
"extracted_address_content": "당신은에 자금을 보낼 것입니다\n${recipient_name}",
|
||||
"failed_authentication": "인증 실패. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "돕다",
|
||||
"hidden_addresses": "숨겨진 주소",
|
||||
"hidden_balance": "숨겨진 균형",
|
||||
"hide": "숨다",
|
||||
"hide_details": "세부 정보 숨기기",
|
||||
"high_contrast_theme": "고대비 테마",
|
||||
"home_screen_settings": "홈 화면 설정",
|
||||
|
@ -501,6 +505,7 @@
|
|||
"pre_seed_title": "중대한",
|
||||
"prepaid_cards": "선불 카드",
|
||||
"prevent_screenshots": "스크린샷 및 화면 녹화 방지",
|
||||
"primary_address": "기본 주소",
|
||||
"privacy": "프라이버시",
|
||||
"privacy_policy": "개인 정보 보호 정책",
|
||||
"privacy_settings": "개인정보 설정",
|
||||
|
@ -697,6 +702,7 @@
|
|||
"share": "공유하다",
|
||||
"share_address": "주소 공유",
|
||||
"shared_seed_wallet_groups": "공유 종자 지갑 그룹",
|
||||
"show": "보여주다",
|
||||
"show_details": "세부정보 표시",
|
||||
"show_keys": "시드 / 키 표시",
|
||||
"show_market_place": "마켓플레이스 표시",
|
||||
|
@ -944,6 +950,5 @@
|
|||
"you_will_get": "로 변환하다",
|
||||
"you_will_send": "다음에서 변환",
|
||||
"YY": "YY",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "해당 이름을 가진 연락처가 이미 존재합니다. 다른 이름을 선택하세요."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Clearnet လင့်ခ်",
|
||||
"close": "အနီးကပ်",
|
||||
"coin_control": "အကြွေစေ့ထိန်းချုပ်မှု (ချန်လှပ်ထားနိုင်သည်)",
|
||||
"cold_or_recover_wallet": "အေးသောပိုက်ဆံအိတ်ထည့်ပါ သို့မဟုတ် စက္ကူပိုက်ဆံအိတ်ကို ပြန်ယူပါ။",
|
||||
"cold_or_recover_wallet": "Cupcake သို့မဟုတ်အအေးပိုက်ဆံအိတ်မှဖတ်ရန်သာပိုက်ဆံအိတ်တစ်ခုထည့်ပါသို့မဟုတ်စက္ကူပိုက်ဆံအိတ်ကိုပြန်လည်ရယူပါ",
|
||||
"color_theme": "အရောင်အပြင်အဆင်",
|
||||
"commit_transaction_amount_fee": "ငွေလွှဲခြင်း\nပမာဏ- ${amount}\nအခကြေးငွေ- ${fee}",
|
||||
"confirm": "အတည်ပြုပါ။",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "အဆက်အသွယ်များ",
|
||||
"contact_list_wallets": "ကျွန်ုပ်၏ ပိုက်ဆံအိတ်များ",
|
||||
"contact_name": "ဆက်သွယ်ရန်အမည်",
|
||||
"contact_name_exists": "ထိုအမည်နှင့် အဆက်အသွယ်တစ်ခု ရှိနှင့်ပြီးဖြစ်သည်။ အခြားအမည်တစ်ခုကို ရွေးပါ။",
|
||||
"contact_support": "ပံ့ပိုးကူညီမှုထံ ဆက်သွယ်ပါ။",
|
||||
"continue_text": "ဆက်လက်",
|
||||
"contract_warning": "ဒီစာချုပ်လိပ်စာအလားအလာအလားအလာအလားအလာအလံများကိုအလံလွှင့်တင်ခဲ့သည်။ ကျေးဇူးပြုပြီးသတိဖြင့်လုပ်ငန်းစဉ်။",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "သက်တမ်းကုန်ဆုံးခြင်းနှင့်တရားဝင်မှု",
|
||||
"export_backup": "အရန်ကူးထုတ်ရန်",
|
||||
"export_logs": "ပို့ကုန်မှတ်တမ်းများ",
|
||||
"export_outputs": "ပို့ကုန်ထုတ်ကုန်များ",
|
||||
"extra_id": "အပို ID-",
|
||||
"extracted_address_content": "သင်သည် \n${recipient_name} သို့ ရန်ပုံငွေများ ပေးပို့ပါမည်",
|
||||
"failed_authentication": "အထောက်အထားစိစစ်ခြင်း မအောင်မြင်ပါ။. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "ဟေးဗင် ကိတ် ဝေါလက်",
|
||||
"haven_app_wallet_text": "ဟေဗင်အတွက် အံ့ဩစရာကောင်းတဲ့ ပိုက်ဆံအုံး",
|
||||
"help": "ကူညီပါ",
|
||||
"hidden_addresses": "လျှို့ဝှက်လိပ်စာများ",
|
||||
"hidden_balance": "Hidden Balance",
|
||||
"hide": "သားရေ",
|
||||
"hide_details": "အသေးစိတ်ကို ဝှက်ပါ။",
|
||||
"high_contrast_theme": "အလင်းအမှောင် မြင့်မားသော အပြင်အဆင်",
|
||||
"home_screen_settings": "ပင်မစခရင် ဆက်တင်များ",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "အရေးကြီးသည်။",
|
||||
"prepaid_cards": "ကြိုတင်ငွေဖြည့်ကဒ်များ",
|
||||
"prevent_screenshots": "ဖန်သားပြင်ဓာတ်ပုံများနှင့် မျက်နှာပြင်ရိုက်ကူးခြင်းကို တားဆီးပါ။",
|
||||
"primary_address": "အဓိကလိပ်စာ",
|
||||
"privacy": "ကိုယ်ရေးကိုယ်တာ",
|
||||
"privacy_policy": "ကိုယ်ရေးအချက်အလက်မူဝါဒ",
|
||||
"privacy_settings": "Privacy settings တွေကို",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "မျှဝေပါ။",
|
||||
"share_address": "လိပ်စာမျှဝေပါ။",
|
||||
"shared_seed_wallet_groups": "shared မျိုးစေ့ပိုက်ဆံအိတ်အုပ်စုများ",
|
||||
"show": "ပြသ",
|
||||
"show_details": "အသေးစိတ်ပြ",
|
||||
"show_keys": "မျိုးစေ့ /သော့များကို ပြပါ။",
|
||||
"show_market_place": "စျေးကွက်ကိုပြသပါ။",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "သင်ပေးချေပါ။",
|
||||
"you_will_get": "သို့ပြောင်းပါ။",
|
||||
"you_will_send": "မှပြောင်းပါ။",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "ထိုအမည်နှင့် အဆက်အသွယ်တစ်ခု ရှိနှင့်ပြီးဖြစ်သည်။ အခြားအမည်တစ်ခုကို ရွေးပါ။"
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Clearnet-link",
|
||||
"close": "Dichtbij",
|
||||
"coin_control": "Muntcontrole (optioneel)",
|
||||
"cold_or_recover_wallet": "Voeg een cold wallet toe of herstel een paper wallet",
|
||||
"cold_or_recover_wallet": "Voeg een alleen-lezen portemonnee toe van Cupcake of een koude portemonnee of herstel een papieren portemonnee",
|
||||
"color_theme": "Kleur thema",
|
||||
"commit_transaction_amount_fee": "Verricht transactie\nBedrag: ${amount}\nhonorarium: ${fee}",
|
||||
"confirm": "Bevestigen",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Contacten",
|
||||
"contact_list_wallets": "Mijn portefeuilles",
|
||||
"contact_name": "Contactnaam",
|
||||
"contact_name_exists": "Er bestaat al een contact met die naam. Kies een andere naam.",
|
||||
"contact_support": "Contact opnemen met ondersteuning",
|
||||
"continue_text": "Doorgaan met",
|
||||
"contract_warning": "Dit contractadres is gemarkeerd als mogelijk frauduleus. Verwerk met voorzichtigheid.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Vervallen en geldigheid",
|
||||
"export_backup": "Back-up exporteren",
|
||||
"export_logs": "Exporteer logboeken",
|
||||
"export_outputs": "Exportuitgangen exporteren",
|
||||
"extra_id": "Extra ID:",
|
||||
"extracted_address_content": "U stuurt geld naar\n${recipient_name}",
|
||||
"failed_authentication": "Mislukte authenticatie. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "helpen",
|
||||
"hidden_addresses": "Verborgen adressen",
|
||||
"hidden_balance": "Verborgen balans",
|
||||
"hide": "Verbergen",
|
||||
"hide_details": "Details verbergen",
|
||||
"high_contrast_theme": "Thema met hoog contrast",
|
||||
"home_screen_settings": "Instellingen voor het startscherm",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "BELANGRIJK",
|
||||
"prepaid_cards": "Prepaid-kaarten",
|
||||
"prevent_screenshots": "Voorkom screenshots en schermopname",
|
||||
"primary_address": "Primair adres",
|
||||
"privacy": "Privacy",
|
||||
"privacy_policy": "Privacybeleid",
|
||||
"privacy_settings": "Privacy-instellingen",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "Deel",
|
||||
"share_address": "Deel adres",
|
||||
"shared_seed_wallet_groups": "Gedeelde zaadportelgroepen",
|
||||
"show": "Show",
|
||||
"show_details": "Toon details",
|
||||
"show_keys": "Toon zaad/sleutels",
|
||||
"show_market_place": "Toon Marktplaats",
|
||||
|
@ -943,6 +949,5 @@
|
|||
"you_pay": "U betaalt",
|
||||
"you_will_get": "Converteren naar",
|
||||
"you_will_send": "Converteren van",
|
||||
"yy": "JJ",
|
||||
"contact_name_exists": "Er bestaat al een contact met die naam. Kies een andere naam."
|
||||
}
|
||||
"yy": "JJ"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "łącze Clearnet",
|
||||
"close": "Zamknąć",
|
||||
"coin_control": "Kontrola monet (opcjonalnie)",
|
||||
"cold_or_recover_wallet": "Dodaj zimny portfel lub odzyskaj portfel papierowy",
|
||||
"cold_or_recover_wallet": "Dodaj portfel tylko do odczytu od Cupcake lub zimnego portfela lub odzyskaj papierowy portfel",
|
||||
"color_theme": "Motyw kolorystyczny",
|
||||
"commit_transaction_amount_fee": "Zatwierdź transakcję\nIlość: ${amount}\nOpłata: ${fee}",
|
||||
"confirm": "Potwierdzać",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Łączność",
|
||||
"contact_list_wallets": "Moje portfele",
|
||||
"contact_name": "Nazwa Kontaktu",
|
||||
"contact_name_exists": "Kontakt o tej nazwie już istnieje. Proszę wybrać inną nazwę.",
|
||||
"contact_support": "Skontaktuj się z pomocą techniczną",
|
||||
"continue_text": "Dalej",
|
||||
"contract_warning": "Ten adres umowy został oznaczony jako potencjalnie nieuczciwy. Prosimy o ostrożność.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Wygaśnięcie i ważność",
|
||||
"export_backup": "Eksportuj kopię zapasową",
|
||||
"export_logs": "Dzienniki eksportu",
|
||||
"export_outputs": "Wyjścia eksportowe",
|
||||
"extra_id": "Dodatkowy ID:",
|
||||
"extracted_address_content": "Wysyłasz środki na\n${recipient_name}",
|
||||
"failed_authentication": "Nieudane uwierzytelnienie. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "pomoc",
|
||||
"hidden_addresses": "Ukryte adresy",
|
||||
"hidden_balance": "Ukryte saldo",
|
||||
"hide": "Ukrywać",
|
||||
"hide_details": "Ukryj szczegóły",
|
||||
"high_contrast_theme": "Motyw o wysokim kontraście",
|
||||
"home_screen_settings": "Ustawienia ekranu głównego",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "WAŻNY",
|
||||
"prepaid_cards": "Karty przedpłacone",
|
||||
"prevent_screenshots": "Zapobiegaj zrzutom ekranu i nagrywaniu ekranu",
|
||||
"primary_address": "Adres podstawowy",
|
||||
"privacy": "Prywatność",
|
||||
"privacy_policy": "Polityka prywatności",
|
||||
"privacy_settings": "Ustawienia prywatności",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "Udział",
|
||||
"share_address": "Udostępnij adres",
|
||||
"shared_seed_wallet_groups": "Wspólne grupy portfeli nasion",
|
||||
"show": "Pokazywać",
|
||||
"show_details": "Pokaż szczegóły",
|
||||
"show_keys": "Pokaż seed/klucze",
|
||||
"show_market_place": "Pokaż rynek",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "Płacisz",
|
||||
"you_will_get": "Konwertuj na",
|
||||
"you_will_send": "Konwertuj z",
|
||||
"yy": "RR",
|
||||
"contact_name_exists": "Kontakt o tej nazwie już istnieje. Proszę wybrać inną nazwę."
|
||||
}
|
||||
"yy": "RR"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "link clear net",
|
||||
"close": "Fechar",
|
||||
"coin_control": "Controle de moedas (opcional)",
|
||||
"cold_or_recover_wallet": "Adicione uma cold wallet ou recupere uma paper wallet",
|
||||
"cold_or_recover_wallet": "Adicione uma carteira somente leitura de Cupcake ou uma carteira fria ou recupere uma carteira de papel",
|
||||
"color_theme": "Tema de cor",
|
||||
"commit_transaction_amount_fee": "Confirmar transação\nQuantia: ${amount}\nTaxa: ${fee}",
|
||||
"confirm": "Confirmar",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Contatos",
|
||||
"contact_list_wallets": "minhas carteiras",
|
||||
"contact_name": "Nome do contato",
|
||||
"contact_name_exists": "Um contato com esse nome já existe. Escolha um nome diferente.",
|
||||
"contact_support": "Contatar Suporte",
|
||||
"continue_text": "Continuar",
|
||||
"contract_warning": "Este endereço do contrato foi sinalizado como potencialmente fraudulento. Por favor, processe com cautela.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Expiração e validade",
|
||||
"export_backup": "Backup de exportação",
|
||||
"export_logs": "Exportar logs",
|
||||
"export_outputs": "Saídas de exportação",
|
||||
"extra_id": "ID extra:",
|
||||
"extracted_address_content": "Você enviará fundos para\n${recipient_name}",
|
||||
"failed_authentication": "Falha na autenticação. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "ajuda",
|
||||
"hidden_addresses": "Endereços ocultos",
|
||||
"hidden_balance": "Saldo escondido",
|
||||
"hide": "Esconder",
|
||||
"hide_details": "Ocultar detalhes",
|
||||
"high_contrast_theme": "Tema de alto contraste",
|
||||
"home_screen_settings": "Configurações da tela inicial",
|
||||
|
@ -502,6 +506,7 @@
|
|||
"pre_seed_title": "IMPORTANTE",
|
||||
"prepaid_cards": "Cartões pré-pagos",
|
||||
"prevent_screenshots": "Evite capturas de tela e gravação de tela",
|
||||
"primary_address": "Endereço primário",
|
||||
"privacy": "Privacidade",
|
||||
"privacy_policy": "Política de privacidade",
|
||||
"privacy_settings": "Configurações de privacidade",
|
||||
|
@ -698,6 +703,7 @@
|
|||
"share": "Compartilhar",
|
||||
"share_address": "Compartilhar endereço",
|
||||
"shared_seed_wallet_groups": "Grupos de carteira de sementes compartilhados",
|
||||
"show": "Mostrar",
|
||||
"show_details": "Mostrar detalhes",
|
||||
"show_keys": "Mostrar semente/chaves",
|
||||
"show_market_place": "Mostrar mercado",
|
||||
|
@ -946,4 +952,4 @@
|
|||
"you_will_get": "Converter para",
|
||||
"you_will_send": "Converter de",
|
||||
"yy": "aa"
|
||||
}
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Клирнет ссылка",
|
||||
"close": "Закрывать",
|
||||
"coin_control": "Контроль монет (необязательно)",
|
||||
"cold_or_recover_wallet": "Добавьте холодный кошелек или восстановите бумажный кошелек",
|
||||
"cold_or_recover_wallet": "Добавить кошелек только для чтения из Cupcake или холодный кошелек или восстановить бумажный кошелек",
|
||||
"color_theme": "Цветовая тема",
|
||||
"commit_transaction_amount_fee": "Подтвердить транзакцию \nСумма: ${amount}\nКомиссия: ${fee}",
|
||||
"confirm": "Подтвердить",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Контакты",
|
||||
"contact_list_wallets": "Мои кошельки",
|
||||
"contact_name": "Имя контакта",
|
||||
"contact_name_exists": "Контакт с таким именем уже существует. Пожалуйста, выберите другое имя.",
|
||||
"contact_support": "Связаться со службой поддержки",
|
||||
"continue_text": "Продолжить",
|
||||
"contract_warning": "Этот адрес контракта был отмечен как потенциально мошеннический. Пожалуйста, обработайтесь с осторожностью.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Истечение и достоверность",
|
||||
"export_backup": "Экспорт резервной копии",
|
||||
"export_logs": "Экспортные журналы",
|
||||
"export_outputs": "Экспортные выходы",
|
||||
"extra_id": "Дополнительный ID:",
|
||||
"extracted_address_content": "Вы будете отправлять средства\n${recipient_name}",
|
||||
"failed_authentication": "Ошибка аутентификации. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "помощь",
|
||||
"hidden_addresses": "Скрытые адреса",
|
||||
"hidden_balance": "Скрытый баланс",
|
||||
"hide": "Скрывать",
|
||||
"hide_details": "Скрыть детали",
|
||||
"high_contrast_theme": "Высококонтрастная тема",
|
||||
"home_screen_settings": "Настройки главного экрана",
|
||||
|
@ -501,6 +505,7 @@
|
|||
"pre_seed_title": "ВАЖНО",
|
||||
"prepaid_cards": "Предоплаченные карты",
|
||||
"prevent_screenshots": "Предотвратить скриншоты и запись экрана",
|
||||
"primary_address": "Первичный адрес",
|
||||
"privacy": "Конфиденциальность",
|
||||
"privacy_policy": "Политика конфиденциальности",
|
||||
"privacy_settings": "Настройки конфиденциальности",
|
||||
|
@ -697,6 +702,7 @@
|
|||
"share": "Делиться",
|
||||
"share_address": "Поделиться адресом",
|
||||
"shared_seed_wallet_groups": "Общие группы кошелька семян",
|
||||
"show": "Показывать",
|
||||
"show_details": "Показать детали",
|
||||
"show_keys": "Показать мнемоническую фразу/ключи",
|
||||
"show_market_place": "Показать торговую площадку",
|
||||
|
@ -943,6 +949,5 @@
|
|||
"you_pay": "Вы платите",
|
||||
"you_will_get": "Конвертировать в",
|
||||
"you_will_send": "Конвертировать из",
|
||||
"yy": "ГГ",
|
||||
"contact_name_exists": "Контакт с таким именем уже существует. Пожалуйста, выберите другое имя."
|
||||
}
|
||||
"yy": "ГГ"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "ลิงค์เคลียร์เน็ต",
|
||||
"close": "ปิด",
|
||||
"coin_control": "การควบคุมเหรียญ (ตัวเลือก)",
|
||||
"cold_or_recover_wallet": "เพิ่มกระเป๋าเงินเย็นหรือกู้คืนกระเป๋าเงินกระดาษ",
|
||||
"cold_or_recover_wallet": "เพิ่มกระเป๋าเงินแบบอ่านอย่างเดียวจาก Cupcake หรือกระเป๋าเงินเย็นหรือกู้คืนกระเป๋ากระดาษ",
|
||||
"color_theme": "ธีมสี",
|
||||
"commit_transaction_amount_fee": "ยืนยันธุรกรรม\nจำนวน: ${amount}\nค่าธรรมเนียม: ${fee}",
|
||||
"confirm": "ยืนยัน",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "ติดต่อ",
|
||||
"contact_list_wallets": "กระเป๋าเงินของฉัน",
|
||||
"contact_name": "ชื่อผู้ติดต่อ",
|
||||
"contact_name_exists": "มีผู้ติดต่อชื่อนั้นอยู่แล้ว โปรดเลือกชื่ออื่น",
|
||||
"contact_support": "ติดต่อฝ่ายสนับสนุน",
|
||||
"continue_text": "ดำเนินการต่อ",
|
||||
"contract_warning": "ที่อยู่สัญญานี้ได้รับการตั้งค่าสถานะว่าเป็นการฉ้อโกง กรุณาดำเนินการด้วยความระมัดระวัง",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "หมดอายุและถูกต้อง",
|
||||
"export_backup": "ส่งออกข้อมูลสำรอง",
|
||||
"export_logs": "บันทึกการส่งออก",
|
||||
"export_outputs": "เอาต์พุตส่งออก",
|
||||
"extra_id": "ไอดีเพิ่มเติม:",
|
||||
"extracted_address_content": "คุณกำลังจะส่งเงินไปยัง\n${recipient_name}",
|
||||
"failed_authentication": "การยืนยันสิทธิ์ล้มเหลว ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven ของ Cake Wallet",
|
||||
"haven_app_wallet_text": "กระเป๋าสตางค์ที่สวยงามสำหรับ Haven",
|
||||
"help": "ช่วยเหลือ",
|
||||
"hidden_addresses": "ที่อยู่ที่ซ่อนอยู่",
|
||||
"hidden_balance": "ยอดคงเหลือซ่อนอยู่",
|
||||
"hide": "ซ่อน",
|
||||
"hide_details": "ซ่อนรายละเอียด",
|
||||
"high_contrast_theme": "ธีมความคมชัดสูง",
|
||||
"home_screen_settings": "การตั้งค่าหน้าจอหลัก",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "สำคัญ",
|
||||
"prepaid_cards": "บัตรเติมเงิน",
|
||||
"prevent_screenshots": "ป้องกันภาพหน้าจอและการบันทึกหน้าจอ",
|
||||
"primary_address": "ที่อยู่ปฐมภูมิ",
|
||||
"privacy": "ความเป็นส่วนตัว",
|
||||
"privacy_policy": "นโยบายความเป็นส่วนตัว",
|
||||
"privacy_settings": "การตั้งค่าความเป็นส่วนตัว",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "แบ่งปัน",
|
||||
"share_address": "แชร์ที่อยู่",
|
||||
"shared_seed_wallet_groups": "กลุ่มกระเป๋าเงินที่ใช้ร่วมกัน",
|
||||
"show": "แสดง",
|
||||
"show_details": "แสดงรายละเอียด",
|
||||
"show_keys": "แสดงซีด/คีย์",
|
||||
"show_market_place": "แสดงตลาดกลาง",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "คุณจ่าย",
|
||||
"you_will_get": "แปลงเป็น",
|
||||
"you_will_send": "แปลงจาก",
|
||||
"yy": "ปี",
|
||||
"contact_name_exists": "มีผู้ติดต่อชื่อนั้นอยู่แล้ว โปรดเลือกชื่ออื่น"
|
||||
}
|
||||
"yy": "ปี"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Link ng Clearnet",
|
||||
"close": "Isara",
|
||||
"coin_control": "Coin control (opsyonal)",
|
||||
"cold_or_recover_wallet": "Magdagdag ng isang cold wallet o mabawi ang isang paper wallet",
|
||||
"cold_or_recover_wallet": "Magdagdag ng isang basahin lamang na pitaka mula sa Cupcake o isang malamig na pitaka o mabawi ang isang wallet ng papel",
|
||||
"color_theme": "Color theme",
|
||||
"commit_transaction_amount_fee": "Gumawa ng transaksyon\nHalaga: ${amount}\nFee: ${fee}",
|
||||
"confirm": "Kumpirmahin",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Mga Contact",
|
||||
"contact_list_wallets": "Mga Wallet Ko",
|
||||
"contact_name": "Pangalan ng Contact",
|
||||
"contact_name_exists": "Ang isang pakikipag -ugnay sa pangalang iyon ay mayroon na. Mangyaring pumili ng ibang pangalan.",
|
||||
"contact_support": "Makipag-ugnay sa Suporta",
|
||||
"continue_text": "Magpatuloy",
|
||||
"contract_warning": "Ang address ng kontrata na ito ay na -flag bilang potensyal na mapanlinlang. Mangyaring iproseso nang may pag -iingat.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Pag-expire at Bisa",
|
||||
"export_backup": "I-export ang backup",
|
||||
"export_logs": "Mga log ng pag -export",
|
||||
"export_outputs": "Mga output ng pag -export",
|
||||
"extra_id": "Dagdag na ID:",
|
||||
"extracted_address_content": "Magpapadala ka ng pondo sa\n${recipient_name}",
|
||||
"failed_authentication": "Nabigo ang pagpapatunay. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Kahanga-hangang wallet para sa Haven",
|
||||
"help": "Tulong",
|
||||
"hidden_addresses": "Nakatagong mga address",
|
||||
"hidden_balance": "Nakatagong Balanse",
|
||||
"hide": "Itago",
|
||||
"hide_details": "Itago ang mga detalye",
|
||||
"high_contrast_theme": "High Contrast Theme",
|
||||
"home_screen_settings": "Mga setting ng home screen",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "Mahalaga",
|
||||
"prepaid_cards": "Mga Prepaid Card",
|
||||
"prevent_screenshots": "Maiwasan ang mga screenshot at pag -record ng screen",
|
||||
"primary_address": "Pangunahing address",
|
||||
"privacy": "Privacy",
|
||||
"privacy_policy": "Patakaran sa Pagkapribado",
|
||||
"privacy_settings": "Settings para sa pagsasa-pribado",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "Ibahagi",
|
||||
"share_address": "Ibahagi ang address",
|
||||
"shared_seed_wallet_groups": "Ibinahaging mga pangkat ng pitaka ng binhi",
|
||||
"show": "Ipakita",
|
||||
"show_details": "Ipakita ang mga detalye",
|
||||
"show_keys": "Ipakita ang mga seed/key",
|
||||
"show_market_place": "Ipakita ang Marketplace",
|
||||
|
@ -943,4 +949,4 @@
|
|||
"you_will_get": "I-convert sa",
|
||||
"you_will_send": "I-convert mula sa",
|
||||
"yy": "YY"
|
||||
}
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Net bağlantı",
|
||||
"close": "Kapalı",
|
||||
"coin_control": "Koin kontrolü (isteğe bağlı)",
|
||||
"cold_or_recover_wallet": "Soğuk bir cüzdan ekleyin veya bir kağıt cüzdanı kurtarın",
|
||||
"cold_or_recover_wallet": "Cupcake veya soğuk bir cüzdandan salt okunur bir cüzdan ekleyin veya bir kağıt cüzdanı kurtar",
|
||||
"color_theme": "Renk teması",
|
||||
"commit_transaction_amount_fee": "Transferi gerçekleştir\nMiktar: ${amount}\nKomisyon: ${fee}",
|
||||
"confirm": "Onayla",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Rehberim",
|
||||
"contact_list_wallets": "Cüzdanlarım",
|
||||
"contact_name": "Kişi ismi",
|
||||
"contact_name_exists": "Bu isimde bir kişi zaten mevcut. Lütfen farklı bir ad seçin.",
|
||||
"contact_support": "Destek ile İletişime Geç",
|
||||
"continue_text": "Devam et",
|
||||
"contract_warning": "Bu sözleşme adresi potansiyel olarak hileli olarak işaretlenmiştir. Lütfen dikkatle işleyin.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Sona erme ve geçerlilik",
|
||||
"export_backup": "Yedeği dışa aktar",
|
||||
"export_logs": "Dışa aktarma günlükleri",
|
||||
"export_outputs": "İhracat çıktıları",
|
||||
"extra_id": "Ekstra ID:",
|
||||
"extracted_address_content": "Parayı buraya gönderceksin:\n${recipient_name}",
|
||||
"failed_authentication": "Doğrulama başarısız oldu. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Cake Wallet tarafından Haven",
|
||||
"haven_app_wallet_text": "Haven için harika cüzdan ",
|
||||
"help": "yardım",
|
||||
"hidden_addresses": "Gizli adresler",
|
||||
"hidden_balance": "Gizli Bakiye",
|
||||
"hide": "Saklamak",
|
||||
"hide_details": "Detayları Gizle",
|
||||
"high_contrast_theme": "Yüksek Kontrastlı Tema",
|
||||
"home_screen_settings": "Ana ekran ayarları",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "UYARI",
|
||||
"prepaid_cards": "Ön ödemeli kartlar",
|
||||
"prevent_screenshots": "Ekran görüntülerini ve ekran kaydını önleyin",
|
||||
"primary_address": "Birincil adres",
|
||||
"privacy": "Gizlilik",
|
||||
"privacy_policy": "Gizlilik Politikası",
|
||||
"privacy_settings": "Gizlilik ayarları",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "Paylaşmak",
|
||||
"share_address": "Adresi paylaş",
|
||||
"shared_seed_wallet_groups": "Paylaşılan tohum cüzdan grupları",
|
||||
"show": "Göstermek",
|
||||
"show_details": "Detayları Göster",
|
||||
"show_keys": "Tohumları/anahtarları göster",
|
||||
"show_market_place": "Pazar Yerini Göster",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "Şu kadar ödeyeceksin: ",
|
||||
"you_will_get": "Biçimine dönüştür:",
|
||||
"you_will_send": "Biçiminden dönüştür:",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "Bu isimde bir kişi zaten mevcut. Lütfen farklı bir ad seçin."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Посилання Clearnet",
|
||||
"close": "Закрити",
|
||||
"coin_control": "Контроль монет (необов’язково)",
|
||||
"cold_or_recover_wallet": "Додайте холодний гаманець або відновіть паперовий гаманець",
|
||||
"cold_or_recover_wallet": "Додайте гаманець лише для читання від Cupcake або холодного гаманця або відновіть паперовий гаманець",
|
||||
"color_theme": "Кольорова тема",
|
||||
"commit_transaction_amount_fee": "Підтвердити транзакцію \nСума: ${amount}\nКомісія: ${fee}",
|
||||
"confirm": "Підтвердити",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Контакти",
|
||||
"contact_list_wallets": "Мої гаманці",
|
||||
"contact_name": "Ім'я контакту",
|
||||
"contact_name_exists": "Контакт із такою назвою вже існує. Виберіть інше ім'я.",
|
||||
"contact_support": "Звернутися до служби підтримки",
|
||||
"continue_text": "Продовжити",
|
||||
"contract_warning": "Ця адреса контракту була позначена як потенційно шахрайська. Будь ласка, обробляйте обережно.",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "Закінчення та обгрунтованість",
|
||||
"export_backup": "Експортувати резервну копію",
|
||||
"export_logs": "Експортні журнали",
|
||||
"export_outputs": "Експортні результати",
|
||||
"extra_id": "Додатковий ID:",
|
||||
"extracted_address_content": "Ви будете відправляти кошти\n${recipient_name}",
|
||||
"failed_authentication": "Помилка аутентифікації. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "допомога",
|
||||
"hidden_addresses": "Приховані адреси",
|
||||
"hidden_balance": "Прихований баланс",
|
||||
"hide": "Сховати",
|
||||
"hide_details": "Приховати деталі",
|
||||
"high_contrast_theme": "Тема високої контрастності",
|
||||
"home_screen_settings": "Налаштування головного екрана",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "ВАЖЛИВО",
|
||||
"prepaid_cards": "Передплачені картки",
|
||||
"prevent_screenshots": "Запобігати знімкам екрана та запису екрана",
|
||||
"primary_address": "Первинна адреса",
|
||||
"privacy": "Конфіденційність",
|
||||
"privacy_policy": "Політика конфіденційності",
|
||||
"privacy_settings": "Налаштування конфіденційності",
|
||||
|
@ -697,6 +702,7 @@
|
|||
"share": "Поділіться",
|
||||
"share_address": "Поділитися адресою",
|
||||
"shared_seed_wallet_groups": "Спільні групи насіннєвих гаманців",
|
||||
"show": "Показувати",
|
||||
"show_details": "Показати деталі",
|
||||
"show_keys": "Показати мнемонічну фразу/ключі",
|
||||
"show_market_place": "Відображати маркетплейс",
|
||||
|
@ -943,6 +949,5 @@
|
|||
"you_pay": "Ви платите",
|
||||
"you_will_get": "Конвертувати в",
|
||||
"you_will_send": "Конвертувати з",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "Контакт із такою назвою вже існує. Виберіть інше ім'я."
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "کلیرنیٹ لنک",
|
||||
"close": "بند کریں",
|
||||
"coin_control": "سکے کنٹرول (اختیاری)",
|
||||
"cold_or_recover_wallet": "ٹھنڈا پرس ڈالیں یا کاغذ کا پرس بازیافت کریں",
|
||||
"cold_or_recover_wallet": "Cupcake یا سرد بٹوے سے صرف ایک پڑھنے والا پرس شامل کریں یا کاغذ کا پرس بازیافت کریں",
|
||||
"color_theme": "رنگین تھیم",
|
||||
"commit_transaction_amount_fee": "لین دین کا ارتکاب کریں\\nرقم: ${amount}\\nفیس: ${fee}",
|
||||
"confirm": "تصدیق کریں۔",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "رابطے",
|
||||
"contact_list_wallets": "میرے بٹوے",
|
||||
"contact_name": "رابطے کا نام",
|
||||
"contact_name_exists": " ۔ﮟﯾﺮﮐ ﺐﺨﺘﻨﻣ ﻡﺎﻧ ﻒﻠﺘﺨﻣ ﮏﯾﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ۔ﮯﮨ ﺩﻮﺟﻮﻣ ﮯﺳ ﮯﻠﮩﭘ ﮧﻄﺑﺍﺭ ﮏﯾﺍ ﮫﺗﺎﺳ ﮯﮐ ﻡﺎﻧ ﺱﺍ",
|
||||
"contact_support": "سپورٹ سے رابطہ کریں۔",
|
||||
"continue_text": "جاری رہے",
|
||||
"contract_warning": "اس معاہدے کے پتے کو ممکنہ طور پر جعلی قرار دیا گیا ہے۔ براہ کرم احتیاط کے ساتھ کارروائی کریں۔",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "میعاد ختم اور صداقت",
|
||||
"export_backup": "بیک اپ برآمد کریں۔",
|
||||
"export_logs": "نوشتہ جات برآمد کریں",
|
||||
"export_outputs": "برآمد کے نتائج",
|
||||
"extra_id": "اضافی ID:",
|
||||
"extracted_address_content": "آپ فنڈز بھیج رہے ہوں گے\n${recipient_name}",
|
||||
"failed_authentication": "ناکام تصدیق۔ ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven از Cake والیٹ",
|
||||
"haven_app_wallet_text": "Havek کے لیے زبردست پرس",
|
||||
"help": "مدد",
|
||||
"hidden_addresses": "پوشیدہ پتے",
|
||||
"hidden_balance": "پوشیدہ بیلنس",
|
||||
"hide": "چھپائیں",
|
||||
"hide_details": "تفصیلات چھپائیں۔",
|
||||
"high_contrast_theme": "ہائی کنٹراسٹ تھیم",
|
||||
"home_screen_settings": "ہوم اسکرین کی ترتیبات",
|
||||
|
@ -502,6 +506,7 @@
|
|||
"pre_seed_title": "اہم",
|
||||
"prepaid_cards": "پری پیڈ کارڈز",
|
||||
"prevent_screenshots": "اسکرین شاٹس اور اسکرین ریکارڈنگ کو روکیں۔",
|
||||
"primary_address": "بنیادی پتہ",
|
||||
"privacy": "رازداری",
|
||||
"privacy_policy": "رازداری کی پالیسی",
|
||||
"privacy_settings": "رازداری کی ترتیبات",
|
||||
|
@ -698,6 +703,7 @@
|
|||
"share": "بانٹیں",
|
||||
"share_address": "پتہ شیئر کریں۔",
|
||||
"shared_seed_wallet_groups": "مشترکہ بیج پرس گروپ",
|
||||
"show": "دکھائیں",
|
||||
"show_details": "تفصیلات دکھائیں",
|
||||
"show_keys": "بیج / چابیاں دکھائیں۔",
|
||||
"show_market_place": "بازار دکھائیں۔",
|
||||
|
@ -944,6 +950,5 @@
|
|||
"you_pay": "تم ادا کرو",
|
||||
"you_will_get": "میں تبدیل کریں۔",
|
||||
"you_will_send": "سے تبدیل کریں۔",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": " ۔ﮟﯾﺮﮐ ﺐﺨﺘﻨﻣ ﻡﺎﻧ ﻒﻠﺘﺨﻣ ﮏﯾﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ۔ﮯﮨ ﺩﻮﺟﻮﻣ ﮯﺳ ﮯﻠﮩﭘ ﮧﻄﺑﺍﺭ ﮏﯾﺍ ﮫﺗﺎﺳ ﮯﮐ ﻡﺎﻧ ﺱﺍ"
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Liên kết Clearnet",
|
||||
"close": "Đóng",
|
||||
"coin_control": "Kiểm soát đồng xu (tùy chọn)",
|
||||
"cold_or_recover_wallet": "Thêm ví lạnh hoặc khôi phục ví giấy",
|
||||
"cold_or_recover_wallet": "Thêm ví chỉ đọc từ Cupcake hoặc ví lạnh hoặc thu hồi ví giấy",
|
||||
"color_theme": "Chủ đề màu sắc",
|
||||
"commit_transaction_amount_fee": "Cam kết giao dịch\nSố tiền: ${amount}\nPhí: ${fee}",
|
||||
"confirm": "Xác nhận",
|
||||
|
@ -162,6 +162,7 @@
|
|||
"contact_list_contacts": "Danh bạ",
|
||||
"contact_list_wallets": "Ví của tôi",
|
||||
"contact_name": "Tên liên hệ",
|
||||
"contact_name_exists": "Một liên hệ với cái tên đó đã tồn tại. Vui lòng chọn một tên khác.",
|
||||
"contact_support": "Liên hệ Hỗ trợ",
|
||||
"continue_text": "Tiếp tục",
|
||||
"contract_warning": "Địa chỉ hợp đồng này đã được gắn cờ là có khả năng lừa đảo. Vui lòng xử lý một cách thận trọng.",
|
||||
|
@ -297,6 +298,7 @@
|
|||
"expiry_and_validity": "Hạn và hiệu lực",
|
||||
"export_backup": "Xuất sao lưu",
|
||||
"export_logs": "Nhật ký xuất khẩu",
|
||||
"export_outputs": "Đầu ra xuất khẩu",
|
||||
"extra_id": "ID bổ sung:",
|
||||
"extracted_address_content": "Bạn sẽ gửi tiền cho\n${recipient_name}",
|
||||
"failed_authentication": "Xác thực không thành công. ${state_error}",
|
||||
|
@ -337,7 +339,9 @@
|
|||
"haven_app": "Haven bởi Cake Wallet",
|
||||
"haven_app_wallet_text": "Ví tuyệt vời cho Haven",
|
||||
"help": "Trợ giúp",
|
||||
"hidden_addresses": "Địa chỉ ẩn",
|
||||
"hidden_balance": "Số dư ẩn",
|
||||
"hide": "Trốn",
|
||||
"hide_details": "Ẩn chi tiết",
|
||||
"high_contrast_theme": "Chủ đề độ tương phản cao",
|
||||
"home_screen_settings": "Cài đặt màn hình chính",
|
||||
|
@ -367,14 +371,22 @@
|
|||
"ledger_error_wrong_app": "Vui lòng đảm bảo bạn đã mở đúng ứng dụng trên Ledger của mình",
|
||||
"ledger_please_enable_bluetooth": "Vui lòng bật Bluetooth để phát hiện Ledger của bạn",
|
||||
"light_theme": "Chủ đề sáng",
|
||||
"litecoin_enable_mweb_sync": "Bật quét MWEB",
|
||||
"litecoin_mweb": "Mweb",
|
||||
"litecoin_mweb_always_scan": "Đặt MWEB luôn quét",
|
||||
"litecoin_mweb_description": "MWEB là một giao thức mới mang lại các giao dịch nhanh hơn, rẻ hơn và riêng tư hơn cho Litecoin",
|
||||
"litecoin_mweb_dismiss": "Miễn nhiệm",
|
||||
"litecoin_mweb_display_card": "Hiển thị thẻ MWEB",
|
||||
"litecoin_mweb_enable": "Bật MWEB",
|
||||
"litecoin_mweb_enable_later": "Bạn có thể chọn bật lại MWEB trong cài đặt hiển thị.",
|
||||
"litecoin_mweb_logs": "Nhật ký MWEB",
|
||||
"litecoin_mweb_node": "Nút MWEB",
|
||||
"litecoin_mweb_pegin": "Chốt vào",
|
||||
"litecoin_mweb_pegout": "Chốt ra",
|
||||
"litecoin_mweb_scanning": "Quét MWEB",
|
||||
"litecoin_mweb_settings": "Cài đặt MWEB",
|
||||
"litecoin_mweb_warning": "Sử dụng MWEB ban đầu sẽ tải xuống ~ 600MB dữ liệu và có thể mất tới 30 phút tùy thuộc vào tốc độ mạng. Dữ liệu ban đầu này sẽ chỉ tải xuống một lần và có sẵn cho tất cả các ví Litecoin",
|
||||
"litecoin_what_is_mweb": "MWEB là gì?",
|
||||
"live_fee_rates": "Tỷ lệ phí hiện tại qua API",
|
||||
"load_more": "Tải thêm",
|
||||
"loading_your_wallet": "Đang tải ví của bạn",
|
||||
|
@ -493,6 +505,7 @@
|
|||
"pre_seed_title": "QUAN TRỌNG",
|
||||
"prepaid_cards": "Thẻ trả trước",
|
||||
"prevent_screenshots": "Ngăn chặn ảnh chụp màn hình và ghi hình màn hình",
|
||||
"primary_address": "Địa chỉ chính",
|
||||
"privacy": "Quyền riêng tư",
|
||||
"privacy_policy": "Chính sách quyền riêng tư",
|
||||
"privacy_settings": "Cài đặt quyền riêng tư",
|
||||
|
@ -689,6 +702,7 @@
|
|||
"share": "Chia sẻ",
|
||||
"share_address": "Chia sẻ địa chỉ",
|
||||
"shared_seed_wallet_groups": "Nhóm ví hạt được chia sẻ",
|
||||
"show": "Trình diễn",
|
||||
"show_details": "Hiển thị chi tiết",
|
||||
"show_keys": "Hiển thị hạt giống/khóa",
|
||||
"show_market_place": "Hiển thị Thị trường",
|
||||
|
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "Kọja ilọ oke",
|
||||
"close": "sunmo",
|
||||
"coin_control": "Ìdarí owó ẹyọ (ìyàn nìyí)",
|
||||
"cold_or_recover_wallet": "Fi owo aisan tabi yiyewo owo iwe iwe",
|
||||
"cold_or_recover_wallet": "Ṣafikun apamọwọ kika-nikan lati Cupcake tabi apamọwọ tutu tabi gba owo apamọwọ iwe kan",
|
||||
"color_theme": "Àwọn ààtò àwọ̀",
|
||||
"commit_transaction_amount_fee": "Jẹ́rìí sí àránṣẹ́\nOwó: ${amount}\nIye àfikún: ${fee}",
|
||||
"confirm": "Jẹ́rìísí",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "Àwọn olùbásọ̀rọ̀",
|
||||
"contact_list_wallets": "Àwọn àpamọ́wọ́ mi",
|
||||
"contact_name": "Orúkọ olùbásọ̀rọ̀",
|
||||
"contact_name_exists": "Olubasọrọ pẹlu orukọ yẹn ti wa tẹlẹ. Jọwọ yan orukọ ti o yatọ.",
|
||||
"contact_support": "Bá ìranlọ́wọ́ sọ̀rọ̀",
|
||||
"continue_text": "Tẹ̀síwájú",
|
||||
"contract_warning": "Adirẹsi adehun adehun yii ti samisi bi arekereke. Jọwọ ṣe ilana pẹlu iṣọra.",
|
||||
|
@ -297,6 +298,7 @@
|
|||
"expiry_and_validity": "Ipari ati idaniloju",
|
||||
"export_backup": "Sún ẹ̀dà nípamọ́ síta",
|
||||
"export_logs": "Wọle si okeere",
|
||||
"export_outputs": "Agbohunlu okeere",
|
||||
"extra_id": "Àmì ìdánimọ̀ tó fikún:",
|
||||
"extracted_address_content": "Ẹ máa máa fi owó ránṣẹ́ sí\n${recipient_name}",
|
||||
"failed_authentication": "Ìfẹ̀rílàdí pipòfo. ${state_error}",
|
||||
|
@ -337,7 +339,9 @@
|
|||
"haven_app": "Haven latí ọwọ́ Cake Wallet",
|
||||
"haven_app_wallet_text": "Àpamọ́wọ́ Haven wà pa",
|
||||
"help": "ìranlọ́wọ́",
|
||||
"hidden_addresses": "Awọn adirẹsi ti o farapamọ",
|
||||
"hidden_balance": "Ìyókù owó dídé",
|
||||
"hide": "Pamọ",
|
||||
"hide_details": "Dé ìsọfúnni kékeré",
|
||||
"high_contrast_theme": "Akori Iyatọ giga",
|
||||
"home_screen_settings": "Awọn eto iboju ile",
|
||||
|
@ -501,6 +505,7 @@
|
|||
"pre_seed_title": "Ó TI ṢE PÀTÀKÌ",
|
||||
"prepaid_cards": "Awọn kaadi ti a ti sanwo",
|
||||
"prevent_screenshots": "Pese asapọ ti awọn ẹrọ eto aṣa",
|
||||
"primary_address": "Adirẹsi akọkọ",
|
||||
"privacy": "Ìdáwà",
|
||||
"privacy_policy": "Òfin Aládàáni",
|
||||
"privacy_settings": "Ààtò àdáni",
|
||||
|
@ -697,6 +702,7 @@
|
|||
"share": "Pinpin",
|
||||
"share_address": "Pín àdírẹ́sì",
|
||||
"shared_seed_wallet_groups": "Awọn ẹgbẹ ti a pin irugbin",
|
||||
"show": "Fihan",
|
||||
"show_details": "Fi ìsọfúnni kékeré hàn",
|
||||
"show_keys": "Wo hóró / àwọn kọ́kọ́rọ́",
|
||||
"show_market_place": "Wa Sopọ Pataki",
|
||||
|
@ -943,6 +949,5 @@
|
|||
"you_pay": "Ẹ sàn",
|
||||
"you_will_get": "Ṣe pàṣípààrọ̀ sí",
|
||||
"you_will_send": "Ṣe pàṣípààrọ̀ láti",
|
||||
"yy": "Ọd",
|
||||
"contact_name_exists": "Olubasọrọ pẹlu orukọ yẹn ti wa tẹlẹ. Jọwọ yan orukọ ti o yatọ."
|
||||
}
|
||||
"yy": "Ọd"
|
||||
}
|
|
@ -136,7 +136,7 @@
|
|||
"clearnet_link": "明网链接",
|
||||
"close": "关闭",
|
||||
"coin_control": "硬幣控制(可選)",
|
||||
"cold_or_recover_wallet": "添加冷钱包或恢复纸钱包",
|
||||
"cold_or_recover_wallet": "从Cupcake或冷钱包中添加只读的钱包或恢复纸钱包",
|
||||
"color_theme": "主题",
|
||||
"commit_transaction_amount_fee": "提交交易\n金额: ${amount}\n手续费: ${fee}",
|
||||
"confirm": "确认",
|
||||
|
@ -161,6 +161,7 @@
|
|||
"contact_list_contacts": "联系人",
|
||||
"contact_list_wallets": "我的钱包",
|
||||
"contact_name": "联系人姓名",
|
||||
"contact_name_exists": "已存在具有该名称的联系人。请选择不同的名称。",
|
||||
"contact_support": "联系支持",
|
||||
"continue_text": "继续",
|
||||
"contract_warning": "该合同地址已被标记为潜在的欺诈性。请谨慎处理。",
|
||||
|
@ -296,6 +297,7 @@
|
|||
"expiry_and_validity": "到期和有效性",
|
||||
"export_backup": "导出备份",
|
||||
"export_logs": "导出日志",
|
||||
"export_outputs": "导出输出",
|
||||
"extra_id": "额外ID:",
|
||||
"extracted_address_content": "您将汇款至\n${recipient_name}",
|
||||
"failed_authentication": "身份验证失败. ${state_error}",
|
||||
|
@ -336,7 +338,9 @@
|
|||
"haven_app": "Haven by Cake Wallet",
|
||||
"haven_app_wallet_text": "Awesome wallet for Haven",
|
||||
"help": "帮助",
|
||||
"hidden_addresses": "隐藏的地址",
|
||||
"hidden_balance": "隐藏余额",
|
||||
"hide": "隐藏",
|
||||
"hide_details": "隐藏细节",
|
||||
"high_contrast_theme": "高对比度主题",
|
||||
"home_screen_settings": "主屏幕设置",
|
||||
|
@ -500,6 +504,7 @@
|
|||
"pre_seed_title": "重要",
|
||||
"prepaid_cards": "预付费卡",
|
||||
"prevent_screenshots": "防止截屏和录屏",
|
||||
"primary_address": "主要地址",
|
||||
"privacy": "隐私",
|
||||
"privacy_policy": "隐私政策",
|
||||
"privacy_settings": "隐私设置",
|
||||
|
@ -696,6 +701,7 @@
|
|||
"share": "分享",
|
||||
"share_address": "分享地址",
|
||||
"shared_seed_wallet_groups": "共享种子钱包组",
|
||||
"show": "展示",
|
||||
"show_details": "显示详细信息",
|
||||
"show_keys": "显示种子/密钥",
|
||||
"show_market_place": "显示市场",
|
||||
|
@ -942,6 +948,5 @@
|
|||
"you_pay": "你付钱",
|
||||
"you_will_get": "转换到",
|
||||
"you_will_send": "转换自",
|
||||
"yy": "YY",
|
||||
"contact_name_exists": "已存在具有该名称的联系人。请选择不同的名称。"
|
||||
}
|
||||
"yy": "YY"
|
||||
}
|
|
@ -9,7 +9,7 @@ gen_podspec() {
|
|||
DEFAULT_FILE_PATH="${CW_PLUGIN_DIR}/${DEFAULT_FILENAME}"
|
||||
rm -f $DEFAULT_FILE_PATH
|
||||
cp $BASE_FILE_PATH $DEFAULT_FILE_PATH
|
||||
sed -i '' "s/#___VALID_ARCHS___#/${ARCH}/g" $DEFAULT_FILE_PATH
|
||||
gsed -i "s/#___VALID_ARCHS___#/${ARCH}/g" $DEFAULT_FILE_PATH
|
||||
}
|
||||
|
||||
gen_project() {
|
||||
|
@ -17,7 +17,7 @@ gen_project() {
|
|||
CW_DIR="`pwd`/../../macos/Runner.xcodeproj"
|
||||
DEFAULT_FILENAME="project.pbxproj"
|
||||
DEFAULT_FILE_PATH="${CW_DIR}/${DEFAULT_FILENAME}"
|
||||
sed -i '' "s/ARCHS =.*/ARCHS = \"${ARCH}\";/g" $DEFAULT_FILE_PATH
|
||||
gsed -i "s/ARCHS =.*/ARCHS = \"${ARCH}\";/g" $DEFAULT_FILE_PATH
|
||||
}
|
||||
|
||||
gen() {
|
||||
|
|
|
@ -276,6 +276,7 @@ import 'package:cw_core/get_height_by_date.dart';
|
|||
import 'package:cw_core/monero_amount_format.dart';
|
||||
import 'package:cw_core/monero_transaction_priority.dart';
|
||||
import 'package:cw_monero/monero_unspent.dart';
|
||||
import 'package:cw_monero/api/account_list.dart';
|
||||
import 'package:cw_monero/monero_wallet_service.dart';
|
||||
import 'package:cw_monero/api/wallet_manager.dart';
|
||||
import 'package:cw_monero/monero_wallet.dart';
|
||||
|
@ -379,6 +380,12 @@ abstract class Monero {
|
|||
|
||||
Future<int> getCurrentHeight();
|
||||
|
||||
Future<bool> commitTransactionUR(Object wallet, String ur);
|
||||
|
||||
String exportOutputsUR(Object wallet, bool all);
|
||||
|
||||
bool importKeyImagesUR(Object wallet, String ur);
|
||||
|
||||
WalletCredentials createMoneroRestoreWalletFromKeysCredentials({
|
||||
required String name,
|
||||
required String spendKey,
|
||||
|
@ -398,6 +405,7 @@ abstract class Monero {
|
|||
int formatterMoneroParseAmount({required String amount});
|
||||
Account getCurrentAccount(Object wallet);
|
||||
void monerocCheck();
|
||||
bool isViewOnly();
|
||||
void setCurrentAccount(Object wallet, int id, String label, String? balance);
|
||||
void onStartup();
|
||||
int getTransactionInfoAccountId(TransactionInfo tx);
|
||||
|
|
|
@ -13,7 +13,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
|||
)
|
||||
|
||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||
sp_scanner
|
||||
)
|
||||
|
||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||
|
|
Loading…
Reference in a new issue