electrum

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

bump_fee_dialog.py (3585B)


      1 from typing import TYPE_CHECKING
      2 
      3 from kivy.app import App
      4 from kivy.factory import Factory
      5 from kivy.properties import ObjectProperty
      6 from kivy.lang import Builder
      7 
      8 from electrum.gui.kivy.i18n import _
      9 
     10 if TYPE_CHECKING:
     11     from ...main_window import ElectrumWindow
     12 
     13 
     14 Builder.load_string('''
     15 <BumpFeeDialog@Popup>
     16     title: _('Bump fee')
     17     size_hint: 0.8, 0.8
     18     pos_hint: {'top':0.9}
     19     BoxLayout:
     20         orientation: 'vertical'
     21         padding: '10dp'
     22 
     23         GridLayout:
     24             height: self.minimum_height
     25             size_hint_y: None
     26             cols: 1
     27             spacing: '10dp'
     28             BoxLabel:
     29                 id: old_fee
     30                 text: _('Current Fee')
     31                 value: ''
     32             BoxLabel:
     33                 id: old_feerate
     34                 text: _('Current Fee rate')
     35                 value: ''
     36         Label:
     37             id: tooltip1
     38             text: ''
     39             size_hint_y: None
     40         Label:
     41             id: tooltip2
     42             text: ''
     43             size_hint_y: None
     44         Slider:
     45             id: slider
     46             range: 0, 4
     47             step: 1
     48             on_value: root.on_slider(self.value)
     49         BoxLayout:
     50             orientation: 'horizontal'
     51             size_hint: 1, 0.2
     52             Label:
     53                 text: _('Final')
     54             CheckBox:
     55                 id: final_cb
     56         Widget:
     57             size_hint: 1, 1
     58         BoxLayout:
     59             orientation: 'horizontal'
     60             size_hint: 1, 0.5
     61             Button:
     62                 text: 'Cancel'
     63                 size_hint: 0.5, None
     64                 height: '48dp'
     65                 on_release: root.dismiss()
     66             Button:
     67                 text: 'OK'
     68                 size_hint: 0.5, None
     69                 height: '48dp'
     70                 on_release:
     71                     root.dismiss()
     72                     root.on_ok()
     73 ''')
     74 
     75 class BumpFeeDialog(Factory.Popup):
     76 
     77     def __init__(self, app: 'ElectrumWindow', fee, size, callback):
     78         Factory.Popup.__init__(self)
     79         self.app = app
     80         self.init_fee = fee
     81         self.tx_size = size
     82         self.callback = callback
     83         self.config = app.electrum_config
     84         self.mempool = self.config.use_mempool_fees()
     85         self.dynfees = self.config.is_dynfee() and bool(self.app.network) and self.config.has_dynamic_fees_ready()
     86         self.ids.old_fee.value = self.app.format_amount_and_units(self.init_fee)
     87         self.ids.old_feerate.value = self.app.format_fee_rate(fee / self.tx_size * 1000)
     88         self.update_slider()
     89         self.update_text()
     90 
     91     def update_text(self):
     92         pos = int(self.ids.slider.value)
     93         new_fee_rate = self.get_fee_rate()
     94         text, tooltip = self.config.get_fee_text(pos, self.dynfees, self.mempool, new_fee_rate)
     95         self.ids.tooltip1.text = text
     96         self.ids.tooltip2.text = tooltip
     97 
     98     def update_slider(self):
     99         slider = self.ids.slider
    100         maxp, pos, fee_rate = self.config.get_fee_slider(self.dynfees, self.mempool)
    101         slider.range = (0, maxp)
    102         slider.step = 1
    103         slider.value = pos
    104 
    105     def get_fee_rate(self):
    106         pos = int(self.ids.slider.value)
    107         if self.dynfees:
    108             fee_rate = self.config.depth_to_fee(pos) if self.mempool else self.config.eta_to_fee(pos)
    109         else:
    110             fee_rate = self.config.static_fee(pos)
    111         return fee_rate  # sat/kbyte
    112 
    113     def on_ok(self):
    114         new_fee_rate = self.get_fee_rate() / 1000
    115         is_final = self.ids.final_cb.active
    116         self.callback(new_fee_rate, is_final)
    117 
    118     def on_slider(self, value):
    119         self.update_text()