diff --git a/assets/images/lightning_menu.png b/assets/images/lightning_menu.png deleted file mode 100644 index 949f8d879..000000000 Binary files a/assets/images/lightning_menu.png and /dev/null differ diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 3921d162b..84e565201 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -44,14 +44,6 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { initialBalance: initialBalance, seedBytes: seedBytes, currency: CryptoCurrency.btc, - balanceFactory: ( - {required int confirmed, required int unconfirmed, required int frozen}) { - return ElectrumBalance( - confirmed: confirmed, - unconfirmed: unconfirmed, - frozen: frozen, - ); - }, ) { walletAddresses = BitcoinWalletAddresses( walletInfo, diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 4054de11e..873fe2977 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -23,7 +23,6 @@ import 'package:cw_bitcoin/litecoin_network.dart'; import 'package:cw_bitcoin/pending_bitcoin_transaction.dart'; import 'package:cw_bitcoin/script_hash.dart'; import 'package:cw_bitcoin/utils.dart'; -import 'package:cw_core/balance.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/node.dart'; import 'package:cw_core/pathForWallet.dart'; @@ -36,6 +35,7 @@ import 'package:cw_core/utils/file.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:flutter/foundation.dart'; +import 'package:hex/hex.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:rxdart/subjects.dart'; @@ -45,8 +45,9 @@ part 'electrum_wallet.g.dart'; class ElectrumWallet = ElectrumWalletBase with _$ElectrumWallet; -abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT extends ElectrumTransactionInfo> - extends WalletBase<BalanceT, ElectrumTransactionHistory, TxInfoT> with Store { +abstract class ElectrumWalletBase + extends WalletBase<ElectrumBalance, ElectrumTransactionHistory, ElectrumTransactionInfo> + with Store { ElectrumWalletBase( {required String password, required WalletInfo walletInfo, @@ -54,15 +55,9 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte required this.networkType, required this.mnemonic, required Uint8List seedBytes, - required BalanceT Function({ - required int confirmed, - required int unconfirmed, - required int frozen, - }) this.balanceFactory, - // required TxInfoT Function(Map<String, dynamic> json) TxInfoFactory, List<BitcoinAddressRecord>? initialAddresses, ElectrumClient? electrumClient, - BalanceT? initialBalance, + ElectrumBalance? initialBalance, CryptoCurrency? currency}) : hd = currency == CryptoCurrency.bch ? bitcoinCashHDWallet(seedBytes) @@ -74,8 +69,12 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte isEnabledAutoGenerateSubaddress = true, unspentCoins = [], _scripthashesUpdateSubject = {}, - balance = ObservableMap<CryptoCurrency, BalanceT>.of( - currency != null ? {currency: initialBalance ?? balanceFactory(confirmed: 0, unconfirmed: 0, frozen: 0)} : {}), + balance = ObservableMap<CryptoCurrency, ElectrumBalance>.of(currency != null + ? { + currency: + initialBalance ?? const ElectrumBalance(confirmed: 0, unconfirmed: 0, frozen: 0) + } + : {}), this.unspentCoinsInfo = unspentCoinsInfo, this.network = networkType == bitcoin.bitcoin ? BitcoinNetwork.mainnet @@ -97,11 +96,6 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte final bitcoin.HDWallet hd; final String mnemonic; - final BalanceT Function({ - required int confirmed, - required int unconfirmed, - required int frozen, - }) balanceFactory; @override @observable @@ -115,7 +109,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte @override @observable - late ObservableMap<CryptoCurrency, BalanceT> balance; + late ObservableMap<CryptoCurrency, ElectrumBalance> balance; @override @observable @@ -291,7 +285,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte final totalAmount = amount + fee; - if (totalAmount > (balance[currency]!.confirmed as int)) { + if (totalAmount > balance[currency]!.confirmed) { throw BitcoinTransactionWrongBalanceException(currency); } @@ -629,16 +623,23 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte final ins = <bitcoin_base.BtcTransaction>[]; for (final vin in original.inputs) { - final txHex = await electrumClient.getTransactionHex(hash: vin.txId); - final tx = bitcoin_base.BtcTransaction.fromRaw(txHex); - ins.add(tx); + try { + final id = HEX.encode(HEX.decode(vin.txId).reversed.toList()); + final txHex = await electrumClient.getTransactionHex(hash: id); + final tx = bitcoin_base.BtcTransaction.fromRaw(txHex); + ins.add(tx); + } catch (_) { + ins.add(bitcoin_base.BtcTransaction.fromRaw( + await electrumClient.getTransactionHex(hash: vin.txId), + )); + } } return ElectrumTransactionBundle(original, ins: ins, time: time, confirmations: confirmations, height: height); } - Future<TxInfoT?> fetchTransactionInfo( + Future<ElectrumTransactionInfo?> fetchTransactionInfo( {required String hash, required int height, required Set<String> myAddresses, @@ -646,7 +647,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte try { return ElectrumTransactionInfo.fromElectrumBundle( await getTransactionExpanded(hash: hash, height: height), walletInfo.type, network, - addresses: myAddresses, height: height) as TxInfoT; + addresses: myAddresses, height: height); } catch (e) { if (e is FormatException && retryOnFailure == true) { await Future.delayed(const Duration(seconds: 2)); @@ -657,9 +658,9 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte } @override - Future<Map<String, TxInfoT>> fetchTransactions() async { + Future<Map<String, ElectrumTransactionInfo>> fetchTransactions() async { try { - final Map<String, TxInfoT> historiesWithDetails = {}; + final Map<String, ElectrumTransactionInfo> historiesWithDetails = {}; final addressesSet = walletAddresses.allAddresses.map((addr) => addr.address).toSet(); final currentHeight = await electrumClient.getCurrentBlockChainTip() ?? 0; @@ -699,10 +700,10 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte } } - Future<Map<String, TxInfoT>> _fetchAddressHistory( + Future<Map<String, ElectrumTransactionInfo>> _fetchAddressHistory( BitcoinAddressRecord addressRecord, Set<String> addressesSet, int currentHeight) async { try { - final Map<String, TxInfoT> historiesWithDetails = {}; + final Map<String, ElectrumTransactionInfo> historiesWithDetails = {}; final history = await electrumClient .getHistory(addressRecord.scriptHash ?? addressRecord.updateScriptHash(network)); @@ -723,7 +724,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte storedTx.isPending = storedTx.confirmations == 0; } - historiesWithDetails[txid] = storedTx as TxInfoT; + historiesWithDetails[txid] = storedTx; } else { final tx = await fetchTransactionInfo( hash: txid, height: height, myAddresses: addressesSet, retryOnFailure: true); @@ -787,7 +788,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte }); } - Future<BalanceT> _fetchBalances() async { + Future<ElectrumBalance> _fetchBalances() async { final addresses = walletAddresses.allAddresses.toList(); final balanceFutures = <Future<Map<String, dynamic>>>[]; for (var i = 0; i < addresses.length; i++) { @@ -827,15 +828,8 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte } } - // return balanceFactory() - // ..confirmed = totalConfirmed - // ..unconfirmed = totalUnconfirmed - // ..frozen = totalFrozen; - return balanceFactory( - confirmed: totalConfirmed, - unconfirmed: totalUnconfirmed, - frozen: totalFrozen, - ); + return ElectrumBalance( + confirmed: totalConfirmed, unconfirmed: totalUnconfirmed, frozen: totalFrozen); } Future<void> updateBalance() async { diff --git a/cw_bitcoin/lib/litecoin_wallet.dart b/cw_bitcoin/lib/litecoin_wallet.dart index 925a2778b..80f6fc6a0 100644 --- a/cw_bitcoin/lib/litecoin_wallet.dart +++ b/cw_bitcoin/lib/litecoin_wallet.dart @@ -42,14 +42,6 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { initialBalance: initialBalance, seedBytes: seedBytes, currency: CryptoCurrency.ltc, - balanceFactory: ( - {required int confirmed, required int unconfirmed, required int frozen}) { - return ElectrumBalance( - confirmed: confirmed, - unconfirmed: unconfirmed, - frozen: frozen, - ); - }, ) { walletAddresses = LitecoinWalletAddresses( walletInfo, diff --git a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart index 9fe280640..604a9756b 100644 --- a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart +++ b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet.dart @@ -49,14 +49,6 @@ abstract class BitcoinCashWalletBase extends ElectrumWallet with Store { initialBalance: initialBalance, seedBytes: seedBytes, currency: CryptoCurrency.bch, - balanceFactory: ( - {required int confirmed, required int unconfirmed, required int frozen}) { - return ElectrumBalance( - confirmed: confirmed, - unconfirmed: unconfirmed, - frozen: frozen, - ); - }, ) { walletAddresses = BitcoinCashWalletAddresses( walletInfo, diff --git a/cw_lightning/lib/lightning_wallet.dart b/cw_lightning/lib/lightning_wallet.dart index 2ba558de4..ca60d00f4 100644 --- a/cw_lightning/lib/lightning_wallet.dart +++ b/cw_lightning/lib/lightning_wallet.dart @@ -32,8 +32,7 @@ part 'lightning_wallet.g.dart'; class LightningWallet = LightningWalletBase with _$LightningWallet; -abstract class LightningWalletBase - extends ElectrumWalletBase<LightningBalance, LightningTransactionInfo> with Store { +abstract class LightningWalletBase extends ElectrumWallet with Store { bool _isTransactionUpdating; @override @@ -53,6 +52,7 @@ abstract class LightningWalletBase Map<String, int>? initialChangeAddressIndex, }) : _isTransactionUpdating = false, syncStatus = NotConnectedSyncStatus(), + _balance = ObservableMap<CryptoCurrency, LightningBalance>(), super( mnemonic: mnemonic, password: password, @@ -63,15 +63,9 @@ abstract class LightningWalletBase initialBalance: initialBalance, seedBytes: seedBytes, currency: CryptoCurrency.btcln, - balanceFactory: ( - {required int confirmed, required int unconfirmed, required int frozen}) { - return LightningBalance( - confirmed: confirmed, - unconfirmed: unconfirmed, - frozen: frozen, - ); - }, ) { + _balance[CryptoCurrency.btcln] = + initialBalance ?? LightningBalance(confirmed: 0, unconfirmed: 0, frozen: 0); walletAddresses = BitcoinWalletAddresses( walletInfo, electrumClient: electrumClient, @@ -95,6 +89,12 @@ abstract class LightningWalletBase }); } + late final ObservableMap<CryptoCurrency, LightningBalance> _balance; + + @override + @computed + ObservableMap<CryptoCurrency, LightningBalance> get balance => _balance; + static Future<LightningWallet> create( {required String mnemonic, required String password, @@ -186,7 +186,7 @@ abstract class LightningWalletBase sdk.nodeStateStream.listen((event) { if (event == null) return; - balance[CryptoCurrency.btcln] = LightningBalance( + _balance[CryptoCurrency.btcln] = LightningBalance( confirmed: event.maxPayableMsat ~/ 1000, unconfirmed: event.maxReceivableMsat ~/ 1000, frozen: 0, diff --git a/lib/src/screens/dashboard/widgets/menu_widget.dart b/lib/src/screens/dashboard/widgets/menu_widget.dart index 1b85943c1..a44ee5476 100644 --- a/lib/src/screens/dashboard/widgets/menu_widget.dart +++ b/lib/src/screens/dashboard/widgets/menu_widget.dart @@ -27,7 +27,7 @@ class MenuWidgetState extends State<MenuWidget> { this.fromBottomEdge = 25, this.moneroIcon = Image.asset('assets/images/monero_menu.png'), this.bitcoinIcon = Image.asset('assets/images/bitcoin_menu.png'), - this.lightningIcon = Image.asset('assets/images/lightning_menu.png'), + this.lightningIcon = Image.asset('assets/images/lightning_logo.png'), this.litecoinIcon = Image.asset('assets/images/litecoin_menu.png'), this.havenIcon = Image.asset('assets/images/haven_menu.png'), this.ethereumIcon = Image.asset('assets/images/eth_icon.png'), @@ -100,8 +100,7 @@ class MenuWidgetState extends State<MenuWidget> { color: Theme.of(context).extension<CakeMenuTheme>()!.iconColor); bitcoinIcon = Image.asset('assets/images/bitcoin_menu.png', color: Theme.of(context).extension<CakeMenuTheme>()!.iconColor); - lightningIcon = Image.asset('assets/images/lightning_menu.png', - color: Theme.of(context).extension<CakeMenuTheme>()!.iconColor); + lightningIcon = Image.asset('assets/images/lightning_logo.png'); return Row( mainAxisSize: MainAxisSize.max, diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index 4ccb3ee3b..7f54cee6a 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -87,7 +87,7 @@ class LightningURI extends PaymentURI { @override String toString() { - throw Exception('TODO: Not implemented'); + throw Exception('N/A for lightning wallets (need to make a bolt11 invoice).'); } }