electrum

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

commit 8ad0c248a5fd83fda84760063173310fa4f07aaa
parent 1f83711c268cf4d3b9d441a6bf4ab20172878c57
Author: SomberNight <somber.night@protonmail.com>
Date:   Sat, 20 Apr 2019 02:09:45 +0200

cpfp: include fee already paid by parent tx in calculation

fixes #5244

Diffstat:
Melectrum/gui/qt/main_window.py | 44+++++++++++++++++++++++++++++++++++---------
1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py @@ -733,6 +733,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): return text def format_fee_rate(self, fee_rate): + # fee_rate is in sat/kB return format_fee_satoshis(fee_rate/1000, num_zeros=self.num_zeros) + ' sat/byte' def get_decimal_point(self): @@ -3273,6 +3274,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): def cpfp(self, parent_tx, new_tx): total_size = parent_tx.estimated_size() + new_tx.estimated_size() + parent_fee = self.wallet.get_tx_fee(parent_tx) + if parent_fee is None: + self.show_error(_("Can't CPFP: unknown fee for parent transaction.")) + return d = WindowModalDialog(self, _('Child Pays for Parent')) vbox = QVBoxLayout(d) msg = ( @@ -3297,21 +3302,42 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): grid.addWidget(output_amount, 2, 1) fee_e = BTCAmountEdit(self.get_decimal_point) # FIXME with dyn fees, without estimates, there are all kinds of crashes here - def f(x): - a = max_fee - fee_e.get_amount() - output_amount.setText((self.format_amount(a) + ' ' + self.base_unit()) if a else '') - fee_e.textChanged.connect(f) - fee = self.config.fee_per_kb() * total_size / 1000 + combined_fee = QLabel('') + combined_feerate = QLabel('') + def on_fee_edit(x): + out_amt = max_fee - fee_e.get_amount() + out_amt_str = (self.format_amount(out_amt) + ' ' + self.base_unit()) if out_amt else '' + output_amount.setText(out_amt_str) + comb_fee = parent_fee + fee_e.get_amount() + comb_fee_str = (self.format_amount(comb_fee) + ' ' + self.base_unit()) if comb_fee else '' + combined_fee.setText(comb_fee_str) + comb_feerate = comb_fee / total_size * 1000 + comb_feerate_str = self.format_fee_rate(comb_feerate) if comb_feerate else '' + combined_feerate.setText(comb_feerate_str) + fee_e.textChanged.connect(on_fee_edit) + def get_child_fee_from_total_feerate(fee_per_kb): + fee = fee_per_kb * total_size / 1000 - parent_fee + fee = min(max_fee, fee) + fee = max(total_size, fee) # pay at least 1 sat/byte for combined size + return fee + suggested_feerate = self.config.fee_per_kb() + if suggested_feerate is None: + self.show_error(f'''{_("Can't CPFP'")}: {_('Dynamic fee estimates not available')}''') + return + fee = get_child_fee_from_total_feerate(suggested_feerate) fee_e.setAmount(fee) - grid.addWidget(QLabel(_('Fee' + ':')), 3, 0) + grid.addWidget(QLabel(_('Fee for child') + ':'), 3, 0) grid.addWidget(fee_e, 3, 1) def on_rate(dyn, pos, fee_rate): - fee = fee_rate * total_size / 1000 - fee = min(max_fee, fee) + fee = get_child_fee_from_total_feerate(fee_rate) fee_e.setAmount(fee) fee_slider = FeeSlider(self, self.config, on_rate) fee_slider.update() grid.addWidget(fee_slider, 4, 1) + grid.addWidget(QLabel(_('Total fee') + ':'), 5, 0) + grid.addWidget(combined_fee, 5, 1) + grid.addWidget(QLabel(_('Total feerate') + ':'), 6, 0) + grid.addWidget(combined_feerate, 6, 1) vbox.addLayout(grid) vbox.addLayout(Buttons(CancelButton(d), OkButton(d))) if not d.exec_(): @@ -3325,7 +3351,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): self.show_transaction(new_tx) def bump_fee_dialog(self, tx): - is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx) + fee = self.wallet.get_tx_fee(tx) if fee is None: self.show_error(_("Can't bump fee: unknown fee for original transaction.")) return