This commit is contained in:
Matthew Fosse 2024-08-27 12:10:25 -04:00
commit e8eedf7967
83 changed files with 1092 additions and 497 deletions

View file

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:math'; import 'dart:math';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:cryptography/cryptography.dart' as cryptography; import 'package:cryptography/cryptography.dart' as cryptography;
import 'package:cw_core/sec_random_native.dart'; import 'package:cw_core/sec_random_native.dart';
@ -59,11 +60,7 @@ void maskBytes(Uint8List bytes, int bits) {
} }
} }
String bufferToBin(Uint8List data) { String bufferToBin(Uint8List data) => data.map((e) => e.toRadixString(2).padLeft(8, '0')).join('');
final q1 = data.map((e) => e.toRadixString(2).padLeft(8, '0'));
final q2 = q1.join('');
return q2;
}
String encode(Uint8List data) { String encode(Uint8List data) {
final dataBitLen = data.length * 8; final dataBitLen = data.length * 8;
@ -112,17 +109,18 @@ Future<bool> checkIfMnemonicIsElectrum2(String mnemonic) async {
Future<String> getMnemonicHash(String mnemonic) async { Future<String> getMnemonicHash(String mnemonic) async {
final hmacSha512 = Hmac(sha512, utf8.encode('Seed version')); final hmacSha512 = Hmac(sha512, utf8.encode('Seed version'));
final digest = hmacSha512.convert(utf8.encode(normalizeText(mnemonic))); final digest = hmacSha512.convert(utf8.encode(normalizeText(mnemonic)));
final hx = digest.toString(); return digest.toString();
return hx;
} }
Future<Uint8List> mnemonicToSeedBytes(String mnemonic, {String prefix = segwit}) async { Future<Uint8List> mnemonicToSeedBytes(String mnemonic,
{String prefix = segwit, String passphrase = ''}) async {
final pbkdf2 = final pbkdf2 =
cryptography.Pbkdf2(macAlgorithm: cryptography.Hmac.sha512(), iterations: 2048, bits: 512); cryptography.Pbkdf2(macAlgorithm: cryptography.Hmac.sha512(), iterations: 2048, bits: 512);
final text = normalizeText(mnemonic); final text = normalizeText(mnemonic);
// pbkdf2.deriveKey(secretKey: secretKey, nonce: nonce) final passphraseBytes = utf8.encode(normalizeText(passphrase));
final key = await pbkdf2.deriveKey( final key = await pbkdf2.deriveKey(
secretKey: cryptography.SecretKey(text.codeUnits), nonce: 'electrum'.codeUnits); secretKey: cryptography.SecretKey(text.codeUnits),
nonce: [...'electrum'.codeUnits, ...passphraseBytes]);
final bytes = await key.extractBytes(); final bytes = await key.extractBytes();
return Uint8List.fromList(bytes); return Uint8List.fromList(bytes);
} }

View file

@ -7,5 +7,6 @@ class MnemonicBip39 {
static String generate({int strength = 128}) => bip39.generateMnemonic(strength: strength); static String generate({int strength = 128}) => bip39.generateMnemonic(strength: strength);
/// Create root seed from mnemonic /// Create root seed from mnemonic
static Uint8List toSeed(String mnemonic) => bip39.mnemonicToSeed(mnemonic); static Uint8List toSeed(String mnemonic, {String? passphrase}) =>
bip39.mnemonicToSeed(mnemonic, passphrase: passphrase ?? '');
} }

View file

@ -115,7 +115,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
break; break;
case DerivationType.electrum: case DerivationType.electrum:
default: default:
seedBytes = await mnemonicToSeedBytes(mnemonic); seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? "");
break; break;
} }
return BitcoinWallet( return BitcoinWallet(
@ -195,7 +195,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
if (mnemonic != null) { if (mnemonic != null) {
switch (walletInfo.derivationInfo!.derivationType) { switch (walletInfo.derivationInfo!.derivationType) {
case DerivationType.electrum: case DerivationType.electrum:
seedBytes = await mnemonicToSeedBytes(mnemonic); seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? "");
break; break;
case DerivationType.bip39: case DerivationType.bip39:
default: default:

View file

@ -3,16 +3,18 @@ import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
class BitcoinNewWalletCredentials extends WalletCredentials { class BitcoinNewWalletCredentials extends WalletCredentials {
BitcoinNewWalletCredentials( BitcoinNewWalletCredentials({
{required String name, required String name,
WalletInfo? walletInfo, WalletInfo? walletInfo,
String? password, String? password,
DerivationType? derivationType, DerivationType? derivationType,
String? derivationPath}) String? derivationPath,
: super( String? passphrase,
}) : super(
name: name, name: name,
walletInfo: walletInfo, walletInfo: walletInfo,
password: password, password: password,
passphrase: passphrase,
); );
} }

View file

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:bitcoin_base/bitcoin_base.dart';
import 'package:cw_bitcoin/bitcoin_mnemonic.dart'; import 'package:cw_bitcoin/bitcoin_mnemonic.dart';
import 'package:cw_bitcoin/bitcoin_mnemonics_bip39.dart';
import 'package:cw_bitcoin/mnemonic_is_incorrect_exception.dart'; import 'package:cw_bitcoin/mnemonic_is_incorrect_exception.dart';
import 'package:cw_bitcoin/bitcoin_wallet_creation_credentials.dart'; import 'package:cw_bitcoin/bitcoin_wallet_creation_credentials.dart';
import 'package:cw_core/encryption_file_utils.dart'; import 'package:cw_core/encryption_file_utils.dart';
@ -35,8 +36,21 @@ class BitcoinWalletService extends WalletService<
final network = isTestnet == true ? BitcoinNetwork.testnet : BitcoinNetwork.mainnet; final network = isTestnet == true ? BitcoinNetwork.testnet : BitcoinNetwork.mainnet;
credentials.walletInfo?.network = network.value; credentials.walletInfo?.network = network.value;
final String mnemonic;
switch ( credentials.walletInfo?.derivationInfo?.derivationType) {
case DerivationType.bip39:
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
mnemonic = await MnemonicBip39.generate(strength: strength);
break;
case DerivationType.electrum:
default:
mnemonic = await generateElectrumMnemonic();
break;
}
final wallet = await BitcoinWalletBase.create( final wallet = await BitcoinWalletBase.create(
mnemonic: await generateElectrumMnemonic(), mnemonic: mnemonic,
password: credentials.password!, password: credentials.password!,
passphrase: credentials.passphrase, passphrase: credentials.passphrase,
walletInfo: credentials.walletInfo!, walletInfo: credentials.walletInfo!,

View file

@ -109,5 +109,4 @@ Map<DerivationType, List<DerivationInfo>> electrum_derivations = {
], ],
}; };
String electrum_path = electrum_derivations[DerivationType.electrum]!.first.derivationPath!;
String electrum_path = electrum_derivations[DerivationType.electrum]!.first.derivationPath!;

View file

@ -4,6 +4,7 @@ import 'dart:io';
import 'dart:isolate'; import 'dart:isolate';
import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:bitcoin_base/bitcoin_base.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:cw_core/encryption_file_utils.dart'; import 'package:cw_core/encryption_file_utils.dart';
import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:blockchain_utils/blockchain_utils.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
@ -44,6 +45,7 @@ import 'package:mobx/mobx.dart';
import 'package:rxdart/subjects.dart'; import 'package:rxdart/subjects.dart';
import 'package:sp_scanner/sp_scanner.dart'; import 'package:sp_scanner/sp_scanner.dart';
import 'package:hex/hex.dart'; import 'package:hex/hex.dart';
import 'package:http/http.dart' as http;
part 'electrum_wallet.g.dart'; part 'electrum_wallet.g.dart';
@ -101,6 +103,8 @@ abstract class ElectrumWalletBase
); );
reaction((_) => syncStatus, _syncStatusReaction); reaction((_) => syncStatus, _syncStatusReaction);
sharedPrefs.complete(SharedPreferences.getInstance());
} }
static Bip32Slip10Secp256k1 getAccountHDWallet(CryptoCurrency? currency, BasedUtxoNetwork network, static Bip32Slip10Secp256k1 getAccountHDWallet(CryptoCurrency? currency, BasedUtxoNetwork network,
@ -143,6 +147,8 @@ abstract class ElectrumWalletBase
Bip32Slip10Secp256k1 get sideHd => accountHD.childKey(Bip32KeyIndex(1)); Bip32Slip10Secp256k1 get sideHd => accountHD.childKey(Bip32KeyIndex(1));
final EncryptionFileUtils encryptionFileUtils; final EncryptionFileUtils encryptionFileUtils;
@override
final String? passphrase; final String? passphrase;
@override @override
@ -202,6 +208,13 @@ abstract class ElectrumWalletBase
bool _isTryingToConnect = false; bool _isTryingToConnect = false;
Completer<SharedPreferences> sharedPrefs = Completer();
Future<bool> checkIfMempoolAPIIsEnabled() async {
bool isMempoolAPIEnabled = (await sharedPrefs.future).getBool("use_mempool_fee_api") ?? true;
return isMempoolAPIEnabled;
}
@action @action
Future<void> setSilentPaymentsScanning(bool active) async { Future<void> setSilentPaymentsScanning(bool active) async {
silentPaymentsScanningActive = active; silentPaymentsScanningActive = active;
@ -456,6 +469,20 @@ abstract class ElectrumWalletBase
@action @action
Future<void> updateFeeRates() async { Future<void> updateFeeRates() async {
if (await checkIfMempoolAPIIsEnabled()) {
try {
final response =
await http.get(Uri.parse("http://mempool.cakewallet.com:8999/api/v1/fees/recommended"));
final result = json.decode(response.body) as Map<String, num>;
final slowFee = result['economyFee']?.toInt() ?? 0;
final mediumFee = result['hourFee']?.toInt() ?? 0;
final fastFee = result['fastestFee']?.toInt() ?? 0;
_feeRates = [slowFee, mediumFee, fastFee];
return;
} catch (_) {}
}
final feeRates = await electrumClient.feeRates(network: network); final feeRates = await electrumClient.feeRates(network: network);
if (feeRates != [0, 0, 0]) { if (feeRates != [0, 0, 0]) {
_feeRates = feeRates; _feeRates = feeRates;
@ -2057,13 +2084,42 @@ abstract class ElectrumWalletBase
tx.inputAddresses!.isEmpty || tx.inputAddresses!.isEmpty ||
tx.outputAddresses == null || tx.outputAddresses == null ||
tx.outputAddresses!.isEmpty) { tx.outputAddresses!.isEmpty) {
tx = ElectrumTransactionInfo.fromElectrumBundle( List<String> inputAddresses = [];
bundle, List<String> outputAddresses = [];
walletInfo.type,
network, for (int i = 0; i < bundle.originalTransaction.inputs.length; i++) {
addresses: addressesSet, final input = bundle.originalTransaction.inputs[i];
height: tx.height, final inputTransaction = bundle.ins[i];
); final vout = input.txIndex;
final outTransaction = inputTransaction.outputs[vout];
final address = addressFromOutputScript(outTransaction.scriptPubKey, network);
if (address.isNotEmpty) inputAddresses.add(address);
}
for (int i = 0; i < bundle.originalTransaction.outputs.length; i++) {
final out = bundle.originalTransaction.outputs[i];
final address = addressFromOutputScript(out.scriptPubKey, network);
if (address.isNotEmpty) outputAddresses.add(address);
// Check if the script contains OP_RETURN
final script = out.scriptPubKey.script;
if (script.contains('OP_RETURN')) {
final index = script.indexOf('OP_RETURN');
if (index + 1 <= script.length) {
try {
final opReturnData = script[index + 1].toString();
final decodedString = utf8.decode(HEX.decode(opReturnData));
outputAddresses.add('OP_RETURN:$decodedString');
} catch (_) {
outputAddresses.add('OP_RETURN:');
}
}
}
}
tx.inputAddresses = inputAddresses;
tx.outputAddresses = outputAddresses;
transactionHistory.addOne(tx); transactionHistory.addOne(tx);
} }

View file

@ -19,11 +19,12 @@ import 'package:cw_bitcoin/bitcoin_unspent.dart';
import 'package:cw_bitcoin/electrum_transaction_info.dart'; import 'package:cw_bitcoin/electrum_transaction_info.dart';
import 'package:cw_bitcoin/pending_bitcoin_transaction.dart'; import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
import 'package:cw_bitcoin/utils.dart'; import 'package:cw_bitcoin/utils.dart';
import 'package:cw_bitcoin/electrum_derivations.dart';
import 'package:cw_core/encryption_file_utils.dart';
import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/pending_transaction.dart'; import 'package:cw_core/pending_transaction.dart';
import 'package:cw_core/sync_status.dart'; import 'package:cw_core/sync_status.dart';
import 'package:cw_core/transaction_direction.dart'; import 'package:cw_core/transaction_direction.dart';
import 'package:cw_core/encryption_file_utils.dart';
import 'package:cw_core/unspent_coins_info.dart'; import 'package:cw_core/unspent_coins_info.dart';
import 'package:cw_bitcoin/electrum_balance.dart'; import 'package:cw_bitcoin/electrum_balance.dart';
import 'package:cw_bitcoin/electrum_wallet.dart'; import 'package:cw_bitcoin/electrum_wallet.dart';
@ -53,6 +54,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
required Box<UnspentCoinsInfo> unspentCoinsInfo, required Box<UnspentCoinsInfo> unspentCoinsInfo,
required Uint8List seedBytes, required Uint8List seedBytes,
required EncryptionFileUtils encryptionFileUtils, required EncryptionFileUtils encryptionFileUtils,
String? passphrase,
String? addressPageType, String? addressPageType,
List<BitcoinAddressRecord>? initialAddresses, List<BitcoinAddressRecord>? initialAddresses,
ElectrumBalance? initialBalance, ElectrumBalance? initialBalance,
@ -123,7 +125,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
break; break;
case DerivationType.electrum: case DerivationType.electrum:
default: default:
seedBytes = await mnemonicToSeedBytes(mnemonic); seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? "");
break; break;
} }
return LitecoinWallet( return LitecoinWallet(
@ -134,6 +136,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
initialAddresses: initialAddresses, initialAddresses: initialAddresses,
initialBalance: initialBalance, initialBalance: initialBalance,
encryptionFileUtils: encryptionFileUtils, encryptionFileUtils: encryptionFileUtils,
passphrase: passphrase,
seedBytes: seedBytes, seedBytes: seedBytes,
initialRegularAddressIndex: initialRegularAddressIndex, initialRegularAddressIndex: initialRegularAddressIndex,
initialChangeAddressIndex: initialChangeAddressIndex, initialChangeAddressIndex: initialChangeAddressIndex,
@ -179,6 +182,31 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
); );
} }
walletInfo.derivationInfo ??= DerivationInfo();
// set the default if not present:
walletInfo.derivationInfo!.derivationPath ??= snp?.derivationPath ?? electrum_path;
walletInfo.derivationInfo!.derivationType ??= snp?.derivationType ?? DerivationType.electrum;
Uint8List? seedBytes = null;
final mnemonic = keysData.mnemonic;
final passphrase = keysData.passphrase;
if (mnemonic != null) {
switch (walletInfo.derivationInfo?.derivationType) {
case DerivationType.bip39:
seedBytes = await bip39.mnemonicToSeed(
mnemonic,
passphrase: passphrase ?? "",
);
break;
case DerivationType.electrum:
default:
seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? "");
break;
}
}
return LitecoinWallet( return LitecoinWallet(
mnemonic: keysData.mnemonic!, mnemonic: keysData.mnemonic!,
password: password, password: password,
@ -186,7 +214,8 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
unspentCoinsInfo: unspentCoinsInfo, unspentCoinsInfo: unspentCoinsInfo,
initialAddresses: snp?.addresses, initialAddresses: snp?.addresses,
initialBalance: snp?.balance, initialBalance: snp?.balance,
seedBytes: await mnemonicToSeedBytes(keysData.mnemonic!), seedBytes: seedBytes!,
passphrase: passphrase,
encryptionFileUtils: encryptionFileUtils, encryptionFileUtils: encryptionFileUtils,
initialRegularAddressIndex: snp?.regularAddressIndex, initialRegularAddressIndex: snp?.regularAddressIndex,
initialChangeAddressIndex: snp?.changeAddressIndex, initialChangeAddressIndex: snp?.changeAddressIndex,
@ -306,11 +335,23 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
bool? doSingleScan, bool? doSingleScan,
bool? usingElectrs, bool? usingElectrs,
}) async { }) async {
await mwebUtxosBox.clear();
transactionHistory.clear();
_syncTimer?.cancel(); _syncTimer?.cancel();
int oldHeight = walletInfo.restoreHeight;
await walletInfo.updateRestoreHeight(height); await walletInfo.updateRestoreHeight(height);
// go through mwebUtxos and clear any that are above the new restore height:
if (height == 0) {
await mwebUtxosBox.clear();
transactionHistory.clear();
} else {
for (final utxo in mwebUtxosBox.values) {
if (utxo.height > height) {
await mwebUtxosBox.delete(utxo.outputId);
}
}
// TODO: remove transactions that are above the new restore height!
}
// reset coin balances and txCount to 0: // reset coin balances and txCount to 0:
unspentCoins.forEach((coin) { unspentCoins.forEach((coin) {
if (coin.bitcoinAddressRecord is! BitcoinSilentPaymentAddressRecord) if (coin.bitcoinAddressRecord is! BitcoinSilentPaymentAddressRecord)

View file

@ -1,4 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'package:cw_bitcoin/bitcoin_mnemonics_bip39.dart';
import 'package:cw_core/encryption_file_utils.dart'; import 'package:cw_core/encryption_file_utils.dart';
import 'package:cw_core/unspent_coins_info.dart'; import 'package:cw_core/unspent_coins_info.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
@ -32,8 +33,21 @@ class LitecoinWalletService extends WalletService<
@override @override
Future<LitecoinWallet> create(BitcoinNewWalletCredentials credentials, {bool? isTestnet}) async { Future<LitecoinWallet> create(BitcoinNewWalletCredentials credentials, {bool? isTestnet}) async {
final String mnemonic;
switch ( credentials.walletInfo?.derivationInfo?.derivationType) {
case DerivationType.bip39:
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
mnemonic = await MnemonicBip39.generate(strength: strength);
break;
case DerivationType.electrum:
default:
mnemonic = await generateElectrumMnemonic();
break;
}
final wallet = await LitecoinWalletBase.create( final wallet = await LitecoinWalletBase.create(
mnemonic: await generateElectrumMnemonic(), mnemonic: mnemonic,
password: credentials.password!, password: credentials.password!,
passphrase: credentials.passphrase, passphrase: credentials.passphrase,
walletInfo: credentials.walletInfo!, walletInfo: credentials.walletInfo!,

View file

@ -365,6 +365,11 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
frontend_server_client: frontend_server_client:
dependency: transitive dependency: transitive
description: description:
@ -767,6 +772,62 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.27.7" version: "0.27.7"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
url: "https://pub.dev"
source: hosted
version: "2.2.3"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f
url: "https://pub.dev"
source: hosted
version: "2.5.2"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: "59dc807b94d29d52ddbb1b3c0d3b9d0a67fc535a64e62a5542c8db0513fcb6c2"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shelf: shelf:
dependency: transitive dependency: transitive
description: description:
@ -975,4 +1036,4 @@ packages:
version: "2.2.1" version: "2.2.1"
sdks: sdks:
dart: ">=3.3.0 <4.0.0" dart: ">=3.3.0 <4.0.0"
flutter: ">=3.16.6" flutter: ">=3.19.0"

View file

@ -17,6 +17,7 @@ dependencies:
mobx: ^2.0.7+4 mobx: ^2.0.7+4
flutter_mobx: ^2.0.6+1 flutter_mobx: ^2.0.6+1
intl: ^0.18.0 intl: ^0.18.0
shared_preferences: ^2.0.15
cw_core: cw_core:
path: ../cw_core path: ../cw_core
bitbox: bitbox:

View file

@ -3,5 +3,4 @@ export 'bitcoin_cash_wallet_addresses.dart';
export 'bitcoin_cash_wallet_creation_credentials.dart'; export 'bitcoin_cash_wallet_creation_credentials.dart';
export 'bitcoin_cash_wallet_service.dart'; export 'bitcoin_cash_wallet_service.dart';
export 'exceptions/exceptions.dart'; export 'exceptions/exceptions.dart';
export 'mnemonic.dart';
export 'bitcoin_cash_address_utils.dart'; export 'bitcoin_cash_address_utils.dart';

View file

@ -1,13 +1,14 @@
import 'package:bitbox/bitbox.dart' as bitbox; import 'package:bitbox/bitbox.dart' as bitbox;
import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:bitcoin_base/bitcoin_base.dart';
import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:blockchain_utils/blockchain_utils.dart';
import 'package:cw_core/encryption_file_utils.dart';
import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart';
import 'package:cw_bitcoin/bitcoin_mnemonics_bip39.dart';
import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; import 'package:cw_bitcoin/bitcoin_transaction_priority.dart';
import 'package:cw_bitcoin/electrum_balance.dart'; import 'package:cw_bitcoin/electrum_balance.dart';
import 'package:cw_bitcoin/electrum_wallet.dart'; import 'package:cw_bitcoin/electrum_wallet.dart';
import 'package:cw_bitcoin/electrum_wallet_snapshot.dart'; import 'package:cw_bitcoin/electrum_wallet_snapshot.dart';
import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/encryption_file_utils.dart';
import 'package:cw_core/transaction_priority.dart'; import 'package:cw_core/transaction_priority.dart';
import 'package:cw_core/unspent_coins_info.dart'; import 'package:cw_core/unspent_coins_info.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
@ -30,6 +31,7 @@ abstract class BitcoinCashWalletBase extends ElectrumWallet with Store {
required Box<UnspentCoinsInfo> unspentCoinsInfo, required Box<UnspentCoinsInfo> unspentCoinsInfo,
required Uint8List seedBytes, required Uint8List seedBytes,
required EncryptionFileUtils encryptionFileUtils, required EncryptionFileUtils encryptionFileUtils,
String? passphrase,
BitcoinAddressType? addressPageType, BitcoinAddressType? addressPageType,
List<BitcoinAddressRecord>? initialAddresses, List<BitcoinAddressRecord>? initialAddresses,
ElectrumBalance? initialBalance, ElectrumBalance? initialBalance,
@ -45,7 +47,8 @@ abstract class BitcoinCashWalletBase extends ElectrumWallet with Store {
initialBalance: initialBalance, initialBalance: initialBalance,
seedBytes: seedBytes, seedBytes: seedBytes,
currency: CryptoCurrency.bch, currency: CryptoCurrency.bch,
encryptionFileUtils: encryptionFileUtils) { encryptionFileUtils: encryptionFileUtils,
passphrase: passphrase) {
walletAddresses = BitcoinCashWalletAddresses( walletAddresses = BitcoinCashWalletAddresses(
walletInfo, walletInfo,
initialAddresses: initialAddresses, initialAddresses: initialAddresses,
@ -67,6 +70,7 @@ abstract class BitcoinCashWalletBase extends ElectrumWallet with Store {
required WalletInfo walletInfo, required WalletInfo walletInfo,
required Box<UnspentCoinsInfo> unspentCoinsInfo, required Box<UnspentCoinsInfo> unspentCoinsInfo,
required EncryptionFileUtils encryptionFileUtils, required EncryptionFileUtils encryptionFileUtils,
String? passphrase,
String? addressPageType, String? addressPageType,
List<BitcoinAddressRecord>? initialAddresses, List<BitcoinAddressRecord>? initialAddresses,
ElectrumBalance? initialBalance, ElectrumBalance? initialBalance,
@ -79,11 +83,12 @@ abstract class BitcoinCashWalletBase extends ElectrumWallet with Store {
unspentCoinsInfo: unspentCoinsInfo, unspentCoinsInfo: unspentCoinsInfo,
initialAddresses: initialAddresses, initialAddresses: initialAddresses,
initialBalance: initialBalance, initialBalance: initialBalance,
seedBytes: await MnemonicBip39.toSeed(mnemonic), seedBytes: await MnemonicBip39.toSeed(mnemonic, passphrase: passphrase),
encryptionFileUtils: encryptionFileUtils, encryptionFileUtils: encryptionFileUtils,
initialRegularAddressIndex: initialRegularAddressIndex, initialRegularAddressIndex: initialRegularAddressIndex,
initialChangeAddressIndex: initialChangeAddressIndex, initialChangeAddressIndex: initialChangeAddressIndex,
addressPageType: P2pkhAddressType.p2pkh, addressPageType: P2pkhAddressType.p2pkh,
passphrase: passphrase,
); );
} }
@ -150,11 +155,12 @@ abstract class BitcoinCashWalletBase extends ElectrumWallet with Store {
} }
}).toList(), }).toList(),
initialBalance: snp?.balance, initialBalance: snp?.balance,
seedBytes: await MnemonicBip39.toSeed(keysData.mnemonic!), seedBytes: await MnemonicBip39.toSeed(keysData.mnemonic!, passphrase: keysData.passphrase),
encryptionFileUtils: encryptionFileUtils, encryptionFileUtils: encryptionFileUtils,
initialRegularAddressIndex: snp?.regularAddressIndex, initialRegularAddressIndex: snp?.regularAddressIndex,
initialChangeAddressIndex: snp?.changeAddressIndex, initialChangeAddressIndex: snp?.changeAddressIndex,
addressPageType: P2pkhAddressType.p2pkh, addressPageType: P2pkhAddressType.p2pkh,
passphrase: keysData.passphrase,
); );
} }

View file

@ -2,17 +2,19 @@ import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
class BitcoinCashNewWalletCredentials extends WalletCredentials { class BitcoinCashNewWalletCredentials extends WalletCredentials {
BitcoinCashNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password}) BitcoinCashNewWalletCredentials(
: super(name: name, walletInfo: walletInfo, password: password); {required String name, WalletInfo? walletInfo, String? password, String? passphrase})
: super(name: name, walletInfo: walletInfo, password: password, passphrase: passphrase);
} }
class BitcoinCashRestoreWalletFromSeedCredentials extends WalletCredentials { class BitcoinCashRestoreWalletFromSeedCredentials extends WalletCredentials {
BitcoinCashRestoreWalletFromSeedCredentials( BitcoinCashRestoreWalletFromSeedCredentials({
{required String name, required String name,
required String password, required String password,
required this.mnemonic, required this.mnemonic,
WalletInfo? walletInfo}) WalletInfo? walletInfo,
: super(name: name, password: password, walletInfo: walletInfo); String? passphrase,
}) : super(name: name, password: password, walletInfo: walletInfo, passphrase: passphrase);
final String mnemonic; final String mnemonic;
} }

View file

@ -1,6 +1,8 @@
import 'dart:io'; import 'dart:io';
import 'package:bip39/bip39.dart'; import 'package:bip39/bip39.dart';
import 'package:collection/collection.dart';
import 'package:cw_bitcoin/bitcoin_mnemonics_bip39.dart';
import 'package:cw_bitcoin_cash/cw_bitcoin_cash.dart'; import 'package:cw_bitcoin_cash/cw_bitcoin_cash.dart';
import 'package:cw_core/encryption_file_utils.dart'; import 'package:cw_core/encryption_file_utils.dart';
import 'package:cw_core/pathForWallet.dart'; import 'package:cw_core/pathForWallet.dart';
@ -9,7 +11,6 @@ import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_service.dart'; import 'package:cw_core/wallet_service.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:collection/collection.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
class BitcoinCashWalletService extends WalletService< class BitcoinCashWalletService extends WalletService<
@ -35,11 +36,12 @@ class BitcoinCashWalletService extends WalletService<
final strength = credentials.seedPhraseLength == 24 ? 256 : 128; final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
final wallet = await BitcoinCashWalletBase.create( final wallet = await BitcoinCashWalletBase.create(
mnemonic: await MnemonicBip39.generate(strength: strength), mnemonic: await MnemonicBip39.generate(strength: strength),
password: credentials.password!, password: credentials.password!,
walletInfo: credentials.walletInfo!, walletInfo: credentials.walletInfo!,
unspentCoinsInfo: unspentCoinsInfoSource, unspentCoinsInfo: unspentCoinsInfoSource,
encryptionFileUtils: encryptionFileUtilsFor(isDirect), encryptionFileUtils: encryptionFileUtilsFor(isDirect),
passphrase: credentials.passphrase,
); );
await wallet.save(); await wallet.save();
await wallet.init(); await wallet.init();
@ -54,11 +56,11 @@ class BitcoinCashWalletService extends WalletService<
try { try {
final wallet = await BitcoinCashWalletBase.open( final wallet = await BitcoinCashWalletBase.open(
password: password, password: password,
name: name, name: name,
walletInfo: walletInfo, walletInfo: walletInfo,
unspentCoinsInfo: unspentCoinsInfoSource, unspentCoinsInfo: unspentCoinsInfoSource,
encryptionFileUtils: encryptionFileUtilsFor(isDirect), encryptionFileUtils: encryptionFileUtilsFor(isDirect),
); );
await wallet.init(); await wallet.init();
saveBackup(name); saveBackup(name);
@ -66,11 +68,11 @@ class BitcoinCashWalletService extends WalletService<
} catch (_) { } catch (_) {
await restoreWalletFilesFromBackup(name); await restoreWalletFilesFromBackup(name);
final wallet = await BitcoinCashWalletBase.open( final wallet = await BitcoinCashWalletBase.open(
password: password, password: password,
name: name, name: name,
walletInfo: walletInfo, walletInfo: walletInfo,
unspentCoinsInfo: unspentCoinsInfoSource, unspentCoinsInfo: unspentCoinsInfoSource,
encryptionFileUtils: encryptionFileUtilsFor(isDirect), encryptionFileUtils: encryptionFileUtilsFor(isDirect),
); );
await wallet.init(); await wallet.init();
return wallet; return wallet;
@ -130,7 +132,9 @@ class BitcoinCashWalletService extends WalletService<
mnemonic: credentials.mnemonic, mnemonic: credentials.mnemonic,
walletInfo: credentials.walletInfo!, walletInfo: credentials.walletInfo!,
unspentCoinsInfo: unspentCoinsInfoSource, unspentCoinsInfo: unspentCoinsInfoSource,
encryptionFileUtils: encryptionFileUtilsFor(isDirect)); encryptionFileUtils: encryptionFileUtilsFor(isDirect),
passphrase: credentials.passphrase
);
await wallet.save(); await wallet.save();
await wallet.init(); await wallet.init();
return wallet; return wallet;

View file

@ -46,6 +46,8 @@ abstract class WalletBase<BalanceType extends Balance, HistoryType extends Trans
String? get hexSeed => null; String? get hexSeed => null;
String? get passphrase => null;
Object get keys; Object get keys;
WalletAddresses get walletAddresses; WalletAddresses get walletAddresses;

View file

@ -45,6 +45,8 @@ List<Transaction> getAllTransactions() {
confirmations: 0, confirmations: 0,
blockheight: 0, blockheight: 0,
accountIndex: i, accountIndex: i,
addressIndex: 0,
addressIndexList: [0],
paymentId: "", paymentId: "",
amount: fullBalance - availBalance, amount: fullBalance - availBalance,
isSpend: false, isSpend: false,
@ -245,19 +247,30 @@ Future<PendingTransactionDescription> createTransactionMultDest(
class Transaction { class Transaction {
final String displayLabel; final String displayLabel;
String subaddressLabel = monero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0); String get subaddressLabel => monero.Wallet_getSubaddressLabel(
late final String address = monero.Wallet_address(
wptr!, wptr!,
accountIndex: 0, accountIndex: accountIndex,
addressIndex: 0, addressIndex: addressIndex,
); );
String get address => monero.Wallet_address(
wptr!,
accountIndex: accountIndex,
addressIndex: addressIndex,
);
List<String> get addressList => List.generate(addressIndexList.length, (index) =>
monero.Wallet_address(
wptr!,
accountIndex: accountIndex,
addressIndex: addressIndexList[index],
));
final String description; final String description;
final int fee; final int fee;
final int confirmations; final int confirmations;
late final bool isPending = confirmations < 10; late final bool isPending = confirmations < 10;
final int blockheight; final int blockheight;
final int addressIndex = 0; final int addressIndex;
final int accountIndex; final int accountIndex;
final List<int> addressIndexList;
final String paymentId; final String paymentId;
final int amount; final int amount;
final bool isSpend; final bool isSpend;
@ -303,6 +316,8 @@ class Transaction {
amount = monero.TransactionInfo_amount(txInfo), amount = monero.TransactionInfo_amount(txInfo),
paymentId = monero.TransactionInfo_paymentId(txInfo), paymentId = monero.TransactionInfo_paymentId(txInfo),
accountIndex = monero.TransactionInfo_subaddrAccount(txInfo), accountIndex = monero.TransactionInfo_subaddrAccount(txInfo),
addressIndex = int.tryParse(monero.TransactionInfo_subaddrIndex(txInfo).split(", ")[0]) ?? 0,
addressIndexList = monero.TransactionInfo_subaddrIndex(txInfo).split(", ").map((e) => int.tryParse(e) ?? 0).toList(),
blockheight = monero.TransactionInfo_blockHeight(txInfo), blockheight = monero.TransactionInfo_blockHeight(txInfo),
confirmations = monero.TransactionInfo_confirmations(txInfo), confirmations = monero.TransactionInfo_confirmations(txInfo),
fee = monero.TransactionInfo_fee(txInfo), fee = monero.TransactionInfo_fee(txInfo),
@ -316,6 +331,8 @@ class Transaction {
required this.confirmations, required this.confirmations,
required this.blockheight, required this.blockheight,
required this.accountIndex, required this.accountIndex,
required this.addressIndexList,
required this.addressIndex,
required this.paymentId, required this.paymentId,
required this.amount, required this.amount,
required this.isSpend, required this.isSpend,

View file

@ -1,6 +1,7 @@
import 'package:cw_core/subaddress.dart'; import 'package:cw_core/subaddress.dart';
import 'package:cw_monero/api/coins_info.dart'; import 'package:cw_monero/api/coins_info.dart';
import 'package:cw_monero/api/subaddress_list.dart' as subaddress_list; import 'package:cw_monero/api/subaddress_list.dart' as subaddress_list;
import 'package:cw_monero/api/wallet.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
@ -103,6 +104,9 @@ abstract class MoneroSubaddressListBase with Store {
required List<String> usedAddresses, required List<String> usedAddresses,
}) async { }) async {
_usedAddresses.addAll(usedAddresses); _usedAddresses.addAll(usedAddresses);
final _all = _usedAddresses.toSet().toList();
_usedAddresses.clear();
_usedAddresses.addAll(_all);
if (_isUpdating) { if (_isUpdating) {
return; return;
} }
@ -124,7 +128,7 @@ abstract class MoneroSubaddressListBase with Store {
Future<List<Subaddress>> _getAllUnusedAddresses( Future<List<Subaddress>> _getAllUnusedAddresses(
{required int accountIndex, required String label}) async { {required int accountIndex, required String label}) async {
final allAddresses = subaddress_list.getAllSubaddresses(); final allAddresses = subaddress_list.getAllSubaddresses();
if (allAddresses.isEmpty || _usedAddresses.contains(allAddresses.last)) { if (allAddresses.isEmpty || _usedAddresses.contains(allAddresses.first.address)) {
final isAddressUnused = await _newSubaddress(accountIndex: accountIndex, label: label); final isAddressUnused = await _newSubaddress(accountIndex: accountIndex, label: label);
if (!isAddressUnused) { if (!isAddressUnused) {
return await _getAllUnusedAddresses(accountIndex: accountIndex, label: label); return await _getAllUnusedAddresses(accountIndex: accountIndex, label: label);
@ -143,8 +147,7 @@ abstract class MoneroSubaddressListBase with Store {
label.toLowerCase() == 'Primary account'.toLowerCase() label.toLowerCase() == 'Primary account'.toLowerCase()
? 'Primary address' ? 'Primary address'
: label); : label);
}) }).toList().reversed.toList();
.toList();
} }
Future<bool> _newSubaddress({required int accountIndex, required String label}) async { Future<bool> _newSubaddress({required int accountIndex, required String label}) async {

View file

@ -88,6 +88,9 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) { reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
_updateSubAddress(enabled, account: walletAddresses.account); _updateSubAddress(enabled, account: walletAddresses.account);
}); });
reaction((_) => transactionHistory, (__) {
_updateSubAddress(isEnabledAutoGenerateSubaddress, account: walletAddresses.account);
});
} }
static const int _autoSaveInterval = 30; static const int _autoSaveInterval = 30;
@ -130,6 +133,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
monero_wallet.SyncListener? _listener; monero_wallet.SyncListener? _listener;
ReactionDisposer? _onAccountChangeReaction; ReactionDisposer? _onAccountChangeReaction;
ReactionDisposer? _onTxHistoryChangeReaction;
bool _isTransactionUpdating; bool _isTransactionUpdating;
bool _hasSyncAfterStartup; bool _hasSyncAfterStartup;
Timer? _autoSaveTimer; Timer? _autoSaveTimer;
@ -169,6 +173,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
void close() async { void close() async {
_listener?.stop(); _listener?.stop();
_onAccountChangeReaction?.reaction.dispose(); _onAccountChangeReaction?.reaction.dispose();
_onTxHistoryChangeReaction?.reaction.dispose();
_autoSaveTimer?.cancel(); _autoSaveTimer?.cancel();
} }

View file

@ -3,6 +3,7 @@ import 'package:cw_core/address_info.dart';
import 'package:cw_core/subaddress.dart'; import 'package:cw_core/subaddress.dart';
import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_addresses.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
import 'package:cw_monero/api/transaction_history.dart';
import 'package:cw_monero/api/wallet.dart'; import 'package:cw_monero/api/wallet.dart';
import 'package:cw_monero/monero_account_list.dart'; import 'package:cw_monero/monero_account_list.dart';
import 'package:cw_monero/monero_subaddress_list.dart'; import 'package:cw_monero/monero_subaddress_list.dart';
@ -37,6 +38,25 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store {
MoneroAccountList accountList; MoneroAccountList accountList;
@override
Set<String> get usedAddresses {
final txs = getAllTransactions();
final adds = _originalUsedAddresses.toList();
for (var i = 0; i < txs.length; i++) {
for (var j = 0; j < txs[i].addressList.length; j++) {
adds.add(txs[i].addressList[j]);
}
}
return adds.toSet();
}
Set<String> _originalUsedAddresses = Set();
@override
set usedAddresses(Set<String> _usedAddresses) {
_originalUsedAddresses = _usedAddresses;
}
@override @override
Future<void> init() async { Future<void> init() async {
accountList.update(); accountList.update();

View file

@ -9,11 +9,9 @@ import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_service.dart'; import 'package:cw_core/wallet_service.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:cw_core/get_height_by_date.dart'; import 'package:cw_core/get_height_by_date.dart';
import 'package:cw_monero/api/exceptions/wallet_opening_exception.dart';
import 'package:cw_monero/api/wallet_manager.dart' as monero_wallet_manager; import 'package:cw_monero/api/wallet_manager.dart' as monero_wallet_manager;
import 'package:cw_monero/api/wallet_manager.dart'; import 'package:cw_monero/api/wallet_manager.dart';
import 'package:cw_monero/monero_wallet.dart'; import 'package:cw_monero/monero_wallet.dart';
import 'package:flutter/widgets.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:polyseed/polyseed.dart'; import 'package:polyseed/polyseed.dart';
import 'package:monero/monero.dart' as monero; import 'package:monero/monero.dart' as monero;
@ -120,7 +118,6 @@ class MoneroWalletService extends WalletService<
@override @override
Future<MoneroWallet> openWallet(String name, String password, {bool? retryOnFailure}) async { Future<MoneroWallet> openWallet(String name, String password, {bool? retryOnFailure}) async {
MoneroWallet? wallet;
try { try {
final path = await pathForWallet(name: name, type: getType()); final path = await pathForWallet(name: name, type: getType());
@ -147,41 +144,10 @@ class MoneroWalletService extends WalletService<
await wallet.init(); await wallet.init();
return wallet; return wallet;
} catch (e, s) { } catch (e) {
// TODO: Implement Exception for wallet list service. // TODO: Implement Exception for wallet list service.
final bool isBadAlloc = e.toString().contains('bad_alloc') || if (retryOnFailure == false) {
(e is WalletOpeningException &&
(e.message == 'std::bad_alloc' || e.message.contains('bad_alloc')));
final bool doesNotCorrespond = e.toString().contains('does not correspond') ||
(e is WalletOpeningException && e.message.contains('does not correspond'));
final bool isMissingCacheFilesIOS = e.toString().contains('basic_string') ||
(e is WalletOpeningException && e.message.contains('basic_string'));
final bool isMissingCacheFilesAndroid = e.toString().contains('input_stream') ||
e.toString().contains('input stream error') ||
(e is WalletOpeningException &&
(e.message.contains('input_stream') || e.message.contains('input stream error')));
final bool invalidSignature = e.toString().contains('invalid signature') ||
(e is WalletOpeningException && e.message.contains('invalid signature'));
final bool invalidPassword = e.toString().contains('invalid password') ||
(e is WalletOpeningException && e.message.contains('invalid password'));
if (!isBadAlloc &&
!doesNotCorrespond &&
!isMissingCacheFilesIOS &&
!isMissingCacheFilesAndroid &&
!invalidSignature &&
!invalidPassword &&
wallet != null &&
wallet.onError != null) {
wallet.onError!(FlutterErrorDetails(exception: e, stack: s));
}
if (invalidPassword || retryOnFailure == false) {
rethrow; rethrow;
} }

View file

@ -45,6 +45,8 @@ List<Transaction> getAllTransactions() {
confirmations: 0, confirmations: 0,
blockheight: 0, blockheight: 0,
accountIndex: i, accountIndex: i,
addressIndex: 0,
addressIndexList: [0],
paymentId: "", paymentId: "",
amount: fullBalance - availBalance, amount: fullBalance - availBalance,
isSpend: false, isSpend: false,
@ -243,19 +245,26 @@ Future<PendingTransactionDescription> createTransactionMultDest(
class Transaction { class Transaction {
final String displayLabel; final String displayLabel;
String subaddressLabel = wownero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0); String get subaddressLabel => wownero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0);
late final String address = wownero.Wallet_address( String get address => wownero.Wallet_address(
wptr!, wptr!,
accountIndex: 0, accountIndex: accountIndex,
addressIndex: 0, addressIndex: addressIndex,
); );
List<String> get addressList => List.generate(addressIndexList.length, (index) =>
wownero.Wallet_address(
wptr!,
accountIndex: accountIndex,
addressIndex: addressIndexList[index],
));
final String description; final String description;
final int fee; final int fee;
final int confirmations; final int confirmations;
late final bool isPending = confirmations < 3; late final bool isPending = confirmations < 3;
final int blockheight; final int blockheight;
final int addressIndex = 0; final int addressIndex;
final int accountIndex; final int accountIndex;
final List<int> addressIndexList;
final String paymentId; final String paymentId;
final int amount; final int amount;
final bool isSpend; final bool isSpend;
@ -301,6 +310,8 @@ class Transaction {
amount = wownero.TransactionInfo_amount(txInfo), amount = wownero.TransactionInfo_amount(txInfo),
paymentId = wownero.TransactionInfo_paymentId(txInfo), paymentId = wownero.TransactionInfo_paymentId(txInfo),
accountIndex = wownero.TransactionInfo_subaddrAccount(txInfo), accountIndex = wownero.TransactionInfo_subaddrAccount(txInfo),
addressIndex = int.tryParse(wownero.TransactionInfo_subaddrIndex(txInfo).split(", ")[0]) ?? 0,
addressIndexList = wownero.TransactionInfo_subaddrIndex(txInfo).split(", ").map((e) => int.tryParse(e) ?? 0).toList(),
blockheight = wownero.TransactionInfo_blockHeight(txInfo), blockheight = wownero.TransactionInfo_blockHeight(txInfo),
confirmations = wownero.TransactionInfo_confirmations(txInfo), confirmations = wownero.TransactionInfo_confirmations(txInfo),
fee = wownero.TransactionInfo_fee(txInfo), fee = wownero.TransactionInfo_fee(txInfo),
@ -314,6 +325,8 @@ class Transaction {
required this.confirmations, required this.confirmations,
required this.blockheight, required this.blockheight,
required this.accountIndex, required this.accountIndex,
required this.addressIndex,
required this.addressIndexList,
required this.paymentId, required this.paymentId,
required this.amount, required this.amount,
required this.isSpend, required this.isSpend,

View file

@ -1,6 +1,7 @@
import 'package:cw_core/subaddress.dart'; import 'package:cw_core/subaddress.dart';
import 'package:cw_wownero/api/coins_info.dart'; import 'package:cw_wownero/api/coins_info.dart';
import 'package:cw_wownero/api/subaddress_list.dart' as subaddress_list; import 'package:cw_wownero/api/subaddress_list.dart' as subaddress_list;
import 'package:cw_wownero/api/wallet.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
@ -103,6 +104,9 @@ abstract class WowneroSubaddressListBase with Store {
required List<String> usedAddresses, required List<String> usedAddresses,
}) async { }) async {
_usedAddresses.addAll(usedAddresses); _usedAddresses.addAll(usedAddresses);
final _all = _usedAddresses.toSet().toList();
_usedAddresses.clear();
_usedAddresses.addAll(_all);
if (_isUpdating) { if (_isUpdating) {
return; return;
} }

View file

@ -82,6 +82,10 @@ abstract class WowneroWalletBase
reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) { reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
_updateSubAddress(enabled, account: walletAddresses.account); _updateSubAddress(enabled, account: walletAddresses.account);
}); });
_onTxHistoryChangeReaction = reaction((_) => transactionHistory, (__) {
_updateSubAddress(isEnabledAutoGenerateSubaddress, account: walletAddresses.account);
});
} }
static const int _autoSaveInterval = 30; static const int _autoSaveInterval = 30;
@ -123,6 +127,7 @@ abstract class WowneroWalletBase
wownero_wallet.SyncListener? _listener; wownero_wallet.SyncListener? _listener;
ReactionDisposer? _onAccountChangeReaction; ReactionDisposer? _onAccountChangeReaction;
ReactionDisposer? _onTxHistoryChangeReaction;
bool _isTransactionUpdating; bool _isTransactionUpdating;
bool _hasSyncAfterStartup; bool _hasSyncAfterStartup;
Timer? _autoSaveTimer; Timer? _autoSaveTimer;
@ -158,6 +163,7 @@ abstract class WowneroWalletBase
void close() async { void close() async {
_listener?.stop(); _listener?.stop();
_onAccountChangeReaction?.reaction.dispose(); _onAccountChangeReaction?.reaction.dispose();
_onTxHistoryChangeReaction?.reaction.dispose();
_autoSaveTimer?.cancel(); _autoSaveTimer?.cancel();
} }

View file

@ -3,6 +3,7 @@ import 'package:cw_core/address_info.dart';
import 'package:cw_core/subaddress.dart'; import 'package:cw_core/subaddress.dart';
import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_addresses.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
import 'package:cw_wownero/api/transaction_history.dart';
import 'package:cw_wownero/api/wallet.dart'; import 'package:cw_wownero/api/wallet.dart';
import 'package:cw_wownero/wownero_account_list.dart'; import 'package:cw_wownero/wownero_account_list.dart';
import 'package:cw_wownero/wownero_subaddress_list.dart'; import 'package:cw_wownero/wownero_subaddress_list.dart';
@ -36,7 +37,24 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store {
WowneroSubaddressList subaddressList; WowneroSubaddressList subaddressList;
WowneroAccountList accountList; WowneroAccountList accountList;
@override
Set<String> get usedAddresses {
final txs = getAllTransactions();
final adds = _originalUsedAddresses.toList();
for (var i = 0; i < txs.length; i++) {
for (var j = 0; j < txs[i].addressList.length; j++) {
adds.add(txs[i].addressList[j]);
}
}
return adds.toSet();
}
Set<String> _originalUsedAddresses = Set();
@override
set usedAddresses(Set<String> _usedAddresses) {
_originalUsedAddresses = _usedAddresses;
}
@override @override
Future<void> init() async { Future<void> init() async {
accountList.update(); accountList.update();

View file

@ -29,8 +29,9 @@ class CWBitcoin extends Bitcoin {
@override @override
WalletCredentials createBitcoinNewWalletCredentials( WalletCredentials createBitcoinNewWalletCredentials(
{required String name, WalletInfo? walletInfo, String? password}) => {required String name, WalletInfo? walletInfo, String? password, String? passphrase}) =>
BitcoinNewWalletCredentials(name: name, walletInfo: walletInfo, password: password); BitcoinNewWalletCredentials(
name: name, walletInfo: walletInfo, password: password, passphrase: passphrase);
@override @override
WalletCredentials createBitcoinHardwareWalletCredentials( WalletCredentials createBitcoinHardwareWalletCredentials(
@ -320,7 +321,7 @@ class CWBitcoin extends Bitcoin {
for (DerivationType dType in electrum_derivations.keys) { for (DerivationType dType in electrum_derivations.keys) {
late Uint8List seedBytes; late Uint8List seedBytes;
if (dType == DerivationType.electrum) { if (dType == DerivationType.electrum) {
seedBytes = await mnemonicToSeedBytes(mnemonic); seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? "");
} else if (dType == DerivationType.bip39) { } else if (dType == DerivationType.bip39) {
seedBytes = bip39.mnemonicToSeed(mnemonic, passphrase: passphrase ?? ''); seedBytes = bip39.mnemonicToSeed(mnemonic, passphrase: passphrase ?? '');
} }

View file

@ -15,14 +15,16 @@ class CWBitcoinCash extends BitcoinCash {
required String name, required String name,
WalletInfo? walletInfo, WalletInfo? walletInfo,
String? password, String? password,
String? passphrase,
}) => }) =>
BitcoinCashNewWalletCredentials(name: name, walletInfo: walletInfo, password: password); BitcoinCashNewWalletCredentials(
name: name, walletInfo: walletInfo, password: password, passphrase: passphrase);
@override @override
WalletCredentials createBitcoinCashRestoreWalletFromSeedCredentials( WalletCredentials createBitcoinCashRestoreWalletFromSeedCredentials(
{required String name, required String mnemonic, required String password}) => {required String name, required String mnemonic, required String password, String? passphrase}) =>
BitcoinCashRestoreWalletFromSeedCredentials( BitcoinCashRestoreWalletFromSeedCredentials(
name: name, mnemonic: mnemonic, password: password); name: name, mnemonic: mnemonic, password: password, passphrase: passphrase);
@override @override
TransactionPriority deserializeBitcoinCashTransactionPriority(int raw) => TransactionPriority deserializeBitcoinCashTransactionPriority(int raw) =>

View file

@ -75,8 +75,10 @@ class WalletCreationService {
bool get _hasSeedPhraseLengthOption { bool get _hasSeedPhraseLengthOption {
switch (type) { switch (type) {
case WalletType.ethereum: case WalletType.bitcoin:
case WalletType.litecoin:
case WalletType.bitcoinCash: case WalletType.bitcoinCash:
case WalletType.ethereum:
case WalletType.polygon: case WalletType.polygon:
case WalletType.solana: case WalletType.solana:
case WalletType.tron: case WalletType.tron:
@ -84,8 +86,6 @@ class WalletCreationService {
case WalletType.monero: case WalletType.monero:
case WalletType.wownero: case WalletType.wownero:
case WalletType.none: case WalletType.none:
case WalletType.bitcoin:
case WalletType.litecoin:
case WalletType.haven: case WalletType.haven:
case WalletType.nano: case WalletType.nano:
case WalletType.banano: case WalletType.banano:

View file

@ -147,7 +147,7 @@ import 'package:cake_wallet/view_model/cake_pay/cake_pay_purchase_view_model.dar
import 'package:cake_wallet/view_model/nano_account_list/nano_account_edit_or_create_view_model.dart'; import 'package:cake_wallet/view_model/nano_account_list/nano_account_edit_or_create_view_model.dart';
import 'package:cake_wallet/view_model/nano_account_list/nano_account_list_view_model.dart'; import 'package:cake_wallet/view_model/nano_account_list/nano_account_list_view_model.dart';
import 'package:cake_wallet/view_model/node_list/pow_node_list_view_model.dart'; import 'package:cake_wallet/view_model/node_list/pow_node_list_view_model.dart';
import 'package:cake_wallet/view_model/seed_type_view_model.dart'; import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/set_up_2fa_viewmodel.dart'; import 'package:cake_wallet/view_model/set_up_2fa_viewmodel.dart';
import 'package:cake_wallet/view_model/restore/restore_from_qr_vm.dart'; import 'package:cake_wallet/view_model/restore/restore_from_qr_vm.dart';
import 'package:cake_wallet/view_model/settings/display_settings_view_model.dart'; import 'package:cake_wallet/view_model/settings/display_settings_view_model.dart';
@ -181,6 +181,7 @@ import 'package:cake_wallet/store/dashboard/trades_store.dart';
import 'package:cake_wallet/store/dashboard/transaction_filter_store.dart'; import 'package:cake_wallet/store/dashboard/transaction_filter_store.dart';
import 'package:cake_wallet/store/node_list_store.dart'; import 'package:cake_wallet/store/node_list_store.dart';
import 'package:cake_wallet/store/secret_store.dart'; import 'package:cake_wallet/store/secret_store.dart';
import 'package:cake_wallet/store/seed_settings_store.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/store/templates/exchange_template_store.dart'; import 'package:cake_wallet/store/templates/exchange_template_store.dart';
import 'package:cake_wallet/store/templates/send_template_store.dart'; import 'package:cake_wallet/store/templates/send_template_store.dart';
@ -333,6 +334,7 @@ Future<void> setup({
YatStore(appStore: getIt.get<AppStore>(), secureStorage: getIt.get<SecureStorage>())..init()); YatStore(appStore: getIt.get<AppStore>(), secureStorage: getIt.get<SecureStorage>())..init());
getIt.registerSingleton<AnonpayTransactionsStore>( getIt.registerSingleton<AnonpayTransactionsStore>(
AnonpayTransactionsStore(anonpayInvoiceInfoSource: _anonpayInvoiceInfoSource)); AnonpayTransactionsStore(anonpayInvoiceInfoSource: _anonpayInvoiceInfoSource));
getIt.registerSingleton<SeedSettingsStore>(SeedSettingsStore());
getIt.registerLazySingleton(() => LedgerViewModel()); getIt.registerLazySingleton(() => LedgerViewModel());
@ -363,6 +365,7 @@ Future<void> setup({
getIt.get<WalletCreationService>(param1: type), getIt.get<WalletCreationService>(param1: type),
_walletInfoSource, _walletInfoSource,
getIt.get<AdvancedPrivacySettingsViewModel>(param1: type), getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
getIt.get<SeedSettingsViewModel>(),
type: type)); type: type));
getIt.registerFactoryParam<WalletUnlockPage, WalletUnlockArguments, bool>((args, closable) { getIt.registerFactoryParam<WalletUnlockPage, WalletUnlockArguments, bool>((args, closable) {
@ -424,14 +427,21 @@ Future<void> setup({
walletType: args.walletType ?? currentWalletType); walletType: args.walletType ?? currentWalletType);
}); });
getIt.registerFactoryParam<WalletRestorationFromQRVM, WalletType, void>((WalletType type, _) { getIt.registerFactoryParam<WalletRestorationFromQRVM, WalletType, void>((WalletType type, _) =>
return WalletRestorationFromQRVM(getIt.get<AppStore>(), WalletRestorationFromQRVM(
getIt.get<WalletCreationService>(param1: type), _walletInfoSource, type); getIt.get<AppStore>(),
}); getIt.get<WalletCreationService>(param1: type),
_walletInfoSource,
type,
getIt.get<SeedSettingsViewModel>()));
getIt.registerFactoryParam<WalletHardwareRestoreViewModel, WalletType, void>((type, _) => getIt.registerFactoryParam<WalletHardwareRestoreViewModel, WalletType, void>((type, _) =>
WalletHardwareRestoreViewModel(getIt.get<LedgerViewModel>(), getIt.get<AppStore>(), WalletHardwareRestoreViewModel(
getIt.get<WalletCreationService>(param1: type), _walletInfoSource, getIt.get<LedgerViewModel>(),
getIt.get<AppStore>(),
getIt.get<WalletCreationService>(param1: type),
_walletInfoSource,
getIt.get<SeedSettingsViewModel>(),
type: type)); type: type));
getIt.registerFactory<WalletAddressListViewModel>(() => WalletAddressListViewModel( getIt.registerFactory<WalletAddressListViewModel>(() => WalletAddressListViewModel(
@ -841,7 +851,7 @@ Future<void> setup({
getIt.registerFactory(() => WalletSeedViewModel(getIt.get<AppStore>().wallet!)); getIt.registerFactory(() => WalletSeedViewModel(getIt.get<AppStore>().wallet!));
getIt.registerFactory<SeedTypeViewModel>(() => SeedTypeViewModel(getIt.get<AppStore>())); getIt.registerFactory<SeedSettingsViewModel>(() => SeedSettingsViewModel(getIt.get<AppStore>(), getIt.get<SeedSettingsStore>()));
getIt.registerFactoryParam<WalletSeedPage, bool, void>((bool isWalletCreated, _) => getIt.registerFactoryParam<WalletSeedPage, bool, void>((bool isWalletCreated, _) =>
WalletSeedPage(getIt.get<WalletSeedViewModel>(), isNewWalletCreated: isWalletCreated)); WalletSeedPage(getIt.get<WalletSeedViewModel>(), isNewWalletCreated: isWalletCreated));
@ -1032,12 +1042,12 @@ Future<void> setup({
getIt.registerFactory(() => FaqPage(getIt.get<SettingsStore>())); getIt.registerFactory(() => FaqPage(getIt.get<SettingsStore>()));
getIt.registerFactoryParam<WalletRestoreViewModel, WalletType, void>((type, _) => getIt.registerFactoryParam<WalletRestoreViewModel, WalletType, void>((type, _) =>
WalletRestoreViewModel( WalletRestoreViewModel(getIt.get<AppStore>(), getIt.get<WalletCreationService>(param1: type),
getIt.get<AppStore>(), getIt.get<WalletCreationService>(param1: type), _walletInfoSource, _walletInfoSource, getIt.get<SeedSettingsViewModel>(),
type: type)); type: type));
getIt.registerFactoryParam<WalletRestorePage, WalletType, void>((type, _) => WalletRestorePage( getIt.registerFactoryParam<WalletRestorePage, WalletType, void>((type, _) => WalletRestorePage(
getIt.get<WalletRestoreViewModel>(param1: type), getIt.get<SeedTypeViewModel>())); getIt.get<WalletRestoreViewModel>(param1: type), getIt.get<SeedSettingsViewModel>()));
getIt.registerFactoryParam<WalletRestoreChooseDerivationViewModel, List<DerivationInfo>, void>( getIt.registerFactoryParam<WalletRestoreChooseDerivationViewModel, List<DerivationInfo>, void>(
(derivations, _) => WalletRestoreChooseDerivationViewModel(derivationInfos: derivations)); (derivations, _) => WalletRestoreChooseDerivationViewModel(derivationInfos: derivations));
@ -1290,7 +1300,7 @@ Future<void> setup({
getIt.registerFactory( getIt.registerFactory(
() => WalletConnectConnectionsView(web3walletService: getIt.get<Web3WalletService>())); () => WalletConnectConnectionsView(web3walletService: getIt.get<Web3WalletService>()));
getIt.registerFactory(() => NFTViewModel(appStore, getIt.get<BottomSheetService>())); getIt.registerFactory(() => NFTViewModel(appStore, getIt.get<BottomSheetService>()));
getIt.registerFactory<TorPage>(() => TorPage(getIt.get<AppStore>())); getIt.registerFactory<TorPage>(() => TorPage(getIt.get<AppStore>()));

View file

@ -60,7 +60,7 @@ class LanguageService {
'yo': 'nga', 'yo': 'nga',
'ha': 'hau', 'ha': 'hau',
'tl': 'phl', 'tl': 'phl',
'hy': 'arm' 'hy': 'arm',
}; };
static final list = <String, String>{}; static final list = <String, String>{};

View file

@ -65,6 +65,7 @@ class PreferencesKey {
static const useEtherscan = 'use_etherscan'; static const useEtherscan = 'use_etherscan';
static const usePolygonScan = 'use_polygonscan'; static const usePolygonScan = 'use_polygonscan';
static const useTronGrid = 'use_trongrid'; static const useTronGrid = 'use_trongrid';
static const useMempoolFeeAPI = 'use_mempool_fee_api';
static const defaultNanoRep = 'default_nano_representative'; static const defaultNanoRep = 'default_nano_representative';
static const defaultBananoRep = 'default_banano_representative'; static const defaultBananoRep = 'default_banano_representative';
static const lookupsTwitter = 'looks_up_twitter'; static const lookupsTwitter = 'looks_up_twitter';
@ -81,6 +82,7 @@ class PreferencesKey {
static const exchangeProvidersSelection = 'exchange-providers-selection'; static const exchangeProvidersSelection = 'exchange-providers-selection';
static const autoGenerateSubaddressStatusKey = 'auto_generate_subaddress_status'; static const autoGenerateSubaddressStatusKey = 'auto_generate_subaddress_status';
static const moneroSeedType = 'monero_seed_type'; static const moneroSeedType = 'monero_seed_type';
static const bitcoinSeedType = 'bitcoin_seed_type';
static const clearnetDonationLink = 'clearnet_donation_link'; static const clearnetDonationLink = 'clearnet_donation_link';
static const onionDonationLink = 'onion_donation_link'; static const onionDonationLink = 'onion_donation_link';
static const donationLinkWalletName = 'donation_link_wallet_name'; static const donationLinkWalletName = 'donation_link_wallet_name';

View file

@ -1,18 +1,19 @@
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cw_core/enumerable_item.dart'; import 'package:cw_core/enumerable_item.dart';
import 'package:cw_core/wallet_info.dart';
class SeedType extends EnumerableItem<int> with Serializable<int> { class MoneroSeedType extends EnumerableItem<int> with Serializable<int> {
const SeedType({required String title, required int raw}) : super(title: title, raw: raw); const MoneroSeedType({required String title, required int raw}) : super(title: title, raw: raw);
static const all = [SeedType.legacy, SeedType.polyseed]; static const all = [MoneroSeedType.legacy, MoneroSeedType.polyseed];
static const defaultSeedType = polyseed; static const defaultSeedType = polyseed;
static const legacy = SeedType(raw: 0, title: 'Legacy (25 words)'); static const legacy = MoneroSeedType(raw: 0, title: 'Legacy (25 words)');
static const polyseed = SeedType(raw: 1, title: 'Polyseed (16 words)'); static const polyseed = MoneroSeedType(raw: 1, title: 'Polyseed (16 words)');
static const wowneroSeed = SeedType(raw: 2, title: 'Wownero (14 words)'); static const wowneroSeed = MoneroSeedType(raw: 2, title: 'Wownero (14 words)');
static SeedType deserialize({required int raw}) { static MoneroSeedType deserialize({required int raw}) {
switch (raw) { switch (raw) {
case 0: case 0:
return legacy; return legacy;
@ -28,14 +29,39 @@ class SeedType extends EnumerableItem<int> with Serializable<int> {
@override @override
String toString() { String toString() {
switch (this) { switch (this) {
case SeedType.legacy: case MoneroSeedType.legacy:
return S.current.seedtype_legacy; return S.current.seedtype_legacy;
case SeedType.polyseed: case MoneroSeedType.polyseed:
return S.current.seedtype_polyseed; return S.current.seedtype_polyseed;
case SeedType.wowneroSeed: case MoneroSeedType.wowneroSeed:
return S.current.seedtype_wownero; return S.current.seedtype_wownero;
default: default:
return ''; return '';
} }
} }
} }
class BitcoinSeedType extends EnumerableItem<int> with Serializable<int> {
const BitcoinSeedType(this.type, {required String title, required int raw})
: super(title: title, raw: raw);
final DerivationType type;
static const all = [BitcoinSeedType.electrum, BitcoinSeedType.bip39];
static const defaultDerivationType = bip39;
static const electrum = BitcoinSeedType(DerivationType.electrum, raw: 0, title: 'Electrum');
static const bip39 = BitcoinSeedType(DerivationType.bip39, raw: 1, title: 'BIP39');
static BitcoinSeedType deserialize({required int raw}) {
switch (raw) {
case 0:
return electrum;
case 1:
return bip39;
default:
throw Exception('Unexpected token: $raw for SeedType deserialize');
}
}
}

View file

@ -17,6 +17,8 @@ import 'package:cake_wallet/src/screens/backup/edit_backup_password_page.dart';
import 'package:cake_wallet/src/screens/buy/buy_options_page.dart'; import 'package:cake_wallet/src/screens/buy/buy_options_page.dart';
import 'package:cake_wallet/src/screens/buy/buy_webview_page.dart'; import 'package:cake_wallet/src/screens/buy/buy_webview_page.dart';
import 'package:cake_wallet/src/screens/buy/webview_page.dart'; import 'package:cake_wallet/src/screens/buy/webview_page.dart';
import 'package:cake_wallet/src/screens/cake_pay/auth/cake_pay_account_page.dart';
import 'package:cake_wallet/src/screens/cake_pay/cake_pay.dart';
import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart'; import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart';
import 'package:cake_wallet/src/screens/connect_device/select_hardware_wallet_account_page.dart'; import 'package:cake_wallet/src/screens/connect_device/select_hardware_wallet_account_page.dart';
import 'package:cake_wallet/src/screens/contact/contact_list_page.dart'; import 'package:cake_wallet/src/screens/contact/contact_list_page.dart';
@ -27,8 +29,8 @@ import 'package:cake_wallet/src/screens/dashboard/edit_token_page.dart';
import 'package:cake_wallet/src/screens/dashboard/home_settings_page.dart'; import 'package:cake_wallet/src/screens/dashboard/home_settings_page.dart';
import 'package:cake_wallet/src/screens/dashboard/pages/address_page.dart'; import 'package:cake_wallet/src/screens/dashboard/pages/address_page.dart';
import 'package:cake_wallet/src/screens/dashboard/pages/nft_details_page.dart'; import 'package:cake_wallet/src/screens/dashboard/pages/nft_details_page.dart';
import 'package:cake_wallet/src/screens/dashboard/sign_page.dart';
import 'package:cake_wallet/src/screens/dashboard/pages/transactions_page.dart'; import 'package:cake_wallet/src/screens/dashboard/pages/transactions_page.dart';
import 'package:cake_wallet/src/screens/dashboard/sign_page.dart';
import 'package:cake_wallet/src/screens/disclaimer/disclaimer_page.dart'; import 'package:cake_wallet/src/screens/disclaimer/disclaimer_page.dart';
import 'package:cake_wallet/src/screens/exchange/exchange_page.dart'; import 'package:cake_wallet/src/screens/exchange/exchange_page.dart';
import 'package:cake_wallet/src/screens/exchange/exchange_template_page.dart'; import 'package:cake_wallet/src/screens/exchange/exchange_template_page.dart';
@ -43,10 +45,9 @@ import 'package:cake_wallet/src/screens/new_wallet/new_wallet_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/new_wallet_type_page.dart'; import 'package:cake_wallet/src/screens/new_wallet/new_wallet_type_page.dart';
import 'package:cake_wallet/src/screens/nodes/node_create_or_edit_page.dart'; import 'package:cake_wallet/src/screens/nodes/node_create_or_edit_page.dart';
import 'package:cake_wallet/src/screens/nodes/pow_node_create_or_edit_page.dart'; import 'package:cake_wallet/src/screens/nodes/pow_node_create_or_edit_page.dart';
import 'package:cake_wallet/src/screens/receive/address_list_page.dart';
import 'package:cake_wallet/src/screens/restore/sweeping_wallet_page.dart';
import 'package:cake_wallet/src/screens/order_details/order_details_page.dart'; import 'package:cake_wallet/src/screens/order_details/order_details_page.dart';
import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart'; import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart';
import 'package:cake_wallet/src/screens/receive/address_list_page.dart';
import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart'; import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart';
import 'package:cake_wallet/src/screens/receive/anonpay_receive_page.dart'; import 'package:cake_wallet/src/screens/receive/anonpay_receive_page.dart';
import 'package:cake_wallet/src/screens/receive/fullscreen_qr_page.dart'; import 'package:cake_wallet/src/screens/receive/fullscreen_qr_page.dart';
@ -70,11 +71,9 @@ import 'package:cake_wallet/src/screens/settings/mweb_settings.dart';
import 'package:cake_wallet/src/screens/settings/other_settings_page.dart'; import 'package:cake_wallet/src/screens/settings/other_settings_page.dart';
import 'package:cake_wallet/src/screens/settings/privacy_page.dart'; import 'package:cake_wallet/src/screens/settings/privacy_page.dart';
import 'package:cake_wallet/src/screens/settings/security_backup_page.dart'; import 'package:cake_wallet/src/screens/settings/security_backup_page.dart';
import 'package:cake_wallet/src/screens/cake_pay/auth/cake_pay_account_page.dart';
import 'package:cake_wallet/src/screens/settings/silent_payments_settings.dart'; import 'package:cake_wallet/src/screens/settings/silent_payments_settings.dart';
import 'package:cake_wallet/src/screens/settings/tor_page.dart'; import 'package:cake_wallet/src/screens/settings/tor_page.dart';
import 'package:cake_wallet/src/screens/settings/trocador_providers_page.dart'; import 'package:cake_wallet/src/screens/settings/trocador_providers_page.dart';
import 'package:cake_wallet/src/screens/settings/tor_page.dart';
import 'package:cake_wallet/src/screens/setup_2fa/modify_2fa_page.dart'; import 'package:cake_wallet/src/screens/setup_2fa/modify_2fa_page.dart';
import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa.dart'; import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa.dart';
import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa_enter_code_page.dart'; import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa_enter_code_page.dart';
@ -86,19 +85,18 @@ 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_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/support_other_links/support_other_links_page.dart';
import 'package:cake_wallet/src/screens/trade_details/trade_details_page.dart'; import 'package:cake_wallet/src/screens/trade_details/trade_details_page.dart';
import 'package:cake_wallet/src/screens/transaction_details/transaction_details_page.dart';
import 'package:cake_wallet/src/screens/transaction_details/rbf_details_page.dart'; import 'package:cake_wallet/src/screens/transaction_details/rbf_details_page.dart';
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_details_page.dart';
import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart'; import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart';
import 'package:cake_wallet/src/screens/wallet/wallet_edit_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_connect/wc_connections_listing_view.dart';
import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart'; import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
import 'package:cake_wallet/src/screens/wallet_list/wallet_list_page.dart'; import 'package:cake_wallet/src/screens/wallet_list/wallet_list_page.dart';
import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart';
import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_page.dart'; import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_page.dart';
import 'package:cake_wallet/src/screens/welcome/create_welcome_page.dart'; import 'package:cake_wallet/src/screens/welcome/create_welcome_page.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/utils/payment_request.dart'; import 'package:cake_wallet/utils/payment_request.dart';
import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart'; import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
@ -107,7 +105,7 @@ import 'package:cake_wallet/view_model/dashboard/sign_view_model.dart';
import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart'; import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart';
import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart'; import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart';
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart'; import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
import 'package:cake_wallet/view_model/seed_type_view_model.dart'; import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_hardware_restore_view_model.dart'; import 'package:cake_wallet/view_model/wallet_hardware_restore_view_model.dart';
import 'package:cake_wallet/view_model/wallet_new_vm.dart'; import 'package:cake_wallet/view_model/wallet_new_vm.dart';
import 'package:cake_wallet/wallet_type_utils.dart'; import 'package:cake_wallet/wallet_type_utils.dart';
@ -121,7 +119,7 @@ import 'package:cw_core/wallet_type.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:cake_wallet/src/screens/cake_pay/cake_pay.dart';
import 'src/screens/dashboard/pages/nft_import_page.dart'; import 'src/screens/dashboard/pages/nft_import_page.dart';
late RouteSettings currentRouteSettings; late RouteSettings currentRouteSettings;
@ -136,7 +134,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.newWalletFromWelcome: case Routes.newWalletFromWelcome:
if (SettingsStoreBase.walletPasswordDirectInput) { if (SettingsStoreBase.walletPasswordDirectInput) {
if (availableWalletTypes.length == 1) { if (availableWalletTypes.length == 1) {
return createRoute(RouteSettings(name: Routes.newWallet, arguments: availableWalletTypes.first)); return createRoute(
RouteSettings(name: Routes.newWallet, arguments: availableWalletTypes.first));
} else { } else {
return createRoute(RouteSettings(name: Routes.newWalletType)); return createRoute(RouteSettings(name: Routes.newWalletType));
} }
@ -163,10 +162,10 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.newWallet: case Routes.newWallet:
final type = settings.arguments as WalletType; final type = settings.arguments as WalletType;
final walletNewVM = getIt.get<WalletNewVM>(param1: type); final walletNewVM = getIt.get<WalletNewVM>(param1: type);
final seedTypeViewModel = getIt.get<SeedTypeViewModel>(); final seedSettingsViewModel = getIt.get<SeedSettingsViewModel>();
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
builder: (_) => NewWalletPage(walletNewVM, seedTypeViewModel)); builder: (_) => NewWalletPage(walletNewVM, seedSettingsViewModel));
case Routes.chooseHardwareWalletAccount: case Routes.chooseHardwareWalletAccount:
final arguments = settings.arguments as List<dynamic>; final arguments = settings.arguments as List<dynamic>;
@ -349,16 +348,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.auth: case Routes.auth:
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
fullscreenDialog: true, fullscreenDialog: true,
builder: (_) builder: (_) => SettingsStoreBase.walletPasswordDirectInput
=> SettingsStoreBase.walletPasswordDirectInput ? getIt.get<WalletUnlockPage>(
? getIt.get<WalletUnlockPage>( param1: WalletUnlockArguments(
param1: WalletUnlockArguments(
callback: settings.arguments as OnAuthenticationFinished), callback: settings.arguments as OnAuthenticationFinished),
instanceName: 'wallet_unlock_verifiable', instanceName: 'wallet_unlock_verifiable',
param2: true) param2: true)
: getIt.get<AuthPage>( : getIt.get<AuthPage>(
param1: settings.arguments as OnAuthenticationFinished, param1: settings.arguments as OnAuthenticationFinished, param2: true));
param2: true));
case Routes.totpAuthCodePage: case Routes.totpAuthCodePage:
final args = settings.arguments as TotpAuthArgumentsModel; final args = settings.arguments as TotpAuthArgumentsModel;
@ -372,28 +369,25 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.walletUnlockLoadable: case Routes.walletUnlockLoadable:
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
fullscreenDialog: true, fullscreenDialog: true,
builder: (_) builder: (_) => getIt.get<WalletUnlockPage>(
=> getIt.get<WalletUnlockPage>(
param1: settings.arguments as WalletUnlockArguments, param1: settings.arguments as WalletUnlockArguments,
instanceName: 'wallet_unlock_loadable', instanceName: 'wallet_unlock_loadable',
param2: true)); param2: true));
case Routes.unlock: case Routes.unlock:
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
fullscreenDialog: true, fullscreenDialog: true,
builder: (_) builder: (_) => SettingsStoreBase.walletPasswordDirectInput
=> SettingsStoreBase.walletPasswordDirectInput ? WillPopScope(
? WillPopScope( child: getIt.get<WalletUnlockPage>(
child: getIt.get<WalletUnlockPage>(
param1: WalletUnlockArguments( param1: WalletUnlockArguments(
callback: settings.arguments as OnAuthenticationFinished), callback: settings.arguments as OnAuthenticationFinished),
param2: false, param2: false,
instanceName: 'wallet_unlock_verifiable'), instanceName: 'wallet_unlock_verifiable'),
onWillPop: () async => false) onWillPop: () async => false)
: WillPopScope( : WillPopScope(
child: getIt.get<AuthPage>( child: getIt.get<AuthPage>(
param1: settings.arguments as OnAuthenticationFinished, param1: settings.arguments as OnAuthenticationFinished, param2: false),
param2: false),
onWillPop: () async => false)); onWillPop: () async => false));
case Routes.silentPaymentsSettings: case Routes.silentPaymentsSettings:
@ -442,11 +436,12 @@ Route<dynamic> createRoute(RouteSettings settings) {
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
builder: (context) => WillPopScope( builder: (context) => WillPopScope(
child: SettingsStoreBase.walletPasswordDirectInput child: SettingsStoreBase.walletPasswordDirectInput
? getIt.get<WalletUnlockPage>(instanceName: 'wallet_password_login') ? getIt.get<WalletUnlockPage>(instanceName: 'wallet_password_login')
: getIt.get<AuthPage>(instanceName: 'login'), : getIt.get<AuthPage>(instanceName: 'login'),
onWillPop: () async => onWillPop: () async =>
// FIX-ME: Additional check does it works correctly // FIX-ME: Additional check does it works correctly
(await SystemChannels.platform.invokeMethod<bool>('SystemNavigator.pop') ?? false)), (await SystemChannels.platform.invokeMethod<bool>('SystemNavigator.pop') ??
false)),
fullscreenDialog: true); fullscreenDialog: true);
case Routes.newPowNode: case Routes.newPowNode:
@ -542,8 +537,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.support: case Routes.support:
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
fullscreenDialog: true, fullscreenDialog: true, builder: (_) => getIt.get<SupportPage>());
builder: (_) => getIt.get<SupportPage>());
case Routes.supportLiveChat: case Routes.supportLiveChat:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<SupportChatPage>()); return CupertinoPageRoute<void>(builder: (_) => getIt.get<SupportChatPage>());
@ -572,8 +566,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.cakePayBuyCardPage: case Routes.cakePayBuyCardPage:
final args = settings.arguments as List; final args = settings.arguments as List;
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardPage>(param1: args));
builder: (_) => getIt.get<CakePayBuyCardPage>(param1: args));
case Routes.cakePayBuyCardDetailPage: case Routes.cakePayBuyCardDetailPage:
final args = settings.arguments as List; final args = settings.arguments as List;
@ -587,7 +580,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.cakePayVerifyOtpPage: case Routes.cakePayVerifyOtpPage:
final args = settings.arguments as List; final args = settings.arguments as List;
return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayVerifyOtpPage>(param1: args)); return CupertinoPageRoute<void>(
builder: (_) => getIt.get<CakePayVerifyOtpPage>(param1: args));
case Routes.cakePayAccountPage: case Routes.cakePayAccountPage:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayAccountPage>()); return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayAccountPage>());
@ -602,16 +596,19 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.advancedPrivacySettings: case Routes.advancedPrivacySettings:
final args = settings.arguments as Map<String, dynamic>; final args = settings.arguments as Map<String, dynamic>;
final type = args['type'] as WalletType; final type = args['type'] as WalletType;
final isFromRestore = args['isFromRestore'] as bool? ?? false;
final useTestnet = args['useTestnet'] as bool; final useTestnet = args['useTestnet'] as bool;
final toggleTestnet = args['toggleTestnet'] as Function(bool? val); final toggleTestnet = args['toggleTestnet'] as Function(bool? val);
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
builder: (_) => AdvancedPrivacySettingsPage( builder: (_) => AdvancedPrivacySettingsPage(
useTestnet, isFromRestore: isFromRestore,
toggleTestnet, useTestnet: useTestnet,
getIt.get<AdvancedPrivacySettingsViewModel>(param1: type), toggleUseTestnet: toggleTestnet,
getIt.get<NodeCreateOrEditViewModel>(param1: type, param2: false), advancedPrivacySettingsViewModel:
getIt.get<SeedTypeViewModel>(), getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
nodeViewModel: getIt.get<NodeCreateOrEditViewModel>(param1: type, param2: false),
seedSettingsViewModel: getIt.get<SeedSettingsViewModel>(),
)); ));
case Routes.anonPayInvoicePage: case Routes.anonPayInvoicePage:
@ -714,7 +711,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
getIt.get<SignViewModel>(), getIt.get<SignViewModel>(),
), ),
); );
case Routes.connectDevices: case Routes.connectDevices:
final params = settings.arguments as ConnectDevicePageParams; final params = settings.arguments as ConnectDevicePageParams;
return MaterialPageRoute<void>( return MaterialPageRoute<void>(

View file

@ -1,23 +1,7 @@
import 'package:cake_wallet/core/wallet_name_validator.dart';
import 'package:cake_wallet/entities/generate_name.dart';
import 'package:cake_wallet/entities/seed_type.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/widgets/address_text_field.dart'; import 'package:cake_wallet/src/widgets/address_text_field.dart';
import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/src/widgets/blockchain_height_widget.dart';
import 'package:cake_wallet/src/widgets/picker.dart';
import 'package:cake_wallet/src/widgets/seed_language_picker.dart';
import 'package:cake_wallet/src/widgets/seed_widget.dart';
import 'package:cake_wallet/themes/extensions/address_theme.dart';
import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
import 'package:cake_wallet/utils/show_bar.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/seed_type_view_model.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mobx/mobx.dart';
import 'package:polyseed/polyseed.dart';
class VerifyForm extends StatefulWidget { class VerifyForm extends StatefulWidget {
VerifyForm({ VerifyForm({

View file

@ -3,52 +3,61 @@ import 'package:cake_wallet/entities/exchange_api_mode.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cake_wallet/entities/seed_phrase_length.dart'; import 'package:cake_wallet/entities/seed_phrase_length.dart';
import 'package:cake_wallet/entities/seed_type.dart'; import 'package:cake_wallet/entities/seed_type.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/nodes/widgets/node_form.dart'; import 'package:cake_wallet/src/screens/nodes/widgets/node_form.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
import 'package:cake_wallet/themes/extensions/new_wallet_theme.dart'; import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart';
import 'package:cake_wallet/view_model/seed_type_view_model.dart';
import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/themes/extensions/new_wallet_theme.dart';
import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart';
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
class AdvancedPrivacySettingsPage extends BasePage { class AdvancedPrivacySettingsPage extends BasePage {
AdvancedPrivacySettingsPage(this.useTestnet, this.toggleUseTestnet, AdvancedPrivacySettingsPage({
this.advancedPrivacySettingsViewModel, this.nodeViewModel, this.seedTypeViewModel); required this.isFromRestore,
required this.useTestnet,
required this.toggleUseTestnet,
required this.advancedPrivacySettingsViewModel,
required this.nodeViewModel,
required this.seedSettingsViewModel,
});
final AdvancedPrivacySettingsViewModel advancedPrivacySettingsViewModel; final AdvancedPrivacySettingsViewModel advancedPrivacySettingsViewModel;
final NodeCreateOrEditViewModel nodeViewModel; final NodeCreateOrEditViewModel nodeViewModel;
final SeedTypeViewModel seedTypeViewModel; final SeedSettingsViewModel seedSettingsViewModel;
@override @override
String get title => S.current.privacy_settings; String get title => S.current.privacy_settings;
final bool isFromRestore;
final bool useTestnet; final bool useTestnet;
final Function(bool? val) toggleUseTestnet; final Function(bool? val) toggleUseTestnet;
@override @override
Widget body(BuildContext context) => AdvancedPrivacySettingsBody(useTestnet, toggleUseTestnet, Widget body(BuildContext context) => _AdvancedPrivacySettingsBody(isFromRestore, useTestnet,
advancedPrivacySettingsViewModel, nodeViewModel, seedTypeViewModel); toggleUseTestnet, advancedPrivacySettingsViewModel, nodeViewModel, seedSettingsViewModel);
} }
class AdvancedPrivacySettingsBody extends StatefulWidget { class _AdvancedPrivacySettingsBody extends StatefulWidget {
const AdvancedPrivacySettingsBody(this.useTestnet, this.toggleUseTestnet, const _AdvancedPrivacySettingsBody(this.isFromRestore, this.useTestnet, this.toggleUseTestnet,
this.privacySettingsViewModel, this.nodeViewModel, this.seedTypeViewModel, this.privacySettingsViewModel, this.nodeViewModel, this.seedTypeViewModel,
{Key? key}) {Key? key})
: super(key: key); : super(key: key);
final AdvancedPrivacySettingsViewModel privacySettingsViewModel; final AdvancedPrivacySettingsViewModel privacySettingsViewModel;
final NodeCreateOrEditViewModel nodeViewModel; final NodeCreateOrEditViewModel nodeViewModel;
final SeedTypeViewModel seedTypeViewModel; final SeedSettingsViewModel seedTypeViewModel;
final bool isFromRestore;
final bool useTestnet; final bool useTestnet;
final Function(bool? val) toggleUseTestnet; final Function(bool? val) toggleUseTestnet;
@ -56,15 +65,23 @@ class AdvancedPrivacySettingsBody extends StatefulWidget {
_AdvancedPrivacySettingsBodyState createState() => _AdvancedPrivacySettingsBodyState(); _AdvancedPrivacySettingsBodyState createState() => _AdvancedPrivacySettingsBodyState();
} }
class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBody> { class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBody> {
_AdvancedPrivacySettingsBodyState(); final TextEditingController passphraseController = TextEditingController();
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
bool? testnetValue; bool? testnetValue;
@override
void initState() {
passphraseController.text = widget.seedTypeViewModel.passphrase ?? '';
passphraseController
.addListener(() => widget.seedTypeViewModel.setPassphrase(passphraseController.text));
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (testnetValue == null && widget.useTestnet != null) { if (testnetValue == null && widget.useTestnet) {
testnetValue = widget.useTestnet; testnetValue = widget.useTestnet;
} }
@ -97,6 +114,52 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
), ),
); );
}), }),
if (widget.privacySettingsViewModel.hasSeedTypeOption)
Observer(builder: (_) {
return SettingsChoicesCell(
ChoicesListItem<MoneroSeedType>(
title: S.current.seedtype,
items: MoneroSeedType.all,
selectedItem: widget.seedTypeViewModel.moneroSeedType,
onItemSelected: widget.seedTypeViewModel.setMoneroSeedType,
),
);
}),
if ([WalletType.bitcoin, WalletType.litecoin]
.contains(widget.privacySettingsViewModel.type))
Observer(builder: (_) {
return SettingsChoicesCell(
ChoicesListItem<BitcoinSeedType>(
title: S.current.seedtype,
items: BitcoinSeedType.all,
selectedItem: widget.seedTypeViewModel.bitcoinSeedType,
onItemSelected: widget.seedTypeViewModel.setBitcoinSeedType,
),
);
}),
if (!widget.isFromRestore) ...[
Observer(builder: (_) {
if (widget.privacySettingsViewModel.hasSeedPhraseLengthOption)
return SettingsPickerCell<SeedPhraseLength>(
title: S.current.seed_phrase_length,
items: SeedPhraseLength.values,
selectedItem: widget.privacySettingsViewModel.seedPhraseLength,
onItemSelected: (SeedPhraseLength length) {
widget.privacySettingsViewModel.setSeedPhraseLength(length);
},
);
return Container();
}),
if (widget.privacySettingsViewModel.hasPassphraseOption)
Padding(
padding: EdgeInsets.all(24),
child: BaseTextFormField(
hintText: S.current.passphrase,
controller: passphraseController,
obscureText: true,
),
),
],
Observer(builder: (_) { Observer(builder: (_) {
return Column( return Column(
children: [ children: [
@ -122,31 +185,9 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
], ],
); );
}), }),
if (widget.privacySettingsViewModel.hasSeedPhraseLengthOption)
Observer(builder: (_) {
return SettingsPickerCell<SeedPhraseLength>(
title: S.current.seed_phrase_length,
items: SeedPhraseLength.values,
selectedItem: widget.privacySettingsViewModel.seedPhraseLength,
onItemSelected: (SeedPhraseLength length) {
widget.privacySettingsViewModel.setSeedPhraseLength(length);
},
);
}),
if (widget.privacySettingsViewModel.hasSeedTypeOption)
Observer(builder: (_) {
return SettingsChoicesCell(
ChoicesListItem<SeedType>(
title: S.current.seedtype,
items: SeedType.all,
selectedItem: widget.seedTypeViewModel.moneroSeedType,
onItemSelected: widget.seedTypeViewModel.setMoneroSeedType,
),
);
}),
if (widget.privacySettingsViewModel.type == WalletType.bitcoin) if (widget.privacySettingsViewModel.type == WalletType.bitcoin)
Builder(builder: (_) { Builder(builder: (_) {
final val = testnetValue!; final val = testnetValue ?? false;
return SettingsSwitcherCell( return SettingsSwitcherCell(
title: S.current.use_testnet, title: S.current.use_testnet,
value: val, value: val,
@ -154,7 +195,7 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
setState(() { setState(() {
testnetValue = !val; testnetValue = !val;
}); });
widget.toggleUseTestnet!.call(testnetValue); widget.toggleUseTestnet.call(testnetValue);
}); });
}), }),
], ],
@ -203,4 +244,11 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
), ),
); );
} }
@override
void dispose() {
passphraseController
.removeListener(() => widget.seedTypeViewModel.setPassphrase(passphraseController.text));
super.dispose();
}
} }

View file

@ -1,36 +1,35 @@
import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/core/wallet_name_validator.dart';
import 'package:cake_wallet/entities/generate_name.dart'; import 'package:cake_wallet/entities/generate_name.dart';
import 'package:cake_wallet/src/screens/new_wallet/widgets/select_button.dart'; import 'package:cake_wallet/entities/seed_type.dart';
import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/main.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/themes/theme_base.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/seed_type_view_model.dart';
import 'package:mobx/mobx.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/core/wallet_name_validator.dart';
import 'package:cake_wallet/src/widgets/seed_language_selector.dart';
import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/widgets/select_button.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/src/widgets/picker.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/src/widgets/seed_language_picker.dart'; import 'package:cake_wallet/src/widgets/seed_language_picker.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/seed_language_selector.dart';
import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cake_wallet/view_model/wallet_new_vm.dart';
import 'package:cake_wallet/themes/extensions/new_wallet_theme.dart'; import 'package:cake_wallet/themes/extensions/new_wallet_theme.dart';
import 'package:cake_wallet/themes/extensions/send_page_theme.dart'; import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
import 'package:cake_wallet/entities/seed_type.dart'; import 'package:cake_wallet/themes/theme_base.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_new_vm.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobx/mobx.dart';
class NewWalletPage extends BasePage { class NewWalletPage extends BasePage {
NewWalletPage(this._walletNewVM, this._seedTypeViewModel); NewWalletPage(this._walletNewVM, this._seedSettingsViewModel);
final WalletNewVM _walletNewVM; final WalletNewVM _walletNewVM;
final SeedTypeViewModel _seedTypeViewModel; final SeedSettingsViewModel _seedSettingsViewModel;
final walletNameImage = Image.asset('assets/images/wallet_name.png'); final walletNameImage = Image.asset('assets/images/wallet_name.png');
@ -51,15 +50,15 @@ class NewWalletPage extends BasePage {
Widget body(BuildContext context) => WalletNameForm( Widget body(BuildContext context) => WalletNameForm(
_walletNewVM, _walletNewVM,
currentTheme.type == ThemeType.dark ? walletNameImage : walletNameLightImage, currentTheme.type == ThemeType.dark ? walletNameImage : walletNameLightImage,
_seedTypeViewModel); _seedSettingsViewModel);
} }
class WalletNameForm extends StatefulWidget { class WalletNameForm extends StatefulWidget {
WalletNameForm(this._walletNewVM, this.walletImage, this._seedTypeViewModel); WalletNameForm(this._walletNewVM, this.walletImage, this._seedSettingsViewModel);
final WalletNewVM _walletNewVM; final WalletNewVM _walletNewVM;
final Image walletImage; final Image walletImage;
final SeedTypeViewModel _seedTypeViewModel; final SeedSettingsViewModel _seedSettingsViewModel;
@override @override
_WalletNameFormState createState() => _WalletNameFormState(_walletNewVM); _WalletNameFormState createState() => _WalletNameFormState(_walletNewVM);
@ -110,7 +109,7 @@ class _WalletNameFormState extends State<WalletNameForm> {
} }
}); });
_setSeedType(SeedType.defaultSeedType); _setSeedType(MoneroSeedType.defaultSeedType);
super.initState(); super.initState();
} }
@ -285,12 +284,12 @@ class _WalletNameFormState extends State<WalletNameForm> {
builder: (BuildContext build) => Padding( builder: (BuildContext build) => Padding(
padding: EdgeInsets.only(top: 24), padding: EdgeInsets.only(top: 24),
child: SelectButton( child: SelectButton(
text: widget._seedTypeViewModel.moneroSeedType.title, text: widget._seedSettingsViewModel.moneroSeedType.title,
onTap: () async { onTap: () async {
await showPopUp<void>( await showPopUp<void>(
context: context, context: context,
builder: (_) => Picker( builder: (_) => Picker(
items: SeedType.all, items: MoneroSeedType.all,
selectedAtIndex: isPolyseed ? 1 : 0, selectedAtIndex: isPolyseed ? 1 : 0,
onItemSelected: _setSeedType, onItemSelected: _setSeedType,
isSeparated: false, isSeparated: false,
@ -308,8 +307,8 @@ class _WalletNameFormState extends State<WalletNameForm> {
key: _languageSelectorKey, key: _languageSelectorKey,
initialSelected: defaultSeedLanguage, initialSelected: defaultSeedLanguage,
seedType: _walletNewVM.hasSeedType seedType: _walletNewVM.hasSeedType
? widget._seedTypeViewModel.moneroSeedType ? widget._seedSettingsViewModel.moneroSeedType
: SeedType.legacy, : MoneroSeedType.legacy,
), ),
), ),
) )
@ -380,10 +379,10 @@ class _WalletNameFormState extends State<WalletNameForm> {
_formProcessing = false; _formProcessing = false;
} }
bool get isPolyseed => widget._seedTypeViewModel.moneroSeedType == SeedType.polyseed; bool get isPolyseed => widget._seedSettingsViewModel.moneroSeedType == MoneroSeedType.polyseed;
void _setSeedType(SeedType item) { void _setSeedType(MoneroSeedType item) {
widget._seedTypeViewModel.setMoneroSeedType(item); widget._seedSettingsViewModel.setMoneroSeedType(item);
_languageSelectorKey.currentState?.selected = defaultSeedLanguage; // Reset Seed language _languageSelectorKey.currentState?.selected = defaultSeedLanguage; // Reset Seed language
} }
} }

View file

@ -35,6 +35,7 @@ class RescanPage extends BasePage {
isSilentPaymentsScan: _rescanViewModel.isSilentPaymentsScan, isSilentPaymentsScan: _rescanViewModel.isSilentPaymentsScan,
isMwebScan: _rescanViewModel.isMwebScan, isMwebScan: _rescanViewModel.isMwebScan,
doSingleScan: _rescanViewModel.doSingleScan, doSingleScan: _rescanViewModel.doSingleScan,
hasDatePicker: !_rescanViewModel.isMwebScan,
toggleSingleScan: () => toggleSingleScan: () =>
_rescanViewModel.doSingleScan = !_rescanViewModel.doSingleScan, _rescanViewModel.doSingleScan = !_rescanViewModel.doSingleScan,
walletType: _rescanViewModel.wallet.type, walletType: _rescanViewModel.wallet.type,

View file

@ -9,35 +9,34 @@ import 'package:cake_wallet/src/widgets/seed_language_picker.dart';
import 'package:cake_wallet/src/widgets/seed_widget.dart'; import 'package:cake_wallet/src/widgets/seed_widget.dart';
import 'package:cake_wallet/themes/extensions/send_page_theme.dart'; import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/seed_type_view_model.dart'; import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:polyseed/polyseed.dart'; import 'package:polyseed/polyseed.dart';
class WalletRestoreFromSeedForm extends StatefulWidget { class WalletRestoreFromSeedForm extends StatefulWidget {
WalletRestoreFromSeedForm( WalletRestoreFromSeedForm({Key? key,
{Key? key, required this.displayLanguageSelector,
required this.displayLanguageSelector, required this.displayBlockHeightSelector,
required this.displayBlockHeightSelector, required this.displayPassphrase,
required this.displayPassphrase, required this.type,
required this.type, required this.displayWalletPassword,
required this.displayWalletPassword, required this.seedSettingsViewModel,
required this.seedTypeViewModel, this.blockHeightFocusNode,
this.blockHeightFocusNode, this.onHeightOrDateEntered,
this.onHeightOrDateEntered, this.onSeedChange,
this.onSeedChange, this.onLanguageChange,
this.onLanguageChange, this.onPasswordChange,
this.onPasswordChange, this.onRepeatedPasswordChange,
this.onRepeatedPasswordChange}) }) : super(key: key);
: super(key: key);
final WalletType type; final WalletType type;
final bool displayLanguageSelector; final bool displayLanguageSelector;
final bool displayBlockHeightSelector; final bool displayBlockHeightSelector;
final bool displayWalletPassword; final bool displayWalletPassword;
final bool displayPassphrase; final bool displayPassphrase;
final SeedTypeViewModel seedTypeViewModel; final SeedSettingsViewModel seedSettingsViewModel;
final FocusNode? blockHeightFocusNode; final FocusNode? blockHeightFocusNode;
final Function(bool)? onHeightOrDateEntered; final Function(bool)? onHeightOrDateEntered;
final void Function(String)? onSeedChange; final void Function(String)? onSeedChange;
@ -58,7 +57,9 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
languageController = TextEditingController(), languageController = TextEditingController(),
nameTextEditingController = TextEditingController(), nameTextEditingController = TextEditingController(),
passwordTextEditingController = displayWalletPassword ? TextEditingController() : null, passwordTextEditingController = displayWalletPassword ? TextEditingController() : null,
repeatedPasswordTextEditingController = displayWalletPassword ? TextEditingController() : null, repeatedPasswordTextEditingController = displayWalletPassword
? TextEditingController()
: null,
passphraseController = TextEditingController(), passphraseController = TextEditingController(),
seedTypeController = TextEditingController(); seedTypeController = TextEditingController();
@ -75,10 +76,11 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
String language; String language;
void Function()? passwordListener; void Function()? passwordListener;
void Function()? repeatedPasswordListener; void Function()? repeatedPasswordListener;
void Function()? passphraseListener;
@override @override
void initState() { void initState() {
_setSeedType(widget.seedTypeViewModel.moneroSeedType); _setSeedType(widget.seedSettingsViewModel.moneroSeedType);
_setLanguageLabel(language); _setLanguageLabel(language);
if (passwordTextEditingController != null) { if (passwordTextEditingController != null) {
@ -87,14 +89,19 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
} }
if (repeatedPasswordTextEditingController != null) { if (repeatedPasswordTextEditingController != null) {
repeatedPasswordListener = () => widget.onRepeatedPasswordChange?.call(repeatedPasswordTextEditingController!.text); repeatedPasswordListener =
() => widget.onRepeatedPasswordChange?.call(repeatedPasswordTextEditingController!.text);
repeatedPasswordTextEditingController?.addListener(repeatedPasswordListener!); repeatedPasswordTextEditingController?.addListener(repeatedPasswordListener!);
} }
passphraseListener = () => widget.seedSettingsViewModel.setPassphrase(passphraseController.text);
passphraseController.addListener(passphraseListener!);
moneroSeedTypeReaction = moneroSeedTypeReaction =
reaction((_) => widget.seedTypeViewModel.moneroSeedType, (SeedType item) { reaction((_) => widget.seedSettingsViewModel.moneroSeedType, (MoneroSeedType item) {
_setSeedType(item); _setSeedType(item);
_changeLanguage('English'); _changeLanguage('English');
}); });
super.initState(); super.initState();
} }
@ -110,6 +117,9 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
if (repeatedPasswordListener != null) { if (repeatedPasswordListener != null) {
repeatedPasswordTextEditingController?.removeListener(repeatedPasswordListener!); repeatedPasswordTextEditingController?.removeListener(repeatedPasswordListener!);
} }
passphraseController.removeListener(passphraseListener!);
super.dispose(); super.dispose();
} }
@ -118,11 +128,13 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
Polyseed.isValidSeed(seed)) { Polyseed.isValidSeed(seed)) {
final lang = PolyseedLang.getByPhrase(seed); final lang = PolyseedLang.getByPhrase(seed);
_changeSeedType(SeedType.polyseed); _changeSeedType(MoneroSeedType.polyseed);
_changeLanguage(lang.nameEnglish); _changeLanguage(lang.nameEnglish);
} }
if (widget.type == WalletType.wownero && seed.split(" ").length == 14) { if (widget.type == WalletType.wownero && seed
_changeSeedType(SeedType.wowneroSeed); .split(" ")
.length == 14) {
_changeSeedType(MoneroSeedType.wowneroSeed);
_changeLanguage("English"); _changeLanguage("English");
} }
widget.onSeedChange?.call(seed); widget.onSeedChange?.call(seed);
@ -140,7 +152,9 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
children: [ children: [
BaseTextFormField( BaseTextFormField(
controller: nameTextEditingController, controller: nameTextEditingController,
hintText: S.of(context).wallet_name, hintText: S
.of(context)
.wallet_name,
suffixIcon: IconButton( suffixIcon: IconButton(
onPressed: () async { onPressed: () async {
final rName = await generateName(); final rName = await generateName();
@ -156,7 +170,9 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.0), borderRadius: BorderRadius.circular(6.0),
color: Theme.of(context).hintColor, color: Theme
.of(context)
.hintColor,
), ),
width: 34, width: 34,
height: 34, height: 34,
@ -183,13 +199,14 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
onTap: () async { onTap: () async {
await showPopUp<void>( await showPopUp<void>(
context: context, context: context,
builder: (_) => Picker( builder: (_) =>
Picker(
items: _getItems(), items: _getItems(),
selectedAtIndex: isPolyseed selectedAtIndex: isPolyseed
? 1 ? 1
: seedTypeController.value.text.contains("14") : seedTypeController.value.text.contains("14")
? 2 ? 2
: 0, : 0,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
onItemSelected: _changeSeedType, onItemSelected: _changeSeedType,
isSeparated: false, isSeparated: false,
@ -211,37 +228,43 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
if (widget.displayWalletPassword) if (widget.displayWalletPassword)
...[BaseTextFormField( ...[BaseTextFormField(
controller: passwordTextEditingController, controller: passwordTextEditingController,
hintText: S.of(context).password, hintText: S
.of(context)
.password,
obscureText: true), obscureText: true),
BaseTextFormField( BaseTextFormField(
controller: repeatedPasswordTextEditingController, controller: repeatedPasswordTextEditingController,
hintText: S.of(context).repeat_wallet_password, hintText: S
obscureText: true)], .of(context)
.repeat_wallet_password,
obscureText: true)
],
if (widget.displayLanguageSelector) if (widget.displayLanguageSelector)
if (!seedTypeController.value.text.contains("14") && widget.displayLanguageSelector) if (!seedTypeController.value.text.contains("14") && widget.displayLanguageSelector)
GestureDetector( GestureDetector(
onTap: () async { onTap: () async {
await showPopUp<void>( await showPopUp<void>(
context: context, context: context,
builder: (_) => SeedLanguagePicker( builder: (_) =>
selected: language, SeedLanguagePicker(
onItemSelected: _changeLanguage, selected: language,
seedType: isPolyseed ? SeedType.polyseed : SeedType.legacy, onItemSelected: _changeLanguage,
)); seedType: isPolyseed ? MoneroSeedType.polyseed : MoneroSeedType.legacy,
}, ));
child: Container( },
color: Colors.transparent, child: Container(
padding: EdgeInsets.only(top: 20.0), color: Colors.transparent,
child: IgnorePointer( padding: EdgeInsets.only(top: 20.0),
child: BaseTextFormField( child: IgnorePointer(
controller: languageController, child: BaseTextFormField(
enableInteractiveSelection: false, controller: languageController,
readOnly: true, enableInteractiveSelection: false,
suffixIcon: expandIcon, readOnly: true,
suffixIcon: expandIcon,
),
), ),
), ),
), ),
),
if ((!isPolyseed) && widget.displayBlockHeightSelector) if ((!isPolyseed) && widget.displayBlockHeightSelector)
BlockchainHeightWidget( BlockchainHeightWidget(
focusNode: widget.blockHeightFocusNode, focusNode: widget.blockHeightFocusNode,
@ -262,17 +285,20 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
} }
bool get isPolyseed => bool get isPolyseed =>
widget.seedTypeViewModel.moneroSeedType == SeedType.polyseed && widget.seedSettingsViewModel.moneroSeedType == MoneroSeedType.polyseed &&
(widget.type == WalletType.monero || widget.type == WalletType.wownero); (widget.type == WalletType.monero || widget.type == WalletType.wownero);
Widget get expandIcon => Container( Widget get expandIcon =>
Container(
padding: EdgeInsets.all(18), padding: EdgeInsets.all(18),
width: 24, width: 24,
height: 24, height: 24,
child: Image.asset( child: Image.asset(
'assets/images/arrow_bottom_purple_icon.png', 'assets/images/arrow_bottom_purple_icon.png',
height: 8, height: 8,
color: Theme.of(context).hintColor, color: Theme
.of(context)
.hintColor,
), ),
); );
@ -280,8 +306,8 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
final setLang = isPolyseed final setLang = isPolyseed
? "POLYSEED_$language" ? "POLYSEED_$language"
: seedTypeController.value.text.contains("14") : seedTypeController.value.text.contains("14")
? "WOWSEED_" + language ? "WOWSEED_" + language
: language; : language;
setState(() { setState(() {
this.language = setLang; this.language = setLang;
seedWidgetStateKey.currentState!.changeSeedLanguage(setLang); seedWidgetStateKey.currentState!.changeSeedLanguage(setLang);
@ -293,24 +319,24 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
void _setLanguageLabel(String language) => void _setLanguageLabel(String language) =>
languageController.text = '${language.replaceAll("POLYSEED_", "")} (Seed language)'; languageController.text = '${language.replaceAll("POLYSEED_", "")} (Seed language)';
void _changeSeedType(SeedType item) { void _changeSeedType(MoneroSeedType item) {
_setSeedType(item); _setSeedType(item);
_changeLanguage('English'); _changeLanguage('English');
widget.seedTypeViewModel.setMoneroSeedType(item); widget.seedSettingsViewModel.setMoneroSeedType(item);
} }
void _setSeedType(SeedType item) { void _setSeedType(MoneroSeedType item) {
seedTypeController.text = item.toString(); seedTypeController.text = item.toString();
} }
List<SeedType> _getItems() { List<MoneroSeedType> _getItems() {
switch (widget.type) { switch (widget.type) {
case WalletType.monero: case WalletType.monero:
return [SeedType.legacy, SeedType.polyseed]; return [MoneroSeedType.legacy, MoneroSeedType.polyseed];
case WalletType.wownero: case WalletType.wownero:
return [SeedType.legacy, SeedType.polyseed, SeedType.wowneroSeed]; return [MoneroSeedType.legacy, MoneroSeedType.polyseed, MoneroSeedType.wowneroSeed];
default: default:
return [SeedType.legacy]; return [MoneroSeedType.legacy];
} }
} }
} }

View file

@ -12,7 +12,7 @@ import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/restore/restore_mode.dart'; import 'package:cake_wallet/view_model/restore/restore_mode.dart';
import 'package:cake_wallet/view_model/seed_type_view_model.dart'; import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_restore_view_model.dart'; import 'package:cake_wallet/view_model/wallet_restore_view_model.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
@ -23,7 +23,7 @@ import 'package:mobx/mobx.dart';
import 'package:smooth_page_indicator/smooth_page_indicator.dart'; import 'package:smooth_page_indicator/smooth_page_indicator.dart';
class WalletRestorePage extends BasePage { class WalletRestorePage extends BasePage {
WalletRestorePage(this.walletRestoreViewModel, this.seedTypeViewModel) WalletRestorePage(this.walletRestoreViewModel, this.seedSettingsViewModel)
: walletRestoreFromSeedFormKey = GlobalKey<WalletRestoreFromSeedFormState>(), : walletRestoreFromSeedFormKey = GlobalKey<WalletRestoreFromSeedFormState>(),
walletRestoreFromKeysFormKey = GlobalKey<WalletRestoreFromKeysFromState>(), walletRestoreFromKeysFormKey = GlobalKey<WalletRestoreFromKeysFromState>(),
_pages = [], _pages = [],
@ -33,7 +33,7 @@ class WalletRestorePage extends BasePage {
switch (mode) { switch (mode) {
case WalletRestoreMode.seed: case WalletRestoreMode.seed:
_pages.add(WalletRestoreFromSeedForm( _pages.add(WalletRestoreFromSeedForm(
seedTypeViewModel: seedTypeViewModel, seedSettingsViewModel: seedSettingsViewModel,
displayBlockHeightSelector: displayBlockHeightSelector:
walletRestoreViewModel.hasBlockchainHeightLanguageSelector, walletRestoreViewModel.hasBlockchainHeightLanguageSelector,
displayLanguageSelector: walletRestoreViewModel.hasSeedLanguageSelector, displayLanguageSelector: walletRestoreViewModel.hasSeedLanguageSelector,
@ -96,7 +96,7 @@ class WalletRestorePage extends BasePage {
)); ));
final WalletRestoreViewModel walletRestoreViewModel; final WalletRestoreViewModel walletRestoreViewModel;
final SeedTypeViewModel seedTypeViewModel; final SeedSettingsViewModel seedSettingsViewModel;
final PageController _controller; final PageController _controller;
final List<Widget> _pages; final List<Widget> _pages;
final GlobalKey<WalletRestoreFromSeedFormState> walletRestoreFromSeedFormKey; final GlobalKey<WalletRestoreFromSeedFormState> walletRestoreFromSeedFormKey;
@ -233,6 +233,7 @@ class WalletRestorePage extends BasePage {
onTap: () { onTap: () {
Navigator.of(context) Navigator.of(context)
.pushNamed(Routes.advancedPrivacySettings, arguments: { .pushNamed(Routes.advancedPrivacySettings, arguments: {
'isFromRestore': true,
'type': walletRestoreViewModel.type, 'type': walletRestoreViewModel.type,
'useTestnet': walletRestoreViewModel.useTestnet, 'useTestnet': walletRestoreViewModel.useTestnet,
'toggleTestnet': walletRestoreViewModel.toggleUseTestnet 'toggleTestnet': walletRestoreViewModel.toggleUseTestnet
@ -322,8 +323,7 @@ class WalletRestorePage extends BasePage {
} }
if (walletRestoreViewModel.hasPassphrase) { if (walletRestoreViewModel.hasPassphrase) {
credentials['passphrase'] = credentials['passphrase'] = seedSettingsViewModel.passphrase;
walletRestoreFromSeedFormKey.currentState!.passphraseController.text;
} }
credentials['name'] = credentials['name'] =
@ -426,6 +426,7 @@ class WalletRestorePage extends BasePage {
} }
await walletRestoreViewModel.create(options: _credentials()); await walletRestoreViewModel.create(options: _credentials());
seedSettingsViewModel.setPassphrase(null);
} catch (e) { } catch (e) {
_formProcessing = false; _formProcessing = false;
rethrow; rethrow;

View file

@ -6,7 +6,9 @@ import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart'; import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -111,6 +113,33 @@ class PrivacyPage extends BasePage {
_privacySettingsViewModel.setUseTronGrid(value); _privacySettingsViewModel.setUseTronGrid(value);
}, },
), ),
if (_privacySettingsViewModel.canUseMempoolFeeAPI)
SettingsSwitcherCell(
title: S.current.live_fee_rates,
value: _privacySettingsViewModel.useMempoolFeeAPI,
onValueChange: (BuildContext _, bool isEnabled) async {
if (!isEnabled) {
final bool confirmation = await showPopUp<bool>(
context: context,
builder: (BuildContext context) {
return AlertWithTwoActions(
alertTitle: S.of(context).warning,
alertContent: S.of(context).disable_fee_api_warning,
rightButtonText: S.of(context).confirm,
leftButtonText: S.of(context).cancel,
actionRightButton: () => Navigator.of(context).pop(true),
actionLeftButton: () => Navigator.of(context).pop(false));
}) ??
false;
if (confirmation) {
_privacySettingsViewModel.setUseMempoolFeeAPI(isEnabled);
}
return;
}
_privacySettingsViewModel.setUseMempoolFeeAPI(isEnabled);
},
),
SettingsCellWithArrow( SettingsCellWithArrow(
title: S.current.domain_looks_up, title: S.current.domain_looks_up,
handler: (context) => Navigator.of(context).pushNamed(Routes.domainLookupsPage), handler: (context) => Navigator.of(context).pushNamed(Routes.domainLookupsPage),

View file

@ -11,36 +11,36 @@ class SeedLanguagePickerOption {
final String name; final String name;
final String nameLocalized; final String nameLocalized;
final Image image; final Image image;
final List<SeedType> supportedSeedTypes; final List<MoneroSeedType> supportedSeedTypes;
} }
final List<SeedLanguagePickerOption> seedLanguages = [ final List<SeedLanguagePickerOption> seedLanguages = [
SeedLanguagePickerOption('English', S.current.seed_language_english, SeedLanguagePickerOption('English', S.current.seed_language_english,
Image.asset('assets/images/flags/usa.png'), [SeedType.legacy, SeedType.polyseed]), Image.asset('assets/images/flags/usa.png'), [MoneroSeedType.legacy, MoneroSeedType.polyseed]),
SeedLanguagePickerOption('Chinese (Simplified)', S.current.seed_language_chinese, SeedLanguagePickerOption('Chinese (Simplified)', S.current.seed_language_chinese,
Image.asset('assets/images/flags/chn.png'), [SeedType.legacy, SeedType.polyseed]), Image.asset('assets/images/flags/chn.png'), [MoneroSeedType.legacy, MoneroSeedType.polyseed]),
SeedLanguagePickerOption('Chinese (Traditional)', S.current.seed_language_chinese_traditional, SeedLanguagePickerOption('Chinese (Traditional)', S.current.seed_language_chinese_traditional,
Image.asset('assets/images/flags/chn.png'), [SeedType.polyseed]), Image.asset('assets/images/flags/chn.png'), [MoneroSeedType.polyseed]),
SeedLanguagePickerOption('Dutch', S.current.seed_language_dutch, SeedLanguagePickerOption('Dutch', S.current.seed_language_dutch,
Image.asset('assets/images/flags/nld.png'), [SeedType.legacy]), Image.asset('assets/images/flags/nld.png'), [MoneroSeedType.legacy]),
SeedLanguagePickerOption('German', S.current.seed_language_german, SeedLanguagePickerOption('German', S.current.seed_language_german,
Image.asset('assets/images/flags/deu.png'), [SeedType.legacy]), Image.asset('assets/images/flags/deu.png'), [MoneroSeedType.legacy]),
SeedLanguagePickerOption('Japanese', S.current.seed_language_japanese, SeedLanguagePickerOption('Japanese', S.current.seed_language_japanese,
Image.asset('assets/images/flags/jpn.png'), [SeedType.legacy, SeedType.polyseed]), Image.asset('assets/images/flags/jpn.png'), [MoneroSeedType.legacy, MoneroSeedType.polyseed]),
SeedLanguagePickerOption('Korean', S.current.seed_language_korean, SeedLanguagePickerOption('Korean', S.current.seed_language_korean,
Image.asset('assets/images/flags/kor.png'), [SeedType.polyseed]), Image.asset('assets/images/flags/kor.png'), [MoneroSeedType.polyseed]),
SeedLanguagePickerOption('Portuguese', S.current.seed_language_portuguese, SeedLanguagePickerOption('Portuguese', S.current.seed_language_portuguese,
Image.asset('assets/images/flags/prt.png'), [SeedType.legacy, SeedType.polyseed]), Image.asset('assets/images/flags/prt.png'), [MoneroSeedType.legacy, MoneroSeedType.polyseed]),
SeedLanguagePickerOption('Russian', S.current.seed_language_russian, SeedLanguagePickerOption('Russian', S.current.seed_language_russian,
Image.asset('assets/images/flags/rus.png'), [SeedType.legacy]), Image.asset('assets/images/flags/rus.png'), [MoneroSeedType.legacy]),
SeedLanguagePickerOption('Czech', S.current.seed_language_czech, SeedLanguagePickerOption('Czech', S.current.seed_language_czech,
Image.asset('assets/images/flags/czk.png'), [SeedType.polyseed]), Image.asset('assets/images/flags/czk.png'), [MoneroSeedType.polyseed]),
SeedLanguagePickerOption('Spanish', S.current.seed_language_spanish, SeedLanguagePickerOption('Spanish', S.current.seed_language_spanish,
Image.asset('assets/images/flags/esp.png'), [SeedType.legacy, SeedType.polyseed]), Image.asset('assets/images/flags/esp.png'), [MoneroSeedType.legacy, MoneroSeedType.polyseed]),
SeedLanguagePickerOption('French', S.current.seed_language_french, SeedLanguagePickerOption('French', S.current.seed_language_french,
Image.asset('assets/images/flags/fra.png'), [SeedType.legacy, SeedType.polyseed]), Image.asset('assets/images/flags/fra.png'), [MoneroSeedType.legacy, MoneroSeedType.polyseed]),
SeedLanguagePickerOption('Italian', S.current.seed_language_italian, SeedLanguagePickerOption('Italian', S.current.seed_language_italian,
Image.asset('assets/images/flags/ita.png'), [SeedType.legacy, SeedType.polyseed]), Image.asset('assets/images/flags/ita.png'), [MoneroSeedType.legacy, MoneroSeedType.polyseed]),
]; ];
const defaultSeedLanguage = 'English'; const defaultSeedLanguage = 'English';
@ -51,11 +51,11 @@ class SeedLanguagePicker extends StatefulWidget {
SeedLanguagePicker( SeedLanguagePicker(
{Key? key, {Key? key,
this.selected = defaultSeedLanguage, this.selected = defaultSeedLanguage,
this.seedType = SeedType.defaultSeedType, this.seedType = MoneroSeedType.defaultSeedType,
required this.onItemSelected}) required this.onItemSelected})
: super(key: key); : super(key: key);
final SeedType seedType; final MoneroSeedType seedType;
final String selected; final String selected;
final Function(String) onItemSelected; final Function(String) onItemSelected;
@ -68,7 +68,7 @@ class SeedLanguagePickerState extends State<SeedLanguagePicker> {
SeedLanguagePickerState( SeedLanguagePickerState(
{required this.selected, required this.onItemSelected, required this.seedType}); {required this.selected, required this.onItemSelected, required this.seedType});
final SeedType seedType; final MoneroSeedType seedType;
final String selected; final String selected;
final Function(String) onItemSelected; final Function(String) onItemSelected;

View file

@ -7,11 +7,11 @@ import 'package:flutter/material.dart';
class SeedLanguageSelector extends StatefulWidget { class SeedLanguageSelector extends StatefulWidget {
SeedLanguageSelector( SeedLanguageSelector(
{Key? key, required this.initialSelected, this.seedType = SeedType.defaultSeedType}) {Key? key, required this.initialSelected, this.seedType = MoneroSeedType.defaultSeedType})
: super(key: key); : super(key: key);
final String initialSelected; final String initialSelected;
final SeedType seedType; final MoneroSeedType seedType;
@override @override
SeedLanguageSelectorState createState() => SeedLanguageSelectorState(selected: initialSelected); SeedLanguageSelectorState createState() => SeedLanguageSelectorState(selected: initialSelected);

View file

@ -0,0 +1,11 @@
import 'package:mobx/mobx.dart';
part 'seed_settings_store.g.dart';
class SeedSettingsStore = SeedSettingsStoreBase with _$SeedSettingsStore;
abstract class SeedSettingsStoreBase with Store {
@observable
String? passphrase;
}

View file

@ -1,45 +1,46 @@
import 'dart:io'; import 'dart:io';
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
import 'package:cake_wallet/core/secure_storage.dart'; import 'package:cake_wallet/core/secure_storage.dart';
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/action_list_display_mode.dart';
import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart';
import 'package:cake_wallet/entities/provider_types.dart';
import 'package:cake_wallet/entities/cake_2fa_preset_options.dart';
import 'package:cake_wallet/entities/background_tasks.dart'; import 'package:cake_wallet/entities/background_tasks.dart';
import 'package:cake_wallet/entities/balance_display_mode.dart';
import 'package:cake_wallet/entities/cake_2fa_preset_options.dart';
import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cake_wallet/entities/exchange_api_mode.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cake_wallet/entities/fiat_currency.dart';
import 'package:cake_wallet/entities/language_service.dart';
import 'package:cake_wallet/entities/pin_code_required_duration.dart'; import 'package:cake_wallet/entities/pin_code_required_duration.dart';
import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/entities/preferences_key.dart';
import 'package:cake_wallet/entities/provider_types.dart';
import 'package:cake_wallet/entities/secret_store_key.dart'; import 'package:cake_wallet/entities/secret_store_key.dart';
import 'package:cake_wallet/entities/seed_phrase_length.dart'; import 'package:cake_wallet/entities/seed_phrase_length.dart';
import 'package:cake_wallet/entities/seed_type.dart'; import 'package:cake_wallet/entities/seed_type.dart';
import 'package:cake_wallet/entities/sort_balance_types.dart'; import 'package:cake_wallet/entities/sort_balance_types.dart';
import 'package:cake_wallet/entities/wallet_list_order_types.dart'; import 'package:cake_wallet/entities/wallet_list_order_types.dart';
import 'package:cake_wallet/polygon/polygon.dart';
import 'package:cake_wallet/exchange/provider/trocador_exchange_provider.dart';
import 'package:cake_wallet/view_model/settings/sync_mode.dart';
import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/ethereum/ethereum.dart'; import 'package:cake_wallet/ethereum/ethereum.dart';
import 'package:cake_wallet/wallet_type_utils.dart'; import 'package:cake_wallet/exchange/provider/trocador_exchange_provider.dart';
import 'package:cake_wallet/wownero/wownero.dart'; import 'package:cake_wallet/monero/monero.dart';
import 'package:cw_core/transaction_priority.dart'; import 'package:cake_wallet/polygon/polygon.dart';
import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/themes/theme_base.dart';
import 'package:cake_wallet/themes/theme_list.dart'; import 'package:cake_wallet/themes/theme_list.dart';
import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/utils/package_info.dart';
import 'package:cake_wallet/view_model/settings/sync_mode.dart';
import 'package:cake_wallet/wallet_type_utils.dart';
import 'package:cake_wallet/wownero/wownero.dart';
import 'package:cw_core/node.dart';
import 'package:cw_core/set_app_secure_native.dart';
import 'package:cw_core/transaction_priority.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:cake_wallet/utils/package_info.dart';
import 'package:cake_wallet/di.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:cake_wallet/entities/language_service.dart';
import 'package:cake_wallet/entities/balance_display_mode.dart';
import 'package:cake_wallet/entities/fiat_currency.dart';
import 'package:cw_core/node.dart';
import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/entities/action_list_display_mode.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cw_core/set_app_secure_native.dart';
part 'settings_store.g.dart'; part 'settings_store.g.dart';
@ -55,7 +56,8 @@ abstract class SettingsStoreBase with Store {
required BalanceDisplayMode initialBalanceDisplayMode, required BalanceDisplayMode initialBalanceDisplayMode,
required bool initialSaveRecipientAddress, required bool initialSaveRecipientAddress,
required AutoGenerateSubaddressStatus initialAutoGenerateSubaddressStatus, required AutoGenerateSubaddressStatus initialAutoGenerateSubaddressStatus,
required SeedType initialMoneroSeedType, required MoneroSeedType initialMoneroSeedType,
required BitcoinSeedType initialBitcoinSeedType,
required bool initialAppSecure, required bool initialAppSecure,
required bool initialDisableBuy, required bool initialDisableBuy,
required bool initialDisableSell, required bool initialDisableSell,
@ -99,6 +101,7 @@ abstract class SettingsStoreBase with Store {
required this.useEtherscan, required this.useEtherscan,
required this.usePolygonScan, required this.usePolygonScan,
required this.useTronGrid, required this.useTronGrid,
required this.useMempoolFeeAPI,
required this.defaultNanoRep, required this.defaultNanoRep,
required this.defaultBananoRep, required this.defaultBananoRep,
required this.lookupsTwitter, required this.lookupsTwitter,
@ -132,6 +135,7 @@ abstract class SettingsStoreBase with Store {
shouldSaveRecipientAddress = initialSaveRecipientAddress, shouldSaveRecipientAddress = initialSaveRecipientAddress,
autoGenerateSubaddressStatus = initialAutoGenerateSubaddressStatus, autoGenerateSubaddressStatus = initialAutoGenerateSubaddressStatus,
moneroSeedType = initialMoneroSeedType, moneroSeedType = initialMoneroSeedType,
bitcoinSeedType = initialBitcoinSeedType,
fiatApiMode = initialFiatMode, fiatApiMode = initialFiatMode,
allowBiometricalAuthentication = initialAllowBiometricalAuthentication, allowBiometricalAuthentication = initialAllowBiometricalAuthentication,
selectedCake2FAPreset = initialCake2FAPresetOptions, selectedCake2FAPreset = initialCake2FAPresetOptions,
@ -333,9 +337,14 @@ abstract class SettingsStoreBase with Store {
reaction( reaction(
(_) => moneroSeedType, (_) => moneroSeedType,
(SeedType moneroSeedType) => (MoneroSeedType moneroSeedType) =>
sharedPreferences.setInt(PreferencesKey.moneroSeedType, moneroSeedType.raw)); sharedPreferences.setInt(PreferencesKey.moneroSeedType, moneroSeedType.raw));
reaction(
(_) => bitcoinSeedType,
(BitcoinSeedType bitcoinSeedType) => sharedPreferences.setInt(
PreferencesKey.bitcoinSeedType, bitcoinSeedType.raw));
reaction( reaction(
(_) => fiatApiMode, (_) => fiatApiMode,
(FiatApiMode mode) => (FiatApiMode mode) =>
@ -412,6 +421,9 @@ abstract class SettingsStoreBase with Store {
reaction((_) => useTronGrid, reaction((_) => useTronGrid,
(bool useTronGrid) => _sharedPreferences.setBool(PreferencesKey.useTronGrid, useTronGrid)); (bool useTronGrid) => _sharedPreferences.setBool(PreferencesKey.useTronGrid, useTronGrid));
reaction((_) => useMempoolFeeAPI,
(bool useMempoolFeeAPI) => _sharedPreferences.setBool(PreferencesKey.useMempoolFeeAPI, useMempoolFeeAPI));
reaction((_) => defaultNanoRep, reaction((_) => defaultNanoRep,
(String nanoRep) => _sharedPreferences.setString(PreferencesKey.defaultNanoRep, nanoRep)); (String nanoRep) => _sharedPreferences.setString(PreferencesKey.defaultNanoRep, nanoRep));
@ -577,7 +589,8 @@ abstract class SettingsStoreBase with Store {
static const defaultAutoGenerateSubaddressStatus = AutoGenerateSubaddressStatus.initialized; static const defaultAutoGenerateSubaddressStatus = AutoGenerateSubaddressStatus.initialized;
static final walletPasswordDirectInput = Platform.isLinux; static final walletPasswordDirectInput = Platform.isLinux;
static const defaultSeedPhraseLength = SeedPhraseLength.twelveWords; static const defaultSeedPhraseLength = SeedPhraseLength.twelveWords;
static const defaultMoneroSeedType = SeedType.defaultSeedType; static const defaultMoneroSeedType = MoneroSeedType.defaultSeedType;
static const defaultBitcoinSeedType = BitcoinSeedType.defaultDerivationType;
@observable @observable
FiatCurrency fiatCurrency; FiatCurrency fiatCurrency;
@ -607,7 +620,10 @@ abstract class SettingsStoreBase with Store {
AutoGenerateSubaddressStatus autoGenerateSubaddressStatus; AutoGenerateSubaddressStatus autoGenerateSubaddressStatus;
@observable @observable
SeedType moneroSeedType; MoneroSeedType moneroSeedType;
@observable
BitcoinSeedType bitcoinSeedType;
@observable @observable
bool isAppSecure; bool isAppSecure;
@ -717,6 +733,9 @@ abstract class SettingsStoreBase with Store {
@observable @observable
bool useTronGrid; bool useTronGrid;
@observable
bool useMempoolFeeAPI;
@observable @observable
String defaultNanoRep; String defaultNanoRep;
@ -914,6 +933,7 @@ abstract class SettingsStoreBase with Store {
final useEtherscan = sharedPreferences.getBool(PreferencesKey.useEtherscan) ?? true; final useEtherscan = sharedPreferences.getBool(PreferencesKey.useEtherscan) ?? true;
final usePolygonScan = sharedPreferences.getBool(PreferencesKey.usePolygonScan) ?? true; final usePolygonScan = sharedPreferences.getBool(PreferencesKey.usePolygonScan) ?? true;
final useTronGrid = sharedPreferences.getBool(PreferencesKey.useTronGrid) ?? true; final useTronGrid = sharedPreferences.getBool(PreferencesKey.useTronGrid) ?? true;
final useMempoolFeeAPI = sharedPreferences.getBool(PreferencesKey.useMempoolFeeAPI) ?? true;
final defaultNanoRep = sharedPreferences.getString(PreferencesKey.defaultNanoRep) ?? ""; final defaultNanoRep = sharedPreferences.getString(PreferencesKey.defaultNanoRep) ?? "";
final defaultBananoRep = sharedPreferences.getString(PreferencesKey.defaultBananoRep) ?? ""; final defaultBananoRep = sharedPreferences.getString(PreferencesKey.defaultBananoRep) ?? "";
final lookupsTwitter = sharedPreferences.getBool(PreferencesKey.lookupsTwitter) ?? true; final lookupsTwitter = sharedPreferences.getBool(PreferencesKey.lookupsTwitter) ?? true;
@ -984,9 +1004,15 @@ abstract class SettingsStoreBase with Store {
final _moneroSeedType = sharedPreferences.getInt(PreferencesKey.moneroSeedType); final _moneroSeedType = sharedPreferences.getInt(PreferencesKey.moneroSeedType);
final moneroSeedType = _moneroSeedType != null final moneroSeedType = _moneroSeedType != null
? SeedType.deserialize(raw: _moneroSeedType) ? MoneroSeedType.deserialize(raw: _moneroSeedType)
: defaultMoneroSeedType; : defaultMoneroSeedType;
final _bitcoinSeedType = sharedPreferences.getInt(PreferencesKey.bitcoinSeedType);
final bitcoinSeedType = _bitcoinSeedType != null
? BitcoinSeedType.deserialize(raw: _bitcoinSeedType)
: defaultBitcoinSeedType;
final nodes = <WalletType, Node>{}; final nodes = <WalletType, Node>{};
final powNodes = <WalletType, Node>{}; final powNodes = <WalletType, Node>{};
@ -1150,6 +1176,7 @@ abstract class SettingsStoreBase with Store {
initialSaveRecipientAddress: shouldSaveRecipientAddress, initialSaveRecipientAddress: shouldSaveRecipientAddress,
initialAutoGenerateSubaddressStatus: autoGenerateSubaddressStatus, initialAutoGenerateSubaddressStatus: autoGenerateSubaddressStatus,
initialMoneroSeedType: moneroSeedType, initialMoneroSeedType: moneroSeedType,
initialBitcoinSeedType: bitcoinSeedType,
initialAppSecure: isAppSecure, initialAppSecure: isAppSecure,
initialDisableBuy: disableBuy, initialDisableBuy: disableBuy,
initialDisableSell: disableSell, initialDisableSell: disableSell,
@ -1174,6 +1201,7 @@ abstract class SettingsStoreBase with Store {
useEtherscan: useEtherscan, useEtherscan: useEtherscan,
usePolygonScan: usePolygonScan, usePolygonScan: usePolygonScan,
useTronGrid: useTronGrid, useTronGrid: useTronGrid,
useMempoolFeeAPI: useMempoolFeeAPI,
defaultNanoRep: defaultNanoRep, defaultNanoRep: defaultNanoRep,
defaultBananoRep: defaultBananoRep, defaultBananoRep: defaultBananoRep,
lookupsTwitter: lookupsTwitter, lookupsTwitter: lookupsTwitter,
@ -1276,9 +1304,15 @@ abstract class SettingsStoreBase with Store {
final _moneroSeedType = sharedPreferences.getInt(PreferencesKey.moneroSeedType); final _moneroSeedType = sharedPreferences.getInt(PreferencesKey.moneroSeedType);
moneroSeedType = _moneroSeedType != null moneroSeedType = _moneroSeedType != null
? SeedType.deserialize(raw: _moneroSeedType) ? MoneroSeedType.deserialize(raw: _moneroSeedType)
: defaultMoneroSeedType; : defaultMoneroSeedType;
final _bitcoinSeedType = sharedPreferences.getInt(PreferencesKey.bitcoinSeedType);
bitcoinSeedType = _bitcoinSeedType != null
? BitcoinSeedType.deserialize(raw: _bitcoinSeedType)
: defaultBitcoinSeedType;
balanceDisplayMode = BalanceDisplayMode.deserialize( balanceDisplayMode = BalanceDisplayMode.deserialize(
raw: sharedPreferences.getInt(PreferencesKey.currentBalanceDisplayModeKey)!); raw: sharedPreferences.getInt(PreferencesKey.currentBalanceDisplayModeKey)!);
shouldSaveRecipientAddress = shouldSaveRecipientAddress =
@ -1325,6 +1359,7 @@ abstract class SettingsStoreBase with Store {
useEtherscan = sharedPreferences.getBool(PreferencesKey.useEtherscan) ?? true; useEtherscan = sharedPreferences.getBool(PreferencesKey.useEtherscan) ?? true;
usePolygonScan = sharedPreferences.getBool(PreferencesKey.usePolygonScan) ?? true; usePolygonScan = sharedPreferences.getBool(PreferencesKey.usePolygonScan) ?? true;
useTronGrid = sharedPreferences.getBool(PreferencesKey.useTronGrid) ?? true; useTronGrid = sharedPreferences.getBool(PreferencesKey.useTronGrid) ?? true;
useMempoolFeeAPI = sharedPreferences.getBool(PreferencesKey.useMempoolFeeAPI) ?? true;
defaultNanoRep = sharedPreferences.getString(PreferencesKey.defaultNanoRep) ?? ""; defaultNanoRep = sharedPreferences.getString(PreferencesKey.defaultNanoRep) ?? "";
defaultBananoRep = sharedPreferences.getString(PreferencesKey.defaultBananoRep) ?? ""; defaultBananoRep = sharedPreferences.getString(PreferencesKey.defaultBananoRep) ?? "";
lookupsTwitter = sharedPreferences.getBool(PreferencesKey.lookupsTwitter) ?? true; lookupsTwitter = sharedPreferences.getBool(PreferencesKey.lookupsTwitter) ?? true;

View file

@ -174,6 +174,13 @@ class ExceptionHandler {
"ClientException: Write failed, uri=http", "ClientException: Write failed, uri=http",
"Connection terminated during handshake", "Connection terminated during handshake",
"Corrupted wallets seeds", "Corrupted wallets seeds",
"bad_alloc",
"does not correspond",
"basic_string",
"input_stream",
"input stream error",
"invalid signature",
"invalid password",
]; ];
static Future<void> _addDeviceInfo(File file) async { static Future<void> _addDeviceInfo(File file) async {

View file

@ -30,6 +30,7 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
final SettingsStore _settingsStore; final SettingsStore _settingsStore;
@computed
bool get hasSeedPhraseLengthOption { bool get hasSeedPhraseLengthOption {
// convert to switch case so that it give a syntax error when adding a new wallet type // convert to switch case so that it give a syntax error when adding a new wallet type
// thus we don't forget about it // thus we don't forget about it
@ -40,11 +41,14 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
case WalletType.solana: case WalletType.solana:
case WalletType.tron: case WalletType.tron:
return true; return true;
case WalletType.bitcoin:
case WalletType.litecoin:
return _settingsStore.bitcoinSeedType == BitcoinSeedType.bip39;
case WalletType.monero: case WalletType.monero:
case WalletType.wownero: case WalletType.wownero:
case WalletType.none: case WalletType.none:
case WalletType.bitcoin:
case WalletType.litecoin:
case WalletType.haven: case WalletType.haven:
case WalletType.nano: case WalletType.nano:
case WalletType.banano: case WalletType.banano:
@ -52,7 +56,13 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
} }
} }
bool get hasSeedTypeOption => type == WalletType.monero || type == WalletType.wownero; bool get hasSeedTypeOption => [WalletType.monero, WalletType.wownero].contains(type);
bool get hasPassphraseOption => [
WalletType.bitcoin,
WalletType.litecoin,
WalletType.bitcoinCash,
].contains(type);
@computed @computed
bool get addCustomNode => _addCustomNode; bool get addCustomNode => _addCustomNode;
@ -61,7 +71,7 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
SeedPhraseLength get seedPhraseLength => _settingsStore.seedPhraseLength; SeedPhraseLength get seedPhraseLength => _settingsStore.seedPhraseLength;
@computed @computed
bool get isPolySeed => _settingsStore.moneroSeedType == SeedType.polyseed; bool get isPolySeed => _settingsStore.moneroSeedType == MoneroSeedType.polyseed;
@action @action
void setFiatApiMode(FiatApiMode fiatApiMode) => _settingsStore.fiatApiMode = fiatApiMode; void setFiatApiMode(FiatApiMode fiatApiMode) => _settingsStore.fiatApiMode = fiatApiMode;

View file

@ -7,6 +7,7 @@ import 'package:cake_wallet/solana/solana.dart';
import 'package:cake_wallet/tron/tron.dart'; import 'package:cake_wallet/tron/tron.dart';
import 'package:cake_wallet/view_model/restore/restore_mode.dart'; import 'package:cake_wallet/view_model/restore/restore_mode.dart';
import 'package:cake_wallet/view_model/restore/restore_wallet.dart'; import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/wownero/wownero.dart'; import 'package:cake_wallet/wownero/wownero.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
@ -26,13 +27,13 @@ class WalletRestorationFromQRVM = WalletRestorationFromQRVMBase with _$WalletRes
abstract class WalletRestorationFromQRVMBase extends WalletCreationVM with Store { abstract class WalletRestorationFromQRVMBase extends WalletCreationVM with Store {
WalletRestorationFromQRVMBase(AppStore appStore, WalletCreationService walletCreationService, WalletRestorationFromQRVMBase(AppStore appStore, WalletCreationService walletCreationService,
Box<WalletInfo> walletInfoSource, WalletType type) Box<WalletInfo> walletInfoSource, WalletType type, SeedSettingsViewModel seedSettingsViewModel)
: height = 0, : height = 0,
viewKey = '', viewKey = '',
spendKey = '', spendKey = '',
wif = '', wif = '',
address = '', address = '',
super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true); super(appStore, walletInfoSource, walletCreationService, seedSettingsViewModel, type: type, isRecovery: true);
@observable @observable
int height; int height;

View file

@ -0,0 +1,34 @@
import 'package:cake_wallet/entities/seed_type.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/store/seed_settings_store.dart';
import 'package:mobx/mobx.dart';
part 'seed_settings_view_model.g.dart';
class SeedSettingsViewModel = SeedSettingsViewModelBase with _$SeedSettingsViewModel;
abstract class SeedSettingsViewModelBase with Store {
SeedSettingsViewModelBase(this._appStore, this._seedSettingsStore);
@computed
MoneroSeedType get moneroSeedType => _appStore.settingsStore.moneroSeedType;
@action
void setMoneroSeedType(MoneroSeedType seedType) => _appStore.settingsStore.moneroSeedType = seedType;
@computed
BitcoinSeedType get bitcoinSeedType => _appStore.settingsStore.bitcoinSeedType;
@action
void setBitcoinSeedType(BitcoinSeedType derivationType) =>
_appStore.settingsStore.bitcoinSeedType = derivationType;
@computed
String? get passphrase => this._seedSettingsStore.passphrase;
@action
void setPassphrase(String? passphrase) => this._seedSettingsStore.passphrase = passphrase;
final AppStore _appStore;
final SeedSettingsStore _seedSettingsStore;
}

View file

@ -1,19 +0,0 @@
import 'package:cake_wallet/entities/seed_type.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:mobx/mobx.dart';
part 'seed_type_view_model.g.dart';
class SeedTypeViewModel = SeedTypeViewModelBase with _$SeedTypeViewModel;
abstract class SeedTypeViewModelBase with Store {
SeedTypeViewModelBase(this._appStore);
@computed
SeedType get moneroSeedType => _appStore.settingsStore.moneroSeedType;
@action
void setMoneroSeedType(SeedType seedType) => _appStore.settingsStore.moneroSeedType = seedType;
final AppStore _appStore;
}

View file

@ -1,3 +1,4 @@
import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart';
import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cake_wallet/entities/exchange_api_mode.dart';
import 'package:cake_wallet/ethereum/ethereum.dart'; import 'package:cake_wallet/ethereum/ethereum.dart';
@ -75,6 +76,9 @@ abstract class PrivacySettingsViewModelBase with Store {
@computed @computed
bool get useTronGrid => _settingsStore.useTronGrid; bool get useTronGrid => _settingsStore.useTronGrid;
@computed
bool get useMempoolFeeAPI => _settingsStore.useMempoolFeeAPI;
@computed @computed
bool get lookupTwitter => _settingsStore.lookupsTwitter; bool get lookupTwitter => _settingsStore.lookupsTwitter;
@ -99,6 +103,8 @@ abstract class PrivacySettingsViewModelBase with Store {
bool get canUseTronGrid => _wallet.type == WalletType.tron; bool get canUseTronGrid => _wallet.type == WalletType.tron;
bool get canUseMempoolFeeAPI => _wallet.type == WalletType.bitcoin;
@action @action
void setShouldSaveRecipientAddress(bool value) => void setShouldSaveRecipientAddress(bool value) =>
_settingsStore.shouldSaveRecipientAddress = value; _settingsStore.shouldSaveRecipientAddress = value;
@ -156,4 +162,9 @@ abstract class PrivacySettingsViewModelBase with Store {
_settingsStore.useTronGrid = value; _settingsStore.useTronGrid = value;
tron!.updateTronGridUsageState(_wallet, value); tron!.updateTronGridUsageState(_wallet, value);
} }
@action
void setUseMempoolFeeAPI(bool value) {
_settingsStore.useMempoolFeeAPI = value;
}
} }

View file

@ -1,20 +1,21 @@
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/core/wallet_creation_service.dart'; import 'package:cake_wallet/core/wallet_creation_service.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/background_tasks.dart'; import 'package:cake_wallet/entities/background_tasks.dart';
import 'package:cake_wallet/entities/generate_name.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/view_model/restore/restore_wallet.dart'; import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
import 'package:hive/hive.dart'; import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:mobx/mobx.dart'; import 'package:cw_core/pathForWallet.dart';
import 'package:cake_wallet/core/execution_state.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/wallet_credentials.dart'; import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/pathForWallet.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:cake_wallet/store/app_store.dart'; import 'package:hive/hive.dart';
import 'package:cake_wallet/entities/generate_name.dart'; import 'package:mobx/mobx.dart';
import 'package:polyseed/polyseed.dart'; import 'package:polyseed/polyseed.dart';
part 'wallet_creation_vm.g.dart'; part 'wallet_creation_vm.g.dart';
@ -23,6 +24,7 @@ class WalletCreationVM = WalletCreationVMBase with _$WalletCreationVM;
abstract class WalletCreationVMBase with Store { abstract class WalletCreationVMBase with Store {
WalletCreationVMBase(this._appStore, this._walletInfoSource, this.walletCreationService, WalletCreationVMBase(this._appStore, this._walletInfoSource, this.walletCreationService,
this.seedSettingsViewModel,
{required this.type, required this.isRecovery}) {required this.type, required this.isRecovery})
: state = InitialExecutionState(), : state = InitialExecutionState(),
name = ''; name = '';
@ -44,7 +46,6 @@ abstract class WalletCreationVMBase with Store {
@observable @observable
String? repeatedWalletPassword; String? repeatedWalletPassword;
bool get hasWalletPassword => SettingsStoreBase.walletPasswordDirectInput; bool get hasWalletPassword => SettingsStoreBase.walletPasswordDirectInput;
WalletType type; WalletType type;
@ -52,6 +53,7 @@ abstract class WalletCreationVMBase with Store {
final WalletCreationService walletCreationService; final WalletCreationService walletCreationService;
final Box<WalletInfo> _walletInfoSource; final Box<WalletInfo> _walletInfoSource;
final AppStore _appStore; final AppStore _appStore;
final SeedSettingsViewModel seedSettingsViewModel;
bool isPolyseed(String seed) => bool isPolyseed(String seed) =>
(type == WalletType.monero || type == WalletType.wownero) && (type == WalletType.monero || type == WalletType.wownero) &&
@ -109,17 +111,35 @@ abstract class WalletCreationVMBase with Store {
getIt.get<BackgroundTasks>().registerSyncTask(); getIt.get<BackgroundTasks>().registerSyncTask();
_appStore.authenticationStore.allowed(); _appStore.authenticationStore.allowed();
state = ExecutedSuccessfullyState(); state = ExecutedSuccessfullyState();
} catch (e, s) { } catch (e, _) {
state = FailureState(e.toString()); state = FailureState(e.toString());
} }
} }
DerivationInfo? getDefaultDerivation() { DerivationInfo? getDefaultDerivation() {
switch (this.type) { final useBip39 = seedSettingsViewModel.bitcoinSeedType.type == DerivationType.bip39;
switch (type) {
case WalletType.nano: case WalletType.nano:
return DerivationInfo(derivationType: DerivationType.nano); return DerivationInfo(derivationType: DerivationType.nano);
case WalletType.bitcoin: case WalletType.bitcoin:
if (useBip39) {
return DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/0'/0'",
description: "Standard BIP84 native segwit",
scriptType: "p2wpkh",
);
}
return bitcoin!.getElectrumDerivations()[DerivationType.electrum]!.first;
case WalletType.litecoin: case WalletType.litecoin:
if (useBip39) {
return DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/2'/0'",
description: "Default Litecoin",
scriptType: "p2wpkh",
);
}
return bitcoin!.getElectrumDerivations()[DerivationType.electrum]!.first; return bitcoin!.getElectrumDerivations()[DerivationType.electrum]!.first;
default: default:
return null; return null;

View file

@ -5,6 +5,7 @@ import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/polygon/polygon.dart'; import 'package:cake_wallet/polygon/polygon.dart';
import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart'; import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_creation_vm.dart'; import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
import 'package:cw_core/hardware/hardware_account_data.dart'; import 'package:cw_core/hardware/hardware_account_data.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
@ -25,10 +26,15 @@ abstract class WalletHardwareRestoreViewModelBase extends WalletCreationVM with
int _nextIndex = 0; int _nextIndex = 0;
WalletHardwareRestoreViewModelBase(this.ledgerViewModel, AppStore appStore, WalletHardwareRestoreViewModelBase(
WalletCreationService walletCreationService, Box<WalletInfo> walletInfoSource, this.ledgerViewModel,
AppStore appStore,
WalletCreationService walletCreationService,
Box<WalletInfo> walletInfoSource,
SeedSettingsViewModel seedSettingsViewModel,
{required WalletType type}) {required WalletType type})
: super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true); : super(appStore, walletInfoSource, walletCreationService, seedSettingsViewModel,
type: type, isRecovery: true);
@observable @observable
String name = ""; String name = "";

View file

@ -276,7 +276,8 @@ abstract class WalletKeysViewModelBase with Store {
if (_appStore.wallet!.seed == null && if (_appStore.wallet!.seed == null &&
_appStore.wallet!.privateKey != null) _appStore.wallet!.privateKey != null)
'private_key': _appStore.wallet!.privateKey!, 'private_key': _appStore.wallet!.privateKey!,
if (restoreHeightResult != null) ...{'height': restoreHeightResult} if (restoreHeightResult != null) ...{'height': restoreHeightResult},
if (_appStore.wallet!.passphrase != null) 'passphrase': _appStore.wallet!.passphrase!
}; };
} }

View file

@ -1,35 +1,42 @@
import 'package:cake_wallet/ethereum/ethereum.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
import 'package:cake_wallet/solana/solana.dart'; import 'package:cake_wallet/core/wallet_creation_service.dart';
import 'package:cake_wallet/tron/tron.dart'; import 'package:cake_wallet/entities/seed_type.dart';
import 'package:cake_wallet/wownero/wownero.dart'; import 'package:cake_wallet/ethereum/ethereum.dart';
import 'package:hive/hive.dart'; import 'package:cake_wallet/haven/haven.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/nano/nano.dart'; import 'package:cake_wallet/nano/nano.dart';
import 'package:cake_wallet/solana/solana.dart';
import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/tron/tron.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
import 'package:cake_wallet/wownero/wownero.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
import 'package:cake_wallet/core/wallet_creation_service.dart';
import 'package:cw_core/wallet_credentials.dart'; import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:cake_wallet/view_model/wallet_creation_vm.dart'; import 'package:hive/hive.dart';
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:mobx/mobx.dart';
import 'package:cake_wallet/haven/haven.dart';
import 'advanced_privacy_settings_view_model.dart';
import '../polygon/polygon.dart'; import '../polygon/polygon.dart';
import 'advanced_privacy_settings_view_model.dart';
part 'wallet_new_vm.g.dart'; part 'wallet_new_vm.g.dart';
class WalletNewVM = WalletNewVMBase with _$WalletNewVM; class WalletNewVM = WalletNewVMBase with _$WalletNewVM;
abstract class WalletNewVMBase extends WalletCreationVM with Store { abstract class WalletNewVMBase extends WalletCreationVM with Store {
WalletNewVMBase(AppStore appStore, WalletCreationService walletCreationService, WalletNewVMBase(
Box<WalletInfo> walletInfoSource, this.advancedPrivacySettingsViewModel, AppStore appStore,
WalletCreationService walletCreationService,
Box<WalletInfo> walletInfoSource,
this.advancedPrivacySettingsViewModel,
SeedSettingsViewModel seedSettingsViewModel,
{required WalletType type}) {required WalletType type})
: selectedMnemonicLanguage = '', : selectedMnemonicLanguage = '',
super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: false); super(appStore, walletInfoSource, walletCreationService, seedSettingsViewModel,
type: type, isRecovery: false);
final AdvancedPrivacySettingsViewModel advancedPrivacySettingsViewModel; final AdvancedPrivacySettingsViewModel advancedPrivacySettingsViewModel;
@ -37,47 +44,58 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store {
String selectedMnemonicLanguage; String selectedMnemonicLanguage;
bool get hasLanguageSelector => bool get hasLanguageSelector =>
type == WalletType.monero || type == WalletType.haven || type == WalletType.wownero; [WalletType.monero, WalletType.haven, WalletType.wownero].contains(type);
int get seedPhraseWordsLength { int get seedPhraseWordsLength {
switch (type) { switch (type) {
case WalletType.monero: case WalletType.monero:
case WalletType.wownero: case WalletType.wownero:
if (advancedPrivacySettingsViewModel.isPolySeed) { return advancedPrivacySettingsViewModel.isPolySeed ? 16 : 25;
return 16;
}
return 25;
case WalletType.tron: case WalletType.tron:
case WalletType.solana: case WalletType.solana:
case WalletType.polygon: case WalletType.polygon:
case WalletType.ethereum: case WalletType.ethereum:
case WalletType.bitcoinCash: case WalletType.bitcoinCash:
return advancedPrivacySettingsViewModel.seedPhraseLength.value; return advancedPrivacySettingsViewModel.seedPhraseLength.value;
case WalletType.bitcoin:
case WalletType.litecoin:
return seedSettingsViewModel.bitcoinSeedType == BitcoinSeedType.bip39
? advancedPrivacySettingsViewModel.seedPhraseLength.value
: 24;
default: default:
return 24; return 24;
} }
} }
bool get hasSeedType => type == WalletType.monero || type == WalletType.wownero; bool get hasSeedType => [WalletType.monero, WalletType.wownero].contains(type);
@override @override
WalletCredentials getCredentials(dynamic _options) { WalletCredentials getCredentials(dynamic _options) {
final options = _options as List<dynamic>?; final options = _options as List<dynamic>?;
final passphrase = seedSettingsViewModel.passphrase;
seedSettingsViewModel.setPassphrase(null);
switch (type) { switch (type) {
case WalletType.monero: case WalletType.monero:
return monero!.createMoneroNewWalletCredentials( return monero!.createMoneroNewWalletCredentials(
name: name, language: options!.first as String, password: walletPassword, isPolyseed: options.last as bool); name: name,
language: options!.first as String,
password: walletPassword,
isPolyseed: options.last as bool);
case WalletType.bitcoin: case WalletType.bitcoin:
return bitcoin!.createBitcoinNewWalletCredentials(name: name, password: walletPassword); return bitcoin!.createBitcoinNewWalletCredentials(
name: name, password: walletPassword, passphrase: passphrase);
case WalletType.litecoin: case WalletType.litecoin:
return bitcoin!.createBitcoinNewWalletCredentials(name: name, password: walletPassword); return bitcoin!.createBitcoinNewWalletCredentials(
name: name, password: walletPassword, passphrase: passphrase);
case WalletType.haven: case WalletType.haven:
return haven!.createHavenNewWalletCredentials( return haven!.createHavenNewWalletCredentials(
name: name, language: options!.first as String, password: walletPassword); name: name, language: options!.first as String, password: walletPassword);
case WalletType.ethereum: case WalletType.ethereum:
return ethereum!.createEthereumNewWalletCredentials(name: name, password: walletPassword); return ethereum!.createEthereumNewWalletCredentials(name: name, password: walletPassword);
case WalletType.bitcoinCash: case WalletType.bitcoinCash:
return bitcoinCash!.createBitcoinCashNewWalletCredentials(name: name, password: walletPassword); return bitcoinCash!.createBitcoinCashNewWalletCredentials(
name: name, password: walletPassword, passphrase: passphrase);
case WalletType.nano: case WalletType.nano:
case WalletType.banano: case WalletType.banano:
return nano!.createNanoNewWalletCredentials(name: name); return nano!.createNanoNewWalletCredentials(name: name);

View file

@ -1,25 +1,26 @@
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/nano/nano.dart';
import 'package:cake_wallet/ethereum/ethereum.dart';
import 'package:cake_wallet/wownero/wownero.dart';
import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
import 'package:cake_wallet/polygon/polygon.dart';
import 'package:cake_wallet/solana/solana.dart';
import 'package:cake_wallet/tron/tron.dart';
import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cw_core/wallet_base.dart';
import 'package:cake_wallet/core/generate_wallet_password.dart'; import 'package:cake_wallet/core/generate_wallet_password.dart';
import 'package:cake_wallet/core/wallet_creation_service.dart'; import 'package:cake_wallet/core/wallet_creation_service.dart';
import 'package:cw_core/wallet_credentials.dart'; import 'package:cake_wallet/di.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/ethereum/ethereum.dart';
import 'package:cw_core/wallet_info.dart';
import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/haven/haven.dart'; import 'package:cake_wallet/haven/haven.dart';
import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/nano/nano.dart';
import 'package:cake_wallet/polygon/polygon.dart';
import 'package:cake_wallet/solana/solana.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/tron/tron.dart';
import 'package:cake_wallet/view_model/restore/restore_mode.dart'; import 'package:cake_wallet/view_model/restore/restore_mode.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
import 'package:cake_wallet/wownero/wownero.dart';
import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart';
part 'wallet_restore_view_model.g.dart'; part 'wallet_restore_view_model.g.dart';
@ -27,7 +28,7 @@ class WalletRestoreViewModel = WalletRestoreViewModelBase with _$WalletRestoreVi
abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
WalletRestoreViewModelBase(AppStore appStore, WalletCreationService walletCreationService, WalletRestoreViewModelBase(AppStore appStore, WalletCreationService walletCreationService,
Box<WalletInfo> walletInfoSource, Box<WalletInfo> walletInfoSource, SeedSettingsViewModel seedSettingsViewModel,
{required WalletType type}) {required WalletType type})
: hasSeedLanguageSelector = : hasSeedLanguageSelector =
type == WalletType.monero || type == WalletType.haven || type == WalletType.wownero, type == WalletType.monero || type == WalletType.haven || type == WalletType.wownero,
@ -41,7 +42,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
type == WalletType.tron, type == WalletType.tron,
isButtonEnabled = false, isButtonEnabled = false,
mode = WalletRestoreMode.seed, mode = WalletRestoreMode.seed,
super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true) { super(appStore, walletInfoSource, walletCreationService, seedSettingsViewModel, type: type, isRecovery: true) {
switch (type) { switch (type) {
case WalletType.monero: case WalletType.monero:
availableModes = WalletRestoreMode.values; availableModes = WalletRestoreMode.values;
@ -76,7 +77,8 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
final bool hasBlockchainHeightLanguageSelector; final bool hasBlockchainHeightLanguageSelector;
final bool hasRestoreFromPrivateKey; final bool hasRestoreFromPrivateKey;
bool get hasPassphrase => [WalletType.bitcoin, WalletType.litecoin].contains(type); bool get hasPassphrase =>
[WalletType.bitcoin, WalletType.litecoin, WalletType.bitcoinCash].contains(type);
@observable @observable
WalletRestoreMode mode; WalletRestoreMode mode;

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "هل أنت متأكد أنك تريد حذف محفظة ${wallet_name}؟", "delete_wallet_confirm_message": "هل أنت متأكد أنك تريد حذف محفظة ${wallet_name}؟",
"deleteConnectionConfirmationPrompt": "ـﺑ ﻝﺎﺼﺗﻻﺍ ﻑﺬﺣ ﺪﻳﺮﺗ ﻚﻧﺃ ﺪﻛﺄﺘﻣ ﺖﻧﺃ ﻞﻫ", "deleteConnectionConfirmationPrompt": "ـﺑ ﻝﺎﺼﺗﻻﺍ ﻑﺬﺣ ﺪﻳﺮﺗ ﻚﻧﺃ ﺪﻛﺄﺘﻣ ﺖﻧﺃ ﻞﻫ",
"denominations": "الطوائف", "denominations": "الطوائف",
"derivationpath": "مسار الاشتقاق",
"descending": "النزول", "descending": "النزول",
"description": "ﻒﺻﻭ", "description": "ﻒﺻﻭ",
"destination_tag": "علامة الوجهة:", "destination_tag": "علامة الوجهة:",
@ -207,6 +208,7 @@
"disable_buy": "تعطيل إجراء الشراء", "disable_buy": "تعطيل إجراء الشراء",
"disable_cake_2fa": "تعطيل 2 عامل المصادقة", "disable_cake_2fa": "تعطيل 2 عامل المصادقة",
"disable_exchange": "تعطيل التبادل", "disable_exchange": "تعطيل التبادل",
"disable_fee_api_warning": "من خلال إيقاف تشغيل هذا ، قد تكون معدلات الرسوم غير دقيقة في بعض الحالات ، لذلك قد ينتهي بك الأمر إلى دفع مبالغ زائدة أو دفع رسوم المعاملات الخاصة بك",
"disable_fiat": "تعطيل fiat", "disable_fiat": "تعطيل fiat",
"disable_sell": "قم بتعطيل إجراء البيع", "disable_sell": "قم بتعطيل إجراء البيع",
"disableBatteryOptimization": "تعطيل تحسين البطارية", "disableBatteryOptimization": "تعطيل تحسين البطارية",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "إعدادات MWEB", "litecoin_mweb_settings": "إعدادات MWEB",
"litecoin_mweb_warning": "سيقوم استخدام MWEB في البداية بتنزيل ~ 600 ميجابايت من البيانات ، وقد يستغرق ما يصل إلى 30 دقيقة حسب سرعة الشبكة. سيتم تنزيل هذه البيانات الأولية مرة واحدة فقط وستكون متاحة لجميع محافظ Litecoin", "litecoin_mweb_warning": "سيقوم استخدام MWEB في البداية بتنزيل ~ 600 ميجابايت من البيانات ، وقد يستغرق ما يصل إلى 30 دقيقة حسب سرعة الشبكة. سيتم تنزيل هذه البيانات الأولية مرة واحدة فقط وستكون متاحة لجميع محافظ Litecoin",
"litecoin_what_is_mweb": "ما هو MWEB؟", "litecoin_what_is_mweb": "ما هو MWEB؟",
"live_fee_rates": "أسعار الرسوم المباشرة عبر API",
"load_more": "تحميل المزيد", "load_more": "تحميل المزيد",
"loading_your_wallet": "يتم تحميل محفظتك", "loading_your_wallet": "يتم تحميل محفظتك",
"login": "تسجيل الدخول", "login": "تسجيل الدخول",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Сигурни ли сте, че искате да изтриете протфейла ${wallet_name}?", "delete_wallet_confirm_message": "Сигурни ли сте, че искате да изтриете протфейла ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Сигурни ли сте, че искате да изтриете връзката към", "deleteConnectionConfirmationPrompt": "Сигурни ли сте, че искате да изтриете връзката към",
"denominations": "Деноминации", "denominations": "Деноминации",
"derivationpath": "Пътят на производно",
"descending": "Низходящ", "descending": "Низходящ",
"description": "Описание", "description": "Описание",
"destination_tag": "Destination tag:", "destination_tag": "Destination tag:",
@ -207,6 +208,7 @@
"disable_buy": "Деактивирайте действието за покупка", "disable_buy": "Деактивирайте действието за покупка",
"disable_cake_2fa": "Деактивирайте Cake 2FA", "disable_cake_2fa": "Деактивирайте Cake 2FA",
"disable_exchange": "Деактивиране на борса", "disable_exchange": "Деактивиране на борса",
"disable_fee_api_warning": "Като изключите това, таксите могат да бъдат неточни в някои случаи, така че може да се препланите или да не плащате таксите за вашите транзакции",
"disable_fiat": "Деактивиране на fiat", "disable_fiat": "Деактивиране на fiat",
"disable_sell": "Деактивирайте действието за продажба", "disable_sell": "Деактивирайте действието за продажба",
"disableBatteryOptimization": "Деактивирайте оптимизацията на батерията", "disableBatteryOptimization": "Деактивирайте оптимизацията на батерията",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Настройки на MWEB", "litecoin_mweb_settings": "Настройки на MWEB",
"litecoin_mweb_warning": "Използването на MWEB първоначално ще изтегли ~ 600MB данни и може да отнеме до 30 минути в зависимост от скоростта на мрежата. Тези първоначални данни ще изтеглят само веднъж и ще бъдат достъпни за всички портфейли Litecoin", "litecoin_mweb_warning": "Използването на MWEB първоначално ще изтегли ~ 600MB данни и може да отнеме до 30 минути в зависимост от скоростта на мрежата. Тези първоначални данни ще изтеглят само веднъж и ще бъдат достъпни за всички портфейли Litecoin",
"litecoin_what_is_mweb": "Какво е MWEB?", "litecoin_what_is_mweb": "Какво е MWEB?",
"live_fee_rates": "Цени на таксите на живо чрез API",
"load_more": "Зареди още", "load_more": "Зареди още",
"loading_your_wallet": "Зареждане на портфейл", "loading_your_wallet": "Зареждане на портфейл",
"login": "Влизане", "login": "Влизане",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Opravdu chcete smazat ${wallet_name} peněženku?", "delete_wallet_confirm_message": "Opravdu chcete smazat ${wallet_name} peněženku?",
"deleteConnectionConfirmationPrompt": "Jste si jisti, že chcete smazat připojení k?", "deleteConnectionConfirmationPrompt": "Jste si jisti, že chcete smazat připojení k?",
"denominations": "Označení", "denominations": "Označení",
"derivationpath": "Derivační cesta",
"descending": "Klesající", "descending": "Klesající",
"description": "Popis", "description": "Popis",
"destination_tag": "Destination Tag:", "destination_tag": "Destination Tag:",
@ -207,6 +208,7 @@
"disable_buy": "Zakázat akci nákupu", "disable_buy": "Zakázat akci nákupu",
"disable_cake_2fa": "Zakázat Cake 2FA", "disable_cake_2fa": "Zakázat Cake 2FA",
"disable_exchange": "Zakázat směnárny", "disable_exchange": "Zakázat směnárny",
"disable_fee_api_warning": "Tímto vypnutím by sazby poplatků mohly být v některých případech nepřesné, takže byste mohli skončit přepláváním nebo nedoplatkem poplatků za vaše transakce",
"disable_fiat": "Zakázat fiat", "disable_fiat": "Zakázat fiat",
"disable_sell": "Zakázat akci prodeje", "disable_sell": "Zakázat akci prodeje",
"disableBatteryOptimization": "Zakázat optimalizaci baterie", "disableBatteryOptimization": "Zakázat optimalizaci baterie",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Nastavení mWeb", "litecoin_mweb_settings": "Nastavení mWeb",
"litecoin_mweb_warning": "Pomocí MWeb zpočátku stahuje ~ 600 MB dat a může trvat až 30 minut v závislosti na rychlosti sítě. Tato počáteční data si stáhnou pouze jednou a budou k dispozici pro všechny litecoinové peněženky", "litecoin_mweb_warning": "Pomocí MWeb zpočátku stahuje ~ 600 MB dat a může trvat až 30 minut v závislosti na rychlosti sítě. Tato počáteční data si stáhnou pouze jednou a budou k dispozici pro všechny litecoinové peněženky",
"litecoin_what_is_mweb": "Co je Mweb?", "litecoin_what_is_mweb": "Co je Mweb?",
"live_fee_rates": "Živé sazby poplatků prostřednictvím API",
"load_more": "Načíst další", "load_more": "Načíst další",
"loading_your_wallet": "Načítám peněženku", "loading_your_wallet": "Načítám peněženku",
"login": "Login", "login": "Login",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Sind Sie sicher, dass Sie das ${wallet_name} Wallet löschen möchten?", "delete_wallet_confirm_message": "Sind Sie sicher, dass Sie das ${wallet_name} Wallet löschen möchten?",
"deleteConnectionConfirmationPrompt": "Sind Sie sicher, dass Sie die Verbindung zu löschen möchten?", "deleteConnectionConfirmationPrompt": "Sind Sie sicher, dass Sie die Verbindung zu löschen möchten?",
"denominations": "Konfessionen", "denominations": "Konfessionen",
"derivationpath": "Ableitungspfad",
"descending": "Absteigend", "descending": "Absteigend",
"description": "Beschreibung", "description": "Beschreibung",
"destination_tag": "Ziel-Tag:", "destination_tag": "Ziel-Tag:",
@ -207,6 +208,7 @@
"disable_buy": "Kaufaktion deaktivieren", "disable_buy": "Kaufaktion deaktivieren",
"disable_cake_2fa": "Cake 2FA deaktivieren", "disable_cake_2fa": "Cake 2FA deaktivieren",
"disable_exchange": "Exchange deaktivieren", "disable_exchange": "Exchange deaktivieren",
"disable_fee_api_warning": "Wenn dies ausgeschaltet wird, sind die Gebührenquoten in einigen Fällen möglicherweise ungenau, sodass Sie die Gebühren für Ihre Transaktionen möglicherweise überbezahlt oder unterzahlt",
"disable_fiat": "Fiat deaktivieren", "disable_fiat": "Fiat deaktivieren",
"disable_sell": "Verkaufsaktion deaktivieren", "disable_sell": "Verkaufsaktion deaktivieren",
"disableBatteryOptimization": "Batterieoptimierung deaktivieren", "disableBatteryOptimization": "Batterieoptimierung deaktivieren",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "MWEB -Einstellungen", "litecoin_mweb_settings": "MWEB -Einstellungen",
"litecoin_mweb_warning": "Durch die Verwendung von MWEB wird zunächst ~ 600 MB Daten heruntergeladen und kann je nach Netzwerkgeschwindigkeit bis zu 30 Minuten dauern. Diese ersten Daten werden nur einmal heruntergeladen und für alle Litecoin -Brieftaschen verfügbar", "litecoin_mweb_warning": "Durch die Verwendung von MWEB wird zunächst ~ 600 MB Daten heruntergeladen und kann je nach Netzwerkgeschwindigkeit bis zu 30 Minuten dauern. Diese ersten Daten werden nur einmal heruntergeladen und für alle Litecoin -Brieftaschen verfügbar",
"litecoin_what_is_mweb": "Was ist MWeb?", "litecoin_what_is_mweb": "Was ist MWeb?",
"live_fee_rates": "Live -Gebührenpreise über API",
"load_more": "Mehr laden", "load_more": "Mehr laden",
"loading_your_wallet": "Wallet wird geladen", "loading_your_wallet": "Wallet wird geladen",
"login": "Einloggen", "login": "Einloggen",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Are you sure that you want to delete ${wallet_name} wallet?", "delete_wallet_confirm_message": "Are you sure that you want to delete ${wallet_name} wallet?",
"deleteConnectionConfirmationPrompt": "Are you sure that you want to delete the connection to", "deleteConnectionConfirmationPrompt": "Are you sure that you want to delete the connection to",
"denominations": "Denominations", "denominations": "Denominations",
"derivationpath": "Derivation Path",
"descending": "Descending", "descending": "Descending",
"description": "Description", "description": "Description",
"destination_tag": "Destination tag:", "destination_tag": "Destination tag:",
@ -207,6 +208,7 @@
"disable_buy": "Disable buy action", "disable_buy": "Disable buy action",
"disable_cake_2fa": "Disable Cake 2FA", "disable_cake_2fa": "Disable Cake 2FA",
"disable_exchange": "Disable exchange", "disable_exchange": "Disable exchange",
"disable_fee_api_warning": "By turning this off, the fee rates might be inaccurate in some cases, so you might end up overpaying or underpaying the fees for your transactions",
"disable_fiat": "Disable fiat", "disable_fiat": "Disable fiat",
"disable_sell": "Disable sell action", "disable_sell": "Disable sell action",
"disableBatteryOptimization": "Disable Battery Optimization", "disableBatteryOptimization": "Disable Battery Optimization",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "MWEB settings", "litecoin_mweb_settings": "MWEB settings",
"litecoin_mweb_warning": "Using MWEB will initially download ~600MB of data, and may take up to 30 minutes depending on network speed. This initial data will only download once and be available for all Litecoin wallets", "litecoin_mweb_warning": "Using MWEB will initially download ~600MB of data, and may take up to 30 minutes depending on network speed. This initial data will only download once and be available for all Litecoin wallets",
"litecoin_what_is_mweb": "What is MWEB?", "litecoin_what_is_mweb": "What is MWEB?",
"live_fee_rates": "Live fee rates via API",
"load_more": "Load more", "load_more": "Load more",
"loading_your_wallet": "Loading your wallet", "loading_your_wallet": "Loading your wallet",
"login": "Login", "login": "Login",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "¿Está seguro de que desea eliminar la billetera ${wallet_name}?", "delete_wallet_confirm_message": "¿Está seguro de que desea eliminar la billetera ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "¿Está seguro de que desea eliminar la conexión a", "deleteConnectionConfirmationPrompt": "¿Está seguro de que desea eliminar la conexión a",
"denominations": "Denominaciones", "denominations": "Denominaciones",
"derivationpath": "Ruta de derivación",
"descending": "Descendente", "descending": "Descendente",
"description": "Descripción", "description": "Descripción",
"destination_tag": "Etiqueta de destino:", "destination_tag": "Etiqueta de destino:",
@ -207,6 +208,7 @@
"disable_buy": "Desactivar acción de compra", "disable_buy": "Desactivar acción de compra",
"disable_cake_2fa": "Desactivar pastel 2FA", "disable_cake_2fa": "Desactivar pastel 2FA",
"disable_exchange": "Deshabilitar intercambio", "disable_exchange": "Deshabilitar intercambio",
"disable_fee_api_warning": "Al apagar esto, las tasas de tarifas pueden ser inexactas en algunos casos, por lo que puede terminar pagando en exceso o pagando menos las tarifas por sus transacciones",
"disable_fiat": "Deshabilitar fiat", "disable_fiat": "Deshabilitar fiat",
"disable_sell": "Desactivar acción de venta", "disable_sell": "Desactivar acción de venta",
"disableBatteryOptimization": "Deshabilitar la optimización de la batería", "disableBatteryOptimization": "Deshabilitar la optimización de la batería",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Configuración de MWEB", "litecoin_mweb_settings": "Configuración de MWEB",
"litecoin_mweb_warning": "El uso de MWEB inicialmente descargará ~ 600 MB de datos, y puede tomar hasta 30 minutos según la velocidad de la red. Estos datos iniciales solo se descargarán una vez y estarán disponibles para todas las billeteras de Litecoin", "litecoin_mweb_warning": "El uso de MWEB inicialmente descargará ~ 600 MB de datos, y puede tomar hasta 30 minutos según la velocidad de la red. Estos datos iniciales solo se descargarán una vez y estarán disponibles para todas las billeteras de Litecoin",
"litecoin_what_is_mweb": "¿Qué es mweb?", "litecoin_what_is_mweb": "¿Qué es mweb?",
"live_fee_rates": "Tasas de tarifas en vivo a través de API",
"load_more": "Carga más", "load_more": "Carga más",
"loading_your_wallet": "Cargando tu billetera", "loading_your_wallet": "Cargando tu billetera",
"login": "Iniciar sesión", "login": "Iniciar sesión",
@ -902,4 +905,4 @@
"you_will_get": "Convertir a", "you_will_get": "Convertir a",
"you_will_send": "Convertir de", "you_will_send": "Convertir de",
"yy": "YY" "yy": "YY"
} }

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Êtes-vous sûr de vouloir supprimer le portefeuille (wallet) ${wallet_name}?", "delete_wallet_confirm_message": "Êtes-vous sûr de vouloir supprimer le portefeuille (wallet) ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Êtes-vous sûr de vouloir supprimer la connexion à", "deleteConnectionConfirmationPrompt": "Êtes-vous sûr de vouloir supprimer la connexion à",
"denominations": "Dénominations", "denominations": "Dénominations",
"derivationpath": "Chemin de dérivation",
"descending": "Descendant", "descending": "Descendant",
"description": "Description", "description": "Description",
"destination_tag": "Tag de destination :", "destination_tag": "Tag de destination :",
@ -207,6 +208,7 @@
"disable_buy": "Désactiver l'action d'achat", "disable_buy": "Désactiver l'action d'achat",
"disable_cake_2fa": "Désactiver Cake 2FA", "disable_cake_2fa": "Désactiver Cake 2FA",
"disable_exchange": "Désactiver l'échange", "disable_exchange": "Désactiver l'échange",
"disable_fee_api_warning": "En désactivant cela, les taux de frais peuvent être inexacts dans certains cas, vous pourriez donc finir par payer trop ou sous-paiement les frais pour vos transactions",
"disable_fiat": "Désactiver les montants en fiat", "disable_fiat": "Désactiver les montants en fiat",
"disable_sell": "Désactiver l'action de vente", "disable_sell": "Désactiver l'action de vente",
"disableBatteryOptimization": "Désactiver l'optimisation de la batterie", "disableBatteryOptimization": "Désactiver l'optimisation de la batterie",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Paramètres MWEB", "litecoin_mweb_settings": "Paramètres MWEB",
"litecoin_mweb_warning": "L'utilisation de MWEB téléchargera initialement ~ 600 Mo de données et peut prendre jusqu'à 30 minutes en fonction de la vitesse du réseau. Ces données initiales ne téléchargeront qu'une seule fois et seront disponibles pour tous les portefeuilles litecoin", "litecoin_mweb_warning": "L'utilisation de MWEB téléchargera initialement ~ 600 Mo de données et peut prendre jusqu'à 30 minutes en fonction de la vitesse du réseau. Ces données initiales ne téléchargeront qu'une seule fois et seront disponibles pour tous les portefeuilles litecoin",
"litecoin_what_is_mweb": "Qu'est-ce que MWEB?", "litecoin_what_is_mweb": "Qu'est-ce que MWEB?",
"live_fee_rates": "Taux de frais en direct via l'API",
"load_more": "Charger plus", "load_more": "Charger plus",
"loading_your_wallet": "Chargement de votre portefeuille (wallet)", "loading_your_wallet": "Chargement de votre portefeuille (wallet)",
"login": "Utilisateur", "login": "Utilisateur",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Shin kun tabbata cewa kuna son share jakar ${wallet_name}?", "delete_wallet_confirm_message": "Shin kun tabbata cewa kuna son share jakar ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Shin kun tabbata cewa kuna son share haɗin zuwa", "deleteConnectionConfirmationPrompt": "Shin kun tabbata cewa kuna son share haɗin zuwa",
"denominations": "Denominations", "denominations": "Denominations",
"derivationpath": "Hanyar Nasara",
"descending": "Saukowa", "descending": "Saukowa",
"description": "Bayani", "description": "Bayani",
"destination_tag": "Tambarin makoma:", "destination_tag": "Tambarin makoma:",
@ -207,6 +208,7 @@
"disable_buy": "Kashe alama", "disable_buy": "Kashe alama",
"disable_cake_2fa": "Musaki Cake 2FA", "disable_cake_2fa": "Musaki Cake 2FA",
"disable_exchange": "Kashe musanya", "disable_exchange": "Kashe musanya",
"disable_fee_api_warning": "Ta hanyar juya wannan kashe, kudaden da zai iya zama ba daidai ba a wasu halaye, saboda haka zaku iya ƙare da overpaying ko a ƙarƙashin kudaden don ma'amaloli",
"disable_fiat": "Dakatar da fiat", "disable_fiat": "Dakatar da fiat",
"disable_sell": "Kashe karbuwa", "disable_sell": "Kashe karbuwa",
"disableBatteryOptimization": "Kashe ingantawa baturi", "disableBatteryOptimization": "Kashe ingantawa baturi",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Saitunan Mweb", "litecoin_mweb_settings": "Saitunan Mweb",
"litecoin_mweb_warning": "Amfani da Mweb zai fara saukewa ~ 600MB na bayanai, kuma yana iya ɗaukar minti 30 dangane da saurin cibiyar sadarwa. Wannan bayanan farko zai saika saukarwa sau ɗaya kawai kuma a samu don duk wuraren shakatawa", "litecoin_mweb_warning": "Amfani da Mweb zai fara saukewa ~ 600MB na bayanai, kuma yana iya ɗaukar minti 30 dangane da saurin cibiyar sadarwa. Wannan bayanan farko zai saika saukarwa sau ɗaya kawai kuma a samu don duk wuraren shakatawa",
"litecoin_what_is_mweb": "Menene Mweb?", "litecoin_what_is_mweb": "Menene Mweb?",
"live_fee_rates": "Kudin Kiɗa ta API",
"load_more": "Like more", "load_more": "Like more",
"loading_your_wallet": "Ana loda walat ɗin ku", "loading_your_wallet": "Ana loda walat ɗin ku",
"login": "Shiga", "login": "Shiga",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "क्या आप वाकई ${wallet_name} वॉलेट हटाना चाहते हैं?", "delete_wallet_confirm_message": "क्या आप वाकई ${wallet_name} वॉलेट हटाना चाहते हैं?",
"deleteConnectionConfirmationPrompt": "क्या आप वाकई कनेक्शन हटाना चाहते हैं?", "deleteConnectionConfirmationPrompt": "क्या आप वाकई कनेक्शन हटाना चाहते हैं?",
"denominations": "मूल्यवर्ग", "denominations": "मूल्यवर्ग",
"derivationpath": "व्युत्पत्ति पथ",
"descending": "अवरोही", "descending": "अवरोही",
"description": "विवरण", "description": "विवरण",
"destination_tag": "गंतव्य टैग:", "destination_tag": "गंतव्य टैग:",
@ -207,6 +208,7 @@
"disable_buy": "खरीद कार्रवाई अक्षम करें", "disable_buy": "खरीद कार्रवाई अक्षम करें",
"disable_cake_2fa": "केक 2FA अक्षम करें", "disable_cake_2fa": "केक 2FA अक्षम करें",
"disable_exchange": "एक्सचेंज अक्षम करें", "disable_exchange": "एक्सचेंज अक्षम करें",
"disable_fee_api_warning": "इसे बंद करने से, कुछ मामलों में शुल्क दरें गलत हो सकती हैं, इसलिए आप अपने लेनदेन के लिए फीस को कम कर सकते हैं या कम कर सकते हैं",
"disable_fiat": "िएट को अक्षम करें", "disable_fiat": "िएट को अक्षम करें",
"disable_sell": "बेचने की कार्रवाई अक्षम करें", "disable_sell": "बेचने की कार्रवाई अक्षम करें",
"disableBatteryOptimization": "बैटरी अनुकूलन अक्षम करें", "disableBatteryOptimization": "बैटरी अनुकूलन अक्षम करें",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "MWEB सेटिंग्स", "litecoin_mweb_settings": "MWEB सेटिंग्स",
"litecoin_mweb_warning": "MWEB का उपयोग शुरू में ~ 600MB डेटा डाउनलोड करेगा, और नेटवर्क की गति के आधार पर 30 मिनट तक का समय लग सकता है। यह प्रारंभिक डेटा केवल एक बार डाउनलोड करेगा और सभी लिटकोइन वॉलेट के लिए उपलब्ध होगा", "litecoin_mweb_warning": "MWEB का उपयोग शुरू में ~ 600MB डेटा डाउनलोड करेगा, और नेटवर्क की गति के आधार पर 30 मिनट तक का समय लग सकता है। यह प्रारंभिक डेटा केवल एक बार डाउनलोड करेगा और सभी लिटकोइन वॉलेट के लिए उपलब्ध होगा",
"litecoin_what_is_mweb": "MWEB क्या है?", "litecoin_what_is_mweb": "MWEB क्या है?",
"live_fee_rates": "एपीआई के माध्यम से लाइव शुल्क दरें",
"load_more": "और लोड करें", "load_more": "और लोड करें",
"loading_your_wallet": "अपना बटुआ लोड कर रहा है", "loading_your_wallet": "अपना बटुआ लोड कर रहा है",
"login": "लॉग इन करें", "login": "लॉग इन करें",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Jeste li sigurni da želite izbrisati ${wallet_name} novčanik?", "delete_wallet_confirm_message": "Jeste li sigurni da želite izbrisati ${wallet_name} novčanik?",
"deleteConnectionConfirmationPrompt": "Jeste li sigurni da želite izbrisati vezu s", "deleteConnectionConfirmationPrompt": "Jeste li sigurni da želite izbrisati vezu s",
"denominations": "Denominacije", "denominations": "Denominacije",
"derivationpath": "Put derivacije",
"descending": "Silazni", "descending": "Silazni",
"description": "Opis", "description": "Opis",
"destination_tag": "Odredišna oznaka:", "destination_tag": "Odredišna oznaka:",
@ -207,6 +208,7 @@
"disable_buy": "Onemogući kupnju", "disable_buy": "Onemogući kupnju",
"disable_cake_2fa": "Onemogući Cake 2FA", "disable_cake_2fa": "Onemogući Cake 2FA",
"disable_exchange": "Onemogući exchange", "disable_exchange": "Onemogući exchange",
"disable_fee_api_warning": "Isključivanjem ovoga, stope naknade u nekim bi slučajevima mogle biti netočne, tako da biste mogli preplatiti ili predati naknadu za vaše transakcije",
"disable_fiat": "Isključi, fiat", "disable_fiat": "Isključi, fiat",
"disable_sell": "Onemogući akciju prodaje", "disable_sell": "Onemogući akciju prodaje",
"disableBatteryOptimization": "Onemogući optimizaciju baterije", "disableBatteryOptimization": "Onemogući optimizaciju baterije",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Postavke MWEB -a", "litecoin_mweb_settings": "Postavke MWEB -a",
"litecoin_mweb_warning": "Korištenje MWEB -a u početku će preuzeti ~ 600MB podataka, a može potrajati do 30 minuta, ovisno o brzini mreže. Ovi početni podaci preuzet će samo jednom i biti dostupni za sve Litecoin novčanike", "litecoin_mweb_warning": "Korištenje MWEB -a u početku će preuzeti ~ 600MB podataka, a može potrajati do 30 minuta, ovisno o brzini mreže. Ovi početni podaci preuzet će samo jednom i biti dostupni za sve Litecoin novčanike",
"litecoin_what_is_mweb": "Što je MWEB?", "litecoin_what_is_mweb": "Što je MWEB?",
"live_fee_rates": "Stope naknada uživo putem API -ja",
"load_more": "Učitaj više", "load_more": "Učitaj više",
"loading_your_wallet": "Novčanik se učitava", "loading_your_wallet": "Novčanik se učitava",
"login": "Prijava", "login": "Prijava",

View file

@ -207,6 +207,7 @@
"disable_buy": "Անջատել գնում գործողությունը", "disable_buy": "Անջատել գնում գործողությունը",
"disable_cake_2fa": "Անջատել Cake 2FA", "disable_cake_2fa": "Անջատել Cake 2FA",
"disable_exchange": "Անջատել փոխանակումը", "disable_exchange": "Անջատել փոխանակումը",
"disable_fee_api_warning": "Դրանից անջատելով, վճարների տեմպերը որոշ դեպքերում կարող են անճիշտ լինել, այնպես որ դուք կարող եք վերջ տալ ձեր գործարքների համար վճարների գերավճարների կամ գերավճարների վրա",
"disable_fiat": "Անջատել ֆիատ", "disable_fiat": "Անջատել ֆիատ",
"disable_sell": "Անջատել վաճառք գործողությունը", "disable_sell": "Անջատել վաճառք գործողությունը",
"disableBatteryOptimization": "Անջատել մարտկոցի օպտիմիզացիան", "disableBatteryOptimization": "Անջատել մարտկոցի օպտիմիզացիան",
@ -354,6 +355,7 @@
"ledger_error_wrong_app": "Խնդրում ենք համոզվել, որ դուք բացել եք ճիշտ ծրագիրը ձեր Ledger-ում", "ledger_error_wrong_app": "Խնդրում ենք համոզվել, որ դուք բացել եք ճիշտ ծրագիրը ձեր Ledger-ում",
"ledger_please_enable_bluetooth": "Խնդրում ենք միացնել Bluetooth-ը ձեր Ledger-ը հայտնաբերելու համար", "ledger_please_enable_bluetooth": "Խնդրում ենք միացնել Bluetooth-ը ձեր Ledger-ը հայտնաբերելու համար",
"light_theme": "Լուսավոր", "light_theme": "Լուսավոր",
"live_fee_rates": "Ապակի վարձավճարներ API- ի միջոցով",
"load_more": "Բեռնել ավելին", "load_more": "Բեռնել ավելին",
"loading_your_wallet": "Ձեր հաշվեհամարը բեռնում է", "loading_your_wallet": "Ձեր հաշվեհամարը բեռնում է",
"login": "Մուտք", "login": "Մուտք",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Apakah Anda yakin ingin menghapus dompet ${wallet_name}?", "delete_wallet_confirm_message": "Apakah Anda yakin ingin menghapus dompet ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Apakah Anda yakin ingin menghapus koneksi ke", "deleteConnectionConfirmationPrompt": "Apakah Anda yakin ingin menghapus koneksi ke",
"denominations": "Denominasi", "denominations": "Denominasi",
"derivationpath": "Jalur derivasi",
"descending": "Menurun", "descending": "Menurun",
"description": "Keterangan", "description": "Keterangan",
"destination_tag": "Tag tujuan:", "destination_tag": "Tag tujuan:",
@ -207,6 +208,7 @@
"disable_buy": "Nonaktifkan tindakan beli", "disable_buy": "Nonaktifkan tindakan beli",
"disable_cake_2fa": "Nonaktifkan Kue 2FA", "disable_cake_2fa": "Nonaktifkan Kue 2FA",
"disable_exchange": "Nonaktifkan pertukaran", "disable_exchange": "Nonaktifkan pertukaran",
"disable_fee_api_warning": "Dengan mematikan ini, tarif biaya mungkin tidak akurat dalam beberapa kasus, jadi Anda mungkin akan membayar lebih atau membayar biaya untuk transaksi Anda",
"disable_fiat": "Nonaktifkan fiat", "disable_fiat": "Nonaktifkan fiat",
"disable_sell": "Nonaktifkan aksi jual", "disable_sell": "Nonaktifkan aksi jual",
"disableBatteryOptimization": "Nonaktifkan optimasi baterai", "disableBatteryOptimization": "Nonaktifkan optimasi baterai",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Pengaturan MWEB", "litecoin_mweb_settings": "Pengaturan MWEB",
"litecoin_mweb_warning": "Menggunakan MWEB pada awalnya akan mengunduh ~ 600MB data, dan dapat memakan waktu hingga 30 menit tergantung pada kecepatan jaringan. Data awal ini hanya akan mengunduh sekali dan tersedia untuk semua dompet litecoin", "litecoin_mweb_warning": "Menggunakan MWEB pada awalnya akan mengunduh ~ 600MB data, dan dapat memakan waktu hingga 30 menit tergantung pada kecepatan jaringan. Data awal ini hanya akan mengunduh sekali dan tersedia untuk semua dompet litecoin",
"litecoin_what_is_mweb": "Apa itu MWEB?", "litecoin_what_is_mweb": "Apa itu MWEB?",
"live_fee_rates": "Tarif biaya langsung melalui API",
"load_more": "Muat lebih banyak", "load_more": "Muat lebih banyak",
"loading_your_wallet": "Memuat dompet Anda", "loading_your_wallet": "Memuat dompet Anda",
"login": "Masuk", "login": "Masuk",

View file

@ -196,6 +196,7 @@
"delete_wallet_confirm_message": "Sei sicuro di voler eliminare il portafoglio ${wallet_name}?", "delete_wallet_confirm_message": "Sei sicuro di voler eliminare il portafoglio ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Sei sicuro di voler eliminare la connessione a", "deleteConnectionConfirmationPrompt": "Sei sicuro di voler eliminare la connessione a",
"denominations": "Denominazioni", "denominations": "Denominazioni",
"derivationpath": "Percorso di derivazione",
"descending": "Discendente", "descending": "Discendente",
"description": "Descrizione", "description": "Descrizione",
"destination_tag": "Tag destinazione:", "destination_tag": "Tag destinazione:",
@ -208,6 +209,7 @@
"disable_buy": "Disabilita l'azione di acquisto", "disable_buy": "Disabilita l'azione di acquisto",
"disable_cake_2fa": "Disabilita Cake 2FA", "disable_cake_2fa": "Disabilita Cake 2FA",
"disable_exchange": "Disabilita scambio", "disable_exchange": "Disabilita scambio",
"disable_fee_api_warning": "Disattivando questo, i tassi delle commissioni potrebbero essere inaccurati in alcuni casi, quindi potresti finire in eccesso o sostenere le commissioni per le transazioni",
"disable_fiat": "Disabilita fiat", "disable_fiat": "Disabilita fiat",
"disable_sell": "Disabilita l'azione di vendita", "disable_sell": "Disabilita l'azione di vendita",
"disableBatteryOptimization": "Disabilita l'ottimizzazione della batteria", "disableBatteryOptimization": "Disabilita l'ottimizzazione della batteria",
@ -363,6 +365,7 @@
"litecoin_mweb_settings": "Impostazioni MWeb", "litecoin_mweb_settings": "Impostazioni MWeb",
"litecoin_mweb_warning": "L'uso di MWeb inizialmente scaricherà ~ 600 MB di dati e potrebbe richiedere fino a 30 minuti a seconda della velocità di rete. Questi dati iniziali scaricheranno solo una volta e saranno disponibili per tutti i portafogli Litecoin", "litecoin_mweb_warning": "L'uso di MWeb inizialmente scaricherà ~ 600 MB di dati e potrebbe richiedere fino a 30 minuti a seconda della velocità di rete. Questi dati iniziali scaricheranno solo una volta e saranno disponibili per tutti i portafogli Litecoin",
"litecoin_what_is_mweb": "Cos'è MWeb?", "litecoin_what_is_mweb": "Cos'è MWeb?",
"live_fee_rates": "Tariffe delle commissioni dal vivo tramite API",
"load_more": "Carica di più", "load_more": "Carica di più",
"loading_your_wallet": "Caricamento portafoglio", "loading_your_wallet": "Caricamento portafoglio",
"login": "Accedi", "login": "Accedi",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "${wallet_name} ウォレットを削除してもよろしいですか?", "delete_wallet_confirm_message": "${wallet_name} ウォレットを削除してもよろしいですか?",
"deleteConnectionConfirmationPrompt": "への接続を削除してもよろしいですか?", "deleteConnectionConfirmationPrompt": "への接続を削除してもよろしいですか?",
"denominations": "宗派", "denominations": "宗派",
"derivationpath": "派生パス",
"descending": "下降", "descending": "下降",
"description": "説明", "description": "説明",
"destination_tag": "宛先タグ:", "destination_tag": "宛先タグ:",
@ -207,6 +208,7 @@
"disable_buy": "購入アクションを無効にする", "disable_buy": "購入アクションを無効にする",
"disable_cake_2fa": "Cake 2FA を無効にする", "disable_cake_2fa": "Cake 2FA を無効にする",
"disable_exchange": "交換を無効にする", "disable_exchange": "交換を無効にする",
"disable_fee_api_warning": "これをオフにすることで、料金金利は場合によっては不正確になる可能性があるため、取引の費用が過払いまたは不足している可能性があります",
"disable_fiat": "フィアットを無効にする", "disable_fiat": "フィアットを無効にする",
"disable_sell": "販売アクションを無効にする", "disable_sell": "販売アクションを無効にする",
"disableBatteryOptimization": "バッテリーの最適化を無効にします", "disableBatteryOptimization": "バッテリーの最適化を無効にします",
@ -363,6 +365,7 @@
"litecoin_mweb_settings": "MWEB設定", "litecoin_mweb_settings": "MWEB設定",
"litecoin_mweb_warning": "MWEBを使用すると、最初は〜600MBのデータをダウンロードし、ネットワーク速度に応じて最大30分かかる場合があります。この最初のデータは一度だけダウンロードされ、すべてのLitecoinウォレットで利用可能になります", "litecoin_mweb_warning": "MWEBを使用すると、最初は〜600MBのデータをダウンロードし、ネットワーク速度に応じて最大30分かかる場合があります。この最初のデータは一度だけダウンロードされ、すべてのLitecoinウォレットで利用可能になります",
"litecoin_what_is_mweb": "MWEBとは何ですか", "litecoin_what_is_mweb": "MWEBとは何ですか",
"live_fee_rates": "API経由のライブ料金",
"load_more": "もっと読み込む", "load_more": "もっと読み込む",
"loading_your_wallet": "ウォレットをロードしています", "loading_your_wallet": "ウォレットをロードしています",
"login": "ログイン", "login": "ログイン",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "${wallet_name} 지갑을 삭제하시겠습니까?", "delete_wallet_confirm_message": "${wallet_name} 지갑을 삭제하시겠습니까?",
"deleteConnectionConfirmationPrompt": "다음 연결을 삭제하시겠습니까?", "deleteConnectionConfirmationPrompt": "다음 연결을 삭제하시겠습니까?",
"denominations": "교파", "denominations": "교파",
"derivationpath": "파생 경로",
"descending": "내림차순", "descending": "내림차순",
"description": "설명", "description": "설명",
"destination_tag": "목적지 태그:", "destination_tag": "목적지 태그:",
@ -207,6 +208,7 @@
"disable_buy": "구매 행동 비활성화", "disable_buy": "구매 행동 비활성화",
"disable_cake_2fa": "케이크 2FA 비활성화", "disable_cake_2fa": "케이크 2FA 비활성화",
"disable_exchange": "교환 비활성화", "disable_exchange": "교환 비활성화",
"disable_fee_api_warning": "이것을 끄면 경우에 따라 수수료가 부정확 할 수 있으므로 거래 수수료를 초과 지불하거나 지불 할 수 있습니다.",
"disable_fiat": "법정화폐 비활성화", "disable_fiat": "법정화폐 비활성화",
"disable_sell": "판매 조치 비활성화", "disable_sell": "판매 조치 비활성화",
"disableBatteryOptimization": "배터리 최적화를 비활성화합니다", "disableBatteryOptimization": "배터리 최적화를 비활성화합니다",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "mweb 설정", "litecoin_mweb_settings": "mweb 설정",
"litecoin_mweb_warning": "MWEB를 사용하면 처음에는 ~ 600MB의 데이터를 다운로드하며 네트워크 속도에 따라 최대 30 분이 소요될 수 있습니다. 이 초기 데이터는 한 번만 다운로드하여 모든 조명 지갑에 사용할 수 있습니다.", "litecoin_mweb_warning": "MWEB를 사용하면 처음에는 ~ 600MB의 데이터를 다운로드하며 네트워크 속도에 따라 최대 30 분이 소요될 수 있습니다. 이 초기 데이터는 한 번만 다운로드하여 모든 조명 지갑에 사용할 수 있습니다.",
"litecoin_what_is_mweb": "MWEB 란 무엇입니까?", "litecoin_what_is_mweb": "MWEB 란 무엇입니까?",
"live_fee_rates": "API를 통한 라이브 요금 요금",
"load_more": "더로드하십시오", "load_more": "더로드하십시오",
"loading_your_wallet": "지갑 넣기", "loading_your_wallet": "지갑 넣기",
"login": "로그인", "login": "로그인",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "${wallet_name} ပိုက်ဆံအိတ်ကို ဖျက်လိုသည်မှာ သေချာပါသလား။", "delete_wallet_confirm_message": "${wallet_name} ပိုက်ဆံအိတ်ကို ဖျက်လိုသည်မှာ သေချာပါသလား။",
"deleteConnectionConfirmationPrompt": "ချိတ်ဆက်မှုကို ဖျက်လိုသည်မှာ သေချာပါသလား။", "deleteConnectionConfirmationPrompt": "ချိတ်ဆက်မှုကို ဖျက်လိုသည်မှာ သေချာပါသလား။",
"denominations": "ဂိုဏ်းချုပ်ပစ္စည်းများ", "denominations": "ဂိုဏ်းချုပ်ပစ္စည်းများ",
"derivationpath": "derivation လမ်းကြောင်း",
"descending": "ဆင်း", "descending": "ဆင်း",
"description": "ဖော်ပြချက်", "description": "ဖော်ပြချက်",
"destination_tag": "ခရီးဆုံးအမှတ်-", "destination_tag": "ခရီးဆုံးအမှတ်-",
@ -207,6 +208,7 @@
"disable_buy": "ဝယ်ယူမှု လုပ်ဆောင်ချက်ကို ပိတ်ပါ။", "disable_buy": "ဝယ်ယူမှု လုပ်ဆောင်ချက်ကို ပိတ်ပါ။",
"disable_cake_2fa": "ကိတ်မုန့် 2FA ကို ပိတ်ပါ။", "disable_cake_2fa": "ကိတ်မုန့် 2FA ကို ပိတ်ပါ။",
"disable_exchange": "လဲလှယ်မှုကို ပိတ်ပါ။", "disable_exchange": "လဲလှယ်မှုကို ပိတ်ပါ။",
"disable_fee_api_warning": "ဤအရာကိုဖွင့်ခြင်းအားဖြင့်အချို့သောကိစ္စရပ်များတွင်အခကြေးငွေနှုန်းထားများသည်တိကျမှုရှိနိုင်သည်,",
"disable_fiat": "Fiat ကိုပိတ်ပါ။", "disable_fiat": "Fiat ကိုပိတ်ပါ။",
"disable_sell": "ရောင်းချခြင်းလုပ်ဆောင်ချက်ကို ပိတ်ပါ။", "disable_sell": "ရောင်းချခြင်းလုပ်ဆောင်ချက်ကို ပိတ်ပါ။",
"disableBatteryOptimization": "ဘက်ထရီ optimization ကိုပိတ်ပါ", "disableBatteryOptimization": "ဘက်ထရီ optimization ကိုပိတ်ပါ",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Mweb ဆက်တင်များ", "litecoin_mweb_settings": "Mweb ဆက်တင်များ",
"litecoin_mweb_warning": "MweB ကိုအသုံးပြုခြင်းသည်အစပိုင်းတွင် ~ 600MB ဒေတာများကို download လုပ်ပြီးကွန်ယက်အမြန်နှုန်းပေါ် မူတည်. မိနစ် 30 အထိကြာနိုင်သည်။ ဤကန ဦး ဒေတာကိုတစ်ကြိမ်သာ download လုပ်ပြီး litecoin Walkets အားလုံးအတွက်ရနိုင်သည်", "litecoin_mweb_warning": "MweB ကိုအသုံးပြုခြင်းသည်အစပိုင်းတွင် ~ 600MB ဒေတာများကို download လုပ်ပြီးကွန်ယက်အမြန်နှုန်းပေါ် မူတည်. မိနစ် 30 အထိကြာနိုင်သည်။ ဤကန ဦး ဒေတာကိုတစ်ကြိမ်သာ download လုပ်ပြီး litecoin Walkets အားလုံးအတွက်ရနိုင်သည်",
"litecoin_what_is_mweb": "MweB ဆိုတာဘာလဲ။", "litecoin_what_is_mweb": "MweB ဆိုတာဘာလဲ။",
"live_fee_rates": "API မှတစ်ဆင့် Live အခကြေးငွေနှုန်းထားများ",
"load_more": "ပိုပြီး load", "load_more": "ပိုပြီး load",
"loading_your_wallet": "သင့်ပိုက်ဆံအိတ်ကို ဖွင့်နေသည်။", "loading_your_wallet": "သင့်ပိုက်ဆံအိတ်ကို ဖွင့်နေသည်။",
"login": "လော့ဂ်အင်", "login": "လော့ဂ်အင်",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Weet u zeker dat u de portemonnee van ${wallet_name} wilt verwijderen?", "delete_wallet_confirm_message": "Weet u zeker dat u de portemonnee van ${wallet_name} wilt verwijderen?",
"deleteConnectionConfirmationPrompt": "Weet u zeker dat u de verbinding met", "deleteConnectionConfirmationPrompt": "Weet u zeker dat u de verbinding met",
"denominations": "Denominaties", "denominations": "Denominaties",
"derivationpath": "Afleidingspad",
"descending": "Aflopend", "descending": "Aflopend",
"description": "Beschrijving", "description": "Beschrijving",
"destination_tag": "Bestemmingstag:", "destination_tag": "Bestemmingstag:",
@ -207,6 +208,7 @@
"disable_buy": "Koopactie uitschakelen", "disable_buy": "Koopactie uitschakelen",
"disable_cake_2fa": "Taart 2FA uitschakelen", "disable_cake_2fa": "Taart 2FA uitschakelen",
"disable_exchange": "Uitwisseling uitschakelen", "disable_exchange": "Uitwisseling uitschakelen",
"disable_fee_api_warning": "Door dit uit te schakelen, kunnen de tarieven in sommige gevallen onnauwkeurig zijn, dus u kunt de vergoedingen voor uw transacties te veel betalen of te weinig betalen",
"disable_fiat": "Schakel Fiat uit", "disable_fiat": "Schakel Fiat uit",
"disable_sell": "Verkoopactie uitschakelen", "disable_sell": "Verkoopactie uitschakelen",
"disableBatteryOptimization": "Schakel de batterijoptimalisatie uit", "disableBatteryOptimization": "Schakel de batterijoptimalisatie uit",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "MWEB -instellingen", "litecoin_mweb_settings": "MWEB -instellingen",
"litecoin_mweb_warning": "Het gebruik van MWeb downloadt in eerste instantie ~ 600 MB aan gegevens en kan tot 30 minuten duren, afhankelijk van de netwerksnelheid. Deze eerste gegevens worden slechts eenmaal gedownload en zijn beschikbaar voor alle Litecoin -portefeuilles", "litecoin_mweb_warning": "Het gebruik van MWeb downloadt in eerste instantie ~ 600 MB aan gegevens en kan tot 30 minuten duren, afhankelijk van de netwerksnelheid. Deze eerste gegevens worden slechts eenmaal gedownload en zijn beschikbaar voor alle Litecoin -portefeuilles",
"litecoin_what_is_mweb": "Wat is Mweb?", "litecoin_what_is_mweb": "Wat is Mweb?",
"live_fee_rates": "Live -tarieven via API",
"load_more": "Meer laden", "load_more": "Meer laden",
"loading_your_wallet": "Uw portemonnee laden", "loading_your_wallet": "Uw portemonnee laden",
"login": "Log in", "login": "Log in",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Czy na pewno chcesz usunąć portfel ${wallet_name}?", "delete_wallet_confirm_message": "Czy na pewno chcesz usunąć portfel ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Czy na pewno chcesz usunąć połączenie z", "deleteConnectionConfirmationPrompt": "Czy na pewno chcesz usunąć połączenie z",
"denominations": "Wyznaczenia", "denominations": "Wyznaczenia",
"derivationpath": "Ścieżka pochodna",
"descending": "Schodzenie", "descending": "Schodzenie",
"description": "Opis", "description": "Opis",
"destination_tag": "Tag docelowy:", "destination_tag": "Tag docelowy:",
@ -207,6 +208,7 @@
"disable_buy": "Wyłącz akcję kupna", "disable_buy": "Wyłącz akcję kupna",
"disable_cake_2fa": "Wyłącz Cake 2FA", "disable_cake_2fa": "Wyłącz Cake 2FA",
"disable_exchange": "Wyłącz wymianę", "disable_exchange": "Wyłącz wymianę",
"disable_fee_api_warning": "Wyłączając to, stawki opłaty mogą być w niektórych przypadkach niedokładne, więc możesz skończyć się przepłaceniem lub wynagrodzeniem opłat za transakcje",
"disable_fiat": "Wyłącz waluty FIAT", "disable_fiat": "Wyłącz waluty FIAT",
"disable_sell": "Wyłącz akcję sprzedaży", "disable_sell": "Wyłącz akcję sprzedaży",
"disableBatteryOptimization": "Wyłącz optymalizację baterii", "disableBatteryOptimization": "Wyłącz optymalizację baterii",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Ustawienia MWEB", "litecoin_mweb_settings": "Ustawienia MWEB",
"litecoin_mweb_warning": "Korzystanie z MWEB początkowo pobiera ~ 600 MB danych i może potrwać do 30 minut w zależności od prędkości sieci. Te początkowe dane pobierają tylko raz i będą dostępne dla wszystkich portfeli Litecoin", "litecoin_mweb_warning": "Korzystanie z MWEB początkowo pobiera ~ 600 MB danych i może potrwać do 30 minut w zależności od prędkości sieci. Te początkowe dane pobierają tylko raz i będą dostępne dla wszystkich portfeli Litecoin",
"litecoin_what_is_mweb": "Co to jest MWEB?", "litecoin_what_is_mweb": "Co to jest MWEB?",
"live_fee_rates": "Stawki opłaty na żywo za pośrednictwem API",
"load_more": "Załaduj więcej", "load_more": "Załaduj więcej",
"loading_your_wallet": "Ładowanie portfela", "loading_your_wallet": "Ładowanie portfela",
"login": "Login", "login": "Login",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Tem certeza de que deseja excluir a carteira ${wallet_name}?", "delete_wallet_confirm_message": "Tem certeza de que deseja excluir a carteira ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Tem certeza de que deseja excluir a conexão com", "deleteConnectionConfirmationPrompt": "Tem certeza de que deseja excluir a conexão com",
"denominations": "Denominações", "denominations": "Denominações",
"derivationpath": "Caminho de derivação",
"descending": "descendente", "descending": "descendente",
"description": "Descrição", "description": "Descrição",
"destination_tag": "Tag de destino:", "destination_tag": "Tag de destino:",
@ -207,6 +208,7 @@
"disable_buy": "Desativar ação de compra", "disable_buy": "Desativar ação de compra",
"disable_cake_2fa": "Desabilitar o Cake 2FA", "disable_cake_2fa": "Desabilitar o Cake 2FA",
"disable_exchange": "Desativar troca", "disable_exchange": "Desativar troca",
"disable_fee_api_warning": "Ao desativar isso, as taxas de taxas podem ser imprecisas em alguns casos, para que você possa acabar pagando demais ou pagando as taxas por suas transações",
"disable_fiat": "Desativar fiat", "disable_fiat": "Desativar fiat",
"disable_sell": "Desativar ação de venda", "disable_sell": "Desativar ação de venda",
"disableBatteryOptimization": "Desative a otimização da bateria", "disableBatteryOptimization": "Desative a otimização da bateria",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Configurações do MWEB", "litecoin_mweb_settings": "Configurações do MWEB",
"litecoin_mweb_warning": "O uso do MWEB baixará inicialmente ~ 600 MB de dados e pode levar até 30 minutos, dependendo da velocidade da rede. Esses dados iniciais serão baixados apenas uma vez e estarão disponíveis para todas as carteiras Litecoin", "litecoin_mweb_warning": "O uso do MWEB baixará inicialmente ~ 600 MB de dados e pode levar até 30 minutos, dependendo da velocidade da rede. Esses dados iniciais serão baixados apenas uma vez e estarão disponíveis para todas as carteiras Litecoin",
"litecoin_what_is_mweb": "O que é MWeb?", "litecoin_what_is_mweb": "O que é MWeb?",
"live_fee_rates": "Taxas de taxas ao vivo via API",
"load_more": "Carregue mais", "load_more": "Carregue mais",
"loading_your_wallet": "Abrindo sua carteira", "loading_your_wallet": "Abrindo sua carteira",
"login": "Login", "login": "Login",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Вы уверены, что хотите удалить кошелек ${wallet_name}?", "delete_wallet_confirm_message": "Вы уверены, что хотите удалить кошелек ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Вы уверены, что хотите удалить подключение к", "deleteConnectionConfirmationPrompt": "Вы уверены, что хотите удалить подключение к",
"denominations": "Деноминации", "denominations": "Деноминации",
"derivationpath": "Путь получения",
"descending": "Нисходящий", "descending": "Нисходящий",
"description": "Описание", "description": "Описание",
"destination_tag": "Целевой тег:", "destination_tag": "Целевой тег:",
@ -207,6 +208,7 @@
"disable_buy": "Отключить действие покупки", "disable_buy": "Отключить действие покупки",
"disable_cake_2fa": "Отключить торт 2FA", "disable_cake_2fa": "Отключить торт 2FA",
"disable_exchange": "Отключить обмен", "disable_exchange": "Отключить обмен",
"disable_fee_api_warning": "Выключив это, в некоторых случаях ставки платы могут быть неточными, так что вы можете в конечном итоге переплачивать или недоплачивать сборы за ваши транзакции",
"disable_fiat": "Отключить фиат", "disable_fiat": "Отключить фиат",
"disable_sell": "Отключить действие продажи", "disable_sell": "Отключить действие продажи",
"disableBatteryOptimization": "Отключить оптимизацию батареи", "disableBatteryOptimization": "Отключить оптимизацию батареи",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Настройки MWEB", "litecoin_mweb_settings": "Настройки MWEB",
"litecoin_mweb_warning": "Использование MWEB изначально загрузит ~ 600 МБ данных и может занять до 30 минут в зависимости от скорости сети. Эти начальные данные будут загружаться только один раз и будут доступны для всех кошельков Litecoin", "litecoin_mweb_warning": "Использование MWEB изначально загрузит ~ 600 МБ данных и может занять до 30 минут в зависимости от скорости сети. Эти начальные данные будут загружаться только один раз и будут доступны для всех кошельков Litecoin",
"litecoin_what_is_mweb": "Что такое MWEB?", "litecoin_what_is_mweb": "Что такое MWEB?",
"live_fee_rates": "Ставки по сбору вживую через API",
"load_more": "Загрузи больше", "load_more": "Загрузи больше",
"loading_your_wallet": "Загрузка кошелька", "loading_your_wallet": "Загрузка кошелька",
"login": "Логин", "login": "Логин",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "คุณแน่ใจหรือว่าต้องการลบกระเป๋า${wallet_name}?", "delete_wallet_confirm_message": "คุณแน่ใจหรือว่าต้องการลบกระเป๋า${wallet_name}?",
"deleteConnectionConfirmationPrompt": "คุณแน่ใจหรือไม่ว่าต้องการลบการเชื่อมต่อไปยัง", "deleteConnectionConfirmationPrompt": "คุณแน่ใจหรือไม่ว่าต้องการลบการเชื่อมต่อไปยัง",
"denominations": "นิกาย", "denominations": "นิกาย",
"derivationpath": "เส้นทางที่ได้มา",
"descending": "ลงมา", "descending": "ลงมา",
"description": "คำอธิบาย", "description": "คำอธิบาย",
"destination_tag": "แท็กปลายทาง:", "destination_tag": "แท็กปลายทาง:",
@ -207,6 +208,7 @@
"disable_buy": "ปิดการใช้งานการซื้อ", "disable_buy": "ปิดการใช้งานการซื้อ",
"disable_cake_2fa": "ปิดการใช้งานเค้ก 2FA", "disable_cake_2fa": "ปิดการใช้งานเค้ก 2FA",
"disable_exchange": "ปิดใช้งานการแลกเปลี่ยน", "disable_exchange": "ปิดใช้งานการแลกเปลี่ยน",
"disable_fee_api_warning": "โดยการปิดสิ่งนี้อัตราค่าธรรมเนียมอาจไม่ถูกต้องในบางกรณีดังนั้นคุณอาจจบลงด้วยการจ่ายเงินมากเกินไปหรือจ่ายค่าธรรมเนียมสำหรับการทำธุรกรรมของคุณมากเกินไป",
"disable_fiat": "ปิดใช้งานสกุลเงินตรา", "disable_fiat": "ปิดใช้งานสกุลเงินตรา",
"disable_sell": "ปิดการใช้งานการขาย", "disable_sell": "ปิดการใช้งานการขาย",
"disableBatteryOptimization": "ปิดใช้งานการเพิ่มประสิทธิภาพแบตเตอรี่", "disableBatteryOptimization": "ปิดใช้งานการเพิ่มประสิทธิภาพแบตเตอรี่",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "การตั้งค่า MWEB", "litecoin_mweb_settings": "การตั้งค่า MWEB",
"litecoin_mweb_warning": "การใช้ MWEB จะดาวน์โหลดข้อมูล ~ 600MB ในขั้นต้นและอาจใช้เวลาสูงสุด 30 นาทีขึ้นอยู่กับความเร็วเครือข่าย ข้อมูลเริ่มต้นนี้จะดาวน์โหลดได้เพียงครั้งเดียวและพร้อมใช้งานสำหรับกระเป๋าเงินทั้งหมดของ Litecoin", "litecoin_mweb_warning": "การใช้ MWEB จะดาวน์โหลดข้อมูล ~ 600MB ในขั้นต้นและอาจใช้เวลาสูงสุด 30 นาทีขึ้นอยู่กับความเร็วเครือข่าย ข้อมูลเริ่มต้นนี้จะดาวน์โหลดได้เพียงครั้งเดียวและพร้อมใช้งานสำหรับกระเป๋าเงินทั้งหมดของ Litecoin",
"litecoin_what_is_mweb": "MWEB คืออะไร?", "litecoin_what_is_mweb": "MWEB คืออะไร?",
"live_fee_rates": "อัตราค่าธรรมเนียมสดผ่าน API",
"load_more": "โหลดมากขึ้น", "load_more": "โหลดมากขึ้น",
"loading_your_wallet": "กำลังโหลดกระเป๋าของคุณ", "loading_your_wallet": "กำลังโหลดกระเป๋าของคุณ",
"login": "เข้าสู่ระบบ", "login": "เข้าสู่ระบบ",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Sigurado ka ba na gusto mong tanggalin ang iyong ${wallet_name} wallet?", "delete_wallet_confirm_message": "Sigurado ka ba na gusto mong tanggalin ang iyong ${wallet_name} wallet?",
"deleteConnectionConfirmationPrompt": "Sigurado ka bang gusto mong tanggalin ang koneksyon sa", "deleteConnectionConfirmationPrompt": "Sigurado ka bang gusto mong tanggalin ang koneksyon sa",
"denominations": "Mga Denominasyon", "denominations": "Mga Denominasyon",
"derivationpath": "Landas ng derivation",
"descending": "Pababang", "descending": "Pababang",
"description": "Paglalarawan", "description": "Paglalarawan",
"destination_tag": "Tag ng patutunguhan:", "destination_tag": "Tag ng patutunguhan:",
@ -207,6 +208,7 @@
"disable_buy": "Huwag paganahin ang pagkilos ng pagbili", "disable_buy": "Huwag paganahin ang pagkilos ng pagbili",
"disable_cake_2fa": "Huwag paganahin ang Cake 2FA", "disable_cake_2fa": "Huwag paganahin ang Cake 2FA",
"disable_exchange": "Huwag paganahin ang palitan", "disable_exchange": "Huwag paganahin ang palitan",
"disable_fee_api_warning": "Sa pamamagitan ng pag -off nito, ang mga rate ng bayad ay maaaring hindi tumpak sa ilang mga kaso, kaya maaari mong tapusin ang labis na bayad o pagsuporta sa mga bayarin para sa iyong mga transaksyon",
"disable_fiat": "Huwag paganahin ang fiat", "disable_fiat": "Huwag paganahin ang fiat",
"disable_sell": "Huwag paganahin ang pagkilos ng pagbebenta", "disable_sell": "Huwag paganahin ang pagkilos ng pagbebenta",
"disableBatteryOptimization": "Huwag Paganahin ang Pag-optimize ng Baterya", "disableBatteryOptimization": "Huwag Paganahin ang Pag-optimize ng Baterya",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Mga Setting ng Mweb", "litecoin_mweb_settings": "Mga Setting ng Mweb",
"litecoin_mweb_warning": "Ang paggamit ng MWEB ay unang i -download ang ~ 600MB ng data, at maaaring tumagal ng hanggang sa 30 minuto depende sa bilis ng network. Ang paunang data na ito ay mag -download lamang ng isang beses at magagamit para sa lahat ng mga wallets ng Litecoin", "litecoin_mweb_warning": "Ang paggamit ng MWEB ay unang i -download ang ~ 600MB ng data, at maaaring tumagal ng hanggang sa 30 minuto depende sa bilis ng network. Ang paunang data na ito ay mag -download lamang ng isang beses at magagamit para sa lahat ng mga wallets ng Litecoin",
"litecoin_what_is_mweb": "Ano ang MWEB?", "litecoin_what_is_mweb": "Ano ang MWEB?",
"live_fee_rates": "Mga rate ng live na bayad sa pamamagitan ng API",
"load_more": "Mag-load pa", "load_more": "Mag-load pa",
"loading_your_wallet": "Naglo-load ng iyong wallet", "loading_your_wallet": "Naglo-load ng iyong wallet",
"login": "Mag-login", "login": "Mag-login",
@ -669,14 +672,14 @@
"show_details": "Ipakita ang mga detalye", "show_details": "Ipakita ang mga detalye",
"show_keys": "Ipakita ang mga seed/key", "show_keys": "Ipakita ang mga seed/key",
"show_market_place": "Ipakita ang Marketplace", "show_market_place": "Ipakita ang Marketplace",
"show_seed": "Ipakita ang seed",
"sign_message": "Mag -sign Message", "sign_message": "Mag -sign Message",
"sign_up": "Mag-sign Up",
"sign_verify_message": "Mag -sign o i -verify ang mensahe", "sign_verify_message": "Mag -sign o i -verify ang mensahe",
"sign_verify_message_sub": "Mag -sign o i -verify ang isang mensahe gamit ang iyong pribadong key", "sign_verify_message_sub": "Mag -sign o i -verify ang isang mensahe gamit ang iyong pribadong key",
"sign_verify_title": "Mag -sign / Mag -verify", "sign_verify_title": "Mag -sign / Mag -verify",
"signature": "Lagda", "signature": "Lagda",
"signature_invalid_error": "Ang lagda ay hindi wasto para sa ibinigay na mensahe", "signature_invalid_error": "Ang lagda ay hindi wasto para sa ibinigay na mensahe",
"show_seed": "Ipakita ang seed",
"sign_up": "Mag-sign Up",
"signTransaction": "Mag-sign ang Transaksyon", "signTransaction": "Mag-sign ang Transaksyon",
"signup_for_card_accept_terms": "Mag-sign up para sa card at tanggapin ang mga tuntunin.", "signup_for_card_accept_terms": "Mag-sign up para sa card at tanggapin ang mga tuntunin.",
"silent_payments": "Tahimik na pagbabayad", "silent_payments": "Tahimik na pagbabayad",
@ -835,9 +838,9 @@
"use_testnet": "Gumamit ng testnet", "use_testnet": "Gumamit ng testnet",
"value": "Halaga", "value": "Halaga",
"value_type": "Uri ng halaga", "value_type": "Uri ng halaga",
"verify_message": "I -verify ang mensahe",
"variable_pair_not_supported": "Ang variable na pares na ito ay hindi suportado sa mga napiling exchange", "variable_pair_not_supported": "Ang variable na pares na ito ay hindi suportado sa mga napiling exchange",
"verification": "Pag-verify", "verification": "Pag-verify",
"verify_message": "I -verify ang mensahe",
"verify_with_2fa": "Mag-verify sa Cake 2FA", "verify_with_2fa": "Mag-verify sa Cake 2FA",
"version": "Bersyon ${currentVersion}", "version": "Bersyon ${currentVersion}",
"view_all": "Tingnan lahat", "view_all": "Tingnan lahat",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "${wallet_name} isimli cüzdanını silmek istediğinden emin misin?", "delete_wallet_confirm_message": "${wallet_name} isimli cüzdanını silmek istediğinden emin misin?",
"deleteConnectionConfirmationPrompt": "Bağlantıyı silmek istediğinizden emin misiniz?", "deleteConnectionConfirmationPrompt": "Bağlantıyı silmek istediğinizden emin misiniz?",
"denominations": "Mezhepler", "denominations": "Mezhepler",
"derivationpath": "Türev yolu",
"descending": "Azalan", "descending": "Azalan",
"description": "Tanım", "description": "Tanım",
"destination_tag": "Hedef Etiketi:", "destination_tag": "Hedef Etiketi:",
@ -207,6 +208,7 @@
"disable_buy": "Satın alma işlemini devre dışı bırak", "disable_buy": "Satın alma işlemini devre dışı bırak",
"disable_cake_2fa": "Cake 2FA'yı Devre Dışı Bırak", "disable_cake_2fa": "Cake 2FA'yı Devre Dışı Bırak",
"disable_exchange": "Borsayı devre dışı bırak", "disable_exchange": "Borsayı devre dışı bırak",
"disable_fee_api_warning": "Bunu kapatarak, ücret oranları bazı durumlarda yanlış olabilir, bu nedenle işlemleriniz için ücretleri fazla ödeyebilir veya az ödeyebilirsiniz.",
"disable_fiat": "İtibari paraları devre dışı bırak", "disable_fiat": "İtibari paraları devre dışı bırak",
"disable_sell": "Satış işlemini devre dışı bırak", "disable_sell": "Satış işlemini devre dışı bırak",
"disableBatteryOptimization": "Pil optimizasyonunu devre dışı bırakın", "disableBatteryOptimization": "Pil optimizasyonunu devre dışı bırakın",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "MWEB ayarları", "litecoin_mweb_settings": "MWEB ayarları",
"litecoin_mweb_warning": "MWEB kullanmak başlangıçta ~ 600MB veri indirir ve ağ hızına bağlı olarak 30 dakikaya kadar sürebilir. Bu ilk veriler yalnızca bir kez indirilecek ve tüm Litecoin cüzdanları için kullanılabilir olacak", "litecoin_mweb_warning": "MWEB kullanmak başlangıçta ~ 600MB veri indirir ve ağ hızına bağlı olarak 30 dakikaya kadar sürebilir. Bu ilk veriler yalnızca bir kez indirilecek ve tüm Litecoin cüzdanları için kullanılabilir olacak",
"litecoin_what_is_mweb": "MWEB nedir?", "litecoin_what_is_mweb": "MWEB nedir?",
"live_fee_rates": "API üzerinden canlı ücret oranları",
"load_more": "Daha fazla yükle", "load_more": "Daha fazla yükle",
"loading_your_wallet": "Cüzdanın yükleniyor", "loading_your_wallet": "Cüzdanın yükleniyor",
"login": "Login", "login": "Login",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Ви впевнені, що хочете видалити гаманець ${wallet_name}?", "delete_wallet_confirm_message": "Ви впевнені, що хочете видалити гаманець ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Ви впевнені, що хочете видалити з’єднання з", "deleteConnectionConfirmationPrompt": "Ви впевнені, що хочете видалити з’єднання з",
"denominations": "Конфесія", "denominations": "Конфесія",
"derivationpath": "Шлях виведення",
"descending": "Низхідний", "descending": "Низхідний",
"description": "опис", "description": "опис",
"destination_tag": "Тег призначення:", "destination_tag": "Тег призначення:",
@ -207,6 +208,7 @@
"disable_buy": "Вимкнути дію покупки", "disable_buy": "Вимкнути дію покупки",
"disable_cake_2fa": "Вимкнути Cake 2FA", "disable_cake_2fa": "Вимкнути Cake 2FA",
"disable_exchange": "Вимкнути exchange", "disable_exchange": "Вимкнути exchange",
"disable_fee_api_warning": "Вимкнувши це, ставки плати в деяких випадках можуть бути неточними, тому ви можете переплатити або недооплатити плату за свої транзакції",
"disable_fiat": "Вимкнути фиат", "disable_fiat": "Вимкнути фиат",
"disable_sell": "Вимкнути дію продажу", "disable_sell": "Вимкнути дію продажу",
"disableBatteryOptimization": "Вимкнути оптимізацію акумулятора", "disableBatteryOptimization": "Вимкнути оптимізацію акумулятора",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "Налаштування MWEB", "litecoin_mweb_settings": "Налаштування MWEB",
"litecoin_mweb_warning": "Використання MWEB спочатку завантажить ~ 600 Мб даних і може зайняти до 30 хвилин залежно від швидкості мережі. Ці початкові дані завантажуються лише один раз і будуть доступні для всіх гаманців Litecoin", "litecoin_mweb_warning": "Використання MWEB спочатку завантажить ~ 600 Мб даних і може зайняти до 30 хвилин залежно від швидкості мережі. Ці початкові дані завантажуються лише один раз і будуть доступні для всіх гаманців Litecoin",
"litecoin_what_is_mweb": "Що таке mweb?", "litecoin_what_is_mweb": "Що таке mweb?",
"live_fee_rates": "Ставки плати за живий через API",
"load_more": "Завантажити ще", "load_more": "Завантажити ще",
"loading_your_wallet": "Завантаження гаманця", "loading_your_wallet": "Завантаження гаманця",
"login": "Логін", "login": "Логін",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "کیا آپ واقعی ${wallet_name} والیٹ کو حذف کرنا چاہتے ہیں؟", "delete_wallet_confirm_message": "کیا آپ واقعی ${wallet_name} والیٹ کو حذف کرنا چاہتے ہیں؟",
"deleteConnectionConfirmationPrompt": "۔ﮟﯿﮨ ﮯﺘﮨﺎﭼ ﺎﻧﺮﮐ ﻑﺬﺣ ﻮﮐ ﻦﺸﮑﻨﮐ ﭖﺁ ﮧﮐ ﮯﮨ ﻦﯿﻘﯾ ﻮﮐ ﭖﺁ ﺎﯿﮐ", "deleteConnectionConfirmationPrompt": "۔ﮟﯿﮨ ﮯﺘﮨﺎﭼ ﺎﻧﺮﮐ ﻑﺬﺣ ﻮﮐ ﻦﺸﮑﻨﮐ ﭖﺁ ﮧﮐ ﮯﮨ ﻦﯿﻘﯾ ﻮﮐ ﭖﺁ ﺎﯿﮐ",
"denominations": "فرق", "denominations": "فرق",
"derivationpath": "مشتق راستہ",
"descending": "اترتے ہوئے", "descending": "اترتے ہوئے",
"description": "ﻞﯿﺼﻔﺗ", "description": "ﻞﯿﺼﻔﺗ",
"destination_tag": "منزل کا ٹیگ:", "destination_tag": "منزل کا ٹیگ:",
@ -207,6 +208,7 @@
"disable_buy": "خرید ایکشن کو غیر فعال کریں۔", "disable_buy": "خرید ایکشن کو غیر فعال کریں۔",
"disable_cake_2fa": "کیک 2FA کو غیر فعال کریں۔", "disable_cake_2fa": "کیک 2FA کو غیر فعال کریں۔",
"disable_exchange": "تبادلے کو غیر فعال کریں۔", "disable_exchange": "تبادلے کو غیر فعال کریں۔",
"disable_fee_api_warning": "اس کو بند کرنے سے ، کچھ معاملات میں فیس کی شرح غلط ہوسکتی ہے ، لہذا آپ اپنے لین دین کے لئے فیسوں کو زیادہ ادائیگی یا ادائیگی ختم کرسکتے ہیں۔",
"disable_fiat": "فیاٹ کو غیر فعال کریں۔", "disable_fiat": "فیاٹ کو غیر فعال کریں۔",
"disable_sell": "فروخت کی کارروائی کو غیر فعال کریں۔", "disable_sell": "فروخت کی کارروائی کو غیر فعال کریں۔",
"disableBatteryOptimization": "بیٹری کی اصلاح کو غیر فعال کریں", "disableBatteryOptimization": "بیٹری کی اصلاح کو غیر فعال کریں",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "MWEB کی ترتیبات", "litecoin_mweb_settings": "MWEB کی ترتیبات",
"litecoin_mweb_warning": "MWEB کا استعمال ابتدائی طور پر m 600mb ڈیٹا ڈاؤن لوڈ کرے گا ، اور نیٹ ورک کی رفتار کے لحاظ سے 30 منٹ تک کا وقت لگ سکتا ہے۔ یہ ابتدائی اعداد و شمار صرف ایک بار ڈاؤن لوڈ کریں گے اور تمام لیٹیکوئن بٹوے کے لئے دستیاب ہوں گے", "litecoin_mweb_warning": "MWEB کا استعمال ابتدائی طور پر m 600mb ڈیٹا ڈاؤن لوڈ کرے گا ، اور نیٹ ورک کی رفتار کے لحاظ سے 30 منٹ تک کا وقت لگ سکتا ہے۔ یہ ابتدائی اعداد و شمار صرف ایک بار ڈاؤن لوڈ کریں گے اور تمام لیٹیکوئن بٹوے کے لئے دستیاب ہوں گے",
"litecoin_what_is_mweb": "MWEB کیا ہے؟", "litecoin_what_is_mweb": "MWEB کیا ہے؟",
"live_fee_rates": "API کے ذریعے براہ راست فیس کی شرح",
"load_more": "مزید لوڈ کریں", "load_more": "مزید لوڈ کریں",
"loading_your_wallet": "آپ کا بٹوہ لوڈ ہو رہا ہے۔", "loading_your_wallet": "آپ کا بٹوہ لوڈ ہو رہا ہے۔",
"login": "لاگ ان کریں", "login": "لاگ ان کریں",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "Ṣó dá ẹ lójú pé ẹ fẹ́ pa àpamọ́wọ́ ${wallet_name}?", "delete_wallet_confirm_message": "Ṣó dá ẹ lójú pé ẹ fẹ́ pa àpamọ́wọ́ ${wallet_name}?",
"deleteConnectionConfirmationPrompt": "Ṣe o da ọ loju pe o fẹ paarẹ asopọ si", "deleteConnectionConfirmationPrompt": "Ṣe o da ọ loju pe o fẹ paarẹ asopọ si",
"denominations": "Awọn ede", "denominations": "Awọn ede",
"derivationpath": "Ọna Deriji",
"descending": "Sọkalẹ", "descending": "Sọkalẹ",
"description": "Apejuwe", "description": "Apejuwe",
"destination_tag": "Orúkọ tí ìbí tó a ránṣẹ́ sí:", "destination_tag": "Orúkọ tí ìbí tó a ránṣẹ́ sí:",
@ -207,6 +208,7 @@
"disable_buy": "Ko iṣọrọ ọja", "disable_buy": "Ko iṣọrọ ọja",
"disable_cake_2fa": "Ko 2FA Cake sii", "disable_cake_2fa": "Ko 2FA Cake sii",
"disable_exchange": "Pa ilé pàṣípààrọ̀", "disable_exchange": "Pa ilé pàṣípààrọ̀",
"disable_fee_api_warning": "Nipa yiyi eyi kuro, awọn oṣuwọn owo naa le jẹ aiṣe deede ni awọn ọrọ kan, nitorinaa o le pari apọju tabi awọn idiyele ti o ni agbara fun awọn iṣowo rẹ",
"disable_fiat": "Pa owó tí ìjọba pàṣẹ wa lò", "disable_fiat": "Pa owó tí ìjọba pàṣẹ wa lò",
"disable_sell": "Ko iṣọrọ iṣọrọ", "disable_sell": "Ko iṣọrọ iṣọrọ",
"disableBatteryOptimization": "Mu Ifasi batiri", "disableBatteryOptimization": "Mu Ifasi batiri",
@ -363,6 +365,7 @@
"litecoin_mweb_settings": "Awọn eto Mweb", "litecoin_mweb_settings": "Awọn eto Mweb",
"litecoin_mweb_warning": "Lilo Mweb yoo wa lakoko igbasilẹ ~ 600MB ti data, o le gba to iṣẹju 30 da lori iyara nẹtiwọọki. Awọn data akọkọ yii yoo ṣe igbasilẹ lẹẹkan si ki o wa fun gbogbo awọn Wolinkun LiveCooin", "litecoin_mweb_warning": "Lilo Mweb yoo wa lakoko igbasilẹ ~ 600MB ti data, o le gba to iṣẹju 30 da lori iyara nẹtiwọọki. Awọn data akọkọ yii yoo ṣe igbasilẹ lẹẹkan si ki o wa fun gbogbo awọn Wolinkun LiveCooin",
"litecoin_what_is_mweb": "Kini mweb?", "litecoin_what_is_mweb": "Kini mweb?",
"live_fee_rates": "Awọn oṣuwọn Owo laaye laaye nipasẹ API",
"load_more": "Ẹru diẹ sii", "load_more": "Ẹru diẹ sii",
"loading_your_wallet": "A ń ṣí àpamọ́wọ́ yín", "loading_your_wallet": "A ń ṣí àpamọ́wọ́ yín",
"login": "Orúkọ", "login": "Orúkọ",

View file

@ -195,6 +195,7 @@
"delete_wallet_confirm_message": "您确定要删除 ${wallet_name} 钱包吗?", "delete_wallet_confirm_message": "您确定要删除 ${wallet_name} 钱包吗?",
"deleteConnectionConfirmationPrompt": "您确定要删除与", "deleteConnectionConfirmationPrompt": "您确定要删除与",
"denominations": "教派", "denominations": "教派",
"derivationpath": "推导路径",
"descending": "下降", "descending": "下降",
"description": "描述", "description": "描述",
"destination_tag": "目标Tag:", "destination_tag": "目标Tag:",
@ -207,6 +208,7 @@
"disable_buy": "禁用购买操作", "disable_buy": "禁用购买操作",
"disable_cake_2fa": "禁用蛋糕 2FA", "disable_cake_2fa": "禁用蛋糕 2FA",
"disable_exchange": "禁用交换", "disable_exchange": "禁用交换",
"disable_fee_api_warning": "通过将其关闭,在某些情况下,收费率可能不准确,因此您最终可能会超额付款或支付交易费用",
"disable_fiat": "禁用法令", "disable_fiat": "禁用法令",
"disable_sell": "禁用卖出操作", "disable_sell": "禁用卖出操作",
"disableBatteryOptimization": "禁用电池优化", "disableBatteryOptimization": "禁用电池优化",
@ -362,6 +364,7 @@
"litecoin_mweb_settings": "MWEB设置", "litecoin_mweb_settings": "MWEB设置",
"litecoin_mweb_warning": "使用MWEB最初将下载约600MB的数据并且最多可能需要30分钟的时间具体取决于网络速度。此初始数据只能下载一次并适用于所有莱特币钱包", "litecoin_mweb_warning": "使用MWEB最初将下载约600MB的数据并且最多可能需要30分钟的时间具体取决于网络速度。此初始数据只能下载一次并适用于所有莱特币钱包",
"litecoin_what_is_mweb": "什么是MWEB", "litecoin_what_is_mweb": "什么是MWEB",
"live_fee_rates": "通过API的实时费率",
"load_more": "装载更多", "load_more": "装载更多",
"loading_your_wallet": "加载您的钱包", "loading_your_wallet": "加载您的钱包",
"login": "登录", "login": "登录",

View file

@ -152,7 +152,7 @@ abstract class Bitcoin {
String? passphrase, String? passphrase,
}); });
WalletCredentials createBitcoinRestoreWalletFromWIFCredentials({required String name, required String password, required String wif, WalletInfo? walletInfo}); WalletCredentials createBitcoinRestoreWalletFromWIFCredentials({required String name, required String password, required String wif, WalletInfo? walletInfo});
WalletCredentials createBitcoinNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password}); WalletCredentials createBitcoinNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? passphrase});
WalletCredentials createBitcoinHardwareWalletCredentials({required String name, required HardwareAccountData accountData, WalletInfo? walletInfo}); WalletCredentials createBitcoinHardwareWalletCredentials({required String name, required HardwareAccountData accountData, WalletInfo? walletInfo});
List<String> getWordList(); List<String> getWordList();
Map<String, String> getWalletKeys(Object wallet); Map<String, String> getWalletKeys(Object wallet);
@ -1026,10 +1026,10 @@ abstract class BitcoinCash {
Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource, bool isDirect); Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource, bool isDirect);
WalletCredentials createBitcoinCashNewWalletCredentials( WalletCredentials createBitcoinCashNewWalletCredentials(
{required String name, WalletInfo? walletInfo, String? password}); {required String name, WalletInfo? walletInfo, String? password, String? passphrase});
WalletCredentials createBitcoinCashRestoreWalletFromSeedCredentials( WalletCredentials createBitcoinCashRestoreWalletFromSeedCredentials(
{required String name, required String mnemonic, required String password}); {required String name, required String mnemonic, required String password, String? passphrase});
TransactionPriority deserializeBitcoinCashTransactionPriority(int raw); TransactionPriority deserializeBitcoinCashTransactionPriority(int raw);