From 8a7c3447b3924aa313e7738e0ad85cd9b33044fa Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 7 Nov 2019 02:24:16 +0100 Subject: [PATCH] tx dialog: try harder to show fee --- electrum/address_synchronizer.py | 4 +++- electrum/transaction.py | 16 +++++++++++++--- electrum/wallet.py | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py index 985932cea..f40e3fc37 100644 --- a/electrum/address_synchronizer.py +++ b/electrum/address_synchronizer.py @@ -31,7 +31,7 @@ from typing import TYPE_CHECKING, Dict, Optional, Set, Tuple, NamedTuple, Sequen from . import bitcoin from .bitcoin import COINBASE_MATURITY from .util import profiler, bfh, TxMinedInfo -from .transaction import Transaction, TxOutput, TxInput, PartialTxInput, TxOutpoint +from .transaction import Transaction, TxOutput, TxInput, PartialTxInput, TxOutpoint, PartialTransaction from .synchronizer import Synchronizer from .verifier import SPV from .blockchain import hash_header @@ -650,6 +650,8 @@ class AddressSynchronizer(Logger): break else: value = None + if value is None: + value = txin.value_sats() if value is None: is_pruned = True else: diff --git a/electrum/transaction.py b/electrum/transaction.py index 872fb4ce9..7fe98c798 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -81,6 +81,10 @@ class MalformedBitcoinScript(Exception): pass +class MissingTxInputAmount(Exception): + pass + + SIGHASH_ALL = 1 @@ -1605,13 +1609,19 @@ class PartialTransaction(Transaction): self.invalidate_ser_cache() def input_value(self) -> int: - return sum(txin.value_sats() for txin in self.inputs()) + input_values = [txin.value_sats() for txin in self.inputs()] + if any([val is None for val in input_values]): + raise MissingTxInputAmount() + return sum(input_values) def output_value(self) -> int: return sum(o.value for o in self.outputs()) - def get_fee(self) -> int: - return self.input_value() - self.output_value() + def get_fee(self) -> Optional[int]: + try: + return self.input_value() - self.output_value() + except MissingTxInputAmount: + return None def serialize_preimage(self, txin_index: int, *, bip143_shared_txdigest_fields: BIP143SharedTxDigestFields = None) -> str: diff --git a/electrum/wallet.py b/electrum/wallet.py index a11bd397f..8e258dc1e 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -457,6 +457,8 @@ class Abstract_Wallet(AddressSynchronizer): def get_tx_info(self, tx) -> TxWalletDetails: is_relevant, is_mine, v, fee = self.get_wallet_delta(tx) + if fee is None and isinstance(tx, PartialTransaction): + fee = tx.get_fee() exp_n = None can_broadcast = False can_bump = False