twallet: get_tx_info now returns NamedTuple instead of abomination - electrum - Electrum Bitcoin wallet
 (HTM) git clone https://git.parazyd.org/electrum
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
       ---
 (DIR) commit 205c437d9ae66152126c64fc835145f6aa7a45a9
 (DIR) parent 271d1a3f1d0548000f2aef1593cebd278367fb77
 (HTM) Author: SomberNight <somber.night@protonmail.com>
       Date:   Mon, 29 Apr 2019 02:32:15 +0200
       
       wallet: get_tx_info now returns NamedTuple instead of abomination
       
       Diffstat:
         M electrum/gui/kivy/uix/dialogs/tx_d… |      17 ++++++++++++-----
         M electrum/gui/qt/transaction_dialog… |      15 +++++++++------
         M electrum/wallet.py                  |      39 +++++++++++++++++++++++--------
       
       3 files changed, 50 insertions(+), 21 deletions(-)
       ---
 (DIR) diff --git a/electrum/gui/kivy/uix/dialogs/tx_dialog.py b/electrum/gui/kivy/uix/dialogs/tx_dialog.py
       t@@ -121,11 +121,18 @@ class TxDialog(Factory.Popup):
        
            def update(self):
                format_amount = self.app.format_amount_and_units
       -        tx_hash, self.status_str, self.description, self.can_broadcast, self.can_rbf, amount, fee, height, conf, timestamp, exp_n = self.wallet.get_tx_info(self.tx)
       -        self.tx_hash = tx_hash or ''
       -        if timestamp:
       +        tx_details = self.wallet.get_tx_info(self.tx)
       +        tx_mined_status = tx_details.tx_mined_status
       +        exp_n = tx_details.mempool_depth_bytes
       +        amount, fee = tx_details.amount, tx_details.fee
       +        self.status_str = tx_details.status
       +        self.description = tx_details.label
       +        self.can_broadcast = tx_details.can_broadcast
       +        self.can_rbf = tx_details.can_bump
       +        self.tx_hash = tx_details.txid or ''
       +        if tx_mined_status.timestamp:
                    self.date_label = _('Date')
       -            self.date_str = datetime.fromtimestamp(timestamp).isoformat(' ')[:-3]
       +            self.date_str = datetime.fromtimestamp(tx_mined_status.timestamp).isoformat(' ')[:-3]
                elif exp_n:
                    self.date_label = _('Mempool depth')
                    self.date_str = _('{} from tip').format('%.2f MB'%(exp_n/1000000))
       t@@ -144,7 +151,7 @@ class TxDialog(Factory.Popup):
                self.fee_str = format_amount(fee) if fee is not None else _('unknown')
                self.can_sign = self.wallet.can_sign(self.tx)
                self.ids.output_list.update(self.tx.get_outputs_for_UI())
       -        self.is_local_tx = height == TX_HEIGHT_LOCAL
       +        self.is_local_tx = tx_mined_status.height == TX_HEIGHT_LOCAL
                self.update_action_button()
        
            def update_action_button(self):
 (DIR) diff --git a/electrum/gui/qt/transaction_dialog.py b/electrum/gui/qt/transaction_dialog.py
       t@@ -223,22 +223,25 @@ class TxDialog(QDialog, MessageBoxMixin):
                desc = self.desc
                base_unit = self.main_window.base_unit()
                format_amount = self.main_window.format_amount
       -        tx_hash, status, label, can_broadcast, can_rbf, amount, fee, height, conf, timestamp, exp_n = self.wallet.get_tx_info(self.tx)
       +        tx_details = self.wallet.get_tx_info(self.tx)
       +        tx_mined_status = tx_details.tx_mined_status
       +        exp_n = tx_details.mempool_depth_bytes
       +        amount, fee = tx_details.amount, tx_details.fee
                size = self.tx.estimated_size()
       -        self.broadcast_button.setEnabled(can_broadcast)
       +        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.main_window.tx_external_keypairs))
                self.sign_button.setEnabled(can_sign)
       -        self.tx_hash_e.setText(tx_hash or _('Unknown'))
       +        self.tx_hash_e.setText(tx_details.txid or _('Unknown'))
                if desc is None:
                    self.tx_desc.hide()
                else:
                    self.tx_desc.setText(_("Description") + ': ' + desc)
                    self.tx_desc.show()
       -        self.status_label.setText(_('Status:') + ' ' + status)
       +        self.status_label.setText(_('Status:') + ' ' + tx_details.status)
        
       -        if timestamp:
       -            time_str = datetime.datetime.fromtimestamp(timestamp).isoformat(' ')[:-3]
       +        if tx_mined_status.timestamp:
       +            time_str = datetime.datetime.fromtimestamp(tx_mined_status.timestamp).isoformat(' ')[:-3]
                    self.date_label.setText(_("Date: {}").format(time_str))
                    self.date_label.show()
                elif exp_n:
 (DIR) diff --git a/electrum/wallet.py b/electrum/wallet.py
       t@@ -38,7 +38,7 @@ import traceback
        from functools import partial
        from numbers import Number
        from decimal import Decimal
       -from typing import TYPE_CHECKING, List, Optional, Tuple, Union
       +from typing import TYPE_CHECKING, List, Optional, Tuple, Union, NamedTuple
        
        from .i18n import _
        from .util import (NotEnoughFunds, PrintError, UserCancelled, profiler,
       t@@ -180,6 +180,17 @@ class InternalAddressCorruption(Exception):
                         "Please restore your wallet from seed, and compare the addresses in both files")
        
        
       +class TxWalletDetails(NamedTuple):
       +    txid: Optional[str]
       +    status: str
       +    label: str
       +    can_broadcast: bool
       +    can_bump: bool
       +    amount: Optional[int]
       +    fee: Optional[int]
       +    tx_mined_status: TxMinedInfo
       +    mempool_depth_bytes: Optional[int]
       +
        
        class Abstract_Wallet(AddressSynchronizer):
            """
       t@@ -344,25 +355,23 @@ class Abstract_Wallet(AddressSynchronizer):
                return True
                #return self.history.values() != [[]] * len(self.history)
        
       -    def get_tx_info(self, tx):
       +    def get_tx_info(self, tx) -> TxWalletDetails:
                is_relevant, is_mine, v, fee = self.get_wallet_delta(tx)
                exp_n = None
                can_broadcast = False
                can_bump = False
                label = ''
       -        height = conf = timestamp = None
                tx_hash = tx.txid()
       +        tx_mined_status = self.get_tx_height(tx_hash)
                if tx.is_complete():
                    if self.db.get_transaction(tx_hash):
                        label = self.get_label(tx_hash)
       -                tx_mined_status = self.get_tx_height(tx_hash)
       -                height, conf, timestamp = tx_mined_status.height, tx_mined_status.conf, tx_mined_status.timestamp
       -                if height > 0:
       -                    if conf:
       -                        status = _("{} confirmations").format(conf)
       +                if tx_mined_status.height > 0:
       +                    if tx_mined_status.conf:
       +                        status = _("{} confirmations").format(tx_mined_status.conf)
                            else:
                                status = _('Not verified')
       -                elif height in (TX_HEIGHT_UNCONF_PARENT, TX_HEIGHT_UNCONFIRMED):
       +                elif tx_mined_status.height in (TX_HEIGHT_UNCONF_PARENT, TX_HEIGHT_UNCONFIRMED):
                            status = _('Unconfirmed')
                            if fee is None:
                                fee = self.db.get_tx_fee(tx_hash)
       t@@ -392,7 +401,17 @@ class Abstract_Wallet(AddressSynchronizer):
                else:
                    amount = None
        
       -        return tx_hash, status, label, can_broadcast, can_bump, amount, fee, height, conf, timestamp, exp_n
       +        return TxWalletDetails(
       +            txid=tx_hash,
       +            status=status,
       +            label=label,
       +            can_broadcast=can_broadcast,
       +            can_bump=can_bump,
       +            amount=amount,
       +            fee=fee,
       +            tx_mined_status=tx_mined_status,
       +            mempool_depth_bytes=exp_n,
       +        )
        
            def get_spendable_coins(self, domain, config, *, nonlocal_only=False):
                confirmed_only = config.get('confirmed_only', False)