@@ -733,6 +733,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||||||
return text
|
return text
|
||||||
|
|
||||||
def format_fee_rate(self, fee_rate):
|
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'
|
return format_fee_satoshis(fee_rate/1000, num_zeros=self.num_zeros) + ' sat/byte'
|
||||||
|
|
||||||
def get_decimal_point(self):
|
def get_decimal_point(self):
|
||||||
@@ -3273,6 +3274,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||||||
|
|
||||||
def cpfp(self, parent_tx, new_tx):
|
def cpfp(self, parent_tx, new_tx):
|
||||||
total_size = parent_tx.estimated_size() + new_tx.estimated_size()
|
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'))
|
d = WindowModalDialog(self, _('Child Pays for Parent'))
|
||||||
vbox = QVBoxLayout(d)
|
vbox = QVBoxLayout(d)
|
||||||
msg = (
|
msg = (
|
||||||
@@ -3297,21 +3302,42 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||||||
grid.addWidget(output_amount, 2, 1)
|
grid.addWidget(output_amount, 2, 1)
|
||||||
fee_e = BTCAmountEdit(self.get_decimal_point)
|
fee_e = BTCAmountEdit(self.get_decimal_point)
|
||||||
# FIXME with dyn fees, without estimates, there are all kinds of crashes here
|
# FIXME with dyn fees, without estimates, there are all kinds of crashes here
|
||||||
def f(x):
|
combined_fee = QLabel('')
|
||||||
a = max_fee - fee_e.get_amount()
|
combined_feerate = QLabel('')
|
||||||
output_amount.setText((self.format_amount(a) + ' ' + self.base_unit()) if a else '')
|
def on_fee_edit(x):
|
||||||
fee_e.textChanged.connect(f)
|
out_amt = max_fee - fee_e.get_amount()
|
||||||
fee = self.config.fee_per_kb() * total_size / 1000
|
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)
|
fee_e.setAmount(fee)
|
||||||
grid.addWidget(QLabel(_('Fee' + ':')), 3, 0)
|
grid.addWidget(QLabel(_('Fee for child') + ':'), 3, 0)
|
||||||
grid.addWidget(fee_e, 3, 1)
|
grid.addWidget(fee_e, 3, 1)
|
||||||
def on_rate(dyn, pos, fee_rate):
|
def on_rate(dyn, pos, fee_rate):
|
||||||
fee = fee_rate * total_size / 1000
|
fee = get_child_fee_from_total_feerate(fee_rate)
|
||||||
fee = min(max_fee, fee)
|
|
||||||
fee_e.setAmount(fee)
|
fee_e.setAmount(fee)
|
||||||
fee_slider = FeeSlider(self, self.config, on_rate)
|
fee_slider = FeeSlider(self, self.config, on_rate)
|
||||||
fee_slider.update()
|
fee_slider.update()
|
||||||
grid.addWidget(fee_slider, 4, 1)
|
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(grid)
|
||||||
vbox.addLayout(Buttons(CancelButton(d), OkButton(d)))
|
vbox.addLayout(Buttons(CancelButton(d), OkButton(d)))
|
||||||
if not d.exec_():
|
if not d.exec_():
|
||||||
@@ -3325,7 +3351,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||||||
self.show_transaction(new_tx)
|
self.show_transaction(new_tx)
|
||||||
|
|
||||||
def bump_fee_dialog(self, 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:
|
if fee is None:
|
||||||
self.show_error(_("Can't bump fee: unknown fee for original transaction."))
|
self.show_error(_("Can't bump fee: unknown fee for original transaction."))
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user