mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-05-10 09:42:15 +00:00
review fixes
This commit is contained in:
parent
0f96e381e6
commit
b763328354
8 changed files with 47 additions and 78 deletions
assets/images
cw_bitcoin/lib
cw_bitcoin_cash/lib/src
cw_lightning/lib
lib
src/screens/dashboard/widgets
view_model/wallet_address_list
Binary file not shown.
Before ![]() (image error) Size: 3.1 KiB |
|
@ -44,14 +44,6 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
|
||||||
initialBalance: initialBalance,
|
initialBalance: initialBalance,
|
||||||
seedBytes: seedBytes,
|
seedBytes: seedBytes,
|
||||||
currency: CryptoCurrency.btc,
|
currency: CryptoCurrency.btc,
|
||||||
balanceFactory: (
|
|
||||||
{required int confirmed, required int unconfirmed, required int frozen}) {
|
|
||||||
return ElectrumBalance(
|
|
||||||
confirmed: confirmed,
|
|
||||||
unconfirmed: unconfirmed,
|
|
||||||
frozen: frozen,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
) {
|
) {
|
||||||
walletAddresses = BitcoinWalletAddresses(
|
walletAddresses = BitcoinWalletAddresses(
|
||||||
walletInfo,
|
walletInfo,
|
||||||
|
|
|
@ -23,7 +23,6 @@ import 'package:cw_bitcoin/litecoin_network.dart';
|
||||||
import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
|
import 'package:cw_bitcoin/pending_bitcoin_transaction.dart';
|
||||||
import 'package:cw_bitcoin/script_hash.dart';
|
import 'package:cw_bitcoin/script_hash.dart';
|
||||||
import 'package:cw_bitcoin/utils.dart';
|
import 'package:cw_bitcoin/utils.dart';
|
||||||
import 'package:cw_core/balance.dart';
|
|
||||||
import 'package:cw_core/crypto_currency.dart';
|
import 'package:cw_core/crypto_currency.dart';
|
||||||
import 'package:cw_core/node.dart';
|
import 'package:cw_core/node.dart';
|
||||||
import 'package:cw_core/pathForWallet.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_base.dart';
|
||||||
import 'package:cw_core/wallet_info.dart';
|
import 'package:cw_core/wallet_info.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:hex/hex.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:mobx/mobx.dart';
|
import 'package:mobx/mobx.dart';
|
||||||
import 'package:rxdart/subjects.dart';
|
import 'package:rxdart/subjects.dart';
|
||||||
|
@ -45,8 +45,9 @@ part 'electrum_wallet.g.dart';
|
||||||
|
|
||||||
class ElectrumWallet = ElectrumWalletBase with _$ElectrumWallet;
|
class ElectrumWallet = ElectrumWalletBase with _$ElectrumWallet;
|
||||||
|
|
||||||
abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT extends ElectrumTransactionInfo>
|
abstract class ElectrumWalletBase
|
||||||
extends WalletBase<BalanceT, ElectrumTransactionHistory, TxInfoT> with Store {
|
extends WalletBase<ElectrumBalance, ElectrumTransactionHistory, ElectrumTransactionInfo>
|
||||||
|
with Store {
|
||||||
ElectrumWalletBase(
|
ElectrumWalletBase(
|
||||||
{required String password,
|
{required String password,
|
||||||
required WalletInfo walletInfo,
|
required WalletInfo walletInfo,
|
||||||
|
@ -54,15 +55,9 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
required this.networkType,
|
required this.networkType,
|
||||||
required this.mnemonic,
|
required this.mnemonic,
|
||||||
required Uint8List seedBytes,
|
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,
|
List<BitcoinAddressRecord>? initialAddresses,
|
||||||
ElectrumClient? electrumClient,
|
ElectrumClient? electrumClient,
|
||||||
BalanceT? initialBalance,
|
ElectrumBalance? initialBalance,
|
||||||
CryptoCurrency? currency})
|
CryptoCurrency? currency})
|
||||||
: hd = currency == CryptoCurrency.bch
|
: hd = currency == CryptoCurrency.bch
|
||||||
? bitcoinCashHDWallet(seedBytes)
|
? bitcoinCashHDWallet(seedBytes)
|
||||||
|
@ -74,8 +69,12 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
isEnabledAutoGenerateSubaddress = true,
|
isEnabledAutoGenerateSubaddress = true,
|
||||||
unspentCoins = [],
|
unspentCoins = [],
|
||||||
_scripthashesUpdateSubject = {},
|
_scripthashesUpdateSubject = {},
|
||||||
balance = ObservableMap<CryptoCurrency, BalanceT>.of(
|
balance = ObservableMap<CryptoCurrency, ElectrumBalance>.of(currency != null
|
||||||
currency != null ? {currency: initialBalance ?? balanceFactory(confirmed: 0, unconfirmed: 0, frozen: 0)} : {}),
|
? {
|
||||||
|
currency:
|
||||||
|
initialBalance ?? const ElectrumBalance(confirmed: 0, unconfirmed: 0, frozen: 0)
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
this.unspentCoinsInfo = unspentCoinsInfo,
|
this.unspentCoinsInfo = unspentCoinsInfo,
|
||||||
this.network = networkType == bitcoin.bitcoin
|
this.network = networkType == bitcoin.bitcoin
|
||||||
? BitcoinNetwork.mainnet
|
? BitcoinNetwork.mainnet
|
||||||
|
@ -97,11 +96,6 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
|
|
||||||
final bitcoin.HDWallet hd;
|
final bitcoin.HDWallet hd;
|
||||||
final String mnemonic;
|
final String mnemonic;
|
||||||
final BalanceT Function({
|
|
||||||
required int confirmed,
|
|
||||||
required int unconfirmed,
|
|
||||||
required int frozen,
|
|
||||||
}) balanceFactory;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@observable
|
@observable
|
||||||
|
@ -115,7 +109,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@observable
|
@observable
|
||||||
late ObservableMap<CryptoCurrency, BalanceT> balance;
|
late ObservableMap<CryptoCurrency, ElectrumBalance> balance;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@observable
|
@observable
|
||||||
|
@ -291,7 +285,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
|
|
||||||
final totalAmount = amount + fee;
|
final totalAmount = amount + fee;
|
||||||
|
|
||||||
if (totalAmount > (balance[currency]!.confirmed as int)) {
|
if (totalAmount > balance[currency]!.confirmed) {
|
||||||
throw BitcoinTransactionWrongBalanceException(currency);
|
throw BitcoinTransactionWrongBalanceException(currency);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -629,16 +623,23 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
final ins = <bitcoin_base.BtcTransaction>[];
|
final ins = <bitcoin_base.BtcTransaction>[];
|
||||||
|
|
||||||
for (final vin in original.inputs) {
|
for (final vin in original.inputs) {
|
||||||
final txHex = await electrumClient.getTransactionHex(hash: vin.txId);
|
try {
|
||||||
final tx = bitcoin_base.BtcTransaction.fromRaw(txHex);
|
final id = HEX.encode(HEX.decode(vin.txId).reversed.toList());
|
||||||
ins.add(tx);
|
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,
|
return ElectrumTransactionBundle(original,
|
||||||
ins: ins, time: time, confirmations: confirmations, height: height);
|
ins: ins, time: time, confirmations: confirmations, height: height);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<TxInfoT?> fetchTransactionInfo(
|
Future<ElectrumTransactionInfo?> fetchTransactionInfo(
|
||||||
{required String hash,
|
{required String hash,
|
||||||
required int height,
|
required int height,
|
||||||
required Set<String> myAddresses,
|
required Set<String> myAddresses,
|
||||||
|
@ -646,7 +647,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
try {
|
try {
|
||||||
return ElectrumTransactionInfo.fromElectrumBundle(
|
return ElectrumTransactionInfo.fromElectrumBundle(
|
||||||
await getTransactionExpanded(hash: hash, height: height), walletInfo.type, network,
|
await getTransactionExpanded(hash: hash, height: height), walletInfo.type, network,
|
||||||
addresses: myAddresses, height: height) as TxInfoT;
|
addresses: myAddresses, height: height);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e is FormatException && retryOnFailure == true) {
|
if (e is FormatException && retryOnFailure == true) {
|
||||||
await Future.delayed(const Duration(seconds: 2));
|
await Future.delayed(const Duration(seconds: 2));
|
||||||
|
@ -657,9 +658,9 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Map<String, TxInfoT>> fetchTransactions() async {
|
Future<Map<String, ElectrumTransactionInfo>> fetchTransactions() async {
|
||||||
try {
|
try {
|
||||||
final Map<String, TxInfoT> historiesWithDetails = {};
|
final Map<String, ElectrumTransactionInfo> historiesWithDetails = {};
|
||||||
final addressesSet = walletAddresses.allAddresses.map((addr) => addr.address).toSet();
|
final addressesSet = walletAddresses.allAddresses.map((addr) => addr.address).toSet();
|
||||||
final currentHeight = await electrumClient.getCurrentBlockChainTip() ?? 0;
|
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 {
|
BitcoinAddressRecord addressRecord, Set<String> addressesSet, int currentHeight) async {
|
||||||
try {
|
try {
|
||||||
final Map<String, TxInfoT> 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));
|
||||||
|
@ -723,7 +724,7 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
storedTx.isPending = storedTx.confirmations == 0;
|
storedTx.isPending = storedTx.confirmations == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
historiesWithDetails[txid] = storedTx as TxInfoT;
|
historiesWithDetails[txid] = storedTx;
|
||||||
} else {
|
} else {
|
||||||
final tx = await fetchTransactionInfo(
|
final tx = await fetchTransactionInfo(
|
||||||
hash: txid, height: height, myAddresses: addressesSet, retryOnFailure: true);
|
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 addresses = walletAddresses.allAddresses.toList();
|
||||||
final balanceFutures = <Future<Map<String, dynamic>>>[];
|
final balanceFutures = <Future<Map<String, dynamic>>>[];
|
||||||
for (var i = 0; i < addresses.length; i++) {
|
for (var i = 0; i < addresses.length; i++) {
|
||||||
|
@ -827,15 +828,8 @@ abstract class ElectrumWalletBase<BalanceT extends ElectrumBalance, TxInfoT exte
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// return balanceFactory()
|
return ElectrumBalance(
|
||||||
// ..confirmed = totalConfirmed
|
confirmed: totalConfirmed, unconfirmed: totalUnconfirmed, frozen: totalFrozen);
|
||||||
// ..unconfirmed = totalUnconfirmed
|
|
||||||
// ..frozen = totalFrozen;
|
|
||||||
return balanceFactory(
|
|
||||||
confirmed: totalConfirmed,
|
|
||||||
unconfirmed: totalUnconfirmed,
|
|
||||||
frozen: totalFrozen,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updateBalance() async {
|
Future<void> updateBalance() async {
|
||||||
|
|
|
@ -42,14 +42,6 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
|
||||||
initialBalance: initialBalance,
|
initialBalance: initialBalance,
|
||||||
seedBytes: seedBytes,
|
seedBytes: seedBytes,
|
||||||
currency: CryptoCurrency.ltc,
|
currency: CryptoCurrency.ltc,
|
||||||
balanceFactory: (
|
|
||||||
{required int confirmed, required int unconfirmed, required int frozen}) {
|
|
||||||
return ElectrumBalance(
|
|
||||||
confirmed: confirmed,
|
|
||||||
unconfirmed: unconfirmed,
|
|
||||||
frozen: frozen,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
) {
|
) {
|
||||||
walletAddresses = LitecoinWalletAddresses(
|
walletAddresses = LitecoinWalletAddresses(
|
||||||
walletInfo,
|
walletInfo,
|
||||||
|
|
|
@ -49,14 +49,6 @@ abstract class BitcoinCashWalletBase extends ElectrumWallet with Store {
|
||||||
initialBalance: initialBalance,
|
initialBalance: initialBalance,
|
||||||
seedBytes: seedBytes,
|
seedBytes: seedBytes,
|
||||||
currency: CryptoCurrency.bch,
|
currency: CryptoCurrency.bch,
|
||||||
balanceFactory: (
|
|
||||||
{required int confirmed, required int unconfirmed, required int frozen}) {
|
|
||||||
return ElectrumBalance(
|
|
||||||
confirmed: confirmed,
|
|
||||||
unconfirmed: unconfirmed,
|
|
||||||
frozen: frozen,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
) {
|
) {
|
||||||
walletAddresses = BitcoinCashWalletAddresses(
|
walletAddresses = BitcoinCashWalletAddresses(
|
||||||
walletInfo,
|
walletInfo,
|
||||||
|
|
|
@ -32,8 +32,7 @@ part 'lightning_wallet.g.dart';
|
||||||
|
|
||||||
class LightningWallet = LightningWalletBase with _$LightningWallet;
|
class LightningWallet = LightningWalletBase with _$LightningWallet;
|
||||||
|
|
||||||
abstract class LightningWalletBase
|
abstract class LightningWalletBase extends ElectrumWallet with Store {
|
||||||
extends ElectrumWalletBase<LightningBalance, LightningTransactionInfo> with Store {
|
|
||||||
bool _isTransactionUpdating;
|
bool _isTransactionUpdating;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -53,6 +52,7 @@ abstract class LightningWalletBase
|
||||||
Map<String, int>? initialChangeAddressIndex,
|
Map<String, int>? initialChangeAddressIndex,
|
||||||
}) : _isTransactionUpdating = false,
|
}) : _isTransactionUpdating = false,
|
||||||
syncStatus = NotConnectedSyncStatus(),
|
syncStatus = NotConnectedSyncStatus(),
|
||||||
|
_balance = ObservableMap<CryptoCurrency, LightningBalance>(),
|
||||||
super(
|
super(
|
||||||
mnemonic: mnemonic,
|
mnemonic: mnemonic,
|
||||||
password: password,
|
password: password,
|
||||||
|
@ -63,15 +63,9 @@ abstract class LightningWalletBase
|
||||||
initialBalance: initialBalance,
|
initialBalance: initialBalance,
|
||||||
seedBytes: seedBytes,
|
seedBytes: seedBytes,
|
||||||
currency: CryptoCurrency.btcln,
|
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(
|
walletAddresses = BitcoinWalletAddresses(
|
||||||
walletInfo,
|
walletInfo,
|
||||||
electrumClient: electrumClient,
|
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(
|
static Future<LightningWallet> create(
|
||||||
{required String mnemonic,
|
{required String mnemonic,
|
||||||
required String password,
|
required String password,
|
||||||
|
@ -186,7 +186,7 @@ abstract class LightningWalletBase
|
||||||
|
|
||||||
sdk.nodeStateStream.listen((event) {
|
sdk.nodeStateStream.listen((event) {
|
||||||
if (event == null) return;
|
if (event == null) return;
|
||||||
balance[CryptoCurrency.btcln] = LightningBalance(
|
_balance[CryptoCurrency.btcln] = LightningBalance(
|
||||||
confirmed: event.maxPayableMsat ~/ 1000,
|
confirmed: event.maxPayableMsat ~/ 1000,
|
||||||
unconfirmed: event.maxReceivableMsat ~/ 1000,
|
unconfirmed: event.maxReceivableMsat ~/ 1000,
|
||||||
frozen: 0,
|
frozen: 0,
|
||||||
|
|
|
@ -27,7 +27,7 @@ class MenuWidgetState extends State<MenuWidget> {
|
||||||
this.fromBottomEdge = 25,
|
this.fromBottomEdge = 25,
|
||||||
this.moneroIcon = Image.asset('assets/images/monero_menu.png'),
|
this.moneroIcon = Image.asset('assets/images/monero_menu.png'),
|
||||||
this.bitcoinIcon = Image.asset('assets/images/bitcoin_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.litecoinIcon = Image.asset('assets/images/litecoin_menu.png'),
|
||||||
this.havenIcon = Image.asset('assets/images/haven_menu.png'),
|
this.havenIcon = Image.asset('assets/images/haven_menu.png'),
|
||||||
this.ethereumIcon = Image.asset('assets/images/eth_icon.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);
|
color: Theme.of(context).extension<CakeMenuTheme>()!.iconColor);
|
||||||
bitcoinIcon = Image.asset('assets/images/bitcoin_menu.png',
|
bitcoinIcon = Image.asset('assets/images/bitcoin_menu.png',
|
||||||
color: Theme.of(context).extension<CakeMenuTheme>()!.iconColor);
|
color: Theme.of(context).extension<CakeMenuTheme>()!.iconColor);
|
||||||
lightningIcon = Image.asset('assets/images/lightning_menu.png',
|
lightningIcon = Image.asset('assets/images/lightning_logo.png');
|
||||||
color: Theme.of(context).extension<CakeMenuTheme>()!.iconColor);
|
|
||||||
|
|
||||||
return Row(
|
return Row(
|
||||||
mainAxisSize: MainAxisSize.max,
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
|
|
@ -87,7 +87,7 @@ class LightningURI extends PaymentURI {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
throw Exception('TODO: Not implemented');
|
throw Exception('N/A for lightning wallets (need to make a bolt11 invoice).');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue