URI: 
       thistory export: include tx fee - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 5376d37c24b5d60f4e8e7423326e6a42a92e2b90
   DIR parent 32af83b7aede02f0b9bb3e8294ef2dc0481fb6de
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Sun, 18 Nov 2018 16:46:07 +0100
       
       history export: include tx fee
       
       closes #3504
       
       Diffstat:
         M electrum/address_synchronizer.py    |      15 ++++++++++++++-
         M electrum/gui/qt/history_list.py     |      17 +++++++++++++++--
         M electrum/util.py                    |       2 +-
         M electrum/wallet.py                  |       9 +++++++--
       
       4 files changed, 37 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py
       t@@ -25,7 +25,7 @@ import threading
        import asyncio
        import itertools
        from collections import defaultdict
       -from typing import TYPE_CHECKING, Dict
       +from typing import TYPE_CHECKING, Dict, Optional
        
        from . import bitcoin
        from .bitcoin import COINBASE_MATURITY, TYPE_ADDRESS, TYPE_PUBKEY
       t@@ -712,6 +712,19 @@ class AddressSynchronizer(PrintError):
                    fee = None
                return is_relevant, is_mine, v, fee
        
       +    def get_tx_fee(self, tx: Transaction) -> Optional[int]:
       +        if not tx:
       +            return None
       +        if hasattr(tx, '_cached_fee'):
       +            return tx._cached_fee
       +        is_relevant, is_mine, v, fee = self.get_wallet_delta(tx)
       +        if fee is None:
       +            txid = tx.txid()
       +            fee = self.tx_fees.get(txid)
       +        if fee is not None:
       +            tx._cached_fee = fee
       +        return fee
       +
            def get_addr_io(self, address):
                with self.lock, self.transaction_lock:
                    h = self.get_address_history(address)
   DIR diff --git a/electrum/gui/qt/history_list.py b/electrum/gui/qt/history_list.py
       t@@ -26,6 +26,7 @@
        import webbrowser
        import datetime
        from datetime import date
       +from typing import TYPE_CHECKING
        
        from electrum.address_synchronizer import TX_HEIGHT_LOCAL
        from electrum.i18n import _
       t@@ -33,6 +34,9 @@ from electrum.util import block_explorer_URL, profiler, print_error, TxMinedStat
        
        from .util import *
        
       +if TYPE_CHECKING:
       +    from electrum.wallet import Abstract_Wallet
       +
        try:
            from electrum.plot import plot_history, NothingToPlotException
        except:
       t@@ -216,7 +220,7 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop):
        
            @profiler
            def on_update(self):
       -        self.wallet = self.parent.wallet
       +        self.wallet = self.parent.wallet  # type: Abstract_Wallet
                fx = self.parent.fx
                r = self.wallet.get_full_history(domain=self.get_domain(), from_timestamp=self.start_timestamp, to_timestamp=self.end_timestamp, fx=fx)
                self.transactions = r['transactions']
       t@@ -435,12 +439,21 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop):
                                      item['confirmations'],
                                      item['value'],
                                      item.get('fiat_value', ''),
       +                              item.get('fee', ''),
       +                              item.get('fiat_fee', ''),
                                      item['date']])
                with open(file_name, "w+", encoding='utf-8') as f:
                    if is_csv:
                        import csv
                        transaction = csv.writer(f, lineterminator='\n')
       -                transaction.writerow(["transaction_hash", "label", "confirmations", "value", "fiat_value", "timestamp"])
       +                transaction.writerow(["transaction_hash",
       +                                      "label",
       +                                      "confirmations",
       +                                      "value",
       +                                      "fiat_value",
       +                                      "fee",
       +                                      "fiat_fee",
       +                                      "timestamp"])
                        for line in lines:
                            transaction.writerow(line)
                    else:
   DIR diff --git a/electrum/util.py b/electrum/util.py
       t@@ -156,7 +156,7 @@ class Fiat(object):
                return 'Fiat(%s)'% self.__str__()
        
            def __str__(self):
       -        if self.value.is_nan():
       +        if self.value is None or self.value.is_nan():
                    return _('No Data')
                else:
                    return "{:.2f}".format(self.value) + ' ' + self.ccy
   DIR diff --git a/electrum/wallet.py b/electrum/wallet.py
       t@@ -396,6 +396,7 @@ class Abstract_Wallet(AddressSynchronizer):
                        continue
                    if to_timestamp and (timestamp or now) >= to_timestamp:
                        continue
       +            tx = self.transactions.get(tx_hash)
                    item = {
                        'txid': tx_hash,
                        'height': tx_mined_status.height,
       t@@ -406,8 +407,9 @@ class Abstract_Wallet(AddressSynchronizer):
                        'date': timestamp_to_datetime(timestamp),
                        'label': self.get_label(tx_hash),
                    }
       +            tx_fee = self.get_tx_fee(tx)
       +            item['fee'] = Satoshis(tx_fee) if tx_fee is not None else None
                    if show_addresses:
       -                tx = self.transactions.get(tx_hash)
                        item['inputs'] = list(map(lambda x: dict((k, x[k]) for k in ('prevout_hash', 'prevout_n')), tx.inputs()))
                        item['outputs'] = list(map(lambda x:{'address':x.address, 'value':Satoshis(x.value)},
                                                   tx.get_outputs_for_UI()))
       t@@ -423,8 +425,11 @@ class Abstract_Wallet(AddressSynchronizer):
                    if fx and fx.is_enabled() and fx.get_history_config():
                        fiat_value = self.get_fiat_value(tx_hash, fx.ccy)
                        fiat_default = fiat_value is None
       -                fiat_value = fiat_value if fiat_value is not None else value / Decimal(COIN) * self.price_at_timestamp(tx_hash, fx.timestamp_rate)  #
       +                fiat_rate = self.price_at_timestamp(tx_hash, fx.timestamp_rate)
       +                fiat_value = fiat_value if fiat_value is not None else value / Decimal(COIN) * fiat_rate
       +                fiat_fee = tx_fee / Decimal(COIN) * fiat_rate if tx_fee is not None else None
                        item['fiat_value'] = Fiat(fiat_value, fx.ccy)
       +                item['fiat_fee'] = Fiat(fiat_fee, fx.ccy) if fiat_fee else None
                        item['fiat_default'] = fiat_default
                        if value < 0:
                            acquisition_price = - value / Decimal(COIN) * self.average_price(tx_hash, fx.timestamp_rate, fx.ccy)