wallet history: compute income and expenditures, remove redundant calculation of acquisition price
This commit is contained in:
parent
9fe24e32c0
commit
aad0e276c0
|
@ -985,7 +985,10 @@ class Abstract_Wallet(PrintError):
|
||||||
from .util import timestamp_to_datetime, Satoshis, Fiat
|
from .util import timestamp_to_datetime, Satoshis, Fiat
|
||||||
out = []
|
out = []
|
||||||
capital_gains = 0
|
capital_gains = 0
|
||||||
|
income = 0
|
||||||
|
expenditures = 0
|
||||||
fiat_income = 0
|
fiat_income = 0
|
||||||
|
fiat_expenditures = 0
|
||||||
h = self.get_history(domain)
|
h = self.get_history(domain)
|
||||||
for tx_hash, height, conf, timestamp, value, balance in h:
|
for tx_hash, height, conf, timestamp, value, balance in h:
|
||||||
if from_timestamp and timestamp < from_timestamp:
|
if from_timestamp and timestamp < from_timestamp:
|
||||||
|
@ -1017,25 +1020,32 @@ class Abstract_Wallet(PrintError):
|
||||||
output_addresses.append(addr)
|
output_addresses.append(addr)
|
||||||
item['input_addresses'] = input_addresses
|
item['input_addresses'] = input_addresses
|
||||||
item['output_addresses'] = output_addresses
|
item['output_addresses'] = output_addresses
|
||||||
|
# value may be None if wallet is not fully synchronized
|
||||||
|
if value is None:
|
||||||
|
continue
|
||||||
|
# fixme: use in and out values
|
||||||
|
if value < 0:
|
||||||
|
expenditures += -value
|
||||||
|
else:
|
||||||
|
income += value
|
||||||
|
# fiat computations
|
||||||
if fx is not None:
|
if fx is not None:
|
||||||
date = timestamp_to_datetime(time.time() if conf <= 0 else timestamp)
|
date = timestamp_to_datetime(time.time() if conf <= 0 else timestamp)
|
||||||
fiat_value = self.get_fiat_value(tx_hash, fx.ccy)
|
fiat_value = self.get_fiat_value(tx_hash, fx.ccy)
|
||||||
if fiat_value is None:
|
fiat_default = fiat_value is None
|
||||||
fiat_value = fx.historical_value(value, date)
|
fiat_value = - fiat_value if fiat_value is not None else value / Decimal(COIN) * self.price_at_timestamp(tx_hash, fx.timestamp_rate)
|
||||||
fiat_default = True
|
|
||||||
else:
|
|
||||||
fiat_default = False
|
|
||||||
item['fiat_value'] = Fiat(fiat_value, fx.ccy)
|
item['fiat_value'] = Fiat(fiat_value, fx.ccy)
|
||||||
item['fiat_default'] = fiat_default
|
item['fiat_default'] = fiat_default
|
||||||
if value is not None and value < 0:
|
if value < 0:
|
||||||
ap, lp = self.capital_gain(tx_hash, fx.timestamp_rate, fx.ccy)
|
acquisition_price = - value / Decimal(COIN) * self.average_price(tx_hash, fx.timestamp_rate, fx.ccy)
|
||||||
cg = lp - ap
|
liquidation_price = - fiat_value
|
||||||
item['acquisition_price'] = Fiat(ap, fx.ccy)
|
item['acquisition_price'] = Fiat(aquisition_price, fx.ccy)
|
||||||
|
cg = liquidation_price - aquisition_price
|
||||||
item['capital_gain'] = Fiat(cg, fx.ccy)
|
item['capital_gain'] = Fiat(cg, fx.ccy)
|
||||||
capital_gains += cg
|
capital_gains += cg
|
||||||
|
fiat_expenditures += fiat_value
|
||||||
else:
|
else:
|
||||||
if fiat_value is not None:
|
fiat_income += fiat_value
|
||||||
fiat_income += fiat_value
|
|
||||||
out.append(item)
|
out.append(item)
|
||||||
# add summary
|
# add summary
|
||||||
if out:
|
if out:
|
||||||
|
@ -1048,17 +1058,19 @@ class Abstract_Wallet(PrintError):
|
||||||
else:
|
else:
|
||||||
start_date = out[0]['date']
|
start_date = out[0]['date']
|
||||||
end_date = out[-1]['date']
|
end_date = out[-1]['date']
|
||||||
|
|
||||||
summary = {
|
summary = {
|
||||||
'start_date': start_date,
|
'start_date': start_date,
|
||||||
'end_date': end_date,
|
'end_date': end_date,
|
||||||
'start_balance': Satoshis(start_balance),
|
'start_balance': Satoshis(start_balance),
|
||||||
'end_balance': Satoshis(end_balance)
|
'end_balance': Satoshis(end_balance),
|
||||||
|
'income': Satoshis(income),
|
||||||
|
'expenditures': Satoshis(expenditures)
|
||||||
}
|
}
|
||||||
if fx:
|
if fx:
|
||||||
unrealized = self.unrealized_gains(domain, fx.timestamp_rate, fx.ccy)
|
unrealized = self.unrealized_gains(domain, fx.timestamp_rate, fx.ccy)
|
||||||
summary['capital_gains'] = Fiat(capital_gains, fx.ccy)
|
summary['capital_gains'] = Fiat(capital_gains, fx.ccy)
|
||||||
summary['fiat_income'] = Fiat(fiat_income, fx.ccy)
|
summary['fiat_income'] = Fiat(fiat_income, fx.ccy)
|
||||||
|
summary['fiat_expenditures'] = Fiat(fiat_expenditures, fx.ccy)
|
||||||
summary['unrealized_gains'] = Fiat(unrealized, fx.ccy)
|
summary['unrealized_gains'] = Fiat(unrealized, fx.ccy)
|
||||||
if start_date:
|
if start_date:
|
||||||
summary['start_fiat_balance'] = Fiat(fx.historical_value(start_balance, start_date), fx.ccy)
|
summary['start_fiat_balance'] = Fiat(fx.historical_value(start_balance, start_date), fx.ccy)
|
||||||
|
@ -1714,18 +1726,6 @@ class Abstract_Wallet(PrintError):
|
||||||
lp = sum([coin['value'] for coin in coins]) * p / Decimal(COIN)
|
lp = sum([coin['value'] for coin in coins]) * p / Decimal(COIN)
|
||||||
return lp - ap
|
return lp - ap
|
||||||
|
|
||||||
def capital_gain(self, txid, price_func, ccy):
|
|
||||||
"""
|
|
||||||
Difference between the fiat price of coins leaving the wallet because of transaction txid,
|
|
||||||
and the price of these coins when they entered the wallet.
|
|
||||||
price_func: function that returns the fiat price given a timestamp
|
|
||||||
"""
|
|
||||||
out_value = - self.get_tx_value(txid)/Decimal(COIN)
|
|
||||||
fiat_value = self.get_fiat_value(txid, ccy)
|
|
||||||
liquidation_price = - fiat_value if fiat_value else out_value * self.price_at_timestamp(txid, price_func)
|
|
||||||
acquisition_price = out_value * self.average_price(txid, price_func, ccy)
|
|
||||||
return acquisition_price, liquidation_price
|
|
||||||
|
|
||||||
def average_price(self, txid, price_func, ccy):
|
def average_price(self, txid, price_func, ccy):
|
||||||
""" Average acquisition price of the inputs of a transaction """
|
""" Average acquisition price of the inputs of a transaction """
|
||||||
input_value = 0
|
input_value = 0
|
||||||
|
|
Loading…
Reference in New Issue