Use dynamic fees by default, show fee slider in send tab, and discretize fee levels.
This commit is contained in:
parent
d83058e2e8
commit
3314b3acc7
|
@ -1008,9 +1008,33 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||
+ _('The amount of fee can be decided freely by the sender. However, transactions with low fees take more time to be processed.') + '\n\n'\
|
||||
+ _('A suggested fee is automatically added to this field. You may override it. The suggested fee increases with the size of the transaction.')
|
||||
self.fee_e_label = HelpLabel(_('Fee'), msg)
|
||||
|
||||
self.fee_slider = QSlider(Qt.Horizontal, self)
|
||||
self.fee_slider.setRange(0, 4)
|
||||
self.fee_slider.setTickInterval(1)
|
||||
self.fee_slider.setTickPosition(QSlider.TicksBelow)
|
||||
self.fee_slider.setToolTip(_(''))
|
||||
self.fee_description = QLabel('')
|
||||
def slider_moved():
|
||||
i = self.fee_slider.sliderPosition()
|
||||
self.fee_description.setText(['slow','','medium','','fast'][i])
|
||||
def slider_released():
|
||||
self.config.set_key('fee_level', self.fee_slider.sliderPosition(), False)
|
||||
self.update_fee()
|
||||
self.fee_slider.valueChanged.connect(slider_moved)
|
||||
self.fee_slider.sliderReleased.connect(slider_released)
|
||||
self.fee_slider.setValue(self.config.get('fee_level', 2))
|
||||
|
||||
self.fee_e = BTCAmountEdit(self.get_decimal_point)
|
||||
self.fee_e.textEdited.connect(self.update_fee)
|
||||
# This is so that when the user blanks the fee and moves on,
|
||||
# we go back to auto-calculate mode and put a fee back.
|
||||
self.fee_e.editingFinished.connect(self.update_fee)
|
||||
|
||||
grid.addWidget(self.fee_e_label, 5, 0)
|
||||
grid.addWidget(self.fee_e, 5, 1)
|
||||
grid.addWidget(self.fee_slider, 5, 1)
|
||||
grid.addWidget(self.fee_description, 5, 2)
|
||||
|
||||
self.send_button = EnterButton(_("Send"), self.do_send)
|
||||
self.clear_button = EnterButton(_("Clear"), self.do_clear)
|
||||
|
@ -1036,10 +1060,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||
self.amount_e.shortcut.connect(on_shortcut)
|
||||
self.payto_e.textChanged.connect(self.update_fee)
|
||||
self.amount_e.textEdited.connect(self.update_fee)
|
||||
self.fee_e.textEdited.connect(self.update_fee)
|
||||
# This is so that when the user blanks the fee and moves on,
|
||||
# we go back to auto-calculate mode and put a fee back.
|
||||
self.fee_e.editingFinished.connect(self.update_fee)
|
||||
|
||||
def entry_changed():
|
||||
text = ""
|
||||
|
@ -1123,9 +1143,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||
self.fee_e.setAmount(fee)
|
||||
|
||||
def update_fee_edit(self):
|
||||
b = self.config.get('can_edit_fees', False)
|
||||
self.fee_e.setVisible(b)
|
||||
self.fee_e_label.setVisible(b)
|
||||
b = self.config.get('dynamic_fees', True)
|
||||
self.fee_slider.setVisible(b)
|
||||
self.fee_description.setVisible(b)
|
||||
self.fee_e.setVisible(not b)
|
||||
|
||||
def from_list_delete(self, item):
|
||||
i = self.from_list.indexOfTopLevelItem(item)
|
||||
|
@ -2625,9 +2646,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||
nz.valueChanged.connect(on_nz)
|
||||
gui_widgets.append((nz_label, nz))
|
||||
|
||||
msg = '\n'.join([
|
||||
_('Fee per kilobyte of transaction.')
|
||||
])
|
||||
msg = _('Fee per kilobyte of transaction.')
|
||||
fee_label = HelpLabel(_('Transaction fee per kb') + ':', msg)
|
||||
fee_e = BTCkBEdit(self.get_decimal_point)
|
||||
def on_fee(is_done):
|
||||
|
@ -2640,41 +2659,22 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||
fee_e.textEdited.connect(lambda: on_fee(False))
|
||||
fee_widgets.append((fee_label, fee_e))
|
||||
|
||||
dynfee_cb = QCheckBox(_('Dynamic fees'))
|
||||
dynfee_cb.setChecked(self.config.get('dynamic_fees', False))
|
||||
dynfee_cb = QCheckBox(_('Use dynamic fees'))
|
||||
dynfee_cb.setChecked(self.config.get('dynamic_fees', True))
|
||||
dynfee_cb.setToolTip(_("Use a fee per kB value recommended by the server."))
|
||||
dynfee_sl = QSlider(Qt.Horizontal, self)
|
||||
# The pref is from 0 to 100; add 50 to get the factor from 50% to 150%
|
||||
dynfee_sl.setRange(0, 100)
|
||||
dynfee_sl.setTickInterval(10)
|
||||
dynfee_sl.setTickPosition(QSlider.TicksBelow)
|
||||
dynfee_sl.setValue(self.config.get('fee_factor', 50))
|
||||
dynfee_sl.setToolTip("Min = 50%, Max = 150%")
|
||||
multiplier_label = HelpLabel("", _("Multiply the recommended fee/kb value by a constant factor. Min = 50%, Max = 150%"))
|
||||
fee_widgets.append((dynfee_cb, dynfee_sl))
|
||||
fee_widgets.append((None, multiplier_label))
|
||||
|
||||
fee_widgets.append((dynfee_cb, None))
|
||||
def update_feeperkb():
|
||||
fee_e.setAmount(self.wallet.fee_per_kb(self.config))
|
||||
b = self.config.get('dynamic_fees', False)
|
||||
dynfee_sl.setEnabled(b)
|
||||
multiplier_label.setEnabled(b)
|
||||
fee_e.setEnabled(not b)
|
||||
def slider_moved():
|
||||
multiplier_label.setText(_('Fee multiplier: %3d%%')
|
||||
% (dynfee_sl.sliderPosition() + 50))
|
||||
def slider_released():
|
||||
self.config.set_key('fee_factor', dynfee_sl.sliderPosition(), False)
|
||||
update_feeperkb()
|
||||
def on_dynfee(x):
|
||||
dynfee = x == Qt.Checked
|
||||
self.config.set_key('dynamic_fees', dynfee)
|
||||
update_feeperkb()
|
||||
self.update_fee_edit()
|
||||
dynfee_cb.stateChanged.connect(on_dynfee)
|
||||
dynfee_sl.valueChanged.connect(slider_moved)
|
||||
dynfee_sl.sliderReleased.connect(slider_released)
|
||||
update_feeperkb()
|
||||
slider_moved()
|
||||
#slider_moved()
|
||||
|
||||
msg = _('OpenAlias record, used to receive coins and to sign payment requests.') + '\n\n'\
|
||||
+ _('The following alias providers are available:') + '\n'\
|
||||
|
@ -2835,14 +2835,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
|||
showtx_cb.setToolTip(_('Display the details of your transactions before signing it.'))
|
||||
tx_widgets.append((showtx_cb, None))
|
||||
|
||||
can_edit_fees_cb = QCheckBox(_('Set transaction fees manually'))
|
||||
can_edit_fees_cb.setChecked(self.config.get('can_edit_fees', False))
|
||||
def on_editfees(x):
|
||||
self.config.set_key('can_edit_fees', x == Qt.Checked)
|
||||
self.update_fee_edit()
|
||||
can_edit_fees_cb.stateChanged.connect(on_editfees)
|
||||
can_edit_fees_cb.setToolTip(_('This option lets you edit fees in the send tab.'))
|
||||
fee_widgets.append((can_edit_fees_cb, None))
|
||||
|
||||
def fmt_docs(key, klass):
|
||||
lines = [ln.lstrip(" ") for ln in klass.__doc__.split("\n")]
|
||||
|
|
|
@ -909,9 +909,15 @@ class Abstract_Wallet(PrintError):
|
|||
|
||||
def fee_per_kb(self, config):
|
||||
b = config.get('dynamic_fees')
|
||||
f = config.get('fee_factor', 50)
|
||||
F = config.get('fee_per_kb', bitcoin.RECOMMENDED_FEE)
|
||||
return min(10*bitcoin.RECOMMENDED_FEE, self.network.fee*(50 + f)/100) if b and self.network and self.network.fee else F
|
||||
if b and self.network and self.network.fee:
|
||||
i = config.get('fee_level', 2)
|
||||
fee = self.network.fee*(i+1)/3
|
||||
fee = max(fee, self.relayfee())
|
||||
fee = min(10*bitcoin.RECOMMENDED_FEE, fee)
|
||||
return fee
|
||||
else:
|
||||
return F
|
||||
|
||||
def relayfee(self):
|
||||
RELAY_FEE = 5000
|
||||
|
|
Loading…
Reference in New Issue