tbump_fee_dialog.py - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
tbump_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()