tOption to send only confirmed coins (fix #2395) - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit faa17f9818270f5a0ef2b8109b9d37bd52fd4c5f DIR parent 255458da0af34d75f7b49803cf5e90fdf3bf26c5 HTML Author: ThomasV <thomasv@electrum.org> Date: Sat, 1 Jul 2017 22:20:10 +0200 Option to send only confirmed coins (fix #2395) Diffstat: M gui/kivy/main_window.py | 2 +- M gui/qt/main_window.py | 16 ++++++++++++++-- M lib/commands.py | 2 +- M lib/wallet.py | 13 ++++++++----- 4 files changed, 24 insertions(+), 9 deletions(-) --- DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py t@@ -578,7 +578,7 @@ class ElectrumWindow(App): self.status = '[size=15dp]%s[/size]\n%s' %(n, status) def get_max_amount(self): - inputs = self.wallet.get_spendable_coins(None) + inputs = self.wallet.get_spendable_coins(None, self.electrum_config) addr = str(self.send_screen.screen.address) or self.wallet.dummy_address() outputs = [(TYPE_ADDRESS, addr, '!')] tx = self.wallet.make_unsigned_transaction(inputs, outputs, self.electrum_config) DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py t@@ -1165,8 +1165,12 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.not_enough_funds = False except NotEnoughFunds: self.not_enough_funds = True + if not freeze_fee: + self.fee_e.setAmount(None) + return except BaseException: return + if not freeze_fee: fee = None if self.not_enough_funds else tx.get_fee() self.fee_e.setAmount(fee) t@@ -1572,8 +1576,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): if self.pay_from: return self.pay_from else: - domain = self.wallet.get_addresses() - return self.wallet.get_spendable_coins(domain) + return self.wallet.get_spendable_coins(None, self.config) def spend_coins(self, coins): self.set_pay_from(coins) t@@ -2625,6 +2628,15 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): chooser_combo.currentIndexChanged.connect(on_chooser) tx_widgets.append((chooser_label, chooser_combo)) + def on_unconf(x): + self.config.set_key('confirmed_only', bool(x)) + conf_only = self.config.get('confirmed_only', True) + unconf_cb = QCheckBox(_('Spend only confirmed coins')) + unconf_cb.setToolTip(_('Spend only confirmed inputs.')) + unconf_cb.setChecked(conf_only) + unconf_cb.stateChanged.connect(on_unconf) + tx_widgets.append((unconf_cb, None)) + # Fiat Currency hist_checkbox = QCheckBox() ccy_combo = QComboBox() DIR diff --git a/lib/commands.py b/lib/commands.py t@@ -411,7 +411,7 @@ class Commands: amount = satoshis(amount) final_outputs.append((TYPE_ADDRESS, address, amount)) - coins = self.wallet.get_spendable_coins(domain) + coins = self.wallet.get_spendable_coins(domain, self.config) tx = self.wallet.make_unsigned_transaction(coins, final_outputs, self.config, fee, change_addr) if rbf: tx.set_rbf(True) DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -528,10 +528,11 @@ class Abstract_Wallet(PrintError): u -= v return c, u, x - def get_spendable_coins(self, domain = None): - return self.get_utxos(domain, exclude_frozen=True, mature=True) + def get_spendable_coins(self, domain, config): + confirmed_only = config.get('confirmed_only', True) + return self.get_utxos(domain, exclude_frozen=True, mature=True, confirmed_only=confirmed_only) - def get_utxos(self, domain = None, exclude_frozen = False, mature = False): + def get_utxos(self, domain = None, exclude_frozen = False, mature = False, confirmed_only = False): coins = [] if domain is None: domain = self.get_addresses() t@@ -540,6 +541,8 @@ class Abstract_Wallet(PrintError): for addr in domain: utxos = self.get_addr_utxo(addr) for x in utxos: + if confirmed_only and x['height'] <= 0: + continue if mature and x['coinbase'] and x['height'] + COINBASE_MATURITY > self.get_local_height(): continue coins.append(x) t@@ -863,7 +866,7 @@ class Abstract_Wallet(PrintError): return fee def mktx(self, outputs, password, config, fee=None, change_addr=None, domain=None): - coins = self.get_spendable_coins(domain) + coins = self.get_spendable_coins(domain, config) tx = self.make_unsigned_transaction(coins, outputs, config, fee, change_addr) self.sign_transaction(tx, password) return tx t@@ -1068,7 +1071,7 @@ class Abstract_Wallet(PrintError): txin['type'] = self.txin_type # Add address for utxo that are in wallet if txin.get('scriptSig') == '': - coins = self.get_spendable_coins() + coins = self.get_utxos() for item in coins: if txin.get('prevout_hash') == item.get('prevout_hash') and txin.get('prevout_n') == item.get('prevout_n'): txin['address'] = item.get('address')