tfee_dialog.py - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
tfee_dialog.py (4865B)
---
1 from kivy.app import App
2 from kivy.factory import Factory
3 from kivy.properties import ObjectProperty
4 from kivy.lang import Builder
5
6 from electrum.gui.kivy.i18n import _
7
8 Builder.load_string('''
9 <FeeDialog@Popup>
10 id: popup
11 title: _('Transaction Fees')
12 size_hint: 0.8, 0.8
13 pos_hint: {'top':0.9}
14 method: 0
15 BoxLayout:
16 orientation: 'vertical'
17 BoxLayout:
18 orientation: 'horizontal'
19 size_hint: 1, 0.5
20 Label:
21 text: _('Method') + ':'
22 Button:
23 text: _('Mempool') if root.method == 2 else _('ETA') if root.method == 1 else _('Static')
24 background_color: (0,0,0,0)
25 bold: True
26 on_release:
27 root.method = (root.method + 1) % 3
28 root.update_slider()
29 root.update_text()
30 BoxLayout:
31 orientation: 'horizontal'
32 size_hint: 1, 0.5
33 Label:
34 text: (_('Target') if root.method > 0 else _('Fee')) + ':'
35 Label:
36 id: fee_target
37 text: ''
38 Slider:
39 id: slider
40 range: 0, 4
41 step: 1
42 on_value: root.on_slider(self.value)
43 Widget:
44 size_hint: 1, 0.5
45 BoxLayout:
46 orientation: 'horizontal'
47 size_hint: 1, 0.5
48 TopLabel:
49 id: fee_estimate
50 text: ''
51 font_size: '14dp'
52 Widget:
53 size_hint: 1, 0.5
54 BoxLayout:
55 orientation: 'horizontal'
56 size_hint: 1, 0.5
57 Button:
58 text: 'Cancel'
59 size_hint: 0.5, None
60 height: '48dp'
61 on_release: popup.dismiss()
62 Button:
63 text: 'OK'
64 size_hint: 0.5, None
65 height: '48dp'
66 on_release:
67 root.on_ok()
68 root.dismiss()
69 ''')
70
71
72
73
74 class FeeSliderDialog:
75
76 def __init__(self, config, slider):
77 self.config = config
78 self.slider = slider
79 self.read_config()
80 self.update_slider()
81
82 def get_method(self):
83 dynfees = self.method > 0
84 mempool = self.method == 2
85 return dynfees, mempool
86
87 def update_slider(self):
88 dynfees, mempool = self.get_method()
89 maxp, pos, fee_rate = self.config.get_fee_slider(dynfees, mempool)
90 self.slider.range = (0, maxp)
91 self.slider.step = 1
92 self.slider.value = pos
93
94 def read_config(self):
95 mempool = self.config.use_mempool_fees()
96 dynfees = self.config.is_dynfee()
97 self.method = (2 if mempool else 1) if dynfees else 0
98
99 def save_config(self):
100 value = int(self.slider.value)
101 dynfees, mempool = self.get_method()
102 self.config.set_key('dynamic_fees', dynfees, False)
103 self.config.set_key('mempool_fees', mempool, False)
104 if dynfees:
105 if mempool:
106 self.config.set_key('depth_level', value, True)
107 else:
108 self.config.set_key('fee_level', value, True)
109 else:
110 self.config.set_key('fee_per_kb', self.config.static_fee(value), True)
111
112 def update_text(self):
113 pass
114
115
116 class FeeDialog(FeeSliderDialog, Factory.Popup):
117
118 def __init__(self, app, config, callback):
119 Factory.Popup.__init__(self)
120 FeeSliderDialog.__init__(self, config, self.ids.slider)
121 self.app = app
122 self.config = config
123 self.callback = callback
124 self.update_text()
125
126 def on_ok(self):
127 self.save_config()
128 self.callback()
129
130 def on_slider(self, value):
131 self.update_text()
132
133 def update_text(self):
134 pos = int(self.ids.slider.value)
135 dynfees, mempool = self.get_method()
136 if self.method == 2:
137 fee_rate = self.config.depth_to_fee(pos)
138 target, estimate = self.config.get_fee_text(pos, dynfees, mempool, fee_rate)
139 msg = 'In the current network conditions, in order to be positioned %s, a transaction will require a fee of %s.' % (target, estimate)
140 elif self.method == 1:
141 fee_rate = self.config.eta_to_fee(pos)
142 target, estimate = self.config.get_fee_text(pos, dynfees, mempool, fee_rate)
143 msg = 'In the last few days, transactions that confirmed %s usually paid a fee of at least %s.' % (target.lower(), estimate)
144 else:
145 fee_rate = self.config.static_fee(pos)
146 target, estimate = self.config.get_fee_text(pos, dynfees, True, fee_rate)
147 msg = 'In the current network conditions, a transaction paying %s would be positioned %s.' % (target, estimate)
148 self.ids.fee_target.text = target
149 self.ids.fee_estimate.text = msg