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:
cyan 2024-11-09 19:59:47 +01:00 committed by GitHub
parent 8e12fb1ad9
commit cea3084bb3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
84 changed files with 1318 additions and 141 deletions

View file

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

View file

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

View file

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

View file

@ -1,4 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
org.gradle.jvmargs=-Xmx3072M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true

View file

@ -1,6 +1,7 @@
-
uri: xmr-node.cakewallet.com:18081
is_default: true
trusted: true
-
uri: cakexmrl7bonq7ovjka5kuwuyd3f7qnkz6z6s6dmsy3uckwra7bvggyd.onion:18081
is_default: false

View file

@ -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();
}
}

View file

@ -85,4 +85,8 @@ class PendingBitcoinCashTransaction with PendingTransaction {
fee: fee,
isReplaced: false,
);
@override
Future<String?> commitUR() {
throw UnimplementedError();
}
}

View file

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

View file

@ -14,5 +14,8 @@ mixin PendingTransaction {
int? get outputCount => null;
PendingChange? change;
bool shouldCommitUR() => false;
Future<void> commit();
Future<String?> commitUR();
}

View file

@ -47,4 +47,9 @@ class PendingEVMChainTransaction with PendingTransaction {
return '0x${Hex.HEX.encode(txid)}';
}
@override
Future<String?> commitUR() {
throw UnimplementedError();
}
}

View file

@ -2,4 +2,9 @@ class WalletRestoreFromKeysException implements Exception {
WalletRestoreFromKeysException({required this.message});
final String message;
@override
String toString() {
return message;
}
}

View file

@ -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(),

View file

@ -48,4 +48,9 @@ class PendingHavenTransaction with PendingTransaction {
rethrow;
}
}
@override
Future<String?> commitUR() {
throw UnimplementedError();
}
}

View file

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

View file

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

View file

@ -425,3 +425,5 @@ Future<void> restoreFromSpendKey(
});
bool isWalletExist({required String path}) => _isWalletExist(path);
bool isViewOnlyBySpendKey() => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0;

View file

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

View file

@ -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();

View file

@ -37,4 +37,9 @@ class PendingNanoTransaction with PendingTransaction {
await nanoClient.processBlock(block, "send");
}
}
@override
Future<String?> commitUR() {
throw UnimplementedError();
}
}

View 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"

View file

@ -40,4 +40,9 @@ class PendingSolanaTransaction with PendingTransaction {
@override
String get id => '';
@override
Future<String?> commitUR() {
throw UnimplementedError();
}
}

View file

@ -30,4 +30,9 @@ class PendingTronTransaction with PendingTransaction {
@override
String get id => '';
@override
Future<String?> commitUR() {
throw UnimplementedError();
}
}

View file

@ -3,5 +3,6 @@ class WalletRestoreFromKeysException implements Exception {
final String message;
@override
String toString() => message;
}

View file

@ -50,4 +50,9 @@ class PendingWowneroTransaction with PendingTransaction {
rethrow;
}
}
@override
Future<String?> commitUR() {
throw UnimplementedError();
}
}

View file

@ -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(),

View file

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

View file

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

View file

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

View file

@ -204,7 +204,7 @@ Future<void> initializeAppConfigs() async {
transactionDescriptions: transactionDescriptions,
secureStorage: secureStorage,
anonpayInvoiceInfo: anonpayInvoiceInfo,
initialMigrationVersion: 42,
initialMigrationVersion: 43,
);
}

View file

@ -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();
}
}

View file

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

View file

@ -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';
}

View file

@ -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()));
},

View file

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

View file

@ -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(),

View file

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

View file

@ -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();
}

View file

@ -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 (_) {}

View 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,
),
),
],
);
}
}

View file

@ -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);
}

View file

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

View file

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

View 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;
}

View file

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

View file

@ -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');

View file

@ -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?,
);
}

View file

@ -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');
}
}

View file

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

View file

@ -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'),

View file

@ -10,7 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST
sp_scanner
)
set(PLUGIN_BUNDLED_LIBRARIES)

View file

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

View file

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

View file

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

View file

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

View file

@ -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": "гг"
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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": "वाईवाई"
}

View file

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

View file

@ -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": "Ցուցադրել շուկան",

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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": "ГГ"
}

View file

@ -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": "ปี"
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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() {

View file

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

View file

@ -13,7 +13,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST
sp_scanner
)
set(PLUGIN_BUNDLED_LIBRARIES)