Skip to content

Commit 7a8466f

Browse files
committed
qml: add deadline property to QETxFinalizer, use deadline for submarine swaps
1 parent 60c5145 commit 7a8466f

File tree

4 files changed

+36
-2
lines changed

4 files changed

+36
-2
lines changed

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)
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 .auth import AuthMixin, auth_protect
@@ -700,6 +702,7 @@ def mktx(amt, fee_policy: FeePolicy):
700702
self._finalizer.canRbf = False
701703
self._finalizer.amount = QEAmount(amount_sat=self._send_amount)
702704
self._finalizer.wallet = self._wallet
705+
self._finalizer.deadline = LOCKTIME_DELTA_REFUND - LOCKTIME_DELTA_REFUND_BUFFER # 10-block buffer before refund deadline
703706
self.finalizerChanged.emit()
704707

705708
def do_reverse_swap(self, lightning_amount, onchain_amount):

electrum/gui/qml/qetxfinalizer.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ def __init__(
330330
self._effectiveAmount = QEAmount()
331331
self._extraFee = QEAmount()
332332
self._canRbf = False
333+
self._deadline = 0 # if deadline is set > 0, finalizer should only allow ETA feepolicies
333334

334335
addressChanged = pyqtSignal()
335336
@pyqtProperty(str, notify=addressChanged)
@@ -382,6 +383,21 @@ def canRbf(self, canRbf):
382383
self.canRbfChanged.emit()
383384
self.rbf = self._canRbf # if we can RbF, we do RbF
384385

386+
deadlineChanged = pyqtSignal()
387+
@pyqtProperty(int, notify=deadlineChanged)
388+
def deadline(self):
389+
return self._deadline
390+
391+
@deadline.setter
392+
def deadline(self, relative_num_blocks: int) -> None:
393+
"""if set, limits the finalizer to ETA fee policies that meet the deadline.
394+
deadline is in relative blocks"""
395+
if self._deadline != relative_num_blocks:
396+
self._deadline = relative_num_blocks
397+
self.deadlineChanged.emit()
398+
if self._deadline > 0:
399+
self.method = FeeSlider.FSMethod.ETA
400+
385401
@profiler
386402
def make_tx(self, amount: int | str) -> PartialTransaction:
387403
self._logger.debug(f'make_tx amount={amount}')
@@ -423,6 +439,17 @@ def update(self):
423439
self.validChanged.emit()
424440
return
425441

442+
if self._deadline:
443+
deadline_fee_policy = FeePolicy(f'eta:{self._deadline}')
444+
deadline_fee = deadline_fee_policy.fee_per_kb(self._wallet.wallet.network)
445+
current_fee = self._fee_policy.fee_per_kb(self._wallet.wallet.network)
446+
if current_fee < deadline_fee:
447+
self._logger.info(f"current fee '{str(self._fee_policy)}' below deadline {str(deadline_fee_policy)}")
448+
self.warning = _("Current fee doesn't meet deadline of {} blocks").format(self._deadline)
449+
self._valid = False
450+
self.validChanged.emit()
451+
return
452+
426453
self._tx = tx
427454

428455
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
@@ -67,6 +67,7 @@
6767
assert MAX_LOCKTIME_DELTA < lnutil.MIN_FINAL_CLTV_DELTA_FOR_INVOICE
6868
assert MAX_LOCKTIME_DELTA < MIN_FINAL_CLTV_DELTA_FOR_CLIENT
6969

70+
LOCKTIME_DELTA_REFUND_BUFFER = 10 # used for min ETA fee calculation
7071

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

0 commit comments

Comments
 (0)