|
6 | 6 | from PyQt6.QtCore import (pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtEnum, QAbstractListModel, Qt, |
7 | 7 | QModelIndex) |
8 | 8 |
|
| 9 | +from electrum.gui.qml.qetxfinalizer import QETxFinalizer |
9 | 10 | from electrum.i18n import _ |
10 | 11 | from electrum.bitcoin import DummyAddress |
11 | 12 | from electrum.logging import get_logger |
@@ -156,6 +157,7 @@ def __init__(self, parent=None): |
156 | 157 | super().__init__(parent) |
157 | 158 |
|
158 | 159 | self._wallet = None # type: Optional[QEWallet] |
| 160 | + self._finalizer = None # type: Optional[QETxFinalizer] |
159 | 161 | self._sliderPos = 0 |
160 | 162 | self._rangeMin = -1 |
161 | 163 | self._rangeMax = 1 |
@@ -213,6 +215,11 @@ def wallet(self, wallet: QEWallet): |
213 | 215 | self.run_swap_manager() |
214 | 216 | self.walletChanged.emit() |
215 | 217 |
|
| 218 | + finalizerChanged = pyqtSignal() |
| 219 | + @pyqtProperty(QETxFinalizer, notify=finalizerChanged) |
| 220 | + def finalizer(self): |
| 221 | + return self._finalizer |
| 222 | + |
216 | 223 | sliderPosChanged = pyqtSignal() |
217 | 224 | @pyqtProperty(float, notify=sliderPosChanged) |
218 | 225 | def sliderPos(self): |
@@ -545,24 +552,26 @@ def initSwapSliderRange(self): |
545 | 552 | self.swap_slider_moved() |
546 | 553 |
|
547 | 554 | @profiler |
548 | | - def update_tx(self, onchain_amount: Union[int, str]): |
| 555 | + def update_tx(self, onchain_amount: Union[int, str], fee_policy: Optional[FeePolicy] = None): |
549 | 556 | """Updates the transaction associated with a forward swap.""" |
550 | 557 | if onchain_amount is None: |
551 | 558 | self._tx = None |
552 | 559 | self.valid = False |
553 | 560 | return |
554 | | - outputs = [PartialTxOutput.from_address_and_value(DummyAddress.SWAP, onchain_amount)] |
555 | | - coins = self._wallet.wallet.get_spendable_coins(None) |
556 | | - fee_policy = FeePolicy('eta:2') |
557 | 561 | try: |
558 | | - self._tx = self._wallet.wallet.make_unsigned_transaction( |
559 | | - coins=coins, |
560 | | - outputs=outputs, |
561 | | - fee_policy=fee_policy) |
| 562 | + self._tx = self._create_swap_tx(onchain_amount, fee_policy) |
562 | 563 | except (NotEnoughFunds, NoDynamicFeeEstimates): |
563 | 564 | self._tx = None |
564 | 565 | self.valid = False |
565 | 566 |
|
| 567 | + def _create_swap_tx(self, onchain_amount: int | str, fee_policy: Optional[FeePolicy] = None): |
| 568 | + outputs = [PartialTxOutput.from_address_and_value(DummyAddress.SWAP, onchain_amount)] |
| 569 | + coins = self._wallet.wallet.get_spendable_coins(None) |
| 570 | + fee_policy = fee_policy if fee_policy else FeePolicy('eta:2') |
| 571 | + return self._wallet.wallet.make_unsigned_transaction( |
| 572 | + coins=coins, outputs=outputs, fee_policy=fee_policy |
| 573 | + ) |
| 574 | + |
566 | 575 | @qt_event_listener |
567 | 576 | def on_event_fee_histogram(self, *args): |
568 | 577 | self.swap_slider_moved() |
@@ -627,7 +636,8 @@ def do_normal_swap(self, lightning_amount, onchain_amount): |
627 | 636 | async def swap_task(): |
628 | 637 | assert self.swap_transport is not None, "Swap transport not available" |
629 | 638 | try: |
630 | | - dummy_tx = self._create_tx(onchain_amount) |
| 639 | + # dummy_tx = self._create_tx(onchain_amount) |
| 640 | + dummy_tx = self._finalized_tx |
631 | 641 | self.userinfo = _('Performing swap...') |
632 | 642 | self.state = QESwapHelper.State.Started |
633 | 643 | self._swap, invoice = await self._wallet.wallet.lnworker.swap_manager.request_normal_swap( |
@@ -673,6 +683,27 @@ async def swap_task(): |
673 | 683 |
|
674 | 684 | asyncio.run_coroutine_threadsafe(swap_task(), get_asyncio_loop()) |
675 | 685 |
|
| 686 | + @pyqtSlot() |
| 687 | + def prepNormalSwap(self): |
| 688 | + def mktx(amt, fee_policy: FeePolicy): |
| 689 | + try: |
| 690 | + self._finalized_tx = self._create_swap_tx(amt, fee_policy) |
| 691 | + except (NotEnoughFunds, NoDynamicFeeEstimates): |
| 692 | + self._finalized_tx = None |
| 693 | + return self._finalized_tx |
| 694 | + |
| 695 | + # def acpt(tx): |
| 696 | + # raise Exception('EXPECTED!') |
| 697 | + # self._logger.info(f'acpt {tx=}') |
| 698 | + # assert tx == self._tx, 'acpt tx is not self._tx' |
| 699 | + # assert tx != self._tx, 'acpt tx is self._tx' |
| 700 | + |
| 701 | + self._finalizer = QETxFinalizer(self, make_tx=mktx) #, accept=acpt) |
| 702 | + self._finalizer.canRbf = False |
| 703 | + self._finalizer.amount = QEAmount(amount_sat=self._send_amount) |
| 704 | + self._finalizer.wallet = self._wallet |
| 705 | + self.finalizerChanged.emit() |
| 706 | + |
676 | 707 | def _create_tx(self, onchain_amount: Union[int, str, None]) -> PartialTransaction: |
677 | 708 | # TODO: func taken from qt GUI, this should be common code |
678 | 709 | assert not self.isReverse |
|
0 commit comments