Browse Source

wallet: cache NaN coin prices, clear cache on new history

3.3.3.1
ThomasV 6 years ago
parent
commit
863ee984fe
  1. 1
      electrum/gui/kivy/main_window.py
  2. 1
      electrum/gui/qt/main_window.py
  3. 13
      electrum/wallet.py

1
electrum/gui/kivy/main_window.py

@ -173,6 +173,7 @@ class ElectrumWindow(App):
def on_history(self, d):
Logger.info("on_history")
self.wallet.clear_coin_price_cache()
self._trigger_update_history()
def on_fee_histogram(self, *args):

1
electrum/gui/qt/main_window.py

@ -222,6 +222,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
self.fetch_alias()
def on_history(self, b):
self.wallet.clear_coin_price_cache()
self.new_fx_history_signal.emit()
def setup_exception_hook(self):

13
electrum/wallet.py

@ -182,7 +182,7 @@ class Abstract_Wallet(AddressSynchronizer):
self.invoices = InvoiceStore(self.storage)
self.contacts = Contacts(self.storage)
self.coin_price_cache = {}
self._coin_price_cache = {}
def load_and_cleanup(self):
self.load_keystore()
@ -1178,6 +1178,9 @@ class Abstract_Wallet(AddressSynchronizer):
total_price += self.coin_price(ser.split(':')[0], price_func, ccy, v)
return total_price / (input_value/Decimal(COIN))
def clear_coin_price_cache(self):
self._coin_price_cache = {}
def coin_price(self, txid, price_func, ccy, txin_value):
"""
Acquisition price of a coin.
@ -1185,17 +1188,13 @@ class Abstract_Wallet(AddressSynchronizer):
"""
if txin_value is None:
return Decimal('NaN')
# FIXME: this mutual recursion will be really slow and might even reach
# max recursion depth if there are no FX rates available as then
# nothing will be cached.
cache_key = "{}:{}:{}".format(str(txid), str(ccy), str(txin_value))
result = self.coin_price_cache.get(cache_key, None)
result = self._coin_price_cache.get(cache_key, None)
if result is not None:
return result
if self.txi.get(txid, {}) != {}:
result = self.average_price(txid, price_func, ccy) * txin_value/Decimal(COIN)
if not result.is_nan():
self.coin_price_cache[cache_key] = result
self._coin_price_cache[cache_key] = result
return result
else:
fiat_value = self.get_fiat_value(txid, ccy)

Loading…
Cancel
Save