history export: include tx fee

closes #3504
This commit is contained in:
SomberNight 2018-11-18 16:46:07 +01:00
parent 32af83b7ae
commit 5376d37c24
No known key found for this signature in database
GPG key ID: B33B5F232C6271E9
4 changed files with 37 additions and 6 deletions

View file

@ -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
@ -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)

View file

@ -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 _
@ -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:
@ -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']
@ -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:

View file

@ -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

View file

@ -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,
@ -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()))
@ -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)