electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 252591832a68e7f6c38606f78d00c821a5a11c67
parent 7ec7dd07d096cbf5a9fda7f65c90b0e220629634
Author: ThomasV <thomasv@electrum.org>
Date:   Wed, 27 May 2020 09:59:53 +0200

swaps: improve history display

Diffstat:
Melectrum/gui/qt/transaction_dialog.py | 7+------
Melectrum/lnworker.py | 53+++++++++++++++++++++++++++++++----------------------
Melectrum/wallet.py | 20+++++++++++++-------
3 files changed, 45 insertions(+), 35 deletions(-)

diff --git a/electrum/gui/qt/transaction_dialog.py b/electrum/gui/qt/transaction_dialog.py @@ -414,11 +414,6 @@ class BaseTxDialog(QDialog, MessageBoxMixin): tx_mined_status = self.wallet.lnworker.lnwatcher.get_tx_height(txid) else: ln_amount = None - swap_history = self.wallet.lnworker.get_swap_history() if self.wallet.lnworker else {} - if txid in swap_history: - item = swap_history[txid] - ln_amount = item['lightning_amount'] - self.broadcast_button.setEnabled(tx_details.can_broadcast) can_sign = not self.tx.is_complete() and \ (self.wallet.can_sign(self.tx) or bool(self.external_keypairs)) @@ -490,7 +485,7 @@ class BaseTxDialog(QDialog, MessageBoxMixin): self.fee_warning_icon.setVisible(bool(risk_of_burning_coins)) self.fee_label.setText(fee_str) self.size_label.setText(size_str) - if ln_amount is None: + if ln_amount is None or ln_amount == 0: ln_amount_str = '' elif ln_amount > 0: ln_amount_str = _('Amount received in channels') + ': ' + format_amount(ln_amount) + ' ' + base_unit diff --git a/electrum/lnworker.py b/electrum/lnworker.py @@ -594,6 +594,16 @@ class LNWallet(LNWorker): out[k] += v return out + def get_payment_value(self, info, plist): + amount_msat = 0 + fee_msat = None + for chan_id, htlc, _direction in plist: + amount_msat += int(_direction) * htlc.amount_msat + if _direction == SENT and info and info.amount: + fee_msat = (fee_msat or 0) - info.amount*1000 - amount_msat + timestamp = min([htlc.timestamp for chan_id, htlc, _direction in plist]) + return amount_msat, fee_msat, timestamp + def get_lightning_history(self): out = {} for key, plist in self.get_settled_payments().items(): @@ -601,13 +611,7 @@ class LNWallet(LNWorker): continue payment_hash = bytes.fromhex(key) info = self.get_payment_info(payment_hash) - timestamp = min([htlc.timestamp for chan_id, htlc, _direction in plist]) - amount_msat = 0 - fee_msat = None - for chan_id, htlc, _direction in plist: - amount_msat += int(_direction) * htlc.amount_msat - if _direction == SENT and info and info.amount: - fee_msat = (fee_msat or 0) - info.amount*1000 - amount_msat + amount_msat, fee_msat, timestamp = self.get_payment_value(info, plist) if info is not None: label = self.wallet.get_label(key) direction = ('sent' if info.direction == SENT else 'received') if len(plist)==1 else 'self-payment' @@ -642,21 +646,6 @@ class LNWallet(LNWorker): out[payment_hash] = item return out - def get_swap_history(self): - out = {} - for k, swap_info in self.swap_manager.swaps.items(): - is_reverse = swap_info.get('invoice') - if is_reverse: - txid = swap_info.get('claim_txid') - else: - txid = swap_info.get('funding_txid') - if txid is None: - continue - out[txid] = { - 'lightning_amount': swap_info.get('lightning_amount', 0) * (-1 if is_reverse else 1) - } - return out - def get_onchain_history(self): out = {} # add funding events @@ -691,6 +680,26 @@ class LNWallet(LNWorker): 'fee_msat': None, } out[closing_txid] = item + # add submarine swaps + settled_payments = self.get_settled_payments() + for preimage_hex, swap_info in self.swap_manager.swaps.items(): + is_reverse = swap_info.get('invoice') + txid = swap_info.get('claim_txid' if is_reverse else 'funding_txid') + if txid is None: + continue + payment_hash = sha256(bytes.fromhex(preimage_hex)) + if payment_hash.hex() in settled_payments: + plist = settled_payments[payment_hash.hex()] + info = self.get_payment_info(payment_hash) + amount_msat, fee_msat, timestamp = self.get_payment_value(info, plist) + else: + amount_msat = 0 + out[txid] = { + 'txid': txid, + 'amount_msat': amount_msat, + 'type': 'swap', + 'label': 'Reverse swap' if is_reverse else 'Normal swap' # TODO: show time left until we can get a refund + } return out def get_history(self): diff --git a/electrum/wallet.py b/electrum/wallet.py @@ -820,23 +820,29 @@ class Abstract_Wallet(AddressSynchronizer, ABC): transactions_tmp = OrderedDictWithIndex() # add on-chain txns onchain_history = self.get_onchain_history(domain=onchain_domain) + lnworker_history = self.lnworker.get_onchain_history() if self.lnworker else [] for tx_item in onchain_history: txid = tx_item['txid'] transactions_tmp[txid] = tx_item - # add LN txns - if self.lnworker and include_lightning: - lightning_history = self.lnworker.get_history() - else: - lightning_history = [] - for i, tx_item in enumerate(lightning_history): + # add lnworker info here + if txid in lnworker_history: + item = lnworker_history[txid] + tx_item['label'] = item['label'] + tx_item['type'] = item['type'] + ln_value = Decimal(item['amount_msat']) / 1000 + tx_item['ln_value'] = Satoshis(ln_value) + # add lightning transactions. + lightning_history = self.lnworker.get_lightning_history() if self.lnworker and include_lightning else {} + for tx_item in lightning_history.values(): txid = tx_item.get('txid') ln_value = Decimal(tx_item['amount_msat']) / 1000 + # merge items that have a txid with onchain tx if txid and txid in transactions_tmp: item = transactions_tmp[txid] item['label'] = tx_item['label'] item['type'] = tx_item['type'] - #item['channel_id'] = tx_item['channel_id'] item['ln_value'] = Satoshis(ln_value) + item['amount_msat'] = tx_item['amount_msat'] else: tx_item['lightning'] = True tx_item['ln_value'] = Satoshis(ln_value)