feat: bitcoin address type receive options

This commit is contained in:
Rafael Saes 2023-11-29 13:29:57 -03:00
parent be02458b15
commit f18ee490ad
48 changed files with 301 additions and 231 deletions

View file

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'package:bitcoin_flutter/bitcoin_flutter.dart';
class BitcoinAddressRecord { class BitcoinAddressRecord {
BitcoinAddressRecord(this.address, BitcoinAddressRecord(this.address,
@ -6,7 +7,8 @@ class BitcoinAddressRecord {
this.isHidden = false, this.isHidden = false,
bool isUsed = false, bool isUsed = false,
this.silentAddressLabel, this.silentAddressLabel,
this.silentPaymentTweak}) this.silentPaymentTweak,
this.type})
: _isUsed = isUsed; : _isUsed = isUsed;
factory BitcoinAddressRecord.fromJSON(String jsonSource) { factory BitcoinAddressRecord.fromJSON(String jsonSource) {
@ -15,7 +17,12 @@ class BitcoinAddressRecord {
return BitcoinAddressRecord(decoded['address'] as String, return BitcoinAddressRecord(decoded['address'] as String,
index: decoded['index'] as int, index: decoded['index'] as int,
isHidden: decoded['isHidden'] as bool? ?? false, isHidden: decoded['isHidden'] as bool? ?? false,
isUsed: decoded['isUsed'] as bool? ?? false); isUsed: decoded['isUsed'] as bool? ?? false,
silentAddressLabel: decoded['silentAddressLabel'] as String?,
silentPaymentTweak: decoded['silentPaymentTweak'] as String?,
type: decoded['type'] != null && decoded['type'] != ''
? AddressType.values.firstWhere((type) => type.toString() == decoded['type'] as String)
: null);
} }
@override @override
@ -35,12 +42,15 @@ class BitcoinAddressRecord {
void setAsUsed() => _isUsed = true; void setAsUsed() => _isUsed = true;
AddressType? type;
String toJSON() => json.encode({ String toJSON() => json.encode({
'address': address, 'address': address,
'index': index, 'index': index,
'isHidden': isHidden, 'isHidden': isHidden,
'isUsed': isUsed, 'isUsed': isUsed,
'silentAddressLabel': silentAddressLabel, 'silentAddressLabel': silentAddressLabel,
'silentPaymentTweak': silentPaymentTweak 'silentPaymentTweak': silentPaymentTweak,
'type': type?.toString() ?? '',
}); });
} }

View file

@ -31,7 +31,14 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S
silentAddress: silentAddress); silentAddress: silentAddress);
@override @override
String getAddress({required int index, required bitcoin.HDWallet hd}) => String getAddress(
generateP2WPKHAddress(hd: hd, index: index, networkType: networkType); {required int index, required bitcoin.HDWallet hd, bitcoin.AddressType? addressType}) {
} if (addressType == bitcoin.AddressType.p2pkh)
return generateP2PKHAddress(hd: hd, index: index, networkType: networkType);
if (addressType == bitcoin.AddressType.p2tr)
return generateP2TRAddress(hd: hd, index: index, networkType: networkType);
return generateP2WPKHAddress(hd: hd, index: index, networkType: networkType);
}
}

View file

@ -324,13 +324,14 @@ abstract class ElectrumWalletBase
} }
if (fee == 0 && networkType == bitcoin.bitcoin) { if (fee == 0 && networkType == bitcoin.bitcoin) {
// throw BitcoinTransactionWrongBalanceException(currency); throw BitcoinTransactionWrongBalanceException(currency);
} }
final totalAmount = amount + fee; final totalAmount = amount + fee;
if (totalAmount > balance[currency]!.confirmed || totalAmount > allInputsAmount) { if ((totalAmount > balance[currency]!.confirmed || totalAmount > allInputsAmount) &&
// throw BitcoinTransactionWrongBalanceException(currency); networkType == bitcoin.bitcoin) {
throw BitcoinTransactionWrongBalanceException(currency);
} }
final changeAddress = await walletAddresses.getChangeAddress(); final changeAddress = await walletAddresses.getChangeAddress();

View file

@ -13,16 +13,17 @@ part 'electrum_wallet_addresses.g.dart';
class ElectrumWalletAddresses = ElectrumWalletAddressesBase with _$ElectrumWalletAddresses; class ElectrumWalletAddresses = ElectrumWalletAddressesBase with _$ElectrumWalletAddresses;
abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
ElectrumWalletAddressesBase(WalletInfo walletInfo, ElectrumWalletAddressesBase(
{required this.mainHd, WalletInfo walletInfo, {
required this.sideHd, required this.mainHd,
required this.electrumClient, required this.sideHd,
required this.networkType, required this.electrumClient,
List<BitcoinAddressRecord>? initialAddresses, required this.networkType,
int initialRegularAddressIndex = 0, List<BitcoinAddressRecord>? initialAddresses,
int initialChangeAddressIndex = 0, int initialRegularAddressIndex = 0,
bitcoin.SilentPaymentReceiver? silentAddress}) int initialChangeAddressIndex = 0,
: addresses = ObservableList<BitcoinAddressRecord>.of((initialAddresses ?? []).toSet()), bitcoin.SilentPaymentReceiver? silentAddress,
}) : addresses = ObservableList<BitcoinAddressRecord>.of((initialAddresses ?? []).toSet()),
silentAddress = silentAddress, silentAddress = silentAddress,
receiveAddresses = ObservableList<BitcoinAddressRecord>.of((initialAddresses ?? []) receiveAddresses = ObservableList<BitcoinAddressRecord>.of((initialAddresses ?? [])
.where((addressRecord) => !addressRecord.isHidden && !addressRecord.isUsed) .where((addressRecord) => !addressRecord.isHidden && !addressRecord.isUsed)
@ -55,6 +56,12 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
// TODO: labels -> disable edit on receive page // TODO: labels -> disable edit on receive page
final bitcoin.SilentPaymentReceiver? silentAddress; final bitcoin.SilentPaymentReceiver? silentAddress;
@observable
// ignore: prefer_final_fields
dynamic _addressPageType = bitcoin.AddressType.p2wpkh;
@computed
dynamic get addressPageType => _addressPageType;
@observable @observable
String? activeAddress; String? activeAddress;
@ -72,6 +79,10 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
@override @override
@computed @computed
String get address { String get address {
if (addressPageType == bitcoin.AddressType.p2sp) {
return silentAddress!.toString();
}
if (activeAddress != null) { if (activeAddress != null) {
return activeAddress!; return activeAddress!;
} }
@ -80,6 +91,16 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
return generateNewAddress().address; return generateNewAddress().address;
} }
try {
receiveAddresses.forEach(
(element) => print('element: ${element.address} ${element.type} $addressPageType'));
return receiveAddresses
.firstWhere((address) => addressPageType == bitcoin.AddressType.p2wpkh
? address.type == null || address.type == addressPageType
: address.type == addressPageType)
.address;
} catch (_) {}
return receiveAddresses.first.address; return receiveAddresses.first.address;
} }
@ -149,6 +170,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
return address; return address;
} }
@action
BitcoinAddressRecord generateNewAddress( BitcoinAddressRecord generateNewAddress(
{bitcoin.HDWallet? hd, bool isHidden = false, String? label}) { {bitcoin.HDWallet? hd, bool isHidden = false, String? label}) {
if (label != null && silentAddress != null) { if (label != null && silentAddress != null) {
@ -170,7 +192,11 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
// FIX-ME: Check logic for whichi HD should be used here ??? // FIX-ME: Check logic for whichi HD should be used here ???
final address = BitcoinAddressRecord( final address = BitcoinAddressRecord(
getAddress(index: currentReceiveAddressIndex, hd: hd ?? sideHd), getAddress(
index: currentReceiveAddressIndex,
hd: hd ?? sideHd,
addressType: addressPageType as bitcoin.AddressType,
),
index: currentReceiveAddressIndex, index: currentReceiveAddressIndex,
isHidden: isHidden); isHidden: isHidden);
addresses.add(address); addresses.add(address);
@ -179,7 +205,9 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
currentReceiveAddressIndex += 1; currentReceiveAddressIndex += 1;
} }
String getAddress({required int index, required bitcoin.HDWallet hd}) => ''; String getAddress(
{required int index, required bitcoin.HDWallet hd, bitcoin.AddressType? addressType}) =>
'';
@override @override
Future<void> updateAddressesInBox() async { Future<void> updateAddressesInBox() async {
@ -208,18 +236,21 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
changeAddresses.addAll(newAdresses); changeAddresses.addAll(newAdresses);
} }
Future<void> _discoverAddresses(bitcoin.HDWallet hd, bool isHidden) async { @action
Future<void> _discoverAddresses(bitcoin.HDWallet hd, bool isHidden,
{bitcoin.AddressType? addressType}) async {
var hasAddrUse = true; var hasAddrUse = true;
List<BitcoinAddressRecord> addrs; List<BitcoinAddressRecord> addrs;
if (addresses.isNotEmpty) { if (addresses.where((addr) => addr.type == addressPageType).isNotEmpty) {
addrs = addresses.where((addr) => addr.isHidden == isHidden).toList(); addrs = addresses.where((addr) => addr.isHidden == isHidden).toList();
} else { } else {
addrs = await _createNewAddresses( addrs = await _createNewAddresses(
isHidden ? defaultChangeAddressesCount : defaultReceiveAddressesCount, isHidden ? defaultChangeAddressesCount : defaultReceiveAddressesCount,
startIndex: 0, startIndex: 0,
hd: hd, hd: hd,
isHidden: isHidden); isHidden: isHidden,
addressType: addressType);
} }
while (hasAddrUse) { while (hasAddrUse) {
@ -232,11 +263,12 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
final start = addrs.length; final start = addrs.length;
final count = start + gap; final count = start + gap;
final batch = await _createNewAddresses(count, startIndex: start, hd: hd, isHidden: isHidden); final batch = await _createNewAddresses(count,
startIndex: start, hd: hd, isHidden: isHidden, addressType: addressType);
addrs.addAll(batch); addrs.addAll(batch);
} }
if (addresses.length < addrs.length) { if (addresses.length < addrs.length || addressPageType != null) {
addAddresses(addrs); addAddresses(addrs);
} }
} }
@ -270,12 +302,15 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
} }
Future<List<BitcoinAddressRecord>> _createNewAddresses(int count, Future<List<BitcoinAddressRecord>> _createNewAddresses(int count,
{required bitcoin.HDWallet hd, int startIndex = 0, bool isHidden = false}) async { {required bitcoin.HDWallet hd,
int startIndex = 0,
bool isHidden = false,
bitcoin.AddressType? addressType}) async {
final list = <BitcoinAddressRecord>[]; final list = <BitcoinAddressRecord>[];
for (var i = startIndex; i < count + startIndex; i++) { for (var i = startIndex; i < count + startIndex; i++) {
final address = final address = BitcoinAddressRecord(getAddress(index: i, hd: hd, addressType: addressType),
BitcoinAddressRecord(getAddress(index: i, hd: hd), index: i, isHidden: isHidden); index: i, isHidden: isHidden, type: addressType);
list.add(address); list.add(address);
} }
@ -287,7 +322,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
final addressesSet = this.addresses.toSet(); final addressesSet = this.addresses.toSet();
addressesSet.addAll(addresses); addressesSet.addAll(addresses);
this.addresses.removeRange(0, this.addresses.length); this.addresses.removeRange(0, this.addresses.length);
this.addresses.addAll(addressesSet); this.addresses.addAll(addresses);
} }
Future<bool> _hasAddressUsed(String address) async { Future<bool> _hasAddressUsed(String address) async {
@ -295,4 +330,15 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
final transactionHistory = await electrumClient.getHistory(sh); final transactionHistory = await electrumClient.getHistory(sh);
return transactionHistory.isNotEmpty; return transactionHistory.isNotEmpty;
} }
@override
@action
Future<void> setAddressType(dynamic type) async {
_addressPageType = type as bitcoin.AddressType;
if (addressPageType != bitcoin.AddressType.p2sp) {
await _discoverAddresses(mainHd, false, addressType: addressPageType as bitcoin.AddressType);
updateReceiveAddresses();
}
}
} }

View file

@ -34,6 +34,6 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses
networkType: networkType); networkType: networkType);
@override @override
String getAddress({required int index, required bitcoin.HDWallet hd}) => String getAddress({required int index, required bitcoin.HDWallet hd, bitcoin.AddressType? addressType}) =>
generateP2WPKHAddress(hd: hd, index: index, networkType: networkType); generateP2WPKHAddress(hd: hd, index: index, networkType: networkType);
} }

View file

@ -4,19 +4,23 @@ import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
String scriptHash(String address, {required bitcoin.NetworkType networkType}) { String scriptHash(String address, {required bitcoin.NetworkType networkType}) {
final outputScript = bitcoin.Address.addressToOutputScript(address, networkType); try {
final parts = sha256.convert(outputScript).toString().split(''); final outputScript = bitcoin.Address.addressToOutputScript(address, networkType);
var res = ''; final parts = sha256.convert(outputScript).toString().split('');
var res = '';
for (var i = parts.length - 1; i >= 0; i--) { for (var i = parts.length - 1; i >= 0; i--) {
final char = parts[i]; final char = parts[i];
i--; i--;
final nextChar = parts[i]; final nextChar = parts[i];
res += nextChar; res += nextChar;
res += char; res += char;
} }
return res; return res;
} catch (e) {}
return "";
} }
String scriptHashFromScript(Uint8List outputScript, {required bitcoin.NetworkType networkType}) { String scriptHashFromScript(Uint8List outputScript, {required bitcoin.NetworkType networkType}) {

View file

@ -4,15 +4,11 @@ import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
import 'package:bitcoin_flutter/src/payments/index.dart' show PaymentData; import 'package:bitcoin_flutter/src/payments/index.dart' show PaymentData;
import 'package:hex/hex.dart'; import 'package:hex/hex.dart';
bitcoin.PaymentData generatePaymentData( bitcoin.PaymentData generatePaymentData({required bitcoin.HDWallet hd, required int index}) =>
{required bitcoin.HDWallet hd, required int index}) => PaymentData(pubkey: Uint8List.fromList(HEX.decode(hd.derive(index).pubKey!)));
PaymentData(
pubkey: Uint8List.fromList(HEX.decode(hd.derive(index).pubKey!)));
bitcoin.ECPair generateKeyPair( bitcoin.ECPair generateKeyPair(
{required bitcoin.HDWallet hd, {required bitcoin.HDWallet hd, required int index, required bitcoin.NetworkType network}) =>
required int index,
required bitcoin.NetworkType network}) =>
bitcoin.ECPair.fromWIF(hd.derive(index).wif!, network: network); bitcoin.ECPair.fromWIF(hd.derive(index).wif!, network: network);
String generateP2WPKHAddress( String generateP2WPKHAddress(
@ -28,28 +24,19 @@ String generateP2WPKHAddress(
.data .data
.address!; .address!;
String generateP2WPKHAddressByPath(
{required bitcoin.HDWallet hd,
required String path,
required bitcoin.NetworkType networkType}) =>
bitcoin
.P2WPKH(
data: PaymentData(
pubkey:
Uint8List.fromList(HEX.decode(hd.derivePath(path).pubKey!))),
network: networkType)
.data
.address!;
String generateP2PKHAddress( String generateP2PKHAddress(
{required bitcoin.HDWallet hd, {required bitcoin.HDWallet hd,
required int index, required int index,
required bitcoin.NetworkType networkType}) => required bitcoin.NetworkType networkType}) =>
bitcoin bitcoin
.P2PKH( .P2PKH(
data: PaymentData( data: PaymentData(pubkey: Uint8List.fromList(HEX.decode(hd.derive(index).pubKey!))),
pubkey:
Uint8List.fromList(HEX.decode(hd.derive(index).pubKey!))),
network: networkType) network: networkType)
.data .data
.address!; .address!;
String generateP2TRAddress(
{required bitcoin.HDWallet hd,
required int index,
required bitcoin.NetworkType networkType}) =>
bitcoin.P2trAddress(program: hd.derive(index).pubKey!).toAddress(networkType);

View file

@ -44,11 +44,9 @@ packages:
bech32: bech32:
dependency: transitive dependency: transitive
description: description:
path: "." path: "/home/rafael/Storage/Repositories/bech32"
ref: bech32m relative: false
resolved-ref: "55d966503310fc46bf349e2f56fe1bb513ed429b" source: path
url: "https://github.com/saltrafael/bech32.git"
source: git
version: "0.2.2" version: "0.2.2"
bip32: bip32:
dependency: transitive dependency: transitive
@ -86,11 +84,9 @@ packages:
bitcoin_flutter: bitcoin_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "/home/rafael/Storage/Repositories/bitcoin_flutter"
ref: silent-payments relative: false
resolved-ref: "18dc839f06b98a9319334e3fac316e8be9ca52dc" source: path
url: "https://github.com/cake-tech/bitcoin_flutter"
source: git
version: "2.0.2" version: "2.0.2"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
@ -144,10 +140,10 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: build_runner name: build_runner
sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" sha256: "67d591d602906ef9201caf93452495ad1812bea2074f04e25dbd7c133785821b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.6" version: "2.4.7"
build_runner_core: build_runner_core:
dependency: transitive dependency: transitive
description: description:

View file

@ -20,9 +20,7 @@ dependencies:
cw_core: cw_core:
path: ../cw_core path: ../cw_core
bitcoin_flutter: bitcoin_flutter:
git: path: /home/rafael/Storage/Repositories/bitcoin_flutter
url: https://github.com/cake-tech/bitcoin_flutter
ref: silent-payments
bitbox: bitbox:
git: git:
url: https://github.com/cake-tech/bitbox-flutter.git url: https://github.com/cake-tech/bitbox-flutter.git

View file

@ -3,8 +3,8 @@ import 'package:cw_core/wallet_info.dart';
abstract class WalletAddresses { abstract class WalletAddresses {
WalletAddresses(this.walletInfo) WalletAddresses(this.walletInfo)
: addressesMap = {}, : addressesMap = {},
addressInfos = {}; addressInfos = {};
final WalletInfo walletInfo; final WalletInfo walletInfo;
@ -38,4 +38,7 @@ abstract class WalletAddresses {
} }
bool containsAddress(String address) => addressesMap.containsKey(address); bool containsAddress(String address) => addressesMap.containsKey(address);
dynamic addressPageType;
Future<void> setAddressType(dynamic type);
} }

View file

@ -30,4 +30,9 @@ abstract class EthereumWalletAddressesBase extends WalletAddresses with Store {
print(e.toString()); print(e.toString());
} }
} }
@override
Future<void> setAddressType(dynamic type) {
throw UnimplementedError();
}
} }

View file

@ -116,4 +116,9 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store {
@override @override
bool containsAddress(String address) => bool containsAddress(String address) =>
addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false;
@override
Future<void> setAddressType(dynamic type) {
throw UnimplementedError();
}
} }

View file

@ -47,4 +47,9 @@ abstract class NanoWalletAddressesBase extends WalletAddresses with Store {
print(e.toString()); print(e.toString());
} }
} }
@override
Future<void> setAddressType(dynamic type) {
throw UnimplementedError();
}
} }

View file

@ -537,7 +537,7 @@ Future<void> setup({
getIt.registerFactory<DesktopSettingsPage>(() => DesktopSettingsPage()); getIt.registerFactory<DesktopSettingsPage>(() => DesktopSettingsPage());
getIt.registerFactoryParam<ReceiveOptionViewModel, ReceivePageOption?, void>( getIt.registerFactoryParam<ReceiveOptionViewModel, dynamic, void>(
(pageOption, _) => ReceiveOptionViewModel(getIt.get<AppStore>().wallet!, pageOption)); (pageOption, _) => ReceiveOptionViewModel(getIt.get<AppStore>().wallet!, pageOption));
getIt.registerFactoryParam<AnonInvoicePageViewModel, List<dynamic>, void>((args, _) { getIt.registerFactoryParam<AnonInvoicePageViewModel, List<dynamic>, void>((args, _) {

View file

@ -28,6 +28,7 @@ import 'package:mobx/mobx.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart'; import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
import 'package:cake_wallet/themes/extensions/balance_page_theme.dart'; import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
class AddressPage extends BasePage { class AddressPage extends BasePage {
AddressPage({ AddressPage({
@ -70,7 +71,7 @@ class AddressPage extends BasePage {
size: 16, size: 16,
); );
final _closeButton = final _closeButton =
currentTheme.type == ThemeType.dark ? closeButtonImageDarkTheme : closeButtonImage; currentTheme.type == ThemeType.dark ? closeButtonImageDarkTheme : closeButtonImage;
bool isMobileView = responsiveLayoutUtil.shouldRenderMobileUI; bool isMobileView = responsiveLayoutUtil.shouldRenderMobileUI;
@ -186,7 +187,7 @@ class AddressPage extends BasePage {
Observer( Observer(
builder: (_) { builder: (_) {
String label = addressListViewModel.hasSilentAddresses String label = addressListViewModel.hasSilentAddresses
? S.of(context).address_and_silent_addresses ? S.of(context).labeled_silent_addresses
: addressListViewModel.hasAccounts : addressListViewModel.hasAccounts
? S.of(context).accounts_subaddresses ? S.of(context).accounts_subaddresses
: S.of(context).addresses; : S.of(context).addresses;
@ -238,7 +239,7 @@ class AddressPage extends BasePage {
return; return;
} }
reaction((_) => receiveOptionViewModel.selectedReceiveOption, (ReceivePageOption option) { reaction((_) => receiveOptionViewModel.selectedReceiveOption, (dynamic option) async {
switch (option) { switch (option) {
case ReceivePageOption.anonPayInvoice: case ReceivePageOption.anonPayInvoice:
Navigator.pushNamed( Navigator.pushNamed(
@ -270,6 +271,12 @@ class AddressPage extends BasePage {
); );
} }
break; break;
case bitcoin.AddressType.p2pkh:
case bitcoin.AddressType.p2wpkh:
case bitcoin.AddressType.p2tr:
case bitcoin.AddressType.p2sp:
await addressListViewModel.setAddressType(option);
break;
default: default:
} }
}); });

View file

@ -190,7 +190,7 @@ class AnonPayInvoicePage extends BasePage {
return; return;
} }
reaction((_) => receiveOptionViewModel.selectedReceiveOption, (ReceivePageOption option) { reaction((_) => receiveOptionViewModel.selectedReceiveOption, (dynamic option) {
switch (option) { switch (option) {
case ReceivePageOption.mainnet: case ReceivePageOption.mainnet:
Navigator.popAndPushNamed(context, Routes.addressPage); Navigator.popAndPushNamed(context, Routes.addressPage);

View file

@ -165,7 +165,7 @@ class ReceivePage extends BasePage {
cell = HeaderTile( cell = HeaderTile(
onTap: () => onTap: () =>
Navigator.of(context).pushNamed(Routes.newSubaddress), Navigator.of(context).pushNamed(Routes.newSubaddress),
title: S.of(context).silent_addresses, title: S.of(context).labeled_silent_addresses,
icon: Icon( icon: Icon(
Icons.add, Icons.add,
size: 20, size: 20,

View file

@ -37,6 +37,8 @@ class QRWidget extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final copyImage = Image.asset('assets/images/copy_address.png', final copyImage = Image.asset('assets/images/copy_address.png',
color: Theme.of(context).extension<QRCodeTheme>()!.qrWidgetCopyButtonColor); color: Theme.of(context).extension<QRCodeTheme>()!.qrWidgetCopyButtonColor);
print(
'addressListViewModel.address.type: ${addressListViewModel.wallet.walletAddresses.address}');
return Center( return Center(
child: SingleChildScrollView( child: SingleChildScrollView(
@ -85,8 +87,9 @@ class QRWidget extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all( border: Border.all(
width: 3, width: 3,
color: color: Theme.of(context)
Theme.of(context).extension<DashboardPageTheme>()!.textColor, .extension<DashboardPageTheme>()!
.textColor,
), ),
), ),
child: Container( child: Container(
@ -150,7 +153,8 @@ class QRWidget extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontSize: 15, fontSize: 15,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: Theme.of(context).extension<DashboardPageTheme>()!.textColor), color:
Theme.of(context).extension<DashboardPageTheme>()!.textColor),
), ),
), ),
Padding( Padding(

View file

@ -2,6 +2,7 @@ import 'package:cake_wallet/themes/extensions/keyboard_theme.dart';
import 'package:cake_wallet/entities/priority_for_wallet_type.dart'; import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
import 'package:cake_wallet/src/screens/exchange/widgets/currency_picker.dart'; import 'package:cake_wallet/src/screens/exchange/widgets/currency_picker.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/utils/payment_request.dart'; import 'package:cake_wallet/utils/payment_request.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/crypto_currency.dart';
@ -164,7 +165,7 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
}, },
options: [ options: [
AddressTextFieldOption.paste, AddressTextFieldOption.paste,
AddressTextFieldOption.qrCode, if (DeviceInfo.instance.isMobile) AddressTextFieldOption.qrCode,
AddressTextFieldOption.addressBook AddressTextFieldOption.addressBook
], ],
buttonColor: buttonColor:

View file

@ -19,10 +19,7 @@ class AddressTextField extends StatelessWidget {
{required this.controller, {required this.controller,
this.isActive = true, this.isActive = true,
this.placeholder, this.placeholder,
this.options = const [ this.options = const [AddressTextFieldOption.qrCode, AddressTextFieldOption.addressBook],
AddressTextFieldOption.qrCode,
AddressTextFieldOption.addressBook
],
this.onURIScanned, this.onURIScanned,
this.focusNode, this.focusNode,
this.isBorderExist = true, this.isBorderExist = true,
@ -133,8 +130,7 @@ class AddressTextField extends StatelessWidget {
), ),
)), )),
], ],
if (this.options.contains(AddressTextFieldOption.qrCode) && if (this.options.contains(AddressTextFieldOption.qrCode)) ...[
DeviceInfo.instance.isMobile) ...[
Container( Container(
width: prefixIconWidth, width: prefixIconWidth,
height: prefixIconHeight, height: prefixIconHeight,
@ -194,7 +190,7 @@ class AddressTextField extends StatelessWidget {
Future<void> _presentQRScanner(BuildContext context) async { Future<void> _presentQRScanner(BuildContext context) async {
bool isCameraPermissionGranted = bool isCameraPermissionGranted =
await PermissionHandler.checkPermission(Permission.camera, context); await PermissionHandler.checkPermission(Permission.camera, context);
if (!isCameraPermissionGranted) return; if (!isCameraPermissionGranted) return;
final code = await presentQRScanner(); final code = await presentQRScanner();
if (code.isEmpty) { if (code.isEmpty) {

View file

@ -2,6 +2,7 @@ import 'package:cake_wallet/entities/receive_page_option.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
part 'receive_option_view_model.g.dart'; part 'receive_option_view_model.g.dart';
@ -9,26 +10,38 @@ class ReceiveOptionViewModel = ReceiveOptionViewModelBase with _$ReceiveOptionVi
abstract class ReceiveOptionViewModelBase with Store { abstract class ReceiveOptionViewModelBase with Store {
ReceiveOptionViewModelBase(this._wallet, this.initialPageOption) ReceiveOptionViewModelBase(this._wallet, this.initialPageOption)
: selectedReceiveOption = initialPageOption ?? ReceivePageOption.mainnet, : selectedReceiveOption = initialPageOption ??
(_wallet.type == WalletType.bitcoin
? _wallet.walletAddresses.addressPageType
: ReceivePageOption.mainnet),
_options = [] { _options = [] {
final walletType = _wallet.type; final walletType = _wallet.type;
_options = _options = walletType == WalletType.haven
walletType == WalletType.haven ? [ReceivePageOption.mainnet] : ReceivePageOption.values; ? [ReceivePageOption.mainnet]
: walletType == WalletType.bitcoin
? [
bitcoin.AddressType.p2pkh,
bitcoin.AddressType.p2wpkh,
bitcoin.AddressType.p2tr,
bitcoin.AddressType.p2sp,
...ReceivePageOption.values.where((element) => element != ReceivePageOption.mainnet)
]
: ReceivePageOption.values;
} }
final WalletBase _wallet; final WalletBase _wallet;
final ReceivePageOption? initialPageOption; final dynamic initialPageOption;
List<ReceivePageOption> _options; List<dynamic> _options;
@observable @observable
ReceivePageOption selectedReceiveOption; dynamic selectedReceiveOption;
List<ReceivePageOption> get options => _options; List<dynamic> get options => _options;
@action @action
void selectReceiveOption(ReceivePageOption option) { void selectReceiveOption(dynamic option) {
selectedReceiveOption = option; selectedReceiveOption = option;
} }
} }

View file

@ -15,6 +15,7 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/haven/haven.dart'; import 'package:cake_wallet/haven/haven.dart';
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as btc;
part 'wallet_address_list_view_model.g.dart'; part 'wallet_address_list_view_model.g.dart';
@ -145,9 +146,6 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
}) : _baseItems = <ListItem>[], }) : _baseItems = <ListItem>[],
selectedCurrency = walletTypeToCryptoCurrency(appStore.wallet!.type), selectedCurrency = walletTypeToCryptoCurrency(appStore.wallet!.type),
_cryptoNumberFormat = NumberFormat(_cryptoNumberPattern), _cryptoNumberFormat = NumberFormat(_cryptoNumberPattern),
hasAccounts = appStore.wallet!.type == WalletType.bitcoin ||
appStore.wallet!.type == WalletType.monero ||
appStore.wallet!.type == WalletType.haven,
amount = '', amount = '',
super(appStore: appStore) { super(appStore: appStore) {
_init(); _init();
@ -158,9 +156,8 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
_init(); _init();
selectedCurrency = walletTypeToCryptoCurrency(wallet.type); selectedCurrency = walletTypeToCryptoCurrency(wallet.type);
hasAccounts = wallet.type == WalletType.bitcoin || _hasAccounts =
wallet.type == WalletType.monero || hasSilentAddresses || wallet.type == WalletType.monero || wallet.type == WalletType.haven;
wallet.type == WalletType.haven;
} }
static const String _cryptoNumberPattern = '0.00000000'; static const String _cryptoNumberPattern = '0.00000000';
@ -283,7 +280,10 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
} }
@observable @observable
bool hasAccounts; bool _hasAccounts = false;
@computed
bool get hasAccounts => _hasAccounts;
@computed @computed
String get accountLabel { String get accountLabel {
@ -298,12 +298,19 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
return ''; return '';
} }
@observable
// ignore: prefer_final_fields
bool? _hasSilentAddresses = null;
@computed @computed
bool get hasSilentAddresses => wallet.type == WalletType.bitcoin; bool get hasSilentAddresses =>
_hasSilentAddresses ??
wallet.type == WalletType.bitcoin &&
wallet.walletAddresses.addressPageType == btc.AddressType.p2sp;
@computed @computed
bool get hasAddressList => bool get hasAddressList =>
wallet.type == WalletType.bitcoin || hasSilentAddresses ||
wallet.type == WalletType.monero || wallet.type == WalletType.monero ||
wallet.type == wallet.type ==
WalletType WalletType
@ -313,7 +320,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
@computed @computed
bool get showElectrumAddressDisclaimer => bool get showElectrumAddressDisclaimer =>
wallet.type == WalletType.bitcoin || (wallet.type == WalletType.bitcoin && !hasSilentAddresses) ||
wallet.type == WalletType.litecoin || wallet.type == WalletType.litecoin ||
wallet.type == WalletType.bitcoinCash; wallet.type == WalletType.bitcoinCash;
@ -325,6 +332,12 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
void setAddress(WalletAddressListItem address) => void setAddress(WalletAddressListItem address) =>
wallet.walletAddresses.address = address.address; wallet.walletAddresses.address = address.address;
@action
Future<void> setAddressType(dynamic option) async {
await wallet.walletAddresses.setAddressType(option);
_hasSilentAddresses = option == btc.AddressType.p2sp;
}
void _init() { void _init() {
_baseItems = []; _baseItems = [];

View file

@ -734,11 +734,10 @@
"camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ", "camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ",
"switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ", "switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ",
"use_testnet": "استخدم testnet", "use_testnet": "استخدم testnet",
"address_and_silent_addresses": "العنوان والعناوين الصامتة",
"silent_addresses": "عناوين صامتة",
"Block_remaining": "كتلة ${status} المتبقية", "Block_remaining": "كتلة ${status} المتبقية",
"seed_phrase_length": " ﺭﻭﺬﺒﻟﺍ ﺓﺭﺎﺒﻌﻟﺍ ﻝﻮﻃ", "seed_phrase_length": " ﺭﻭﺬﺒﻟﺍ ﺓﺭﺎﺒﻌﻟﺍ ﻝﻮﻃ",
"unavailable_balance": " ﺮﻓﻮﺘﻣ ﺮﻴﻏ ﺪﻴﺻﺭ", "unavailable_balance": " ﺮﻓﻮﺘﻣ ﺮﻴﻏ ﺪﻴﺻﺭ",
"unavailable_balance_description": ".ﺎﻫﺪﻴﻤﺠﺗ ءﺎﻐﻟﺇ ﺭﺮﻘﺗ ﻰﺘﺣ ﺕﻼﻣﺎﻌﻤﻠﻟ ﻝﻮﺻﻮﻠﻟ ﺔﻠﺑﺎﻗ ﺮﻴﻏ ﺓﺪﻤﺠﻤﻟﺍ ﺓﺪﺻﺭﻷﺍ ﻞﻈﺗ ﺎﻤﻨﻴﺑ ،ﺎﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺕﻼﻣﺎﻌﻤﻟﺍ ﻝﺎﻤﺘﻛﺍ ﺩﺮﺠﻤﺑ ﺔﺣﺎﺘﻣ ﺔﻠﻔﻘﻤﻟﺍ ﺓﺪﺻﺭﻷﺍ ﺢﺒﺼﺘﺳ .ﻚﺑ ﺔﺻﺎﺨﻟﺍ ﺕﻼﻤﻌﻟﺍ ﻲﻓ ﻢﻜﺤﺘﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻲﻓ ﻂﺸﻧ ﻞﻜﺸﺑ ﺎﻫﺪﻴﻤﺠﺘﺑ ﺖﻤﻗ", "unavailable_balance_description": ".ﺎﻫﺪﻴﻤﺠﺗ ءﺎﻐﻟﺇ ﺭﺮﻘﺗ ﻰﺘﺣ ﺕﻼﻣﺎﻌﻤﻠﻟ ﻝﻮﺻﻮﻠﻟ ﺔﻠﺑﺎﻗ ﺮﻴﻏ ﺓﺪﻤﺠﻤﻟﺍ ﺓﺪﺻﺭﻷﺍ ﻞﻈﺗ ﺎﻤﻨﻴﺑ ،ﺎﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺕﻼﻣﺎﻌﻤﻟﺍ ﻝﺎﻤﺘﻛﺍ ﺩﺮﺠﻤﺑ ﺔﺣﺎﺘﻣ ﺔﻠﻔﻘﻤﻟﺍ ﺓﺪﺻﺭﻷﺍ ﺢﺒﺼﺘﺳ .ﻚﺑ ﺔﺻﺎﺨﻟﺍ ﺕﻼﻤﻌﻟﺍ ﻲﻓ ﻢﻜﺤﺘﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻲﻓ ﻂﺸﻧ ﻞﻜﺸﺑ ﺎﻫﺪﻴﻤﺠﺘﺑ ﺖﻤﻗ",
"unspent_change": "يتغير" "unspent_change": "يتغير",
} "labeled_silent_addresses": "العناوين الصامتة المسمى"
}

View file

@ -730,11 +730,10 @@
"camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.", "camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.",
"switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново", "switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново",
"use_testnet": "Използвайте TestNet", "use_testnet": "Използвайте TestNet",
"address_and_silent_addresses": "Адрес и мълчаливи адреси",
"silent_addresses": "Безшумни адреси",
"Block_remaining": "${status} останал блок", "Block_remaining": "${status} останал блок",
"seed_phrase_length": "Дължина на началната фраза", "seed_phrase_length": "Дължина на началната фраза",
"unavailable_balance": "Неналично салдо", "unavailable_balance": "Неналично салдо",
"unavailable_balance_description": "Неналично салдо: Тази обща сума включва средства, които са заключени в чакащи транзакции и тези, които сте замразили активно в настройките за контрол на монетите. Заключените баланси ще станат достъпни, след като съответните им транзакции бъдат завършени, докато замразените баланси остават недостъпни за транзакции, докато не решите да ги размразите.", "unavailable_balance_description": "Неналично салдо: Тази обща сума включва средства, които са заключени в чакащи транзакции и тези, които сте замразили активно в настройките за контрол на монетите. Заключените баланси ще станат достъпни, след като съответните им транзакции бъдат завършени, докато замразените баланси остават недостъпни за транзакции, докато не решите да ги размразите.",
"unspent_change": "Промяна" "unspent_change": "Промяна",
} "labeled_silent_addresses": "Етикетирани безшумни адреси"
}

View file

@ -730,11 +730,10 @@
"camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.", "camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.",
"switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu", "switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu",
"use_testnet": "Použijte testNet", "use_testnet": "Použijte testNet",
"address_and_silent_addresses": "Adresa a tiché adresy",
"silent_addresses": "Tiché adresy",
"Block_remaining": "${status} Blok zbývající", "Block_remaining": "${status} Blok zbývající",
"seed_phrase_length": "Délka fráze semene", "seed_phrase_length": "Délka fráze semene",
"unavailable_balance": "Nedostupný zůstatek", "unavailable_balance": "Nedostupný zůstatek",
"unavailable_balance_description": "Nedostupný zůstatek: Tento součet zahrnuje prostředky, které jsou uzamčeny v nevyřízených transakcích a ty, které jste aktivně zmrazili v nastavení kontroly mincí. Uzamčené zůstatky budou k dispozici po dokončení příslušných transakcí, zatímco zmrazené zůstatky zůstanou pro transakce nepřístupné, dokud se nerozhodnete je uvolnit.", "unavailable_balance_description": "Nedostupný zůstatek: Tento součet zahrnuje prostředky, které jsou uzamčeny v nevyřízených transakcích a ty, které jste aktivně zmrazili v nastavení kontroly mincí. Uzamčené zůstatky budou k dispozici po dokončení příslušných transakcí, zatímco zmrazené zůstatky zůstanou pro transakce nepřístupné, dokud se nerozhodnete je uvolnit.",
"unspent_change": "Změna" "unspent_change": "Změna",
} "labeled_silent_addresses": "Označené tiché adresy"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.", "camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.",
"switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut", "switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut",
"use_testnet": "TESTNET verwenden", "use_testnet": "TESTNET verwenden",
"address_and_silent_addresses": "Adresse und stille Adressen",
"silent_addresses": "Stille Adressen",
"Block_remaining": "${status} Block verbleibend", "Block_remaining": "${status} Block verbleibend",
"seed_phrase_length": "Länge der Seed-Phrase", "seed_phrase_length": "Länge der Seed-Phrase",
"unavailable_balance": "Nicht verfügbares Guthaben", "unavailable_balance": "Nicht verfügbares Guthaben",
"unavailable_balance_description": "Nicht verfügbares Guthaben: Diese Summe umfasst Gelder, die in ausstehenden Transaktionen gesperrt sind, und solche, die Sie in Ihren Münzkontrolleinstellungen aktiv eingefroren haben. Gesperrte Guthaben werden verfügbar, sobald die entsprechenden Transaktionen abgeschlossen sind, während eingefrorene Guthaben für Transaktionen nicht zugänglich bleiben, bis Sie sich dazu entschließen, sie wieder freizugeben.", "unavailable_balance_description": "Nicht verfügbares Guthaben: Diese Summe umfasst Gelder, die in ausstehenden Transaktionen gesperrt sind, und solche, die Sie in Ihren Münzkontrolleinstellungen aktiv eingefroren haben. Gesperrte Guthaben werden verfügbar, sobald die entsprechenden Transaktionen abgeschlossen sind, während eingefrorene Guthaben für Transaktionen nicht zugänglich bleiben, bis Sie sich dazu entschließen, sie wieder freizugeben.",
"unspent_change": "Wechselgeld" "unspent_change": "Wechselgeld",
} "labeled_silent_addresses": "Bezeichnete stille Adressen"
}

View file

@ -740,10 +740,9 @@
"camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.", "camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.",
"switchToETHWallet": "Please switch to an Ethereum wallet and try again", "switchToETHWallet": "Please switch to an Ethereum wallet and try again",
"use_testnet": "Use testnet", "use_testnet": "Use testnet",
"address_and_silent_addresses": "Address and Silent Addresses",
"silent_addresses": "Silent Addresses",
"seed_phrase_length": "Seed phrase length", "seed_phrase_length": "Seed phrase length",
"unavailable_balance": "Unavailable balance", "unavailable_balance": "Unavailable balance",
"unavailable_balance_description": "Unavailable Balance: This total includes funds that are locked in pending transactions and those you have actively frozen in your coin control settings. Locked balances will become available once their respective transactions are completed, while frozen balances remain inaccessible for transactions until you decide to unfreeze them.", "unavailable_balance_description": "Unavailable Balance: This total includes funds that are locked in pending transactions and those you have actively frozen in your coin control settings. Locked balances will become available once their respective transactions are completed, while frozen balances remain inaccessible for transactions until you decide to unfreeze them.",
"unspent_change": "Change" "unspent_change": "Change",
} "labeled_silent_addresses": "Labeled Silent Addresses"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítelo desde la configuración de la aplicación.", "camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítelo desde la configuración de la aplicación.",
"switchToETHWallet": "Cambie a una billetera Ethereum e inténtelo nuevamente.", "switchToETHWallet": "Cambie a una billetera Ethereum e inténtelo nuevamente.",
"use_testnet": "Use TestNet", "use_testnet": "Use TestNet",
"address_and_silent_addresses": "Dirección y direcciones silenciosas",
"silent_addresses": "Direcciones silenciosas",
"Block_remaining": "${status} bloque restante", "Block_remaining": "${status} bloque restante",
"seed_phrase_length": "Longitud de la frase inicial", "seed_phrase_length": "Longitud de la frase inicial",
"unavailable_balance": "Saldo no disponible", "unavailable_balance": "Saldo no disponible",
"unavailable_balance_description": "Saldo no disponible: este total incluye fondos que están bloqueados en transacciones pendientes y aquellos que usted ha congelado activamente en su configuración de control de monedas. Los saldos bloqueados estarán disponibles una vez que se completen sus respectivas transacciones, mientras que los saldos congelados permanecerán inaccesibles para las transacciones hasta que usted decida descongelarlos.", "unavailable_balance_description": "Saldo no disponible: este total incluye fondos que están bloqueados en transacciones pendientes y aquellos que usted ha congelado activamente en su configuración de control de monedas. Los saldos bloqueados estarán disponibles una vez que se completen sus respectivas transacciones, mientras que los saldos congelados permanecerán inaccesibles para las transacciones hasta que usted decida descongelarlos.",
"unspent_change": "Cambiar" "unspent_change": "Cambiar",
} "labeled_silent_addresses": "Direcciones silenciosas etiquetadas"
}

View file

@ -732,22 +732,16 @@
"enter_seed_phrase": "Entrez votre phrase secrète (seed)", "enter_seed_phrase": "Entrez votre phrase secrète (seed)",
"change_rep_successful": "Représentant changé avec succès", "change_rep_successful": "Représentant changé avec succès",
"add_contact": "Ajouter le contact", "add_contact": "Ajouter le contact",
"exchange_provider_unsupported": "${providerName} n'est plus pris en charge!",
"domain_looks_up": "Recherches de domaine",
"require_for_exchanges_to_external_wallets": "Exiger des échanges vers des portefeuilles externes",
"camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.",
"switchToETHWallet": "Veuillez passer à un portefeuille Ethereum et réessayer",
"use_testnet": "Utiliser TestNet",
"address_and_silent_addresses": "Adresse et adresses silencieuses",
"silent_addresses": "Adresses silencieuses",
"Block_remaining": "${status} bloc restant",
"exchange_provider_unsupported": "${providerName} n'est plus pris en charge !", "exchange_provider_unsupported": "${providerName} n'est plus pris en charge !",
"domain_looks_up": "Résolution de nom", "domain_looks_up": "Résolution de nom",
"require_for_exchanges_to_external_wallets": "Exiger pour les échanges vers des portefeuilles externes", "require_for_exchanges_to_external_wallets": "Exiger pour les échanges vers des portefeuilles externes",
"camera_permission_is_required": "L'autorisation d'accès à la caméra est requise.\nVeuillez l'activer depuis les paramètres de l'application.",
"switchToETHWallet": "Veuillez passer à un portefeuille (wallet) Ethereum et réessayer",
"use_testnet": "Utiliser TestNet",
"Block_remaining": "${status} bloc restant",
"seed_phrase_length": "Longueur de la phrase de départ", "seed_phrase_length": "Longueur de la phrase de départ",
"unavailable_balance": "Solde indisponible", "unavailable_balance": "Solde indisponible",
"unavailable_balance_description": "Solde indisponible : ce total comprend les fonds bloqués dans les transactions en attente et ceux que vous avez activement gelés dans vos paramètres de contrôle des pièces. Les soldes bloqués deviendront disponibles une fois leurs transactions respectives terminées, tandis que les soldes gelés resteront inaccessibles aux transactions jusqu'à ce que vous décidiez de les débloquer.", "unavailable_balance_description": "Solde indisponible : ce total comprend les fonds bloqués dans les transactions en attente et ceux que vous avez activement gelés dans vos paramètres de contrôle des pièces. Les soldes bloqués deviendront disponibles une fois leurs transactions respectives terminées, tandis que les soldes gelés resteront inaccessibles aux transactions jusqu'à ce que vous décidiez de les débloquer.",
"camera_permission_is_required": "L'autorisation d'accès à la caméra est requise.\nVeuillez l'activer depuis les paramètres de l'application.", "unspent_change": "Changement",
"switchToETHWallet": "Veuillez passer à un portefeuille (wallet) Ethereum et réessayer", "labeled_silent_addresses": "Adresses silencieuses étiquetées"
"unspent_change": "Changement" }
}

View file

@ -716,11 +716,10 @@
"camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.", "camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.",
"switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa", "switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa",
"use_testnet": "Amfani da gwaji", "use_testnet": "Amfani da gwaji",
"address_and_silent_addresses": "Adireshin da adreshin shiru",
"silent_addresses": "Adireshin Shiru",
"Block_remaining": "${status} toshe ragowar", "Block_remaining": "${status} toshe ragowar",
"seed_phrase_length": "Tsawon jimlar iri", "seed_phrase_length": "Tsawon jimlar iri",
"unavailable_balance": "Ma'aunin da ba ya samuwa", "unavailable_balance": "Ma'aunin da ba ya samuwa",
"unavailable_balance_description": "Ma'auni Babu: Wannan jimlar ya haɗa da kuɗi waɗanda ke kulle a cikin ma'amaloli da ke jiran aiki da waɗanda kuka daskare sosai a cikin saitunan sarrafa kuɗin ku. Ma'auni da aka kulle za su kasance da zarar an kammala ma'amalolinsu, yayin da daskararrun ma'auni ba za su iya samun damar yin ciniki ba har sai kun yanke shawarar cire su.", "unavailable_balance_description": "Ma'auni Babu: Wannan jimlar ya haɗa da kuɗi waɗanda ke kulle a cikin ma'amaloli da ke jiran aiki da waɗanda kuka daskare sosai a cikin saitunan sarrafa kuɗin ku. Ma'auni da aka kulle za su kasance da zarar an kammala ma'amalolinsu, yayin da daskararrun ma'auni ba za su iya samun damar yin ciniki ba har sai kun yanke shawarar cire su.",
"unspent_change": "Canza" "unspent_change": "Canza",
} "labeled_silent_addresses": "Mai labarar adireshin shiru"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।", "camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।",
"switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें", "switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें",
"use_testnet": "टेस्टनेट का उपयोग करें", "use_testnet": "टेस्टनेट का उपयोग करें",
"address_and_silent_addresses": "पता और मूक पते",
"silent_addresses": "मूक पते",
"Block_remaining": "${status} शेष ब्लॉक", "Block_remaining": "${status} शेष ब्लॉक",
"seed_phrase_length": "बीज वाक्यांश की लंबाई", "seed_phrase_length": "बीज वाक्यांश की लंबाई",
"unavailable_balance": "अनुपलब्ध शेष", "unavailable_balance": "अनुपलब्ध शेष",
"unavailable_balance_description": "अनुपलब्ध शेष राशि: इस कुल में वे धनराशि शामिल हैं जो लंबित लेनदेन में बंद हैं और जिन्हें आपने अपनी सिक्का नियंत्रण सेटिंग्स में सक्रिय रूप से जमा कर रखा है। लॉक किए गए शेष उनके संबंधित लेन-देन पूरे होने के बाद उपलब्ध हो जाएंगे, जबकि जमे हुए शेष लेन-देन के लिए अप्राप्य रहेंगे जब तक कि आप उन्हें अनफ्रीज करने का निर्णय नहीं लेते।", "unavailable_balance_description": "अनुपलब्ध शेष राशि: इस कुल में वे धनराशि शामिल हैं जो लंबित लेनदेन में बंद हैं और जिन्हें आपने अपनी सिक्का नियंत्रण सेटिंग्स में सक्रिय रूप से जमा कर रखा है। लॉक किए गए शेष उनके संबंधित लेन-देन पूरे होने के बाद उपलब्ध हो जाएंगे, जबकि जमे हुए शेष लेन-देन के लिए अप्राप्य रहेंगे जब तक कि आप उन्हें अनफ्रीज करने का निर्णय नहीं लेते।",
"unspent_change": "परिवर्तन" "unspent_change": "परिवर्तन",
} "labeled_silent_addresses": "मूक पते लेबल"
}

View file

@ -736,11 +736,10 @@
"camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.", "camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.",
"switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno", "switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno",
"use_testnet": "Koristite TestNet", "use_testnet": "Koristite TestNet",
"address_and_silent_addresses": "Adresa i tihe adrese",
"silent_addresses": "Tihe adrese",
"Block_remaining": "${status} blok preostaje", "Block_remaining": "${status} blok preostaje",
"seed_phrase_length": "Duljina početne fraze", "seed_phrase_length": "Duljina početne fraze",
"unavailable_balance": "Nedostupno stanje", "unavailable_balance": "Nedostupno stanje",
"unavailable_balance_description": "Nedostupno stanje: Ovaj ukupni iznos uključuje sredstva koja su zaključana u transakcijama na čekanju i ona koja ste aktivno zamrznuli u postavkama kontrole novčića. Zaključani saldi postat će dostupni kada se dovrše njihove transakcije, dok zamrznuti saldi ostaju nedostupni za transakcije sve dok ih ne odlučite odmrznuti.", "unavailable_balance_description": "Nedostupno stanje: Ovaj ukupni iznos uključuje sredstva koja su zaključana u transakcijama na čekanju i ona koja ste aktivno zamrznuli u postavkama kontrole novčića. Zaključani saldi postat će dostupni kada se dovrše njihove transakcije, dok zamrznuti saldi ostaju nedostupni za transakcije sve dok ih ne odlučite odmrznuti.",
"unspent_change": "Promijeniti" "unspent_change": "Promijeniti",
} "labeled_silent_addresses": "Označene tihe adrese"
}

View file

@ -726,11 +726,10 @@
"camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.", "camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.",
"switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi", "switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi",
"use_testnet": "Gunakan TestNet", "use_testnet": "Gunakan TestNet",
"address_and_silent_addresses": "Alamat dan alamat diam",
"silent_addresses": "Alamat diam",
"Block_remaining": "${status} blok tersisa", "Block_remaining": "${status} blok tersisa",
"seed_phrase_length": "Panjang frase benih", "seed_phrase_length": "Panjang frase benih",
"unavailable_balance": "Saldo tidak tersedia", "unavailable_balance": "Saldo tidak tersedia",
"unavailable_balance_description": "Saldo Tidak Tersedia: Total ini termasuk dana yang terkunci dalam transaksi yang tertunda dan dana yang telah Anda bekukan secara aktif di pengaturan kontrol koin Anda. Saldo yang terkunci akan tersedia setelah transaksi masing-masing selesai, sedangkan saldo yang dibekukan tetap tidak dapat diakses untuk transaksi sampai Anda memutuskan untuk mencairkannya.", "unavailable_balance_description": "Saldo Tidak Tersedia: Total ini termasuk dana yang terkunci dalam transaksi yang tertunda dan dana yang telah Anda bekukan secara aktif di pengaturan kontrol koin Anda. Saldo yang terkunci akan tersedia setelah transaksi masing-masing selesai, sedangkan saldo yang dibekukan tetap tidak dapat diakses untuk transaksi sampai Anda memutuskan untuk mencairkannya.",
"unspent_change": "Mengubah" "unspent_change": "Mengubah",
} "labeled_silent_addresses": "Label alamat diam"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.", "camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.",
"switchToETHWallet": "Passa a un portafoglio Ethereum e riprova", "switchToETHWallet": "Passa a un portafoglio Ethereum e riprova",
"use_testnet": "Usa TestNet", "use_testnet": "Usa TestNet",
"address_and_silent_addresses": "Indirizzo e indirizzi silenziosi",
"silent_addresses": "Indirizzi silenziosi",
"Block_remaining": "${status} blocco rimanente", "Block_remaining": "${status} blocco rimanente",
"seed_phrase_length": "Lunghezza della frase seed", "seed_phrase_length": "Lunghezza della frase seed",
"unavailable_balance": "Saldo non disponibile", "unavailable_balance": "Saldo non disponibile",
"unavailable_balance_description": "Saldo non disponibile: questo totale include i fondi bloccati nelle transazioni in sospeso e quelli che hai congelato attivamente nelle impostazioni di controllo delle monete. I saldi bloccati diventeranno disponibili una volta completate le rispettive transazioni, mentre i saldi congelati rimarranno inaccessibili per le transazioni finché non deciderai di sbloccarli.", "unavailable_balance_description": "Saldo non disponibile: questo totale include i fondi bloccati nelle transazioni in sospeso e quelli che hai congelato attivamente nelle impostazioni di controllo delle monete. I saldi bloccati diventeranno disponibili una volta completate le rispettive transazioni, mentre i saldi congelati rimarranno inaccessibili per le transazioni finché non deciderai di sbloccarli.",
"unspent_change": "Modifica" "unspent_change": "Modifica",
} "labeled_silent_addresses": "Indirizzi silenziosi etichettati"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。", "camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。",
"switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください", "switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください",
"use_testnet": "TestNetを使用します", "use_testnet": "TestNetを使用します",
"address_and_silent_addresses": "住所とサイレントアドレス",
"silent_addresses": "サイレントアドレス",
"Block_remaining": "${status}ブロックの残り", "Block_remaining": "${status}ブロックの残り",
"seed_phrase_length": "シードフレーズの長さ", "seed_phrase_length": "シードフレーズの長さ",
"unavailable_balance": "利用できない残高", "unavailable_balance": "利用できない残高",
"unavailable_balance_description": "利用不可能な残高: この合計には、保留中のトランザクションにロックされている資金と、コイン管理設定でアクティブに凍結した資金が含まれます。ロックされた残高は、それぞれの取引が完了すると利用可能になりますが、凍結された残高は、凍結を解除するまで取引にアクセスできません。", "unavailable_balance_description": "利用不可能な残高: この合計には、保留中のトランザクションにロックされている資金と、コイン管理設定でアクティブに凍結した資金が含まれます。ロックされた残高は、それぞれの取引が完了すると利用可能になりますが、凍結された残高は、凍結を解除するまで取引にアクセスできません。",
"unspent_change": "変化" "unspent_change": "変化",
} "labeled_silent_addresses": "サイレントアドレスとラベル付けされています"
}

View file

@ -736,11 +736,10 @@
"camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.", "camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.",
"switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요.", "switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요.",
"use_testnet": "TestNet을 사용하십시오", "use_testnet": "TestNet을 사용하십시오",
"address_and_silent_addresses": "주소 및 조용한 주소",
"silent_addresses": "조용한 주소",
"Block_remaining": "${status} 나머지 블록", "Block_remaining": "${status} 나머지 블록",
"seed_phrase_length": "시드 문구 길이", "seed_phrase_length": "시드 문구 길이",
"unavailable_balance": "사용할 수 없는 잔액", "unavailable_balance": "사용할 수 없는 잔액",
"unavailable_balance_description": "사용할 수 없는 잔액: 이 총계에는 보류 중인 거래에 잠겨 있는 자금과 코인 관리 설정에서 적극적으로 동결된 자금이 포함됩니다. 잠긴 잔액은 해당 거래가 완료되면 사용할 수 있게 되며, 동결된 잔액은 동결을 해제하기 전까지 거래에 액세스할 수 없습니다.", "unavailable_balance_description": "사용할 수 없는 잔액: 이 총계에는 보류 중인 거래에 잠겨 있는 자금과 코인 관리 설정에서 적극적으로 동결된 자금이 포함됩니다. 잠긴 잔액은 해당 거래가 완료되면 사용할 수 있게 되며, 동결된 잔액은 동결을 해제하기 전까지 거래에 액세스할 수 없습니다.",
"unspent_change": "변화" "unspent_change": "변화",
} "labeled_silent_addresses": "라벨링 된 무음 주소"
}

View file

@ -736,11 +736,10 @@
"camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။", "camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။",
"switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။", "switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။",
"use_testnet": "testnet ကိုသုံးပါ", "use_testnet": "testnet ကိုသုံးပါ",
"address_and_silent_addresses": "လိပ်စာနှင့်အသံတိတ်လိပ်စာများ",
"silent_addresses": "အသံတိတ်လိပ်စာများ",
"Block_remaining": "ကျန်ရှိသော ${status}", "Block_remaining": "ကျန်ရှိသော ${status}",
"seed_phrase_length": "မျိုးစေ့စာပိုဒ်တိုအရှည်", "seed_phrase_length": "မျိုးစေ့စာပိုဒ်တိုအရှည်",
"unavailable_balance": "လက်ကျန်ငွေ မရရှိနိုင်ပါ။", "unavailable_balance": "လက်ကျန်ငွေ မရရှိနိုင်ပါ။",
"unavailable_balance_description": "မရရှိနိုင်သော လက်ကျန်ငွေ- ဤစုစုပေါင်းတွင် ဆိုင်းငံ့ထားသော ငွေပေးငွေယူများတွင် သော့ခတ်ထားသော ငွေကြေးများနှင့် သင်၏ coin ထိန်းချုပ်မှုဆက်တင်များတွင် သင် တက်ကြွစွာ အေးခဲထားသော ငွေများ ပါဝင်သည်။ သော့ခတ်ထားသော လက်ကျန်ငွေများကို ၎င်းတို့၏ သက်ဆိုင်ရာ ငွေပေးငွေယူများ ပြီးမြောက်သည်နှင့် တပြိုင်နက် ရရှိနိုင်မည်ဖြစ်ပြီး၊ အေးခဲထားသော လက်ကျန်များကို ၎င်းတို့အား ပြန်ဖြုတ်ရန် သင်ဆုံးဖြတ်သည်အထိ ငွေပေးငွေယူများအတွက် ဆက်လက်၍မရနိုင်ပါ။", "unavailable_balance_description": "မရရှိနိုင်သော လက်ကျန်ငွေ- ဤစုစုပေါင်းတွင် ဆိုင်းငံ့ထားသော ငွေပေးငွေယူများတွင် သော့ခတ်ထားသော ငွေကြေးများနှင့် သင်၏ coin ထိန်းချုပ်မှုဆက်တင်များတွင် သင် တက်ကြွစွာ အေးခဲထားသော ငွေများ ပါဝင်သည်။ သော့ခတ်ထားသော လက်ကျန်ငွေများကို ၎င်းတို့၏ သက်ဆိုင်ရာ ငွေပေးငွေယူများ ပြီးမြောက်သည်နှင့် တပြိုင်နက် ရရှိနိုင်မည်ဖြစ်ပြီး၊ အေးခဲထားသော လက်ကျန်များကို ၎င်းတို့အား ပြန်ဖြုတ်ရန် သင်ဆုံးဖြတ်သည်အထိ ငွေပေးငွေယူများအတွက် ဆက်လက်၍မရနိုင်ပါ။",
"unspent_change": "ပေြာင်းလဲခြင်း" "unspent_change": "ပေြာင်းလဲခြင်း",
} "labeled_silent_addresses": "အသံတိတ်အသံတိတ်လိပ်စာများတံဆိပ်ကပ်"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.", "camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.",
"switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw", "switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw",
"use_testnet": "Gebruik testnet", "use_testnet": "Gebruik testnet",
"address_and_silent_addresses": "Adres en stille adressen",
"silent_addresses": "Stille adressen",
"Block_remaining": "${status} blok resterend", "Block_remaining": "${status} blok resterend",
"seed_phrase_length": "Lengte van de zaadzin", "seed_phrase_length": "Lengte van de zaadzin",
"unavailable_balance": "Onbeschikbaar saldo", "unavailable_balance": "Onbeschikbaar saldo",
"unavailable_balance_description": "Niet-beschikbaar saldo: Dit totaal omvat het geld dat is vergrendeld in lopende transacties en het geld dat u actief hebt bevroren in uw muntcontrole-instellingen. Vergrendelde saldi komen beschikbaar zodra de betreffende transacties zijn voltooid, terwijl bevroren saldi ontoegankelijk blijven voor transacties totdat u besluit ze weer vrij te geven.", "unavailable_balance_description": "Niet-beschikbaar saldo: Dit totaal omvat het geld dat is vergrendeld in lopende transacties en het geld dat u actief hebt bevroren in uw muntcontrole-instellingen. Vergrendelde saldi komen beschikbaar zodra de betreffende transacties zijn voltooid, terwijl bevroren saldi ontoegankelijk blijven voor transacties totdat u besluit ze weer vrij te geven.",
"unspent_change": "Wijziging" "unspent_change": "Wijziging",
} "labeled_silent_addresses": "Gelabelde stille adressen"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.", "camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.",
"switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie", "switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie",
"use_testnet": "Użyj testne", "use_testnet": "Użyj testne",
"address_and_silent_addresses": "Adres i ciche adresy",
"silent_addresses": "Ciche adresy",
"Block_remaining": "${status} Block pozostały", "Block_remaining": "${status} Block pozostały",
"seed_phrase_length": "Długość frazy początkowej", "seed_phrase_length": "Długość frazy początkowej",
"unavailable_balance": "Niedostępne saldo", "unavailable_balance": "Niedostępne saldo",
"unavailable_balance_description": "Niedostępne saldo: Suma ta obejmuje środki zablokowane w transakcjach oczekujących oraz te, które aktywnie zamroziłeś w ustawieniach kontroli monet. Zablokowane salda staną się dostępne po zakończeniu odpowiednich transakcji, natomiast zamrożone salda pozostaną niedostępne dla transakcji, dopóki nie zdecydujesz się ich odblokować.", "unavailable_balance_description": "Niedostępne saldo: Suma ta obejmuje środki zablokowane w transakcjach oczekujących oraz te, które aktywnie zamroziłeś w ustawieniach kontroli monet. Zablokowane salda staną się dostępne po zakończeniu odpowiednich transakcji, natomiast zamrożone salda pozostaną niedostępne dla transakcji, dopóki nie zdecydujesz się ich odblokować.",
"unspent_change": "Zmiana" "unspent_change": "Zmiana",
} "labeled_silent_addresses": "Oznaczone ciche adresy"
}

View file

@ -737,11 +737,10 @@
"camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.", "camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.",
"switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente", "switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente",
"use_testnet": "Use testNet", "use_testnet": "Use testNet",
"address_and_silent_addresses": "Endereço e endereços silenciosos",
"silent_addresses": "Endereços silenciosos",
"Block_remaining": "${status} bloco restante", "Block_remaining": "${status} bloco restante",
"seed_phrase_length": "Comprimento da frase-semente", "seed_phrase_length": "Comprimento da frase-semente",
"unavailable_balance": "Saldo indisponível", "unavailable_balance": "Saldo indisponível",
"unavailable_balance_description": "Saldo Indisponível: Este total inclui fundos bloqueados em transações pendentes e aqueles que você congelou ativamente nas configurações de controle de moedas. Os saldos bloqueados ficarão disponíveis assim que suas respectivas transações forem concluídas, enquanto os saldos congelados permanecerão inacessíveis para transações até que você decida descongelá-los.", "unavailable_balance_description": "Saldo Indisponível: Este total inclui fundos bloqueados em transações pendentes e aqueles que você congelou ativamente nas configurações de controle de moedas. Os saldos bloqueados ficarão disponíveis assim que suas respectivas transações forem concluídas, enquanto os saldos congelados permanecerão inacessíveis para transações até que você decida descongelá-los.",
"unspent_change": "Mudar" "unspent_change": "Mudar",
} "labeled_silent_addresses": "Endereços silenciosos rotulados"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.", "camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.",
"switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку.", "switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку.",
"use_testnet": "Используйте Testnet", "use_testnet": "Используйте Testnet",
"address_and_silent_addresses": "Адрес и молчаливые адреса",
"silent_addresses": "Молчаливые адреса",
"Block_remaining": "${status} оставшееся блок", "Block_remaining": "${status} оставшееся блок",
"seed_phrase_length": "Длина исходной фразы", "seed_phrase_length": "Длина исходной фразы",
"unavailable_balance": "Недоступный баланс", "unavailable_balance": "Недоступный баланс",
"unavailable_balance_description": "Недоступный баланс: в эту сумму входят средства, заблокированные в ожидающих транзакциях, и средства, которые вы активно заморозили в настройках управления монетами. Заблокированные балансы станут доступны после завершения соответствующих транзакций, а замороженные балансы останутся недоступными для транзакций, пока вы не решите их разморозить.", "unavailable_balance_description": "Недоступный баланс: в эту сумму входят средства, заблокированные в ожидающих транзакциях, и средства, которые вы активно заморозили в настройках управления монетами. Заблокированные балансы станут доступны после завершения соответствующих транзакций, а замороженные балансы останутся недоступными для транзакций, пока вы не решите их разморозить.",
"unspent_change": "Изменять" "unspent_change": "Изменять",
} "labeled_silent_addresses": "Помеченные тихий адреса"
}

View file

@ -736,11 +736,10 @@
"camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป", "camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป",
"switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง", "switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง",
"use_testnet": "ใช้ testnet", "use_testnet": "ใช้ testnet",
"address_and_silent_addresses": "ที่อยู่และที่อยู่เงียบ",
"silent_addresses": "ที่อยู่เงียบ",
"Block_remaining": "${status} เหลือบล็อกที่เหลืออยู่", "Block_remaining": "${status} เหลือบล็อกที่เหลืออยู่",
"seed_phrase_length": "ความยาววลีของเมล็ด", "seed_phrase_length": "ความยาววลีของเมล็ด",
"unavailable_balance": "ยอดคงเหลือไม่พร้อมใช้งาน", "unavailable_balance": "ยอดคงเหลือไม่พร้อมใช้งาน",
"unavailable_balance_description": "ยอดคงเหลือที่ไม่พร้อมใช้งาน: ยอดรวมนี้รวมถึงเงินทุนที่ถูกล็อคในการทำธุรกรรมที่รอดำเนินการและที่คุณได้แช่แข็งไว้ในการตั้งค่าการควบคุมเหรียญของคุณ ยอดคงเหลือที่ถูกล็อคจะพร้อมใช้งานเมื่อธุรกรรมที่เกี่ยวข้องเสร็จสมบูรณ์ ในขณะที่ยอดคงเหลือที่แช่แข็งจะไม่สามารถเข้าถึงได้สำหรับธุรกรรมจนกว่าคุณจะตัดสินใจยกเลิกการแช่แข็ง", "unavailable_balance_description": "ยอดคงเหลือที่ไม่พร้อมใช้งาน: ยอดรวมนี้รวมถึงเงินทุนที่ถูกล็อคในการทำธุรกรรมที่รอดำเนินการและที่คุณได้แช่แข็งไว้ในการตั้งค่าการควบคุมเหรียญของคุณ ยอดคงเหลือที่ถูกล็อคจะพร้อมใช้งานเมื่อธุรกรรมที่เกี่ยวข้องเสร็จสมบูรณ์ ในขณะที่ยอดคงเหลือที่แช่แข็งจะไม่สามารถเข้าถึงได้สำหรับธุรกรรมจนกว่าคุณจะตัดสินใจยกเลิกการแช่แข็ง",
"unspent_change": "เปลี่ยน" "unspent_change": "เปลี่ยน",
} "labeled_silent_addresses": "ที่อยู่เงียบที่มีป้ายกำกับ"
}

View file

@ -733,11 +733,10 @@
"camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.", "camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.",
"switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli", "switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli",
"use_testnet": "Gumamit ng testnet", "use_testnet": "Gumamit ng testnet",
"address_and_silent_addresses": "Address at tahimik na mga address",
"silent_addresses": "Tahimik na mga address",
"Block_remaining": "${status} I -block ang natitira", "Block_remaining": "${status} I -block ang natitira",
"seed_phrase_length": "Haba ng parirala ng binhi", "seed_phrase_length": "Haba ng parirala ng binhi",
"unavailable_balance": "Hindi available na balanse", "unavailable_balance": "Hindi available na balanse",
"unavailable_balance_description": "Hindi Available na Balanse: Kasama sa kabuuang ito ang mga pondong naka-lock sa mga nakabinbing transaksyon at ang mga aktibong na-freeze mo sa iyong mga setting ng kontrol ng coin. Magiging available ang mga naka-lock na balanse kapag nakumpleto na ang kani-kanilang mga transaksyon, habang ang mga nakapirming balanse ay nananatiling hindi naa-access para sa mga transaksyon hanggang sa magpasya kang i-unfreeze ang mga ito.", "unavailable_balance_description": "Hindi Available na Balanse: Kasama sa kabuuang ito ang mga pondong naka-lock sa mga nakabinbing transaksyon at ang mga aktibong na-freeze mo sa iyong mga setting ng kontrol ng coin. Magiging available ang mga naka-lock na balanse kapag nakumpleto na ang kani-kanilang mga transaksyon, habang ang mga nakapirming balanse ay nananatiling hindi naa-access para sa mga transaksyon hanggang sa magpasya kang i-unfreeze ang mga ito.",
"unspent_change": "Baguhin" "unspent_change": "Baguhin",
} "labeled_silent_addresses": "May label na tahimik na mga address"
}

View file

@ -736,11 +736,10 @@
"camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.", "camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.",
"switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin", "switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin",
"use_testnet": "TestNet kullanın", "use_testnet": "TestNet kullanın",
"address_and_silent_addresses": "Adres ve sessiz adresler",
"silent_addresses": "Sessiz adresler",
"Block_remaining": "${status} blok kalan blok", "Block_remaining": "${status} blok kalan blok",
"seed_phrase_length": "Çekirdek cümle uzunluğu", "seed_phrase_length": "Çekirdek cümle uzunluğu",
"unavailable_balance": "Kullanılamayan bakiye", "unavailable_balance": "Kullanılamayan bakiye",
"unavailable_balance_description": "Kullanılamayan Bakiye: Bu toplam, bekleyen işlemlerde kilitlenen fonları ve jeton kontrol ayarlarınızda aktif olarak dondurduğunuz fonları içerir. Kilitli bakiyeler, ilgili işlemleri tamamlandıktan sonra kullanılabilir hale gelir; dondurulmuş bakiyeler ise siz onları dondurmaya karar verene kadar işlemler için erişilemez durumda kalır.", "unavailable_balance_description": "Kullanılamayan Bakiye: Bu toplam, bekleyen işlemlerde kilitlenen fonları ve jeton kontrol ayarlarınızda aktif olarak dondurduğunuz fonları içerir. Kilitli bakiyeler, ilgili işlemleri tamamlandıktan sonra kullanılabilir hale gelir; dondurulmuş bakiyeler ise siz onları dondurmaya karar verene kadar işlemler için erişilemez durumda kalır.",
"unspent_change": "Değiştirmek" "unspent_change": "Değiştirmek",
} "labeled_silent_addresses": "Etiketli sessiz adresler"
}

View file

@ -738,11 +738,10 @@
"camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.", "camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.",
"switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу", "switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу",
"use_testnet": "Використовуйте тестову мережу", "use_testnet": "Використовуйте тестову мережу",
"address_and_silent_addresses": "Адреса та мовчазні адреси",
"silent_addresses": "Мовчазні адреси",
"Block_remaining": "${status} блок залишився", "Block_remaining": "${status} блок залишився",
"seed_phrase_length": "Довжина початкової фрази", "seed_phrase_length": "Довжина початкової фрази",
"unavailable_balance": "Недоступний баланс", "unavailable_balance": "Недоступний баланс",
"unavailable_balance_description": "Недоступний баланс: ця сума включає кошти, заблоковані в незавершених транзакціях, і ті, які ви активно заморозили в налаштуваннях контролю монет. Заблоковані баланси стануть доступними після завершення відповідних транзакцій, тоді як заморожені баланси залишаються недоступними для транзакцій, доки ви не вирішите їх розморозити.", "unavailable_balance_description": "Недоступний баланс: ця сума включає кошти, заблоковані в незавершених транзакціях, і ті, які ви активно заморозили в налаштуваннях контролю монет. Заблоковані баланси стануть доступними після завершення відповідних транзакцій, тоді як заморожені баланси залишаються недоступними для транзакцій, доки ви не вирішите їх розморозити.",
"unspent_change": "Зміна" "unspent_change": "Зміна",
} "labeled_silent_addresses": "Позначені мовчазними адресами"
}

View file

@ -730,11 +730,10 @@
"camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ", "camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ",
"switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ", "switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ",
"use_testnet": "ٹیسٹ نیٹ استعمال کریں", "use_testnet": "ٹیسٹ نیٹ استعمال کریں",
"address_and_silent_addresses": "پتہ اور خاموش پتے",
"silent_addresses": "خاموش پتے",
"Block_remaining": "${status} باقی بلاک", "Block_remaining": "${status} باقی بلاک",
"seed_phrase_length": " ﯽﺋﺎﺒﻤﻟ ﯽﮐ ﮯﻠﻤﺟ ﮯﮐ ﺞﯿﺑ", "seed_phrase_length": " ﯽﺋﺎﺒﻤﻟ ﯽﮐ ﮯﻠﻤﺟ ﮯﮐ ﺞﯿﺑ",
"unavailable_balance": " ﺲﻨﻠﯿﺑ ﺏﺎﯿﺘﺳﺩ ﺮﯿﻏ", "unavailable_balance": " ﺲﻨﻠﯿﺑ ﺏﺎﯿﺘﺳﺩ ﺮﯿﻏ",
"unavailable_balance_description": "۔ﮯﺗﺮﮐ ﮟﯿﮩﻧ ﮧﻠﺼﯿﻓ ﺎﮐ ﮯﻧﺮﮐ ﺪﻤﺠﻨﻣ ﻥﺍ ﮟﯿﮩﻧﺍ ﭖﺁ ﮧﮐ ﮏﺗ ﺐﺟ ﮟﯿﮨ ﮯﺘﮨﺭ ﯽﺋﺎﺳﺭ ﻞﺑﺎﻗﺎﻧ ﮏﺗ ﺖﻗﻭ ﺱﺍ ﮯﯿﻟ ﮯﮐ ﻦﯾﺩ ﻦﯿﻟ ﺲﻨﻠﯿﺑ ﺪﻤﺠﻨﻣ ﮧﮐ ﺐﺟ ،ﮯﮔ ﮟﯿﺋﺎﺟ ﻮﮨ ﺏﺎﯿﺘﺳﺩ ﺲﻨﻠﯿﺑ ﻞﻔﻘﻣ ﺪﻌﺑ ﮯﮐ ﮯﻧﻮﮨ ﻞﻤﮑﻣ ﻦﯾﺩ ﻦﯿﻟ ﮧﻘﻠﻌﺘﻣ ﮯﮐ ﻥﺍ ۔ﮯﮨ ﺎﮭﮐﺭ ﺮ", "unavailable_balance_description": "۔ﮯﺗﺮﮐ ﮟﯿﮩﻧ ﮧﻠﺼﯿﻓ ﺎﮐ ﮯﻧﺮﮐ ﺪﻤﺠﻨﻣ ﻥﺍ ﮟﯿﮩﻧﺍ ﭖﺁ ﮧﮐ ﮏﺗ ﺐﺟ ﮟﯿﮨ ﮯﺘﮨﺭ ﯽﺋﺎﺳﺭ ﻞﺑﺎﻗﺎﻧ ﮏﺗ ﺖﻗﻭ ﺱﺍ ﮯﯿﻟ ﮯﮐ ﻦﯾﺩ ﻦﯿﻟ ﺲﻨﻠﯿﺑ ﺪﻤﺠﻨﻣ ﮧﮐ ﺐﺟ ،ﮯﮔ ﮟﯿﺋﺎﺟ ﻮﮨ ﺏﺎﯿﺘﺳﺩ ﺲﻨﻠﯿﺑ ﻞﻔﻘﻣ ﺪﻌﺑ ﮯﮐ ﮯﻧﻮﮨ ﻞﻤﮑﻣ ﻦﯾﺩ ﻦﯿﻟ ﮧﻘﻠﻌﺘﻣ ﮯﮐ ﻥﺍ ۔ﮯﮨ ﺎﮭﮐﺭ ﺮ",
"unspent_change": "تبدیل کریں" "unspent_change": "تبدیل کریں",
} "labeled_silent_addresses": "خاموش پتے لیبل لگا"
}

View file

@ -732,11 +732,10 @@
"camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.", "camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.",
"switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi", "switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi",
"use_testnet": "Lo tele", "use_testnet": "Lo tele",
"address_and_silent_addresses": "Adirẹsi ati awọn adirẹsi ipalọlọ",
"silent_addresses": "Awọn adirẹsi ipalọlọ",
"Block_remaining": "${status} Bdund díẹ", "Block_remaining": "${status} Bdund díẹ",
"seed_phrase_length": "Gigun gbolohun irugbin", "seed_phrase_length": "Gigun gbolohun irugbin",
"unavailable_balance": "Iwontunwonsi ti ko si", "unavailable_balance": "Iwontunwonsi ti ko si",
"unavailable_balance_description": "Iwontunws.funfun ti ko si: Lapapọ yii pẹlu awọn owo ti o wa ni titiipa ni awọn iṣowo isunmọ ati awọn ti o ti didi ni itara ninu awọn eto iṣakoso owo rẹ. Awọn iwọntunwọnsi titiipa yoo wa ni kete ti awọn iṣowo oniwun wọn ba ti pari, lakoko ti awọn iwọntunwọnsi tio tutunini ko ni iraye si fun awọn iṣowo titi iwọ o fi pinnu lati mu wọn kuro.", "unavailable_balance_description": "Iwontunws.funfun ti ko si: Lapapọ yii pẹlu awọn owo ti o wa ni titiipa ni awọn iṣowo isunmọ ati awọn ti o ti didi ni itara ninu awọn eto iṣakoso owo rẹ. Awọn iwọntunwọnsi titiipa yoo wa ni kete ti awọn iṣowo oniwun wọn ba ti pari, lakoko ti awọn iwọntunwọnsi tio tutunini ko ni iraye si fun awọn iṣowo titi iwọ o fi pinnu lati mu wọn kuro.",
"unspent_change": "Yipada" "unspent_change": "Yipada",
} "labeled_silent_addresses": "Awọn adirẹsi ipalọlọ"
}

View file

@ -737,11 +737,10 @@
"camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。", "camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。",
"switchToETHWallet": "请切换到以太坊钱包并重试", "switchToETHWallet": "请切换到以太坊钱包并重试",
"use_testnet": "使用TestNet", "use_testnet": "使用TestNet",
"address_and_silent_addresses": "地址和无声地址",
"silent_addresses": "无声地址",
"Block_remaining": "${status}块剩余", "Block_remaining": "${status}块剩余",
"seed_phrase_length": "种子短语长度", "seed_phrase_length": "种子短语长度",
"unavailable_balance": "不可用余额", "unavailable_balance": "不可用余额",
"unavailable_balance_description": "不可用余额:此总额包括锁定在待处理交易中的资金以及您在硬币控制设置中主动冻结的资金。一旦各自的交易完成,锁定的余额将变得可用,而冻结的余额在您决定解冻之前仍然无法进行交易。", "unavailable_balance_description": "不可用余额:此总额包括锁定在待处理交易中的资金以及您在硬币控制设置中主动冻结的资金。一旦各自的交易完成,锁定的余额将变得可用,而冻结的余额在您决定解冻之前仍然无法进行交易。",
"unspent_change": "改变" "unspent_change": "改变",
} "labeled_silent_addresses": "标记为无声地址"
}