1
0

swaps: replace offers dict with class, fix incorrect naming

introduces a class SwapOffer which is used instead of passing around
offers in dicts.

Also fixes incorrect variable naming of swapserver npubs / public keys
by assigning the npub instead of the hex pubkey to
config.SWAPSERVER_NPUB
This commit is contained in:
f321x
2025-05-19 11:19:06 +02:00
parent cc25048e29
commit 3693c38e37
4 changed files with 81 additions and 57 deletions

View File

@@ -2,7 +2,7 @@ import asyncio
import concurrent
import threading
from enum import IntEnum
from typing import Union, Optional
from typing import Union, Optional, TYPE_CHECKING, Sequence
from PyQt6.QtCore import (pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtEnum, QAbstractListModel, Qt,
QModelIndex)
@@ -22,6 +22,9 @@ from .qetypes import QEAmount
from .qewallet import QEWallet
from .util import QtEventListener, qt_event_listener
if TYPE_CHECKING:
from electrum.submarine_swaps import SwapOffer
class InvalidSwapParameters(Exception): pass
@@ -64,16 +67,16 @@ class QESwapServerNPubListModel(QAbstractListModel):
self._services = []
self.endResetModel()
def initModel(self, items):
def initModel(self, items: Sequence['SwapOffer']):
self.beginInsertRows(QModelIndex(), len(items), len(items))
self._services = [{
'npub': x['pubkey'],
'percentage_fee': x['percentage_fee'],
'mining_fee': x['mining_fee'],
'min_amount': x['min_amount'],
'max_forward_amount': x['max_forward_amount'],
'max_reverse_amount': x['max_reverse_amount'],
'timestamp': age(x['timestamp']),
'npub': x.server_npub,
'percentage_fee': x.pairs.percentage,
'mining_fee': x.pairs.mining_fee,
'min_amount': x.pairs.min_amount,
'max_forward_amount': x.pairs.max_forward,
'max_reverse_amount': x.pairs.max_reverse,
'timestamp': age(x.timestamp),
} for x in items]
self.endInsertRows()
self.countChanged.emit()

View File

@@ -106,6 +106,7 @@ from electrum.gui.common_qt.util import TaskThread
if TYPE_CHECKING:
from . import ElectrumGui
from electrum.submarine_swaps import SwapOffer
class StatusBarButton(QToolButton):
@@ -1333,8 +1334,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
if choice is None:
return False
self.config.SWAPSERVER_NPUB = choice
pairs = transport.get_offer(choice)
sm.update_pairs(pairs)
offer = transport.get_offer(choice)
sm.update_pairs(offer.pairs)
return True
@qt_event_listener

View File

@@ -1,4 +1,4 @@
from typing import TYPE_CHECKING, Optional, Union, Tuple
from typing import TYPE_CHECKING, Optional, Union, Tuple, Sequence
from PyQt6.QtCore import pyqtSignal, Qt
from PyQt6.QtWidgets import QLabel, QVBoxLayout, QGridLayout, QPushButton
@@ -21,7 +21,7 @@ from .my_treeview import create_toolbar_with_menu
if TYPE_CHECKING:
from .main_window import ElectrumWindow
from electrum.submarine_swaps import SwapServerTransport
from electrum.submarine_swaps import SwapServerTransport, SwapOffer
CANNOT_RECEIVE_WARNING = _(
"""The requested amount is higher than what you can receive in your currently open channels.
@@ -31,7 +31,7 @@ Do you want to continue?"""
)
ROLE_PUBKEY = Qt.ItemDataRole.UserRole + 1000
ROLE_NPUB = Qt.ItemDataRole.UserRole + 1000
class InvalidSwapParameters(Exception): pass
@@ -51,7 +51,7 @@ class SwapDialog(WindowModalDialog, QtEventListener):
toolbar, menu = create_toolbar_with_menu(self.config, '')
menu.addAction(
_('Choose swap provider'),
lambda: self.window.choose_swapserver_dialog(transport),
lambda: self.choose_swap_server(transport),
).setEnabled(not self.config.SWAPSERVER_URL)
vbox.addLayout(toolbar)
self.description_label = WWLabel(self.get_description())
@@ -395,6 +395,10 @@ class SwapDialog(WindowModalDialog, QtEventListener):
capacityType="receiving" if self.is_reverse else "sending",
)
def choose_swap_server(self, transport: 'SwapServerTransport') -> None:
self.window.choose_swapserver_dialog(transport) # type: ignore
self.update()
class SwapServerDialog(WindowModalDialog, QtEventListener):
@@ -425,21 +429,21 @@ class SwapServerDialog(WindowModalDialog, QtEventListener):
def run(self):
if self.exec() != 1:
return
return None
if item := self.servers_list.currentItem():
return item.data(0, ROLE_PUBKEY)
return item.data(0, ROLE_NPUB)
return None
def update_servers_list(self, servers):
def update_servers_list(self, servers: Sequence['SwapOffer']):
self.servers_list.clear()
from electrum.util import age
items = []
for x in servers:
# fixme: these fields have not been sanitized yet
last_seen = age(x['timestamp'])
fee = f"{x['percentage_fee']}% + {x['mining_fee']} sats"
max_forward = self.window.format_amount(x['max_forward_amount']) + ' ' + self.window.base_unit()
max_reverse = self.window.format_amount(x['max_reverse_amount']) + ' ' + self.window.base_unit()
item = QTreeWidgetItem([x['pubkey'][0:10], fee, max_forward, max_reverse, last_seen])
item.setData(0, ROLE_PUBKEY, x['pubkey'])
last_seen = age(x.timestamp)
fee = f"{x.pairs.percentage}% + {x.pairs.mining_fee} sats"
max_forward = self.window.format_amount(x.pairs.max_forward) + ' ' + self.window.base_unit()
max_reverse = self.window.format_amount(x.pairs.max_reverse) + ' ' + self.window.base_unit()
item = QTreeWidgetItem([x.server_pubkey[0:10], fee, max_forward, max_reverse, last_seen])
item.setData(0, ROLE_NPUB, x.server_npub)
items.append(item)
self.servers_list.insertTopLevelItems(0, items)