Skip to content

Commit 4e489ac

Browse files
committed
qml: add deadline property to QETxFinalizer, use deadline for submarine swaps
1 parent 84d623b commit 4e489ac

4 files changed

Lines changed: 34 additions & 2 deletions

File tree

electrum/gui/qml/components/controls/FeeMethodComboBox.qml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ ElComboBox {
1111
textRole: 'text'
1212
valueRole: 'value'
1313

14-
model: [
14+
// NOTE: deadline property only exists on QETxFinalizer, but as undefined == false, that's ok.
15+
model: feeslider.deadline ? [
16+
{ text: qsTr('ETA'), value: FeeSlider.FSMethod.ETA }
17+
] : [
1518
{ text: qsTr('ETA'), value: FeeSlider.FSMethod.ETA },
1619
{ text: qsTr('Mempool'), value: FeeSlider.FSMethod.MEMPOOL },
1720
{ text: qsTr('Feerate'), value: FeeSlider.FSMethod.FEERATE },

electrum/gui/qml/qeswaphelper.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
from electrum.transaction import PartialTxOutput, PartialTransaction
1414
from electrum.util import (NotEnoughFunds, NoDynamicFeeEstimates, profiler, get_asyncio_loop, age,
1515
wait_for2, send_exception_to_crash_reporter)
16-
from electrum.submarine_swaps import NostrTransport, SwapServerTransport, pubkey_to_rgb_color
16+
from electrum.submarine_swaps import (
17+
NostrTransport, SwapServerTransport, pubkey_to_rgb_color, LOCKTIME_DELTA_REFUND, LOCKTIME_DELTA_REFUND_BUFFER
18+
)
1719
from electrum.fee_policy import FeePolicy
1820

1921
from electrum.gui.common_qt.util import QtEventListener, qt_event_listener
@@ -708,6 +710,7 @@ def mktx(amt, fee_policy: FeePolicy):
708710
self._finalizer.canRbf = False
709711
self._finalizer.amount = QEAmount(amount_sat=self._send_amount)
710712
self._finalizer.wallet = self._wallet
713+
self._finalizer.deadline = LOCKTIME_DELTA_REFUND - LOCKTIME_DELTA_REFUND_BUFFER # 10-block buffer before refund deadline
711714
self.finalizerChanged.emit()
712715

713716
def do_reverse_swap(self, lightning_amount, onchain_amount):

electrum/gui/qml/qetxfinalizer.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ def __init__(
408408
self._effectiveAmount = QEAmount()
409409
self._extraFee = QEAmount()
410410
self._canRbf = False
411+
self._deadline = 0 # if deadline is set > 0, finalizer should only allow ETA feepolicies
411412

412413
addressChanged = pyqtSignal()
413414
@pyqtProperty(str, notify=addressChanged)
@@ -462,6 +463,22 @@ def canRbf(self, canRbf):
462463
self.canRbfChanged.emit()
463464
self.rbf = self._canRbf # if we can RbF, we do RbF
464465

466+
deadlineChanged = pyqtSignal()
467+
@pyqtProperty(int, notify=deadlineChanged)
468+
def deadline(self):
469+
return self._deadline
470+
471+
@deadline.setter
472+
def deadline(self, relative_num_blocks: int) -> None:
473+
"""if set, limits the finalizer to ETA fee policies that meet the deadline.
474+
deadline is in relative blocks"""
475+
if self._deadline != relative_num_blocks:
476+
self._deadline = relative_num_blocks
477+
self.deadlineChanged.emit()
478+
if self._deadline > 0:
479+
self.method = FeeSlider.FSMethod.ETA
480+
self.update()
481+
465482
@profiler
466483
def make_tx(self, amount: int | str) -> PartialTransaction:
467484
self._logger.debug(f'make_tx amount={amount}')
@@ -508,6 +525,14 @@ def update(self):
508525
self.validChanged.emit()
509526
return
510527

528+
if self._deadline:
529+
if self._deadline < self._fee_policy.value:
530+
self._logger.info(f"current fee '{str(self._fee_policy)}' below deadline {str(self._deadline)}")
531+
self.warning = _("Current fee doesn't meet deadline of {} blocks").format(self._deadline)
532+
self._valid = False
533+
self.validChanged.emit()
534+
return
535+
511536
self._tx = tx
512537

513538
amount = self._amount.satsInt if not self._amount.isMax else tx.output_value()

electrum/submarine_swaps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
assert MAX_LOCKTIME_DELTA < lnutil.MIN_FINAL_CLTV_DELTA_ACCEPTED
7171
assert MAX_LOCKTIME_DELTA < MIN_FINAL_CLTV_DELTA_FOR_CLIENT
7272

73+
LOCKTIME_DELTA_REFUND_BUFFER = 10 # used for min ETA fee calculation
7374

7475
# The script of the reverse swaps has one extra check in it to verify
7576
# that the length of the preimage is 32. This is required because in

0 commit comments

Comments
 (0)