mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-02-28 22:10:31 +00:00
Merge branch 'mweb' of https://github.com/cake-tech/cake_wallet into mweb-bg-sync-2
This commit is contained in:
commit
197d658d0d
28 changed files with 105 additions and 172 deletions
assets/text
cw_bitcoin/lib
electrum.dartelectrum_wallet.dartlitecoin_wallet.dartlitecoin_wallet_addresses.dartlitecoin_wallet_service.dart
cw_monero/lib
cw_mweb
android/src/main/kotlin/com/cakewallet/mweb
ios/Classes
lib
cw_wownero/lib
lib
reactions
src/screens/new_wallet
utils
scripts
tool
windows
|
@ -1,3 +1,2 @@
|
||||||
Scan and verify messages
|
Enhance auto-address generation for Monero
|
||||||
Synchronization enhancements
|
Bug fixes and enhancements
|
||||||
Bug fixes
|
|
|
@ -1,3 +1,4 @@
|
||||||
Scan and verify messages
|
Enable BIP39 by default for wallet creation also on Bitcoin/Litecoin (Electrum seed type is still accessible through advanced settings page)
|
||||||
Synchronization enhancements
|
Improve fee calculation for Bitcoin to protect against overpaying or underpaying
|
||||||
Bug fixes
|
Enhance auto-address generation for Monero
|
||||||
|
Bug fixes and enhancements
|
|
@ -107,16 +107,9 @@ class ElectrumClient {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onError: (Object error) {
|
onError: (Object error) {
|
||||||
socket = null;
|
|
||||||
final errorMsg = error.toString();
|
final errorMsg = error.toString();
|
||||||
print(errorMsg);
|
print(errorMsg);
|
||||||
unterminatedString = '';
|
unterminatedString = '';
|
||||||
|
|
||||||
final currentHost = socket?.address.host;
|
|
||||||
final isErrorForCurrentHost = errorMsg.contains(" ${currentHost} ");
|
|
||||||
|
|
||||||
if (currentHost != null && isErrorForCurrentHost)
|
|
||||||
_setConnectionStatus(ConnectionStatus.failed);
|
|
||||||
},
|
},
|
||||||
onDone: () {
|
onDone: () {
|
||||||
unterminatedString = '';
|
unterminatedString = '';
|
||||||
|
@ -436,7 +429,6 @@ class ElectrumClient {
|
||||||
{required String id, required String method, List<Object> params = const []}) {
|
{required String id, required String method, List<Object> params = const []}) {
|
||||||
try {
|
try {
|
||||||
if (socket == null) {
|
if (socket == null) {
|
||||||
_setConnectionStatus(ConnectionStatus.failed);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final subscription = BehaviorSubject<T>();
|
final subscription = BehaviorSubject<T>();
|
||||||
|
@ -453,7 +445,6 @@ class ElectrumClient {
|
||||||
Future<dynamic> call(
|
Future<dynamic> call(
|
||||||
{required String method, List<Object> params = const [], Function(int)? idCallback}) async {
|
{required String method, List<Object> params = const [], Function(int)? idCallback}) async {
|
||||||
if (socket == null) {
|
if (socket == null) {
|
||||||
_setConnectionStatus(ConnectionStatus.failed);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final completer = Completer<dynamic>();
|
final completer = Completer<dynamic>();
|
||||||
|
@ -467,10 +458,9 @@ class ElectrumClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<dynamic> callWithTimeout(
|
Future<dynamic> callWithTimeout(
|
||||||
{required String method, List<Object> params = const [], int timeout = 4000}) async {
|
{required String method, List<Object> params = const [], int timeout = 5000}) async {
|
||||||
try {
|
try {
|
||||||
if (socket == null) {
|
if (socket == null) {
|
||||||
_setConnectionStatus(ConnectionStatus.failed);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final completer = Completer<dynamic>();
|
final completer = Completer<dynamic>();
|
||||||
|
|
|
@ -284,7 +284,6 @@ abstract class ElectrumWalletBase
|
||||||
Future<Isolate>? _isolate;
|
Future<Isolate>? _isolate;
|
||||||
|
|
||||||
void Function(FlutterErrorDetails)? _onError;
|
void Function(FlutterErrorDetails)? _onError;
|
||||||
Timer? _reconnectTimer;
|
|
||||||
Timer? _autoSaveTimer;
|
Timer? _autoSaveTimer;
|
||||||
StreamSubscription<dynamic>? _receiveStream;
|
StreamSubscription<dynamic>? _receiveStream;
|
||||||
Timer? _updateFeeRateTimer;
|
Timer? _updateFeeRateTimer;
|
||||||
|
@ -439,6 +438,10 @@ abstract class ElectrumWalletBase
|
||||||
@override
|
@override
|
||||||
Future<void> startSync() async {
|
Future<void> startSync() async {
|
||||||
try {
|
try {
|
||||||
|
if (syncStatus is SyncronizingSyncStatus) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
syncStatus = SyncronizingSyncStatus();
|
syncStatus = SyncronizingSyncStatus();
|
||||||
|
|
||||||
if (hasSilentPaymentsScanning) {
|
if (hasSilentPaymentsScanning) {
|
||||||
|
@ -2057,9 +2060,8 @@ abstract class ElectrumWalletBase
|
||||||
|
|
||||||
_isTryingToConnect = true;
|
_isTryingToConnect = true;
|
||||||
|
|
||||||
_reconnectTimer?.cancel();
|
Timer(Duration(seconds: 10), () {
|
||||||
_reconnectTimer = Timer(Duration(seconds: 10), () {
|
if (this.syncStatus is NotConnectedSyncStatus || this.syncStatus is LostConnectionSyncStatus) {
|
||||||
if (this.syncStatus is! SyncedSyncStatus && this.syncStatus is! SyncedTipSyncStatus) {
|
|
||||||
this.electrumClient.connectToUri(
|
this.electrumClient.connectToUri(
|
||||||
node!.uri,
|
node!.uri,
|
||||||
useSSL: node!.useSSL ?? false,
|
useSSL: node!.useSSL ?? false,
|
||||||
|
|
|
@ -445,6 +445,10 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> processMwebUtxos() async {
|
Future<void> processMwebUtxos() async {
|
||||||
|
if (!mwebEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int restoreHeight = walletInfo.restoreHeight;
|
int restoreHeight = walletInfo.restoreHeight;
|
||||||
print("SCANNING FROM HEIGHT: $restoreHeight");
|
print("SCANNING FROM HEIGHT: $restoreHeight");
|
||||||
final req = UtxosRequest(scanSecret: scanSecret, fromHeight: restoreHeight);
|
final req = UtxosRequest(scanSecret: scanSecret, fromHeight: restoreHeight);
|
||||||
|
@ -504,6 +508,10 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> checkMwebUtxosSpent() async {
|
Future<void> checkMwebUtxosSpent() async {
|
||||||
|
if (!mwebEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while ((await Future.wait(transactionHistory.transactions.values
|
while ((await Future.wait(transactionHistory.transactions.values
|
||||||
.where((tx) => tx.direction == TransactionDirection.outgoing && tx.isPending)
|
.where((tx) => tx.direction == TransactionDirection.outgoing && tx.isPending)
|
||||||
.map(checkPendingTransaction)))
|
.map(checkPendingTransaction)))
|
||||||
|
@ -559,6 +567,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> checkPendingTransaction(ElectrumTransactionInfo tx) async {
|
Future<bool> checkPendingTransaction(ElectrumTransactionInfo tx) async {
|
||||||
|
if (!mwebEnabled) return false;
|
||||||
if (!tx.isPending) return false;
|
if (!tx.isPending) return false;
|
||||||
final outputId = <String>[], target = <String>{};
|
final outputId = <String>[], target = <String>{};
|
||||||
final isHash = RegExp(r'^[a-f0-9]{64}$').hasMatch;
|
final isHash = RegExp(r'^[a-f0-9]{64}$').hasMatch;
|
||||||
|
@ -757,6 +766,11 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
||||||
vinOutpoints: vinOutpoints,
|
vinOutpoints: vinOutpoints,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mwebEnabled) {
|
||||||
|
throw Exception("MWEB is not enabled! can't calculate fee without starting the mweb server!");
|
||||||
|
}
|
||||||
|
|
||||||
if (outputs.length == 1 && outputs[0].toOutput.amount == BigInt.zero) {
|
if (outputs.length == 1 && outputs[0].toOutput.amount == BigInt.zero) {
|
||||||
outputs = [
|
outputs = [
|
||||||
BitcoinScriptOutput(
|
BitcoinScriptOutput(
|
||||||
|
|
|
@ -25,7 +25,10 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
|
||||||
super.initialChangeAddressIndex,
|
super.initialChangeAddressIndex,
|
||||||
}) : super(walletInfo) {
|
}) : super(walletInfo) {
|
||||||
if (mwebEnabled) {
|
if (mwebEnabled) {
|
||||||
topUpMweb(0);
|
// give the server a few seconds to start up before trying to get the addresses:
|
||||||
|
Future.delayed(const Duration(seconds: 5), () async {
|
||||||
|
await topUpMweb(0);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,9 +42,9 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with
|
||||||
List<String> mwebAddrs = [];
|
List<String> mwebAddrs = [];
|
||||||
|
|
||||||
Future<void> topUpMweb(int index) async {
|
Future<void> topUpMweb(int index) async {
|
||||||
|
final stub = await CwMweb.stub();
|
||||||
while (mwebAddrs.length - index < 1000) {
|
while (mwebAddrs.length - index < 1000) {
|
||||||
final length = mwebAddrs.length;
|
final length = mwebAddrs.length;
|
||||||
final stub = await CwMweb.stub();
|
|
||||||
final resp = await stub.addresses(AddressRequest(
|
final resp = await stub.addresses(AddressRequest(
|
||||||
fromIndex: length,
|
fromIndex: length,
|
||||||
toIndex: index + 1000,
|
toIndex: index + 1000,
|
||||||
|
|
|
@ -150,9 +150,9 @@ class LitecoinWalletService extends WalletService<
|
||||||
@override
|
@override
|
||||||
Future<LitecoinWallet> restoreFromSeed(BitcoinRestoreWalletFromSeedCredentials credentials,
|
Future<LitecoinWallet> restoreFromSeed(BitcoinRestoreWalletFromSeedCredentials credentials,
|
||||||
{bool? isTestnet}) async {
|
{bool? isTestnet}) async {
|
||||||
if (!validateMnemonic(credentials.mnemonic) && !bip39.validateMnemonic(credentials.mnemonic)) {
|
// if (!validateMnemonic(credentials.mnemonic) && !bip39.validateMnemonic(credentials.mnemonic)) {
|
||||||
throw LitecoinMnemonicIsIncorrectException();
|
// throw LitecoinMnemonicIsIncorrectException();
|
||||||
}
|
// }
|
||||||
|
|
||||||
final wallet = await LitecoinWalletBase.create(
|
final wallet = await LitecoinWalletBase.create(
|
||||||
password: credentials.password!,
|
password: credentials.password!,
|
||||||
|
|
|
@ -45,8 +45,6 @@ List<Transaction> getAllTransactions() {
|
||||||
confirmations: 0,
|
confirmations: 0,
|
||||||
blockheight: 0,
|
blockheight: 0,
|
||||||
accountIndex: i,
|
accountIndex: i,
|
||||||
addressIndex: 0,
|
|
||||||
addressIndexList: [0],
|
|
||||||
paymentId: "",
|
paymentId: "",
|
||||||
amount: fullBalance - availBalance,
|
amount: fullBalance - availBalance,
|
||||||
isSpend: false,
|
isSpend: false,
|
||||||
|
@ -247,30 +245,19 @@ Future<PendingTransactionDescription> createTransactionMultDest(
|
||||||
|
|
||||||
class Transaction {
|
class Transaction {
|
||||||
final String displayLabel;
|
final String displayLabel;
|
||||||
String get subaddressLabel => monero.Wallet_getSubaddressLabel(
|
String subaddressLabel = monero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0);
|
||||||
|
late final String address = monero.Wallet_address(
|
||||||
wptr!,
|
wptr!,
|
||||||
accountIndex: accountIndex,
|
accountIndex: 0,
|
||||||
addressIndex: addressIndex,
|
addressIndex: 0,
|
||||||
);
|
);
|
||||||
String get address => monero.Wallet_address(
|
|
||||||
wptr!,
|
|
||||||
accountIndex: accountIndex,
|
|
||||||
addressIndex: addressIndex,
|
|
||||||
);
|
|
||||||
List<String> get addressList => List.generate(addressIndexList.length, (index) =>
|
|
||||||
monero.Wallet_address(
|
|
||||||
wptr!,
|
|
||||||
accountIndex: accountIndex,
|
|
||||||
addressIndex: addressIndexList[index],
|
|
||||||
));
|
|
||||||
final String description;
|
final String description;
|
||||||
final int fee;
|
final int fee;
|
||||||
final int confirmations;
|
final int confirmations;
|
||||||
late final bool isPending = confirmations < 10;
|
late final bool isPending = confirmations < 10;
|
||||||
final int blockheight;
|
final int blockheight;
|
||||||
final int addressIndex;
|
final int addressIndex = 0;
|
||||||
final int accountIndex;
|
final int accountIndex;
|
||||||
final List<int> addressIndexList;
|
|
||||||
final String paymentId;
|
final String paymentId;
|
||||||
final int amount;
|
final int amount;
|
||||||
final bool isSpend;
|
final bool isSpend;
|
||||||
|
@ -316,8 +303,6 @@ class Transaction {
|
||||||
amount = monero.TransactionInfo_amount(txInfo),
|
amount = monero.TransactionInfo_amount(txInfo),
|
||||||
paymentId = monero.TransactionInfo_paymentId(txInfo),
|
paymentId = monero.TransactionInfo_paymentId(txInfo),
|
||||||
accountIndex = monero.TransactionInfo_subaddrAccount(txInfo),
|
accountIndex = monero.TransactionInfo_subaddrAccount(txInfo),
|
||||||
addressIndex = int.tryParse(monero.TransactionInfo_subaddrIndex(txInfo).split(", ")[0]) ?? 0,
|
|
||||||
addressIndexList = monero.TransactionInfo_subaddrIndex(txInfo).split(", ").map((e) => int.tryParse(e) ?? 0).toList(),
|
|
||||||
blockheight = monero.TransactionInfo_blockHeight(txInfo),
|
blockheight = monero.TransactionInfo_blockHeight(txInfo),
|
||||||
confirmations = monero.TransactionInfo_confirmations(txInfo),
|
confirmations = monero.TransactionInfo_confirmations(txInfo),
|
||||||
fee = monero.TransactionInfo_fee(txInfo),
|
fee = monero.TransactionInfo_fee(txInfo),
|
||||||
|
@ -331,8 +316,6 @@ class Transaction {
|
||||||
required this.confirmations,
|
required this.confirmations,
|
||||||
required this.blockheight,
|
required this.blockheight,
|
||||||
required this.accountIndex,
|
required this.accountIndex,
|
||||||
required this.addressIndexList,
|
|
||||||
required this.addressIndex,
|
|
||||||
required this.paymentId,
|
required this.paymentId,
|
||||||
required this.amount,
|
required this.amount,
|
||||||
required this.isSpend,
|
required this.isSpend,
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import 'package:cw_core/subaddress.dart';
|
import 'package:cw_core/subaddress.dart';
|
||||||
import 'package:cw_monero/api/coins_info.dart';
|
import 'package:cw_monero/api/coins_info.dart';
|
||||||
import 'package:cw_monero/api/subaddress_list.dart' as subaddress_list;
|
import 'package:cw_monero/api/subaddress_list.dart' as subaddress_list;
|
||||||
import 'package:cw_monero/api/wallet.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:mobx/mobx.dart';
|
import 'package:mobx/mobx.dart';
|
||||||
|
|
||||||
|
@ -104,9 +103,6 @@ abstract class MoneroSubaddressListBase with Store {
|
||||||
required List<String> usedAddresses,
|
required List<String> usedAddresses,
|
||||||
}) async {
|
}) async {
|
||||||
_usedAddresses.addAll(usedAddresses);
|
_usedAddresses.addAll(usedAddresses);
|
||||||
final _all = _usedAddresses.toSet().toList();
|
|
||||||
_usedAddresses.clear();
|
|
||||||
_usedAddresses.addAll(_all);
|
|
||||||
if (_isUpdating) {
|
if (_isUpdating) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -128,7 +124,7 @@ abstract class MoneroSubaddressListBase with Store {
|
||||||
Future<List<Subaddress>> _getAllUnusedAddresses(
|
Future<List<Subaddress>> _getAllUnusedAddresses(
|
||||||
{required int accountIndex, required String label}) async {
|
{required int accountIndex, required String label}) async {
|
||||||
final allAddresses = subaddress_list.getAllSubaddresses();
|
final allAddresses = subaddress_list.getAllSubaddresses();
|
||||||
if (allAddresses.isEmpty || _usedAddresses.contains(allAddresses.first.address)) {
|
if (allAddresses.isEmpty || _usedAddresses.contains(allAddresses.last)) {
|
||||||
final isAddressUnused = await _newSubaddress(accountIndex: accountIndex, label: label);
|
final isAddressUnused = await _newSubaddress(accountIndex: accountIndex, label: label);
|
||||||
if (!isAddressUnused) {
|
if (!isAddressUnused) {
|
||||||
return await _getAllUnusedAddresses(accountIndex: accountIndex, label: label);
|
return await _getAllUnusedAddresses(accountIndex: accountIndex, label: label);
|
||||||
|
@ -147,7 +143,8 @@ abstract class MoneroSubaddressListBase with Store {
|
||||||
label.toLowerCase() == 'Primary account'.toLowerCase()
|
label.toLowerCase() == 'Primary account'.toLowerCase()
|
||||||
? 'Primary address'
|
? 'Primary address'
|
||||||
: label);
|
: label);
|
||||||
}).toList().reversed.toList();
|
})
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _newSubaddress({required int accountIndex, required String label}) async {
|
Future<bool> _newSubaddress({required int accountIndex, required String label}) async {
|
||||||
|
|
|
@ -13,11 +13,9 @@ import 'package:cw_core/monero_transaction_priority.dart';
|
||||||
import 'package:cw_core/monero_wallet_keys.dart';
|
import 'package:cw_core/monero_wallet_keys.dart';
|
||||||
import 'package:cw_core/monero_wallet_utils.dart';
|
import 'package:cw_core/monero_wallet_utils.dart';
|
||||||
import 'package:cw_core/node.dart';
|
import 'package:cw_core/node.dart';
|
||||||
import 'package:cw_core/pathForWallet.dart';
|
|
||||||
import 'package:cw_core/pending_transaction.dart';
|
import 'package:cw_core/pending_transaction.dart';
|
||||||
import 'package:cw_core/sync_status.dart';
|
import 'package:cw_core/sync_status.dart';
|
||||||
import 'package:cw_core/transaction_direction.dart';
|
import 'package:cw_core/transaction_direction.dart';
|
||||||
import 'package:cw_core/transaction_priority.dart';
|
|
||||||
import 'package:cw_core/unspent_coins_info.dart';
|
import 'package:cw_core/unspent_coins_info.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';
|
||||||
|
@ -88,9 +86,6 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
|
||||||
reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
|
reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
|
||||||
_updateSubAddress(enabled, account: walletAddresses.account);
|
_updateSubAddress(enabled, account: walletAddresses.account);
|
||||||
});
|
});
|
||||||
reaction((_) => transactionHistory, (__) {
|
|
||||||
_updateSubAddress(isEnabledAutoGenerateSubaddress, account: walletAddresses.account);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int _autoSaveInterval = 30;
|
static const int _autoSaveInterval = 30;
|
||||||
|
@ -133,7 +128,6 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
|
||||||
|
|
||||||
monero_wallet.SyncListener? _listener;
|
monero_wallet.SyncListener? _listener;
|
||||||
ReactionDisposer? _onAccountChangeReaction;
|
ReactionDisposer? _onAccountChangeReaction;
|
||||||
ReactionDisposer? _onTxHistoryChangeReaction;
|
|
||||||
bool _isTransactionUpdating;
|
bool _isTransactionUpdating;
|
||||||
bool _hasSyncAfterStartup;
|
bool _hasSyncAfterStartup;
|
||||||
Timer? _autoSaveTimer;
|
Timer? _autoSaveTimer;
|
||||||
|
@ -173,7 +167,6 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
|
||||||
void close() async {
|
void close() async {
|
||||||
_listener?.stop();
|
_listener?.stop();
|
||||||
_onAccountChangeReaction?.reaction.dispose();
|
_onAccountChangeReaction?.reaction.dispose();
|
||||||
_onTxHistoryChangeReaction?.reaction.dispose();
|
|
||||||
_autoSaveTimer?.cancel();
|
_autoSaveTimer?.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ import 'package:cw_core/address_info.dart';
|
||||||
import 'package:cw_core/subaddress.dart';
|
import 'package:cw_core/subaddress.dart';
|
||||||
import 'package:cw_core/wallet_addresses.dart';
|
import 'package:cw_core/wallet_addresses.dart';
|
||||||
import 'package:cw_core/wallet_info.dart';
|
import 'package:cw_core/wallet_info.dart';
|
||||||
import 'package:cw_monero/api/transaction_history.dart';
|
|
||||||
import 'package:cw_monero/api/wallet.dart';
|
import 'package:cw_monero/api/wallet.dart';
|
||||||
import 'package:cw_monero/monero_account_list.dart';
|
import 'package:cw_monero/monero_account_list.dart';
|
||||||
import 'package:cw_monero/monero_subaddress_list.dart';
|
import 'package:cw_monero/monero_subaddress_list.dart';
|
||||||
|
@ -38,25 +37,6 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store {
|
||||||
|
|
||||||
MoneroAccountList accountList;
|
MoneroAccountList accountList;
|
||||||
|
|
||||||
@override
|
|
||||||
Set<String> get usedAddresses {
|
|
||||||
final txs = getAllTransactions();
|
|
||||||
final adds = _originalUsedAddresses.toList();
|
|
||||||
for (var i = 0; i < txs.length; i++) {
|
|
||||||
for (var j = 0; j < txs[i].addressList.length; j++) {
|
|
||||||
adds.add(txs[i].addressList[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return adds.toSet();
|
|
||||||
}
|
|
||||||
|
|
||||||
Set<String> _originalUsedAddresses = Set();
|
|
||||||
|
|
||||||
@override
|
|
||||||
set usedAddresses(Set<String> _usedAddresses) {
|
|
||||||
_originalUsedAddresses = _usedAddresses;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> init() async {
|
Future<void> init() async {
|
||||||
accountList.update();
|
accountList.update();
|
||||||
|
|
|
@ -28,9 +28,12 @@ class CwMwebPlugin: FlutterPlugin, MethodCallHandler {
|
||||||
|
|
||||||
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
|
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
|
||||||
if (call.method == "start") {
|
if (call.method == "start") {
|
||||||
|
server?.stop()
|
||||||
val dataDir = call.argument("dataDir") ?: ""
|
val dataDir = call.argument("dataDir") ?: ""
|
||||||
|
// server = server ?: Mwebd.newServer("", dataDir, "")
|
||||||
|
// port = port ?: server?.start(0)
|
||||||
server = server ?: Mwebd.newServer("", dataDir, "")
|
server = server ?: Mwebd.newServer("", dataDir, "")
|
||||||
port = port ?: server?.start(0)
|
port = server?.start(0)
|
||||||
result.success(port)
|
result.success(port)
|
||||||
} else if (call.method == "stop") {
|
} else if (call.method == "stop") {
|
||||||
server?.stop()
|
server?.stop()
|
||||||
|
|
|
@ -18,6 +18,7 @@ public class CwMwebPlugin: NSObject, FlutterPlugin {
|
||||||
case "getPlatformVersion":
|
case "getPlatformVersion":
|
||||||
result("iOS " + UIDevice.current.systemVersion)
|
result("iOS " + UIDevice.current.systemVersion)
|
||||||
case "start":
|
case "start":
|
||||||
|
stopServer()
|
||||||
let args = call.arguments as? [String: String]
|
let args = call.arguments as? [String: String]
|
||||||
let dataDir = args?["dataDir"]
|
let dataDir = args?["dataDir"]
|
||||||
CwMwebPlugin.dataDir = dataDir
|
CwMwebPlugin.dataDir = dataDir
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:grpc/grpc.dart';
|
import 'package:grpc/grpc.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'cw_mweb_platform_interface.dart';
|
import 'cw_mweb_platform_interface.dart';
|
||||||
|
|
|
@ -45,8 +45,6 @@ List<Transaction> getAllTransactions() {
|
||||||
confirmations: 0,
|
confirmations: 0,
|
||||||
blockheight: 0,
|
blockheight: 0,
|
||||||
accountIndex: i,
|
accountIndex: i,
|
||||||
addressIndex: 0,
|
|
||||||
addressIndexList: [0],
|
|
||||||
paymentId: "",
|
paymentId: "",
|
||||||
amount: fullBalance - availBalance,
|
amount: fullBalance - availBalance,
|
||||||
isSpend: false,
|
isSpend: false,
|
||||||
|
@ -245,26 +243,19 @@ Future<PendingTransactionDescription> createTransactionMultDest(
|
||||||
|
|
||||||
class Transaction {
|
class Transaction {
|
||||||
final String displayLabel;
|
final String displayLabel;
|
||||||
String get subaddressLabel => wownero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0);
|
String subaddressLabel = wownero.Wallet_getSubaddressLabel(wptr!, accountIndex: 0, addressIndex: 0);
|
||||||
String get address => wownero.Wallet_address(
|
late final String address = wownero.Wallet_address(
|
||||||
wptr!,
|
wptr!,
|
||||||
accountIndex: accountIndex,
|
accountIndex: 0,
|
||||||
addressIndex: addressIndex,
|
addressIndex: 0,
|
||||||
);
|
);
|
||||||
List<String> get addressList => List.generate(addressIndexList.length, (index) =>
|
|
||||||
wownero.Wallet_address(
|
|
||||||
wptr!,
|
|
||||||
accountIndex: accountIndex,
|
|
||||||
addressIndex: addressIndexList[index],
|
|
||||||
));
|
|
||||||
final String description;
|
final String description;
|
||||||
final int fee;
|
final int fee;
|
||||||
final int confirmations;
|
final int confirmations;
|
||||||
late final bool isPending = confirmations < 3;
|
late final bool isPending = confirmations < 3;
|
||||||
final int blockheight;
|
final int blockheight;
|
||||||
final int addressIndex;
|
final int addressIndex = 0;
|
||||||
final int accountIndex;
|
final int accountIndex;
|
||||||
final List<int> addressIndexList;
|
|
||||||
final String paymentId;
|
final String paymentId;
|
||||||
final int amount;
|
final int amount;
|
||||||
final bool isSpend;
|
final bool isSpend;
|
||||||
|
@ -310,8 +301,6 @@ class Transaction {
|
||||||
amount = wownero.TransactionInfo_amount(txInfo),
|
amount = wownero.TransactionInfo_amount(txInfo),
|
||||||
paymentId = wownero.TransactionInfo_paymentId(txInfo),
|
paymentId = wownero.TransactionInfo_paymentId(txInfo),
|
||||||
accountIndex = wownero.TransactionInfo_subaddrAccount(txInfo),
|
accountIndex = wownero.TransactionInfo_subaddrAccount(txInfo),
|
||||||
addressIndex = int.tryParse(wownero.TransactionInfo_subaddrIndex(txInfo).split(", ")[0]) ?? 0,
|
|
||||||
addressIndexList = wownero.TransactionInfo_subaddrIndex(txInfo).split(", ").map((e) => int.tryParse(e) ?? 0).toList(),
|
|
||||||
blockheight = wownero.TransactionInfo_blockHeight(txInfo),
|
blockheight = wownero.TransactionInfo_blockHeight(txInfo),
|
||||||
confirmations = wownero.TransactionInfo_confirmations(txInfo),
|
confirmations = wownero.TransactionInfo_confirmations(txInfo),
|
||||||
fee = wownero.TransactionInfo_fee(txInfo),
|
fee = wownero.TransactionInfo_fee(txInfo),
|
||||||
|
@ -325,8 +314,6 @@ class Transaction {
|
||||||
required this.confirmations,
|
required this.confirmations,
|
||||||
required this.blockheight,
|
required this.blockheight,
|
||||||
required this.accountIndex,
|
required this.accountIndex,
|
||||||
required this.addressIndex,
|
|
||||||
required this.addressIndexList,
|
|
||||||
required this.paymentId,
|
required this.paymentId,
|
||||||
required this.amount,
|
required this.amount,
|
||||||
required this.isSpend,
|
required this.isSpend,
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import 'package:cw_core/subaddress.dart';
|
import 'package:cw_core/subaddress.dart';
|
||||||
import 'package:cw_wownero/api/coins_info.dart';
|
import 'package:cw_wownero/api/coins_info.dart';
|
||||||
import 'package:cw_wownero/api/subaddress_list.dart' as subaddress_list;
|
import 'package:cw_wownero/api/subaddress_list.dart' as subaddress_list;
|
||||||
import 'package:cw_wownero/api/wallet.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:mobx/mobx.dart';
|
import 'package:mobx/mobx.dart';
|
||||||
|
|
||||||
|
@ -104,9 +103,6 @@ abstract class WowneroSubaddressListBase with Store {
|
||||||
required List<String> usedAddresses,
|
required List<String> usedAddresses,
|
||||||
}) async {
|
}) async {
|
||||||
_usedAddresses.addAll(usedAddresses);
|
_usedAddresses.addAll(usedAddresses);
|
||||||
final _all = _usedAddresses.toSet().toList();
|
|
||||||
_usedAddresses.clear();
|
|
||||||
_usedAddresses.addAll(_all);
|
|
||||||
if (_isUpdating) {
|
if (_isUpdating) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,10 +82,6 @@ abstract class WowneroWalletBase
|
||||||
reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
|
reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
|
||||||
_updateSubAddress(enabled, account: walletAddresses.account);
|
_updateSubAddress(enabled, account: walletAddresses.account);
|
||||||
});
|
});
|
||||||
|
|
||||||
_onTxHistoryChangeReaction = reaction((_) => transactionHistory, (__) {
|
|
||||||
_updateSubAddress(isEnabledAutoGenerateSubaddress, account: walletAddresses.account);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int _autoSaveInterval = 30;
|
static const int _autoSaveInterval = 30;
|
||||||
|
@ -127,7 +123,6 @@ abstract class WowneroWalletBase
|
||||||
|
|
||||||
wownero_wallet.SyncListener? _listener;
|
wownero_wallet.SyncListener? _listener;
|
||||||
ReactionDisposer? _onAccountChangeReaction;
|
ReactionDisposer? _onAccountChangeReaction;
|
||||||
ReactionDisposer? _onTxHistoryChangeReaction;
|
|
||||||
bool _isTransactionUpdating;
|
bool _isTransactionUpdating;
|
||||||
bool _hasSyncAfterStartup;
|
bool _hasSyncAfterStartup;
|
||||||
Timer? _autoSaveTimer;
|
Timer? _autoSaveTimer;
|
||||||
|
@ -163,7 +158,6 @@ abstract class WowneroWalletBase
|
||||||
void close() async {
|
void close() async {
|
||||||
_listener?.stop();
|
_listener?.stop();
|
||||||
_onAccountChangeReaction?.reaction.dispose();
|
_onAccountChangeReaction?.reaction.dispose();
|
||||||
_onTxHistoryChangeReaction?.reaction.dispose();
|
|
||||||
_autoSaveTimer?.cancel();
|
_autoSaveTimer?.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ import 'package:cw_core/address_info.dart';
|
||||||
import 'package:cw_core/subaddress.dart';
|
import 'package:cw_core/subaddress.dart';
|
||||||
import 'package:cw_core/wallet_addresses.dart';
|
import 'package:cw_core/wallet_addresses.dart';
|
||||||
import 'package:cw_core/wallet_info.dart';
|
import 'package:cw_core/wallet_info.dart';
|
||||||
import 'package:cw_wownero/api/transaction_history.dart';
|
|
||||||
import 'package:cw_wownero/api/wallet.dart';
|
import 'package:cw_wownero/api/wallet.dart';
|
||||||
import 'package:cw_wownero/wownero_account_list.dart';
|
import 'package:cw_wownero/wownero_account_list.dart';
|
||||||
import 'package:cw_wownero/wownero_subaddress_list.dart';
|
import 'package:cw_wownero/wownero_subaddress_list.dart';
|
||||||
|
@ -37,24 +36,7 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store {
|
||||||
WowneroSubaddressList subaddressList;
|
WowneroSubaddressList subaddressList;
|
||||||
|
|
||||||
WowneroAccountList accountList;
|
WowneroAccountList accountList;
|
||||||
@override
|
|
||||||
Set<String> get usedAddresses {
|
|
||||||
final txs = getAllTransactions();
|
|
||||||
final adds = _originalUsedAddresses.toList();
|
|
||||||
for (var i = 0; i < txs.length; i++) {
|
|
||||||
for (var j = 0; j < txs[i].addressList.length; j++) {
|
|
||||||
adds.add(txs[i].addressList[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return adds.toSet();
|
|
||||||
}
|
|
||||||
|
|
||||||
Set<String> _originalUsedAddresses = Set();
|
|
||||||
|
|
||||||
@override
|
|
||||||
set usedAddresses(Set<String> _usedAddresses) {
|
|
||||||
_originalUsedAddresses = _usedAddresses;
|
|
||||||
}
|
|
||||||
@override
|
@override
|
||||||
Future<void> init() async {
|
Future<void> init() async {
|
||||||
accountList.update();
|
accountList.update();
|
||||||
|
|
|
@ -24,7 +24,9 @@ void startCheckConnectionReaction(WalletBase wallet, SettingsStore settingsStore
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wallet.syncStatus is LostConnectionSyncStatus || wallet.syncStatus is FailedSyncStatus) {
|
if (wallet.type != WalletType.bitcoin &&
|
||||||
|
(wallet.syncStatus is LostConnectionSyncStatus ||
|
||||||
|
wallet.syncStatus is FailedSyncStatus)) {
|
||||||
final alive = await settingsStore.getCurrentNode(wallet.type).requestNode();
|
final alive = await settingsStore.getCurrentNode(wallet.type).requestNode();
|
||||||
|
|
||||||
if (alive) {
|
if (alive) {
|
||||||
|
|
|
@ -70,6 +70,8 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
bool? testnetValue;
|
bool? testnetValue;
|
||||||
|
|
||||||
|
bool obscurePassphrase = true;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
passphraseController.text = widget.seedTypeViewModel.passphrase ?? '';
|
passphraseController.text = widget.seedTypeViewModel.passphrase ?? '';
|
||||||
|
@ -138,27 +140,36 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
if (!widget.isFromRestore) ...[
|
if (!widget.isFromRestore) ...[
|
||||||
Observer(builder: (_) {
|
Observer(builder: (_) {
|
||||||
if (widget.privacySettingsViewModel.hasSeedPhraseLengthOption)
|
if (widget.privacySettingsViewModel.hasSeedPhraseLengthOption)
|
||||||
return SettingsPickerCell<SeedPhraseLength>(
|
return SettingsPickerCell<SeedPhraseLength>(
|
||||||
title: S.current.seed_phrase_length,
|
title: S.current.seed_phrase_length,
|
||||||
items: SeedPhraseLength.values,
|
items: SeedPhraseLength.values,
|
||||||
selectedItem: widget.privacySettingsViewModel.seedPhraseLength,
|
selectedItem: widget.privacySettingsViewModel.seedPhraseLength,
|
||||||
onItemSelected: (SeedPhraseLength length) {
|
onItemSelected: (SeedPhraseLength length) {
|
||||||
widget.privacySettingsViewModel.setSeedPhraseLength(length);
|
widget.privacySettingsViewModel.setSeedPhraseLength(length);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
return Container();
|
return Container();
|
||||||
}),
|
}),
|
||||||
if (widget.privacySettingsViewModel.hasPassphraseOption)
|
if (widget.privacySettingsViewModel.hasPassphraseOption)
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.all(24),
|
padding: EdgeInsets.all(24),
|
||||||
child: BaseTextFormField(
|
child: BaseTextFormField(
|
||||||
hintText: S.current.passphrase,
|
hintText: S.current.passphrase,
|
||||||
controller: passphraseController,
|
controller: passphraseController,
|
||||||
obscureText: true,
|
obscureText: obscurePassphrase,
|
||||||
|
suffixIcon: GestureDetector(
|
||||||
|
onTap: () => setState(() {
|
||||||
|
obscurePassphrase = !obscurePassphrase;
|
||||||
|
}),
|
||||||
|
child: Icon(
|
||||||
|
Icons.remove_red_eye,
|
||||||
|
color: obscurePassphrase ? Colors.black54 : Colors.black26,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
],
|
],
|
||||||
Observer(builder: (_) {
|
Observer(builder: (_) {
|
||||||
return Column(
|
return Column(
|
||||||
|
|
|
@ -172,7 +172,6 @@ class ExceptionHandler {
|
||||||
"Error while launching http",
|
"Error while launching http",
|
||||||
"OS Error: Network is unreachable",
|
"OS Error: Network is unreachable",
|
||||||
"ClientException: Write failed, uri=http",
|
"ClientException: Write failed, uri=http",
|
||||||
"Connection terminated during handshake",
|
|
||||||
"Corrupted wallets seeds",
|
"Corrupted wallets seeds",
|
||||||
"bad_alloc",
|
"bad_alloc",
|
||||||
"does not correspond",
|
"does not correspond",
|
||||||
|
|
|
@ -15,15 +15,15 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
|
||||||
APP_ANDROID_TYPE=$1
|
APP_ANDROID_TYPE=$1
|
||||||
|
|
||||||
MONERO_COM_NAME="Monero.com"
|
MONERO_COM_NAME="Monero.com"
|
||||||
MONERO_COM_VERSION="1.16.4"
|
MONERO_COM_VERSION="1.16.5"
|
||||||
MONERO_COM_BUILD_NUMBER=98
|
MONERO_COM_BUILD_NUMBER=100
|
||||||
MONERO_COM_BUNDLE_ID="com.monero.app"
|
MONERO_COM_BUNDLE_ID="com.monero.app"
|
||||||
MONERO_COM_PACKAGE="com.monero.app"
|
MONERO_COM_PACKAGE="com.monero.app"
|
||||||
MONERO_COM_SCHEME="monero.com"
|
MONERO_COM_SCHEME="monero.com"
|
||||||
|
|
||||||
CAKEWALLET_NAME="Cake Wallet"
|
CAKEWALLET_NAME="Cake Wallet"
|
||||||
CAKEWALLET_VERSION="4.19.4"
|
CAKEWALLET_VERSION="4.19.5"
|
||||||
CAKEWALLET_BUILD_NUMBER=225
|
CAKEWALLET_BUILD_NUMBER=227
|
||||||
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
|
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
|
||||||
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
|
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
|
||||||
CAKEWALLET_SCHEME="cakewallet"
|
CAKEWALLET_SCHEME="cakewallet"
|
||||||
|
|
|
@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
|
||||||
APP_IOS_TYPE=$1
|
APP_IOS_TYPE=$1
|
||||||
|
|
||||||
MONERO_COM_NAME="Monero.com"
|
MONERO_COM_NAME="Monero.com"
|
||||||
MONERO_COM_VERSION="1.16.4"
|
MONERO_COM_VERSION="1.16.5"
|
||||||
MONERO_COM_BUILD_NUMBER=96
|
MONERO_COM_BUILD_NUMBER=98
|
||||||
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
||||||
|
|
||||||
CAKEWALLET_NAME="Cake Wallet"
|
CAKEWALLET_NAME="Cake Wallet"
|
||||||
CAKEWALLET_VERSION="4.19.4"
|
CAKEWALLET_VERSION="4.19.5"
|
||||||
CAKEWALLET_BUILD_NUMBER=263
|
CAKEWALLET_BUILD_NUMBER=266
|
||||||
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
||||||
|
|
||||||
HAVEN_NAME="Haven"
|
HAVEN_NAME="Haven"
|
||||||
|
|
|
@ -14,8 +14,8 @@ if [ -n "$1" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CAKEWALLET_NAME="Cake Wallet"
|
CAKEWALLET_NAME="Cake Wallet"
|
||||||
CAKEWALLET_VERSION="1.9.4"
|
CAKEWALLET_VERSION="1.9.5"
|
||||||
CAKEWALLET_BUILD_NUMBER=31
|
CAKEWALLET_BUILD_NUMBER=33
|
||||||
|
|
||||||
if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then
|
if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then
|
||||||
echo "Wrong app type."
|
echo "Wrong app type."
|
||||||
|
|
|
@ -16,13 +16,13 @@ if [ -n "$1" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MONERO_COM_NAME="Monero.com"
|
MONERO_COM_NAME="Monero.com"
|
||||||
MONERO_COM_VERSION="1.6.4"
|
MONERO_COM_VERSION="1.6.5"
|
||||||
MONERO_COM_BUILD_NUMBER=28
|
MONERO_COM_BUILD_NUMBER=31
|
||||||
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
||||||
|
|
||||||
CAKEWALLET_NAME="Cake Wallet"
|
CAKEWALLET_NAME="Cake Wallet"
|
||||||
CAKEWALLET_VERSION="1.12.4"
|
CAKEWALLET_VERSION="1.12.5"
|
||||||
CAKEWALLET_BUILD_NUMBER=85
|
CAKEWALLET_BUILD_NUMBER=88
|
||||||
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
||||||
|
|
||||||
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
|
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#define MyAppName "Cake Wallet"
|
#define MyAppName "Cake Wallet"
|
||||||
#define MyAppVersion "0.0.5"
|
#define MyAppVersion "0.0.6"
|
||||||
#define MyAppPublisher "Cake Labs LLC"
|
#define MyAppPublisher "Cake Labs LLC"
|
||||||
#define MyAppURL "https://cakewallet.com/"
|
#define MyAppURL "https://cakewallet.com/"
|
||||||
#define MyAppExeName "CakeWallet.exe"
|
#define MyAppExeName "CakeWallet.exe"
|
||||||
|
|
|
@ -79,7 +79,6 @@ import 'dart:typed_data';
|
||||||
import 'package:bitcoin_base/bitcoin_base.dart';
|
import 'package:bitcoin_base/bitcoin_base.dart';
|
||||||
import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart';
|
import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart';
|
||||||
import 'package:cake_wallet/view_model/send/output.dart';
|
import 'package:cake_wallet/view_model/send/output.dart';
|
||||||
import 'package:cw_bitcoin/electrum_transaction_info.dart';
|
|
||||||
import 'package:cw_core/hardware/hardware_account_data.dart';
|
import 'package:cw_core/hardware/hardware_account_data.dart';
|
||||||
import 'package:cw_core/node.dart';
|
import 'package:cw_core/node.dart';
|
||||||
import 'package:cw_core/output_info.dart';
|
import 'package:cw_core/output_info.dart';
|
||||||
|
@ -102,6 +101,7 @@ import 'package:bip39/bip39.dart' as bip39;
|
||||||
import 'package:cw_bitcoin/utils.dart';
|
import 'package:cw_bitcoin/utils.dart';
|
||||||
import 'package:cw_bitcoin/electrum_derivations.dart';
|
import 'package:cw_bitcoin/electrum_derivations.dart';
|
||||||
import 'package:cw_bitcoin/electrum.dart';
|
import 'package:cw_bitcoin/electrum.dart';
|
||||||
|
import 'package:cw_bitcoin/electrum_transaction_info.dart';
|
||||||
import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
|
import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
|
||||||
import 'package:cw_bitcoin/bitcoin_receive_page_option.dart';
|
import 'package:cw_bitcoin/bitcoin_receive_page_option.dart';
|
||||||
import 'package:cw_bitcoin/bitcoin_wallet.dart';
|
import 'package:cw_bitcoin/bitcoin_wallet.dart';
|
||||||
|
|
|
@ -87,18 +87,12 @@ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x8
|
||||||
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/wownero/x86_64-w64-mingw32_libwallet2_api_c.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "wownero_libwallet2_api_c.dll"
|
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/wownero/x86_64-w64-mingw32_libwallet2_api_c.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "wownero_libwallet2_api_c.dll"
|
||||||
COMPONENT Runtime)
|
COMPONENT Runtime)
|
||||||
|
|
||||||
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x86_64-w64-mingw32_libgcc_s_seh-1.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libgcc_s_seh-1.dll"
|
|
||||||
COMPONENT Runtime)
|
|
||||||
|
|
||||||
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x86_64-w64-mingw32_libpolyseed.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libpolyseed.dll"
|
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x86_64-w64-mingw32_libpolyseed.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libpolyseed.dll"
|
||||||
COMPONENT Runtime)
|
COMPONENT Runtime)
|
||||||
|
|
||||||
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x86_64-w64-mingw32_libssp-0.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libssp-0.dll"
|
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x86_64-w64-mingw32_libssp-0.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libssp-0.dll"
|
||||||
COMPONENT Runtime)
|
COMPONENT Runtime)
|
||||||
|
|
||||||
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x86_64-w64-mingw32_libstdc++-6.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libstdc++-6.dll"
|
|
||||||
COMPONENT Runtime)
|
|
||||||
|
|
||||||
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x86_64-w64-mingw32_libwinpthread-1.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libwinpthread-1.dll"
|
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/monero_c/release/monero/x86_64-w64-mingw32_libwinpthread-1.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" RENAME "libwinpthread-1.dll"
|
||||||
COMPONENT Runtime)
|
COMPONENT Runtime)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue