mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-11-16 17:27:37 +00:00
Merge branch 'main' into CW-607-Update-list-of-Trocador-providers-to-be-fetched-from-the-API
This commit is contained in:
commit
e8d0ecdc47
90 changed files with 1133 additions and 720 deletions
|
@ -1,35 +1,30 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="__APP_PACKAGE__">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||
|
||||
<!--bibo01 : hardware option-->
|
||||
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
|
||||
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
|
||||
<!-- bibo01 : hardware option-->
|
||||
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
|
||||
|
||||
<!-- required for API 18 - 30 -->
|
||||
<uses-permission
|
||||
android:name="android.permission.BLUETOOTH"
|
||||
android:maxSdkVersion="30" />
|
||||
<uses-permission
|
||||
android:name="android.permission.BLUETOOTH_ADMIN"
|
||||
android:maxSdkVersion="30" />
|
||||
<!-- required for API 18 - 30 -->
|
||||
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
|
||||
|
||||
<!-- API 31+ -->
|
||||
<!-- required for API <= 29 -->
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
|
||||
|
||||
<!-- API 31+ -->
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission
|
||||
android:name="android.permission.BLUETOOTH_SCAN"
|
||||
android:usesPermissionFlags="neverForLocation" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
|
||||
|
||||
|
||||
<application
|
||||
android:name=".Application"
|
||||
android:label="${APP_NAME}"
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
Enhance auto-address generation for Monero
|
||||
Bug fixes and enhancements
|
||||
Monero enhancements for sending and address generation
|
||||
StealthEx
|
||||
LetsExchange
|
||||
Visual enhancements and bug fixes
|
|
@ -1,4 +1,9 @@
|
|||
Enable BIP39 by default for wallet creation also on Bitcoin/Litecoin (Electrum seed type is still accessible through advanced settings page)
|
||||
Improve fee calculation for Bitcoin to protect against overpaying or underpaying
|
||||
Enhance auto-address generation for Monero
|
||||
Bug fixes and enhancements
|
||||
Add Litecoin MWEB
|
||||
Wallet groups (same seed, multiple wallets)
|
||||
Silent Payments enhancements
|
||||
Monero enhancements for sending and address generation
|
||||
StealthEx
|
||||
LetsExchange
|
||||
Replace-By-Fee improvements
|
||||
ERC20 tokens potential scam detection
|
||||
Visual enhancements and bug fixes
|
|
@ -30,7 +30,7 @@ class BitcoinReceivePageOption implements ReceivePageOption {
|
|||
|
||||
static const allLitecoin = [
|
||||
BitcoinReceivePageOption.p2wpkh,
|
||||
BitcoinReceivePageOption.mweb
|
||||
BitcoinReceivePageOption.mweb,
|
||||
];
|
||||
|
||||
BitcoinAddressType toType() {
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
import 'package:cw_bitcoin/bitcoin_transaction_priority.dart';
|
||||
import 'package:cw_core/output_info.dart';
|
||||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
|
||||
class BitcoinTransactionCredentials {
|
||||
BitcoinTransactionCredentials(this.outputs,
|
||||
{required this.priority, this.feeRate});
|
||||
{required this.priority, this.feeRate, this.coinTypeToSpendFrom = UnspentCoinType.any});
|
||||
|
||||
final List<OutputInfo> outputs;
|
||||
final BitcoinTransactionPriority? priority;
|
||||
final int? feeRate;
|
||||
final UnspentCoinType coinTypeToSpendFrom;
|
||||
}
|
||||
|
|
|
@ -116,7 +116,7 @@ class ElectrumClient {
|
|||
_parseResponse(message);
|
||||
}
|
||||
} catch (e) {
|
||||
print(e.toString());
|
||||
print("socket.listen: $e");
|
||||
}
|
||||
},
|
||||
onError: (Object error) {
|
||||
|
@ -125,14 +125,15 @@ class ElectrumClient {
|
|||
unterminatedString = '';
|
||||
},
|
||||
onDone: () {
|
||||
print("SOCKET CLOSED!!!!!");
|
||||
unterminatedString = '';
|
||||
try {
|
||||
if (host == socket?.address.host) {
|
||||
socket?.destroy();
|
||||
_setConnectionStatus(ConnectionStatus.disconnected);
|
||||
socket?.destroy();
|
||||
}
|
||||
} catch (e) {
|
||||
print(e.toString());
|
||||
print("onDone: $e");
|
||||
}
|
||||
},
|
||||
cancelOnError: true,
|
||||
|
@ -421,7 +422,7 @@ class ElectrumClient {
|
|||
BehaviorSubject<T>? subscribe<T>(
|
||||
{required String id, required String method, List<Object> params = const []}) {
|
||||
try {
|
||||
if (socket == null) {
|
||||
if (socket == null || !isConnected) {
|
||||
return null;
|
||||
}
|
||||
final subscription = BehaviorSubject<T>();
|
||||
|
@ -437,7 +438,7 @@ class ElectrumClient {
|
|||
|
||||
Future<dynamic> call(
|
||||
{required String method, List<Object> params = const [], Function(int)? idCallback}) async {
|
||||
if (socket == null) {
|
||||
if (socket == null || !isConnected) {
|
||||
return null;
|
||||
}
|
||||
final completer = Completer<dynamic>();
|
||||
|
@ -453,7 +454,7 @@ class ElectrumClient {
|
|||
Future<dynamic> callWithTimeout(
|
||||
{required String method, List<Object> params = const [], int timeout = 5000}) async {
|
||||
try {
|
||||
if (socket == null) {
|
||||
if (socket == null || !isConnected) {
|
||||
return null;
|
||||
}
|
||||
final completer = Completer<dynamic>();
|
||||
|
|
|
@ -4,7 +4,6 @@ import 'dart:io';
|
|||
import 'dart:isolate';
|
||||
|
||||
import 'package:bitcoin_base/bitcoin_base.dart';
|
||||
import 'package:cw_bitcoin/litecoin_wallet_addresses.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:cw_core/encryption_file_utils.dart';
|
||||
import 'package:blockchain_utils/blockchain_utils.dart';
|
||||
|
@ -23,7 +22,6 @@ import 'package:cw_bitcoin/electrum_transaction_history.dart';
|
|||
import 'package:cw_bitcoin/electrum_transaction_info.dart';
|
||||
import 'package:cw_bitcoin/electrum_wallet_addresses.dart';
|
||||
import 'package:cw_bitcoin/exceptions.dart';
|
||||
import 'package:cw_bitcoin/litecoin_wallet.dart';
|
||||
import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
|
||||
import 'package:cw_bitcoin/utils.dart';
|
||||
import 'package:cw_core/crypto_currency.dart';
|
||||
|
@ -39,6 +37,7 @@ import 'package:cw_core/wallet_info.dart';
|
|||
import 'package:cw_core/wallet_keys_file.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:cw_core/get_height_by_date.dart';
|
||||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
|
@ -168,7 +167,10 @@ abstract class ElectrumWalletBase
|
|||
@observable
|
||||
SyncStatus syncStatus;
|
||||
|
||||
Set<String> get addressesSet => walletAddresses.allAddresses.map((addr) => addr.address).toSet();
|
||||
Set<String> get addressesSet => walletAddresses.allAddresses
|
||||
.where((element) => element.type != SegwitAddresType.mweb)
|
||||
.map((addr) => addr.address)
|
||||
.toSet();
|
||||
|
||||
List<String> get scriptHashes => walletAddresses.addressesByReceiveType
|
||||
.where((addr) => RegexUtils.addressTypeFromStr(addr.address, network) is! MwebAddress)
|
||||
|
@ -583,6 +585,7 @@ abstract class ElectrumWalletBase
|
|||
required int credentialsAmount,
|
||||
required bool paysToSilentPayment,
|
||||
int? inputsCount,
|
||||
UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any,
|
||||
}) {
|
||||
List<UtxoWithAddress> utxos = [];
|
||||
List<Outpoint> vinOutpoints = [];
|
||||
|
@ -593,7 +596,20 @@ abstract class ElectrumWalletBase
|
|||
bool spendsUnconfirmedTX = false;
|
||||
|
||||
int leftAmount = credentialsAmount;
|
||||
final availableInputs = unspentCoins.where((utx) => utx.isSending && !utx.isFrozen).toList();
|
||||
final availableInputs = unspentCoins.where((utx) {
|
||||
if (!utx.isSending || utx.isFrozen) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (coinTypeToSpendFrom) {
|
||||
case UnspentCoinType.mweb:
|
||||
return utx.bitcoinAddressRecord.type == SegwitAddresType.mweb;
|
||||
case UnspentCoinType.nonMweb:
|
||||
return utx.bitcoinAddressRecord.type != SegwitAddresType.mweb;
|
||||
case UnspentCoinType.any:
|
||||
return true;
|
||||
}
|
||||
}).toList();
|
||||
final unconfirmedCoins = availableInputs.where((utx) => utx.confirmations == 0).toList();
|
||||
|
||||
for (int i = 0; i < availableInputs.length; i++) {
|
||||
|
@ -700,11 +716,13 @@ abstract class ElectrumWalletBase
|
|||
String? memo,
|
||||
int credentialsAmount = 0,
|
||||
bool hasSilentPayment = false,
|
||||
UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any,
|
||||
}) async {
|
||||
final utxoDetails = _createUTXOS(
|
||||
sendAll: true,
|
||||
credentialsAmount: credentialsAmount,
|
||||
paysToSilentPayment: hasSilentPayment,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
|
||||
int fee = await calcFee(
|
||||
|
@ -771,12 +789,14 @@ abstract class ElectrumWalletBase
|
|||
String? memo,
|
||||
bool? useUnconfirmed,
|
||||
bool hasSilentPayment = false,
|
||||
UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any,
|
||||
}) async {
|
||||
final utxoDetails = _createUTXOS(
|
||||
sendAll: false,
|
||||
credentialsAmount: credentialsAmount,
|
||||
inputsCount: inputsCount,
|
||||
paysToSilentPayment: hasSilentPayment,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
|
||||
final spendingAllCoins = utxoDetails.availableInputs.length == utxoDetails.utxos.length;
|
||||
|
@ -796,6 +816,7 @@ abstract class ElectrumWalletBase
|
|||
inputsCount: utxoDetails.utxos.length + 1,
|
||||
memo: memo,
|
||||
hasSilentPayment: hasSilentPayment,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -854,6 +875,7 @@ abstract class ElectrumWalletBase
|
|||
inputsCount: utxoDetails.utxos.length + 1,
|
||||
memo: memo,
|
||||
useUnconfirmed: useUnconfirmed ?? spendingAllConfirmedCoins,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -861,6 +883,7 @@ abstract class ElectrumWalletBase
|
|||
outputs,
|
||||
feeRate,
|
||||
memo: memo,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
|
||||
if (estimatedSendAll.amount == credentialsAmount) {
|
||||
|
@ -899,6 +922,7 @@ abstract class ElectrumWalletBase
|
|||
memo: memo,
|
||||
useUnconfirmed: useUnconfirmed ?? spendingAllConfirmedCoins,
|
||||
hasSilentPayment: hasSilentPayment,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -956,6 +980,7 @@ abstract class ElectrumWalletBase
|
|||
final hasMultiDestination = transactionCredentials.outputs.length > 1;
|
||||
final sendAll = !hasMultiDestination && transactionCredentials.outputs.first.sendAll;
|
||||
final memo = transactionCredentials.outputs.first.memo;
|
||||
final coinTypeToSpendFrom = transactionCredentials.coinTypeToSpendFrom;
|
||||
|
||||
int credentialsAmount = 0;
|
||||
bool hasSilentPayment = false;
|
||||
|
@ -1011,6 +1036,7 @@ abstract class ElectrumWalletBase
|
|||
memo: memo,
|
||||
credentialsAmount: credentialsAmount,
|
||||
hasSilentPayment: hasSilentPayment,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
} else {
|
||||
estimatedTx = await estimateTxForAmount(
|
||||
|
@ -1019,6 +1045,7 @@ abstract class ElectrumWalletBase
|
|||
feeRateInt,
|
||||
memo: memo,
|
||||
hasSilentPayment: hasSilentPayment,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1174,6 +1201,7 @@ abstract class ElectrumWalletBase
|
|||
'silent_addresses': walletAddresses.silentAddresses.map((addr) => addr.toJSON()).toList(),
|
||||
'silent_address_index': walletAddresses.currentSilentAddressIndex.toString(),
|
||||
'mweb_addresses': walletAddresses.mwebAddresses.map((addr) => addr.toJSON()).toList(),
|
||||
'alwaysScan': alwaysScan,
|
||||
});
|
||||
|
||||
int feeRate(TransactionPriority priority) {
|
||||
|
@ -1291,7 +1319,7 @@ abstract class ElectrumWalletBase
|
|||
}
|
||||
|
||||
@override
|
||||
Future<void> close() async {
|
||||
Future<void> close({required bool shouldCleanup}) async {
|
||||
try {
|
||||
await _receiveStream?.cancel();
|
||||
await electrumClient.close();
|
||||
|
@ -1314,11 +1342,15 @@ abstract class ElectrumWalletBase
|
|||
}
|
||||
|
||||
// Set the balance of all non-silent payment addresses to 0 before updating
|
||||
walletAddresses.allAddresses.forEach((addr) {
|
||||
walletAddresses.allAddresses
|
||||
.where((element) => element.type != SegwitAddresType.mweb)
|
||||
.forEach((addr) {
|
||||
if (addr is! BitcoinSilentPaymentAddressRecord) addr.balance = 0;
|
||||
});
|
||||
|
||||
await Future.wait(walletAddresses.allAddresses.map((address) async {
|
||||
await Future.wait(walletAddresses.allAddresses
|
||||
.where((element) => element.type != SegwitAddresType.mweb)
|
||||
.map((address) async {
|
||||
updatedUnspentCoins.addAll(await fetchUnspent(address));
|
||||
}));
|
||||
|
||||
|
@ -1878,6 +1910,7 @@ abstract class ElectrumWalletBase
|
|||
}
|
||||
|
||||
Future<void> updateTransactions() async {
|
||||
print("updateTransactions() called!");
|
||||
try {
|
||||
if (_isTransactionUpdating) {
|
||||
return;
|
||||
|
@ -1903,12 +1936,16 @@ abstract class ElectrumWalletBase
|
|||
|
||||
Future<void> subscribeForUpdates() async {
|
||||
final unsubscribedScriptHashes = walletAddresses.allAddresses.where(
|
||||
(address) => !_scripthashesUpdateSubject.containsKey(address.getScriptHash(network)),
|
||||
(address) =>
|
||||
!_scripthashesUpdateSubject.containsKey(address.getScriptHash(network)) &&
|
||||
address.type != SegwitAddresType.mweb,
|
||||
);
|
||||
|
||||
await Future.wait(unsubscribedScriptHashes.map((address) async {
|
||||
final sh = address.getScriptHash(network);
|
||||
await _scripthashesUpdateSubject[sh]?.close();
|
||||
if (!(_scripthashesUpdateSubject[sh]?.isClosed ?? true)) {
|
||||
await _scripthashesUpdateSubject[sh]?.close();
|
||||
}
|
||||
_scripthashesUpdateSubject[sh] = await electrumClient.scripthashUpdate(sh);
|
||||
_scripthashesUpdateSubject[sh]?.listen((event) async {
|
||||
try {
|
||||
|
@ -1918,7 +1955,7 @@ abstract class ElectrumWalletBase
|
|||
|
||||
await _fetchAddressHistory(address, await getCurrentChainTip());
|
||||
} catch (e, s) {
|
||||
print(e.toString());
|
||||
print("sub error: $e");
|
||||
_onError?.call(FlutterErrorDetails(
|
||||
exception: e,
|
||||
stack: s,
|
||||
|
@ -1996,6 +2033,7 @@ abstract class ElectrumWalletBase
|
|||
}
|
||||
|
||||
Future<void> updateBalance() async {
|
||||
print("updateBalance() called!");
|
||||
balance[currency] = await fetchBalances();
|
||||
await save();
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:io' show Platform;
|
||||
|
||||
import 'package:bitcoin_base/bitcoin_base.dart';
|
||||
import 'package:blockchain_utils/blockchain_utils.dart';
|
||||
import 'package:cw_bitcoin/bitcoin_address_record.dart';
|
||||
|
@ -238,7 +240,9 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
|
|||
await _generateInitialAddresses(type: P2pkhAddressType.p2pkh);
|
||||
} else if (walletInfo.type == WalletType.litecoin) {
|
||||
await _generateInitialAddresses(type: SegwitAddresType.p2wpkh);
|
||||
await _generateInitialAddresses(type: SegwitAddresType.mweb);
|
||||
if (Platform.isAndroid || Platform.isIOS) {
|
||||
await _generateInitialAddresses(type: SegwitAddresType.mweb);
|
||||
}
|
||||
} else if (walletInfo.type == WalletType.bitcoin) {
|
||||
await _generateInitialAddresses();
|
||||
await _generateInitialAddresses(type: P2pkhAddressType.p2pkh);
|
||||
|
|
|
@ -24,6 +24,7 @@ class ElectrumWalletSnapshot {
|
|||
required this.silentAddresses,
|
||||
required this.silentAddressIndex,
|
||||
required this.mwebAddresses,
|
||||
required this.alwaysScan,
|
||||
this.passphrase,
|
||||
this.derivationType,
|
||||
this.derivationPath,
|
||||
|
@ -46,6 +47,7 @@ class ElectrumWalletSnapshot {
|
|||
List<BitcoinAddressRecord> addresses;
|
||||
List<BitcoinSilentPaymentAddressRecord> silentAddresses;
|
||||
List<BitcoinAddressRecord> mwebAddresses;
|
||||
bool alwaysScan;
|
||||
|
||||
ElectrumBalance balance;
|
||||
Map<String, int> regularAddressIndex;
|
||||
|
@ -54,15 +56,15 @@ class ElectrumWalletSnapshot {
|
|||
DerivationType? derivationType;
|
||||
String? derivationPath;
|
||||
|
||||
static Future<ElectrumWalletSnapshot> load(
|
||||
EncryptionFileUtils encryptionFileUtils, String name, WalletType type, String password, BasedUtxoNetwork network) async {
|
||||
static Future<ElectrumWalletSnapshot> load(EncryptionFileUtils encryptionFileUtils, String name,
|
||||
WalletType type, String password, BasedUtxoNetwork network) async {
|
||||
final path = await pathForWallet(name: name, type: type);
|
||||
final jsonSource = await encryptionFileUtils.read(path: path, password: password);
|
||||
final data = json.decode(jsonSource) as Map;
|
||||
final mnemonic = data['mnemonic'] as String?;
|
||||
final xpub = data['xpub'] as String?;
|
||||
final passphrase = data['passphrase'] as String? ?? '';
|
||||
|
||||
|
||||
final addressesTmp = data['addresses'] as List? ?? <Object>[];
|
||||
final addresses = addressesTmp
|
||||
.whereType<String>()
|
||||
|
@ -81,6 +83,8 @@ class ElectrumWalletSnapshot {
|
|||
.map((addr) => BitcoinAddressRecord.fromJSON(addr, network: network))
|
||||
.toList();
|
||||
|
||||
final alwaysScan = data['alwaysScan'] as bool? ?? false;
|
||||
|
||||
final balance = ElectrumBalance.fromJSON(data['balance'] as String?) ??
|
||||
ElectrumBalance(confirmed: 0, unconfirmed: 0, frozen: 0);
|
||||
var regularAddressIndexByType = {SegwitAddresType.p2wpkh.toString(): 0};
|
||||
|
@ -124,6 +128,7 @@ class ElectrumWalletSnapshot {
|
|||
silentAddresses: silentAddresses,
|
||||
silentAddressIndex: silentAddressIndex,
|
||||
mwebAddresses: mwebAddresses,
|
||||
alwaysScan: alwaysScan,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,6 +76,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
seedBytes: seedBytes,
|
||||
encryptionFileUtils: encryptionFileUtils,
|
||||
currency: CryptoCurrency.ltc,
|
||||
alwaysScan: alwaysScan,
|
||||
) {
|
||||
mwebHd = Bip32Slip10Secp256k1.fromSeed(seedBytes).derivePath("m/1000'") as Bip32Slip10Secp256k1;
|
||||
mwebEnabled = alwaysScan ?? false;
|
||||
|
@ -101,7 +102,6 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
Timer? _feeRatesTimer;
|
||||
Timer? _processingTimer;
|
||||
StreamSubscription<Utxo>? _utxoStream;
|
||||
late RpcClient _stub;
|
||||
late bool mwebEnabled;
|
||||
bool processingUtxos = false;
|
||||
|
||||
|
@ -229,18 +229,14 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
initialRegularAddressIndex: snp?.regularAddressIndex,
|
||||
initialChangeAddressIndex: snp?.changeAddressIndex,
|
||||
addressPageType: snp?.addressPageType,
|
||||
alwaysScan: alwaysScan,
|
||||
alwaysScan: snp?.alwaysScan,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> waitForMwebAddresses() async {
|
||||
print("waitForMwebAddresses() called!");
|
||||
// ensure that we have the full 1000 mweb addresses generated before continuing:
|
||||
// should no longer be needed, but leaving here just in case
|
||||
// final mwebAddrs = (walletAddresses as LitecoinWalletAddresses).mwebAddrs;
|
||||
// while (mwebAddrs.length < 1000) {
|
||||
// print("waiting for mweb addresses to finish generating...");
|
||||
// await Future.delayed(const Duration(milliseconds: 1000));
|
||||
// }
|
||||
await (walletAddresses as LitecoinWalletAddresses).ensureMwebAddressUpToIndexExists(1020);
|
||||
}
|
||||
|
||||
|
@ -252,16 +248,24 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
return;
|
||||
}
|
||||
print("STARTING SYNC - MWEB ENABLED: $mwebEnabled");
|
||||
_syncTimer?.cancel();
|
||||
try {
|
||||
syncStatus = SyncronizingSyncStatus();
|
||||
await subscribeForUpdates();
|
||||
try {
|
||||
await subscribeForUpdates();
|
||||
} catch (e) {
|
||||
print("failed to subcribe for updates: $e");
|
||||
}
|
||||
updateFeeRates();
|
||||
|
||||
_feeRatesTimer?.cancel();
|
||||
_feeRatesTimer =
|
||||
Timer.periodic(const Duration(minutes: 1), (timer) async => await updateFeeRates());
|
||||
|
||||
if (!mwebEnabled) {
|
||||
try {
|
||||
// in case we're switching from a litecoin wallet that had mweb enabled
|
||||
CwMweb.stop();
|
||||
} catch (_) {}
|
||||
try {
|
||||
await updateAllUnspents();
|
||||
await updateTransactions();
|
||||
|
@ -276,23 +280,19 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
}
|
||||
|
||||
await waitForMwebAddresses();
|
||||
await getStub();
|
||||
await processMwebUtxos();
|
||||
await updateTransactions();
|
||||
await updateUnspent();
|
||||
await updateBalance();
|
||||
} catch (e) {
|
||||
print("failed to start mweb sync: $e");
|
||||
syncStatus = FailedSyncStatus();
|
||||
syncStatus = FailedSyncStatus(error: "failed to start");
|
||||
return;
|
||||
}
|
||||
|
||||
_syncTimer?.cancel();
|
||||
_syncTimer = Timer.periodic(const Duration(milliseconds: 1500), (timer) async {
|
||||
_syncTimer = Timer.periodic(const Duration(milliseconds: 3000), (timer) async {
|
||||
if (syncStatus is FailedSyncStatus) return;
|
||||
|
||||
print("SYNCING....");
|
||||
|
||||
final nodeHeight =
|
||||
await electrumClient.getCurrentBlockChainTip() ?? 0; // current block height of our node
|
||||
|
||||
|
@ -350,10 +350,12 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
@action
|
||||
@override
|
||||
Future<void> stopSync() async {
|
||||
print("stopSync() called!");
|
||||
_syncTimer?.cancel();
|
||||
_utxoStream?.cancel();
|
||||
_feeRatesTimer?.cancel();
|
||||
await CwMweb.stop();
|
||||
print("stopped syncing!");
|
||||
}
|
||||
|
||||
Future<void> initMwebUtxosBox() async {
|
||||
|
@ -425,9 +427,9 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
await initMwebUtxosBox();
|
||||
}
|
||||
|
||||
Future<void> handleIncoming(MwebUtxo utxo, RpcClient stub) async {
|
||||
Future<void> handleIncoming(MwebUtxo utxo) async {
|
||||
print("handleIncoming() called!");
|
||||
final status = await stub.status(StatusRequest());
|
||||
final status = await CwMweb.status(StatusRequest());
|
||||
var date = DateTime.now();
|
||||
var confirmations = 0;
|
||||
if (utxo.height > 0) {
|
||||
|
@ -493,6 +495,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
}
|
||||
|
||||
Future<void> processMwebUtxos() async {
|
||||
print("processMwebUtxos() called!");
|
||||
if (!mwebEnabled) {
|
||||
return;
|
||||
}
|
||||
|
@ -502,7 +505,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
final req = UtxosRequest(scanSecret: scanSecret, fromHeight: restoreHeight);
|
||||
|
||||
// process new utxos as they come in:
|
||||
_utxoStream?.cancel();
|
||||
await _utxoStream?.cancel();
|
||||
ResponseStream<Utxo>? responseStream = await CwMweb.utxos(req);
|
||||
if (responseStream == null) {
|
||||
throw Exception("failed to get utxos stream!");
|
||||
|
@ -544,7 +547,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
|
||||
await mwebUtxosBox.put(utxo.outputId, utxo);
|
||||
|
||||
await handleIncoming(utxo, _stub);
|
||||
await handleIncoming(utxo);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -662,6 +665,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
}
|
||||
|
||||
Future<void> updateUnspent() async {
|
||||
print("updateUnspent() called!");
|
||||
await checkMwebUtxosSpent();
|
||||
await updateAllUnspents();
|
||||
}
|
||||
|
@ -675,7 +679,6 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
if (!mwebEnabled) {
|
||||
return;
|
||||
}
|
||||
await getStub();
|
||||
|
||||
// add the mweb unspents to the list:
|
||||
List<BitcoinUnspent> mwebUnspentCoins = [];
|
||||
|
@ -718,7 +721,6 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
if (!mwebEnabled) {
|
||||
return balance;
|
||||
}
|
||||
await getStub();
|
||||
|
||||
// update unspent balances:
|
||||
await updateUnspent();
|
||||
|
@ -891,7 +893,6 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
return tx;
|
||||
}
|
||||
await waitForMwebAddresses();
|
||||
await getStub();
|
||||
|
||||
final resp = await CwMweb.create(CreateRequest(
|
||||
rawTx: hex.decode(tx.hex),
|
||||
|
@ -919,6 +920,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
}
|
||||
|
||||
if (!hasMwebInput && !hasMwebOutput) {
|
||||
tx.isMweb = false;
|
||||
return tx;
|
||||
}
|
||||
|
||||
|
@ -1000,13 +1002,17 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<void> close() async {
|
||||
Future<void> close({required bool shouldCleanup}) async {
|
||||
_utxoStream?.cancel();
|
||||
_feeRatesTimer?.cancel();
|
||||
_syncTimer?.cancel();
|
||||
_processingTimer?.cancel();
|
||||
await stopSync();
|
||||
await super.close();
|
||||
if (shouldCleanup) {
|
||||
try {
|
||||
await stopSync();
|
||||
} catch (_) {}
|
||||
}
|
||||
await super.close(shouldCleanup: shouldCleanup);
|
||||
}
|
||||
|
||||
Future<void> setMwebEnabled(bool enabled) async {
|
||||
|
@ -1014,17 +1020,16 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
|||
return;
|
||||
}
|
||||
|
||||
alwaysScan = enabled;
|
||||
mwebEnabled = enabled;
|
||||
(walletAddresses as LitecoinWalletAddresses).mwebEnabled = enabled;
|
||||
await stopSync();
|
||||
await save();
|
||||
try {
|
||||
await stopSync();
|
||||
} catch (_) {}
|
||||
await startSync();
|
||||
}
|
||||
|
||||
Future<RpcClient> getStub() async {
|
||||
_stub = await CwMweb.stub();
|
||||
return _stub;
|
||||
}
|
||||
|
||||
Future<StatusResponse> getStatusRequest() async {
|
||||
final resp = await CwMweb.status(StatusRequest());
|
||||
return resp;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import 'dart:async';
|
||||
import 'dart:io' show Platform;
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:bitcoin_base/bitcoin_base.dart';
|
||||
|
@ -39,8 +40,10 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
|
|||
bool mwebEnabled;
|
||||
int mwebTopUpIndex = 1000;
|
||||
List<String> mwebAddrs = [];
|
||||
bool generating = false;
|
||||
|
||||
List<int> get scanSecret => mwebHd.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw;
|
||||
|
||||
List<int> get spendPubkey =>
|
||||
mwebHd.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed;
|
||||
|
||||
|
@ -57,20 +60,38 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
|
|||
}
|
||||
|
||||
Future<void> ensureMwebAddressUpToIndexExists(int index) async {
|
||||
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Uint8List scan = Uint8List.fromList(scanSecret);
|
||||
Uint8List spend = Uint8List.fromList(spendPubkey);
|
||||
int count = 0;
|
||||
while (mwebAddrs.length <= (index + 1)) {
|
||||
final address = await CwMweb.address(scan, spend, mwebAddrs.length);
|
||||
mwebAddrs.add(address!);
|
||||
count++;
|
||||
// sleep for a bit to avoid making the main thread unresponsive:
|
||||
if (count > 50) {
|
||||
count = 0;
|
||||
await Future.delayed(Duration(milliseconds: 100));
|
||||
}
|
||||
|
||||
if (index < mwebAddresses.length && index < mwebAddrs.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
while (generating) {
|
||||
print("generating.....");
|
||||
// this function was called multiple times in multiple places:
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
}
|
||||
|
||||
print("Generating MWEB addresses up to index $index");
|
||||
generating = true;
|
||||
try {
|
||||
while (mwebAddrs.length <= (index + 1)) {
|
||||
final addresses =
|
||||
await CwMweb.addresses(scan, spend, mwebAddrs.length, mwebAddrs.length + 50);
|
||||
print("generated up to index ${mwebAddrs.length}");
|
||||
// sleep for a bit to avoid making the main thread unresponsive:
|
||||
await Future.delayed(Duration(milliseconds: 200));
|
||||
mwebAddrs.addAll(addresses!);
|
||||
}
|
||||
} catch (_) {}
|
||||
generating = false;
|
||||
print("Done generating MWEB addresses len: ${mwebAddrs.length}");
|
||||
|
||||
// ensure mweb addresses are up to date:
|
||||
if (mwebAddresses.length < mwebAddrs.length) {
|
||||
List<BitcoinAddressRecord> addressRecords = mwebAddrs
|
||||
|
@ -90,21 +111,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
|
|||
|
||||
Future<void> initMwebAddresses() async {
|
||||
if (mwebAddrs.length < 1000) {
|
||||
print("Generating MWEB addresses...");
|
||||
await ensureMwebAddressUpToIndexExists(20);
|
||||
print("done generating MWEB addresses");
|
||||
// List<BitcoinAddressRecord> addressRecords = mwebAddrs
|
||||
// .asMap()
|
||||
// .entries
|
||||
// .map((e) => BitcoinAddressRecord(
|
||||
// e.value,
|
||||
// index: e.key,
|
||||
// type: SegwitAddresType.mweb,
|
||||
// network: network,
|
||||
// ))
|
||||
// .toList();
|
||||
// addMwebAddresses(addressRecords);
|
||||
// print("added ${addressRecords.length} mweb addresses");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -117,6 +117,8 @@ class PendingBitcoinTransaction with PendingTransaction {
|
|||
idOverride = resp.txid;
|
||||
} on GrpcError catch (e) {
|
||||
throw BitcoinTransactionCommitFailed(errorMessage: e.message);
|
||||
} catch (e) {
|
||||
throw BitcoinTransactionCommitFailed(errorMessage: "Unknown error: ${e.toString()}");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,10 +21,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: archive
|
||||
sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d"
|
||||
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.10"
|
||||
version: "3.6.1"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -336,10 +336,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
|
||||
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
version: "7.0.1"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -403,14 +403,22 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
google_identity_services_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: google_identity_services_web
|
||||
sha256: "5be191523702ba8d7a01ca97c17fca096822ccf246b0a9f11923a6ded06199b6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.1+4"
|
||||
googleapis_auth:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: googleapis_auth
|
||||
sha256: af7c3a3edf9d0de2e1e0a77e994fae0a581c525fa7012af4fa0d4a52ed9484da
|
||||
sha256: befd71383a955535060acde8792e7efc11d2fccd03dd1d3ec434e85b68775938
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
version: "1.6.0"
|
||||
graphs:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -809,10 +817,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_foundation
|
||||
sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f
|
||||
sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.2"
|
||||
version: "2.5.3"
|
||||
shared_preferences_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1031,10 +1039,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
|
||||
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
version: "1.1.0"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
1
cw_core/lib/unspent_coin_type.dart
Normal file
1
cw_core/lib/unspent_coin_type.dart
Normal file
|
@ -0,0 +1 @@
|
|||
enum UnspentCoinType { mweb, nonMweb, any }
|
|
@ -83,7 +83,7 @@ abstract class WalletBase<BalanceType extends Balance, HistoryType extends Trans
|
|||
|
||||
Future<void> rescan({required int height});
|
||||
|
||||
void close();
|
||||
Future<void> close({required bool shouldCleanup});
|
||||
|
||||
Future<void> changePassword(String password);
|
||||
|
||||
|
|
|
@ -264,7 +264,7 @@ abstract class EVMChainWalletBase
|
|||
}
|
||||
|
||||
@override
|
||||
void close() {
|
||||
Future<void> close({required bool shouldCleanup}) async {
|
||||
_client.stop();
|
||||
_transactionsUpdateTimer?.cancel();
|
||||
_updateFeesTimer?.cancel();
|
||||
|
|
|
@ -106,7 +106,7 @@ abstract class HavenWalletBase
|
|||
Future<void>? updateBalance() => null;
|
||||
|
||||
@override
|
||||
void close() {
|
||||
Future<void> close({required bool shouldCleanup}) async {
|
||||
_listener?.stop();
|
||||
_onAccountChangeReaction?.reaction.dispose();
|
||||
_autoSaveTimer?.cancel();
|
||||
|
|
|
@ -116,7 +116,7 @@ class HavenWalletService extends WalletService<
|
|||
|
||||
if (!isValid) {
|
||||
await restoreOrResetWalletFiles(name);
|
||||
wallet.close();
|
||||
wallet.close(shouldCleanup: false);
|
||||
return openWallet(name, password);
|
||||
}
|
||||
|
||||
|
|
|
@ -170,7 +170,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
|
|||
Future<void>? updateBalance() => null;
|
||||
|
||||
@override
|
||||
void close() async {
|
||||
Future<void> close({required bool shouldCleanup}) async {
|
||||
_listener?.stop();
|
||||
_onAccountChangeReaction?.reaction.dispose();
|
||||
_onTxHistoryChangeReaction?.reaction.dispose();
|
||||
|
|
|
@ -137,7 +137,7 @@ class MoneroWalletService extends WalletService<
|
|||
|
||||
if (!isValid) {
|
||||
await restoreOrResetWalletFiles(name);
|
||||
wallet.close();
|
||||
wallet.close(shouldCleanup: false);
|
||||
return openWallet(name, password);
|
||||
}
|
||||
|
||||
|
|
|
@ -40,10 +40,17 @@ class CwMwebPlugin: FlutterPlugin, MethodCallHandler {
|
|||
port = null
|
||||
result.success(null)
|
||||
} else if (call.method == "address") {
|
||||
// val scanSecret: ByteArray = call.argument<ByteArray>("scanSecret") ?: ByteArray(0)
|
||||
// val spendPub: ByteArray = call.argument<ByteArray>("spendPub") ?: ByteArray(0)
|
||||
// val index: Int = call.argument<Int>("index") ?: 0
|
||||
// val res = Mwebd.address(scanSecret, spendPub, index)
|
||||
// result.success(res)
|
||||
} else if (call.method == "addresses") {
|
||||
val scanSecret: ByteArray = call.argument<ByteArray>("scanSecret") ?: ByteArray(0)
|
||||
val spendPub: ByteArray = call.argument<ByteArray>("spendPub") ?: ByteArray(0)
|
||||
val index: Int = call.argument<Int>("index") ?: 0
|
||||
val res = Mwebd.address(scanSecret, spendPub, index)
|
||||
val fromIndex: Int = call.argument<Int>("fromIndex") ?: 0
|
||||
val toIndex: Int = call.argument<Int>("toIndex") ?: 0
|
||||
val res = Mwebd.addresses(scanSecret, spendPub, fromIndex, toIndex)
|
||||
result.success(res)
|
||||
} else {
|
||||
result.notImplemented()
|
||||
|
|
|
@ -32,15 +32,26 @@ public static func register(with registrar: FlutterPluginRegistrar) {
|
|||
stopServer()
|
||||
result(nil)
|
||||
break
|
||||
case "address":
|
||||
// case "address":
|
||||
// let args = call.arguments as! [String: Any]
|
||||
// let scanSecret = args["scanSecret"] as! FlutterStandardTypedData
|
||||
// let spendPub = args["spendPub"] as! FlutterStandardTypedData
|
||||
// let index = args["index"] as! Int32
|
||||
|
||||
// let scanSecretData = scanSecret.data
|
||||
// let spendPubData = spendPub.data
|
||||
// result(MwebdAddress(scanSecretData, spendPubData, index))
|
||||
// break
|
||||
case "addresses":
|
||||
let args = call.arguments as! [String: Any]
|
||||
let scanSecret = args["scanSecret"] as! FlutterStandardTypedData
|
||||
let spendPub = args["spendPub"] as! FlutterStandardTypedData
|
||||
let index = args["index"] as! Int32
|
||||
let fromIndex = args["fromIndex"] as! Int32
|
||||
let toIndex = args["toIndex"] as! Int32
|
||||
|
||||
let scanSecretData = scanSecret.data
|
||||
let spendPubData = spendPub.data
|
||||
result(MwebdAddress(scanSecretData, spendPubData, index))
|
||||
result(MwebdAddresses(scanSecretData, spendPubData, fromIndex, toIndex))
|
||||
break
|
||||
default:
|
||||
result(FlutterMethodNotImplemented)
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:grpc/grpc.dart';
|
||||
|
@ -10,25 +14,51 @@ class CwMweb {
|
|||
static ClientChannel? _clientChannel;
|
||||
static int? _port;
|
||||
static const TIMEOUT_DURATION = Duration(seconds: 5);
|
||||
static Timer? logTimer;
|
||||
|
||||
static void readFileWithTimer(String filePath) {
|
||||
final file = File(filePath);
|
||||
int lastLength = 0;
|
||||
|
||||
logTimer?.cancel();
|
||||
logTimer = Timer.periodic(const Duration(seconds: 1), (timer) async {
|
||||
try {
|
||||
final currentLength = await file.length();
|
||||
|
||||
if (currentLength != lastLength) {
|
||||
final fileStream = file.openRead(lastLength, currentLength);
|
||||
final newLines = await fileStream.transform(utf8.decoder).join();
|
||||
lastLength = currentLength;
|
||||
log(newLines);
|
||||
}
|
||||
} on GrpcError catch (e) {
|
||||
log('Caught grpc error: ${e.message}');
|
||||
} catch (e) {
|
||||
log('The mwebd debug log probably is not initialized yet.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static Future<void> _initializeClient() async {
|
||||
await stop();
|
||||
// wait a few seconds to make sure the server is stopped
|
||||
await Future.delayed(const Duration(seconds: 5));
|
||||
|
||||
print("initialize client called!");
|
||||
final appDir = await getApplicationSupportDirectory();
|
||||
const ltcNodeUri = "45.79.13.180:9333";
|
||||
const ltcNodeUri = "ltc-electrum.cakewallet.com:9333";
|
||||
|
||||
String debugLogPath = "${appDir.path}/logs/debug.log";
|
||||
readFileWithTimer(debugLogPath);
|
||||
|
||||
_port = await CwMwebPlatform.instance.start(appDir.path, ltcNodeUri);
|
||||
if (_port == null || _port == 0) {
|
||||
throw Exception("Failed to start server");
|
||||
}
|
||||
print("Attempting to connect to server on port: $_port");
|
||||
log("Attempting to connect to server on port: $_port");
|
||||
|
||||
// wait for the server to finish starting up before we try to connect to it:
|
||||
await Future.delayed(const Duration(seconds: 5));
|
||||
|
||||
_clientChannel = ClientChannel('127.0.0.1', port: _port!, channelShutdownHandler: () {
|
||||
print("Channel is shutting down!");
|
||||
_rpcClient = null;
|
||||
log("Channel is shutting down!");
|
||||
},
|
||||
options: const ChannelOptions(
|
||||
credentials: ChannelCredentials.insecure(),
|
||||
|
@ -49,9 +79,15 @@ class CwMweb {
|
|||
throw Exception("blockTime shouldn't be 0! (this connection is likely broken)");
|
||||
}
|
||||
return _rpcClient!;
|
||||
} catch (e) {
|
||||
print("Attempt $i failed: $e");
|
||||
} on GrpcError catch (e) {
|
||||
log("Attempt $i failed: $e");
|
||||
log('Caught grpc error: ${e.message}');
|
||||
_rpcClient = null;
|
||||
await Future.delayed(const Duration(seconds: 3));
|
||||
} catch (e) {
|
||||
log("Attempt $i failed: $e");
|
||||
_rpcClient = null;
|
||||
await Future.delayed(const Duration(seconds: 3));
|
||||
}
|
||||
}
|
||||
throw Exception("Failed to connect after $maxRetries attempts");
|
||||
|
@ -61,22 +97,43 @@ class CwMweb {
|
|||
try {
|
||||
await CwMwebPlatform.instance.stop();
|
||||
await cleanup();
|
||||
} on GrpcError catch (e) {
|
||||
log('Caught grpc error: ${e.message}');
|
||||
} catch (e) {
|
||||
print("Error stopping server: $e");
|
||||
log("Error stopping server: $e");
|
||||
}
|
||||
}
|
||||
|
||||
static Future<String?> address(Uint8List scanSecret, Uint8List spendPub, int index) async {
|
||||
try {
|
||||
return CwMwebPlatform.instance.address(scanSecret, spendPub, index);
|
||||
return (await CwMwebPlatform.instance.addresses(scanSecret, spendPub, index, index + 1))
|
||||
?.split(',')
|
||||
.first;
|
||||
} on GrpcError catch (e) {
|
||||
log('Caught grpc error: ${e.message}');
|
||||
} catch (e) {
|
||||
print("Error getting address: $e");
|
||||
return null;
|
||||
log("Error getting address: $e");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static Future<List<String>?> addresses(
|
||||
Uint8List scanSecret, Uint8List spendPub, int fromIndex, int toIndex) async {
|
||||
try {
|
||||
return (await CwMwebPlatform.instance.addresses(scanSecret, spendPub, fromIndex, toIndex))
|
||||
?.split(',');
|
||||
} on GrpcError catch (e) {
|
||||
log('Caught grpc error: ${e.message}');
|
||||
} catch (e) {
|
||||
log("Error getting addresses: $e");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static Future<void> cleanup() async {
|
||||
await _clientChannel?.terminate();
|
||||
try {
|
||||
await _clientChannel?.terminate();
|
||||
} catch (_) {}
|
||||
_rpcClient = null;
|
||||
_clientChannel = null;
|
||||
_port = null;
|
||||
|
@ -84,51 +141,57 @@ class CwMweb {
|
|||
|
||||
// wrappers that handle the connection issues:
|
||||
static Future<SpentResponse> spent(SpentRequest request) async {
|
||||
log("mweb.spent() called");
|
||||
try {
|
||||
if (_rpcClient == null) {
|
||||
await _initializeClient();
|
||||
}
|
||||
_rpcClient = await stub();
|
||||
return await _rpcClient!.spent(request, options: CallOptions(timeout: TIMEOUT_DURATION));
|
||||
} on GrpcError catch (e) {
|
||||
log('Caught grpc error: ${e.message}');
|
||||
} catch (e) {
|
||||
print("Error getting spent: $e");
|
||||
return SpentResponse();
|
||||
log("Error getting spent: $e");
|
||||
}
|
||||
return SpentResponse();
|
||||
}
|
||||
|
||||
static Future<StatusResponse> status(StatusRequest request) async {
|
||||
log("mweb.status() called");
|
||||
try {
|
||||
if (_rpcClient == null) {
|
||||
await _initializeClient();
|
||||
}
|
||||
_rpcClient = await stub();
|
||||
return await _rpcClient!.status(request, options: CallOptions(timeout: TIMEOUT_DURATION));
|
||||
} on GrpcError catch (e) {
|
||||
log('Caught grpc error: ${e.message}');
|
||||
} catch (e) {
|
||||
print("Error getting status: $e");
|
||||
return StatusResponse();
|
||||
log("Error getting status: $e");
|
||||
}
|
||||
return StatusResponse();
|
||||
}
|
||||
|
||||
static Future<CreateResponse> create(CreateRequest request) async {
|
||||
log("mweb.create() called");
|
||||
try {
|
||||
if (_rpcClient == null) {
|
||||
await _initializeClient();
|
||||
}
|
||||
_rpcClient = await stub();
|
||||
return await _rpcClient!.create(request, options: CallOptions(timeout: TIMEOUT_DURATION));
|
||||
} on GrpcError catch (e) {
|
||||
log('Caught grpc error: ${e.message}');
|
||||
} catch (e) {
|
||||
print("Error getting create: $e");
|
||||
return CreateResponse();
|
||||
log("Error getting create: $e");
|
||||
}
|
||||
return CreateResponse();
|
||||
}
|
||||
|
||||
static Future<ResponseStream<Utxo>?> utxos(UtxosRequest request) async {
|
||||
log("mweb.utxos() called");
|
||||
try {
|
||||
if (_rpcClient == null) {
|
||||
await _initializeClient();
|
||||
}
|
||||
// this is a stream, so we should have an effectively infinite timeout:
|
||||
return _rpcClient!.utxos(request, options: CallOptions(timeout: const Duration(days: 1000 * 365)));
|
||||
_rpcClient = await stub();
|
||||
final resp = _rpcClient!
|
||||
.utxos(request, options: CallOptions(timeout: const Duration(days: 1000 * 365)));
|
||||
log("got utxo stream");
|
||||
return resp;
|
||||
} on GrpcError catch (e) {
|
||||
log('Caught grpc error: ${e.message}');
|
||||
} catch (e) {
|
||||
print("Error getting utxos: $e");
|
||||
return null;
|
||||
log("Error getting utxos: $e");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:io' show Platform;
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
|
@ -11,6 +13,9 @@ class MethodChannelCwMweb extends CwMwebPlatform {
|
|||
|
||||
@override
|
||||
Future<int?> start(String dataDir, String nodeUri) async {
|
||||
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
||||
return null;
|
||||
}
|
||||
final result =
|
||||
await methodChannel.invokeMethod<int>('start', {'dataDir': dataDir, 'nodeUri': nodeUri});
|
||||
return result;
|
||||
|
@ -18,11 +23,17 @@ class MethodChannelCwMweb extends CwMwebPlatform {
|
|||
|
||||
@override
|
||||
Future<void> stop() async {
|
||||
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
||||
return;
|
||||
}
|
||||
await methodChannel.invokeMethod<void>('stop');
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String?> address(Uint8List scanSecret, Uint8List spendPub, int index) async {
|
||||
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
||||
return null;
|
||||
}
|
||||
final result = await methodChannel.invokeMethod<String>('address', {
|
||||
'scanSecret': scanSecret,
|
||||
'spendPub': spendPub,
|
||||
|
@ -30,4 +41,18 @@ class MethodChannelCwMweb extends CwMwebPlatform {
|
|||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String?> addresses(Uint8List scanSecret, Uint8List spendPub, int fromIndex, int toIndex) async {
|
||||
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
||||
return null;
|
||||
}
|
||||
final result = await methodChannel.invokeMethod<String>('addresses', {
|
||||
'scanSecret': scanSecret,
|
||||
'spendPub': spendPub,
|
||||
'fromIndex': fromIndex,
|
||||
'toIndex': toIndex,
|
||||
});
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,4 +36,8 @@ abstract class CwMwebPlatform extends PlatformInterface {
|
|||
Future<String?> address(Uint8List scanSecret, Uint8List spendPub, int index) {
|
||||
throw UnimplementedError('address(int) has not been implemented.');
|
||||
}
|
||||
|
||||
Future<String?> addresses(Uint8List scanSecret, Uint8List spendPub, int fromIndex, int toIndex) {
|
||||
throw UnimplementedError('addresses has not been implemented.');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -149,7 +149,7 @@ abstract class NanoWalletBase
|
|||
Future<void> changePassword(String password) => throw UnimplementedError("changePassword");
|
||||
|
||||
@override
|
||||
void close() {
|
||||
Future<void> close({required bool shouldCleanup}) async {
|
||||
_client.stop();
|
||||
_receiveTimer?.cancel();
|
||||
}
|
||||
|
|
|
@ -117,10 +117,10 @@ packages:
|
|||
dependency: "direct overridden"
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292"
|
||||
sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.2.7"
|
||||
version: "7.2.7+1"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -179,7 +179,7 @@ abstract class SolanaWalletBase
|
|||
Future<void> changePassword(String password) => throw UnimplementedError("changePassword");
|
||||
|
||||
@override
|
||||
void close() {
|
||||
Future<void> close({required bool shouldCleanup}) async {
|
||||
_client.stop();
|
||||
_transactionsUpdateTimer?.cancel();
|
||||
}
|
||||
|
|
|
@ -217,7 +217,7 @@ abstract class TronWalletBase
|
|||
Future<void> changePassword(String password) => throw UnimplementedError("changePassword");
|
||||
|
||||
@override
|
||||
void close() => _transactionsUpdateTimer?.cancel();
|
||||
Future<void> close({required bool shouldCleanup}) async => _transactionsUpdateTimer?.cancel();
|
||||
|
||||
@action
|
||||
@override
|
||||
|
|
|
@ -160,7 +160,7 @@ abstract class WowneroWalletBase
|
|||
Future<void>? updateBalance() => null;
|
||||
|
||||
@override
|
||||
void close() async {
|
||||
Future<void> close({required bool shouldCleanup}) async {
|
||||
_listener?.stop();
|
||||
_onAccountChangeReaction?.reaction.dispose();
|
||||
_onTxHistoryChangeReaction?.reaction.dispose();
|
||||
|
|
|
@ -134,7 +134,7 @@ class WowneroWalletService extends WalletService<
|
|||
|
||||
if (!isValid) {
|
||||
await restoreOrResetWalletFiles(name);
|
||||
wallet.close();
|
||||
wallet.close(shouldCleanup: false);
|
||||
return openWallet(name, password);
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,38 @@ PODS:
|
|||
- Flutter
|
||||
- ReachabilitySwift
|
||||
- CryptoSwift (1.8.2)
|
||||
- cw_haven (0.0.1):
|
||||
- cw_haven/Boost (= 0.0.1)
|
||||
- cw_haven/Haven (= 0.0.1)
|
||||
- cw_haven/OpenSSL (= 0.0.1)
|
||||
- cw_haven/Sodium (= 0.0.1)
|
||||
- cw_shared_external
|
||||
- Flutter
|
||||
- cw_haven/Boost (0.0.1):
|
||||
- cw_shared_external
|
||||
- Flutter
|
||||
- cw_haven/Haven (0.0.1):
|
||||
- cw_shared_external
|
||||
- Flutter
|
||||
- cw_haven/OpenSSL (0.0.1):
|
||||
- cw_shared_external
|
||||
- Flutter
|
||||
- cw_haven/Sodium (0.0.1):
|
||||
- cw_shared_external
|
||||
- Flutter
|
||||
- cw_mweb (0.0.1):
|
||||
- Flutter
|
||||
- cw_shared_external (0.0.1):
|
||||
- cw_shared_external/Boost (= 0.0.1)
|
||||
- cw_shared_external/OpenSSL (= 0.0.1)
|
||||
- cw_shared_external/Sodium (= 0.0.1)
|
||||
- Flutter
|
||||
- cw_shared_external/Boost (0.0.1):
|
||||
- Flutter
|
||||
- cw_shared_external/OpenSSL (0.0.1):
|
||||
- Flutter
|
||||
- cw_shared_external/Sodium (0.0.1):
|
||||
- Flutter
|
||||
- device_display_brightness (0.0.1):
|
||||
- Flutter
|
||||
- device_info_plus (0.0.1):
|
||||
|
@ -96,7 +127,7 @@ PODS:
|
|||
- FlutterMacOS
|
||||
- sp_scanner (0.0.1):
|
||||
- Flutter
|
||||
- SwiftProtobuf (1.26.0)
|
||||
- SwiftProtobuf (1.27.1)
|
||||
- SwiftyGif (5.4.5)
|
||||
- Toast (4.1.1)
|
||||
- uni_links (0.0.1):
|
||||
|
@ -112,7 +143,9 @@ DEPENDENCIES:
|
|||
- barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`)
|
||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
||||
- CryptoSwift
|
||||
- cw_haven (from `.symlinks/plugins/cw_haven/ios`)
|
||||
- cw_mweb (from `.symlinks/plugins/cw_mweb/ios`)
|
||||
- cw_shared_external (from `.symlinks/plugins/cw_shared_external/ios`)
|
||||
- device_display_brightness (from `.symlinks/plugins/device_display_brightness/ios`)
|
||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||
- devicelocale (from `.symlinks/plugins/devicelocale/ios`)
|
||||
|
@ -125,7 +158,6 @@ DEPENDENCIES:
|
|||
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
||||
- in_app_review (from `.symlinks/plugins/in_app_review/ios`)
|
||||
- integration_test (from `.symlinks/plugins/integration_test/ios`)
|
||||
- package_info (from `.symlinks/plugins/package_info/ios`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||
|
@ -158,8 +190,12 @@ EXTERNAL SOURCES:
|
|||
:path: ".symlinks/plugins/barcode_scan2/ios"
|
||||
connectivity_plus:
|
||||
:path: ".symlinks/plugins/connectivity_plus/ios"
|
||||
cw_haven:
|
||||
:path: ".symlinks/plugins/cw_haven/ios"
|
||||
cw_mweb:
|
||||
:path: ".symlinks/plugins/cw_mweb/ios"
|
||||
cw_shared_external:
|
||||
:path: ".symlinks/plugins/cw_shared_external/ios"
|
||||
device_display_brightness:
|
||||
:path: ".symlinks/plugins/device_display_brightness/ios"
|
||||
device_info_plus:
|
||||
|
@ -184,8 +220,6 @@ EXTERNAL SOURCES:
|
|||
:path: ".symlinks/plugins/in_app_review/ios"
|
||||
integration_test:
|
||||
:path: ".symlinks/plugins/integration_test/ios"
|
||||
package_info:
|
||||
:path: ".symlinks/plugins/package_info/ios"
|
||||
package_info_plus:
|
||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_foundation:
|
||||
|
@ -215,7 +249,9 @@ SPEC CHECKSUMS:
|
|||
barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0
|
||||
connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d
|
||||
CryptoSwift: c63a805d8bb5e5538e88af4e44bb537776af11ea
|
||||
cw_haven: b3e54e1fbe7b8e6fda57a93206bc38f8e89b898a
|
||||
cw_mweb: 87af74f9659fed0c1a2cbfb44413f1070e79e3ae
|
||||
cw_shared_external: 2972d872b8917603478117c9957dfca611845a92
|
||||
device_display_brightness: 1510e72c567a1f6ce6ffe393dcd9afd1426034f7
|
||||
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
|
||||
devicelocale: b22617f40038496deffba44747101255cee005b0
|
||||
|
@ -243,7 +279,7 @@ SPEC CHECKSUMS:
|
|||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sp_scanner: eaa617fa827396b967116b7f1f43549ca62e9a12
|
||||
SwiftProtobuf: 5e8349171e7c2f88f5b9e683cb3cb79d1dc780b3
|
||||
SwiftProtobuf: b109bd17979d7993a84da14b1e1fdd8b0ded934a
|
||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
|
||||
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
|
||||
|
|
|
@ -14,12 +14,12 @@
|
|||
2193F104374FA2746CE8945B /* ResourceHelper.swift in Resources */ = {isa = PBXBuildFile; fileRef = 78D25C60B94E9D9E48D52E5E /* ResourceHelper.swift */; settings = {ASSET_TAGS = (BreezSDK, ); }; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
495FEFF9B395392FED3425DE /* TaskProtocol.swift in Resources */ = {isa = PBXBuildFile; fileRef = 0F42D8065219E0653321EE2B /* TaskProtocol.swift */; settings = {ASSET_TAGS = (BreezSDK, ); }; };
|
||||
4DFD1BB54A3A50573E19A583 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C663361C56EBB242598F609 /* Pods_Runner.framework */; };
|
||||
525A2200C6C2A43EDC5C8FC5 /* BreezSDKConnector.swift in Resources */ = {isa = PBXBuildFile; fileRef = 1FB06A93B13D606F06B3924D /* BreezSDKConnector.swift */; settings = {ASSET_TAGS = (BreezSDK, ); }; };
|
||||
6909E1D79C9986ADF2DE41E9 /* LnurlPayInvoice.swift in Resources */ = {isa = PBXBuildFile; fileRef = DCEA540E3586164FB47AD13E /* LnurlPayInvoice.swift */; settings = {ASSET_TAGS = (BreezSDK, ); }; };
|
||||
724FDA327BF191BC29DCAA2E /* Constants.swift in Resources */ = {isa = PBXBuildFile; fileRef = 0CCA7ADAD6FF9185EBBB2BCA /* Constants.swift */; settings = {ASSET_TAGS = (BreezSDK, ); }; };
|
||||
73138617307FA4F838D21D62 /* ServiceLogger.swift in Resources */ = {isa = PBXBuildFile; fileRef = F42258C3697CFE3C8C8D1933 /* ServiceLogger.swift */; settings = {ASSET_TAGS = (BreezSDK, ); }; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
8B1F4FCAA5EB9F3A83D32D5F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7CD6B6020744E8FA471915D /* Pods_Runner.framework */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
|
@ -50,6 +50,7 @@
|
|||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
014D7E4DBCFD76DDE652A4D9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
0C400E0F25B21ABB0025E469 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
|
||||
0C44A7192518EF8000B570ED /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = decrypt.swift; sourceTree = "<group>"; };
|
||||
0C50DFB82BF3CB56002B0EB3 /* MoneroWallet.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MoneroWallet.framework; sourceTree = "<group>"; };
|
||||
|
@ -57,13 +58,11 @@
|
|||
0C9D68C8264854B60011B691 /* secRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = secRandom.swift; sourceTree = "<group>"; };
|
||||
0CCA7ADAD6FF9185EBBB2BCA /* Constants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constants.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/Constants.swift"; sourceTree = "<group>"; };
|
||||
0F42D8065219E0653321EE2B /* TaskProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskProtocol.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/TaskProtocol.swift"; sourceTree = "<group>"; };
|
||||
11F9FC13F9EE2A705B213FA9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
1F083F2041D1F553F2AF8B62 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
1FB06A93B13D606F06B3924D /* BreezSDKConnector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BreezSDKConnector.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/BreezSDKConnector.swift"; sourceTree = "<group>"; };
|
||||
28F61114229803070973270D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
3C663361C56EBB242598F609 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
41102141140E57B1DC27FBA1 /* SDKNotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SDKNotificationService.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/SDKNotificationService.swift"; sourceTree = "<group>"; };
|
||||
58C22CBD8C22B9D6023D59F8 /* LnurlPayInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LnurlPayInfo.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/Task/LnurlPayInfo.swift"; sourceTree = "<group>"; };
|
||||
5AFFEBFC279AD49C00F906A4 /* wakeLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = wakeLock.swift; sourceTree = "<group>"; };
|
||||
|
@ -83,11 +82,12 @@
|
|||
9D2F2C9F2555316C95EE7EA3 /* RedeemSwap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RedeemSwap.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/Task/RedeemSwap.swift"; sourceTree = "<group>"; };
|
||||
9F46EE5D2BC11178009318F5 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||
ABD6FCBB0F4244B090459128 /* BreezSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BreezSDK.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/BreezSDK.swift"; sourceTree = "<group>"; };
|
||||
AD0937B0140D5A4C24E73BEA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
B3D5E78267F5F18D882FDC3B /* ServiceConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceConfig.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/ServiceConfig.swift"; sourceTree = "<group>"; };
|
||||
C58D93382C00FAC6004BCF69 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
|
||||
CE291CFD2C15DB9A00B9F709 /* WowneroWallet.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = WowneroWallet.framework; sourceTree = "<group>"; };
|
||||
CEAFE49D2C539250009FF3AD /* Mwebd.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Mwebd.xcframework; sourceTree = "<group>"; };
|
||||
D139E30AEB36740C21C00A9E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
D7CD6B6020744E8FA471915D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DCEA540E3586164FB47AD13E /* LnurlPayInvoice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LnurlPayInvoice.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/Task/LnurlPayInvoice.swift"; sourceTree = "<group>"; };
|
||||
F42258C3697CFE3C8C8D1933 /* ServiceLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServiceLogger.swift; path = "../.symlinks/plugins/breez_sdk/ios/bindings-swift/Sources/BreezSDK/ServiceLogger.swift"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
@ -97,8 +97,8 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
4DFD1BB54A3A50573E19A583 /* Pods_Runner.framework in Frameworks */,
|
||||
CEAFE4A02C53926F009FF3AD /* libresolv.tbd in Frameworks */,
|
||||
8B1F4FCAA5EB9F3A83D32D5F /* Pods_Runner.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -111,7 +111,7 @@
|
|||
CEAFE49D2C539250009FF3AD /* Mwebd.xcframework */,
|
||||
C58D93382C00FAC6004BCF69 /* libresolv.tbd */,
|
||||
0C9986A3251A932F00D566FD /* CryptoSwift.framework */,
|
||||
3C663361C56EBB242598F609 /* Pods_Runner.framework */,
|
||||
D7CD6B6020744E8FA471915D /* Pods_Runner.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
|
@ -137,10 +137,10 @@
|
|||
84389F1A05D5860790D82820 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
11F9FC13F9EE2A705B213FA9 /* Pods-Runner.debug.xcconfig */,
|
||||
1F083F2041D1F553F2AF8B62 /* Pods-Runner.release.xcconfig */,
|
||||
AD0937B0140D5A4C24E73BEA /* Pods-Runner.profile.xcconfig */,
|
||||
0B80439B9064C9708DDB0ADA /* breez_sdk-OnDemandResources */,
|
||||
014D7E4DBCFD76DDE652A4D9 /* Pods-Runner.debug.xcconfig */,
|
||||
28F61114229803070973270D /* Pods-Runner.release.xcconfig */,
|
||||
D139E30AEB36740C21C00A9E /* Pods-Runner.profile.xcconfig */,
|
||||
);
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
|
@ -222,14 +222,14 @@
|
|||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
B91154210ADCED81FBF06A85 /* [CP] Check Pods Manifest.lock */,
|
||||
11278EDF4D5DB437B3FDB787 /* [CP] Check Pods Manifest.lock */,
|
||||
CE5E8A222BEE19C700608EA1 /* CopyFiles */,
|
||||
9740EEB61CF901F6004384FC /* Run Script */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
32D0076A9969C0C38D68AF62 /* [CP] Embed Pods Frameworks */,
|
||||
F6F67323547956BC4F7B67F1 /* [CP] Embed Pods Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
|
@ -305,21 +305,26 @@
|
|||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
32D0076A9969C0C38D68AF62 /* [CP] Embed Pods Frameworks */ = {
|
||||
11278EDF4D5DB437B3FDB787 /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
inputPaths = (
|
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||
"${PODS_ROOT}/Manifest.lock",
|
||||
);
|
||||
name = "[CP] Check Pods Manifest.lock";
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
outputPaths = (
|
||||
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
|
@ -353,26 +358,21 @@
|
|||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
|
||||
};
|
||||
B91154210ADCED81FBF06A85 /* [CP] Check Pods Manifest.lock */ = {
|
||||
F6F67323547956BC4F7B67F1 /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||
"${PODS_ROOT}/Manifest.lock",
|
||||
);
|
||||
name = "[CP] Check Pods Manifest.lock";
|
||||
name = "[CP] Embed Pods Frameworks";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
|
|
@ -106,34 +106,33 @@ class CWBitcoin extends Bitcoin {
|
|||
}
|
||||
|
||||
@override
|
||||
Object createBitcoinTransactionCredentials(List<Output> outputs,
|
||||
{required TransactionPriority priority, int? feeRate}) {
|
||||
Object createBitcoinTransactionCredentials(
|
||||
List<Output> outputs, {
|
||||
required TransactionPriority priority,
|
||||
int? feeRate,
|
||||
UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any,
|
||||
}) {
|
||||
final bitcoinFeeRate =
|
||||
priority == BitcoinTransactionPriority.custom && feeRate != null ? feeRate : null;
|
||||
return BitcoinTransactionCredentials(
|
||||
outputs
|
||||
.map((out) => OutputInfo(
|
||||
fiatAmount: out.fiatAmount,
|
||||
cryptoAmount: out.cryptoAmount,
|
||||
address: out.address,
|
||||
note: out.note,
|
||||
sendAll: out.sendAll,
|
||||
extractedAddress: out.extractedAddress,
|
||||
isParsedAddress: out.isParsedAddress,
|
||||
formattedCryptoAmount: out.formattedCryptoAmount,
|
||||
memo: out.memo))
|
||||
.toList(),
|
||||
priority: priority as BitcoinTransactionPriority,
|
||||
feeRate: bitcoinFeeRate);
|
||||
outputs
|
||||
.map((out) => OutputInfo(
|
||||
fiatAmount: out.fiatAmount,
|
||||
cryptoAmount: out.cryptoAmount,
|
||||
address: out.address,
|
||||
note: out.note,
|
||||
sendAll: out.sendAll,
|
||||
extractedAddress: out.extractedAddress,
|
||||
isParsedAddress: out.isParsedAddress,
|
||||
formattedCryptoAmount: out.formattedCryptoAmount,
|
||||
memo: out.memo))
|
||||
.toList(),
|
||||
priority: priority as BitcoinTransactionPriority,
|
||||
feeRate: bitcoinFeeRate,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Object createBitcoinTransactionCredentialsRaw(List<OutputInfo> outputs,
|
||||
{TransactionPriority? priority, required int feeRate}) =>
|
||||
BitcoinTransactionCredentials(outputs,
|
||||
priority: priority != null ? priority as BitcoinTransactionPriority : null,
|
||||
feeRate: feeRate);
|
||||
|
||||
@override
|
||||
@computed
|
||||
List<ElectrumSubAddress> getSubAddresses(Object wallet) {
|
||||
|
@ -205,9 +204,20 @@ class CWBitcoin extends Bitcoin {
|
|||
(priority as BitcoinTransactionPriority).labelWithRate(rate, customRate);
|
||||
|
||||
@override
|
||||
List<BitcoinUnspent> getUnspents(Object wallet) {
|
||||
List<BitcoinUnspent> getUnspents(Object wallet,
|
||||
{UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any}) {
|
||||
final bitcoinWallet = wallet as ElectrumWallet;
|
||||
return bitcoinWallet.unspentCoins;
|
||||
return bitcoinWallet.unspentCoins.where((element) {
|
||||
switch(coinTypeToSpendFrom) {
|
||||
case UnspentCoinType.mweb:
|
||||
return element.bitcoinAddressRecord.type == SegwitAddresType.mweb;
|
||||
case UnspentCoinType.nonMweb:
|
||||
return element.bitcoinAddressRecord.type != SegwitAddresType.mweb;
|
||||
case UnspentCoinType.any:
|
||||
return true;
|
||||
}
|
||||
|
||||
}).toList();
|
||||
}
|
||||
|
||||
Future<void> updateUnspents(Object wallet) async {
|
||||
|
@ -262,7 +272,14 @@ class CWBitcoin extends Bitcoin {
|
|||
List<ReceivePageOption> getBitcoinReceivePageOptions() => BitcoinReceivePageOption.all;
|
||||
|
||||
@override
|
||||
List<ReceivePageOption> getLitecoinReceivePageOptions() => BitcoinReceivePageOption.allLitecoin;
|
||||
List<ReceivePageOption> getLitecoinReceivePageOptions() {
|
||||
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
||||
return BitcoinReceivePageOption.allLitecoin
|
||||
.where((element) => element != BitcoinReceivePageOption.mweb)
|
||||
.toList();
|
||||
}
|
||||
return BitcoinReceivePageOption.allLitecoin;
|
||||
}
|
||||
|
||||
@override
|
||||
BitcoinAddressType getBitcoinAddressType(ReceivePageOption option) {
|
||||
|
@ -608,7 +625,7 @@ class CWBitcoin extends Bitcoin {
|
|||
|
||||
final updatedOutputs = outputs.map((output) {
|
||||
try {
|
||||
final pendingOut = pendingTx!.outputs[outputs.indexOf(output)];
|
||||
final pendingOut = pendingTx.outputs[outputs.indexOf(output)];
|
||||
final updatedOutput = output;
|
||||
|
||||
updatedOutput.stealthAddress = P2trAddress.fromScriptPubkey(script: pendingOut.scriptPubKey)
|
||||
|
@ -658,8 +675,8 @@ class CWBitcoin extends Bitcoin {
|
|||
String? getUnusedMwebAddress(Object wallet) {
|
||||
try {
|
||||
final electrumWallet = wallet as ElectrumWallet;
|
||||
final walletAddresses = electrumWallet.walletAddresses as ElectrumWalletAddresses;
|
||||
final mwebAddress = walletAddresses.mwebAddresses.firstWhere((element) => !element.isUsed);
|
||||
final mwebAddress =
|
||||
electrumWallet.walletAddresses.mwebAddresses.firstWhere((element) => !element.isUsed);
|
||||
return mwebAddress.address;
|
||||
} catch (_) {
|
||||
return null;
|
||||
|
|
27
lib/di.dart
27
lib/di.dart
|
@ -172,6 +172,7 @@ import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_i
|
|||
import 'package:cake_wallet/view_model/wallet_list/wallet_edit_view_model.dart';
|
||||
import 'package:cake_wallet/view_model/wallet_restore_choose_derivation_view_model.dart';
|
||||
import 'package:cw_core/nano_account.dart';
|
||||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
import 'package:cw_core/unspent_coins_info.dart';
|
||||
import 'package:cw_core/wallet_service.dart';
|
||||
import 'package:cw_core/transaction_info.dart';
|
||||
|
@ -730,8 +731,8 @@ Future<void> setup({
|
|||
getIt.get<SendTemplateStore>(),
|
||||
getIt.get<FiatConversionStore>()));
|
||||
|
||||
getIt.registerFactory<SendViewModel>(
|
||||
() => SendViewModel(
|
||||
getIt.registerFactoryParam<SendViewModel, UnspentCoinType?, void>(
|
||||
(coinTypeToSpendFrom, _) => SendViewModel(
|
||||
getIt.get<AppStore>(),
|
||||
getIt.get<SendTemplateViewModel>(),
|
||||
getIt.get<FiatConversionStore>(),
|
||||
|
@ -739,12 +740,13 @@ Future<void> setup({
|
|||
getIt.get<ContactListViewModel>(),
|
||||
_transactionDescriptionBox,
|
||||
getIt.get<AppStore>().wallet!.isHardwareWallet ? getIt.get<LedgerViewModel>() : null,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom ?? UnspentCoinType.any,
|
||||
),
|
||||
);
|
||||
|
||||
getIt.registerFactoryParam<SendPage, PaymentRequest?, void>(
|
||||
(PaymentRequest? initialPaymentRequest, _) => SendPage(
|
||||
sendViewModel: getIt.get<SendViewModel>(),
|
||||
getIt.registerFactoryParam<SendPage, PaymentRequest?, UnspentCoinType?>(
|
||||
(PaymentRequest? initialPaymentRequest, coinTypeToSpendFrom) => SendPage(
|
||||
sendViewModel: getIt.get<SendViewModel>(param1: coinTypeToSpendFrom),
|
||||
authService: getIt.get<AuthService>(),
|
||||
initialPaymentRequest: initialPaymentRequest,
|
||||
));
|
||||
|
@ -1223,14 +1225,21 @@ Future<void> setup({
|
|||
|
||||
getIt.registerFactory(() => SupportOtherLinksPage(getIt.get<SupportViewModel>()));
|
||||
|
||||
getIt.registerFactory(() {
|
||||
getIt.registerFactoryParam<UnspentCoinsListViewModel, UnspentCoinType?, void>(
|
||||
(coinTypeToSpendFrom, _) {
|
||||
final wallet = getIt.get<AppStore>().wallet;
|
||||
|
||||
return UnspentCoinsListViewModel(wallet: wallet!, unspentCoinsInfo: _unspentCoinsInfoSource);
|
||||
return UnspentCoinsListViewModel(
|
||||
wallet: wallet!,
|
||||
unspentCoinsInfo: _unspentCoinsInfoSource,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom ?? UnspentCoinType.any,
|
||||
);
|
||||
});
|
||||
|
||||
getIt.registerFactory(() =>
|
||||
UnspentCoinsListPage(unspentCoinsListViewModel: getIt.get<UnspentCoinsListViewModel>()));
|
||||
getIt.registerFactoryParam<UnspentCoinsListPage, UnspentCoinType?, void>(
|
||||
(coinTypeToSpendFrom, _) => UnspentCoinsListPage(
|
||||
unspentCoinsListViewModel:
|
||||
getIt.get<UnspentCoinsListViewModel>(param1: coinTypeToSpendFrom)));
|
||||
|
||||
getIt.registerFactoryParam<UnspentCoinsDetailsViewModel, UnspentCoinsItem,
|
||||
UnspentCoinsListViewModel>(
|
||||
|
|
|
@ -120,6 +120,7 @@ import 'package:cw_core/crypto_currency.dart';
|
|||
import 'package:cw_core/nano_account.dart';
|
||||
import 'package:cw_core/node.dart';
|
||||
import 'package:cw_core/transaction_info.dart';
|
||||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
import 'package:cw_core/wallet_info.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
@ -184,7 +185,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
final type = settings.arguments as WalletType;
|
||||
final walletGroupsDisplayVM = getIt.get<WalletGroupsDisplayViewModel>(param1: type);
|
||||
|
||||
return CupertinoPageRoute<void>(builder: (_) => WalletGroupsDisplayPage(walletGroupsDisplayVM));
|
||||
return CupertinoPageRoute<void>(
|
||||
builder: (_) => WalletGroupsDisplayPage(walletGroupsDisplayVM));
|
||||
|
||||
case Routes.newWallet:
|
||||
final args = settings.arguments as NewWalletArguments;
|
||||
|
@ -348,13 +350,17 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
settings: settings, builder: (_) => getIt.get<DashboardPage>());
|
||||
|
||||
case Routes.send:
|
||||
final initialPaymentRequest = settings.arguments as PaymentRequest?;
|
||||
final args = settings.arguments as Map<String, dynamic>?;
|
||||
final initialPaymentRequest = args?['paymentRequest'] as PaymentRequest?;
|
||||
final coinTypeToSpendFrom = args?['coinTypeToSpendFrom'] as UnspentCoinType?;
|
||||
|
||||
return CupertinoPageRoute<void>(
|
||||
fullscreenDialog: true,
|
||||
builder: (_) => getIt.get<SendPage>(
|
||||
param1: initialPaymentRequest,
|
||||
));
|
||||
fullscreenDialog: true,
|
||||
builder: (_) => getIt.get<SendPage>(
|
||||
param1: initialPaymentRequest,
|
||||
param2: coinTypeToSpendFrom,
|
||||
),
|
||||
);
|
||||
|
||||
case Routes.sendTemplate:
|
||||
return CupertinoPageRoute<void>(
|
||||
|
@ -604,7 +610,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
fullscreenDialog: true, builder: (_) => getIt.get<SupportOtherLinksPage>());
|
||||
|
||||
case Routes.unspentCoinsList:
|
||||
return MaterialPageRoute<void>(builder: (_) => getIt.get<UnspentCoinsListPage>());
|
||||
final coinTypeToSpendFrom = settings.arguments as UnspentCoinType?;
|
||||
return MaterialPageRoute<void>(
|
||||
builder: (_) => getIt.get<UnspentCoinsListPage>(param1: coinTypeToSpendFrom));
|
||||
|
||||
case Routes.unspentCoinsDetails:
|
||||
final args = settings.arguments as List;
|
||||
|
@ -778,7 +786,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
|
||||
case Routes.walletGroupDescription:
|
||||
final walletType = settings.arguments as WalletType;
|
||||
|
||||
|
||||
return MaterialPageRoute<void>(
|
||||
builder: (_) => WalletGroupDescriptionPage(
|
||||
selectedWalletType: walletType,
|
||||
|
|
|
@ -6,7 +6,6 @@ import 'package:cake_wallet/generated/i18n.dart';
|
|||
import 'package:cake_wallet/reactions/wallet_connect.dart';
|
||||
import 'package:cake_wallet/routes.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/pages/nft_listing_page.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/widgets/action_button.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/widgets/home_screen_account_widget.dart';
|
||||
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
||||
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
|
||||
|
@ -18,14 +17,15 @@ import 'package:cake_wallet/src/widgets/standard_switch.dart';
|
|||
import 'package:cake_wallet/store/settings_store.dart';
|
||||
import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
|
||||
import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
|
||||
import 'package:cake_wallet/utils/feature_flag.dart';
|
||||
import 'package:cake_wallet/utils/payment_request.dart';
|
||||
import 'package:cake_wallet/utils/show_pop_up.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/nft_view_model.dart';
|
||||
import 'package:cw_bitcoin/bitcoin_receive_page_option.dart';
|
||||
import 'package:cw_core/crypto_currency.dart';
|
||||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
@ -382,18 +382,10 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
child: DashBoardRoundedCardWidget(
|
||||
customBorder: 30,
|
||||
title: S.of(context).litecoin_mweb,
|
||||
subTitle: '',
|
||||
subTitle: S.of(context).litecoin_mweb_description,
|
||||
hint: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
S.of(context).litecoin_mweb_description,
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 14,
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
SizedBox(height: 8),
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: () => launchUrl(
|
||||
|
@ -401,53 +393,64 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
"https://guides.cakewallet.com/docs/cryptos/litecoin/#mweb"),
|
||||
mode: LaunchMode.externalApplication,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
S.of(context).learn_more,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
height: 1,
|
||||
),
|
||||
softWrap: true,
|
||||
child: Text(
|
||||
S.of(context).learn_more,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
height: 1,
|
||||
),
|
||||
softWrap: true,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 24),
|
||||
SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
onPressed: () => _dismissMweb(context),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).primaryColor,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
Expanded(
|
||||
child: ElevatedButton(
|
||||
onPressed: () => _dismissMweb(context),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).primaryColor,
|
||||
),
|
||||
child: Text(
|
||||
S.of(context).litecoin_mweb_dismiss,
|
||||
style: TextStyle(color: Colors.white),
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
S.of(context).litecoin_mweb_dismiss,
|
||||
style: TextStyle(color: Colors.white),
|
||||
),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () => _enableMweb(context),
|
||||
child: Text(S.of(context).litecoin_enable_mweb_sync),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
child: ElevatedButton(
|
||||
onPressed: () => _enableMweb(context),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.white,
|
||||
foregroundColor: Colors.black,
|
||||
),
|
||||
child: Text(
|
||||
S.of(context).enable,
|
||||
maxLines: 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
onTap: () => {},
|
||||
icon: ImageIcon(
|
||||
AssetImage('assets/images/mweb_logo.png'),
|
||||
color:
|
||||
Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
|
||||
size: 50,
|
||||
icon: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: ImageIcon(
|
||||
AssetImage('assets/images/mweb_logo.png'),
|
||||
color: Color.fromARGB(255, 11, 70, 129),
|
||||
size: 40,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -505,7 +508,7 @@ class CryptoBalanceWidget extends StatelessWidget {
|
|||
},
|
||||
));
|
||||
}
|
||||
dashboardViewModel.setMwebScanningActive();
|
||||
dashboardViewModel.setMwebEnabled();
|
||||
}
|
||||
|
||||
Future<void> _dismissMweb(BuildContext context) async {
|
||||
|
@ -836,224 +839,300 @@ class BalanceRowWidget extends StatelessWidget {
|
|||
color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
|
||||
),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.only(top: 0, left: 24, right: 8, bottom: 16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Stack(
|
||||
children: [
|
||||
if (currency == CryptoCurrency.ltc)
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Container(
|
||||
padding: EdgeInsets.only(right: 16, top: 16),
|
||||
child: Column(
|
||||
children: [
|
||||
CakeImageWidget(
|
||||
imageUrl: 'assets/images/mweb_logo.png',
|
||||
height: 40,
|
||||
width: 40,
|
||||
displayOnError: Container(
|
||||
height: 30.0,
|
||||
width: 30.0,
|
||||
child: Center(
|
||||
child: Text(
|
||||
currency.title.substring(0, min(currency.title.length, 2)),
|
||||
style: TextStyle(fontSize: 11),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(top: 0, left: 24, right: 8, bottom: 16),
|
||||
child: Stack(
|
||||
children: [
|
||||
if (currency == CryptoCurrency.ltc)
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Container(
|
||||
padding: EdgeInsets.only(right: 16, top: 16),
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
shape: BoxShape.circle,
|
||||
color: Colors.grey.shade400,
|
||||
),
|
||||
child: ImageIcon(
|
||||
AssetImage('assets/images/mweb_logo.png'),
|
||||
color: Color.fromARGB(255, 11, 70, 129),
|
||||
size: 40,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
const SizedBox(height: 10),
|
||||
Text(
|
||||
'MWEB',
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w800,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.assetTitleColor,
|
||||
height: 1,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
if (hasSecondAvailableBalance)
|
||||
Row(
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: 24),
|
||||
Text(
|
||||
'MWEB',
|
||||
'${secondAvailableBalanceLabel}',
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
fontSize: 12,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w800,
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
height: 1,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 8),
|
||||
AutoSizeText(
|
||||
secondAvailableBalance,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.assetTitleColor,
|
||||
height: 1,
|
||||
),
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
SizedBox(height: 4),
|
||||
if (!isTestnet)
|
||||
Text(
|
||||
'${secondAvailableFiatBalance}',
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.textColor,
|
||||
height: 1,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
if (hasSecondAvailableBalance)
|
||||
Row(
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: 24),
|
||||
Text(
|
||||
'${secondAvailableBalanceLabel}',
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
height: 1,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 8),
|
||||
AutoSizeText(
|
||||
secondAvailableBalance,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.assetTitleColor,
|
||||
height: 1,
|
||||
),
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
SizedBox(height: 4),
|
||||
if (!isTestnet)
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(top: 0, left: 24, right: 8, bottom: 16),
|
||||
child: Stack(
|
||||
children: [
|
||||
if (hasSecondAdditionalBalance)
|
||||
Row(
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: 24),
|
||||
Text(
|
||||
'${secondAvailableFiatBalance}',
|
||||
'${secondAdditionalBalanceLabel}',
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color:
|
||||
Theme.of(context).extension<BalancePageTheme>()!.textColor,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
height: 1,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
Stack(
|
||||
children: [
|
||||
if (hasSecondAdditionalBalance)
|
||||
Row(
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: 24),
|
||||
Text(
|
||||
'${secondAdditionalBalanceLabel}',
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.labelTextColor,
|
||||
height: 1,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 8),
|
||||
AutoSizeText(
|
||||
secondAdditionalBalance,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.assetTitleColor,
|
||||
height: 1,
|
||||
),
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
SizedBox(height: 4),
|
||||
if (!isTestnet)
|
||||
Text(
|
||||
'${secondAdditionalFiatBalance}',
|
||||
textAlign: TextAlign.center,
|
||||
SizedBox(height: 8),
|
||||
AutoSizeText(
|
||||
secondAdditionalBalance,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontSize: 20,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color:
|
||||
Theme.of(context).extension<BalancePageTheme>()!.textColor,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.assetTitleColor,
|
||||
height: 1,
|
||||
),
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
// TODO: smarter peg in / out buttons
|
||||
// if (currency == CryptoCurrency.ltc)
|
||||
// Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.end,
|
||||
// children: [
|
||||
// Container(
|
||||
// margin: EdgeInsets.only(top: 24, right: 8),
|
||||
// child: ElevatedButton(
|
||||
// style: ElevatedButton.styleFrom(
|
||||
// backgroundColor: Theme.of(context).highlightColor,
|
||||
// ),
|
||||
// onPressed: () {
|
||||
// final mwebAddress =
|
||||
// bitcoin!.getUnusedMwebAddress(dashboardViewModel.wallet);
|
||||
// if (mwebAddress == null) return;
|
||||
// final paymentRequest =
|
||||
// PaymentRequest.fromUri(Uri.parse("litecoin:${mwebAddress}"));
|
||||
// Navigator.of(context)
|
||||
// .pushNamed(Routes.send, arguments: paymentRequest);
|
||||
// },
|
||||
// child: Container(
|
||||
// color: Colors.transparent,
|
||||
// margin: EdgeInsets.all(4),
|
||||
// child: Column(
|
||||
// mainAxisSize: MainAxisSize.max,
|
||||
// crossAxisAlignment: CrossAxisAlignment.center,
|
||||
// children: <Widget>[
|
||||
// Container(
|
||||
// alignment: Alignment.center,
|
||||
// decoration: BoxDecoration(shape: BoxShape.circle),
|
||||
// child: Image.asset(
|
||||
// 'assets/images/received.png',
|
||||
// color: Theme.of(context)
|
||||
// .extension<BalancePageTheme>()!
|
||||
// .balanceAmountColor,
|
||||
// width: 64,
|
||||
// height: 32,
|
||||
// ),
|
||||
// ),
|
||||
// SizedBox(height: 4),
|
||||
// Text(
|
||||
// S.of(context).litecoin_mweb_pegin,
|
||||
// style: TextStyle(
|
||||
// fontSize: 10,
|
||||
// color: Theme.of(context)
|
||||
// .extension<DashboardPageTheme>()!
|
||||
// .cardTextColor),
|
||||
// )
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
],
|
||||
SizedBox(height: 4),
|
||||
if (!isTestnet)
|
||||
Text(
|
||||
'${secondAdditionalFiatBalance}',
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontFamily: 'Lato',
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.textColor,
|
||||
height: 1,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
IntrinsicHeight(
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 24),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Semantics(
|
||||
label: S.of(context).litecoin_mweb_pegin,
|
||||
child: OutlinedButton(
|
||||
onPressed: () {
|
||||
final mwebAddress =
|
||||
bitcoin!.getUnusedMwebAddress(dashboardViewModel.wallet);
|
||||
PaymentRequest? paymentRequest = null;
|
||||
if ((mwebAddress?.isNotEmpty ?? false)) {
|
||||
paymentRequest =
|
||||
PaymentRequest.fromUri(Uri.parse("litecoin:${mwebAddress}"));
|
||||
}
|
||||
|
||||
Navigator.pushNamed(
|
||||
context,
|
||||
Routes.send,
|
||||
arguments: {
|
||||
'paymentRequest': paymentRequest,
|
||||
'coinTypeToSpendFrom': UnspentCoinType.nonMweb,
|
||||
},
|
||||
);
|
||||
},
|
||||
style: OutlinedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context)
|
||||
.extension<SendPageTheme>()!
|
||||
.textFieldButtonIconColor
|
||||
.withAlpha(50),
|
||||
side: BorderSide(color: Colors.grey.shade400, width: 0),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 12),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
height: 30,
|
||||
width: 30,
|
||||
'assets/images/received.png',
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.balanceAmountColor,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
S.of(context).litecoin_mweb_pegin,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.assetTitleColor,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(width: 32),
|
||||
Expanded(
|
||||
child: Semantics(
|
||||
label: S.of(context).litecoin_mweb_pegout,
|
||||
child: OutlinedButton(
|
||||
onPressed: () {
|
||||
final litecoinAddress =
|
||||
bitcoin!.getAddress(dashboardViewModel.wallet);
|
||||
PaymentRequest? paymentRequest = null;
|
||||
if (litecoinAddress.isNotEmpty) {
|
||||
paymentRequest = PaymentRequest.fromUri(
|
||||
Uri.parse("litecoin:${litecoinAddress}"));
|
||||
}
|
||||
|
||||
Navigator.pushNamed(
|
||||
context,
|
||||
Routes.send,
|
||||
arguments: {
|
||||
'paymentRequest': paymentRequest,
|
||||
'coinTypeToSpendFrom': UnspentCoinType.mweb,
|
||||
},
|
||||
);
|
||||
},
|
||||
style: OutlinedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context)
|
||||
.extension<SendPageTheme>()!
|
||||
.textFieldButtonIconColor
|
||||
.withAlpha(50),
|
||||
side: BorderSide(color: Colors.grey.shade400, width: 0),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 12),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
height: 30,
|
||||
width: 30,
|
||||
'assets/images/upload.png',
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.balanceAmountColor,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
S.of(context).litecoin_mweb_pegout,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.extension<BalancePageTheme>()!
|
||||
.assetTitleColor,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -97,14 +97,13 @@ class MenuWidgetState extends State<MenuWidget> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<SettingActions> items = SettingActions.all;
|
||||
List<SettingActions> items = List.of(SettingActions.all);
|
||||
if (!widget.dashboardViewModel.hasSilentPayments) {
|
||||
items.removeWhere((element) => element.name(context) == S.of(context).silent_payments_settings);
|
||||
}
|
||||
// if (!widget.dashboardViewModel.hasMweb) {
|
||||
// itemCount--;
|
||||
// items.removeWhere((element) => element.name(context) == S.of(context).litecoin_mweb_settings);
|
||||
// }
|
||||
if (!widget.dashboardViewModel.hasMweb) {
|
||||
items.removeWhere((element) => element.name(context) == S.of(context).litecoin_mweb_settings);
|
||||
}
|
||||
int itemCount = items.length;
|
||||
|
||||
moneroIcon = Image.asset('assets/images/monero_menu.png',
|
||||
|
@ -191,11 +190,6 @@ class MenuWidgetState extends State<MenuWidget> {
|
|||
|
||||
final item = items[index];
|
||||
|
||||
if (!widget.dashboardViewModel.hasMweb &&
|
||||
item.name(context) == S.of(context).litecoin_mweb_settings) {
|
||||
return const SizedBox();
|
||||
}
|
||||
|
||||
final isLastTile = index == itemCount - 1;
|
||||
|
||||
return SettingActionButton(
|
||||
|
|
|
@ -135,10 +135,6 @@ class RootState extends State<Root> with WidgetsBindingObserver {
|
|||
setState(() => _setInactive(true));
|
||||
}
|
||||
|
||||
if (widget.appStore.wallet?.type == WalletType.litecoin) {
|
||||
widget.appStore.wallet?.stopSync();
|
||||
}
|
||||
|
||||
break;
|
||||
case AppLifecycleState.resumed:
|
||||
widget.authService.requireAuth().then((value) {
|
||||
|
@ -148,9 +144,6 @@ class RootState extends State<Root> with WidgetsBindingObserver {
|
|||
});
|
||||
}
|
||||
});
|
||||
if (widget.appStore.wallet?.type == WalletType.litecoin) {
|
||||
widget.appStore.wallet?.startSync();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -14,7 +14,6 @@ import 'package:cake_wallet/view_model/send/output.dart';
|
|||
import 'package:cw_core/transaction_priority.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:keyboard_actions/keyboard_actions.dart';
|
||||
|
@ -373,7 +372,10 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
|
|||
padding: EdgeInsets.only(top: 6),
|
||||
child: GestureDetector(
|
||||
key: ValueKey('send_page_unspent_coin_button_key'),
|
||||
onTap: () => Navigator.of(context).pushNamed(Routes.unspentCoinsList),
|
||||
onTap: () => Navigator.of(context).pushNamed(
|
||||
Routes.unspentCoinsList,
|
||||
arguments: widget.sendViewModel.coinTypeToSpendFrom,
|
||||
),
|
||||
child: Container(
|
||||
color: Colors.transparent,
|
||||
child: Row(
|
||||
|
|
|
@ -4,7 +4,6 @@ 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_switcher_cell.dart';
|
||||
import 'package:cake_wallet/view_model/settings/mweb_settings_view_model.dart';
|
||||
import 'package:cake_wallet/view_model/settings/silent_payments_settings_view_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
|
||||
|
@ -33,9 +32,9 @@ class MwebSettingsPage extends BasePage {
|
|||
),
|
||||
SettingsSwitcherCell(
|
||||
title: S.current.litecoin_mweb_always_scan,
|
||||
value: _mwebSettingsViewModel.mwebAlwaysScan,
|
||||
value: _mwebSettingsViewModel.mwebEnabled,
|
||||
onValueChange: (_, bool value) {
|
||||
_mwebSettingsViewModel.setMwebAlwaysScan(value);
|
||||
_mwebSettingsViewModel.setMwebEnabled(value);
|
||||
},
|
||||
),
|
||||
SettingsCellWithArrow(
|
||||
|
|
|
@ -31,7 +31,6 @@ class SettingActions {
|
|||
walletSettingAction,
|
||||
addressBookSettingAction,
|
||||
silentPaymentsSettingAction,
|
||||
litecoinMwebSettingAction,
|
||||
securityBackupSettingAction,
|
||||
privacySettingAction,
|
||||
displaySettingAction,
|
||||
|
@ -50,7 +49,7 @@ class SettingActions {
|
|||
|
||||
static SettingActions litecoinMwebSettingAction = SettingActions._(
|
||||
name: (context) => S.of(context).litecoin_mweb_settings,
|
||||
image: 'assets/images/bitcoin_menu.png',
|
||||
image: 'assets/images/litecoin_menu.png',
|
||||
onTap: (BuildContext context) {
|
||||
Navigator.pop(context);
|
||||
Navigator.of(context).pushNamed(Routes.mwebSettings);
|
||||
|
|
|
@ -37,7 +37,8 @@ abstract class AppStoreBase with Store {
|
|||
@action
|
||||
Future<void> changeCurrentWallet(
|
||||
WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo> wallet) async {
|
||||
this.wallet?.close();
|
||||
bool changingToSameWalletType = this.wallet?.type == wallet.type;
|
||||
this.wallet?.close(shouldCleanup: !changingToSameWalletType);
|
||||
this.wallet = wallet;
|
||||
this.wallet!.setExceptionHandler(ExceptionHandler.onError);
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
||||
import 'package:cake_wallet/entities/fiat_api_mode.dart';
|
||||
import 'package:cake_wallet/entities/sort_balance_types.dart';
|
||||
import 'package:cake_wallet/reactions/wallet_connect.dart';
|
||||
|
@ -31,6 +32,7 @@ class BalanceRecord {
|
|||
required this.fiatSecondAdditionalBalance,
|
||||
required this.asset,
|
||||
required this.formattedAssetTitle});
|
||||
|
||||
final String fiatAdditionalBalance;
|
||||
final String fiatAvailableBalance;
|
||||
final String fiatFrozenBalance;
|
||||
|
@ -53,7 +55,22 @@ abstract class BalanceViewModelBase with Store {
|
|||
: isReversing = false,
|
||||
isShowCard = appStore.wallet!.walletInfo.isShowIntroCakePayCard,
|
||||
wallet = appStore.wallet! {
|
||||
reaction((_) => appStore.wallet, _onWalletChange);
|
||||
reaction((_) => appStore.wallet, (wallet) {
|
||||
_onWalletChange(wallet);
|
||||
_checkMweb();
|
||||
});
|
||||
|
||||
_checkMweb();
|
||||
|
||||
reaction((_) => settingsStore.mwebAlwaysScan, (bool value) {
|
||||
_checkMweb();
|
||||
});
|
||||
}
|
||||
|
||||
void _checkMweb() {
|
||||
if (wallet.type == WalletType.litecoin) {
|
||||
mwebEnabled = bitcoin!.getMwebEnabled(wallet);
|
||||
}
|
||||
}
|
||||
|
||||
final AppStore appStore;
|
||||
|
@ -336,14 +353,19 @@ abstract class BalanceViewModelBase with Store {
|
|||
});
|
||||
}
|
||||
|
||||
@observable
|
||||
bool mwebEnabled = false;
|
||||
|
||||
@computed
|
||||
bool get hasAdditionalBalance => _hasAdditionalBalanceForWalletType(wallet.type);
|
||||
|
||||
@computed
|
||||
bool get hasSecondAdditionalBalance => _hasSecondAdditionalBalanceForWalletType(wallet.type);
|
||||
bool get hasSecondAdditionalBalance =>
|
||||
mwebEnabled && _hasSecondAdditionalBalanceForWalletType(wallet.type);
|
||||
|
||||
@computed
|
||||
bool get hasSecondAvailableBalance => _hasSecondAvailableBalanceForWalletType(wallet.type);
|
||||
bool get hasSecondAvailableBalance =>
|
||||
mwebEnabled && _hasSecondAvailableBalanceForWalletType(wallet.type);
|
||||
|
||||
bool _hasAdditionalBalanceForWalletType(WalletType type) {
|
||||
switch (type) {
|
||||
|
@ -358,15 +380,16 @@ abstract class BalanceViewModelBase with Store {
|
|||
}
|
||||
|
||||
bool _hasSecondAdditionalBalanceForWalletType(WalletType type) {
|
||||
if (wallet.type == WalletType.litecoin && settingsStore.mwebAlwaysScan) {
|
||||
// if ((wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) > 0)
|
||||
return true;
|
||||
if (wallet.type == WalletType.litecoin) {
|
||||
if ((wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool _hasSecondAvailableBalanceForWalletType(WalletType type) {
|
||||
if (wallet.type == WalletType.litecoin && settingsStore.mwebAlwaysScan) {
|
||||
if (wallet.type == WalletType.litecoin) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io' show Platform;
|
||||
|
||||
import 'package:cake_wallet/.secrets.g.dart' as secrets;
|
||||
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
||||
|
@ -222,7 +224,10 @@ abstract class DashboardViewModelBase with Store {
|
|||
// subname = nano!.getCurrentAccount(_wallet).label;
|
||||
// }
|
||||
|
||||
reaction((_) => appStore.wallet, _onWalletChange);
|
||||
reaction((_) => appStore.wallet, (wallet) {
|
||||
_onWalletChange(wallet);
|
||||
_checkMweb();
|
||||
});
|
||||
|
||||
connectMapToListWithTransform(
|
||||
appStore.wallet!.transactionHistory.transactions,
|
||||
|
@ -256,16 +261,16 @@ abstract class DashboardViewModelBase with Store {
|
|||
});
|
||||
}
|
||||
|
||||
_checkMweb();
|
||||
reaction((_) => settingsStore.mwebAlwaysScan, (bool value) {
|
||||
_checkMweb();
|
||||
});
|
||||
}
|
||||
|
||||
void _checkMweb() {
|
||||
if (hasMweb) {
|
||||
mwebScanningActive = bitcoin!.getMwebEnabled(wallet);
|
||||
settingsStore.mwebEnabled = mwebScanningActive;
|
||||
reaction((_) => settingsStore.mwebAlwaysScan, (bool alwaysScan) {
|
||||
if (alwaysScan) {
|
||||
mwebScanningActive = true;
|
||||
} else {
|
||||
mwebScanningActive = false;
|
||||
}
|
||||
});
|
||||
mwebEnabled = bitcoin!.getMwebEnabled(wallet);
|
||||
balanceViewModel.mwebEnabled = mwebEnabled;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -430,34 +435,36 @@ abstract class DashboardViewModelBase with Store {
|
|||
}
|
||||
|
||||
@computed
|
||||
bool get hasMweb => wallet.type == WalletType.litecoin;
|
||||
bool get hasMweb => wallet.type == WalletType.litecoin && (Platform.isIOS || Platform.isAndroid);
|
||||
|
||||
@computed
|
||||
bool get showMwebCard => hasMweb && settingsStore.mwebCardDisplay && !mwebScanningActive;
|
||||
bool get showMwebCard => hasMweb && settingsStore.mwebCardDisplay && !mwebEnabled;
|
||||
|
||||
@observable
|
||||
bool mwebScanningActive = false;
|
||||
bool mwebEnabled = false;
|
||||
|
||||
@computed
|
||||
bool get hasEnabledMwebBefore => settingsStore.hasEnabledMwebBefore;
|
||||
|
||||
@action
|
||||
void setMwebScanningActive() {
|
||||
void setMwebEnabled() {
|
||||
if (!hasMweb) {
|
||||
return;
|
||||
}
|
||||
|
||||
settingsStore.hasEnabledMwebBefore = true;
|
||||
mwebScanningActive = true;
|
||||
mwebEnabled = true;
|
||||
bitcoin!.setMwebEnabled(wallet, true);
|
||||
balanceViewModel.mwebEnabled = true;
|
||||
settingsStore.mwebAlwaysScan = true;
|
||||
}
|
||||
|
||||
@action
|
||||
void dismissMweb() {
|
||||
settingsStore.mwebCardDisplay = false;
|
||||
balanceViewModel.mwebEnabled = false;
|
||||
settingsStore.mwebAlwaysScan = false;
|
||||
mwebScanningActive = false;
|
||||
mwebEnabled = false;
|
||||
bitcoin!.setMwebEnabled(wallet, false);
|
||||
}
|
||||
|
||||
|
|
|
@ -65,15 +65,16 @@ class LinkViewModel {
|
|||
if (isNanoGptLink) {
|
||||
switch (currentLink?.authority ?? '') {
|
||||
case "exchange":
|
||||
case "send":
|
||||
return PaymentRequest.fromUri(currentLink);
|
||||
case "send":
|
||||
return {"paymentRequest": PaymentRequest.fromUri(currentLink)};
|
||||
case "buy":
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (_isValidPaymentUri) {
|
||||
return PaymentRequest.fromUri(currentLink);
|
||||
return {"paymentRequest": PaymentRequest.fromUri(currentLink)};
|
||||
}
|
||||
|
||||
return null;
|
||||
|
|
|
@ -20,6 +20,7 @@ import 'package:cake_wallet/wownero/wownero.dart';
|
|||
import 'package:cw_core/exceptions.dart';
|
||||
import 'package:cw_core/transaction_info.dart';
|
||||
import 'package:cw_core/transaction_priority.dart';
|
||||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
import 'package:cake_wallet/view_model/send/output.dart';
|
||||
import 'package:cake_wallet/view_model/send/send_template_view_model.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
|
@ -67,8 +68,9 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
|||
this.balanceViewModel,
|
||||
this.contactListViewModel,
|
||||
this.transactionDescriptionBox,
|
||||
this.ledgerViewModel,
|
||||
) : state = InitialExecutionState(),
|
||||
this.ledgerViewModel, {
|
||||
this.coinTypeToSpendFrom = UnspentCoinType.any,
|
||||
}) : state = InitialExecutionState(),
|
||||
currencies = appStore.wallet!.balance.keys.toList(),
|
||||
selectedCryptoCurrency = appStore.wallet!.currency,
|
||||
hasMultipleTokens = isEVMCompatibleChain(appStore.wallet!.type) ||
|
||||
|
@ -97,6 +99,8 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
|||
|
||||
ObservableList<Output> outputs;
|
||||
|
||||
final UnspentCoinType coinTypeToSpendFrom;
|
||||
|
||||
@action
|
||||
void addOutput() {
|
||||
outputs
|
||||
|
@ -217,7 +221,14 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
|||
PendingTransaction? pendingTransaction;
|
||||
|
||||
@computed
|
||||
String get balance => wallet.balance[selectedCryptoCurrency]!.formattedFullAvailableBalance;
|
||||
String get balance {
|
||||
if (coinTypeToSpendFrom == UnspentCoinType.mweb) {
|
||||
return balanceViewModel.balances.values.first.secondAvailableBalance;
|
||||
} else if (coinTypeToSpendFrom == UnspentCoinType.nonMweb) {
|
||||
return balanceViewModel.balances.values.first.availableBalance;
|
||||
}
|
||||
return wallet.balance[selectedCryptoCurrency]!.formattedFullAvailableBalance;
|
||||
}
|
||||
|
||||
@computed
|
||||
bool get isFiatDisabled => balanceViewModel.isFiatDisabled;
|
||||
|
@ -494,8 +505,12 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
|||
case WalletType.bitcoin:
|
||||
case WalletType.litecoin:
|
||||
case WalletType.bitcoinCash:
|
||||
return bitcoin!.createBitcoinTransactionCredentials(outputs,
|
||||
priority: priority!, feeRate: customBitcoinFeeRate);
|
||||
return bitcoin!.createBitcoinTransactionCredentials(
|
||||
outputs,
|
||||
priority: priority!,
|
||||
feeRate: customBitcoinFeeRate,
|
||||
coinTypeToSpendFrom: coinTypeToSpendFrom,
|
||||
);
|
||||
|
||||
case WalletType.monero:
|
||||
return monero!
|
||||
|
|
|
@ -8,7 +8,10 @@ part 'mweb_settings_view_model.g.dart';
|
|||
class MwebSettingsViewModel = MwebSettingsViewModelBase with _$MwebSettingsViewModel;
|
||||
|
||||
abstract class MwebSettingsViewModelBase with Store {
|
||||
MwebSettingsViewModelBase(this._settingsStore, this._wallet);
|
||||
MwebSettingsViewModelBase(this._settingsStore, this._wallet) {
|
||||
mwebEnabled = bitcoin!.getMwebEnabled(_wallet);
|
||||
_settingsStore.mwebAlwaysScan = mwebEnabled;
|
||||
}
|
||||
|
||||
final SettingsStore _settingsStore;
|
||||
final WalletBase _wallet;
|
||||
|
@ -16,8 +19,8 @@ abstract class MwebSettingsViewModelBase with Store {
|
|||
@computed
|
||||
bool get mwebCardDisplay => _settingsStore.mwebCardDisplay;
|
||||
|
||||
@computed
|
||||
bool get mwebAlwaysScan => _settingsStore.mwebAlwaysScan;
|
||||
@observable
|
||||
late bool mwebEnabled;
|
||||
|
||||
@action
|
||||
void setMwebCardDisplay(bool value) {
|
||||
|
@ -25,8 +28,9 @@ abstract class MwebSettingsViewModelBase with Store {
|
|||
}
|
||||
|
||||
@action
|
||||
void setMwebAlwaysScan(bool value) {
|
||||
_settingsStore.mwebAlwaysScan = value;
|
||||
void setMwebEnabled(bool value) {
|
||||
mwebEnabled = value;
|
||||
bitcoin!.setMwebEnabled(_wallet, value);
|
||||
_settingsStore.mwebAlwaysScan = value;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ import 'package:cake_wallet/monero/monero.dart';
|
|||
import 'package:cake_wallet/utils/exception_handler.dart';
|
||||
import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart';
|
||||
import 'package:cake_wallet/wownero/wownero.dart';
|
||||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
import 'package:cw_core/unspent_coins_info.dart';
|
||||
import 'package:cw_core/unspent_transaction_output.dart';
|
||||
import 'package:cw_core/wallet_base.dart';
|
||||
|
@ -16,9 +17,11 @@ part 'unspent_coins_list_view_model.g.dart';
|
|||
class UnspentCoinsListViewModel = UnspentCoinsListViewModelBase with _$UnspentCoinsListViewModel;
|
||||
|
||||
abstract class UnspentCoinsListViewModelBase with Store {
|
||||
UnspentCoinsListViewModelBase(
|
||||
{required this.wallet, required Box<UnspentCoinsInfo> unspentCoinsInfo})
|
||||
: _unspentCoinsInfo = unspentCoinsInfo,
|
||||
UnspentCoinsListViewModelBase({
|
||||
required this.wallet,
|
||||
required Box<UnspentCoinsInfo> unspentCoinsInfo,
|
||||
this.coinTypeToSpendFrom = UnspentCoinType.any,
|
||||
}) : _unspentCoinsInfo = unspentCoinsInfo,
|
||||
_items = ObservableList<UnspentCoinsItem>() {
|
||||
_updateUnspentCoinsInfo();
|
||||
_updateUnspents();
|
||||
|
@ -26,6 +29,7 @@ abstract class UnspentCoinsListViewModelBase with Store {
|
|||
|
||||
WalletBase wallet;
|
||||
final Box<UnspentCoinsInfo> _unspentCoinsInfo;
|
||||
final UnspentCoinType coinTypeToSpendFrom;
|
||||
|
||||
@observable
|
||||
ObservableList<UnspentCoinsItem> _items;
|
||||
|
@ -103,7 +107,7 @@ abstract class UnspentCoinsListViewModelBase with Store {
|
|||
case WalletType.bitcoin:
|
||||
case WalletType.litecoin:
|
||||
case WalletType.bitcoinCash:
|
||||
return bitcoin!.getUnspents(wallet);
|
||||
return bitcoin!.getUnspents(wallet, coinTypeToSpendFrom: coinTypeToSpendFrom);
|
||||
default:
|
||||
return List.empty();
|
||||
}
|
||||
|
|
|
@ -188,36 +188,38 @@ abstract class WalletCreationVMBase with Store {
|
|||
}
|
||||
}
|
||||
|
||||
Future<List<DerivationInfo>> getDerivationInfoFromQRCredentials(RestoredWallet restoreWallet) async {
|
||||
var list = <DerivationInfo>[];
|
||||
final walletType = restoreWallet.type;
|
||||
var appStore = getIt.get<AppStore>();
|
||||
var node = appStore.settingsStore.getCurrentNode(walletType);
|
||||
Future<List<DerivationInfo>> getDerivationInfoFromQRCredentials(
|
||||
RestoredWallet restoreWallet) async {
|
||||
var list = <DerivationInfo>[];
|
||||
final walletType = restoreWallet.type;
|
||||
var appStore = getIt.get<AppStore>();
|
||||
var node = appStore.settingsStore.getCurrentNode(walletType);
|
||||
|
||||
switch (walletType) {
|
||||
case WalletType.bitcoin:
|
||||
case WalletType.litecoin:
|
||||
return bitcoin!.getDerivationsFromMnemonic(
|
||||
mnemonic: restoreWallet.mnemonicSeed!,
|
||||
node: node,
|
||||
passphrase: restoreWallet.passphrase,
|
||||
);
|
||||
case WalletType.nano:
|
||||
return nanoUtil!.getDerivationsFromMnemonic(
|
||||
mnemonic: restoreWallet.mnemonicSeed!,
|
||||
node: node,
|
||||
);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return list;
|
||||
switch (walletType) {
|
||||
case WalletType.bitcoin:
|
||||
case WalletType.litecoin:
|
||||
return bitcoin!.getDerivationsFromMnemonic(
|
||||
mnemonic: restoreWallet.mnemonicSeed!,
|
||||
node: node,
|
||||
passphrase: restoreWallet.passphrase,
|
||||
);
|
||||
case WalletType.nano:
|
||||
return nanoUtil!.getDerivationsFromMnemonic(
|
||||
mnemonic: restoreWallet.mnemonicSeed!,
|
||||
node: node,
|
||||
);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
WalletCredentials getCredentials(dynamic options) => throw UnimplementedError();
|
||||
|
||||
Future<WalletBase> process(WalletCredentials credentials) => throw UnimplementedError();
|
||||
|
||||
Future<WalletCredentials> getWalletCredentialsFromQRCredentials(RestoredWallet restoreWallet) async =>
|
||||
Future<WalletCredentials> getWalletCredentialsFromQRCredentials(
|
||||
RestoredWallet restoreWallet) async =>
|
||||
throw UnimplementedError();
|
||||
|
||||
Future<WalletBase> processFromRestoredWallet(
|
||||
|
|
|
@ -70,6 +70,8 @@ abstract class WalletListViewModelBase with Store {
|
|||
|
||||
@action
|
||||
Future<void> loadWallet(WalletListItem walletItem) async {
|
||||
// bool switchingToSameWalletType = walletItem.type == _appStore.wallet?.type;
|
||||
// await _appStore.wallet?.close(shouldCleanup: !switchingToSameWalletType);
|
||||
final wallet = await _walletLoadingService.load(walletItem.type, walletItem.name);
|
||||
await _appStore.changeCurrentWallet(wallet);
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@ PODS:
|
|||
- connectivity_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
- ReachabilitySwift
|
||||
- cw_mweb (0.0.1):
|
||||
- FlutterMacOS
|
||||
- device_info_plus (0.0.1):
|
||||
- FlutterMacOS
|
||||
- devicelocale (0.0.1):
|
||||
|
@ -37,6 +39,7 @@ PODS:
|
|||
|
||||
DEPENDENCIES:
|
||||
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`)
|
||||
- cw_mweb (from `Flutter/ephemeral/.symlinks/plugins/cw_mweb/macos`)
|
||||
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
|
||||
- devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`)
|
||||
- flutter_inappwebview_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos`)
|
||||
|
@ -60,6 +63,8 @@ SPEC REPOS:
|
|||
EXTERNAL SOURCES:
|
||||
connectivity_plus:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos
|
||||
cw_mweb:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/cw_mweb/macos
|
||||
device_info_plus:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
|
||||
devicelocale:
|
||||
|
@ -91,6 +96,7 @@ EXTERNAL SOURCES:
|
|||
|
||||
SPEC CHECKSUMS:
|
||||
connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747
|
||||
cw_mweb: 7440b12ead811dda972a9918442ea2a458e8742c
|
||||
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
|
||||
devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225
|
||||
flutter_inappwebview_macos: 9600c9df9fdb346aaa8933812009f8d94304203d
|
||||
|
@ -105,7 +111,7 @@ SPEC CHECKSUMS:
|
|||
share_plus: 36537c04ce0c3e3f5bd297ce4318b6d5ee5fd6cf
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sp_scanner: 269d96e0ec3173e69156be7239b95182be3b8303
|
||||
url_launcher_macos: 5f437abeda8c85500ceb03f5c1938a8c5a705399
|
||||
url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404
|
||||
wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269
|
||||
|
||||
PODFILE CHECKSUM: 65ec1541137fb5b35d00490dec1bb48d4d9586bb
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "تغيير العملة",
|
||||
"change_current_node": "هل أنت متأكد من تغيير العقدة الحالية إلى ${node}؟",
|
||||
"change_current_node_title": "تغيير العقدة الحالية",
|
||||
"change_exchange_provider": "تغيير مزود الصرف",
|
||||
"change_exchange_provider": "تغيير مزود المبادلة",
|
||||
"change_language": "تغيير اللغة",
|
||||
"change_language_to": "هل تريد تغيير اللغة إلى ${language}؟",
|
||||
"change_password": "تغيير كلمة المرور",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "تحرير الرمز المميز",
|
||||
"electrum_address_disclaimer": "نقوم بإنشاء عناوين جديدة في كل مرة تستخدم فيها عنوانًا ، لكن العناوين السابقة تستمر في العمل",
|
||||
"email_address": "عنوان البريد الالكترونى",
|
||||
"enable": "يُمكَِن",
|
||||
"enable_mempool_api": "MEMPOOL API للحصول على رسوم وتواريخ دقيقة",
|
||||
"enable_replace_by_fee": "تمكين الاستبدال",
|
||||
"enable_silent_payments_scanning": "ابدأ في مسح المدفوعات الصامتة ، حتى يتم الوصول إلى الطرف",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Etherscan تاريخ",
|
||||
"event": "ﺙﺪﺣ",
|
||||
"events": "ﺙﺍﺪﺣﻷﺍ",
|
||||
"exchange": "تبادل",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "إذا كنت ترغب في استبدال XMR من رصيد Cake Wallet Monero ، فيرجى التبديل إلى محفظة Monero أولاً.",
|
||||
"exchange": "تبديل",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "إذا كنت ترغب في تبديل XMR من رصيد محفظة الكعكة ، فيرجى التبديل إلى محفظة Monero أولاً.",
|
||||
"exchange_new_template": "قالب جديد",
|
||||
"exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!",
|
||||
"exchange_result_confirm": "بالضغط على تأكيد ، سترسل ${fetchingLabel} ${from} من محفظتك المسماة ${walletName} إلى العنوان الموضح أدناه. أو يمكنك الإرسال من محفظتك الخارجية إلى العنوان أدناه / QR.\n\nيرجى الضغط على تأكيد للمتابعة أو الرجوع لتغيير المبالغ.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "يرجى ملء رمز التحقق المرسل إلى بريدك الإلكتروني",
|
||||
"filter_by": "تصفية حسب",
|
||||
"first_wallet_text": "محفظة رائعة ل Monero, Bitcoin, Ethereum, Litecoin و Haven",
|
||||
"fixed_pair_not_supported": "هذا الزوج الثابت غير مدعوم في التبادلات المحددة",
|
||||
"fixed_pair_not_supported": "لا يتم دعم هذا الزوج الثابت مع خدمات المبادلة المحددة",
|
||||
"fixed_rate": "السعر الثابت",
|
||||
"fixed_rate_alert": "ستتمكن من إدخال مبلغ الاستلام عند تشغيل وضع السعر الثابت. هل تريد التبديل إلى وضع السعر الثابت؟",
|
||||
"forgot_password": "هل نسيت كلمة السر",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "تجربة",
|
||||
"nodes": "العقد",
|
||||
"nodes_list_reset_to_default_message": "هل أنت متأكد أنك تريد إعادة تعيين الإعدادات إلى الافتراضي؟",
|
||||
"none_of_selected_providers_can_exchange": "لا يمكن لأي من مقدمي الخدمة المختارين إجراء هذا التبادل",
|
||||
"none_of_selected_providers_can_exchange": "لا يمكن لأي من مقدمي الخدمات المختارين إجراء هذا المبادلة",
|
||||
"noNFTYet": "ﻥﻵﺍ ﻰﺘﺣ NFTs ﺪﺟﻮﻳ ﻻ",
|
||||
"normal": "طبيعي",
|
||||
"note_optional": "ملاحظة (اختياري)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Смени валута",
|
||||
"change_current_node": "Сигурни ли сте, че искате да промените сегашния node на ${node}?",
|
||||
"change_current_node_title": "Промени сегашния node",
|
||||
"change_exchange_provider": "Промяна на Exchange Provider",
|
||||
"change_exchange_provider": "Промяна на доставчика на суап",
|
||||
"change_language": "Смяна на езика",
|
||||
"change_language_to": "Смяна на езика на ${language}?",
|
||||
"change_password": "Смяна на парола",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Редактиране на токена",
|
||||
"electrum_address_disclaimer": "Нови адреси се генерират всеки път, когато използвате този, но и предишните продължават да работят",
|
||||
"email_address": "Имейл адрес",
|
||||
"enable": "Активиране",
|
||||
"enable_mempool_api": "Mempool API за точни такси и дати",
|
||||
"enable_replace_by_fee": "Активиране на замяна по забрана",
|
||||
"enable_silent_payments_scanning": "Започнете да сканирате безшумните плащания, докато се достигне съветът",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "История на Etherscan",
|
||||
"event": "Събитие",
|
||||
"events": "събития",
|
||||
"exchange": "Exchange",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Ако искате да обмените XMR от своя Cake Wallet Monero баланс, първо изберете своя Monero портфейл.",
|
||||
"exchange": "Разметка",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Ако искате да смените XMR от вашия баланс на портфейла на тортата Monero, моля, преминете първо към вашия портфейл Monero.",
|
||||
"exchange_new_template": "Нов шаблон",
|
||||
"exchange_provider_unsupported": "${providerName} вече не се поддържа!",
|
||||
"exchange_result_confirm": "By pressing confirm, you will be sending ${fetchingLabel} ${from} from your wallet called ${walletName} to the address shown below. Or you can send from your external wallet to the below address/QR code.\n\nPlease press confirm to continue or go back to change the amounts.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Моля, въведето кода за потвърждаване, изпратен на Вашия имейл",
|
||||
"filter_by": "Филтрирай по",
|
||||
"first_wallet_text": "Невероятен портфейл за Monero, Bitcoin, Ethereum, Litecoin и Haven",
|
||||
"fixed_pair_not_supported": "Този fixed pair не се поддържа от избраната борса",
|
||||
"fixed_pair_not_supported": "Тази фиксирана двойка не се поддържа с избраните услуги за суап",
|
||||
"fixed_rate": "Постоянен обменен курс",
|
||||
"fixed_rate_alert": "Ще можете да въведете сумата за получаване, когато е избранен постоянен обменен курс. Искате ли да изберете постоянен обменен курс?",
|
||||
"forgot_password": "Забравена парола",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Тест",
|
||||
"nodes": "Nodes",
|
||||
"nodes_list_reset_to_default_message": "Сигурни ли сте, че искате да възстановите фабричните настройки?",
|
||||
"none_of_selected_providers_can_exchange": "Нито един от избраните provider-ъри не може да направи този превод",
|
||||
"none_of_selected_providers_can_exchange": "Нито един от избраните доставчици не може да направи този размяна",
|
||||
"noNFTYet": "Все още няма NFT",
|
||||
"normal": "нормално",
|
||||
"note_optional": "Бележка (не е задължително)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Změnit měnu",
|
||||
"change_current_node": "Opravdu chcete změnit současný uzel na ${node}?",
|
||||
"change_current_node_title": "Změnit současný uzel",
|
||||
"change_exchange_provider": "Změnit směnárnu",
|
||||
"change_exchange_provider": "Změnit poskytovatele swapu",
|
||||
"change_language": "Změnit jazyk",
|
||||
"change_language_to": "Změnit jazyk na ${language}?",
|
||||
"change_password": "Změnit heslo",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Upravit token",
|
||||
"electrum_address_disclaimer": "Po každém použití je generována nová adresa, ale předchozí adresy také stále fungují",
|
||||
"email_address": "E-mailová adresa",
|
||||
"enable": "Umožnit",
|
||||
"enable_mempool_api": "Mempool API pro přesné poplatky a data",
|
||||
"enable_replace_by_fee": "Povolit výměnu podle poplatku",
|
||||
"enable_silent_payments_scanning": "Začněte skenovat tiché platby, dokud není dosaženo špičky",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Historie Etherscanu",
|
||||
"event": "událost",
|
||||
"events": "Události",
|
||||
"exchange": "Směnit",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Pokud chcete směnit XMR z Monero částky v Cake Wallet, prosím přepněte se nejprve do své Monero peněženky.",
|
||||
"exchange": "Swap",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Pokud chcete vyměnit XMR z vaší dortové peněženky Monero Balance, nejprve přepněte na peněženku Monero.",
|
||||
"exchange_new_template": "Nová šablona",
|
||||
"exchange_provider_unsupported": "${providerName} již není podporováno!",
|
||||
"exchange_result_confirm": "Po stisknutí Potvrdit odešlete ${fetchingLabel} ${from} ze své peněženky s názvem ${walletName} na adresu uvedenou níže. Nebo můžete prostředky poslat ze své externí peněženky na níže uvedenou adresu/QR kód.\n\nProsím stiskněte Potvrdit pro pokračování, nebo se vraťte zpět pro změnu částky.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Prosím vyplňte ověřovací kód zaslaný na Váš e-mail",
|
||||
"filter_by": "Filtrovat podle",
|
||||
"first_wallet_text": "Úžasná peněženka pro Monero, Bitcoin, Ethereum, Litecoin a Haven",
|
||||
"fixed_pair_not_supported": "Tento pár s pevným kurzem není ve zvolené směnárně podporován",
|
||||
"fixed_pair_not_supported": "Tento pevný pár není podporován vybranými službami swapu",
|
||||
"fixed_rate": "Pevný kurz",
|
||||
"fixed_rate_alert": "Když je zvolený pevný kurz, můžete zadat konkrétní částku, kterou chcete dostat. Chcete se přepnout do režimu s pevným kurzem?",
|
||||
"forgot_password": "Zapomenuté heslo",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Otestovat",
|
||||
"nodes": "Uzly",
|
||||
"nodes_list_reset_to_default_message": "Opravdu chcete zrušit nastavení a vrátit výchozí hodnotu?",
|
||||
"none_of_selected_providers_can_exchange": "Žádný ze zvolených poskytovatelů nemůže provést tuto směnu",
|
||||
"none_of_selected_providers_can_exchange": "Žádný z vybraných poskytovatelů nemůže tuto swap provést",
|
||||
"noNFTYet": "Zatím žádné NFT",
|
||||
"normal": "Normální",
|
||||
"note_optional": "Poznámka (nepovinné)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Währung ändern",
|
||||
"change_current_node": "Möchten Sie den aktuellen Knoten wirklich zu ${node}? ändern?",
|
||||
"change_current_node_title": "Aktuellen Knoten ändern",
|
||||
"change_exchange_provider": "Exchange-Anbieter ändern",
|
||||
"change_exchange_provider": "Swap -Anbieter ändern",
|
||||
"change_language": "Sprache ändern",
|
||||
"change_language_to": "Sprache zu ${language} ändern?",
|
||||
"change_password": "Passwort ändern",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Token bearbeiten",
|
||||
"electrum_address_disclaimer": "Wir generieren jedes Mal neue Adressen, wenn Sie eine verwenden, aber vorherige Adressen funktionieren weiterhin",
|
||||
"email_address": "E-Mail-Adresse",
|
||||
"enable": "Aktivieren",
|
||||
"enable_mempool_api": "Mempool -API für genaue Gebühren und Daten",
|
||||
"enable_replace_by_fee": "Aktivieren Sie Ersatz für Fee",
|
||||
"enable_silent_payments_scanning": "Scannen Sie stille Zahlungen, bis die Spitze erreicht ist",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Etherscan-Geschichte",
|
||||
"event": "Ereignis",
|
||||
"events": "Veranstaltungen",
|
||||
"exchange": "Umwechseln",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Wenn Sie XMR von Ihrem Cake Wallet Monero-Guthaben umtauschen möchten, wechseln Sie bitte zuerst zu Ihrer Monero-Wallet.",
|
||||
"exchange": "Tauschen",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Wenn Sie XMR aus Ihrer Cake -Wallet Monero -Balance austauschen möchten, wechseln Sie zuerst zu Ihrer Monero -Brieftasche.",
|
||||
"exchange_new_template": "Neue Vorlage",
|
||||
"exchange_provider_unsupported": "${providerName} wird nicht mehr unterstützt!",
|
||||
"exchange_result_confirm": "Durch Drücken von \"Bestätigen\" wird ${fetchingLabel} ${from} von Ihrer Wallet namens ${walletName} an die unten angegebene Adresse gesendet. Alternativ können Sie von einer externen Wallet an die unten angegebene Adresse / QR-Code senden.\n\nBitte bestätigen Sie, um fortzufahren, oder gehen Sie zurück, um die Beträge zu ändern.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Geben Sie den Bestätigungscode ein, den Sie per E-Mail erhalten haben",
|
||||
"filter_by": "Filtern nach",
|
||||
"first_wallet_text": "Eine großartige Wallet für Monero, Bitcoin, Ethereum, Litecoin, und Haven",
|
||||
"fixed_pair_not_supported": "Dieses feste Paar wird von den ausgewählten Vermittlungsstellen nicht unterstützt",
|
||||
"fixed_pair_not_supported": "Dieses feste Paar wird nicht von den ausgewählten Swap -Diensten unterstützt",
|
||||
"fixed_rate": "Feste Rate",
|
||||
"fixed_rate_alert": "Sie können den Empfangsbetrag eingeben, wenn der Festratenmodus aktiviert ist. Möchten Sie in den Festratenmodus wechseln?",
|
||||
"forgot_password": "Passwort vergessen",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Test",
|
||||
"nodes": "Knoten",
|
||||
"nodes_list_reset_to_default_message": "Möchten Sie wirklich die Standardeinstellungen wiederherstellen?",
|
||||
"none_of_selected_providers_can_exchange": "Keiner der ausgewählten Anbieter kann diesen Austausch vornehmen",
|
||||
"none_of_selected_providers_can_exchange": "Keiner der ausgewählten Anbieter kann diesen Tausch machen",
|
||||
"noNFTYet": "Noch keine NFTs",
|
||||
"normal": "Normal",
|
||||
"note_optional": "Bemerkung (optional)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Change Currency",
|
||||
"change_current_node": "Are you sure to change current node to ${node}?",
|
||||
"change_current_node_title": "Change current node",
|
||||
"change_exchange_provider": "Change Exchange Provider",
|
||||
"change_exchange_provider": "Change Swap Provider",
|
||||
"change_language": "Change language",
|
||||
"change_language_to": "Change language to ${language}?",
|
||||
"change_password": "Change password",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Edit token",
|
||||
"electrum_address_disclaimer": "We generate new addresses each time you use one, but previous addresses continue to work",
|
||||
"email_address": "Email Address",
|
||||
"enable": "Enable",
|
||||
"enable_mempool_api": "Mempool API for accurate fees and dates",
|
||||
"enable_replace_by_fee": "Enable Replace-By-Fee",
|
||||
"enable_silent_payments_scanning": "Start scanning for transactions sent to your Silent Payment address.",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Etherscan history",
|
||||
"event": "Event",
|
||||
"events": "Events",
|
||||
"exchange": "Exchange",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "If you want to exchange XMR from your Cake Wallet Monero balance, please switch to your Monero wallet first.",
|
||||
"exchange": "Swap",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "If you want to swap XMR from your Cake Wallet Monero balance, please switch to your Monero wallet first.",
|
||||
"exchange_new_template": "New template",
|
||||
"exchange_provider_unsupported": "${providerName} is no longer supported!",
|
||||
"exchange_result_confirm": "By pressing confirm, you will be sending ${fetchingLabel} ${from} from your wallet called ${walletName} to the address shown below. Or you can send from your external wallet to the below address/QR code.\n\nPlease press confirm to continue or go back to change the amounts.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Please fill in the verification code provided to your email",
|
||||
"filter_by": "Filter by",
|
||||
"first_wallet_text": "Awesome wallet for Monero, Bitcoin, Ethereum, Litecoin, and Haven",
|
||||
"fixed_pair_not_supported": "This fixed pair is not supported with the selected exchanges",
|
||||
"fixed_pair_not_supported": "This fixed pair is not supported with the selected swap services",
|
||||
"fixed_rate": "Fixed rate",
|
||||
"fixed_rate_alert": "You will be able to enter receive amount when fixed rate mode is checked. Do you want to switch to fixed rate mode?",
|
||||
"forgot_password": "Forgot Password",
|
||||
|
@ -441,7 +442,7 @@
|
|||
"node_test": "Test",
|
||||
"nodes": "Nodes",
|
||||
"nodes_list_reset_to_default_message": "Are you sure that you want to reset settings to default?",
|
||||
"none_of_selected_providers_can_exchange": "None of the selected providers can make this exchange",
|
||||
"none_of_selected_providers_can_exchange": "None of the selected providers can make this swap",
|
||||
"noNFTYet": "No NFTs yet",
|
||||
"normal": "Normal",
|
||||
"note_optional": "Note (optional)",
|
||||
|
@ -942,4 +943,4 @@
|
|||
"you_will_get": "Convert to",
|
||||
"you_will_send": "Convert from",
|
||||
"yy": "YY"
|
||||
}
|
||||
}
|
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Editar token",
|
||||
"electrum_address_disclaimer": "Generamos nuevas direcciones cada vez que usa una, pero las direcciones anteriores siguen funcionando",
|
||||
"email_address": "Dirección de correo electrónico",
|
||||
"enable": "Permitir",
|
||||
"enable_mempool_api": "API de Mempool para tarifas y fechas precisas",
|
||||
"enable_replace_by_fee": "Habilitar reemplazar por tarea",
|
||||
"enable_silent_payments_scanning": "Comience a escanear pagos silenciosos, hasta que se alcance la punta",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "historia de etherscan",
|
||||
"event": "Evento",
|
||||
"events": "Eventos",
|
||||
"exchange": "Intercambiar",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Si desea intercambiar XMR de su saldo de Cake Wallet Monero, primero cambie a su billetera Monero.",
|
||||
"exchange": "Intercambio",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Si desea intercambiar XMR desde su billetera de pastel Monero Balance, primero cambie a su billetera Monero.",
|
||||
"exchange_new_template": "Nueva plantilla",
|
||||
"exchange_provider_unsupported": "¡${providerName} ya no es compatible!",
|
||||
"exchange_result_confirm": "Al presionar confirmar, enviará ${fetchingLabel} ${from} desde su billetera llamada ${walletName} a la dirección que se muestra a continuación. O puede enviar desde su billetera externa a la siguiente dirección / código QR anterior.\n\nPresione confirmar para continuar o regrese para cambiar los montos.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Por favor complete el código de verificación proporcionado a su correo electrónico",
|
||||
"filter_by": "Filtrado por",
|
||||
"first_wallet_text": "Impresionante billetera para Monero, Bitcoin, Ethereum, Litecoin, y Haven",
|
||||
"fixed_pair_not_supported": "Este par fijo no es compatible con los intercambios seleccionados",
|
||||
"fixed_pair_not_supported": "Este par fijo no es compatible con los servicios de intercambio seleccionados",
|
||||
"fixed_rate": "Tipo de interés fijo",
|
||||
"fixed_rate_alert": "Podrá ingresar la cantidad recibida cuando el modo de tarifa fija esté marcado. ¿Quieres cambiar al modo de tarifa fija?",
|
||||
"forgot_password": "Olvidé mi contraseña",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Prueba",
|
||||
"nodes": "Nodos",
|
||||
"nodes_list_reset_to_default_message": "¿Está seguro de que desea restablecer la configuración predeterminada?",
|
||||
"none_of_selected_providers_can_exchange": "Ninguno de los proveedores seleccionados puede realizar este intercambio",
|
||||
"none_of_selected_providers_can_exchange": "Ninguno de los proveedores seleccionados puede hacer este intercambio",
|
||||
"noNFTYet": "Aún no hay NFT",
|
||||
"normal": "Normal",
|
||||
"note_optional": "Nota (opcional)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Changer de Devise",
|
||||
"change_current_node": "Êtes vous certain de vouloir changer le nœud actuel pour ${node} ?",
|
||||
"change_current_node_title": "Changer le nœud actuel",
|
||||
"change_exchange_provider": "Changer de Plateforme d'Échange",
|
||||
"change_exchange_provider": "Changer le fournisseur d'échange",
|
||||
"change_language": "Changer de langue",
|
||||
"change_language_to": "Changer la langue vers ${language} ?",
|
||||
"change_password": "Changer le mot de passe",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Modifier le token",
|
||||
"electrum_address_disclaimer": "Nous générons de nouvelles adresses à chaque fois que vous en utilisez une, mais les adresses précédentes continuent à fonctionner",
|
||||
"email_address": "Adresse e-mail",
|
||||
"enable": "Activer",
|
||||
"enable_mempool_api": "API Mempool pour les frais et dates précis",
|
||||
"enable_replace_by_fee": "Activer Remplace-by-Fee",
|
||||
"enable_silent_payments_scanning": "Commencez à scanner les paiements silencieux, jusqu'à ce que la pointe soit atteinte",
|
||||
|
@ -281,7 +282,7 @@
|
|||
"event": "Événement",
|
||||
"events": "Événements",
|
||||
"exchange": "Échanger",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Si vous souhaitez échanger des XMR du solde Monero de votre Cake Wallet, merci de sélectionner votre portefeuille (wallet) Monero au préalable.",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Si vous souhaitez échanger XMR à partir de votre balance monero portefeuille de gâteau, veuillez d'abord passer à votre portefeuille Monero.",
|
||||
"exchange_new_template": "Nouveau modèle d'échange",
|
||||
"exchange_provider_unsupported": "${providerName} n'est plus pris en charge !",
|
||||
"exchange_result_confirm": "En pressant confirmer, vous enverrez ${fetchingLabel} ${from} depuis votre portefeuille (wallet) nommé ${walletName} vers l'adresse ci-dessous. Vous pouvez aussi envoyer depuis votre portefeuille externe vers l'adresse/QR code ci-dessous.\n\nMerci d'appuyer sur confirmer pour continuer ou retournez en arrière pour modifier les montants.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Veuillez remplir le code de vérification fourni sur votre e-mail",
|
||||
"filter_by": "Filtrer par",
|
||||
"first_wallet_text": "Super portefeuille (wallet) pour Monero, Bitcoin, Ethereum, Litecoin et Haven",
|
||||
"fixed_pair_not_supported": "Cette paire fixe n'est pas prise en charge avec les échanges sélectionnés",
|
||||
"fixed_pair_not_supported": "Cette paire fixe n'est pas prise en charge avec les services d'échange sélectionnés",
|
||||
"fixed_rate": "Taux fixe",
|
||||
"fixed_rate_alert": "Vous aurez la possibilité de rentrer le montant reçu lorsque le mode taux fixe est sélectionné. Souhaitez vous basculer en mode taux fixe ?",
|
||||
"forgot_password": "Mot de passe oublié",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Tester",
|
||||
"nodes": "Nœuds",
|
||||
"nodes_list_reset_to_default_message": "Êtes vous certain de vouloir revenir aux réglages par défaut ?",
|
||||
"none_of_selected_providers_can_exchange": "Aucun des fournisseurs sélectionnés ne peut effectuer cet échange",
|
||||
"none_of_selected_providers_can_exchange": "Aucun des fournisseurs sélectionnés ne peut faire cet échange",
|
||||
"noNFTYet": "Pas encore de NFT",
|
||||
"normal": "Normal",
|
||||
"note_optional": "Note (optionnelle)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Canja Kuɗi",
|
||||
"change_current_node": "Kuna tabbatar kuna so ku canja node yanzu zuwa ${node}?",
|
||||
"change_current_node_title": "Canja node yanzu",
|
||||
"change_exchange_provider": "Canza Mai Bayar da Musanya",
|
||||
"change_exchange_provider": "Canza mai canzawa",
|
||||
"change_language": "canja harshen",
|
||||
"change_language_to": "canja harshen zuwa ${language}?",
|
||||
"change_password": "Canza kalmar shiga",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Gyara alamar",
|
||||
"electrum_address_disclaimer": "Muna samar da sababbin adireshi duk lokacin da kuka yi amfani da ɗaya, amma adiresoshin da suka gabata suna ci gaba da aiki",
|
||||
"email_address": "Adireshin i-mel",
|
||||
"enable": "Ba dama",
|
||||
"enable_mempool_api": "Mampool API don ingantattun kudade da kwanakin",
|
||||
"enable_replace_by_fee": "Ba da damar maye gurbin-by-kudin",
|
||||
"enable_silent_payments_scanning": "Fara bincika biya na shiru, har sai tip ɗin ya kai",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Etherscan tarihin kowane zamani",
|
||||
"event": "Lamarin",
|
||||
"events": "Abubuwan da suka faru",
|
||||
"exchange": "Exchange",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Idan kana son musanya XMR daga ma'aunin Cake Wallet Monero, da fatan za a fara canza wallet ɗin Monero ɗin ku.",
|
||||
"exchange": "Musya",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Idan kana son canza XMR daga walat ɗin Bed Wallet ɗinka, da fatan za a canza zuwa walat ɗinku na Monero.",
|
||||
"exchange_new_template": "Sabon template",
|
||||
"exchange_provider_unsupported": "${providerName}",
|
||||
"exchange_result_confirm": "Ta danna tabbatarwa, zaku aika ${fetchingLabel} ${from} daga walat ɗin ku mai suna ${walletName} zuwa address dake kasa. Ko zaka iya aika daga kwalinku na external zuwa address/QR code dake kasa.\n\nDon Allah shigar da confirm don ci gaba ko dawo ka canja adadinku.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Da fatan za a cika lambar tabbatarwa da aka bayar zuwa imel ɗin ku",
|
||||
"filter_by": "Tace ta",
|
||||
"first_wallet_text": "Aikace-aikacen e-wallet ga Monero, Bitcoin, Ethereum, Litecoin, da kuma Haven",
|
||||
"fixed_pair_not_supported": "Wannan kafaffen guda biyu ba shi da tallafi tare da zaɓaɓɓun musayar",
|
||||
"fixed_pair_not_supported": "Ba a tallafa wa wannan adireshin da aka zaɓi tare da zaɓin siye ba",
|
||||
"fixed_rate": "Kafaffen ƙima",
|
||||
"fixed_rate_alert": "Za ku iya shigar da adadin karɓa lokacin da aka duba ƙayyadadden zaɓin ƙimar kuɗi. Kuna so ku canza zuwa ƙayyadadden yanayin ƙimar kuɗi?",
|
||||
"forgot_password": "Manta Kalmar wucewa",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Gwaji",
|
||||
"nodes": "Nodes",
|
||||
"nodes_list_reset_to_default_message": "Kuna tabbatar kuna so ku sake saitunan zuwa default?",
|
||||
"none_of_selected_providers_can_exchange": "Babu ɗaya daga cikin zaɓaɓɓun masu samarwa da zai iya yin wannan musayar",
|
||||
"none_of_selected_providers_can_exchange": "Babu wani daga cikin masu siye da aka zaɓa na iya yin wannan musan",
|
||||
"noNFTYet": "Babu NFTs tukuna",
|
||||
"normal": "Na al'ada",
|
||||
"note_optional": "Bayani (optional)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "मुद्रा परिवर्तन करें",
|
||||
"change_current_node": "क्या आप वर्तमान नोड को बदलना सुनिश्चित करते हैं ${node}?",
|
||||
"change_current_node_title": "वर्तमान नोड बदलें",
|
||||
"change_exchange_provider": "एक्सचेंज प्रदाता बदलें",
|
||||
"change_exchange_provider": "स्वैप प्रदाता बदलें",
|
||||
"change_language": "भाषा बदलो",
|
||||
"change_language_to": "को भाषा बदलें ${language}?",
|
||||
"change_password": "पासवर्ड बदलें",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "टोकन संपादित करें",
|
||||
"electrum_address_disclaimer": "हर बार जब आप एक का उपयोग करते हैं तो हम नए पते उत्पन्न करते हैं, लेकिन पिछले पते काम करना जारी रखते हैं",
|
||||
"email_address": "ईमेल पता",
|
||||
"enable": "सक्षम",
|
||||
"enable_mempool_api": "सटीक शुल्क और तिथियों के लिए मेमपूल एपीआई",
|
||||
"enable_replace_by_fee": "प्रतिस्थापित-दर-शुल्क सक्षम करें",
|
||||
"enable_silent_payments_scanning": "मूक भुगतान स्कैनिंग सक्षम करें",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "इथरस्कैन इतिहास",
|
||||
"event": "आयोजन",
|
||||
"events": "आयोजन",
|
||||
"exchange": "अदला बदली",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "यदि आप अपने केक वॉलेट मोनेरो बैलेंस से एक्सएमआर का आदान-प्रदान करना चाहते हैं, तो कृपया अपने मोनेरो वॉलेट में जाएं।",
|
||||
"exchange": "बदलना",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "यदि आप अपने केक वॉलेट मोनेरो बैलेंस से XMR को स्वैप करना चाहते हैं, तो कृपया पहले अपने मोनेरो वॉलेट पर स्विच करें।",
|
||||
"exchange_new_template": "नया टेम्पलेट",
|
||||
"exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!",
|
||||
"exchange_result_confirm": "पुष्टि दबाकर, आप भेज रहे होंगे ${fetchingLabel} ${from} अपने बटुए से ${walletName} नीचे दिखाए गए पते पर। या आप अपने बाहरी वॉलेट से नीचे के पते पर भेज सकते हैं / क्यूआर कोड पर भेज सकते हैं।\n\nकृपया जारी रखने या राशि बदलने के लिए वापस जाने के लिए पुष्टि करें दबाएं.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "कृपया अपने ईमेल पर प्रदान किया गया सत्यापन कोड भरें",
|
||||
"filter_by": "के द्वारा छनित",
|
||||
"first_wallet_text": "Monero, Bitcoin, Ethereum, Litecoin, और Haven के लिए बहुत बढ़िया बटुआ",
|
||||
"fixed_pair_not_supported": "यह निश्चित जोड़ी चयनित एक्सचेंजों के साथ समर्थित नहीं है",
|
||||
"fixed_pair_not_supported": "यह निश्चित जोड़ी चयनित स्वैप सेवाओं के साथ समर्थित नहीं है",
|
||||
"fixed_rate": "निर्धारित दर",
|
||||
"fixed_rate_alert": "फिक्स्ड रेट मोड की जांच करने पर आप प्राप्त राशि दर्ज कर पाएंगे। क्या आप निश्चित दर मोड पर स्विच करना चाहते हैं?",
|
||||
"forgot_password": "पासवर्ड भूल गए",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "परीक्षा",
|
||||
"nodes": "नोड्स",
|
||||
"nodes_list_reset_to_default_message": "क्या आप वाकई सेटिंग को डिफ़ॉल्ट पर रीसेट करना चाहते हैं?",
|
||||
"none_of_selected_providers_can_exchange": "चयनित प्रदाताओं में से कोई भी इस एक्सचेंज को नहीं बना सकता",
|
||||
"none_of_selected_providers_can_exchange": "चयनित प्रदाता में से कोई भी यह स्वैप नहीं कर सकता है",
|
||||
"noNFTYet": "अभी तक कोई एनएफटी नहीं",
|
||||
"normal": "सामान्य",
|
||||
"note_optional": "नोट (वैकल्पिक)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Promijenite valutu",
|
||||
"change_current_node": "Jeste li sigurni da želite promijeniti trenutni node na ${node}?",
|
||||
"change_current_node_title": "Promijeni trenutni node",
|
||||
"change_exchange_provider": "Promjena davatelja usluge razmjene",
|
||||
"change_exchange_provider": "Promijenite davatelja zamjene",
|
||||
"change_language": "Promijeni jezik",
|
||||
"change_language_to": "Promijeni jezik u ${language}?",
|
||||
"change_password": "Promijeni lozinku",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Uredi token",
|
||||
"electrum_address_disclaimer": "Minden egyes alkalommal új címeket generálunk, de a korábbi címek továbbra is működnek",
|
||||
"email_address": "Adresa e-pošte",
|
||||
"enable": "Omogućiti",
|
||||
"enable_mempool_api": "Mempool API za točne naknade i datume",
|
||||
"enable_replace_by_fee": "Omogući zamjenu",
|
||||
"enable_silent_payments_scanning": "Započnite skeniranje tihih plaćanja, dok se ne postigne savjet",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Etherscan povijest",
|
||||
"event": "Događaj",
|
||||
"events": "Događaji",
|
||||
"exchange": "Razmijeni",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Ako želite razmijeniti XMR s vlastitog Monero računa na Cake Wallet novčaniku, molimo prvo se prebacite na svoj Monero novčanik.",
|
||||
"exchange": "Zamjena",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Ako želite zamijeniti XMR iz vašeg novčanika za kolač Monero, prvo se prebacite na svoj novčanik Monero.",
|
||||
"exchange_new_template": "Novi predložak",
|
||||
"exchange_provider_unsupported": "${providerName} više nije podržan!",
|
||||
"exchange_result_confirm": "Pritiskom na potvrdi, poslat ćete ${fetchingLabel} ${from} sa svog novčanika pod nazivom ${walletName} na adresu prikazanu ispod ili iznos možete poslati s vanjskog novčanika na niže navedenu adresu. /QR code.\n\nMolimo potvrdite za nastavak ili se vratite natrag za promjenu iznosa.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Molimo vas da ispunite kontrolni kod koji ste dobili na svojoj e-pošti",
|
||||
"filter_by": "Filtrirati po",
|
||||
"first_wallet_text": "Odličan novčanik za Monero, Bitcoin, Ethereum, Litecoin, i Haven",
|
||||
"fixed_pair_not_supported": "Ovaj fiksni par nije podržan s odabranim burzama",
|
||||
"fixed_pair_not_supported": "Ovaj fiksni par nije podržan s odabranim SWAP uslugama",
|
||||
"fixed_rate": "Fiksna stopa",
|
||||
"fixed_rate_alert": "Moći ćete unijeti iznos koji želite primiti nakon što označite način rada fiksne stope. Želite li se prebaciti na način rada fiksne stope?",
|
||||
"forgot_password": "Zaboravljena lozinka",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Provjeri",
|
||||
"nodes": "Nodes",
|
||||
"nodes_list_reset_to_default_message": "Jeste li sigurni da se želite vratiti na početne postavke?",
|
||||
"none_of_selected_providers_can_exchange": "Niti jedan od odabranih pružatelja usluga ne može izvršiti ovu razmjenu",
|
||||
"none_of_selected_providers_can_exchange": "Nijedan od odabranih pružatelja usluga ne može napraviti ovu zamjenu",
|
||||
"noNFTYet": "Još nema NFT-ova",
|
||||
"normal": "Normalno",
|
||||
"note_optional": "Poruka (nije obvezno)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Փոխել արժույթը",
|
||||
"change_current_node": "Վստահ եք, որ ցանկանում եք փոխել ընթացիկ հանգույցը ${node}?",
|
||||
"change_current_node_title": "Փոխել ընթացիկ հանգույցը",
|
||||
"change_exchange_provider": "Փոխել փոխանակման մատակարարին",
|
||||
"change_exchange_provider": "Փոխեք փոխանակման մատակարարը",
|
||||
"change_language": "Փոխել լեզուն",
|
||||
"change_language_to": "Փոխել լեզուն ${language}?",
|
||||
"change_password": "Փոխել գաղտնաբառը",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Փոփոխել տոկեն",
|
||||
"electrum_address_disclaimer": "Մենք ստեղծում ենք նոր հասցե ամեն անգամ, երբ դուք օգտագործում եք այն, բայց նախորդ հասցեները շարունակում են աշխատել",
|
||||
"email_address": "Էլ. փոստի հասցե",
|
||||
"enable": "Միացնել",
|
||||
"enable_mempool_api": "Mempool API ճշգրիտ վճարների եւ ամսաթվերի համար",
|
||||
"enable_replace_by_fee": "Միացնել փոխարինումը միջնորդավճարով",
|
||||
"enable_silent_payments_scanning": "Միացնել Լուռ Վճարումների սկանավորումը",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Etherscan պատմություն",
|
||||
"event": "Իրադարձություն",
|
||||
"events": "Իրադարձություններ",
|
||||
"exchange": "Փոխել",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Եթե դուք ցանկանում եք փոխանակել XMR ձեր Cake Wallet Monero հաշվեհամարից, խնդրում ենք անցնել ձեր Monero հաշվեհամարին",
|
||||
"exchange": "Փոխանակել",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Եթե ցանկանում եք փոխանակել XMR ձեր տորթի դրամապանակից Monero Relandal- ից, խնդրում ենք նախ անցնել ձեր Monero դրամապանակին:",
|
||||
"exchange_new_template": "Նոր տեսակ",
|
||||
"exchange_provider_unsupported": "${providerName} այլևս չի ապահովվում",
|
||||
"exchange_result_confirm": "Սեղմելով հաստատել, դուք կուղարկեք ${fetchingLabel} ${from} ձեր հաշվեհամարից ${walletName} հետևյալ հասցեին: Կամ կարող եք ուղարկել ձեր արտաքին հաշվեհամարից հետևյալ հասցեին/QR կոդին:\n\nԽնդրում ենք սեղմել հաստատել կամ վերադառնալ գումարը փոխելու համար",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Խնդրում ենք լրացնել հաստատման կոդը ձեր էլեկտրոնային փոստում",
|
||||
"filter_by": "Ֆիլտրել ըստ",
|
||||
"first_wallet_text": "Հիանալի հաշվեհամար Monero, Bitcoin, Ethereum, Litecoin և Haven արժույթների համար",
|
||||
"fixed_pair_not_supported": "Այս ֆիքսված զույգը չի ապահովվում ընտրված փոխանակման կետերում",
|
||||
"fixed_pair_not_supported": "Այս ֆիքսված զույգը չի ապահովվում ընտրված փոխանակման ծառայություններ",
|
||||
"fixed_rate": "Ֆիքսված փոխարժեք",
|
||||
"fixed_rate_alert": "Դուք կկարողանաք մուտքագրել ստացվող գումարը, երբ ֆիքսված փոխարժեքի ռեժիմը միացված է: Դուք ցանկանում եք անցնել ֆիքսված փոխարժեքի ռեժիմին?",
|
||||
"forgot_password": "Մոռացել եմ գաղտնաբառը",
|
||||
|
@ -430,7 +431,7 @@
|
|||
"node_test": "Փորձարկում",
|
||||
"nodes": "Հանգույցներ",
|
||||
"nodes_list_reset_to_default_message": "Վերակայվում եք կարգավորումները լռությամբ?",
|
||||
"none_of_selected_providers_can_exchange": "Ոչ մի ընտրված մատակարար չի կարող այս փոխանակումը կատարել",
|
||||
"none_of_selected_providers_can_exchange": "Ընտրված մատակարարներից ոչ մեկը չի կարող կատարել այս փոխանակումը",
|
||||
"noNFTYet": "Դեռ ոչ մի NFT",
|
||||
"normal": "Նորմալ",
|
||||
"note_optional": "Նշում (ոչ պարտադիր)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Ganti Mata Uang",
|
||||
"change_current_node": "Apakah Anda yakin ingin mengubah node saat ini menjadi ${node}?",
|
||||
"change_current_node_title": "Ubah node saat ini",
|
||||
"change_exchange_provider": "Ganti Penyedia Tukar",
|
||||
"change_exchange_provider": "Ubah penyedia swap",
|
||||
"change_language": "Ganti bahasa",
|
||||
"change_language_to": "Ganti bahasa ke ${language}?",
|
||||
"change_password": "Ubah kata sandi",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Mengedit token",
|
||||
"electrum_address_disclaimer": "Kami menghasilkan alamat baru setiap kali Anda menggunakan satu, tetapi alamat sebelumnya tetap berfungsi",
|
||||
"email_address": "Alamat Email",
|
||||
"enable": "Memungkinkan",
|
||||
"enable_mempool_api": "API Mempool untuk biaya dan tanggal yang akurat",
|
||||
"enable_replace_by_fee": "Aktifkan ganti-by-fee",
|
||||
"enable_silent_payments_scanning": "Mulailah memindai pembayaran diam, sampai ujung tercapai",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Sejarah Etherscan",
|
||||
"event": "Peristiwa",
|
||||
"events": "Acara",
|
||||
"exchange": "Tukar",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Jika Anda ingin menukar XMR dari saldo Monero Cake Wallet Anda, silakan beralih ke dompet Monero Anda terlebih dahulu.",
|
||||
"exchange": "Menukar",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Jika Anda ingin bertukar XMR dari Saldo Monero Dompet Kue Anda, silakan beralih ke Monero Wallet Anda terlebih dahulu.",
|
||||
"exchange_new_template": "Template baru",
|
||||
"exchange_provider_unsupported": "${providerName} tidak lagi didukung!",
|
||||
"exchange_result_confirm": "Dengan menekan tombol konfirmasi, Anda akan mengirimkan ${fetchingLabel} ${from} dari dompet Anda yang disebut ${walletName} ke alamat yang ditampilkan di bawah. Anda juga dapat mengirim dari dompet eksternal Anda ke alamat/QR code di bawah.\n\nSilakan tekan konfirmasi untuk melanjutkan atau kembali untuk mengubah jumlah.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Silakan isi kode verifikasi yang diterima di email Anda",
|
||||
"filter_by": "Filter berdasarkan",
|
||||
"first_wallet_text": "Dompet luar biasa untuk Monero, Bitcoin, Ethereum, Litecoin, dan Haven",
|
||||
"fixed_pair_not_supported": "Pasangan tetap ini tidak didukung dengan bursa yang dipilih",
|
||||
"fixed_pair_not_supported": "Pasangan tetap ini tidak didukung dengan layanan swap yang dipilih",
|
||||
"fixed_rate": "Rate tetap",
|
||||
"fixed_rate_alert": "Anda akan dapat memasukkan jumlah penerimaan saat mode rate tetap dicentang. Apakah Anda ingin beralih ke mode rate tetap?",
|
||||
"forgot_password": "Lupa Kata Sandi",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Uji",
|
||||
"nodes": "Node",
|
||||
"nodes_list_reset_to_default_message": "Apakah Anda yakin ingin mengatur ulang pengaturan ke default?",
|
||||
"none_of_selected_providers_can_exchange": "Tidak ada dari penyedia yang dipilih yang dapat melakukan pertukaran ini",
|
||||
"none_of_selected_providers_can_exchange": "Tak satu pun dari penyedia yang dipilih dapat melakukan pertukaran ini",
|
||||
"noNFTYet": "Belum ada NFT",
|
||||
"normal": "Normal",
|
||||
"note_optional": "Catatan (opsional)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Cambia Valuta",
|
||||
"change_current_node": "Sei sicuro di voler cambiare il nodo corrente con ${node}?",
|
||||
"change_current_node_title": "Cambia nodo corrente",
|
||||
"change_exchange_provider": "Cambia Exchange",
|
||||
"change_exchange_provider": "Provider di swap di cambiamento",
|
||||
"change_language": "Cambia lingua",
|
||||
"change_language_to": "Cambiare lingua in ${language}?",
|
||||
"change_password": "Cambia password",
|
||||
|
@ -236,6 +236,7 @@
|
|||
"edit_token": "Modifica token",
|
||||
"electrum_address_disclaimer": "Generiamo nuovi indirizzi ogni volta che ne utilizzi uno, ma gli indirizzi precedenti continuano a funzionare",
|
||||
"email_address": "Indirizzo e-mail",
|
||||
"enable": "Abilitare",
|
||||
"enable_mempool_api": "API di Mempool per commissioni e date accurate",
|
||||
"enable_replace_by_fee": "Abilita sostituzione per fee",
|
||||
"enable_silent_payments_scanning": "Inizia a scansionare i pagamenti silenziosi, fino a raggiungere la punta",
|
||||
|
@ -281,8 +282,8 @@
|
|||
"etherscan_history": "Storia Etherscan",
|
||||
"event": "Evento",
|
||||
"events": "Eventi",
|
||||
"exchange": "Scambia",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Se vuoi scambiare XMR dal tuo saldo Cake Wallet Monero, gentilmente passa al tuo portafoglio Monero.",
|
||||
"exchange": "Scambio",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Se vuoi scambiare XMR dal tuo portafoglio di torta Monero Balance, si prega di passare prima al portafoglio Monero.",
|
||||
"exchange_new_template": "Nuovo modello",
|
||||
"exchange_provider_unsupported": "${providerName} non è più supportato!",
|
||||
"exchange_result_confirm": "Cliccando su Conferma, invierai ${fetchingLabel} ${from} dal tuo portafoglio chiamato ${walletName} all'indirizzo mostrato qui in basso. O puoi inviare dal tuo portafoglio esterno all'indirizzo/codice QR mostrato in basso.\n\nGentilmente clicca su Conferma per continuare o torna indietro per cambiare l'ammontare.",
|
||||
|
@ -309,7 +310,7 @@
|
|||
"fill_code": "Compila il codice di verifica fornito alla tua email",
|
||||
"filter_by": "Filtrirati po",
|
||||
"first_wallet_text": "Portafoglio fantastico per Monero, Bitcoin, Ethereum, Litecoin, e Haven",
|
||||
"fixed_pair_not_supported": "Questa coppia fissa non è supportata con gli scambi selezionati",
|
||||
"fixed_pair_not_supported": "Questa coppia fissa non è supportata con i servizi di swap selezionati",
|
||||
"fixed_rate": "Tasso fisso",
|
||||
"fixed_rate_alert": "Potrai inserire l'ammontare da ricevere quando il tasso è fisso. Vuoi cambiare alla modalità tasso fisso?",
|
||||
"forgot_password": "Password dimenticata",
|
||||
|
@ -440,7 +441,7 @@
|
|||
"node_test": "Test",
|
||||
"nodes": "Nodi",
|
||||
"nodes_list_reset_to_default_message": "Sei sicuro di voler ripristinare le impostazioni predefinite?",
|
||||
"none_of_selected_providers_can_exchange": "Nessuno dei fornitori selezionati può effettuare questo scambio",
|
||||
"none_of_selected_providers_can_exchange": "Nessuno dei provider selezionati può fare questo scambio",
|
||||
"noNFTYet": "Nessun NFT ancora",
|
||||
"normal": "Normale",
|
||||
"note_optional": "Nota (opzionale)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "通貨を変更する",
|
||||
"change_current_node": "現在のノードを変更してよろしいですか ${node}?",
|
||||
"change_current_node_title": "現在のノードを変更する",
|
||||
"change_exchange_provider": "Exchangeプロバイダーの変更",
|
||||
"change_exchange_provider": "スワッププロバイダーを変更します",
|
||||
"change_language": "言語を変えてください",
|
||||
"change_language_to": "言語を変更 ${language}?",
|
||||
"change_password": "パスワードを変更する",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "トークンの編集",
|
||||
"electrum_address_disclaimer": "使用するたびに新しいアドレスが生成されますが、以前のアドレスは引き続き機能します",
|
||||
"email_address": "メールアドレス",
|
||||
"enable": "有効にする",
|
||||
"enable_mempool_api": "正確な料金と日付のMempool API",
|
||||
"enable_replace_by_fee": "交換ごとに有効にします",
|
||||
"enable_silent_payments_scanning": "先端に達するまで、サイレント決済のスキャンを開始します",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "イーサスキャンの歴史",
|
||||
"event": "イベント",
|
||||
"events": "イベント",
|
||||
"exchange": "交換する",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Cake Wallet Moneroの残高からXMRを交換する場合は、最初にMoneroウォレットに切り替えてください。",
|
||||
"exchange": "スワップ",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "XMRをケーキウォレットモネロバランスから交換したい場合は、最初にMoneroウォレットに切り替えてください。",
|
||||
"exchange_new_template": "新しいテンプレート",
|
||||
"exchange_provider_unsupported": "${providerName}はサポートされなくなりました!",
|
||||
"exchange_result_confirm": "確認を押すと、送信されます ${fetchingLabel} ${from} と呼ばれるあなたの財布から ${walletName} 下記の住所へ。 または、外部ウォレットから以下のアドレスに送信することもできます/ QRコードに送信できます.\n\n確認を押して続行するか、戻って金額を変更してください.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "メールアドレスに記載されている確認コードを入力してください",
|
||||
"filter_by": "でフィルタリング",
|
||||
"first_wallet_text": "Monero、Bitcoin、Ethereum、Litecoin、Haven用の素晴らしいウォレット",
|
||||
"fixed_pair_not_supported": "この固定ペアは、選択したエクスチェンジではサポートされていません",
|
||||
"fixed_pair_not_supported": "この固定ペアは、選択したスワップサービスではサポートされていません",
|
||||
"fixed_rate": "固定金利",
|
||||
"fixed_rate_alert": "固定金利モードにチェックを入れると、受取額を入力できるようになります。 固定金利モードに切り替えますか?",
|
||||
"forgot_password": "パスワードを忘れた",
|
||||
|
@ -440,7 +441,7 @@
|
|||
"node_test": "テスト",
|
||||
"nodes": "ノード",
|
||||
"nodes_list_reset_to_default_message": "設定をデフォルトにリセットしてもよろしいですか?",
|
||||
"none_of_selected_providers_can_exchange": "選択したプロバイダーはいずれもこの交換を行うことができません",
|
||||
"none_of_selected_providers_can_exchange": "選択したプロバイダーはいずれもこのスワップを作成できません",
|
||||
"noNFTYet": "NFTはまだありません",
|
||||
"normal": "普通",
|
||||
"note_optional": "注(オプション)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "통화 변경",
|
||||
"change_current_node": "현재 노드를 다음으로 변경 하시겠습니까 ${node}?",
|
||||
"change_current_node_title": "현재 노드 변경",
|
||||
"change_exchange_provider": "교환 공급자 변경",
|
||||
"change_exchange_provider": "스왑 제공 업체를 변경하십시오",
|
||||
"change_language": "언어 변경",
|
||||
"change_language_to": "언어를로 변경 ${language}?",
|
||||
"change_password": "비밀번호 변경",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "토큰 편집",
|
||||
"electrum_address_disclaimer": "사용할 때마다 새 주소가 생성되지만 이전 주소는 계속 작동합니다.",
|
||||
"email_address": "이메일 주소",
|
||||
"enable": "할 수 있게 하다",
|
||||
"enable_mempool_api": "정확한 수수료 및 날짜에 대한 Mempool API",
|
||||
"enable_replace_by_fee": "대체별로 활성화하십시오",
|
||||
"enable_silent_payments_scanning": "팁에 도달 할 때까지 사일런트 지불을 스캔하기 시작합니다.",
|
||||
|
@ -281,7 +282,7 @@
|
|||
"event": "이벤트",
|
||||
"events": "이벤트",
|
||||
"exchange": "교환",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Cake Wallet Monero 잔액에서 XMR을 교환하려면 먼저 Monero 지갑으로 전환하십시오.",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "케이크 지갑 Monero Balance에서 XMR을 교체하려면 먼저 Monero 지갑으로 전환하십시오.",
|
||||
"exchange_new_template": "새 템플릿",
|
||||
"exchange_provider_unsupported": "${providerName}은 더 이상 지원되지 않습니다!",
|
||||
"exchange_result_confirm": "확인을 누르면 전송됩니다 ${fetchingLabel} ${from} 지갑에서 ${walletName} 아래 주소로. 또는 외부 지갑에서 아래 주소로 보낼 수 있습니다 / QR 코드로 보낼 수 있습니다.\n\n확인을 눌러 계속하거나 금액을 변경하려면 돌아가십시오.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "이메일에 제공된 인증 코드를 입력하세요.",
|
||||
"filter_by": "필터링 기준",
|
||||
"first_wallet_text": "Monero, Bitcoin, Ethereum, Litecoin 및 Haven을 위한 멋진 지갑",
|
||||
"fixed_pair_not_supported": "이 고정 쌍은 선택한 교환에서 지원되지 않습니다.",
|
||||
"fixed_pair_not_supported": "이 고정 쌍은 선택한 스왑 서비스에서 지원되지 않습니다.",
|
||||
"fixed_rate": "고정 비율",
|
||||
"fixed_rate_alert": "고정 금리 모드 체크시 수취 금액 입력이 가능합니다. 고정 속도 모드로 전환 하시겠습니까?",
|
||||
"forgot_password": "비밀번호 찾기",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "테스트",
|
||||
"nodes": "노드",
|
||||
"nodes_list_reset_to_default_message": "설정을 기본값으로 재설정 하시겠습니까?",
|
||||
"none_of_selected_providers_can_exchange": "선택한 공급자 중 누구도 이 교환을 할 수 없습니다.",
|
||||
"none_of_selected_providers_can_exchange": "선택한 공급자 중 어느 것도이 교환을 할 수 없습니다",
|
||||
"noNFTYet": "아직 NFT가 없습니다",
|
||||
"normal": "정상",
|
||||
"note_optional": "참고 (선택 사항)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "ငွေကြေးကိုပြောင်းပါ။",
|
||||
"change_current_node": "လက်ရှိ နှာခေါင်း ကို ${node} သို့ ပြောင်းရန် သေချာပါသလား။",
|
||||
"change_current_node_title": "လက်ရှိ နှာခေါင်း ကိုပြောင်းပါ။",
|
||||
"change_exchange_provider": "အပြန်အလှန် လဲလှယ်ရေး ထောက်ပံ့ပေးသူကို ပြောင်းလဲပါ",
|
||||
"change_exchange_provider": "SWAP ပံ့ပိုးသူပြောင်းလဲပါ",
|
||||
"change_language": "ဘာသာစကားပြောင်းပါ။",
|
||||
"change_language_to": "ဘာသာစကားကို ${language} သို့ ပြောင်းမလား။",
|
||||
"change_password": "စကားဝှက်ကိုပြောင်းရန်",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "တိုကင်ကို တည်းဖြတ်ပါ။",
|
||||
"electrum_address_disclaimer": "သင်အသုံးပြုသည့်အချိန်တိုင်းတွင် ကျွန်ုပ်တို့သည် လိပ်စာအသစ်များကို ထုတ်ပေးသော်လည်း ယခင်လိပ်စာများသည် ဆက်လက်အလုပ်လုပ်နေပါသည်။",
|
||||
"email_address": "အီးမေးလ်လိပ်စာ",
|
||||
"enable": "စွမ်းဆောင်နိုင်စေ",
|
||||
"enable_mempool_api": "Mempool API တိကျသောအခကြေးငွေနှင့်ရက်စွဲများအတွက်",
|
||||
"enable_replace_by_fee": "အစားထိုး - by- အခကြေးငွေ enable",
|
||||
"enable_silent_payments_scanning": "အစွန်အဖျားသို့ရောက်ရှိသည်အထိအသံတိတ်ငွေပေးချေမှုကိုစကင်ဖတ်စစ်ဆေးပါ",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Etherscan သမိုင်း",
|
||||
"event": "ပွဲ",
|
||||
"events": "အဲ့ဒါနဲ့",
|
||||
"exchange": "ချိန်းတယ်။",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "သင်၏ Cake Wallet Monero လက်ကျန်မှ XMR ကိုလဲလှယ်လိုပါက၊ သင်၏ Monero ပိုက်ဆံအိတ်သို့ ဦးစွာပြောင်းပါ။",
|
||||
"exchange": "လဲလှယ်",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "အကယ်. သင်သည် XMR ကိုသင်၏ကိတ်မုန့် Monero Balance မှ Swap ကိုလဲလှယ်လိုပါကသင်၏ Monero Wallet ကိုပထမဆုံးအကြိမ်ပြောင်းပါ။",
|
||||
"exchange_new_template": "ပုံစံအသစ်",
|
||||
"exchange_provider_unsupported": "${providerName} မရှိတော့ပါ!",
|
||||
"exchange_result_confirm": "အတည်ပြုချက်ကို နှိပ်ခြင်းဖြင့်၊ သင်သည် ${fetchingLabel} ${from} ဟုခေါ်သော သင့်ပိုက်ဆံအိတ်မှ ${walletName} ကို အောက်ဖော်ပြပါလိပ်စာသို့ ပေးပို့မည်ဖြစ်ပါသည်။ သို့မဟုတ် သင့်ပြင်ပပိုက်ဆံအိတ်မှ အောက်ပါလိပ်စာ/QR ကုဒ်သို့ ပေးပို့နိုင်ပါသည်။\n\nပမာဏများကို ပြောင်းလဲရန် ဆက်လက်လုပ်ဆောင်ရန် သို့မဟုတ် ပြန်သွားရန် အတည်ပြုချက်ကို နှိပ်ပါ။",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "သင့်အီးမေးလ်သို့ ပေးထားသည့် အတည်ပြုကုဒ်ကို ဖြည့်ပါ။",
|
||||
"filter_by": "အလိုက် စစ်ထုတ်ပါ။",
|
||||
"first_wallet_text": "Monero၊ Bitcoin၊ Ethereum၊ Litecoin နှင့် Haven အတွက် အလွန်ကောင်းမွန်သော ပိုက်ဆံအိတ်",
|
||||
"fixed_pair_not_supported": "ရွေးချယ်ထားသော ဖလှယ်မှုများဖြင့် ဤပုံသေအတွဲကို ပံ့ပိုးမထားပါ။",
|
||||
"fixed_pair_not_supported": "ဤပုံသေစုံတွဲသည်ရွေးချယ်ထားသောလဲလှယ်ရေးအစီအစဉ်များဖြင့်မထောက်ပံ့ပါ",
|
||||
"fixed_rate": "ပုံသေနှုန်း",
|
||||
"fixed_rate_alert": "ပုံသေနှုန်းထားမုဒ်ကို စစ်ဆေးသည့်အခါ လက်ခံပမာဏကို ထည့်သွင်းနိုင်မည်ဖြစ်သည်။ ပုံသေနှုန်းမုဒ်သို့ ပြောင်းလိုပါသလား။",
|
||||
"forgot_password": "စကားဝှက်မေ့နေပါသလား",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "စမ်း",
|
||||
"nodes": "ဆုံမှတ်များ",
|
||||
"nodes_list_reset_to_default_message": "ဆက်တင်များကို မူရင်းအတိုင်း ပြန်လည်သတ်မှတ်လိုသည်မှာ သေချာပါသလား။",
|
||||
"none_of_selected_providers_can_exchange": "ရွေးချယ်ထားသော ဝန်ဆောင်မှုပေးသူများမှ ဤလဲလှယ်မှုကို ပြုလုပ်၍မရပါ။",
|
||||
"none_of_selected_providers_can_exchange": "ရွေးချယ်ထားသောပံ့ပိုးပေးသူတစ် ဦး တစ်ယောက်မှဤအစီအစဉ်ကိုလုပ်နိုင်သည်",
|
||||
"noNFTYet": "NFTs မရှိသေးပါ။",
|
||||
"normal": "ပုံမှန်",
|
||||
"note_optional": "မှတ်ချက် (ချန်လှပ်ထားနိုင်သည်)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Verander valuta",
|
||||
"change_current_node": "Weet u zeker dat u het huidige knooppunt wilt wijzigen in ${node}?",
|
||||
"change_current_node_title": "Wijzig het huidige knooppunt",
|
||||
"change_exchange_provider": "Wijzig Exchange Provider",
|
||||
"change_exchange_provider": "Verander Swap Provider",
|
||||
"change_language": "Verander de taal",
|
||||
"change_language_to": "Verander de taal in ${language}?",
|
||||
"change_password": "Wachtwoord wijzigen",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Token bewerken",
|
||||
"electrum_address_disclaimer": "We genereren nieuwe adressen elke keer dat u er een gebruikt, maar eerdere adressen blijven werken",
|
||||
"email_address": "E-mailadres",
|
||||
"enable": "Inschakelen",
|
||||
"enable_mempool_api": "Mempool API voor nauwkeurige kosten en datums",
|
||||
"enable_replace_by_fee": "Schakel vervangen door een fee",
|
||||
"enable_silent_payments_scanning": "Begin met het scannen van stille betalingen, totdat de tip is bereikt",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Etherscan-geschiedenis",
|
||||
"event": "Evenement",
|
||||
"events": "Evenementen",
|
||||
"exchange": "Uitwisseling",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Als u XMR wilt omwisselen van uw Cake Wallet Monero-saldo, moet u eerst overschakelen naar uw Monero-portemonnee.",
|
||||
"exchange": "Ruil",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Als je XMR uit je cake -portemonnee Monero -balans wilt ruilen, schakel dan eerst over naar je Monero -portemonnee.",
|
||||
"exchange_new_template": "Nieuwe sjabloon",
|
||||
"exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!",
|
||||
"exchange_result_confirm": "Door op bevestigen te drukken, wordt u verzonden ${fetchingLabel} ${from} uit je portemonnee genoemd ${walletName} naar het onderstaande adres. Of u kunt vanuit uw externe portemonnee naar het onderstaande adres verzenden / QR-code sturen.\n\nDruk op bevestigen om door te gaan of terug te gaan om de bedragen te wijzigen.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Vul de verificatiecode in die u in uw e-mail hebt ontvangen",
|
||||
"filter_by": "Filteren op",
|
||||
"first_wallet_text": "Geweldige portemonnee voor Monero, Bitcoin, Ethereum, Litecoin, en Haven",
|
||||
"fixed_pair_not_supported": "Dit vaste paar wordt niet ondersteund bij de geselecteerde exchanges",
|
||||
"fixed_pair_not_supported": "Dit vaste paar wordt niet ondersteund met de geselecteerde swap -services",
|
||||
"fixed_rate": "Vast tarief",
|
||||
"fixed_rate_alert": "U kunt het ontvangen bedrag invoeren wanneer de modus voor vaste tarieven is aangevinkt. Wilt u overschakelen naar de vaste-tariefmodus?",
|
||||
"forgot_password": "Wachtwoord vergeten",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Test",
|
||||
"nodes": "Knooppunten",
|
||||
"nodes_list_reset_to_default_message": "Weet u zeker dat u de standaardinstellingen wilt herstellen?",
|
||||
"none_of_selected_providers_can_exchange": "Geen van de geselecteerde providers kan deze uitwisseling maken",
|
||||
"none_of_selected_providers_can_exchange": "Geen van de geselecteerde providers kan deze swap maken",
|
||||
"noNFTYet": "Nog geen NFT's",
|
||||
"normal": "Normaal",
|
||||
"note_optional": "Opmerking (optioneel)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Zmień walutę",
|
||||
"change_current_node": "Czy na pewno chcesz wybrać ten węzeł? ${node}?",
|
||||
"change_current_node_title": "Zmień bieżący węzeł",
|
||||
"change_exchange_provider": "Zmień dostawcę wymiany",
|
||||
"change_exchange_provider": "Zmień dostawca zamiany",
|
||||
"change_language": "Zmień język",
|
||||
"change_language_to": "Zmień język na ${language}?",
|
||||
"change_password": "Zmień hasło",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Edytuj token",
|
||||
"electrum_address_disclaimer": "Za każdym razem, gdy wykorzystasz adres, dla wiekszej prywatności generujemy nowy, ale poprzednie adresy nadal działają, i moga odbierać środki",
|
||||
"email_address": "Adres e-mail",
|
||||
"enable": "Włączać",
|
||||
"enable_mempool_api": "Mempool API dla dokładnych opłat i dat",
|
||||
"enable_replace_by_fee": "Włącz wymianę po lewej",
|
||||
"enable_silent_payments_scanning": "Zacznij skanować ciche płatności, aż do osiągnięcia wskazówki",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Historia Etherscanu",
|
||||
"event": "Wydarzenie",
|
||||
"events": "Wydarzenia",
|
||||
"exchange": "Wymień",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Jeśli chcesz wymienić XMR z salda Cake Wallet Monero, najpierw przełącz się na portfel Monero.",
|
||||
"exchange": "Zamieniać",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Jeśli chcesz zamienić XMR z salda Monero Portfer, najpierw przejdź na portfel Monero.",
|
||||
"exchange_new_template": "Nowy szablon wymiany",
|
||||
"exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!",
|
||||
"exchange_result_confirm": "Naciskając Potwierdź, wyślesz ${fetchingLabel} ${from} z twojego portfela ${walletName} na adres podany poniżej. Lub możesz wysłać z zewnętrznego portfela na poniższy adres / kod QR.\n\nNaciśnij Potwierdź, aby kontynuować lub wróć, aby zmienić kwoty.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Proszę wpisać kod weryfikacyjny który otrzymałeś w wiadomości e-mail",
|
||||
"filter_by": "Filtruj według",
|
||||
"first_wallet_text": "Świetny portfel na Monero, Bitcoin, Ethereum, Litecoin, i Haven",
|
||||
"fixed_pair_not_supported": "Ta stała para nie jest obsługiwana na wybranych giełdach",
|
||||
"fixed_pair_not_supported": "Ta stała para nie jest obsługiwana z wybranymi usługami swap",
|
||||
"fixed_rate": "Stała stawka",
|
||||
"fixed_rate_alert": "Będziesz mógł wprowadzić kwotę do otrzymania, gdy wybrany bedzie tryb stałego przeliczenia. Czy chcesz przejść do trybu stałej stawki?",
|
||||
"forgot_password": "Zapomniałem hasła",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Alterar moeda",
|
||||
"change_current_node": "Você realmente deseja alterar o nó atual para ${node}?",
|
||||
"change_current_node_title": "Mudar o nó atual",
|
||||
"change_exchange_provider": "Alterar o provedor de troca",
|
||||
"change_exchange_provider": "Provedor de troca de alteração",
|
||||
"change_language": "Mudar idioma",
|
||||
"change_language_to": "Alterar idioma para ${language}?",
|
||||
"change_password": "Mudar senha",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Editar símbolo",
|
||||
"electrum_address_disclaimer": "Geramos novos endereços cada vez que você usa um, mas os endereços anteriores continuam funcionando",
|
||||
"email_address": "Endereço de e-mail",
|
||||
"enable": "Habilitar",
|
||||
"enable_mempool_api": "Mempool API para taxas e datas precisas",
|
||||
"enable_replace_by_fee": "Habilite substituir por taxa",
|
||||
"enable_silent_payments_scanning": "Comece a escanear pagamentos silenciosos, até que o topo seja alcançada",
|
||||
|
@ -281,7 +282,7 @@
|
|||
"event": "Evento",
|
||||
"events": "Eventos",
|
||||
"exchange": "Trocar",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Se você deseja trocar o XMR de seu saldo da Carteira Monero Cake, troque primeiro para sua carteira Monero.",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Se você deseja trocar o XMR do balanço da carteira de bolo, mude para a sua carteira Monero primeiro.",
|
||||
"exchange_new_template": "Novo modelo",
|
||||
"exchange_provider_unsupported": "${providerName} não é mais suportado!",
|
||||
"exchange_result_confirm": "Ao confirmar, você enviará ${fetchingLabel} ${from} da sua carteira ${walletName} para o endereço mostrado abaixo. Ou você pode enviar de sua carteira externa para o endereço abaixo/código QR acima.\n\nPressione Confirmar para continuar ou volte para alterar os valores.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Por favor, preencha o código de verificação fornecido ao seu e-mail",
|
||||
"filter_by": "Filtrar por",
|
||||
"first_wallet_text": "Carteira incrível para Monero, Bitcoin, Ethereum, Litecoin, e Haven",
|
||||
"fixed_pair_not_supported": "Este par fixo não é compatível com as exchanges selecionadas",
|
||||
"fixed_pair_not_supported": "Este par fixo não é suportado com os serviços de troca selecionados",
|
||||
"fixed_rate": "Taxa fixa",
|
||||
"fixed_rate_alert": "Você poderá inserir a quantia recebida quando o modo de taxa fixa estiver marcado. Quer mudar para o modo de taxa fixa?",
|
||||
"forgot_password": "Esqueci a senha",
|
||||
|
@ -440,7 +441,7 @@
|
|||
"node_test": "Teste",
|
||||
"nodes": "Nós",
|
||||
"nodes_list_reset_to_default_message": "Você realmente deseja redefinir as configurações para o padrão?",
|
||||
"none_of_selected_providers_can_exchange": "Nenhum dos provedores selecionados pode fazer esta troca",
|
||||
"none_of_selected_providers_can_exchange": "Nenhum dos fornecedores selecionados pode fazer essa troca",
|
||||
"noNFTYet": "Ainda não há NFT",
|
||||
"normal": "Normal",
|
||||
"note_optional": "Nota (opcional)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Изменить валюту",
|
||||
"change_current_node": "Вы уверены, что хотите изменить текущую ноду на ${node}?",
|
||||
"change_current_node_title": "Изменить текущую ноду",
|
||||
"change_exchange_provider": "Изменить провайдера обмена",
|
||||
"change_exchange_provider": "Изменить поставщика свопа",
|
||||
"change_language": "Изменить язык",
|
||||
"change_language_to": "Изменить язык на ${language}?",
|
||||
"change_password": "Изменить пароль",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Изменить токен",
|
||||
"electrum_address_disclaimer": "Мы генерируем новые адреса каждый раз, когда вы их используете, но предыдущие адреса продолжают работать.",
|
||||
"email_address": "Адрес электронной почты",
|
||||
"enable": "Давать возможность",
|
||||
"enable_mempool_api": "Mempool API за точные сборы и даты",
|
||||
"enable_replace_by_fee": "Включить замену за пикой",
|
||||
"enable_silent_payments_scanning": "Начните сканировать безмолвные платежи, пока не будет достигнут наконечник",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "История Эфириума",
|
||||
"event": "Событие",
|
||||
"events": "События",
|
||||
"exchange": "Обмен",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Если вы хотите обменять XMR со своего баланса Monero в Cake Wallet, сначала переключитесь на свой кошелек Monero.",
|
||||
"exchange": "Менять",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Если вы хотите поменять XMR с баланса с кошельком для торта Monero, сначала переключитесь на свой кошелек Monero.",
|
||||
"exchange_new_template": "Новый шаблон",
|
||||
"exchange_provider_unsupported": "${providerName} больше не поддерживается!",
|
||||
"exchange_result_confirm": "Нажимая подтвердить, вы отправите ${fetchingLabel} ${from} с вашего кошелька ${walletName} на адрес указанный ниже. Или вы можете отправить со своего внешнего кошелька на нижеуказанный адрес/QR-код.\n\nПожалуйста, нажмите подтвердить для продолжения, или вернитесь назад для изменения суммы.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Пожалуйста, введите код подтверждения, отправленный на вашу электронную почту",
|
||||
"filter_by": "Фильтровать по",
|
||||
"first_wallet_text": "В самом удобном кошельке для Monero, Bitcoin, Ethereum, Litecoin, и Haven",
|
||||
"fixed_pair_not_supported": "Эта фиксированная пара не поддерживается выбранными биржами.",
|
||||
"fixed_pair_not_supported": "Эта фиксированная пара не поддерживается выбранными службами свопа",
|
||||
"fixed_rate": "Фиксированная ставка",
|
||||
"fixed_rate_alert": "Вы сможете ввести сумму получения тогда, когда будет установлен режим фиксированной ставки. Вы хотите перейти в режим фиксированной ставки?",
|
||||
"forgot_password": "Забыли пароль",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Тест",
|
||||
"nodes": "Ноды",
|
||||
"nodes_list_reset_to_default_message": "Вы уверены, что хотите сбросить настройки до значений по умолчанию?",
|
||||
"none_of_selected_providers_can_exchange": "Ни один из выбранных провайдеров не может совершить этот обмен",
|
||||
"none_of_selected_providers_can_exchange": "Ни один из выбранных провайдеров не может сделать это обмен",
|
||||
"noNFTYet": "NFT пока нет",
|
||||
"normal": "Нормальный",
|
||||
"note_optional": "Примечание (необязательно)",
|
||||
|
|
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "แก้ไขโทเค็น",
|
||||
"electrum_address_disclaimer": "เราสร้างที่อยู่ใหม่ทุกครั้งที่คุณใช้หนึ่งอย่าง แต่ที่อยู่เก่ายังสามารถใช้ได้ต่อไป",
|
||||
"email_address": "ที่อยู่อีเมล",
|
||||
"enable": "เปิดใช้งาน",
|
||||
"enable_mempool_api": "Mempool API สำหรับค่าธรรมเนียมและวันที่ที่ถูกต้อง",
|
||||
"enable_replace_by_fee": "เปิดใช้งานการเปลี่ยนโดยค่าธรรมเนียม",
|
||||
"enable_silent_payments_scanning": "เริ่มสแกนการชำระเงินแบบเงียบจนกว่าจะถึงปลาย",
|
||||
|
@ -281,7 +282,7 @@
|
|||
"event": "เหตุการณ์",
|
||||
"events": "กิจกรรม",
|
||||
"exchange": "แลกเปลี่ยน",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "หากคุณต้องการแลกเปลี่ยน XMR จากยอดคงเหลือ Monero ใน Cake Wallet ของคุณ กรุณาเปลี่ยนเป็นกระเป๋า Monero ก่อน",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "หากคุณต้องการสลับ XMR จาก Cake Wallet Monero Balance โปรดเปลี่ยนไปใช้กระเป๋าเงิน Monero ก่อน",
|
||||
"exchange_new_template": "เทมเพลทใหม่",
|
||||
"exchange_provider_unsupported": "${providerName} ไม่ได้รับการสนับสนุนอีกต่อไป!",
|
||||
"exchange_result_confirm": "โดยกดปุ่มยืนยัน, คุณจะส่ง ${fetchingLabel} ${from} จากกระเป๋าของคุณที่เรียกว่า ${walletName} ไปยังที่อยู่ที่แสดงข้างล่าง หรือคุณสามารถส่งจากกระเป๋าภายนอกไปยังที่อยู่/รหัส QR ด้านล่าง\n\nโปรดกดปุ่มยืนยันเพื่อดำเนินการต่อหรือกลับไปเปลี่ยนจำนวน",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "โปรดกรอกรหัสยืนยันที่ส่งไปยังอีเมลของคุณ",
|
||||
"filter_by": "กรองตาม",
|
||||
"first_wallet_text": "กระเป๋าสตางค์ที่สวยงามสำหรับ Monero, Bitcoin, Ethereum, Litecoin และ Haven",
|
||||
"fixed_pair_not_supported": "คู่ความสัมพันธ์ที่ถูกกำหนดไว้นี้ไม่สนับสนุนกับหุ้นที่เลือก",
|
||||
"fixed_pair_not_supported": "คู่คงที่นี้ไม่ได้รับการสนับสนุนด้วยบริการแลกเปลี่ยนที่เลือก",
|
||||
"fixed_rate": "อัตราคงที่",
|
||||
"fixed_rate_alert": "คุณจะสามารถป้อนจำนวนที่ได้รับเมื่อเลือกโหมดอัตราคงที่ คุณต้องการสลับไปที่โหมดอัตราคงที่?",
|
||||
"forgot_password": "ลืมรหัสผ่าน",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "ทดสอบ",
|
||||
"nodes": "โหนด",
|
||||
"nodes_list_reset_to_default_message": "คุณแน่ใจหรือว่าต้องการรีเซ็ตการตั้งค่าเป็นค่าเริ่มต้น?",
|
||||
"none_of_selected_providers_can_exchange": "ไม่มีผู้ให้บริการที่เลือกที่สามารถแลกเปลี่ยนนี้ได้",
|
||||
"none_of_selected_providers_can_exchange": "ผู้ให้บริการที่เลือกไม่สามารถทำการแลกเปลี่ยนนี้ได้",
|
||||
"noNFTYet": "ยังไม่มี NFT",
|
||||
"normal": "ปกติ",
|
||||
"note_optional": "บันทึก (ไม่จำเป็น)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Baguhin ang pera",
|
||||
"change_current_node": "Sigurado ka bang baguhin ang kasalukuyang node sa ${node}?",
|
||||
"change_current_node_title": "Baguhin ang kasalukuyang node",
|
||||
"change_exchange_provider": "Baguhin ang exchange provider",
|
||||
"change_exchange_provider": "Baguhin ang Swap Provider",
|
||||
"change_language": "Baguhin ang wika",
|
||||
"change_language_to": "Baguhin ang wika sa ${language}?",
|
||||
"change_password": "Baguhin ang password",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "I-edit ang token",
|
||||
"electrum_address_disclaimer": "Bumubuo kami ng mga bagong address sa tuwing gagamit ka ng isa, ngunit ang mga nakaraang address ay patuloy na gumagana",
|
||||
"email_address": "Email Address",
|
||||
"enable": "Paganahin",
|
||||
"enable_mempool_api": "Mempool API para sa tumpak na bayad at mga petsa",
|
||||
"enable_replace_by_fee": "Paganahin ang Replace-By-Fee",
|
||||
"enable_silent_payments_scanning": "Simulan ang pag -scan ng tahimik na pagbabayad, hanggang sa maabot ang tip",
|
||||
|
@ -281,7 +282,7 @@
|
|||
"event": "Kaganapan",
|
||||
"events": "Mga kaganapan",
|
||||
"exchange": "Palitan",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Kung gusto mong palitan ang XMR mula sa iyong balanse ng Monero ng Cake Wallet, mangyaring lumipat muna sa iyong Monero wallet.",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Kung nais mong magpalit ng XMR mula sa iyong balanse ng Wallet Monero, mangyaring lumipat sa iyong Monero Wallet muna.",
|
||||
"exchange_new_template": "Bagong template",
|
||||
"exchange_provider_unsupported": "Ang ${providerName} ay hindi na suportado!",
|
||||
"exchange_result_confirm": "Sa pamamagitan ng pagpindot sa kumpirmahin, ikaw ay magpapadala ${fetchingLabel} ${from} mula sa inyong wallet na tinatawag ${walletName} sa wallet na ipinapakita sa ibaba. O pwede kang magpadala sa inyong external wallet sa ibabang address/QR code.\n\nPara magpatuloy, mangyaring pindutin upang kumpirmahin o bumalik para baguhin ang halaga.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Mangyaring ilagay ang verfification code na ibinigay sa iyong email",
|
||||
"filter_by": "Filter ni",
|
||||
"first_wallet_text": "Kahanga-hangang wallet para sa Monero, Bitcoin, Litecoin, Ethereum, at Haven",
|
||||
"fixed_pair_not_supported": "Ang nakapirming pares na ito ay hindi suportado sa mga napiling palitan",
|
||||
"fixed_pair_not_supported": "Ang nakapirming pares na ito ay hindi suportado sa mga napiling serbisyo ng pagpapalit",
|
||||
"fixed_rate": "Fixed rate",
|
||||
"fixed_rate_alert": "Makakapagpasok ka ng halaga ng pagtanggap kapag nasuri ang fixed rate mode. Gusto mo bang lumipat sa fixed rate mode?",
|
||||
"forgot_password": "Nakalimutan ang Password",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Test",
|
||||
"nodes": "Mga node",
|
||||
"nodes_list_reset_to_default_message": "Sigurado ka bang gusto mo bang i-reset ang mga settings sa default?",
|
||||
"none_of_selected_providers_can_exchange": "Wala sa mga napiling provider ang makakagawa ng palitan na ito",
|
||||
"none_of_selected_providers_can_exchange": "Wala sa mga napiling tagapagbigay ng serbisyo ang maaaring gumawa ng pagpapalit na ito",
|
||||
"noNFTYet": "Wala pang NFT",
|
||||
"normal": "Normal",
|
||||
"note_optional": "Tala (opsyonal)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Para Birimini Değiştir",
|
||||
"change_current_node": "Şimdiki düğümü ${node} düğümüne değiştirmek istediğinizden emin misin?",
|
||||
"change_current_node_title": "Şimdiki düğümü değiştir",
|
||||
"change_exchange_provider": "Takas sağlayıcısını değiştir",
|
||||
"change_exchange_provider": "Takas Sağlayıcısı Değiştir",
|
||||
"change_language": "Dili değiştir",
|
||||
"change_language_to": "Dili şuna değiştir: ${language}?",
|
||||
"change_password": "Parolayı değiştir",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Belirteci düzenle",
|
||||
"electrum_address_disclaimer": "Adresini her kullandığında yeni adres oluşturuyoruz, ancak önceki adresler de çalışmaya devam eder",
|
||||
"email_address": "E-posta Adresi",
|
||||
"enable": "Olanak vermek",
|
||||
"enable_mempool_api": "Doğru ücretler ve tarihler için Mempool API'si",
|
||||
"enable_replace_by_fee": "Farklı Değiştir'i Etkinleştir",
|
||||
"enable_silent_payments_scanning": "Bahşiş ulaşılıncaya kadar sessiz ödemeleri taramaya başlayın",
|
||||
|
@ -281,7 +282,7 @@
|
|||
"event": "Etkinlik",
|
||||
"events": "Olaylar",
|
||||
"exchange": "Takas",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Cake Wallet'daki Monero bakiyenizi kullanarak takas yapmak istiyorsan, lütfen önce Monero cüzdanına geç.",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "XMR'yi kek cüzdanı Monero bakiyenizden değiştirmek istiyorsanız, lütfen önce Monero cüzdanınıza geçin.",
|
||||
"exchange_new_template": "Yeni şablon",
|
||||
"exchange_provider_unsupported": "${providerName} artık desteklenmiyor!",
|
||||
"exchange_result_confirm": "Onaylaya basarak, ${fetchingLabel} ${from} miktarında ${walletName} olarak adlandırılan cüzdanından aşağıda gösterilen adrese gönderilecek. Veya harici cüzdanından aşağıdaki adrese / QR koduna gönderebilirsin.\n\nLütfen devam etmek için onayla'ya bas veya tutarı değiştirmek için geri dön.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Lütfen e-postanıza gelen doğrulama kodunu girin",
|
||||
"filter_by": "Şuna göre filtrele",
|
||||
"first_wallet_text": "Monero, Bitcoin, Ethereum, Litecoin ve Haven için harika cüzdan",
|
||||
"fixed_pair_not_supported": "Bu sabit paritesi seçilen borsalarda desteklenmemekte",
|
||||
"fixed_pair_not_supported": "Bu sabit çift seçilen takas hizmetleri ile desteklenmez",
|
||||
"fixed_rate": "Sabit oran",
|
||||
"fixed_rate_alert": "Sabit oran modunu işaretlersen alım tutarını girebilirsin. Sabit oran moduna geçmek ister misin?",
|
||||
"forgot_password": "Parolamı unuttum",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Test Et",
|
||||
"nodes": "Düğümler",
|
||||
"nodes_list_reset_to_default_message": "Ayarları varsayılana sıfırlamak istediğinizden emin misin?",
|
||||
"none_of_selected_providers_can_exchange": "Seçilen sağlayıcılardan hiçbiri bu takası yapamaz",
|
||||
"none_of_selected_providers_can_exchange": "Seçilen sağlayıcıların hiçbiri bu takas yapamaz",
|
||||
"noNFTYet": "Henüz NFT yok",
|
||||
"normal": "Normal",
|
||||
"note_optional": "Not (isteğe bağlı)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Змінити валюту",
|
||||
"change_current_node": "Ви впевнені, що хочете змінити поточний вузол на ${node}?",
|
||||
"change_current_node_title": "Змінити поточний вузол",
|
||||
"change_exchange_provider": "Змінити провайдера обміну",
|
||||
"change_exchange_provider": "Змінити постачальник свопів",
|
||||
"change_language": "Змінити мову",
|
||||
"change_language_to": "Змінити мову на ${language}?",
|
||||
"change_password": "Змінити пароль",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "Редагувати маркер",
|
||||
"electrum_address_disclaimer": "Ми створюємо нові адреси щоразу, коли ви використовуєте їх, але попередні адреси продовжують працювати",
|
||||
"email_address": "Адреса електронної пошти",
|
||||
"enable": "Ввімкнути",
|
||||
"enable_mempool_api": "API Mempool для точних зборів та дат",
|
||||
"enable_replace_by_fee": "Увімкнути заміну з комісією",
|
||||
"enable_silent_payments_scanning": "Почніть сканувати мовчазні платежі, поки не буде досягнуто наконечника",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "Історія Etherscan",
|
||||
"event": "Подія",
|
||||
"events": "Події",
|
||||
"exchange": "Обмін",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Якщо ви хочете обміняти XMR із вашого балансу Cake Wallet Monero, спочатку перейдіть на свій гаманець Monero.",
|
||||
"exchange": "Обміняти",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Якщо ви хочете поміняти XMR зі свого балансу для тортів Monero Balance, спочатку перейдіть на свій гаманець Monero.",
|
||||
"exchange_new_template": "Новий шаблон",
|
||||
"exchange_provider_unsupported": "${providerName} більше не підтримується!",
|
||||
"exchange_result_confirm": "Натиснувши підтвердити, ви відправите ${fetchingLabel} ${from} з вашого гаманця ${walletName} на адресу вказану нижче. Або ви можете відправити зі свого зовнішнього гаманця на нижчевказану адресу/QR-код.\n\nБудь ласка, натисніть підтвердити для продовження або поверніться назад щоб змінити суму.",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "Будь ласка, введіть код підтвердження, надісланий на вашу електронну адресу",
|
||||
"filter_by": "Фільтрувати по",
|
||||
"first_wallet_text": "В самому зручному гаманці для Monero, Bitcoin, Ethereum, Litecoin, та Haven",
|
||||
"fixed_pair_not_supported": "Ця фіксована пара не підтримується вибраними біржами",
|
||||
"fixed_pair_not_supported": "Ця фіксована пара не підтримується вибраними послугами Swap",
|
||||
"fixed_rate": "Фіксована ставка",
|
||||
"fixed_rate_alert": "Ви зможете ввести суму отримання тоді, коли буде встановлений режим фіксованої ставки. Ви хочете перейти в режим фіксованої ставки?",
|
||||
"forgot_password": "Забули пароль",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "Тест",
|
||||
"nodes": "Вузли",
|
||||
"nodes_list_reset_to_default_message": "Ви впевнені, що хочете скинути до налаштувань за замовченням?",
|
||||
"none_of_selected_providers_can_exchange": "Жоден із вибраних провайдерів не може здійснити цей обмін",
|
||||
"none_of_selected_providers_can_exchange": "Жоден із вибраних постачальників не може зробити цей своп",
|
||||
"noNFTYet": "NFT ще немає",
|
||||
"normal": "нормальний",
|
||||
"note_optional": "Примітка (необов’язково)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "کرنسی تبدیل کریں",
|
||||
"change_current_node": "کیا آپ یقینی طور پر موجودہ نوڈ کو ${node} میں تبدیل کرنا چاہتے ہیں؟",
|
||||
"change_current_node_title": "موجودہ نوڈ کو تبدیل کریں۔",
|
||||
"change_exchange_provider": "ایکسچینج فراہم کنندہ کو تبدیل کریں۔",
|
||||
"change_exchange_provider": "تبادلہ فراہم کرنے والے کو تبدیل کریں",
|
||||
"change_language": "زبان تبدیل کریں",
|
||||
"change_language_to": "زبان کو ${language} میں تبدیل کریں؟",
|
||||
"change_password": "پاس ورڈ تبدیل کریں",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "ٹوکن میں ترمیم کریں۔",
|
||||
"electrum_address_disclaimer": "جب بھی آپ ایک کا استعمال کرتے ہیں تو ہم نئے پتے تیار کرتے ہیں، لیکن پچھلے پتے کام کرتے رہتے ہیں۔",
|
||||
"email_address": "ای میل اڈریس",
|
||||
"enable": "قابل بنائیں",
|
||||
"enable_mempool_api": "درست فیسوں اور تاریخوں کے لئے میمپول API",
|
||||
"enable_replace_by_fee": "فی فیس کو تبدیل کریں",
|
||||
"enable_silent_payments_scanning": "خاموش ادائیگیوں کو اسکین کرنا شروع کریں ، جب تک کہ نوک نہ پہنچ جائے",
|
||||
|
@ -281,7 +282,7 @@
|
|||
"event": "ﺐﯾﺮﻘﺗ",
|
||||
"events": "ﺕﺎﺒﯾﺮﻘﺗ",
|
||||
"exchange": "تبادلہ",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "اگر آپ اپنے Cake والیٹ Monero بیلنس سے XMR کا تبادلہ کرنا چاہتے ہیں، تو براہ کرم پہلے اپنے Monero والیٹ پر جائیں۔",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "اگر آپ اپنے کیک پرس مونیرو بیلنس سے XMR تبدیل کرنا چاہتے ہیں تو ، براہ کرم پہلے اپنے مونیرو پرس میں جائیں۔",
|
||||
"exchange_new_template": "نیا سانچہ",
|
||||
"exchange_provider_unsupported": "${providerName} اب تعاون نہیں کیا جاتا ہے!",
|
||||
"exchange_result_confirm": "تصدیق کو دبانے سے، آپ اپنے بٹوے سے ${fetchingLabel} ${from} بھیجیں گے جسے ${walletName} کہتے ہیں نیچے دکھائے گئے پتے پر۔ یا آپ اپنے بیرونی والیٹ سے نیچے دیئے گئے پتے/QR کوڈ پر بھیج سکتے ہیں۔\\n\\nجاری رکھنے کے لیے براہ کرم تصدیق کو دبائیں یا رقم تبدیل کرنے کے لیے واپس جائیں۔",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "براہ کرم اپنے ای میل پر فراہم کردہ تصدیقی کوڈ کو پُر کریں۔",
|
||||
"filter_by": "کی طرف سے فلٹر",
|
||||
"first_wallet_text": "Monero، Bitcoin، Ethereum، Litecoin، اور Haven کے لیے زبردست پرس",
|
||||
"fixed_pair_not_supported": "یہ مقررہ جوڑا منتخب کردہ تبادلے کے ساتھ تعاون یافتہ نہیں ہے۔",
|
||||
"fixed_pair_not_supported": "یہ فکسڈ جوڑی منتخب شدہ تبادلہ خدمات کے ساتھ تعاون یافتہ نہیں ہے",
|
||||
"fixed_rate": "مقررہ شرح",
|
||||
"fixed_rate_alert": "فکسڈ ریٹ موڈ چیک ہونے پر آپ وصولی رقم درج کر سکیں گے۔ کیا آپ فکسڈ ریٹ موڈ پر سوئچ کرنا چاہتے ہیں؟",
|
||||
"forgot_password": "پاسورڈ بھول گے",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "پرکھ",
|
||||
"nodes": "نوڈس",
|
||||
"nodes_list_reset_to_default_message": "کیا آپ واقعی ترتیبات کو ڈیفالٹ پر دوبارہ ترتیب دینا چاہتے ہیں؟",
|
||||
"none_of_selected_providers_can_exchange": "منتخب فراہم کنندگان میں سے کوئی بھی یہ تبادلہ نہیں کر سکتا",
|
||||
"none_of_selected_providers_can_exchange": "منتخب کردہ کوئی بھی فراہم کنندہ یہ تبادلہ نہیں کرسکتا",
|
||||
"noNFTYet": "۔ﮟﯿﮨ ﮟﯿﮩﻧ NFTs ﯽﺋﻮﮐ ﮏﺗ ﯽﮭﺑﺍ",
|
||||
"normal": "نارمل",
|
||||
"note_optional": "نوٹ (اختیاری)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Thay đổi Tiền tệ",
|
||||
"change_current_node": "Bạn có chắc chắn muốn thay đổi nút hiện tại sang ${node} không?",
|
||||
"change_current_node_title": "Thay đổi nút hiện tại",
|
||||
"change_exchange_provider": "Thay đổi Nhà cung cấp Trao đổi",
|
||||
"change_exchange_provider": "Thay đổi nhà cung cấp hoán đổi",
|
||||
"change_language": "Thay đổi ngôn ngữ",
|
||||
"change_language_to": "Thay đổi ngôn ngữ sang ${language}?",
|
||||
"change_password": "Thay đổi mật khẩu",
|
||||
|
@ -236,6 +236,7 @@
|
|||
"edit_token": "Chỉnh sửa token",
|
||||
"electrum_address_disclaimer": "Chúng tôi tạo địa chỉ mới mỗi khi bạn sử dụng, nhưng các địa chỉ cũ vẫn tiếp tục hoạt động",
|
||||
"email_address": "Địa chỉ Email",
|
||||
"enable": "Cho phép",
|
||||
"enable_mempool_api": "API Mempool cho các khoản phí và ngày chính xác",
|
||||
"enable_replace_by_fee": "Bật Thay thế Bằng Phí",
|
||||
"enable_silent_payments_scanning": "Bật quét thanh toán im lặng",
|
||||
|
@ -281,8 +282,8 @@
|
|||
"etherscan_history": "Lịch sử Etherscan",
|
||||
"event": "Sự kiện",
|
||||
"events": "Các sự kiện",
|
||||
"exchange": "Trao đổi",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Nếu bạn muốn trao đổi XMR từ số dư Monero của Ví Cake, vui lòng chuyển sang ví Monero của bạn trước.",
|
||||
"exchange": "Tráo đổi",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Nếu bạn muốn trao đổi XMR từ CAPE CAME MONERO BALANCE, vui lòng chuyển sang ví Monero của bạn trước.",
|
||||
"exchange_new_template": "Mẫu mới",
|
||||
"exchange_provider_unsupported": "${providerName} không còn được hỗ trợ nữa!",
|
||||
"exchange_result_confirm": "Bằng cách nhấn xác nhận, bạn sẽ gửi ${fetchingLabel} ${from} từ ví có tên ${walletName} của mình đến địa chỉ dưới đây. Hoặc bạn có thể gửi từ ví bên ngoài của mình đến địa chỉ/mã QR bên dưới.\n\nVui lòng nhấn xác nhận để tiếp tục hoặc quay lại để thay đổi số tiền.",
|
||||
|
@ -309,7 +310,7 @@
|
|||
"fill_code": "Vui lòng điền mã xác minh được gửi đến email của bạn",
|
||||
"filter_by": "Lọc theo",
|
||||
"first_wallet_text": "Ví tuyệt vời cho Monero, Bitcoin, Ethereum, Litecoin, và Haven",
|
||||
"fixed_pair_not_supported": "Cặp tỷ giá cố định này không được hỗ trợ với các sàn giao dịch đã chọn",
|
||||
"fixed_pair_not_supported": "Cặp cố định này không được hỗ trợ với các dịch vụ hoán đổi đã chọn",
|
||||
"fixed_rate": "Tỷ giá cố định",
|
||||
"fixed_rate_alert": "Bạn sẽ có thể nhập số lượng nhận được khi chế độ tỷ giá cố định được chọn. Bạn có muốn chuyển sang chế độ tỷ giá cố định không?",
|
||||
"forgot_password": "Quên mật khẩu",
|
||||
|
@ -431,7 +432,7 @@
|
|||
"node_test": "Kiểm tra",
|
||||
"nodes": "Các nút",
|
||||
"nodes_list_reset_to_default_message": "Bạn có chắc chắn muốn đặt lại cài đặt về mặc định không?",
|
||||
"none_of_selected_providers_can_exchange": "Không có nhà cung cấp nào đã chọn có thể thực hiện giao dịch này",
|
||||
"none_of_selected_providers_can_exchange": "Không có nhà cung cấp nào được chọn có thể thực hiện hoán đổi này",
|
||||
"noNFTYet": "Chưa có NFT",
|
||||
"normal": "Bình thường",
|
||||
"note_optional": "Ghi chú (tùy chọn)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "Pààrọ̀ irú owó",
|
||||
"change_current_node": "Ṣé ó dá yín lójú pé ẹ fẹ́ pààrọ̀ apẹka lọ́wọ́ sí ${node}?",
|
||||
"change_current_node_title": "Pààrọ̀ apẹka lọwọ́",
|
||||
"change_exchange_provider": "Pààrọ̀ Ilé Ìfowóṣòwò",
|
||||
"change_exchange_provider": "Yipada olupese Swap",
|
||||
"change_language": "Pààrọ̀ èdè",
|
||||
"change_language_to": "Pààrọ̀ èdè sí ${language}?",
|
||||
"change_password": "Pààrọ̀ ọ̀rọ̀ aṣínà",
|
||||
|
@ -236,6 +236,7 @@
|
|||
"edit_token": "Ṣatunkọ àmi",
|
||||
"electrum_address_disclaimer": "A dá àwọn àdírẹ́sì títun ní gbogbo àwọn ìgbà t'ẹ́ lo ó kan ṣùgbọ́n ẹ lè tẹ̀síwájú lo àwọn àdírẹ́sì tẹ́lẹ̀tẹ́lẹ̀.",
|
||||
"email_address": "Àdírẹ́sì ímeèlì",
|
||||
"enable": "Mu ṣiṣẹ",
|
||||
"enable_mempool_api": "Mempool API fun awọn owo deede ati awọn ọjọ",
|
||||
"enable_replace_by_fee": "Mu ki o rọpo",
|
||||
"enable_silent_payments_scanning": "Bẹrẹ awọn sisanwo ipalọlọ, titi ti o fi de opin",
|
||||
|
@ -281,8 +282,8 @@
|
|||
"etherscan_history": "Etherscan itan",
|
||||
"event": "Iṣẹlẹ",
|
||||
"events": "Awọn iṣẹlẹ",
|
||||
"exchange": "Pàṣípààrọ̀",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "T'ẹ́ bá fẹ́ pàṣípààrọ̀ XMR láti ìyókù owó Cake Wallet yín, ẹ jọ̀wọ́ kọ́kọ́ sún àpamọ́wọ́ Monero mọ́.",
|
||||
"exchange": "Eepo",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "Ti o ba fẹ lati yi XMR lati dọgba oyinbo oyinbo kekere rẹ ti a fi omi ṣan rẹ, jọwọ yipada si apamọwọ Monrou akọkọ.",
|
||||
"exchange_new_template": "Àwòṣe títun",
|
||||
"exchange_provider_unsupported": "${providerName} ko ni atilẹyin mọ!",
|
||||
"exchange_result_confirm": "T'ẹ́ bá tẹ̀ jẹ́rìí, ẹ máa fi ${fetchingLabel} ${from} ránṣẹ́ láti àpamọ́wọ́ yín t'á pe ${walletName} sí àdírẹ́sì t'ó ṣàfihàn òun lísàlẹ̀. Tàbí ẹ lè fi àpamọ́wọ́ mìíràn yín ránṣẹ́ sí àdírẹ́sì / àmì ìlujá lísàlẹ̀.\n\nẸ jọ̀wọ́ tẹ̀ jẹ́rìí́ tẹ̀síwájú tàbí padà sọ́dọ̀ pààrọ̀ iye náà.",
|
||||
|
@ -309,7 +310,7 @@
|
|||
"fill_code": "Ẹ jọ̀wọ́ tẹ̀ ọ̀rọ̀ ìjẹ́rìísí t'á ti ránṣẹ́ sí ímeèlì yín.",
|
||||
"filter_by": "Ṣẹ́ láti",
|
||||
"first_wallet_text": "Àpamọ́wọ́ t'á fi Monero, Bitcoin, Ethereum, Litecoin, àti Haven pamọ́ wà pa",
|
||||
"fixed_pair_not_supported": "A kì í ṣe k'á fi àwọn ilé pàṣípààrọ̀ yìí ṣe pàṣípààrọ̀ irú owó méji yìí",
|
||||
"fixed_pair_not_supported": "Bata ti o wa titi ko ṣe atilẹyin pẹlu awọn iṣẹ SWAP ti o yan",
|
||||
"fixed_rate": "Iye t'á ṣẹ́ owó sí ò ní pààrọ̀",
|
||||
"fixed_rate_alert": "Ẹ lè tẹ̀ iye owó tó ń bọ̀ tí iye t'a ṣẹ́ owó sí bá is checked. Ṣé ẹ fẹ́ sún ipò ti iye t'á ṣẹ́ owó sí ò ní pààrọ̀ mọ́?",
|
||||
"forgot_password": "Ẹ ti gbàgbé ọ̀rọ̀ aṣínà",
|
||||
|
@ -440,7 +441,7 @@
|
|||
"node_test": "Dánwò",
|
||||
"nodes": "Àwọn apẹka",
|
||||
"nodes_list_reset_to_default_message": "Ṣé ó dá yín lójú pé ẹ fẹ́ yí àwọn ààtò padà?",
|
||||
"none_of_selected_providers_can_exchange": "Àwọn ilé pàṣípààrọ̀ yíyàn kò lè ṣe pàṣípààrọ̀ yìí",
|
||||
"none_of_selected_providers_can_exchange": "Ko si ọkan ninu awọn olupese ti a yan le ṣe ina yii",
|
||||
"noNFTYet": "Ko si awọn NFT sibẹsibẹ",
|
||||
"normal": "Deede",
|
||||
"note_optional": "Àkọsílẹ̀ (ìyàn nìyí)",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"change_currency": "更改币种",
|
||||
"change_current_node": "您确定将当前节点更改为 ${node}?",
|
||||
"change_current_node_title": "更改当前节点",
|
||||
"change_exchange_provider": "更改交易所",
|
||||
"change_exchange_provider": "更改交换提供商",
|
||||
"change_language": "修改语言",
|
||||
"change_language_to": "修改语言为 ${language}?",
|
||||
"change_password": "更改密码",
|
||||
|
@ -235,6 +235,7 @@
|
|||
"edit_token": "编辑令牌",
|
||||
"electrum_address_disclaimer": "每次您使用一个地址时,我们都会生成新地址,但之前的地址仍然有效",
|
||||
"email_address": "电子邮件地址",
|
||||
"enable": "使能够",
|
||||
"enable_mempool_api": "Mempool API获得准确的费用和日期",
|
||||
"enable_replace_by_fee": "启用by-Fee替换",
|
||||
"enable_silent_payments_scanning": "开始扫描无声付款,直到达到提示",
|
||||
|
@ -280,8 +281,8 @@
|
|||
"etherscan_history": "以太扫描历史",
|
||||
"event": "事件",
|
||||
"events": "活动",
|
||||
"exchange": "兑换",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "如果要从Cake Wallet Monero余额中兑换XMR,请先切换到Monero钱包。",
|
||||
"exchange": "交换",
|
||||
"exchange_incorrect_current_wallet_for_xmr": "如果您想从蛋糕钱包Monero余额中交换XMR,请先切换到Monero Wallet。",
|
||||
"exchange_new_template": "新模板",
|
||||
"exchange_provider_unsupported": "${providerName}不再支持!",
|
||||
"exchange_result_confirm": "点击确认 您将发送 ${fetchingLabel} ${from} 从你的钱包里 ${walletName} 到下面显示的地址。 或者您可以从外部钱包发送到以下地址/ QR码。\n\n请按确认继续或返回以更改金额",
|
||||
|
@ -308,7 +309,7 @@
|
|||
"fill_code": "请填写提供给您邮箱的验证码",
|
||||
"filter_by": "过滤",
|
||||
"first_wallet_text": "适用于门罗币、比特币、以太坊、莱特币和避风港的超棒钱包",
|
||||
"fixed_pair_not_supported": "所选交易所不支持此固定货币对",
|
||||
"fixed_pair_not_supported": "所选的交换服务不支持这对固定对",
|
||||
"fixed_rate": "固定汇率",
|
||||
"fixed_rate_alert": "选中固定汇率模式后,您将可以输入接收金额。 您要切换到固定汇率模式吗?",
|
||||
"forgot_password": "忘记密码",
|
||||
|
@ -439,7 +440,7 @@
|
|||
"node_test": "测试",
|
||||
"nodes": "节点",
|
||||
"nodes_list_reset_to_default_message": "您确定要将设置重设为默认值吗?",
|
||||
"none_of_selected_providers_can_exchange": "选定的供应商都不能进行此交换",
|
||||
"none_of_selected_providers_can_exchange": "选定的提供商都无法进行此交换",
|
||||
"noNFTYet": "还没有 NFT",
|
||||
"normal": "普通的",
|
||||
"note_optional": "注释(可选)",
|
||||
|
|
|
@ -15,15 +15,15 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
|
|||
APP_ANDROID_TYPE=$1
|
||||
|
||||
MONERO_COM_NAME="Monero.com"
|
||||
MONERO_COM_VERSION="1.16.5"
|
||||
MONERO_COM_BUILD_NUMBER=100
|
||||
MONERO_COM_VERSION="1.17.0"
|
||||
MONERO_COM_BUILD_NUMBER=102
|
||||
MONERO_COM_BUNDLE_ID="com.monero.app"
|
||||
MONERO_COM_PACKAGE="com.monero.app"
|
||||
MONERO_COM_SCHEME="monero.com"
|
||||
|
||||
CAKEWALLET_NAME="Cake Wallet"
|
||||
CAKEWALLET_VERSION="4.19.5"
|
||||
CAKEWALLET_BUILD_NUMBER=227
|
||||
CAKEWALLET_VERSION="4.20.0"
|
||||
CAKEWALLET_BUILD_NUMBER=230
|
||||
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
|
||||
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
|
||||
CAKEWALLET_SCHEME="cakewallet"
|
||||
|
|
|
@ -13,7 +13,7 @@ fi
|
|||
# build mwebd:
|
||||
git clone https://github.com/ltcmweb/mwebd
|
||||
cd mwebd
|
||||
git reset --hard f6ea8a9e3d348b01bb44f03a1cc4ad65b0abe935
|
||||
git reset --hard 555349415f76a42ec5c76152b64c4ab9aabc448f
|
||||
gomobile bind -target=android -androidapi 21 .
|
||||
mkdir -p ../../../cw_mweb/android/libs/
|
||||
mv ./mwebd.aar $_
|
||||
|
|
|
@ -22,7 +22,7 @@ cp -rf ./ios/Runner/InfoBase.plist ./ios/Runner/Info.plist
|
|||
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLName string ${APP_IOS_TYPE}" ./ios/Runner/Info.plist
|
||||
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLSchemes array" ./ios/Runner/Info.plist
|
||||
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLSchemes: string ${APP_IOS_TYPE}" ./ios/Runner/Info.plist
|
||||
sed -i '' "s/\${PRODUCT_BUNDLE_IDENTIFIER}/${APP_IOS_BUNDLE_ID}/g" ./ios/Runner.xcodeproj/project.pbxproj
|
||||
sed -i '' "s/PRODUCT_BUNDLE_IDENTIFIER = .*;/PRODUCT_BUNDLE_IDENTIFIER = $APP_IOS_BUNDLE_ID;/g" ./ios/Runner.xcodeproj/project.pbxproj
|
||||
|
||||
CONFIG_ARGS=""
|
||||
|
||||
|
|
|
@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
|
|||
APP_IOS_TYPE=$1
|
||||
|
||||
MONERO_COM_NAME="Monero.com"
|
||||
MONERO_COM_VERSION="1.16.5"
|
||||
MONERO_COM_BUILD_NUMBER=98
|
||||
MONERO_COM_VERSION="1.17.0"
|
||||
MONERO_COM_BUILD_NUMBER=100
|
||||
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
||||
|
||||
CAKEWALLET_NAME="Cake Wallet"
|
||||
CAKEWALLET_VERSION="4.19.5"
|
||||
CAKEWALLET_BUILD_NUMBER=266
|
||||
CAKEWALLET_VERSION="4.20.0"
|
||||
CAKEWALLET_BUILD_NUMBER=269
|
||||
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
||||
|
||||
HAVEN_NAME="Haven"
|
||||
|
|
|
@ -12,7 +12,7 @@ fi
|
|||
# build mwebd:
|
||||
git clone https://github.com/ltcmweb/mwebd
|
||||
cd mwebd
|
||||
git reset --hard f6ea8a9e3d348b01bb44f03a1cc4ad65b0abe935
|
||||
git reset --hard 555349415f76a42ec5c76152b64c4ab9aabc448f
|
||||
gomobile bind -target=ios .
|
||||
mv -fn ./Mwebd.xcframework ../../../ios/
|
||||
# cleanup:
|
||||
|
|
|
@ -14,8 +14,8 @@ if [ -n "$1" ]; then
|
|||
fi
|
||||
|
||||
CAKEWALLET_NAME="Cake Wallet"
|
||||
CAKEWALLET_VERSION="1.9.5"
|
||||
CAKEWALLET_BUILD_NUMBER=33
|
||||
CAKEWALLET_VERSION="1.10.0"
|
||||
CAKEWALLET_BUILD_NUMBER=35
|
||||
|
||||
if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then
|
||||
echo "Wrong app type."
|
||||
|
|
|
@ -28,7 +28,7 @@ sed -i '' "s/\${BUNDLE_ID}/${APP_MACOS_BUNDLE_ID}/g" ./macos/Runner/DebugProfile
|
|||
sed -i '' "s/\${BUNDLE_ID}/${APP_MACOS_BUNDLE_ID}/g" ./macos/Runner/Release.entitlements
|
||||
sed -i '' "s/\${BUNDLE_ID}/${APP_MACOS_BUNDLE_ID}/g" ./macos/Runner/Runner.entitlements
|
||||
sed -i '' "s/\${PRODUCT_NAME}/${APP_MACOS_NAME}/g" ./macos/Runner/Configs/AppInfo.xcconfig
|
||||
sed -i '' "s/\${PRODUCT_BUNDLE_IDENTIFIER}/${APP_MACOS_BUNDLE_ID}/g" ./macos/Runner/Configs/AppInfo.xcconfig
|
||||
sed -i '' "s/PRODUCT_BUNDLE_IDENTIFIER = .*;/PRODUCT_BUNDLE_IDENTIFIER = $APP_MACOS_BUNDLE_ID;/g" ./macos/Runner/Configs/AppInfo.xcconfig
|
||||
CONFIG_ARGS=""
|
||||
|
||||
case $APP_MACOS_TYPE in
|
||||
|
|
|
@ -16,13 +16,13 @@ if [ -n "$1" ]; then
|
|||
fi
|
||||
|
||||
MONERO_COM_NAME="Monero.com"
|
||||
MONERO_COM_VERSION="1.6.5"
|
||||
MONERO_COM_BUILD_NUMBER=31
|
||||
MONERO_COM_VERSION="1.7.0"
|
||||
MONERO_COM_BUILD_NUMBER=33
|
||||
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
||||
|
||||
CAKEWALLET_NAME="Cake Wallet"
|
||||
CAKEWALLET_VERSION="1.12.5"
|
||||
CAKEWALLET_BUILD_NUMBER=88
|
||||
CAKEWALLET_VERSION="1.13.0"
|
||||
CAKEWALLET_BUILD_NUMBER=90
|
||||
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
||||
|
||||
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#define MyAppName "Cake Wallet"
|
||||
#define MyAppVersion "0.0.6"
|
||||
#define MyAppVersion "0.1.0"
|
||||
#define MyAppPublisher "Cake Labs LLC"
|
||||
#define MyAppURL "https://cakewallet.com/"
|
||||
#define MyAppExeName "CakeWallet.exe"
|
||||
|
|
|
@ -75,6 +75,7 @@ Future<void> main(List<String> args) async {
|
|||
Future<void> generateBitcoin(bool hasImplementation) async {
|
||||
final outputFile = File(bitcoinOutputPath);
|
||||
const bitcoinCommonHeaders = """
|
||||
import 'dart:io' show Platform;
|
||||
import 'dart:typed_data';
|
||||
import 'package:bitcoin_base/bitcoin_base.dart';
|
||||
import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart';
|
||||
|
@ -86,6 +87,7 @@ import 'package:cw_core/pending_transaction.dart';
|
|||
import 'package:cw_core/receive_page_option.dart';
|
||||
import 'package:cw_core/transaction_info.dart';
|
||||
import 'package:cw_core/transaction_priority.dart';
|
||||
import 'package:cw_core/unspent_coin_type.dart';
|
||||
import 'package:cw_core/unspent_coins_info.dart';
|
||||
import 'package:cw_core/unspent_transaction_output.dart';
|
||||
import 'package:cw_core/wallet_base.dart';
|
||||
|
@ -93,6 +95,7 @@ import 'package:cw_core/wallet_credentials.dart';
|
|||
import 'package:cw_core/wallet_info.dart';
|
||||
import 'package:cw_core/wallet_service.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:cw_core/get_height_by_date.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:ledger_flutter/ledger_flutter.dart';
|
||||
import 'package:blockchain_utils/blockchain_utils.dart';
|
||||
|
@ -107,7 +110,6 @@ import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
|
|||
import 'package:cw_bitcoin/bitcoin_receive_page_option.dart';
|
||||
import 'package:cw_bitcoin/bitcoin_wallet.dart';
|
||||
import 'package:cw_bitcoin/electrum_wallet.dart';
|
||||
import 'package:cw_bitcoin/electrum_wallet_addresses.dart';
|
||||
import 'package:cw_bitcoin/bitcoin_unspent.dart';
|
||||
import 'package:cw_bitcoin/bitcoin_mnemonic.dart';
|
||||
import 'package:cw_bitcoin/bitcoin_transaction_priority.dart';
|
||||
|
@ -118,8 +120,6 @@ import 'package:cw_bitcoin/bitcoin_address_record.dart';
|
|||
import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart';
|
||||
import 'package:cw_bitcoin/litecoin_wallet_service.dart';
|
||||
import 'package:cw_bitcoin/litecoin_wallet.dart';
|
||||
import 'package:cw_core/get_height_by_date.dart';
|
||||
import 'package:cw_core/transaction_info.dart';
|
||||
import 'package:cw_bitcoin/bitcoin_hardware_wallet_service.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
""";
|
||||
|
@ -165,8 +165,7 @@ abstract class Bitcoin {
|
|||
int getFeeRate(Object wallet, TransactionPriority priority);
|
||||
Future<void> generateNewAddress(Object wallet, String label);
|
||||
Future<void> updateAddress(Object wallet,String address, String label);
|
||||
Object createBitcoinTransactionCredentials(List<Output> outputs, {required TransactionPriority priority, int? feeRate});
|
||||
Object createBitcoinTransactionCredentialsRaw(List<OutputInfo> outputs, {TransactionPriority? priority, required int feeRate});
|
||||
Object createBitcoinTransactionCredentials(List<Output> outputs, {required TransactionPriority priority, int? feeRate, UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any});
|
||||
|
||||
String getAddress(Object wallet);
|
||||
List<ElectrumSubAddress> getSilentPaymentAddresses(Object wallet);
|
||||
|
@ -180,7 +179,7 @@ abstract class Bitcoin {
|
|||
int formatterStringDoubleToBitcoinAmount(String amount);
|
||||
String bitcoinTransactionPriorityWithLabel(TransactionPriority priority, int rate, {int? customRate});
|
||||
|
||||
List<Unspent> getUnspents(Object wallet);
|
||||
List<Unspent> getUnspents(Object wallet, {UnspentCoinType coinTypeToSpendFrom = UnspentCoinType.any});
|
||||
Future<void> updateUnspents(Object wallet);
|
||||
WalletService createBitcoinWalletService(
|
||||
Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource, bool alwaysScan, bool isDirect);
|
||||
|
|
Loading…
Reference in a new issue