From 320f9a37908cde79a5236e01b6cea3270429fb9f Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Sun, 31 May 2015 13:58:39 +0900 Subject: [PATCH] get_spendable_coins and frozen addrs Two callers of get_spendable_coins were removing frozen addrs before calling. Put that functionality in the function. We shouldn't be able to send_from a frozen address. This was possible in the current release because logic assumed a two-element tuple was returned when it is now three-element. Fix that too. Command line options listunspent and createrawtransaction currently ignore frozen addresses. I'm not sure that's right but I've preserved that behaviour. With this patch only the wallet class refers to self.frozen_addresses; other clients use is_frozen() now. --- gui/qt/main_window.py | 12 +++++------- lib/commands.py | 4 ++-- lib/wallet.py | 9 +++------ 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index d41ac527..823856de 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -1410,13 +1410,13 @@ class ElectrumWindow(QMainWindow): if addr_URL: menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL)) - if any(addr not in self.wallet.frozen_addresses for addr in addrs): + if any(not self.wallet.is_frozen(addr) for addr in addrs): menu.addAction(_("Freeze"), lambda: self.set_frozen_state(addrs, True)) - if any(addr in self.wallet.frozen_addresses for addr in addrs): + if any(self.wallet.is_frozen(addr) for addr in addrs): menu.addAction(_("Unfreeze"), lambda: self.set_frozen_state(addrs, False)) def can_send(addr): - return addr not in self.wallet.frozen_addresses and self.wallet.get_addr_balance(addr) != (0, 0) + return not self.wallet.is_frozen(addr) and sum(self.wallet.get_addr_balance(addr)[:2]) if any(can_send(addr) for addr in addrs): menu.addAction(_("Send From"), lambda: self.send_from_addresses(addrs)) @@ -1433,13 +1433,11 @@ class ElectrumWindow(QMainWindow): return self.pay_from else: domain = self.wallet.get_account_addresses(self.current_account) - for i in self.wallet.frozen_addresses: - if i in domain: domain.remove(i) return self.wallet.get_spendable_coins(domain) def send_from_addresses(self, addrs): - self.set_pay_from( addrs ) + self.set_pay_from(addrs) self.tabs.setCurrentIndex(1) self.update_fee(False) @@ -1581,7 +1579,7 @@ class ElectrumWindow(QMainWindow): item.setFont(0, QFont(MONOSPACE_FONT)) item.setData(0, Qt.UserRole, address) item.setData(0, Qt.UserRole+1, True) # label can be edited - if address in self.wallet.frozen_addresses: + if self.wallet.is_frozen(address): item.setBackgroundColor(0, QColor('lightblue')) if self.wallet.is_beyond_limit(address, account, is_change): item.setBackgroundColor(0, QColor('red')) diff --git a/lib/commands.py b/lib/commands.py index 9487d60b..7aac5d1e 100644 --- a/lib/commands.py +++ b/lib/commands.py @@ -265,7 +265,7 @@ class Commands: return self.network.synchronous_get([ ('blockchain.address.get_history',[addr]) ])[0] def listunspent(self): - l = copy.deepcopy(self.wallet.get_spendable_coins()) + l = copy.deepcopy(self.wallet.get_spendable_coins(exclude_frozen = False)) for i in l: i["value"] = str(Decimal(i["value"])/100000000) return l @@ -278,7 +278,7 @@ class Commands: return {'address':r[0] } def createrawtransaction(self, inputs, outputs): - coins = self.wallet.get_spendable_coins(None) + coins = self.wallet.get_spendable_coins(exclude_frozen = False) tx_inputs = [] for i in inputs: prevout_hash = i['txid'] diff --git a/lib/wallet.py b/lib/wallet.py index 59286621..a4d7946d 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -562,10 +562,12 @@ class Abstract_Wallet(object): return c, u, x - def get_spendable_coins(self, domain=None): + def get_spendable_coins(self, domain = None, exclude_frozen = True): coins = [] if domain is None: domain = self.addresses(True) + if exclude_frozen: + domain = set(domain) - self.frozen_addresses for addr in domain: c = self.get_addr_utxo(addr) for txo, v in c.items(): @@ -846,11 +848,6 @@ class Abstract_Wallet(object): # get coins if not coins: - if domain is None: - domain = self.addresses(True) - for i in self.frozen_addresses: - if i in domain: - domain.remove(i) coins = self.get_spendable_coins(domain) amount = sum(map(lambda x:x[2], outputs))