electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit faa17f9818270f5a0ef2b8109b9d37bd52fd4c5f
parent 255458da0af34d75f7b49803cf5e90fdf3bf26c5
Author: ThomasV <thomasv@electrum.org>
Date:   Sat,  1 Jul 2017 22:20:10 +0200

Option to send only confirmed coins (fix #2395)

Diffstat:
Mgui/kivy/main_window.py | 2+-
Mgui/qt/main_window.py | 16++++++++++++++--
Mlib/commands.py | 2+-
Mlib/wallet.py | 13++++++++-----
4 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py @@ -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) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py @@ -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) @@ -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) @@ -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() diff --git a/lib/commands.py b/lib/commands.py @@ -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) diff --git a/lib/wallet.py b/lib/wallet.py @@ -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() @@ -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) @@ -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 @@ -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')