mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-23 03:59:23 +00:00
feat: scanning and adding addresses working with getTweaks, add btc SP address type
This commit is contained in:
parent
2cbf1dca88
commit
3c88146652
42 changed files with 491 additions and 482 deletions
|
@ -4,8 +4,8 @@ import 'package:bitbox/bitbox.dart' as bitbox;
|
||||||
import 'package:bitcoin_base/bitcoin_base.dart';
|
import 'package:bitcoin_base/bitcoin_base.dart';
|
||||||
import 'package:cw_bitcoin/script_hash.dart' as sh;
|
import 'package:cw_bitcoin/script_hash.dart' as sh;
|
||||||
|
|
||||||
class BitcoinAddressRecord {
|
abstract class BaseBitcoinAddressRecord {
|
||||||
BitcoinAddressRecord(
|
BaseBitcoinAddressRecord(
|
||||||
this.address, {
|
this.address, {
|
||||||
required this.index,
|
required this.index,
|
||||||
this.isHidden = false,
|
this.isHidden = false,
|
||||||
|
@ -14,14 +14,61 @@ class BitcoinAddressRecord {
|
||||||
String name = '',
|
String name = '',
|
||||||
bool isUsed = false,
|
bool isUsed = false,
|
||||||
required this.type,
|
required this.type,
|
||||||
String? scriptHash,
|
|
||||||
required this.network,
|
required this.network,
|
||||||
this.silentPaymentTweak,
|
|
||||||
}) : _txCount = txCount,
|
}) : _txCount = txCount,
|
||||||
_balance = balance,
|
_balance = balance,
|
||||||
_name = name,
|
_name = name,
|
||||||
_isUsed = isUsed,
|
_isUsed = isUsed;
|
||||||
scriptHash =
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object o) => o is BaseBitcoinAddressRecord && address == o.address;
|
||||||
|
|
||||||
|
final String address;
|
||||||
|
bool isHidden;
|
||||||
|
final int index;
|
||||||
|
int _txCount;
|
||||||
|
int _balance;
|
||||||
|
String _name;
|
||||||
|
bool _isUsed;
|
||||||
|
BasedUtxoNetwork? network;
|
||||||
|
|
||||||
|
int get txCount => _txCount;
|
||||||
|
|
||||||
|
String get name => _name;
|
||||||
|
|
||||||
|
int get balance => _balance;
|
||||||
|
|
||||||
|
set txCount(int value) => _txCount = value;
|
||||||
|
|
||||||
|
set balance(int value) => _balance = value;
|
||||||
|
|
||||||
|
bool get isUsed => _isUsed;
|
||||||
|
|
||||||
|
void setAsUsed() => _isUsed = true;
|
||||||
|
void setNewName(String label) => _name = label;
|
||||||
|
|
||||||
|
int get hashCode => address.hashCode;
|
||||||
|
|
||||||
|
String get cashAddr => bitbox.Address.toCashAddress(address);
|
||||||
|
|
||||||
|
BitcoinAddressType type;
|
||||||
|
|
||||||
|
String toJSON();
|
||||||
|
}
|
||||||
|
|
||||||
|
class BitcoinAddressRecord extends BaseBitcoinAddressRecord {
|
||||||
|
BitcoinAddressRecord(
|
||||||
|
super.address, {
|
||||||
|
required super.index,
|
||||||
|
super.isHidden = false,
|
||||||
|
super.txCount = 0,
|
||||||
|
super.balance = 0,
|
||||||
|
super.name = '',
|
||||||
|
super.isUsed = false,
|
||||||
|
required super.type,
|
||||||
|
String? scriptHash,
|
||||||
|
required super.network,
|
||||||
|
}) : scriptHash =
|
||||||
scriptHash ?? (network != null ? sh.scriptHash(address, network: network) : null);
|
scriptHash ?? (network != null ? sh.scriptHash(address, network: network) : null);
|
||||||
|
|
||||||
factory BitcoinAddressRecord.fromJSON(String jsonSource, {BasedUtxoNetwork? network}) {
|
factory BitcoinAddressRecord.fromJSON(String jsonSource, {BasedUtxoNetwork? network}) {
|
||||||
|
@ -43,51 +90,17 @@ class BitcoinAddressRecord {
|
||||||
network: (decoded['network'] as String?) == null
|
network: (decoded['network'] as String?) == null
|
||||||
? network
|
? network
|
||||||
: BasedUtxoNetwork.fromName(decoded['network'] as String),
|
: BasedUtxoNetwork.fromName(decoded['network'] as String),
|
||||||
silentPaymentTweak: decoded['silentPaymentTweak'] as String?,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object o) => o is BitcoinAddressRecord && address == o.address;
|
|
||||||
|
|
||||||
final String address;
|
|
||||||
bool isHidden;
|
|
||||||
final int index;
|
|
||||||
int _txCount;
|
|
||||||
int _balance;
|
|
||||||
String _name;
|
|
||||||
bool _isUsed;
|
|
||||||
String? scriptHash;
|
String? scriptHash;
|
||||||
BasedUtxoNetwork? network;
|
|
||||||
final String? silentPaymentTweak;
|
|
||||||
|
|
||||||
int get txCount => _txCount;
|
|
||||||
|
|
||||||
String get name => _name;
|
|
||||||
|
|
||||||
int get balance => _balance;
|
|
||||||
|
|
||||||
set txCount(int value) => _txCount = value;
|
|
||||||
|
|
||||||
set balance(int value) => _balance = value;
|
|
||||||
|
|
||||||
bool get isUsed => _isUsed;
|
|
||||||
|
|
||||||
void setAsUsed() => _isUsed = true;
|
|
||||||
void setNewName(String label) => _name = label;
|
|
||||||
|
|
||||||
@override
|
|
||||||
int get hashCode => address.hashCode;
|
|
||||||
|
|
||||||
String get cashAddr => bitbox.Address.toCashAddress(address);
|
|
||||||
|
|
||||||
BitcoinAddressType type;
|
|
||||||
|
|
||||||
String updateScriptHash(BasedUtxoNetwork network) {
|
String updateScriptHash(BasedUtxoNetwork network) {
|
||||||
scriptHash = sh.scriptHash(address, network: network);
|
scriptHash = sh.scriptHash(address, network: network);
|
||||||
return scriptHash!;
|
return scriptHash!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
String toJSON() => json.encode({
|
String toJSON() => json.encode({
|
||||||
'address': address,
|
'address': address,
|
||||||
'index': index,
|
'index': index,
|
||||||
|
@ -99,6 +112,59 @@ class BitcoinAddressRecord {
|
||||||
'type': type.toString(),
|
'type': type.toString(),
|
||||||
'scriptHash': scriptHash,
|
'scriptHash': scriptHash,
|
||||||
'network': network?.value,
|
'network': network?.value,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
class BitcoinSilentPaymentAddressRecord extends BaseBitcoinAddressRecord {
|
||||||
|
BitcoinSilentPaymentAddressRecord(
|
||||||
|
super.address, {
|
||||||
|
required super.index,
|
||||||
|
super.isHidden = false,
|
||||||
|
super.txCount = 0,
|
||||||
|
super.balance = 0,
|
||||||
|
super.name = '',
|
||||||
|
super.isUsed = false,
|
||||||
|
required super.type,
|
||||||
|
required this.silentPaymentTweak,
|
||||||
|
required super.network,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory BitcoinSilentPaymentAddressRecord.fromJSON(String jsonSource,
|
||||||
|
{BasedUtxoNetwork? network}) {
|
||||||
|
final decoded = json.decode(jsonSource) as Map;
|
||||||
|
|
||||||
|
return BitcoinSilentPaymentAddressRecord(
|
||||||
|
decoded['address'] as String,
|
||||||
|
index: decoded['index'] as int,
|
||||||
|
isHidden: decoded['isHidden'] as bool? ?? false,
|
||||||
|
isUsed: decoded['isUsed'] as bool? ?? false,
|
||||||
|
txCount: decoded['txCount'] as int? ?? 0,
|
||||||
|
name: decoded['name'] as String? ?? '',
|
||||||
|
balance: decoded['balance'] as int? ?? 0,
|
||||||
|
type: decoded['type'] != null && decoded['type'] != ''
|
||||||
|
? BitcoinAddressType.values
|
||||||
|
.firstWhere((type) => type.toString() == decoded['type'] as String)
|
||||||
|
: SegwitAddresType.p2wpkh,
|
||||||
|
network: (decoded['network'] as String?) == null
|
||||||
|
? network
|
||||||
|
: BasedUtxoNetwork.fromName(decoded['network'] as String),
|
||||||
|
silentPaymentTweak: decoded['silentPaymentTweak'] as String,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final String silentPaymentTweak;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toJSON() => json.encode({
|
||||||
|
'address': address,
|
||||||
|
'index': index,
|
||||||
|
'isHidden': isHidden,
|
||||||
|
'isUsed': isUsed,
|
||||||
|
'txCount': txCount,
|
||||||
|
'name': name,
|
||||||
|
'balance': balance,
|
||||||
|
'type': type.toString(),
|
||||||
|
'network': network?.value,
|
||||||
'silentPaymentTweak': silentPaymentTweak,
|
'silentPaymentTweak': silentPaymentTweak,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,12 +19,12 @@ class BitcoinReceivePageOption implements ReceivePageOption {
|
||||||
}
|
}
|
||||||
|
|
||||||
static const all = [
|
static const all = [
|
||||||
|
BitcoinReceivePageOption.silent_payments,
|
||||||
BitcoinReceivePageOption.p2wpkh,
|
BitcoinReceivePageOption.p2wpkh,
|
||||||
BitcoinReceivePageOption.p2sh,
|
BitcoinReceivePageOption.p2sh,
|
||||||
BitcoinReceivePageOption.p2tr,
|
BitcoinReceivePageOption.p2tr,
|
||||||
BitcoinReceivePageOption.p2wsh,
|
BitcoinReceivePageOption.p2wsh,
|
||||||
BitcoinReceivePageOption.p2pkh,
|
BitcoinReceivePageOption.p2pkh,
|
||||||
BitcoinReceivePageOption.silent_payments,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
BitcoinAddressType toType() {
|
BitcoinAddressType toType() {
|
||||||
|
|
|
@ -3,12 +3,12 @@ import 'package:cw_bitcoin/bitcoin_address_record.dart';
|
||||||
import 'package:cw_core/unspent_transaction_output.dart';
|
import 'package:cw_core/unspent_transaction_output.dart';
|
||||||
|
|
||||||
class BitcoinUnspent extends Unspent {
|
class BitcoinUnspent extends Unspent {
|
||||||
BitcoinUnspent(BitcoinAddressRecord addressRecord, String hash, int value, int vout,
|
BitcoinUnspent(BaseBitcoinAddressRecord addressRecord, String hash, int value, int vout,
|
||||||
{this.silentPaymentTweak, this.type})
|
{this.silentPaymentTweak, this.type})
|
||||||
: bitcoinAddressRecord = addressRecord,
|
: bitcoinAddressRecord = addressRecord,
|
||||||
super(addressRecord.address, hash, value, vout, null);
|
super(addressRecord.address, hash, value, vout, null);
|
||||||
|
|
||||||
factory BitcoinUnspent.fromJSON(BitcoinAddressRecord address, Map<String, dynamic> json) =>
|
factory BitcoinUnspent.fromJSON(BaseBitcoinAddressRecord address, Map<String, dynamic> json) =>
|
||||||
BitcoinUnspent(
|
BitcoinUnspent(
|
||||||
address,
|
address,
|
||||||
json['tx_hash'] as String,
|
json['tx_hash'] as String,
|
||||||
|
@ -32,7 +32,7 @@ class BitcoinUnspent extends Unspent {
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
final BitcoinAddressRecord bitcoinAddressRecord;
|
final BaseBitcoinAddressRecord bitcoinAddressRecord;
|
||||||
String? silentPaymentTweak;
|
String? silentPaymentTweak;
|
||||||
BitcoinAddressType? type;
|
BitcoinAddressType? type;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
|
||||||
ElectrumBalance? initialBalance,
|
ElectrumBalance? initialBalance,
|
||||||
Map<String, int>? initialRegularAddressIndex,
|
Map<String, int>? initialRegularAddressIndex,
|
||||||
Map<String, int>? initialChangeAddressIndex,
|
Map<String, int>? initialChangeAddressIndex,
|
||||||
List<BitcoinAddressRecord>? initialSilentAddresses,
|
List<BitcoinSilentPaymentAddressRecord>? initialSilentAddresses,
|
||||||
int initialSilentAddressIndex = 0,
|
int initialSilentAddressIndex = 0,
|
||||||
SilentPaymentOwner? silentAddress,
|
SilentPaymentOwner? silentAddress,
|
||||||
}) : super(
|
}) : super(
|
||||||
|
@ -59,9 +59,19 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
|
||||||
sideHd: bitcoin.HDWallet.fromSeed(seedBytes, network: networkType).derivePath("m/0'/1"),
|
sideHd: bitcoin.HDWallet.fromSeed(seedBytes, network: networkType).derivePath("m/0'/1"),
|
||||||
network: networkParam ?? network,
|
network: networkParam ?? network,
|
||||||
);
|
);
|
||||||
|
hasSilentPaymentsScanning = addressPageType == SilentPaymentsAddresType.p2sp.toString();
|
||||||
|
|
||||||
autorun((_) {
|
autorun((_) {
|
||||||
this.walletAddresses.isEnabledAutoGenerateSubaddress = this.isEnabledAutoGenerateSubaddress;
|
this.walletAddresses.isEnabledAutoGenerateSubaddress = this.isEnabledAutoGenerateSubaddress;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
reaction((_) => walletAddresses.addressPageType, (BitcoinAddressType addressPageType) {
|
||||||
|
final prev = hasSilentPaymentsScanning;
|
||||||
|
hasSilentPaymentsScanning = addressPageType == SilentPaymentsAddresType.p2sp;
|
||||||
|
if (prev != hasSilentPaymentsScanning) {
|
||||||
|
startSync();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<BitcoinWallet> create({
|
static Future<BitcoinWallet> create({
|
||||||
|
@ -72,7 +82,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
|
||||||
String? addressPageType,
|
String? addressPageType,
|
||||||
BasedUtxoNetwork? network,
|
BasedUtxoNetwork? network,
|
||||||
List<BitcoinAddressRecord>? initialAddresses,
|
List<BitcoinAddressRecord>? initialAddresses,
|
||||||
List<BitcoinAddressRecord>? initialSilentAddresses,
|
List<BitcoinSilentPaymentAddressRecord>? initialSilentAddresses,
|
||||||
ElectrumBalance? initialBalance,
|
ElectrumBalance? initialBalance,
|
||||||
Map<String, int>? initialRegularAddressIndex,
|
Map<String, int>? initialRegularAddressIndex,
|
||||||
Map<String, int>? initialChangeAddressIndex,
|
Map<String, int>? initialChangeAddressIndex,
|
||||||
|
@ -88,11 +98,11 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
|
||||||
initialSilentAddresses: initialSilentAddresses,
|
initialSilentAddresses: initialSilentAddresses,
|
||||||
initialSilentAddressIndex: initialSilentAddressIndex,
|
initialSilentAddressIndex: initialSilentAddressIndex,
|
||||||
silentAddress: await SilentPaymentOwner.fromPrivateKeys(
|
silentAddress: await SilentPaymentOwner.fromPrivateKeys(
|
||||||
scanPrivkey: ECPrivate.fromHex(bitcoin.HDWallet.fromSeed(
|
b_scan: ECPrivate.fromHex(bitcoin.HDWallet.fromSeed(
|
||||||
seedBytes,
|
seedBytes,
|
||||||
network: network == BitcoinNetwork.testnet ? bitcoin.testnet : bitcoin.bitcoin,
|
network: network == BitcoinNetwork.testnet ? bitcoin.testnet : bitcoin.bitcoin,
|
||||||
).derivePath(SCAN_PATH).privKey!),
|
).derivePath(SCAN_PATH).privKey!),
|
||||||
spendPrivkey: ECPrivate.fromHex(bitcoin.HDWallet.fromSeed(
|
b_spend: ECPrivate.fromHex(bitcoin.HDWallet.fromSeed(
|
||||||
seedBytes,
|
seedBytes,
|
||||||
network: network == BitcoinNetwork.testnet ? bitcoin.testnet : bitcoin.bitcoin,
|
network: network == BitcoinNetwork.testnet ? bitcoin.testnet : bitcoin.bitcoin,
|
||||||
).derivePath(SPEND_PATH).privKey!),
|
).derivePath(SPEND_PATH).privKey!),
|
||||||
|
@ -125,11 +135,11 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
|
||||||
initialSilentAddresses: snp.silentAddresses,
|
initialSilentAddresses: snp.silentAddresses,
|
||||||
initialSilentAddressIndex: snp.silentAddressIndex,
|
initialSilentAddressIndex: snp.silentAddressIndex,
|
||||||
silentAddress: await SilentPaymentOwner.fromPrivateKeys(
|
silentAddress: await SilentPaymentOwner.fromPrivateKeys(
|
||||||
scanPrivkey: ECPrivate.fromHex(bitcoin.HDWallet.fromSeed(
|
b_scan: ECPrivate.fromHex(bitcoin.HDWallet.fromSeed(
|
||||||
seedBytes,
|
seedBytes,
|
||||||
network: snp.network == BitcoinNetwork.testnet ? bitcoin.testnet : bitcoin.bitcoin,
|
network: snp.network == BitcoinNetwork.testnet ? bitcoin.testnet : bitcoin.bitcoin,
|
||||||
).derivePath(SCAN_PATH).privKey!),
|
).derivePath(SCAN_PATH).privKey!),
|
||||||
spendPrivkey: ECPrivate.fromHex(bitcoin.HDWallet.fromSeed(
|
b_spend: ECPrivate.fromHex(bitcoin.HDWallet.fromSeed(
|
||||||
seedBytes,
|
seedBytes,
|
||||||
network: snp.network == BitcoinNetwork.testnet ? bitcoin.testnet : bitcoin.bitcoin,
|
network: snp.network == BitcoinNetwork.testnet ? bitcoin.testnet : bitcoin.bitcoin,
|
||||||
).derivePath(SPEND_PATH).privKey!),
|
).derivePath(SPEND_PATH).privKey!),
|
||||||
|
|
|
@ -279,8 +279,8 @@ class ElectrumClient {
|
||||||
Future<Map<String, dynamic>> getHeader({required int height}) async =>
|
Future<Map<String, dynamic>> getHeader({required int height}) async =>
|
||||||
await call(method: 'blockchain.block.get_header', params: [height]) as Map<String, dynamic>;
|
await call(method: 'blockchain.block.get_header', params: [height]) as Map<String, dynamic>;
|
||||||
|
|
||||||
Future<Map<String, dynamic>> getTweaks({required int height}) async =>
|
Future<List<dynamic>> getTweaks({required int height}) async =>
|
||||||
await call(method: 'blockchain.block.tweaks', params: [height]) as Map<String, dynamic>;
|
await callWithTimeout(method: 'blockchain.block.tweaks', params: [height]) as List<dynamic>;
|
||||||
|
|
||||||
Future<double> estimatefee({required int p}) =>
|
Future<double> estimatefee({required int p}) =>
|
||||||
call(method: 'blockchain.estimatefee', params: [p]).then((dynamic result) {
|
call(method: 'blockchain.estimatefee', params: [p]).then((dynamic result) {
|
||||||
|
|
|
@ -35,6 +35,7 @@ import 'package:cw_core/unspent_coins_info.dart';
|
||||||
import 'package:cw_core/utils/file.dart';
|
import 'package:cw_core/utils/file.dart';
|
||||||
import 'package:cw_core/wallet_base.dart';
|
import 'package:cw_core/wallet_base.dart';
|
||||||
import 'package:cw_core/wallet_info.dart';
|
import 'package:cw_core/wallet_info.dart';
|
||||||
|
import 'package:cw_core/wallet_type.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:hex/hex.dart';
|
import 'package:hex/hex.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
|
@ -116,7 +117,7 @@ abstract class ElectrumWalletBase
|
||||||
@observable
|
@observable
|
||||||
SyncStatus syncStatus;
|
SyncStatus syncStatus;
|
||||||
|
|
||||||
List<String> get scriptHashes => walletAddresses.addressesByReceiveType
|
List<String> get scriptHashes => walletAddresses.allAddresses
|
||||||
.map((addr) => scriptHash(addr.address, network: network))
|
.map((addr) => scriptHash(addr.address, network: network))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
@ -136,6 +137,11 @@ abstract class ElectrumWalletBase
|
||||||
@override
|
@override
|
||||||
bool? isTestnet;
|
bool? isTestnet;
|
||||||
|
|
||||||
|
@observable
|
||||||
|
bool hasSilentPaymentsScanning = false;
|
||||||
|
@observable
|
||||||
|
bool nodeSupportsSilentPayments = true;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
BitcoinWalletKeys get keys =>
|
BitcoinWalletKeys get keys =>
|
||||||
BitcoinWalletKeys(wif: hd.wif!, privateKey: hd.privKey!, publicKey: hd.pubKey!);
|
BitcoinWalletKeys(wif: hd.wif!, privateKey: hd.privKey!, publicKey: hd.pubKey!);
|
||||||
|
@ -186,6 +192,11 @@ abstract class ElectrumWalletBase
|
||||||
));
|
));
|
||||||
|
|
||||||
await for (var message in receivePort) {
|
await for (var message in receivePort) {
|
||||||
|
if (message is bool) {
|
||||||
|
nodeSupportsSilentPayments = message;
|
||||||
|
syncStatus = UnsupportedSyncStatus();
|
||||||
|
}
|
||||||
|
|
||||||
if (message is BitcoinUnspent) {
|
if (message is BitcoinUnspent) {
|
||||||
if (!unspentCoins.any((utx) =>
|
if (!unspentCoins.any((utx) =>
|
||||||
utx.hash.contains(message.hash) &&
|
utx.hash.contains(message.hash) &&
|
||||||
|
@ -225,11 +236,18 @@ abstract class ElectrumWalletBase
|
||||||
@override
|
@override
|
||||||
Future<void> startSync() async {
|
Future<void> startSync() async {
|
||||||
try {
|
try {
|
||||||
await _setInitialHeight();
|
if (hasSilentPaymentsScanning) {
|
||||||
} catch (_) {}
|
try {
|
||||||
|
await _setInitialHeight();
|
||||||
|
} catch (_) {}
|
||||||
|
|
||||||
try {
|
final currentChainTip = await electrumClient.getCurrentBlockChainTip();
|
||||||
rescan(height: walletInfo.restoreHeight);
|
if ((currentChainTip ?? 0) > walletInfo.restoreHeight) {
|
||||||
|
_setListeners(walletInfo.restoreHeight, chainTip: currentChainTip);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
syncStatus = AttemptingSyncStatus();
|
||||||
|
}
|
||||||
|
|
||||||
await updateTransactions();
|
await updateTransactions();
|
||||||
_subscribeForUpdates();
|
_subscribeForUpdates();
|
||||||
|
@ -240,7 +258,9 @@ abstract class ElectrumWalletBase
|
||||||
Timer.periodic(
|
Timer.periodic(
|
||||||
const Duration(minutes: 1), (timer) async => _feeRates = await electrumClient.feeRates());
|
const Duration(minutes: 1), (timer) async => _feeRates = await electrumClient.feeRates());
|
||||||
|
|
||||||
|
// if (!hasSilentPaymentsScanning) {
|
||||||
syncStatus = SyncedSyncStatus();
|
syncStatus = SyncedSyncStatus();
|
||||||
|
// }
|
||||||
} catch (e, stacktrace) {
|
} catch (e, stacktrace) {
|
||||||
print(stacktrace);
|
print(stacktrace);
|
||||||
print(e.toString());
|
print(e.toString());
|
||||||
|
@ -260,12 +280,6 @@ abstract class ElectrumWalletBase
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
syncStatus = ConnectedSyncStatus();
|
syncStatus = ConnectedSyncStatus();
|
||||||
|
|
||||||
final currentChainTip = await electrumClient.getCurrentBlockChainTip();
|
|
||||||
|
|
||||||
if ((currentChainTip ?? 0) > walletInfo.restoreHeight) {
|
|
||||||
_setListeners(walletInfo.restoreHeight, chainTip: currentChainTip);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print(e.toString());
|
print(e.toString());
|
||||||
syncStatus = FailedSyncStatus();
|
syncStatus = FailedSyncStatus();
|
||||||
|
@ -278,13 +292,18 @@ abstract class ElectrumWalletBase
|
||||||
List<BitcoinBaseAddress> outputAddresses,
|
List<BitcoinBaseAddress> outputAddresses,
|
||||||
List<BitcoinOutput> outputs,
|
List<BitcoinOutput> outputs,
|
||||||
BitcoinTransactionCredentials transactionCredentials,
|
BitcoinTransactionCredentials transactionCredentials,
|
||||||
{int? inputsCount}) async {
|
{int? inputsCount,
|
||||||
|
bool? hasSilentPayment}) async {
|
||||||
final utxos = <UtxoWithAddress>[];
|
final utxos = <UtxoWithAddress>[];
|
||||||
List<ECPrivate> privateKeys = [];
|
List<ECPrivate> privateKeys = [];
|
||||||
|
|
||||||
var leftAmount = credentialsAmount;
|
var leftAmount = credentialsAmount;
|
||||||
var allInputsAmount = 0;
|
var allInputsAmount = 0;
|
||||||
|
|
||||||
|
List<Outpoint> vinOutpoints = [];
|
||||||
|
List<ECPrivateInfo> inputPrivKeyInfos = [];
|
||||||
|
List<ECPublic> inputPubKeys = [];
|
||||||
|
|
||||||
for (int i = 0; i < unspentCoins.length; i++) {
|
for (int i = 0; i < unspentCoins.length; i++) {
|
||||||
final utx = unspentCoins[i];
|
final utx = unspentCoins[i];
|
||||||
|
|
||||||
|
@ -292,124 +311,6 @@ abstract class ElectrumWalletBase
|
||||||
allInputsAmount += utx.value;
|
allInputsAmount += utx.value;
|
||||||
leftAmount = leftAmount - utx.value;
|
leftAmount = leftAmount - utx.value;
|
||||||
|
|
||||||
if (utx.bitcoinAddressRecord.silentPaymentTweak != null) {
|
|
||||||
// final d = ECPrivate.fromHex(walletAddresses.primarySilentAddress!.spendPrivkey.toHex())
|
|
||||||
// .tweakAdd(utx.bitcoinAddressRecord.silentPaymentTweak!)!;
|
|
||||||
|
|
||||||
// inputPrivKeys.add(bitcoin.PrivateKeyInfo(d, true));
|
|
||||||
// address = bitcoin.P2trAddress(address: utx.address, networkType: networkType);
|
|
||||||
// keyPairs.add(bitcoin.ECPair.fromPrivateKey(d.toCompressedHex().fromHex,
|
|
||||||
// compressed: true, network: networkType));
|
|
||||||
// scriptType = bitcoin.AddressType.p2tr;
|
|
||||||
// script = bitcoin.P2trAddress(pubkey: d.publicKey.toHex(), networkType: networkType)
|
|
||||||
// .scriptPubkey
|
|
||||||
// .toBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
final address = _addressTypeFromStr(utx.address, network);
|
|
||||||
final privkey = generateECPrivate(
|
|
||||||
hd: utx.bitcoinAddressRecord.isHidden ? walletAddresses.sideHd : walletAddresses.mainHd,
|
|
||||||
index: utx.bitcoinAddressRecord.index,
|
|
||||||
network: network);
|
|
||||||
|
|
||||||
privateKeys.add(privkey);
|
|
||||||
|
|
||||||
utxos.add(
|
|
||||||
UtxoWithAddress(
|
|
||||||
utxo: BitcoinUtxo(
|
|
||||||
txHash: utx.hash,
|
|
||||||
value: BigInt.from(utx.value),
|
|
||||||
vout: utx.vout,
|
|
||||||
scriptType: _getScriptType(address),
|
|
||||||
),
|
|
||||||
ownerDetails:
|
|
||||||
UtxoAddressDetails(publicKey: privkey.getPublic().toHex(), address: address),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
bool amountIsAcquired = !sendAll && leftAmount <= 0;
|
|
||||||
if ((inputsCount == null && amountIsAcquired) || inputsCount == i + 1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inputs.isEmpty) {
|
|
||||||
throw BitcoinTransactionNoInputsException();
|
|
||||||
}
|
|
||||||
|
|
||||||
final allAmountFee = transactionCredentials.feeRate != null
|
|
||||||
? feeAmountWithFeeRate(transactionCredentials.feeRate!, inputs.length, outputs.length)
|
|
||||||
: feeAmountForPriority(transactionCredentials.priority!, inputs.length, outputs.length);
|
|
||||||
|
|
||||||
final allAmount = allInputsAmount - allAmountFee;
|
|
||||||
|
|
||||||
var credentialsAmount = 0;
|
|
||||||
var amount = 0;
|
|
||||||
var fee = 0;
|
|
||||||
|
|
||||||
if (hasMultiDestination) {
|
|
||||||
if (outputs.any((item) => item.sendAll || item.formattedCryptoAmount! <= 0)) {
|
|
||||||
throw BitcoinTransactionWrongBalanceException(currency);
|
|
||||||
}
|
|
||||||
|
|
||||||
credentialsAmount = outputs.fold(0, (acc, value) => acc + value.formattedCryptoAmount!);
|
|
||||||
|
|
||||||
if (allAmount - credentialsAmount < minAmount) {
|
|
||||||
throw BitcoinTransactionWrongBalanceException(currency);
|
|
||||||
}
|
|
||||||
|
|
||||||
amount = credentialsAmount;
|
|
||||||
|
|
||||||
if (transactionCredentials.feeRate != null) {
|
|
||||||
fee = calculateEstimatedFeeWithFeeRate(transactionCredentials.feeRate!, amount,
|
|
||||||
outputsCount: outputs.length + 1);
|
|
||||||
} else {
|
|
||||||
fee = calculateEstimatedFee(transactionCredentials.priority, amount,
|
|
||||||
outputsCount: outputs.length + 1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
final output = outputs.first;
|
|
||||||
credentialsAmount = !output.sendAll ? output.formattedCryptoAmount! : 0;
|
|
||||||
|
|
||||||
if (credentialsAmount > allAmount) {
|
|
||||||
throw BitcoinTransactionWrongBalanceException(currency);
|
|
||||||
}
|
|
||||||
|
|
||||||
amount = output.sendAll || allAmount - credentialsAmount < minAmount
|
|
||||||
? allAmount
|
|
||||||
: credentialsAmount;
|
|
||||||
|
|
||||||
if (output.sendAll || amount == allAmount) {
|
|
||||||
fee = allAmountFee;
|
|
||||||
} else if (transactionCredentials.feeRate != null) {
|
|
||||||
fee = calculateEstimatedFeeWithFeeRate(transactionCredentials.feeRate!, amount);
|
|
||||||
} else {
|
|
||||||
fee = calculateEstimatedFee(transactionCredentials.priority, amount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fee == 0) {
|
|
||||||
throw BitcoinTransactionWrongBalanceException(currency);
|
|
||||||
}
|
|
||||||
|
|
||||||
final totalAmount = amount + fee;
|
|
||||||
|
|
||||||
if (totalAmount > balance[currency]!.confirmed || totalAmount > allInputsAmount) {
|
|
||||||
throw BitcoinTransactionWrongBalanceException(currency);
|
|
||||||
}
|
|
||||||
|
|
||||||
final txb = bitcoin.TransactionBuilder(network: networkType);
|
|
||||||
final changeAddress = await walletAddresses.getChangeAddress();
|
|
||||||
var leftAmount = totalAmount;
|
|
||||||
var totalInputAmount = 0;
|
|
||||||
|
|
||||||
inputs.clear();
|
|
||||||
|
|
||||||
for (final utx in unspentCoins) {
|
|
||||||
if (utx.isSending) {
|
|
||||||
leftAmount = leftAmount - utx.value;
|
|
||||||
|
|
||||||
final address = _addressTypeFromStr(utx.address, network);
|
final address = _addressTypeFromStr(utx.address, network);
|
||||||
final privkey = generateECPrivate(
|
final privkey = generateECPrivate(
|
||||||
hd: utx.bitcoinAddressRecord.isHidden ? walletAddresses.sideHd : walletAddresses.mainHd,
|
hd: utx.bitcoinAddressRecord.isHidden ? walletAddresses.sideHd : walletAddresses.mainHd,
|
||||||
|
@ -417,6 +318,9 @@ abstract class ElectrumWalletBase
|
||||||
network: network);
|
network: network);
|
||||||
|
|
||||||
privateKeys.add(privkey);
|
privateKeys.add(privkey);
|
||||||
|
inputPrivKeyInfos.add(ECPrivateInfo(privkey, address.type == SegwitAddresType.p2tr));
|
||||||
|
inputPubKeys.add(privkey.getPublic());
|
||||||
|
vinOutpoints.add(Outpoint(txid: utx.hash, index: utx.vout));
|
||||||
|
|
||||||
utxos.add(
|
utxos.add(
|
||||||
UtxoWithAddress(
|
UtxoWithAddress(
|
||||||
|
@ -453,6 +357,45 @@ abstract class ElectrumWalletBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasSilentPayment == true) {
|
||||||
|
List<SilentPaymentDestination> silentPaymentDestinations = [];
|
||||||
|
|
||||||
|
for (final out in outputs) {
|
||||||
|
final address = out.address;
|
||||||
|
final amount = out.value;
|
||||||
|
|
||||||
|
if (address is SilentPaymentAddress) {
|
||||||
|
final silentPaymentDestination =
|
||||||
|
SilentPaymentDestination.fromAddress(address.toAddress(network), amount.toInt());
|
||||||
|
silentPaymentDestinations.add(silentPaymentDestination);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final spb = SilentPaymentBuilder(pubkeys: inputPubKeys, outpoints: vinOutpoints);
|
||||||
|
final sendingOutputs = spb.createOutputs(inputPrivKeyInfos, silentPaymentDestinations);
|
||||||
|
|
||||||
|
var outputsAdded = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < outputs.length; i++) {
|
||||||
|
final out = outputs[i];
|
||||||
|
|
||||||
|
final silentOutputs = sendingOutputs[out.address.toAddress(network)];
|
||||||
|
if (silentOutputs != null) {
|
||||||
|
final silentOutput =
|
||||||
|
silentOutputs.firstWhereOrNull((element) => !outputsAdded.contains(element));
|
||||||
|
|
||||||
|
if (silentOutput != null) {
|
||||||
|
outputs[i] = BitcoinOutput(
|
||||||
|
address: silentOutput.address,
|
||||||
|
value: BigInt.from(silentOutput.amount),
|
||||||
|
);
|
||||||
|
|
||||||
|
outputsAdded.add(silentOutput);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final estimatedSize = BitcoinTransactionBuilder.estimateTransactionSize(
|
final estimatedSize = BitcoinTransactionBuilder.estimateTransactionSize(
|
||||||
utxos: utxos, outputs: outputs, network: network);
|
utxos: utxos, outputs: outputs, network: network);
|
||||||
|
|
||||||
|
@ -497,25 +440,31 @@ abstract class ElectrumWalletBase
|
||||||
|
|
||||||
return _estimateTxFeeAndInputsToUse(
|
return _estimateTxFeeAndInputsToUse(
|
||||||
credentialsAmount, sendAll, outputAddresses, outputs, transactionCredentials,
|
credentialsAmount, sendAll, outputAddresses, outputs, transactionCredentials,
|
||||||
inputsCount: utxos.length + 1);
|
inputsCount: utxos.length + 1, hasSilentPayment: hasSilentPayment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SilentPaymentAddress.regex.hasMatch(outputAddress)) {
|
return EstimatedTxResult(utxos: utxos, privateKeys: privateKeys, fee: fee, amount: amount);
|
||||||
// final outpointsHash = SilentPayment.hashOutpoints(outpoints);
|
}
|
||||||
// final generatedOutputs = SilentPayment.generateMultipleRecipientPubkeys(inputPrivKeys,
|
|
||||||
// outpointsHash, SilentPaymentDestination.fromAddress(outputAddress, outputAmount!));
|
|
||||||
|
|
||||||
// generatedOutputs.forEach((recipientSilentAddress, generatedOutput) {
|
@override
|
||||||
// generatedOutput.forEach((output) {
|
Future<PendingTransaction> createTransaction(Object credentials) async {
|
||||||
// outputs.add(BitcoinOutputDetails(
|
try {
|
||||||
// address: P2trAddress(
|
final outputs = <BitcoinOutput>[];
|
||||||
// program: ECPublic.fromHex(output.$1.toHex()).toTapPoint(),
|
final outputAddresses = <BitcoinBaseAddress>[];
|
||||||
// networkType: networkType),
|
final transactionCredentials = credentials as BitcoinTransactionCredentials;
|
||||||
// value: BigInt.from(output.$2),
|
final hasMultiDestination = transactionCredentials.outputs.length > 1;
|
||||||
// ));
|
final sendAll = !hasMultiDestination && transactionCredentials.outputs.first.sendAll;
|
||||||
// });
|
|
||||||
// });
|
var credentialsAmount = 0;
|
||||||
|
bool hasSilentPayment = false;
|
||||||
|
|
||||||
|
for (final out in transactionCredentials.outputs) {
|
||||||
|
final outputAddress = out.isParsedAddress ? out.extractedAddress! : out.address;
|
||||||
|
final address = _addressTypeFromStr(outputAddress, network);
|
||||||
|
|
||||||
|
if (address is SilentPaymentAddress) {
|
||||||
|
hasSilentPayment = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
outputAddresses.add(address);
|
outputAddresses.add(address);
|
||||||
|
@ -542,7 +491,8 @@ abstract class ElectrumWalletBase
|
||||||
}
|
}
|
||||||
|
|
||||||
final estimatedTx = await _estimateTxFeeAndInputsToUse(
|
final estimatedTx = await _estimateTxFeeAndInputsToUse(
|
||||||
credentialsAmount, sendAll, outputAddresses, outputs, transactionCredentials);
|
credentialsAmount, sendAll, outputAddresses, outputs, transactionCredentials,
|
||||||
|
hasSilentPayment: hasSilentPayment);
|
||||||
|
|
||||||
final txb = BitcoinTransactionBuilder(
|
final txb = BitcoinTransactionBuilder(
|
||||||
utxos: estimatedTx.utxos,
|
utxos: estimatedTx.utxos,
|
||||||
|
@ -749,7 +699,7 @@ abstract class ElectrumWalletBase
|
||||||
final coinInfoList = unspentCoinsInfo.values.where((element) =>
|
final coinInfoList = unspentCoinsInfo.values.where((element) =>
|
||||||
element.walletId.contains(id) &&
|
element.walletId.contains(id) &&
|
||||||
element.hash.contains(coin.hash) &&
|
element.hash.contains(coin.hash) &&
|
||||||
element.address.contains(coin.address));
|
element.vout == coin.vout);
|
||||||
|
|
||||||
if (coinInfoList.isNotEmpty) {
|
if (coinInfoList.isNotEmpty) {
|
||||||
final coinInfo = coinInfoList.first;
|
final coinInfo = coinInfoList.first;
|
||||||
|
@ -916,7 +866,7 @@ abstract class ElectrumWalletBase
|
||||||
final Map<String, ElectrumTransactionInfo> historiesWithDetails = {};
|
final Map<String, ElectrumTransactionInfo> historiesWithDetails = {};
|
||||||
|
|
||||||
final history = await electrumClient
|
final history = await electrumClient
|
||||||
.getHistory(addressRecord.scriptHash ?? addressRecord.updateScriptHash(network));
|
.getHistory(addressRecord.scriptHash ?? addressRecord.updateScriptHash(network)!);
|
||||||
|
|
||||||
if (history.isNotEmpty) {
|
if (history.isNotEmpty) {
|
||||||
addressRecord.setAsUsed();
|
addressRecord.setAsUsed();
|
||||||
|
@ -1037,7 +987,7 @@ abstract class ElectrumWalletBase
|
||||||
element.bitcoinAddressRecord.address == info.address &&
|
element.bitcoinAddressRecord.address == info.address &&
|
||||||
element.value == info.value) {
|
element.value == info.value) {
|
||||||
if (info.isFrozen) totalFrozen += element.value;
|
if (info.isFrozen) totalFrozen += element.value;
|
||||||
if (element.bitcoinAddressRecord.silentPaymentTweak != null) {
|
if (element.bitcoinAddressRecord is BitcoinSilentPaymentAddressRecord) {
|
||||||
totalConfirmed += element.value;
|
totalConfirmed += element.value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1208,18 +1158,29 @@ Future<void> startRefresh(ScanData scanData) async {
|
||||||
final electrumClient = scanData.electrumClient;
|
final electrumClient = scanData.electrumClient;
|
||||||
if (!electrumClient.isConnected) {
|
if (!electrumClient.isConnected) {
|
||||||
final node = scanData.node;
|
final node = scanData.node;
|
||||||
|
print(node);
|
||||||
await electrumClient.connectToUri(Uri.parse(node));
|
await electrumClient.connectToUri(Uri.parse(node));
|
||||||
}
|
}
|
||||||
final tweaks = await electrumClient.getTweaks(height: syncHeight);
|
|
||||||
|
List<dynamic>? tweaks;
|
||||||
|
try {
|
||||||
|
tweaks = await electrumClient.getTweaks(height: syncHeight);
|
||||||
|
} catch (e) {
|
||||||
|
if (e is RequestFailedTimeoutException) {
|
||||||
|
return scanData.sendPort.send(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tweaks == null) {
|
||||||
|
return scanData.sendPort.send(false);
|
||||||
|
}
|
||||||
|
|
||||||
for (var i = 0; i < tweaks.length; i++) {
|
for (var i = 0; i < tweaks.length; i++) {
|
||||||
try {
|
try {
|
||||||
// final txid = tweaks.keys.toList()[i];
|
// final txid = tweaks.keys.toList()[i];
|
||||||
final details = tweaks.values.toList()[i];
|
final details = tweaks[i] as Map<String, dynamic>;
|
||||||
print(["details", details]);
|
final output_pubkeys = (details["output_pubkeys"] as List<dynamic>);
|
||||||
final output_pubkeys = (details["output_pubkeys"] as List<String>);
|
final tweak = details["tweak"].toString();
|
||||||
|
|
||||||
// print(["Scanning tx:", txid]);
|
|
||||||
|
|
||||||
// TODO: if tx already scanned & stored skip
|
// TODO: if tx already scanned & stored skip
|
||||||
// if (scanData.transactionHistoryIds.contains(txid)) {
|
// if (scanData.transactionHistoryIds.contains(txid)) {
|
||||||
|
@ -1228,12 +1189,14 @@ Future<void> startRefresh(ScanData scanData) async {
|
||||||
// continue;
|
// continue;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
final result = SilentPayment.scanTweak(
|
final spb = SilentPaymentBuilder(receiverTweak: tweak);
|
||||||
|
final result = spb.scanOutputs(
|
||||||
scanData.primarySilentAddress.b_scan,
|
scanData.primarySilentAddress.b_scan,
|
||||||
scanData.primarySilentAddress.B_spend,
|
scanData.primarySilentAddress.B_spend,
|
||||||
details["tweak"] as String,
|
output_pubkeys
|
||||||
output_pubkeys.map((e) => BytesUtils.fromHexString(e)).toList(),
|
.map((p) => ECPublic.fromBytes(BytesUtils.fromHexString(p.toString()).sublist(2)))
|
||||||
labels: scanData.labels,
|
.toList(),
|
||||||
|
precomputedLabels: scanData.labels,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (result.isEmpty) {
|
if (result.isEmpty) {
|
||||||
|
@ -1241,113 +1204,102 @@ Future<void> startRefresh(ScanData scanData) async {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.length > 1) {
|
result.forEach((key, value) async {
|
||||||
print("MULTIPLE UNSPENT COINS FOUND!");
|
final t_k = value[0];
|
||||||
} else {
|
final address =
|
||||||
print("UNSPENT COIN FOUND!");
|
ECPublic.fromHex(key).toTaprootAddress(tweak: false).toAddress(scanData.network);
|
||||||
}
|
|
||||||
|
|
||||||
// result.forEach((key, value) async {
|
final listUnspent =
|
||||||
// final outpoint = output_pubkeys[key];
|
await electrumClient.getListUnspentWithAddress(address, scanData.network);
|
||||||
|
|
||||||
// if (outpoint == null) {
|
BitcoinUnspent? info;
|
||||||
// return;
|
await Future.forEach<Map<String, dynamic>>(listUnspent, (unspent) async {
|
||||||
// }
|
try {
|
||||||
|
final addressRecord = BitcoinSilentPaymentAddressRecord(
|
||||||
|
address,
|
||||||
|
index: 0,
|
||||||
|
isHidden: true,
|
||||||
|
isUsed: true,
|
||||||
|
network: scanData.network,
|
||||||
|
silentPaymentTweak: t_k,
|
||||||
|
type: SegwitAddresType.p2tr,
|
||||||
|
);
|
||||||
|
info = BitcoinUnspent.fromJSON(addressRecord, unspent);
|
||||||
|
} catch (_) {}
|
||||||
|
});
|
||||||
|
|
||||||
// final tweak = value[0];
|
// final tweak = value[0];
|
||||||
// String? label;
|
// String? label;
|
||||||
// if (value.length > 1) label = value[1];
|
// if (value.length > 1) label = value[1];
|
||||||
|
|
||||||
// final txInfo = ElectrumTransactionInfo(
|
final tx = info!;
|
||||||
// WalletType.bitcoin,
|
final txInfo = ElectrumTransactionInfo(
|
||||||
// id: txid,
|
WalletType.bitcoin,
|
||||||
// height: syncHeight,
|
id: tx.hash,
|
||||||
// amount: outpoint.value!,
|
height: syncHeight,
|
||||||
// fee: 0,
|
amount: tx.value,
|
||||||
// direction: TransactionDirection.incoming,
|
fee: 0,
|
||||||
// isPending: false,
|
direction: TransactionDirection.incoming,
|
||||||
// date: DateTime.fromMillisecondsSinceEpoch((blockJson["timestamp"] as int) * 1000),
|
isPending: false,
|
||||||
// confirmations: currentChainTip - syncHeight,
|
date: DateTime.now(),
|
||||||
// to: bitcoin.SilentPaymentAddress.createLabeledSilentPaymentAddress(
|
confirmations: currentChainTip - syncHeight,
|
||||||
// scanData.primarySilentAddress.scanPubkey,
|
to: scanData.primarySilentAddress.toString(),
|
||||||
// scanData.primarySilentAddress.spendPubkey,
|
unspent: tx,
|
||||||
// label != null ? label.fromHex : "0".fromHex,
|
);
|
||||||
// hrp: scanData.primarySilentAddress.hrp,
|
|
||||||
// version: scanData.primarySilentAddress.version)
|
|
||||||
// .toString(),
|
|
||||||
// unspent: null,
|
|
||||||
// );
|
|
||||||
|
|
||||||
// final status = json.decode((await http
|
// final status = json.decode((await http
|
||||||
// .get(Uri.parse("https://blockstream.info/testnet/api/tx/$txid/outspends")))
|
// .get(Uri.parse("https://blockstream.info/testnet/api/tx/$txid/outspends")))
|
||||||
// .body) as List<dynamic>;
|
// .body) as List<dynamic>;
|
||||||
|
|
||||||
// bool spent = false;
|
// bool spent = false;
|
||||||
// for (final s in status) {
|
// for (final s in status) {
|
||||||
// if ((s["spent"] as bool) == true) {
|
// if ((s["spent"] as bool) == true) {
|
||||||
// spent = true;
|
// spent = true;
|
||||||
|
|
||||||
// scanData.sendPort.send({txid: txInfo});
|
// scanData.sendPort.send({txid: txInfo});
|
||||||
|
|
||||||
// final sentTxId = s["txid"] as String;
|
// final sentTxId = s["txid"] as String;
|
||||||
// final sentTx = json.decode(
|
// final sentTx = json.decode(
|
||||||
// (await http.get(Uri.parse("https://blockstream.info/testnet/api/tx/$sentTxId")))
|
// (await http.get(Uri.parse("https://blockstream.info/testnet/api/tx/$sentTxId")))
|
||||||
// .body);
|
// .body);
|
||||||
|
|
||||||
// int amount = 0;
|
// int amount = 0;
|
||||||
// for (final out in (sentTx["vout"] as List<dynamic>)) {
|
// for (final out in (sentTx["vout"] as List<dynamic>)) {
|
||||||
// amount += out["value"] as int;
|
// amount += out["value"] as int;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// final height = s["status"]["block_height"] as int;
|
// final height = s["status"]["block_height"] as int;
|
||||||
|
|
||||||
// scanData.sendPort.send({
|
// scanData.sendPort.send({
|
||||||
// sentTxId: ElectrumTransactionInfo(
|
// sentTxId: ElectrumTransactionInfo(
|
||||||
// WalletType.bitcoin,
|
// WalletType.bitcoin,
|
||||||
// id: sentTxId,
|
// id: sentTxId,
|
||||||
// height: height,
|
// height: height,
|
||||||
// amount: amount,
|
// amount: amount,
|
||||||
// fee: 0,
|
// fee: 0,
|
||||||
// direction: TransactionDirection.outgoing,
|
// direction: TransactionDirection.outgoing,
|
||||||
// isPending: false,
|
// isPending: false,
|
||||||
// date: DateTime.fromMillisecondsSinceEpoch(
|
// date: DateTime.fromMillisecondsSinceEpoch(
|
||||||
// (s["status"]["block_time"] as int) * 1000),
|
// (s["status"]["block_time"] as int) * 1000),
|
||||||
// confirmations: currentChainTip - height,
|
// confirmations: currentChainTip - height,
|
||||||
// )
|
// )
|
||||||
// });
|
// });
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// if (spent) {
|
// if (spent) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// final unspent = BitcoinUnspent(
|
// found utxo for tx, send unspent coin to main isolate
|
||||||
// BitcoinAddressRecord(
|
// scanData.sendPort.send(txInfo);
|
||||||
// bitcoin.P2trAddress(program: key, networkType: scanData.network).address,
|
|
||||||
// index: 0,
|
|
||||||
// isHidden: true,
|
|
||||||
// isUsed: true,
|
|
||||||
// silentAddressLabel: null,
|
|
||||||
// silentPaymentTweak: tweak,
|
|
||||||
// type: bitcoin.AddressType.p2tr,
|
|
||||||
// ),
|
|
||||||
// txid,
|
|
||||||
// outpoint.value!,
|
|
||||||
// outpoint.index,
|
|
||||||
// silentPaymentTweak: tweak,
|
|
||||||
// type: bitcoin.AddressType.p2tr,
|
|
||||||
// );
|
|
||||||
|
|
||||||
// // found utxo for tx, send unspent coin to main isolate
|
// also send tx data for tx history
|
||||||
// scanData.sendPort.send(unspent);
|
scanData.sendPort.send({txInfo.id: txInfo});
|
||||||
|
});
|
||||||
// // also send tx data for tx history
|
|
||||||
// txInfo.unspent = unspent;
|
|
||||||
// scanData.sendPort.send({txid: txInfo});
|
|
||||||
// });
|
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
}
|
}
|
||||||
|
// break;
|
||||||
|
|
||||||
// Finished scanning block, add 1 to height and continue to next block in loop
|
// Finished scanning block, add 1 to height and continue to next block in loop
|
||||||
syncHeight += 1;
|
syncHeight += 1;
|
||||||
|
@ -1383,6 +1335,8 @@ BitcoinBaseAddress _addressTypeFromStr(String address, BasedUtxoNetwork network)
|
||||||
return P2wshAddress.fromAddress(address: address, network: network);
|
return P2wshAddress.fromAddress(address: address, network: network);
|
||||||
} else if (P2trAddress.regex.hasMatch(address)) {
|
} else if (P2trAddress.regex.hasMatch(address)) {
|
||||||
return P2trAddress.fromAddress(address: address, network: network);
|
return P2trAddress.fromAddress(address: address, network: network);
|
||||||
|
} else if (SilentPaymentAddress.regex.hasMatch(address)) {
|
||||||
|
return SilentPaymentAddress.fromAddress(address);
|
||||||
} else {
|
} else {
|
||||||
return P2wpkhAddress.fromAddress(address: address, network: network);
|
return P2wpkhAddress.fromAddress(address: address, network: network);
|
||||||
}
|
}
|
||||||
|
@ -1397,59 +1351,8 @@ BitcoinAddressType _getScriptType(BitcoinBaseAddress type) {
|
||||||
return SegwitAddresType.p2wsh;
|
return SegwitAddresType.p2wsh;
|
||||||
} else if (type is P2trAddress) {
|
} else if (type is P2trAddress) {
|
||||||
return SegwitAddresType.p2tr;
|
return SegwitAddresType.p2tr;
|
||||||
} else {
|
} else if (type is SilentPaymentsAddresType) {
|
||||||
return SegwitAddresType.p2wpkh;
|
return SilentPaymentsAddresType.p2sp;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class EstimateTxParams {
|
|
||||||
EstimateTxParams(
|
|
||||||
{required this.amount,
|
|
||||||
required this.feeRate,
|
|
||||||
required this.priority,
|
|
||||||
required this.outputsCount,
|
|
||||||
required this.size});
|
|
||||||
|
|
||||||
final int amount;
|
|
||||||
final int feeRate;
|
|
||||||
final TransactionPriority priority;
|
|
||||||
final int outputsCount;
|
|
||||||
final int size;
|
|
||||||
}
|
|
||||||
|
|
||||||
class EstimatedTxResult {
|
|
||||||
EstimatedTxResult(
|
|
||||||
{required this.utxos, required this.privateKeys, required this.fee, required this.amount});
|
|
||||||
|
|
||||||
final List<UtxoWithAddress> utxos;
|
|
||||||
final List<ECPrivate> privateKeys;
|
|
||||||
final int fee;
|
|
||||||
final int amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
BitcoinBaseAddress _addressTypeFromStr(String address, BasedUtxoNetwork network) {
|
|
||||||
if (P2pkhAddress.regex.hasMatch(address)) {
|
|
||||||
return P2pkhAddress.fromAddress(address: address, network: network);
|
|
||||||
} else if (P2shAddress.regex.hasMatch(address)) {
|
|
||||||
return P2shAddress.fromAddress(address: address, network: network);
|
|
||||||
} else if (P2wshAddress.regex.hasMatch(address)) {
|
|
||||||
return P2wshAddress.fromAddress(address: address, network: network);
|
|
||||||
} else if (P2trAddress.regex.hasMatch(address)) {
|
|
||||||
return P2trAddress.fromAddress(address: address, network: network);
|
|
||||||
} else {
|
|
||||||
return P2wpkhAddress.fromAddress(address: address, network: network);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BitcoinAddressType _getScriptType(BitcoinBaseAddress type) {
|
|
||||||
if (type is P2pkhAddress) {
|
|
||||||
return P2pkhAddressType.p2pkh;
|
|
||||||
} else if (type is P2shAddress) {
|
|
||||||
return P2shAddressType.p2wpkhInP2sh;
|
|
||||||
} else if (type is P2wshAddress) {
|
|
||||||
return SegwitAddresType.p2wsh;
|
|
||||||
} else if (type is P2trAddress) {
|
|
||||||
return SegwitAddresType.p2tr;
|
|
||||||
} else {
|
} else {
|
||||||
return SegwitAddresType.p2wpkh;
|
return SegwitAddresType.p2wpkh;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:bitcoin_base/bitcoin_base.dart';
|
import 'package:bitcoin_base/bitcoin_base.dart';
|
||||||
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
|
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitcoin;
|
||||||
import 'package:bitbox/bitbox.dart' as bitbox;
|
import 'package:bitbox/bitbox.dart' as bitbox;
|
||||||
|
import 'package:blockchain_utils/blockchain_utils.dart';
|
||||||
import 'package:cw_bitcoin/bitcoin_address_record.dart';
|
import 'package:cw_bitcoin/bitcoin_address_record.dart';
|
||||||
import 'package:cw_core/wallet_addresses.dart';
|
import 'package:cw_core/wallet_addresses.dart';
|
||||||
import 'package:cw_core/wallet_info.dart';
|
import 'package:cw_core/wallet_info.dart';
|
||||||
|
@ -28,7 +29,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
|
||||||
List<BitcoinAddressRecord>? initialAddresses,
|
List<BitcoinAddressRecord>? initialAddresses,
|
||||||
Map<String, int>? initialRegularAddressIndex,
|
Map<String, int>? initialRegularAddressIndex,
|
||||||
Map<String, int>? initialChangeAddressIndex,
|
Map<String, int>? initialChangeAddressIndex,
|
||||||
List<BitcoinAddressRecord>? initialSilentAddresses,
|
List<BitcoinSilentPaymentAddressRecord>? initialSilentAddresses,
|
||||||
int initialSilentAddressIndex = 0,
|
int initialSilentAddressIndex = 0,
|
||||||
SilentPaymentOwner? silentAddress,
|
SilentPaymentOwner? silentAddress,
|
||||||
}) : _addresses = ObservableList<BitcoinAddressRecord>.of((initialAddresses ?? []).toSet()),
|
}) : _addresses = ObservableList<BitcoinAddressRecord>.of((initialAddresses ?? []).toSet()),
|
||||||
|
@ -46,9 +47,8 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
|
||||||
_addressPageType = walletInfo.addressPageType != null
|
_addressPageType = walletInfo.addressPageType != null
|
||||||
? BitcoinAddressType.fromValue(walletInfo.addressPageType!)
|
? BitcoinAddressType.fromValue(walletInfo.addressPageType!)
|
||||||
: SegwitAddresType.p2wpkh,
|
: SegwitAddresType.p2wpkh,
|
||||||
silentAddresses = ObservableList<BitcoinAddressRecord>.of((initialSilentAddresses ?? [])
|
silentAddresses = ObservableList<BitcoinSilentPaymentAddressRecord>.of(
|
||||||
.where((addressRecord) => addressRecord.silentPaymentTweak != null)
|
(initialSilentAddresses ?? []).toSet()),
|
||||||
.toSet()),
|
|
||||||
currentSilentAddressIndex = initialSilentAddressIndex,
|
currentSilentAddressIndex = initialSilentAddressIndex,
|
||||||
super(walletInfo) {
|
super(walletInfo) {
|
||||||
updateAddressesByMatch();
|
updateAddressesByMatch();
|
||||||
|
@ -59,15 +59,13 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
|
||||||
static const gap = 20;
|
static const gap = 20;
|
||||||
|
|
||||||
static String toCashAddr(String address) => bitbox.Address.toCashAddress(address);
|
static String toCashAddr(String address) => bitbox.Address.toCashAddress(address);
|
||||||
|
|
||||||
static String toLegacy(String address) => bitbox.Address.toLegacyAddress(address);
|
static String toLegacy(String address) => bitbox.Address.toLegacyAddress(address);
|
||||||
|
|
||||||
final ObservableList<BitcoinAddressRecord> _addresses;
|
final ObservableList<BitcoinAddressRecord> _addresses;
|
||||||
// Matched by addressPageType
|
late ObservableList<BaseBitcoinAddressRecord> addressesByReceiveType;
|
||||||
late ObservableList<BitcoinAddressRecord> addressesByReceiveType;
|
|
||||||
final ObservableList<BitcoinAddressRecord> receiveAddresses;
|
final ObservableList<BitcoinAddressRecord> receiveAddresses;
|
||||||
final ObservableList<BitcoinAddressRecord> changeAddresses;
|
final ObservableList<BitcoinAddressRecord> changeAddresses;
|
||||||
final ObservableList<BitcoinAddressRecord> silentAddresses;
|
final ObservableList<BitcoinSilentPaymentAddressRecord> silentAddresses;
|
||||||
final BasedUtxoNetwork network;
|
final BasedUtxoNetwork network;
|
||||||
final bitcoin.HDWallet mainHd;
|
final bitcoin.HDWallet mainHd;
|
||||||
final bitcoin.HDWallet sideHd;
|
final bitcoin.HDWallet sideHd;
|
||||||
|
@ -101,23 +99,6 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
|
||||||
|
|
||||||
final typeMatchingReceiveAddresses = receiveAddresses.where(_isAddressPageTypeMatch);
|
final typeMatchingReceiveAddresses = receiveAddresses.where(_isAddressPageTypeMatch);
|
||||||
|
|
||||||
if ((isEnabledAutoGenerateSubaddress && receiveAddresses.isEmpty) ||
|
|
||||||
typeMatchingReceiveAddresses.isEmpty) {
|
|
||||||
receiveAddress = generateNewAddress().address;
|
|
||||||
} else {
|
|
||||||
final previousAddressMatchesType =
|
|
||||||
previousAddressRecord != null && previousAddressRecord!.type == addressPageType;
|
|
||||||
|
|
||||||
if (previousAddressMatchesType &&
|
|
||||||
typeMatchingReceiveAddresses.first.address != addressesByReceiveType.first.address) {
|
|
||||||
receiveAddress = previousAddressRecord!.address;
|
|
||||||
} else {
|
|
||||||
receiveAddress = typeMatchingReceiveAddresses.first.address;
|
|
||||||
}
|
|
||||||
final receiveAddress = receiveAddresses.first.address;
|
|
||||||
|
|
||||||
final typeMatchingReceiveAddresses = receiveAddresses.where(_isAddressPageTypeMatch);
|
|
||||||
|
|
||||||
if ((isEnabledAutoGenerateSubaddress && receiveAddresses.isEmpty) ||
|
if ((isEnabledAutoGenerateSubaddress && receiveAddresses.isEmpty) ||
|
||||||
typeMatchingReceiveAddresses.isEmpty) {
|
typeMatchingReceiveAddresses.isEmpty) {
|
||||||
receiveAddress = generateNewAddress().address;
|
receiveAddress = generateNewAddress().address;
|
||||||
|
@ -239,38 +220,36 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, String> get labels {
|
Map<String, String> get labels {
|
||||||
|
final G = ECPublic.fromBytes(BigintUtils.toBytes(Curves.generatorSecp256k1.x, length: 32));
|
||||||
final labels = <String, String>{};
|
final labels = <String, String>{};
|
||||||
for (int i = 0; i < silentAddresses.length; i++) {
|
for (int i = 0; i < silentAddresses.length; i++) {
|
||||||
final silentAddressRecord = silentAddresses[i];
|
final silentAddressRecord = silentAddresses[i];
|
||||||
final silentAddress =
|
final silentPaymentTweak = silentAddressRecord.silentPaymentTweak;
|
||||||
SilentPaymentDestination.fromAddress(silentAddressRecord.address, 0).B_spend.toHex();
|
labels[G
|
||||||
|
.tweakMul(BigintUtils.fromBytes(BytesUtils.fromHexString(silentPaymentTweak)))
|
||||||
if (silentAddressRecord.silentPaymentTweak != null)
|
.toHex()] = silentPaymentTweak;
|
||||||
labels[silentAddress] = silentAddressRecord.silentPaymentTweak!;
|
|
||||||
}
|
}
|
||||||
return labels;
|
return labels;
|
||||||
}
|
}
|
||||||
|
|
||||||
BitcoinAddressRecord generateNewAddress({String label = ''}) {
|
@action
|
||||||
|
BaseBitcoinAddressRecord generateNewAddress({String label = ''}) {
|
||||||
if (addressPageType == SilentPaymentsAddresType.p2sp) {
|
if (addressPageType == SilentPaymentsAddresType.p2sp) {
|
||||||
currentSilentAddressIndex += 1;
|
currentSilentAddressIndex += 1;
|
||||||
|
|
||||||
final tweak = BigInt.from(currentSilentAddressIndex);
|
final address = BitcoinSilentPaymentAddressRecord(
|
||||||
|
primarySilentAddress!.toLabeledSilentPaymentAddress(currentSilentAddressIndex).toString(),
|
||||||
final address = BitcoinAddressRecord(
|
|
||||||
SilentPaymentAddress.createLabeledSilentPaymentAddress(
|
|
||||||
primarySilentAddress!.B_scan, primarySilentAddress!.B_spend, tweak,
|
|
||||||
hrp: primarySilentAddress!.hrp, version: primarySilentAddress!.version)
|
|
||||||
.toString(),
|
|
||||||
index: currentSilentAddressIndex,
|
index: currentSilentAddressIndex,
|
||||||
isHidden: false,
|
isHidden: false,
|
||||||
name: label,
|
name: label,
|
||||||
silentPaymentTweak: tweak.toString(),
|
silentPaymentTweak:
|
||||||
|
BytesUtils.toHexString(primarySilentAddress!.generateLabel(currentSilentAddressIndex)),
|
||||||
network: network,
|
network: network,
|
||||||
type: SilentPaymentsAddresType.p2sp,
|
type: SilentPaymentsAddresType.p2sp,
|
||||||
);
|
);
|
||||||
|
|
||||||
silentAddresses.add(address);
|
silentAddresses.add(address);
|
||||||
|
updateAddressesByMatch();
|
||||||
|
|
||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
|
@ -321,6 +300,12 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
|
||||||
|
|
||||||
@action
|
@action
|
||||||
void updateAddressesByMatch() {
|
void updateAddressesByMatch() {
|
||||||
|
if (addressPageType == SilentPaymentsAddresType.p2sp) {
|
||||||
|
addressesByReceiveType.clear();
|
||||||
|
addressesByReceiveType.addAll(silentAddresses);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
addressesByReceiveType.clear();
|
addressesByReceiveType.clear();
|
||||||
addressesByReceiveType.addAll(_addresses.where(_isAddressPageTypeMatch).toList());
|
addressesByReceiveType.addAll(_addresses.where(_isAddressPageTypeMatch).toList());
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ class ElectrumWalletSnapshot {
|
||||||
|
|
||||||
String mnemonic;
|
String mnemonic;
|
||||||
List<BitcoinAddressRecord> addresses;
|
List<BitcoinAddressRecord> addresses;
|
||||||
List<BitcoinAddressRecord> silentAddresses;
|
List<BitcoinSilentPaymentAddressRecord> silentAddresses;
|
||||||
ElectrumBalance balance;
|
ElectrumBalance balance;
|
||||||
Map<String, int> regularAddressIndex;
|
Map<String, int> regularAddressIndex;
|
||||||
Map<String, int> changeAddressIndex;
|
Map<String, int> changeAddressIndex;
|
||||||
|
@ -52,7 +52,7 @@ class ElectrumWalletSnapshot {
|
||||||
final silentAddressesTmp = data['silent_addresses'] as List? ?? <Object>[];
|
final silentAddressesTmp = data['silent_addresses'] as List? ?? <Object>[];
|
||||||
final silentAddresses = silentAddressesTmp
|
final silentAddresses = silentAddressesTmp
|
||||||
.whereType<String>()
|
.whereType<String>()
|
||||||
.map((addr) => BitcoinAddressRecord.fromJSON(addr, network: network))
|
.map((addr) => BitcoinSilentPaymentAddressRecord.fromJSON(addr, network: network))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
final balance = ElectrumBalance.fromJSON(data['balance'] as String) ??
|
final balance = ElectrumBalance.fromJSON(data['balance'] as String) ??
|
||||||
|
|
|
@ -80,7 +80,7 @@ packages:
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: cake-update-v2
|
ref: cake-update-v2
|
||||||
resolved-ref: e4686da77cace5400697de69f7885020297cb900
|
resolved-ref: "43b80bcf0ef6e7224603a6b8874b61efec3c6a4c"
|
||||||
url: "https://github.com/cake-tech/bitcoin_base.git"
|
url: "https://github.com/cake-tech/bitcoin_base.git"
|
||||||
source: git
|
source: git
|
||||||
version: "4.0.0"
|
version: "4.0.0"
|
||||||
|
@ -93,6 +93,15 @@ packages:
|
||||||
url: "https://github.com/cake-tech/bitcoin_flutter.git"
|
url: "https://github.com/cake-tech/bitcoin_flutter.git"
|
||||||
source: git
|
source: git
|
||||||
version: "2.1.0"
|
version: "2.1.0"
|
||||||
|
blockchain_utils:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
path: "."
|
||||||
|
ref: cake-update-v1
|
||||||
|
resolved-ref: "6a0b891db4d90c647ebf5fc3a9132e614c70e1c6"
|
||||||
|
url: "https://github.com/cake-tech/blockchain_utils"
|
||||||
|
source: git
|
||||||
|
version: "1.6.0"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -36,7 +36,7 @@ dependencies:
|
||||||
ref: cake-update-v2
|
ref: cake-update-v2
|
||||||
blockchain_utils:
|
blockchain_utils:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/rafael-xmr/blockchain_utils
|
url: https://github.com/cake-tech/blockchain_utils
|
||||||
ref: cake-update-v1
|
ref: cake-update-v1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
|
|
@ -35,7 +35,7 @@ dependencies:
|
||||||
ref: cake-update-v2
|
ref: cake-update-v2
|
||||||
blockchain_utils:
|
blockchain_utils:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/rafael-xmr/blockchain_utils
|
url: https://github.com/cake-tech/blockchain_utils
|
||||||
ref: cake-update-v1
|
ref: cake-update-v1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
|
|
@ -58,6 +58,11 @@ class ConnectedSyncStatus extends SyncStatus {
|
||||||
double progress() => 0.0;
|
double progress() => 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class UnsupportedSyncStatus extends SyncStatus {
|
||||||
|
@override
|
||||||
|
double progress() => 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
class LostConnectionSyncStatus extends SyncStatus {
|
class LostConnectionSyncStatus extends SyncStatus {
|
||||||
@override
|
@override
|
||||||
double progress() => 1.0;
|
double progress() => 1.0;
|
||||||
|
|
|
@ -101,7 +101,7 @@ class CWBitcoin extends Bitcoin {
|
||||||
List<String> getAddresses(Object wallet) {
|
List<String> getAddresses(Object wallet) {
|
||||||
final bitcoinWallet = wallet as ElectrumWallet;
|
final bitcoinWallet = wallet as ElectrumWallet;
|
||||||
return bitcoinWallet.walletAddresses.addressesByReceiveType
|
return bitcoinWallet.walletAddresses.addressesByReceiveType
|
||||||
.map((BitcoinAddressRecord addr) => addr.address)
|
.map((BaseBitcoinAddressRecord addr) => addr.address)
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ class CWBitcoin extends Bitcoin {
|
||||||
List<ElectrumSubAddress> getSubAddresses(Object wallet) {
|
List<ElectrumSubAddress> getSubAddresses(Object wallet) {
|
||||||
final electrumWallet = wallet as ElectrumWallet;
|
final electrumWallet = wallet as ElectrumWallet;
|
||||||
return electrumWallet.walletAddresses.addressesByReceiveType
|
return electrumWallet.walletAddresses.addressesByReceiveType
|
||||||
.map((BitcoinAddressRecord addr) => ElectrumSubAddress(
|
.map((BaseBitcoinAddressRecord addr) => ElectrumSubAddress(
|
||||||
id: addr.index,
|
id: addr.index,
|
||||||
name: addr.name,
|
name: addr.name,
|
||||||
address: electrumWallet.type == WalletType.bitcoinCash ? addr.cashAddr : addr.address,
|
address: electrumWallet.type == WalletType.bitcoinCash ? addr.cashAddr : addr.address,
|
||||||
|
@ -195,7 +195,7 @@ class CWBitcoin extends Bitcoin {
|
||||||
@override
|
@override
|
||||||
List<BitcoinReceivePageOption> getBitcoinReceivePageOptions() => BitcoinReceivePageOption.all;
|
List<BitcoinReceivePageOption> getBitcoinReceivePageOptions() => BitcoinReceivePageOption.all;
|
||||||
|
|
||||||
List<BitcoinAddressRecord> getSilentAddresses(Object wallet) {
|
List<BitcoinSilentPaymentAddressRecord> getSilentAddresses(Object wallet) {
|
||||||
final bitcoinWallet = wallet as ElectrumWallet;
|
final bitcoinWallet = wallet as ElectrumWallet;
|
||||||
return bitcoinWallet.walletAddresses.silentAddresses;
|
return bitcoinWallet.walletAddresses.silentAddresses;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,5 +36,9 @@ String syncStatusTitle(SyncStatus syncStatus) {
|
||||||
return S.current.sync_status_failed_connect;
|
return S.current.sync_status_failed_connect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (syncStatus is UnsupportedSyncStatus) {
|
||||||
|
return S.current.sync_status_unsupported;
|
||||||
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ cd cw_bitcoin; flutter pub get; flutter packages pub run build_runner build --de
|
||||||
cd cw_haven; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd ..
|
cd cw_haven; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd ..
|
||||||
cd cw_nano; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd ..
|
cd cw_nano; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd ..
|
||||||
cd cw_bitcoin_cash; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd ..
|
cd cw_bitcoin_cash; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd ..
|
||||||
|
cd cw_solana; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd ..
|
||||||
cd cw_polygon; flutter pub get; cd ..
|
cd cw_polygon; flutter pub get; cd ..
|
||||||
cd cw_ethereum; flutter pub get; cd ..
|
cd cw_ethereum; flutter pub get; cd ..
|
||||||
flutter packages pub run build_runner build --delete-conflicting-outputs
|
flutter packages pub run build_runner build --delete-conflicting-outputs
|
||||||
|
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "بدء المزامنة",
|
"sync_status_starting_sync": "بدء المزامنة",
|
||||||
"sync_status_syncronized": "متزامن",
|
"sync_status_syncronized": "متزامن",
|
||||||
"sync_status_syncronizing": "يتم المزامنة",
|
"sync_status_syncronizing": "يتم المزامنة",
|
||||||
|
"sync_status_unsupported": "عقدة غير مدعومة",
|
||||||
"syncing_wallet_alert_content": "قد لا يكتمل رصيدك وقائمة المعاملات الخاصة بك حتى تظهر عبارة “SYNCHRONIZED“ في الأعلى. انقر / اضغط لمعرفة المزيد.",
|
"syncing_wallet_alert_content": "قد لا يكتمل رصيدك وقائمة المعاملات الخاصة بك حتى تظهر عبارة “SYNCHRONIZED“ في الأعلى. انقر / اضغط لمعرفة المزيد.",
|
||||||
"syncing_wallet_alert_title": "محفظتك تتم مزامنتها",
|
"syncing_wallet_alert_title": "محفظتك تتم مزامنتها",
|
||||||
"template": "قالب",
|
"template": "قالب",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "مفتاح العرض (خاص)",
|
"view_key_private": "مفتاح العرض (خاص)",
|
||||||
"view_key_public": "مفتاح العرض (عام)",
|
"view_key_public": "مفتاح العرض (عام)",
|
||||||
"view_transaction_on": "عرض العملية على",
|
"view_transaction_on": "عرض العملية على",
|
||||||
|
"waitFewSecondForTxUpdate": "ﺕﻼﻣﺎﻌﻤﻟﺍ ﻞﺠﺳ ﻲﻓ ﺔﻠﻣﺎﻌﻤﻟﺍ ﺲﻜﻌﻨﺗ ﻰﺘﺣ ﻥﺍﻮﺛ ﻊﻀﺒﻟ ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ",
|
||||||
"wallet_keys": "سييد المحفظة / المفاتيح",
|
"wallet_keys": "سييد المحفظة / المفاتيح",
|
||||||
"wallet_list_create_new_wallet": "إنشاء محفظة جديدة",
|
"wallet_list_create_new_wallet": "إنشاء محفظة جديدة",
|
||||||
"wallet_list_edit_wallet": "تحرير المحفظة",
|
"wallet_list_edit_wallet": "تحرير المحفظة",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "انت تدفع",
|
"you_pay": "انت تدفع",
|
||||||
"you_will_get": "حول الى",
|
"you_will_get": "حول الى",
|
||||||
"you_will_send": "تحويل من",
|
"you_will_send": "تحويل من",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "ﺕﻼﻣﺎﻌﻤﻟﺍ ﻞﺠﺳ ﻲﻓ ﺔﻠﻣﺎﻌﻤﻟﺍ ﺲﻜﻌﻨﺗ ﻰﺘﺣ ﻥﺍﻮﺛ ﻊﻀﺒﻟ ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "ЗАПОЧВАНЕ НА СИНХРОНИЗАЦИЯ",
|
"sync_status_starting_sync": "ЗАПОЧВАНЕ НА СИНХРОНИЗАЦИЯ",
|
||||||
"sync_status_syncronized": "СИНХРОНИЗИРАНО",
|
"sync_status_syncronized": "СИНХРОНИЗИРАНО",
|
||||||
"sync_status_syncronizing": "СИНХРОНИЗИРАНЕ",
|
"sync_status_syncronizing": "СИНХРОНИЗИРАНЕ",
|
||||||
|
"sync_status_unsupported": "Неподдържан възел",
|
||||||
"syncing_wallet_alert_content": "Списъкът ви с баланс и транзакции може да не е пълен, докато в горната част не пише „СИНХРОНИЗИРАН“. Кликнете/докоснете, за да научите повече.",
|
"syncing_wallet_alert_content": "Списъкът ви с баланс и транзакции може да не е пълен, докато в горната част не пише „СИНХРОНИЗИРАН“. Кликнете/докоснете, за да научите повече.",
|
||||||
"syncing_wallet_alert_title": "Вашият портфейл се синхронизира",
|
"syncing_wallet_alert_title": "Вашият портфейл се синхронизира",
|
||||||
"template": "Шаблон",
|
"template": "Шаблон",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "View key (таен)",
|
"view_key_private": "View key (таен)",
|
||||||
"view_key_public": "View key (публичен)",
|
"view_key_public": "View key (публичен)",
|
||||||
"view_transaction_on": "Вижте транзакция на ",
|
"view_transaction_on": "Вижте транзакция на ",
|
||||||
|
"waitFewSecondForTxUpdate": "Моля, изчакайте няколко секунди, докато транзакцията се отрази в историята на транзакциите",
|
||||||
"wallet_keys": "Seed/keys на портфейла",
|
"wallet_keys": "Seed/keys на портфейла",
|
||||||
"wallet_list_create_new_wallet": "Създаване на нов портфейл",
|
"wallet_list_create_new_wallet": "Създаване на нов портфейл",
|
||||||
"wallet_list_edit_wallet": "Редактиране на портфейла",
|
"wallet_list_edit_wallet": "Редактиране на портфейла",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "Вие плащате",
|
"you_pay": "Вие плащате",
|
||||||
"you_will_get": "Обръщане в",
|
"you_will_get": "Обръщане в",
|
||||||
"you_will_send": "Обръщане от",
|
"you_will_send": "Обръщане от",
|
||||||
"yy": "гг",
|
"yy": "гг"
|
||||||
"waitFewSecondForTxUpdate": "Моля, изчакайте няколко секунди, докато транзакцията се отрази в историята на транзакциите"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "SPOUŠTĚNÍ SYNCHRONIZACE",
|
"sync_status_starting_sync": "SPOUŠTĚNÍ SYNCHRONIZACE",
|
||||||
"sync_status_syncronized": "SYNCHRONIZOVÁNO",
|
"sync_status_syncronized": "SYNCHRONIZOVÁNO",
|
||||||
"sync_status_syncronizing": "SYNCHRONIZUJI",
|
"sync_status_syncronizing": "SYNCHRONIZUJI",
|
||||||
|
"sync_status_unsupported": "Nepodporovaný uzel",
|
||||||
"syncing_wallet_alert_content": "Váš seznam zůstatků a transakcí nemusí být úplný, dokud nebude nahoře uvedeno „SYNCHRONIZOVANÉ“. Kliknutím/klepnutím se dozvíte více.",
|
"syncing_wallet_alert_content": "Váš seznam zůstatků a transakcí nemusí být úplný, dokud nebude nahoře uvedeno „SYNCHRONIZOVANÉ“. Kliknutím/klepnutím se dozvíte více.",
|
||||||
"syncing_wallet_alert_title": "Vaše peněženka se synchronizuje",
|
"syncing_wallet_alert_title": "Vaše peněženka se synchronizuje",
|
||||||
"template": "Šablona",
|
"template": "Šablona",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "Klíč pro zobrazení (soukromý)",
|
"view_key_private": "Klíč pro zobrazení (soukromý)",
|
||||||
"view_key_public": "Klíč pro zobrazení (veřejný)",
|
"view_key_public": "Klíč pro zobrazení (veřejný)",
|
||||||
"view_transaction_on": "Zobrazit transakci na ",
|
"view_transaction_on": "Zobrazit transakci na ",
|
||||||
|
"waitFewSecondForTxUpdate": "Počkejte několik sekund, než se transakce projeví v historii transakcí",
|
||||||
"wallet_keys": "Seed/klíče peněženky",
|
"wallet_keys": "Seed/klíče peněženky",
|
||||||
"wallet_list_create_new_wallet": "Vytvořit novou peněženku",
|
"wallet_list_create_new_wallet": "Vytvořit novou peněženku",
|
||||||
"wallet_list_edit_wallet": "Upravit peněženku",
|
"wallet_list_edit_wallet": "Upravit peněženku",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "Zaplatíte",
|
"you_pay": "Zaplatíte",
|
||||||
"you_will_get": "Směnit na",
|
"you_will_get": "Směnit na",
|
||||||
"you_will_send": "Směnit z",
|
"you_will_send": "Směnit z",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Počkejte několik sekund, než se transakce projeví v historii transakcí"
|
|
||||||
}
|
}
|
|
@ -636,6 +636,7 @@
|
||||||
"sync_status_starting_sync": "STARTE SYNCHRONISIERUNG",
|
"sync_status_starting_sync": "STARTE SYNCHRONISIERUNG",
|
||||||
"sync_status_syncronized": "SYNCHRONISIERT",
|
"sync_status_syncronized": "SYNCHRONISIERT",
|
||||||
"sync_status_syncronizing": "SYNCHRONISIERE",
|
"sync_status_syncronizing": "SYNCHRONISIERE",
|
||||||
|
"sync_status_unsupported": "Nicht unterstützter Knoten",
|
||||||
"syncing_wallet_alert_content": "Ihr Kontostand und Ihre Transaktionsliste sind möglicherweise erst vollständig, wenn oben „SYNCHRONISIERT“ steht. Klicken/tippen Sie, um mehr zu erfahren.",
|
"syncing_wallet_alert_content": "Ihr Kontostand und Ihre Transaktionsliste sind möglicherweise erst vollständig, wenn oben „SYNCHRONISIERT“ steht. Klicken/tippen Sie, um mehr zu erfahren.",
|
||||||
"syncing_wallet_alert_title": "Ihr Wallet wird synchronisiert",
|
"syncing_wallet_alert_title": "Ihr Wallet wird synchronisiert",
|
||||||
"template": "Vorlage",
|
"template": "Vorlage",
|
||||||
|
@ -735,6 +736,7 @@
|
||||||
"view_key_private": "View Key (geheim)",
|
"view_key_private": "View Key (geheim)",
|
||||||
"view_key_public": "View Key (öffentlich)",
|
"view_key_public": "View Key (öffentlich)",
|
||||||
"view_transaction_on": "Anzeigen der Transaktion auf ",
|
"view_transaction_on": "Anzeigen der Transaktion auf ",
|
||||||
|
"waitFewSecondForTxUpdate": "Bitte warten Sie einige Sekunden, bis die Transaktion im Transaktionsverlauf angezeigt wird",
|
||||||
"waiting_payment_confirmation": "Warte auf Zahlungsbestätigung",
|
"waiting_payment_confirmation": "Warte auf Zahlungsbestätigung",
|
||||||
"wallet_keys": "Wallet-Seed/-Schlüssel",
|
"wallet_keys": "Wallet-Seed/-Schlüssel",
|
||||||
"wallet_list_create_new_wallet": "Neue Wallet erstellen",
|
"wallet_list_create_new_wallet": "Neue Wallet erstellen",
|
||||||
|
@ -786,6 +788,5 @@
|
||||||
"you_pay": "Sie bezahlen",
|
"you_pay": "Sie bezahlen",
|
||||||
"you_will_get": "Konvertieren zu",
|
"you_will_get": "Konvertieren zu",
|
||||||
"you_will_send": "Konvertieren von",
|
"you_will_send": "Konvertieren von",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Bitte warten Sie einige Sekunden, bis die Transaktion im Transaktionsverlauf angezeigt wird"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "STARTING SYNC",
|
"sync_status_starting_sync": "STARTING SYNC",
|
||||||
"sync_status_syncronized": "SYNCHRONIZED",
|
"sync_status_syncronized": "SYNCHRONIZED",
|
||||||
"sync_status_syncronizing": "SYNCHRONIZING",
|
"sync_status_syncronizing": "SYNCHRONIZING",
|
||||||
|
"sync_status_unsupported": "UNSUPPORTED NODE",
|
||||||
"syncing_wallet_alert_content": "Your balance and transaction list may not be complete until it says “SYNCHRONIZED” at the top. Click/tap to learn more.",
|
"syncing_wallet_alert_content": "Your balance and transaction list may not be complete until it says “SYNCHRONIZED” at the top. Click/tap to learn more.",
|
||||||
"syncing_wallet_alert_title": "Your wallet is syncing",
|
"syncing_wallet_alert_title": "Your wallet is syncing",
|
||||||
"template": "Template",
|
"template": "Template",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "View key (private)",
|
"view_key_private": "View key (private)",
|
||||||
"view_key_public": "View key (public)",
|
"view_key_public": "View key (public)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "Kindly wait for a few seconds for transaction to reflect in transactions history",
|
||||||
"wallet_keys": "Wallet seed/keys",
|
"wallet_keys": "Wallet seed/keys",
|
||||||
"wallet_list_create_new_wallet": "Create New Wallet",
|
"wallet_list_create_new_wallet": "Create New Wallet",
|
||||||
"wallet_list_edit_wallet": "Edit wallet",
|
"wallet_list_edit_wallet": "Edit wallet",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "You Pay",
|
"you_pay": "You Pay",
|
||||||
"you_will_get": "Convert to",
|
"you_will_get": "Convert to",
|
||||||
"you_will_send": "Convert from",
|
"you_will_send": "Convert from",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Kindly wait for a few seconds for transaction to reflect in transactions history"
|
|
||||||
}
|
}
|
|
@ -636,6 +636,7 @@
|
||||||
"sync_status_starting_sync": "EMPEZANDO A SINCRONIZAR",
|
"sync_status_starting_sync": "EMPEZANDO A SINCRONIZAR",
|
||||||
"sync_status_syncronized": "SINCRONIZADO",
|
"sync_status_syncronized": "SINCRONIZADO",
|
||||||
"sync_status_syncronizing": "SINCRONIZANDO",
|
"sync_status_syncronizing": "SINCRONIZANDO",
|
||||||
|
"sync_status_unsupported": "Nodo no compatible",
|
||||||
"syncing_wallet_alert_content": "Es posible que su lista de saldo y transacciones no esté completa hasta que diga \"SINCRONIZADO\" en la parte superior. Haga clic/toque para obtener más información.",
|
"syncing_wallet_alert_content": "Es posible que su lista de saldo y transacciones no esté completa hasta que diga \"SINCRONIZADO\" en la parte superior. Haga clic/toque para obtener más información.",
|
||||||
"syncing_wallet_alert_title": "Tu billetera se está sincronizando",
|
"syncing_wallet_alert_title": "Tu billetera se está sincronizando",
|
||||||
"template": "Plantilla",
|
"template": "Plantilla",
|
||||||
|
@ -734,6 +735,7 @@
|
||||||
"view_key_private": "View clave (privado)",
|
"view_key_private": "View clave (privado)",
|
||||||
"view_key_public": "View clave (público)",
|
"view_key_public": "View clave (público)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "Espere unos segundos para que la transacción se refleje en el historial de transacciones.",
|
||||||
"wallet_keys": "Billetera semilla/claves",
|
"wallet_keys": "Billetera semilla/claves",
|
||||||
"wallet_list_create_new_wallet": "Crear nueva billetera",
|
"wallet_list_create_new_wallet": "Crear nueva billetera",
|
||||||
"wallet_list_edit_wallet": "Editar billetera",
|
"wallet_list_edit_wallet": "Editar billetera",
|
||||||
|
@ -784,6 +786,5 @@
|
||||||
"you_pay": "Tú pagas",
|
"you_pay": "Tú pagas",
|
||||||
"you_will_get": "Convertir a",
|
"you_will_get": "Convertir a",
|
||||||
"you_will_send": "Convertir de",
|
"you_will_send": "Convertir de",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Espere unos segundos para que la transacción se refleje en el historial de transacciones."
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "DÉBUT DE SYNCHRO",
|
"sync_status_starting_sync": "DÉBUT DE SYNCHRO",
|
||||||
"sync_status_syncronized": "SYNCHRONISÉ",
|
"sync_status_syncronized": "SYNCHRONISÉ",
|
||||||
"sync_status_syncronizing": "SYNCHRONISATION EN COURS",
|
"sync_status_syncronizing": "SYNCHRONISATION EN COURS",
|
||||||
|
"sync_status_unsupported": "Nœud non pris en charge",
|
||||||
"syncing_wallet_alert_content": "Votre solde et votre liste de transactions peuvent ne pas être à jour tant que la mention « SYNCHRONISÉ » n'apparaît en haut de l'écran. Cliquez/appuyez pour en savoir plus.",
|
"syncing_wallet_alert_content": "Votre solde et votre liste de transactions peuvent ne pas être à jour tant que la mention « SYNCHRONISÉ » n'apparaît en haut de l'écran. Cliquez/appuyez pour en savoir plus.",
|
||||||
"syncing_wallet_alert_title": "Votre portefeuille (wallet) est en cours de synchronisation",
|
"syncing_wallet_alert_title": "Votre portefeuille (wallet) est en cours de synchronisation",
|
||||||
"template": "Modèle",
|
"template": "Modèle",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "Clef d'audit (view key) (privée)",
|
"view_key_private": "Clef d'audit (view key) (privée)",
|
||||||
"view_key_public": "Clef d'audit (view key) (publique)",
|
"view_key_public": "Clef d'audit (view key) (publique)",
|
||||||
"view_transaction_on": "Voir la Transaction sur ",
|
"view_transaction_on": "Voir la Transaction sur ",
|
||||||
|
"waitFewSecondForTxUpdate": "Veuillez attendre quelques secondes pour que la transaction soit reflétée dans l'historique des transactions.",
|
||||||
"wallet_keys": "Phrase secrète (seed)/Clefs du portefeuille (wallet)",
|
"wallet_keys": "Phrase secrète (seed)/Clefs du portefeuille (wallet)",
|
||||||
"wallet_list_create_new_wallet": "Créer un Nouveau Portefeuille (Wallet)",
|
"wallet_list_create_new_wallet": "Créer un Nouveau Portefeuille (Wallet)",
|
||||||
"wallet_list_edit_wallet": "Modifier le portefeuille",
|
"wallet_list_edit_wallet": "Modifier le portefeuille",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "Vous payez",
|
"you_pay": "Vous payez",
|
||||||
"you_will_get": "Convertir vers",
|
"you_will_get": "Convertir vers",
|
||||||
"you_will_send": "Convertir depuis",
|
"you_will_send": "Convertir depuis",
|
||||||
"yy": "AA",
|
"yy": "AA"
|
||||||
"waitFewSecondForTxUpdate": "Veuillez attendre quelques secondes pour que la transaction soit reflétée dans l'historique des transactions."
|
|
||||||
}
|
}
|
|
@ -637,6 +637,7 @@
|
||||||
"sync_status_starting_sync": "KWAFI",
|
"sync_status_starting_sync": "KWAFI",
|
||||||
"sync_status_syncronized": "KYAU",
|
"sync_status_syncronized": "KYAU",
|
||||||
"sync_status_syncronizing": "KWAFI",
|
"sync_status_syncronizing": "KWAFI",
|
||||||
|
"sync_status_unsupported": "Ba a Taimako ba",
|
||||||
"syncing_wallet_alert_content": "Ma'aunin ku da lissafin ma'amala bazai cika ba har sai an ce \"SYNCHRONIZED\" a saman. Danna/matsa don ƙarin koyo.",
|
"syncing_wallet_alert_content": "Ma'aunin ku da lissafin ma'amala bazai cika ba har sai an ce \"SYNCHRONIZED\" a saman. Danna/matsa don ƙarin koyo.",
|
||||||
"syncing_wallet_alert_title": "Walat ɗin ku yana aiki tare",
|
"syncing_wallet_alert_title": "Walat ɗin ku yana aiki tare",
|
||||||
"template": "Samfura",
|
"template": "Samfura",
|
||||||
|
@ -735,6 +736,7 @@
|
||||||
"view_key_private": "Duba maɓallin (maɓallin kalmar sirri)",
|
"view_key_private": "Duba maɓallin (maɓallin kalmar sirri)",
|
||||||
"view_key_public": "Maɓallin Duba (maɓallin jama'a)",
|
"view_key_public": "Maɓallin Duba (maɓallin jama'a)",
|
||||||
"view_transaction_on": "Dubo aikace-aikacen akan",
|
"view_transaction_on": "Dubo aikace-aikacen akan",
|
||||||
|
"waitFewSecondForTxUpdate": "Da fatan za a jira ƴan daƙiƙa don ciniki don yin tunani a tarihin ma'amala",
|
||||||
"wallet_keys": "Iri/maɓalli na walat",
|
"wallet_keys": "Iri/maɓalli na walat",
|
||||||
"wallet_list_create_new_wallet": "Ƙirƙiri Sabon Wallet",
|
"wallet_list_create_new_wallet": "Ƙirƙiri Sabon Wallet",
|
||||||
"wallet_list_edit_wallet": "Gyara walat",
|
"wallet_list_edit_wallet": "Gyara walat",
|
||||||
|
@ -785,6 +787,5 @@
|
||||||
"you_pay": "Ka Bayar",
|
"you_pay": "Ka Bayar",
|
||||||
"you_will_get": "Maida zuwa",
|
"you_will_get": "Maida zuwa",
|
||||||
"you_will_send": "Maida daga",
|
"you_will_send": "Maida daga",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Da fatan za a jira ƴan daƙiƙa don ciniki don yin tunani a tarihin ma'amala"
|
|
||||||
}
|
}
|
|
@ -637,6 +637,7 @@
|
||||||
"sync_status_starting_sync": "सिताज़ा करना",
|
"sync_status_starting_sync": "सिताज़ा करना",
|
||||||
"sync_status_syncronized": "सिंक्रनाइज़",
|
"sync_status_syncronized": "सिंक्रनाइज़",
|
||||||
"sync_status_syncronizing": "सिंक्रनाइज़ करने",
|
"sync_status_syncronizing": "सिंक्रनाइज़ करने",
|
||||||
|
"sync_status_unsupported": "असमर्थित नोड",
|
||||||
"syncing_wallet_alert_content": "आपकी शेष राशि और लेनदेन सूची तब तक पूरी नहीं हो सकती जब तक कि शीर्ष पर \"सिंक्रनाइज़्ड\" न लिखा हो। अधिक जानने के लिए क्लिक/टैप करें।",
|
"syncing_wallet_alert_content": "आपकी शेष राशि और लेनदेन सूची तब तक पूरी नहीं हो सकती जब तक कि शीर्ष पर \"सिंक्रनाइज़्ड\" न लिखा हो। अधिक जानने के लिए क्लिक/टैप करें।",
|
||||||
"syncing_wallet_alert_title": "आपका वॉलेट सिंक हो रहा है",
|
"syncing_wallet_alert_title": "आपका वॉलेट सिंक हो रहा है",
|
||||||
"template": "खाका",
|
"template": "खाका",
|
||||||
|
@ -735,6 +736,7 @@
|
||||||
"view_key_private": "कुंजी देखें(निजी)",
|
"view_key_private": "कुंजी देखें(निजी)",
|
||||||
"view_key_public": "कुंजी देखें (जनता)",
|
"view_key_public": "कुंजी देखें (जनता)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "लेन-देन इतिहास में लेन-देन प्रतिबिंबित होने के लिए कृपया कुछ सेकंड प्रतीक्षा करें",
|
||||||
"wallet_keys": "बटुआ बीज / चाबियाँ",
|
"wallet_keys": "बटुआ बीज / चाबियाँ",
|
||||||
"wallet_list_create_new_wallet": "नया बटुआ बनाएँ",
|
"wallet_list_create_new_wallet": "नया बटुआ बनाएँ",
|
||||||
"wallet_list_edit_wallet": "बटुआ संपादित करें",
|
"wallet_list_edit_wallet": "बटुआ संपादित करें",
|
||||||
|
@ -785,6 +787,5 @@
|
||||||
"you_pay": "आप भुगतान करते हैं",
|
"you_pay": "आप भुगतान करते हैं",
|
||||||
"you_will_get": "में बदलें",
|
"you_will_get": "में बदलें",
|
||||||
"you_will_send": "से रूपांतरित करें",
|
"you_will_send": "से रूपांतरित करें",
|
||||||
"yy": "वाईवाई",
|
"yy": "वाईवाई"
|
||||||
"waitFewSecondForTxUpdate": "लेन-देन इतिहास में लेन-देन प्रतिबिंबित होने के लिए कृपया कुछ सेकंड प्रतीक्षा करें"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "ZAPOČINJEMO SINKRONIZIRANJE",
|
"sync_status_starting_sync": "ZAPOČINJEMO SINKRONIZIRANJE",
|
||||||
"sync_status_syncronized": "SINKRONIZIRANO",
|
"sync_status_syncronized": "SINKRONIZIRANO",
|
||||||
"sync_status_syncronizing": "SINKRONIZIRANJE",
|
"sync_status_syncronizing": "SINKRONIZIRANJE",
|
||||||
|
"sync_status_unsupported": "Nepodržani čvor",
|
||||||
"syncing_wallet_alert_content": "Vaš saldo i popis transakcija možda neće biti potpuni sve dok na vrhu ne piše \"SINKRONIZIRANO\". Kliknite/dodirnite da biste saznali više.",
|
"syncing_wallet_alert_content": "Vaš saldo i popis transakcija možda neće biti potpuni sve dok na vrhu ne piše \"SINKRONIZIRANO\". Kliknite/dodirnite da biste saznali više.",
|
||||||
"syncing_wallet_alert_title": "Vaš novčanik se sinkronizira",
|
"syncing_wallet_alert_title": "Vaš novčanik se sinkronizira",
|
||||||
"template": "Predložak",
|
"template": "Predložak",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "View key (privatni)",
|
"view_key_private": "View key (privatni)",
|
||||||
"view_key_public": "View key (javni)",
|
"view_key_public": "View key (javni)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "Pričekajte nekoliko sekundi da se transakcija prikaže u povijesti transakcija",
|
||||||
"wallet_keys": "Pristupni izraz/ključ novčanika",
|
"wallet_keys": "Pristupni izraz/ključ novčanika",
|
||||||
"wallet_list_create_new_wallet": "Izradi novi novčanik",
|
"wallet_list_create_new_wallet": "Izradi novi novčanik",
|
||||||
"wallet_list_edit_wallet": "Uredi novčanik",
|
"wallet_list_edit_wallet": "Uredi novčanik",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "Vi plaćate",
|
"you_pay": "Vi plaćate",
|
||||||
"you_will_get": "Razmijeni u",
|
"you_will_get": "Razmijeni u",
|
||||||
"you_will_send": "Razmijeni iz",
|
"you_will_send": "Razmijeni iz",
|
||||||
"yy": "GG",
|
"yy": "GG"
|
||||||
"waitFewSecondForTxUpdate": "Pričekajte nekoliko sekundi da se transakcija prikaže u povijesti transakcija"
|
|
||||||
}
|
}
|
|
@ -638,6 +638,7 @@
|
||||||
"sync_status_starting_sync": "MULAI SINKRONISASI",
|
"sync_status_starting_sync": "MULAI SINKRONISASI",
|
||||||
"sync_status_syncronized": "SUDAH TERSINKRONISASI",
|
"sync_status_syncronized": "SUDAH TERSINKRONISASI",
|
||||||
"sync_status_syncronizing": "SEDANG SINKRONISASI",
|
"sync_status_syncronizing": "SEDANG SINKRONISASI",
|
||||||
|
"sync_status_unsupported": "Node yang tidak didukung",
|
||||||
"syncing_wallet_alert_content": "Saldo dan daftar transaksi Anda mungkin belum lengkap sampai tertulis “SYNCHRONIZED” di bagian atas. Klik/ketuk untuk mempelajari lebih lanjut.",
|
"syncing_wallet_alert_content": "Saldo dan daftar transaksi Anda mungkin belum lengkap sampai tertulis “SYNCHRONIZED” di bagian atas. Klik/ketuk untuk mempelajari lebih lanjut.",
|
||||||
"syncing_wallet_alert_title": "Dompet Anda sedang disinkronkan",
|
"syncing_wallet_alert_title": "Dompet Anda sedang disinkronkan",
|
||||||
"template": "Template",
|
"template": "Template",
|
||||||
|
@ -736,6 +737,7 @@
|
||||||
"view_key_private": "Kunci tampilan (privat)",
|
"view_key_private": "Kunci tampilan (privat)",
|
||||||
"view_key_public": "Kunci tampilan (publik)",
|
"view_key_public": "Kunci tampilan (publik)",
|
||||||
"view_transaction_on": "Lihat Transaksi di ",
|
"view_transaction_on": "Lihat Transaksi di ",
|
||||||
|
"waitFewSecondForTxUpdate": "Mohon tunggu beberapa detik hingga transaksi terlihat di riwayat transaksi",
|
||||||
"wallet_keys": "Seed/kunci dompet",
|
"wallet_keys": "Seed/kunci dompet",
|
||||||
"wallet_list_create_new_wallet": "Buat Dompet Baru",
|
"wallet_list_create_new_wallet": "Buat Dompet Baru",
|
||||||
"wallet_list_edit_wallet": "Edit dompet",
|
"wallet_list_edit_wallet": "Edit dompet",
|
||||||
|
@ -786,6 +788,5 @@
|
||||||
"you_pay": "Anda Membayar",
|
"you_pay": "Anda Membayar",
|
||||||
"you_will_get": "Konversi ke",
|
"you_will_get": "Konversi ke",
|
||||||
"you_will_send": "Konversi dari",
|
"you_will_send": "Konversi dari",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Mohon tunggu beberapa detik hingga transaksi terlihat di riwayat transaksi"
|
|
||||||
}
|
}
|
|
@ -637,6 +637,7 @@
|
||||||
"sync_status_starting_sync": "INIZIO SINC",
|
"sync_status_starting_sync": "INIZIO SINC",
|
||||||
"sync_status_syncronized": "SINCRONIZZATO",
|
"sync_status_syncronized": "SINCRONIZZATO",
|
||||||
"sync_status_syncronizing": "SINCRONIZZAZIONE",
|
"sync_status_syncronizing": "SINCRONIZZAZIONE",
|
||||||
|
"sync_status_unsupported": "Nodo non supportato",
|
||||||
"syncing_wallet_alert_content": "Il saldo e l'elenco delle transazioni potrebbero non essere completi fino a quando non viene visualizzato \"SYNCHRONIZED\" in alto. Clicca/tocca per saperne di più.",
|
"syncing_wallet_alert_content": "Il saldo e l'elenco delle transazioni potrebbero non essere completi fino a quando non viene visualizzato \"SYNCHRONIZED\" in alto. Clicca/tocca per saperne di più.",
|
||||||
"syncing_wallet_alert_title": "Il tuo portafoglio si sta sincronizzando",
|
"syncing_wallet_alert_title": "Il tuo portafoglio si sta sincronizzando",
|
||||||
"template": "Modello",
|
"template": "Modello",
|
||||||
|
@ -735,6 +736,7 @@
|
||||||
"view_key_private": "Chiave di visualizzazione (privata)",
|
"view_key_private": "Chiave di visualizzazione (privata)",
|
||||||
"view_key_public": "Chiave di visualizzazione (pubblica)",
|
"view_key_public": "Chiave di visualizzazione (pubblica)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "Attendi qualche secondo affinché la transazione venga riflessa nella cronologia delle transazioni",
|
||||||
"waiting_payment_confirmation": "In attesa di conferma del pagamento",
|
"waiting_payment_confirmation": "In attesa di conferma del pagamento",
|
||||||
"wallet_keys": "Seme Portafoglio /chiavi",
|
"wallet_keys": "Seme Portafoglio /chiavi",
|
||||||
"wallet_list_create_new_wallet": "Crea Nuovo Portafoglio",
|
"wallet_list_create_new_wallet": "Crea Nuovo Portafoglio",
|
||||||
|
@ -786,6 +788,5 @@
|
||||||
"you_pay": "Tu paghi",
|
"you_pay": "Tu paghi",
|
||||||
"you_will_get": "Converti a",
|
"you_will_get": "Converti a",
|
||||||
"you_will_send": "Conveti da",
|
"you_will_send": "Conveti da",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Attendi qualche secondo affinché la transazione venga riflessa nella cronologia delle transazioni"
|
|
||||||
}
|
}
|
|
@ -636,6 +636,7 @@
|
||||||
"sync_status_starting_sync": "同期の開始",
|
"sync_status_starting_sync": "同期の開始",
|
||||||
"sync_status_syncronized": "同期された",
|
"sync_status_syncronized": "同期された",
|
||||||
"sync_status_syncronizing": "同期",
|
"sync_status_syncronizing": "同期",
|
||||||
|
"sync_status_unsupported": "サポートされていないノード",
|
||||||
"syncing_wallet_alert_content": "上部に「同期済み」と表示されるまで、残高と取引リストが完了していない可能性があります。詳細については、クリック/タップしてください。",
|
"syncing_wallet_alert_content": "上部に「同期済み」と表示されるまで、残高と取引リストが完了していない可能性があります。詳細については、クリック/タップしてください。",
|
||||||
"syncing_wallet_alert_title": "ウォレットは同期中です",
|
"syncing_wallet_alert_title": "ウォレットは同期中です",
|
||||||
"template": "テンプレート",
|
"template": "テンプレート",
|
||||||
|
@ -734,6 +735,7 @@
|
||||||
"view_key_private": "ビューキー (プライベート)",
|
"view_key_private": "ビューキー (プライベート)",
|
||||||
"view_key_public": "ビューキー (パブリック)",
|
"view_key_public": "ビューキー (パブリック)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "取引履歴に取引が反映されるまで数秒お待ちください。",
|
||||||
"wallet_keys": "ウォレットシード/キー",
|
"wallet_keys": "ウォレットシード/キー",
|
||||||
"wallet_list_create_new_wallet": "新しいウォレットを作成",
|
"wallet_list_create_new_wallet": "新しいウォレットを作成",
|
||||||
"wallet_list_edit_wallet": "ウォレットを編集する",
|
"wallet_list_edit_wallet": "ウォレットを編集する",
|
||||||
|
@ -784,6 +786,5 @@
|
||||||
"you_pay": "あなたが支払う",
|
"you_pay": "あなたが支払う",
|
||||||
"you_will_get": "に変換",
|
"you_will_get": "に変換",
|
||||||
"you_will_send": "から変換",
|
"you_will_send": "から変換",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "取引履歴に取引が反映されるまで数秒お待ちください。"
|
|
||||||
}
|
}
|
|
@ -636,6 +636,7 @@
|
||||||
"sync_status_starting_sync": "동기화 시작",
|
"sync_status_starting_sync": "동기화 시작",
|
||||||
"sync_status_syncronized": "동기화",
|
"sync_status_syncronized": "동기화",
|
||||||
"sync_status_syncronizing": "동기화",
|
"sync_status_syncronizing": "동기화",
|
||||||
|
"sync_status_unsupported": "지원되지 않은 노드",
|
||||||
"syncing_wallet_alert_content": "상단에 \"동기화됨\"이라고 표시될 때까지 잔액 및 거래 목록이 완전하지 않을 수 있습니다. 자세히 알아보려면 클릭/탭하세요.",
|
"syncing_wallet_alert_content": "상단에 \"동기화됨\"이라고 표시될 때까지 잔액 및 거래 목록이 완전하지 않을 수 있습니다. 자세히 알아보려면 클릭/탭하세요.",
|
||||||
"syncing_wallet_alert_title": "지갑 동기화 중",
|
"syncing_wallet_alert_title": "지갑 동기화 중",
|
||||||
"template": "주형",
|
"template": "주형",
|
||||||
|
@ -734,6 +735,7 @@
|
||||||
"view_key_private": "키보기(은밀한)",
|
"view_key_private": "키보기(은밀한)",
|
||||||
"view_key_public": "키보기 (공공의)",
|
"view_key_public": "키보기 (공공의)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "거래 내역에 거래가 반영될 때까지 몇 초 정도 기다려 주세요.",
|
||||||
"wallet_keys": "지갑 시드 / 키",
|
"wallet_keys": "지갑 시드 / 키",
|
||||||
"wallet_list_create_new_wallet": "새 월렛 만들기",
|
"wallet_list_create_new_wallet": "새 월렛 만들기",
|
||||||
"wallet_list_edit_wallet": "지갑 수정",
|
"wallet_list_edit_wallet": "지갑 수정",
|
||||||
|
@ -785,6 +787,5 @@
|
||||||
"you_will_get": "로 변환하다",
|
"you_will_get": "로 변환하다",
|
||||||
"you_will_send": "다음에서 변환",
|
"you_will_send": "다음에서 변환",
|
||||||
"YY": "YY",
|
"YY": "YY",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "거래 내역에 거래가 반영될 때까지 몇 초 정도 기다려 주세요."
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "စင့်ခ်လုပ်ခြင်း။",
|
"sync_status_starting_sync": "စင့်ခ်လုပ်ခြင်း။",
|
||||||
"sync_status_syncronized": "ထပ်တူပြုထားသည်။",
|
"sync_status_syncronized": "ထပ်တူပြုထားသည်။",
|
||||||
"sync_status_syncronizing": "ထပ်တူပြုခြင်း။",
|
"sync_status_syncronizing": "ထပ်တူပြုခြင်း။",
|
||||||
|
"sync_status_unsupported": "node မထောက်ပံ့ node ကို",
|
||||||
"syncing_wallet_alert_content": "သင်၏လက်ကျန်နှင့် ငွေပေးငွေယူစာရင်းသည် ထိပ်တွင် \"Synchronizeed\" ဟုပြောသည်အထိ မပြီးမြောက်နိုင်ပါ။ ပိုမိုလေ့လာရန် နှိပ်/နှိပ်ပါ။",
|
"syncing_wallet_alert_content": "သင်၏လက်ကျန်နှင့် ငွေပေးငွေယူစာရင်းသည် ထိပ်တွင် \"Synchronizeed\" ဟုပြောသည်အထိ မပြီးမြောက်နိုင်ပါ။ ပိုမိုလေ့လာရန် နှိပ်/နှိပ်ပါ။",
|
||||||
"syncing_wallet_alert_title": "သင့်ပိုက်ဆံအိတ်ကို စင့်ခ်လုပ်နေပါသည်။",
|
"syncing_wallet_alert_title": "သင့်ပိုက်ဆံအိတ်ကို စင့်ခ်လုပ်နေပါသည်။",
|
||||||
"template": "ပုံစံခွက်",
|
"template": "ပုံစံခွက်",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "သော့ကိုကြည့်ရန် (သီးသန့်)",
|
"view_key_private": "သော့ကိုကြည့်ရန် (သီးသန့်)",
|
||||||
"view_key_public": "သော့ကိုကြည့်ရန် (အများပြည်သူ)",
|
"view_key_public": "သော့ကိုကြည့်ရန် (အများပြည်သူ)",
|
||||||
"view_transaction_on": "ငွေလွှဲခြင်းကို ဖွင့်ကြည့်ပါ။",
|
"view_transaction_on": "ငွေလွှဲခြင်းကို ဖွင့်ကြည့်ပါ။",
|
||||||
|
"waitFewSecondForTxUpdate": "ငွေပေးငွေယူ မှတ်တမ်းတွင် ရောင်ပြန်ဟပ်ရန် စက္ကန့်အနည်းငယ်စောင့်ပါ။",
|
||||||
"wallet_keys": "ပိုက်ဆံအိတ် အစေ့/သော့များ",
|
"wallet_keys": "ပိုက်ဆံအိတ် အစေ့/သော့များ",
|
||||||
"wallet_list_create_new_wallet": "Wallet အသစ်ဖန်တီးပါ။",
|
"wallet_list_create_new_wallet": "Wallet အသစ်ဖန်တီးပါ။",
|
||||||
"wallet_list_edit_wallet": "ပိုက်ဆံအိတ်ကို တည်းဖြတ်ပါ။",
|
"wallet_list_edit_wallet": "ပိုက်ဆံအိတ်ကို တည်းဖြတ်ပါ။",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "သင်ပေးချေပါ။",
|
"you_pay": "သင်ပေးချေပါ။",
|
||||||
"you_will_get": "သို့ပြောင်းပါ။",
|
"you_will_get": "သို့ပြောင်းပါ။",
|
||||||
"you_will_send": "မှပြောင်းပါ။",
|
"you_will_send": "မှပြောင်းပါ။",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "ငွေပေးငွေယူ မှတ်တမ်းတွင် ရောင်ပြန်ဟပ်ရန် စက္ကန့်အနည်းငယ်စောင့်ပါ။"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "BEGINNEN MET SYNCHRONISEREN",
|
"sync_status_starting_sync": "BEGINNEN MET SYNCHRONISEREN",
|
||||||
"sync_status_syncronized": "SYNCHRONIZED",
|
"sync_status_syncronized": "SYNCHRONIZED",
|
||||||
"sync_status_syncronizing": "SYNCHRONISEREN",
|
"sync_status_syncronizing": "SYNCHRONISEREN",
|
||||||
|
"sync_status_unsupported": "Niet ondersteund knooppunt",
|
||||||
"syncing_wallet_alert_content": "Uw saldo- en transactielijst is mogelijk pas compleet als er bovenaan 'GESYNCHRONISEERD' staat. Klik/tik voor meer informatie.",
|
"syncing_wallet_alert_content": "Uw saldo- en transactielijst is mogelijk pas compleet als er bovenaan 'GESYNCHRONISEERD' staat. Klik/tik voor meer informatie.",
|
||||||
"syncing_wallet_alert_title": "Uw portemonnee wordt gesynchroniseerd",
|
"syncing_wallet_alert_title": "Uw portemonnee wordt gesynchroniseerd",
|
||||||
"template": "Sjabloon",
|
"template": "Sjabloon",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "Bekijk sleutel (privaat)",
|
"view_key_private": "Bekijk sleutel (privaat)",
|
||||||
"view_key_public": "Bekijk sleutel (openbaar)",
|
"view_key_public": "Bekijk sleutel (openbaar)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "Wacht een paar seconden totdat de transactie wordt weergegeven in de transactiegeschiedenis",
|
||||||
"waiting_payment_confirmation": "In afwachting van betalingsbevestiging",
|
"waiting_payment_confirmation": "In afwachting van betalingsbevestiging",
|
||||||
"wallet_keys": "Portemonnee zaad/sleutels",
|
"wallet_keys": "Portemonnee zaad/sleutels",
|
||||||
"wallet_list_create_new_wallet": "Maak een nieuwe portemonnee",
|
"wallet_list_create_new_wallet": "Maak een nieuwe portemonnee",
|
||||||
|
@ -784,6 +786,5 @@
|
||||||
"you_pay": "U betaalt",
|
"you_pay": "U betaalt",
|
||||||
"you_will_get": "Converteren naar",
|
"you_will_get": "Converteren naar",
|
||||||
"you_will_send": "Converteren van",
|
"you_will_send": "Converteren van",
|
||||||
"yy": "JJ",
|
"yy": "JJ"
|
||||||
"waitFewSecondForTxUpdate": "Wacht een paar seconden totdat de transactie wordt weergegeven in de transactiegeschiedenis"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "ROZPOCZĘCIE SYNCHRONIZACJI",
|
"sync_status_starting_sync": "ROZPOCZĘCIE SYNCHRONIZACJI",
|
||||||
"sync_status_syncronized": "ZSYNCHRONIZOWANO",
|
"sync_status_syncronized": "ZSYNCHRONIZOWANO",
|
||||||
"sync_status_syncronizing": "SYNCHRONIZACJA",
|
"sync_status_syncronizing": "SYNCHRONIZACJA",
|
||||||
|
"sync_status_unsupported": "Nieobsługiwany węzeł",
|
||||||
"syncing_wallet_alert_content": "Twoje saldo i lista transakcji mogą nie być kompletne, dopóki u góry nie pojawi się napis „SYNCHRONIZOWANY”. Kliknij/stuknij, aby dowiedzieć się więcej.",
|
"syncing_wallet_alert_content": "Twoje saldo i lista transakcji mogą nie być kompletne, dopóki u góry nie pojawi się napis „SYNCHRONIZOWANY”. Kliknij/stuknij, aby dowiedzieć się więcej.",
|
||||||
"syncing_wallet_alert_title": "Twój portfel się synchronizuje",
|
"syncing_wallet_alert_title": "Twój portfel się synchronizuje",
|
||||||
"template": "Szablon",
|
"template": "Szablon",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "Prywatny Klucz Wglądu",
|
"view_key_private": "Prywatny Klucz Wglądu",
|
||||||
"view_key_public": "Publiczny Klucz Wglądu",
|
"view_key_public": "Publiczny Klucz Wglądu",
|
||||||
"view_transaction_on": "Zobacz transakcje na ",
|
"view_transaction_on": "Zobacz transakcje na ",
|
||||||
|
"waitFewSecondForTxUpdate": "Poczekaj kilka sekund, aż transakcja zostanie odzwierciedlona w historii transakcji",
|
||||||
"wallet_keys": "Klucze portfela",
|
"wallet_keys": "Klucze portfela",
|
||||||
"wallet_list_create_new_wallet": "Utwórz nowy portfel",
|
"wallet_list_create_new_wallet": "Utwórz nowy portfel",
|
||||||
"wallet_list_edit_wallet": "Edytuj portfel",
|
"wallet_list_edit_wallet": "Edytuj portfel",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "Płacisz",
|
"you_pay": "Płacisz",
|
||||||
"you_will_get": "Konwertuj na",
|
"you_will_get": "Konwertuj na",
|
||||||
"you_will_send": "Konwertuj z",
|
"you_will_send": "Konwertuj z",
|
||||||
"yy": "RR",
|
"yy": "RR"
|
||||||
"waitFewSecondForTxUpdate": "Poczekaj kilka sekund, aż transakcja zostanie odzwierciedlona w historii transakcji"
|
|
||||||
}
|
}
|
|
@ -637,6 +637,7 @@
|
||||||
"sync_status_starting_sync": "INICIANDO SINCRONIZAÇÃO",
|
"sync_status_starting_sync": "INICIANDO SINCRONIZAÇÃO",
|
||||||
"sync_status_syncronized": "SINCRONIZADO",
|
"sync_status_syncronized": "SINCRONIZADO",
|
||||||
"sync_status_syncronizing": "SINCRONIZANDO",
|
"sync_status_syncronizing": "SINCRONIZANDO",
|
||||||
|
"sync_status_unsupported": "Nó não suportado",
|
||||||
"syncing_wallet_alert_content": "Seu saldo e lista de transações podem não estar completos até que diga “SYNCHRONIZED” no topo. Clique/toque para saber mais.",
|
"syncing_wallet_alert_content": "Seu saldo e lista de transações podem não estar completos até que diga “SYNCHRONIZED” no topo. Clique/toque para saber mais.",
|
||||||
"syncing_wallet_alert_title": "Sua carteira está sincronizando",
|
"syncing_wallet_alert_title": "Sua carteira está sincronizando",
|
||||||
"template": "Modelo",
|
"template": "Modelo",
|
||||||
|
@ -735,6 +736,7 @@
|
||||||
"view_key_private": "Chave de visualização (privada)",
|
"view_key_private": "Chave de visualização (privada)",
|
||||||
"view_key_public": "Chave de visualização (pública)",
|
"view_key_public": "Chave de visualização (pública)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "Aguarde alguns segundos para que a transação seja refletida no histórico de transações",
|
||||||
"waiting_payment_confirmation": "Aguardando confirmação de pagamento",
|
"waiting_payment_confirmation": "Aguardando confirmação de pagamento",
|
||||||
"wallet_keys": "Semente/chaves da carteira",
|
"wallet_keys": "Semente/chaves da carteira",
|
||||||
"wallet_list_create_new_wallet": "Criar nova carteira",
|
"wallet_list_create_new_wallet": "Criar nova carteira",
|
||||||
|
@ -786,6 +788,5 @@
|
||||||
"you_pay": "Você paga",
|
"you_pay": "Você paga",
|
||||||
"you_will_get": "Converter para",
|
"you_will_get": "Converter para",
|
||||||
"you_will_send": "Converter de",
|
"you_will_send": "Converter de",
|
||||||
"yy": "aa",
|
"yy": "aa"
|
||||||
"waitFewSecondForTxUpdate": "Aguarde alguns segundos para que a transação seja refletida no histórico de transações"
|
|
||||||
}
|
}
|
|
@ -636,6 +636,7 @@
|
||||||
"sync_status_starting_sync": "НАЧАЛО СИНХРОНИЗАЦИИ",
|
"sync_status_starting_sync": "НАЧАЛО СИНХРОНИЗАЦИИ",
|
||||||
"sync_status_syncronized": "СИНХРОНИЗИРОВАН",
|
"sync_status_syncronized": "СИНХРОНИЗИРОВАН",
|
||||||
"sync_status_syncronizing": "СИНХРОНИЗАЦИЯ",
|
"sync_status_syncronizing": "СИНХРОНИЗАЦИЯ",
|
||||||
|
"sync_status_unsupported": "Неподдерживаемый узел",
|
||||||
"syncing_wallet_alert_content": "Ваш баланс и список транзакций могут быть неполными, пока вверху не будет написано «СИНХРОНИЗИРОВАНО». Щелкните/коснитесь, чтобы узнать больше.",
|
"syncing_wallet_alert_content": "Ваш баланс и список транзакций могут быть неполными, пока вверху не будет написано «СИНХРОНИЗИРОВАНО». Щелкните/коснитесь, чтобы узнать больше.",
|
||||||
"syncing_wallet_alert_title": "Ваш кошелек синхронизируется",
|
"syncing_wallet_alert_title": "Ваш кошелек синхронизируется",
|
||||||
"template": "Шаблон",
|
"template": "Шаблон",
|
||||||
|
@ -734,6 +735,7 @@
|
||||||
"view_key_private": "Приватный ключ просмотра",
|
"view_key_private": "Приватный ключ просмотра",
|
||||||
"view_key_public": "Публичный ключ просмотра",
|
"view_key_public": "Публичный ключ просмотра",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "Пожалуйста, подождите несколько секунд, чтобы транзакция отразилась в истории транзакций.",
|
||||||
"wallet_keys": "Мнемоническая фраза/ключи кошелька",
|
"wallet_keys": "Мнемоническая фраза/ключи кошелька",
|
||||||
"wallet_list_create_new_wallet": "Создать новый кошелёк",
|
"wallet_list_create_new_wallet": "Создать новый кошелёк",
|
||||||
"wallet_list_edit_wallet": "Изменить кошелек",
|
"wallet_list_edit_wallet": "Изменить кошелек",
|
||||||
|
@ -784,6 +786,5 @@
|
||||||
"you_pay": "Вы платите",
|
"you_pay": "Вы платите",
|
||||||
"you_will_get": "Конвертировать в",
|
"you_will_get": "Конвертировать в",
|
||||||
"you_will_send": "Конвертировать из",
|
"you_will_send": "Конвертировать из",
|
||||||
"yy": "ГГ",
|
"yy": "ГГ"
|
||||||
"waitFewSecondForTxUpdate": "Пожалуйста, подождите несколько секунд, чтобы транзакция отразилась в истории транзакций."
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "กำลังเริ่มซิงโครไนซ์",
|
"sync_status_starting_sync": "กำลังเริ่มซิงโครไนซ์",
|
||||||
"sync_status_syncronized": "ซิงโครไนซ์แล้ว",
|
"sync_status_syncronized": "ซิงโครไนซ์แล้ว",
|
||||||
"sync_status_syncronizing": "กำลังซิงโครไนซ์",
|
"sync_status_syncronizing": "กำลังซิงโครไนซ์",
|
||||||
|
"sync_status_unsupported": "โหนดที่ไม่ได้รับการสนับสนุน",
|
||||||
"syncing_wallet_alert_content": "รายการยอดเงินและธุรกรรมของคุณอาจไม่สมบูรณ์จนกว่าจะมีข้อความว่า “ซิงโครไนซ์” ที่ด้านบน คลิก/แตะเพื่อเรียนรู้เพิ่มเติม่",
|
"syncing_wallet_alert_content": "รายการยอดเงินและธุรกรรมของคุณอาจไม่สมบูรณ์จนกว่าจะมีข้อความว่า “ซิงโครไนซ์” ที่ด้านบน คลิก/แตะเพื่อเรียนรู้เพิ่มเติม่",
|
||||||
"syncing_wallet_alert_title": "กระเป๋าสตางค์ของคุณกำลังซิงค์",
|
"syncing_wallet_alert_title": "กระเป๋าสตางค์ของคุณกำลังซิงค์",
|
||||||
"template": "แบบฟอร์ม",
|
"template": "แบบฟอร์ม",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "คีย์มุมมอง (ส่วนตัว)",
|
"view_key_private": "คีย์มุมมอง (ส่วนตัว)",
|
||||||
"view_key_public": "คีย์มุมมอง (สาธารณะ)",
|
"view_key_public": "คีย์มุมมอง (สาธารณะ)",
|
||||||
"view_transaction_on": "ดูการทำธุรกรรมบน ",
|
"view_transaction_on": "ดูการทำธุรกรรมบน ",
|
||||||
|
"waitFewSecondForTxUpdate": "กรุณารอสักครู่เพื่อให้ธุรกรรมปรากฏในประวัติการทำธุรกรรม",
|
||||||
"wallet_keys": "ซีดของกระเป๋า/คีย์",
|
"wallet_keys": "ซีดของกระเป๋า/คีย์",
|
||||||
"wallet_list_create_new_wallet": "สร้างกระเป๋าใหม่",
|
"wallet_list_create_new_wallet": "สร้างกระเป๋าใหม่",
|
||||||
"wallet_list_edit_wallet": "แก้ไขกระเป๋าสตางค์",
|
"wallet_list_edit_wallet": "แก้ไขกระเป๋าสตางค์",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "คุณจ่าย",
|
"you_pay": "คุณจ่าย",
|
||||||
"you_will_get": "แปลงเป็น",
|
"you_will_get": "แปลงเป็น",
|
||||||
"you_will_send": "แปลงจาก",
|
"you_will_send": "แปลงจาก",
|
||||||
"yy": "ปี",
|
"yy": "ปี"
|
||||||
"waitFewSecondForTxUpdate": "กรุณารอสักครู่เพื่อให้ธุรกรรมปรากฏในประวัติการทำธุรกรรม"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "Simula sa pag -sync",
|
"sync_status_starting_sync": "Simula sa pag -sync",
|
||||||
"sync_status_syncronized": "Naka -synchronize",
|
"sync_status_syncronized": "Naka -synchronize",
|
||||||
"sync_status_syncronizing": "Pag -synchronize",
|
"sync_status_syncronizing": "Pag -synchronize",
|
||||||
|
"sync_status_unsupported": "Hindi suportadong node",
|
||||||
"syncing_wallet_alert_content": "Ang iyong balanse at listahan ng transaksyon ay maaaring hindi kumpleto hanggang sa sabihin nito na \"naka -synchronize\" sa tuktok. Mag -click/tap upang malaman ang higit pa.",
|
"syncing_wallet_alert_content": "Ang iyong balanse at listahan ng transaksyon ay maaaring hindi kumpleto hanggang sa sabihin nito na \"naka -synchronize\" sa tuktok. Mag -click/tap upang malaman ang higit pa.",
|
||||||
"syncing_wallet_alert_title": "Ang iyong pitaka ay nag -sync",
|
"syncing_wallet_alert_title": "Ang iyong pitaka ay nag -sync",
|
||||||
"template": "Template",
|
"template": "Template",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "Tingnan ang Key (Pribado)",
|
"view_key_private": "Tingnan ang Key (Pribado)",
|
||||||
"view_key_public": "Tingnan ang Key (Publiko)",
|
"view_key_public": "Tingnan ang Key (Publiko)",
|
||||||
"view_transaction_on": "Tingnan ang transaksyon sa",
|
"view_transaction_on": "Tingnan ang transaksyon sa",
|
||||||
|
"waitFewSecondForTxUpdate": "Mangyaring maghintay ng ilang segundo para makita ang transaksyon sa history ng mga transaksyon",
|
||||||
"wallet_keys": "Mga buto/susi ng pitaka",
|
"wallet_keys": "Mga buto/susi ng pitaka",
|
||||||
"wallet_list_create_new_wallet": "Lumikha ng bagong pitaka",
|
"wallet_list_create_new_wallet": "Lumikha ng bagong pitaka",
|
||||||
"wallet_list_edit_wallet": "I -edit ang Wallet",
|
"wallet_list_edit_wallet": "I -edit ang Wallet",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "Magbabayad ka",
|
"you_pay": "Magbabayad ka",
|
||||||
"you_will_get": "Mag -convert sa",
|
"you_will_get": "Mag -convert sa",
|
||||||
"you_will_send": "I -convert mula sa",
|
"you_will_send": "I -convert mula sa",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Mangyaring maghintay ng ilang segundo para makita ang transaksyon sa history ng mga transaksyon"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "SENKRONİZE BAŞLATILIYOR",
|
"sync_status_starting_sync": "SENKRONİZE BAŞLATILIYOR",
|
||||||
"sync_status_syncronized": "SENKRONİZE EDİLDİ",
|
"sync_status_syncronized": "SENKRONİZE EDİLDİ",
|
||||||
"sync_status_syncronizing": "SENKRONİZE EDİLİYOR",
|
"sync_status_syncronizing": "SENKRONİZE EDİLİYOR",
|
||||||
|
"sync_status_unsupported": "Desteklenmeyen düğüm",
|
||||||
"syncing_wallet_alert_content": "Bakiyeniz ve işlem listeniz, en üstte \"SENKRONİZE EDİLDİ\" yazana kadar tamamlanmamış olabilir. Daha fazla bilgi edinmek için tıklayın/dokunun.",
|
"syncing_wallet_alert_content": "Bakiyeniz ve işlem listeniz, en üstte \"SENKRONİZE EDİLDİ\" yazana kadar tamamlanmamış olabilir. Daha fazla bilgi edinmek için tıklayın/dokunun.",
|
||||||
"syncing_wallet_alert_title": "Cüzdanınız senkronize ediliyor",
|
"syncing_wallet_alert_title": "Cüzdanınız senkronize ediliyor",
|
||||||
"template": "Şablon",
|
"template": "Şablon",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "İzleme anahtarı (özel)",
|
"view_key_private": "İzleme anahtarı (özel)",
|
||||||
"view_key_public": "İzleme anahtarı (genel)",
|
"view_key_public": "İzleme anahtarı (genel)",
|
||||||
"view_transaction_on": "İşlemi şurada görüntüle ",
|
"view_transaction_on": "İşlemi şurada görüntüle ",
|
||||||
|
"waitFewSecondForTxUpdate": "İşlemin işlem geçmişine yansıması için lütfen birkaç saniye bekleyin",
|
||||||
"wallet_keys": "Cüzdan tohumu/anahtarları",
|
"wallet_keys": "Cüzdan tohumu/anahtarları",
|
||||||
"wallet_list_create_new_wallet": "Yeni Cüzdan Oluştur",
|
"wallet_list_create_new_wallet": "Yeni Cüzdan Oluştur",
|
||||||
"wallet_list_edit_wallet": "Cüzdanı düzenle",
|
"wallet_list_edit_wallet": "Cüzdanı düzenle",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "Şu kadar ödeyeceksin: ",
|
"you_pay": "Şu kadar ödeyeceksin: ",
|
||||||
"you_will_get": "Biçimine dönüştür:",
|
"you_will_get": "Biçimine dönüştür:",
|
||||||
"you_will_send": "Biçiminden dönüştür:",
|
"you_will_send": "Biçiminden dönüştür:",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "İşlemin işlem geçmişine yansıması için lütfen birkaç saniye bekleyin"
|
|
||||||
}
|
}
|
|
@ -636,6 +636,7 @@
|
||||||
"sync_status_starting_sync": "ПОЧАТОК СИНХРОНІЗАЦІЇ",
|
"sync_status_starting_sync": "ПОЧАТОК СИНХРОНІЗАЦІЇ",
|
||||||
"sync_status_syncronized": "СИНХРОНІЗОВАНИЙ",
|
"sync_status_syncronized": "СИНХРОНІЗОВАНИЙ",
|
||||||
"sync_status_syncronizing": "СИНХРОНІЗАЦІЯ",
|
"sync_status_syncronizing": "СИНХРОНІЗАЦІЯ",
|
||||||
|
"sync_status_unsupported": "Непідтримуваний вузол",
|
||||||
"syncing_wallet_alert_content": "Ваш баланс та список транзакцій може бути неповним, доки вгорі не буде написано «СИНХРОНІЗОВАНО». Натисніть/торкніться, щоб дізнатися більше.",
|
"syncing_wallet_alert_content": "Ваш баланс та список транзакцій може бути неповним, доки вгорі не буде написано «СИНХРОНІЗОВАНО». Натисніть/торкніться, щоб дізнатися більше.",
|
||||||
"syncing_wallet_alert_title": "Ваш гаманець синхронізується",
|
"syncing_wallet_alert_title": "Ваш гаманець синхронізується",
|
||||||
"template": "Шаблон",
|
"template": "Шаблон",
|
||||||
|
@ -734,6 +735,7 @@
|
||||||
"view_key_private": "Приватний ключ перегляду",
|
"view_key_private": "Приватний ключ перегляду",
|
||||||
"view_key_public": "Публічний ключ перегляду",
|
"view_key_public": "Публічний ключ перегляду",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "Будь ласка, зачекайте кілька секунд, поки транзакція відобразиться в історії транзакцій",
|
||||||
"wallet_keys": "Мнемонічна фраза/ключі гаманця",
|
"wallet_keys": "Мнемонічна фраза/ключі гаманця",
|
||||||
"wallet_list_create_new_wallet": "Створити новий гаманець",
|
"wallet_list_create_new_wallet": "Створити новий гаманець",
|
||||||
"wallet_list_edit_wallet": "Редагувати гаманець",
|
"wallet_list_edit_wallet": "Редагувати гаманець",
|
||||||
|
@ -784,6 +786,5 @@
|
||||||
"you_pay": "Ви платите",
|
"you_pay": "Ви платите",
|
||||||
"you_will_get": "Конвертувати в",
|
"you_will_get": "Конвертувати в",
|
||||||
"you_will_send": "Конвертувати з",
|
"you_will_send": "Конвертувати з",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "Будь ласка, зачекайте кілька секунд, поки транзакція відобразиться в історії транзакцій"
|
|
||||||
}
|
}
|
|
@ -637,6 +637,7 @@
|
||||||
"sync_status_starting_sync": "مطابقت پذیری شروع کر رہا ہے۔",
|
"sync_status_starting_sync": "مطابقت پذیری شروع کر رہا ہے۔",
|
||||||
"sync_status_syncronized": "مطابقت پذیر",
|
"sync_status_syncronized": "مطابقت پذیر",
|
||||||
"sync_status_syncronizing": "مطابقت پذیری",
|
"sync_status_syncronizing": "مطابقت پذیری",
|
||||||
|
"sync_status_unsupported": "غیر تعاون یافتہ نوڈ",
|
||||||
"syncing_wallet_alert_content": "آپ کے بیلنس اور لین دین کی فہرست اس وقت تک مکمل نہیں ہو سکتی جب تک کہ یہ سب سے اوپر \"SYNCRONIZED\" نہ کہے۔ مزید جاننے کے لیے کلک/تھپتھپائیں۔",
|
"syncing_wallet_alert_content": "آپ کے بیلنس اور لین دین کی فہرست اس وقت تک مکمل نہیں ہو سکتی جب تک کہ یہ سب سے اوپر \"SYNCRONIZED\" نہ کہے۔ مزید جاننے کے لیے کلک/تھپتھپائیں۔",
|
||||||
"syncing_wallet_alert_title": "آپ کا بٹوہ مطابقت پذیر ہو رہا ہے۔",
|
"syncing_wallet_alert_title": "آپ کا بٹوہ مطابقت پذیر ہو رہا ہے۔",
|
||||||
"template": "سانچے",
|
"template": "سانچے",
|
||||||
|
@ -735,6 +736,7 @@
|
||||||
"view_key_private": "کلید دیکھیں (نجی)",
|
"view_key_private": "کلید دیکھیں (نجی)",
|
||||||
"view_key_public": "کلید دیکھیں (عوامی)",
|
"view_key_public": "کلید دیکھیں (عوامی)",
|
||||||
"view_transaction_on": "لین دین دیکھیں آن",
|
"view_transaction_on": "لین دین دیکھیں آن",
|
||||||
|
"waitFewSecondForTxUpdate": "۔ﮟﯾﺮﮐ ﺭﺎﻈﺘﻧﺍ ﺎﮐ ﮉﻨﮑﯿﺳ ﺪﻨﭼ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﮯﻧﺮﮐ ﯽﺳﺎﮑﻋ ﯽﮐ ﻦﯾﺩ ﻦﯿﻟ ﮟﯿﻣ ﺦﯾﺭﺎﺗ ﯽﮐ ﻦ",
|
||||||
"wallet_keys": "بٹوے کے بیج / چابیاں",
|
"wallet_keys": "بٹوے کے بیج / چابیاں",
|
||||||
"wallet_list_create_new_wallet": "نیا والیٹ بنائیں",
|
"wallet_list_create_new_wallet": "نیا والیٹ بنائیں",
|
||||||
"wallet_list_edit_wallet": "بٹوے میں ترمیم کریں۔",
|
"wallet_list_edit_wallet": "بٹوے میں ترمیم کریں۔",
|
||||||
|
@ -785,6 +787,5 @@
|
||||||
"you_pay": "تم ادا کرو",
|
"you_pay": "تم ادا کرو",
|
||||||
"you_will_get": "میں تبدیل کریں۔",
|
"you_will_get": "میں تبدیل کریں۔",
|
||||||
"you_will_send": "سے تبدیل کریں۔",
|
"you_will_send": "سے تبدیل کریں۔",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "۔ﮟﯾﺮﮐ ﺭﺎﻈﺘﻧﺍ ﺎﮐ ﮉﻨﮑﯿﺳ ﺪﻨﭼ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﮯﻧﺮﮐ ﯽﺳﺎﮑﻋ ﯽﮐ ﻦﯾﺩ ﻦﯿﻟ ﮟﯿﻣ ﺦﯾﺭﺎﺗ ﯽﮐ ﻦ"
|
|
||||||
}
|
}
|
|
@ -636,6 +636,7 @@
|
||||||
"sync_status_starting_sync": "Ń BẸ̀RẸ̀ RẸ́",
|
"sync_status_starting_sync": "Ń BẸ̀RẸ̀ RẸ́",
|
||||||
"sync_status_syncronized": "TI MÚDỌ́GBA",
|
"sync_status_syncronized": "TI MÚDỌ́GBA",
|
||||||
"sync_status_syncronizing": "Ń MÚDỌ́GBA",
|
"sync_status_syncronizing": "Ń MÚDỌ́GBA",
|
||||||
|
"sync_status_unsupported": "Ile-igbimọ ti ko ni atilẹyin",
|
||||||
"syncing_wallet_alert_content": "Iwontunws.funfun rẹ ati atokọ idunadura le ma pari titi ti yoo fi sọ “SYNCHRONIZED” ni oke. Tẹ/tẹ ni kia kia lati ni imọ siwaju sii.",
|
"syncing_wallet_alert_content": "Iwontunws.funfun rẹ ati atokọ idunadura le ma pari titi ti yoo fi sọ “SYNCHRONIZED” ni oke. Tẹ/tẹ ni kia kia lati ni imọ siwaju sii.",
|
||||||
"syncing_wallet_alert_title": "Apamọwọ rẹ n muṣiṣẹpọ",
|
"syncing_wallet_alert_title": "Apamọwọ rẹ n muṣiṣẹpọ",
|
||||||
"template": "Àwòṣe",
|
"template": "Àwòṣe",
|
||||||
|
@ -734,6 +735,7 @@
|
||||||
"view_key_private": "Kọ́kọ́rọ́ ìwò (àdáni)",
|
"view_key_private": "Kọ́kọ́rọ́ ìwò (àdáni)",
|
||||||
"view_key_public": "Kọ́kọ́rọ́ ìwò (kò àdáni)",
|
"view_key_public": "Kọ́kọ́rọ́ ìwò (kò àdáni)",
|
||||||
"view_transaction_on": "Wo pàṣípààrọ̀ lórí ",
|
"view_transaction_on": "Wo pàṣípààrọ̀ lórí ",
|
||||||
|
"waitFewSecondForTxUpdate": "Fi inurere duro fun awọn iṣeju diẹ fun idunadura lati ṣe afihan ninu itan-akọọlẹ iṣowo",
|
||||||
"wallet_keys": "Hóró/kọ́kọ́rọ́ àpamọ́wọ́",
|
"wallet_keys": "Hóró/kọ́kọ́rọ́ àpamọ́wọ́",
|
||||||
"wallet_list_create_new_wallet": "Ṣe àpamọ́wọ́ títun",
|
"wallet_list_create_new_wallet": "Ṣe àpamọ́wọ́ títun",
|
||||||
"wallet_list_edit_wallet": "Ṣatunkọ apamọwọ",
|
"wallet_list_edit_wallet": "Ṣatunkọ apamọwọ",
|
||||||
|
@ -784,6 +786,5 @@
|
||||||
"you_pay": "Ẹ sàn",
|
"you_pay": "Ẹ sàn",
|
||||||
"you_will_get": "Ṣe pàṣípààrọ̀ sí",
|
"you_will_get": "Ṣe pàṣípààrọ̀ sí",
|
||||||
"you_will_send": "Ṣe pàṣípààrọ̀ láti",
|
"you_will_send": "Ṣe pàṣípààrọ̀ láti",
|
||||||
"yy": "Ọd",
|
"yy": "Ọd"
|
||||||
"waitFewSecondForTxUpdate": "Fi inurere duro fun awọn iṣeju diẹ fun idunadura lati ṣe afihan ninu itan-akọọlẹ iṣowo"
|
|
||||||
}
|
}
|
|
@ -635,6 +635,7 @@
|
||||||
"sync_status_starting_sync": "开始同步",
|
"sync_status_starting_sync": "开始同步",
|
||||||
"sync_status_syncronized": "已同步",
|
"sync_status_syncronized": "已同步",
|
||||||
"sync_status_syncronizing": "正在同步",
|
"sync_status_syncronizing": "正在同步",
|
||||||
|
"sync_status_unsupported": "不支持的节点",
|
||||||
"syncing_wallet_alert_content": "您的余额和交易列表可能不完整,直到顶部显示“已同步”。单击/点击以了解更多信息。",
|
"syncing_wallet_alert_content": "您的余额和交易列表可能不完整,直到顶部显示“已同步”。单击/点击以了解更多信息。",
|
||||||
"syncing_wallet_alert_title": "您的钱包正在同步",
|
"syncing_wallet_alert_title": "您的钱包正在同步",
|
||||||
"template": "模板",
|
"template": "模板",
|
||||||
|
@ -733,6 +734,7 @@
|
||||||
"view_key_private": "View 密钥(私钥)",
|
"view_key_private": "View 密钥(私钥)",
|
||||||
"view_key_public": "View 密钥(公钥)",
|
"view_key_public": "View 密钥(公钥)",
|
||||||
"view_transaction_on": "View Transaction on ",
|
"view_transaction_on": "View Transaction on ",
|
||||||
|
"waitFewSecondForTxUpdate": "请等待几秒钟,交易才会反映在交易历史记录中",
|
||||||
"wallet_keys": "钱包种子/密钥",
|
"wallet_keys": "钱包种子/密钥",
|
||||||
"wallet_list_create_new_wallet": "创建新钱包",
|
"wallet_list_create_new_wallet": "创建新钱包",
|
||||||
"wallet_list_edit_wallet": "编辑钱包",
|
"wallet_list_edit_wallet": "编辑钱包",
|
||||||
|
@ -783,6 +785,5 @@
|
||||||
"you_pay": "你付钱",
|
"you_pay": "你付钱",
|
||||||
"you_will_get": "转换到",
|
"you_will_get": "转换到",
|
||||||
"you_will_send": "转换自",
|
"you_will_send": "转换自",
|
||||||
"yy": "YY",
|
"yy": "YY"
|
||||||
"waitFewSecondForTxUpdate": "请等待几秒钟,交易才会反映在交易历史记录中"
|
|
||||||
}
|
}
|
|
@ -125,7 +125,7 @@ abstract class Bitcoin {
|
||||||
|
|
||||||
List<String> getAddresses(Object wallet);
|
List<String> getAddresses(Object wallet);
|
||||||
String getAddress(Object wallet);
|
String getAddress(Object wallet);
|
||||||
List<BitcoinAddressRecord> getSilentAddresses(Object wallet);
|
List<BitcoinSilentPaymentAddressRecord> getSilentAddresses(Object wallet);
|
||||||
|
|
||||||
List<ElectrumSubAddress> getSubAddresses(Object wallet);
|
List<ElectrumSubAddress> getSubAddresses(Object wallet);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue