qml: add type hints for QVariant pyqtProperty workarounds
What changed, and why it matters
This commit only adds Python type hints (annotations like `-> QEWallet` and `-> QEAmount`) to existing QML GUI property getter and setter methods. It does not change any runtime behavior, logic, or security checks. There is no security issue here.
No action required. This is a non-functional type-hint cleanup.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch annotates pyqtProperty-decorated getters and setters in Electrum’s QML GUI layer with concrete return/argument types (e.g., QEWallet, QEAmount). These properties already exposed QVariant at the Qt meta-object level; the Python annotations are documentation/static-analysis hints only. Runtime assertions such as assert tosend is None or isinstance(tosend, QEAmount) remain unchanged. No functional code was modified.
Changed components
electrum/gui/qml/qeaddressdetails.pyelectrum/gui/qml/qechannelopener.pyelectrum/gui/qml/qeinvoice.pyelectrum/gui/qml/qelnpaymentdetails.pyelectrum/gui/qml/qerequestdetails.pyelectrum/gui/qml/qeswaphelper.pyelectrum/gui/qml/qetxdetails.pyelectrum/gui/qml/qetxfinalizer.pyInspect captured patch +25 / −25
diff --git a/electrum/gui/qml/qeaddressdetails.py b/electrum/gui/qml/qeaddressdetails.py
index c17f50d..fbe1101 100644
--- a/electrum/gui/qml/qeaddressdetails.py
+++ b/electrum/gui/qml/qeaddressdetails.py
@@ -36,7 +36,7 @@ class QEAddressDetails(AuthMixin, QObject):
walletChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=walletChanged)
- def wallet(self):
+ def wallet(self) -> QEWallet:
return self._wallet
@wallet.setter
diff --git a/electrum/gui/qml/qechannelopener.py b/electrum/gui/qml/qechannelopener.py
index f01fd77..957aa30 100644
--- a/electrum/gui/qml/qechannelopener.py
+++ b/electrum/gui/qml/qechannelopener.py
@@ -55,7 +55,7 @@ class QEChannelOpener(QObject, AuthMixin):
walletChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=walletChanged)
- def wallet(self):
+ def wallet(self) -> QEWallet:
return self._wallet
@wallet.setter
@@ -80,7 +80,7 @@ class QEChannelOpener(QObject, AuthMixin):
amountChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=amountChanged)
- def amount(self):
+ def amount(self) -> QEAmount:
return self._amount
@amount.setter
diff --git a/electrum/gui/qml/qeinvoice.py b/electrum/gui/qml/qeinvoice.py
index e9d30fc..696506f 100644
--- a/electrum/gui/qml/qeinvoice.py
+++ b/electrum/gui/qml/qeinvoice.py
@@ -112,7 +112,7 @@ class QEInvoice(QObject, QtEventListener):
walletChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=walletChanged)
- def wallet(self):
+ def wallet(self) -> QEWallet:
return self._wallet
@wallet.setter
@@ -155,7 +155,7 @@ class QEInvoice(QObject, QtEventListener):
return self._amount
@pyqtProperty(QVariant, notify=amountOverrideChanged)
- def amountOverride(self):
+ def amountOverride(self) -> QEAmount:
return self._amountOverride
@amountOverride.setter
diff --git a/electrum/gui/qml/qelnpaymentdetails.py b/electrum/gui/qml/qelnpaymentdetails.py
index 2857c18..94e9613 100644
--- a/electrum/gui/qml/qelnpaymentdetails.py
+++ b/electrum/gui/qml/qelnpaymentdetails.py
@@ -28,7 +28,7 @@ class QELnPaymentDetails(QObject):
walletChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=walletChanged)
- def wallet(self):
+ def wallet(self) -> QEWallet:
return self._wallet
@wallet.setter
diff --git a/electrum/gui/qml/qerequestdetails.py b/electrum/gui/qml/qerequestdetails.py
index 37fd70b..f0f2155 100644
--- a/electrum/gui/qml/qerequestdetails.py
+++ b/electrum/gui/qml/qerequestdetails.py
@@ -75,7 +75,7 @@ class QERequestDetails(QObject, QtEventListener):
walletChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=walletChanged)
- def wallet(self):
+ def wallet(self) -> QEWallet:
return self._wallet
@wallet.setter
diff --git a/electrum/gui/qml/qeswaphelper.py b/electrum/gui/qml/qeswaphelper.py
index c112acf..8bbf948 100644
--- a/electrum/gui/qml/qeswaphelper.py
+++ b/electrum/gui/qml/qeswaphelper.py
@@ -206,7 +206,7 @@ class QESwapHelper(AuthMixin, QObject, QtEventListener):
walletChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=walletChanged)
- def wallet(self):
+ def wallet(self) -> QEWallet:
return self._wallet
@wallet.setter
@@ -296,11 +296,11 @@ class QESwapHelper(AuthMixin, QObject, QtEventListener):
tosendChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=tosendChanged)
- def tosend(self):
+ def tosend(self) -> QEAmount:
return self._tosend
@tosend.setter
- def tosend(self, tosend):
+ def tosend(self, tosend: QEAmount):
assert tosend is None or isinstance(tosend, QEAmount)
if self._tosend != tosend:
self._tosend = tosend
@@ -308,11 +308,11 @@ class QESwapHelper(AuthMixin, QObject, QtEventListener):
toreceiveChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=toreceiveChanged)
- def toreceive(self):
+ def toreceive(self) -> QEAmount:
return self._toreceive
@toreceive.setter
- def toreceive(self, toreceive):
+ def toreceive(self, toreceive: QEAmount):
assert toreceive is None or isinstance(toreceive, QEAmount)
if self._toreceive != toreceive:
self._toreceive = toreceive
@@ -320,11 +320,11 @@ class QESwapHelper(AuthMixin, QObject, QtEventListener):
serverMiningfeeChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=serverMiningfeeChanged)
- def serverMiningfee(self):
+ def serverMiningfee(self) -> QEAmount:
return self._server_miningfee
@serverMiningfee.setter
- def serverMiningfee(self, server_miningfee):
+ def serverMiningfee(self, server_miningfee: QEAmount):
assert server_miningfee is None or isinstance(server_miningfee, QEAmount)
if self._server_miningfee != server_miningfee:
self._server_miningfee = server_miningfee
@@ -343,11 +343,11 @@ class QESwapHelper(AuthMixin, QObject, QtEventListener):
miningfeeChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=miningfeeChanged)
- def miningfee(self):
+ def miningfee(self) -> QEAmount:
return self._miningfee
@miningfee.setter
- def miningfee(self, miningfee):
+ def miningfee(self, miningfee: QEAmount):
assert miningfee is None or isinstance(miningfee, QEAmount)
if self._miningfee != miningfee:
self._miningfee = miningfee
diff --git a/electrum/gui/qml/qetxdetails.py b/electrum/gui/qml/qetxdetails.py
index cfbf2f6..a5e4dab 100644
--- a/electrum/gui/qml/qetxdetails.py
+++ b/electrum/gui/qml/qetxdetails.py
@@ -104,7 +104,7 @@ class QETxDetails(QObject, QtEventListener):
walletChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=walletChanged)
- def wallet(self):
+ def wallet(self) -> QEWallet:
return self._wallet
@wallet.setter
diff --git a/electrum/gui/qml/qetxfinalizer.py b/electrum/gui/qml/qetxfinalizer.py
index 2e46eb0..d0457c8 100644
--- a/electrum/gui/qml/qetxfinalizer.py
+++ b/electrum/gui/qml/qetxfinalizer.py
@@ -69,7 +69,7 @@ class FeeSlider(QObject):
walletChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=walletChanged)
- def wallet(self):
+ def wallet(self) -> QEWallet:
return self._wallet
@wallet.setter
@@ -172,11 +172,11 @@ class TxFeeSlider(FeeSlider):
feeChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=feeChanged)
- def fee(self):
+ def fee(self) -> QEAmount:
return self._fee
@fee.setter
- def fee(self, fee):
+ def fee(self, fee: QEAmount):
assert fee is None or isinstance(fee, QEAmount)
if self._fee != fee:
self._fee.copyFrom(fee)
@@ -422,7 +422,7 @@ class QETxFinalizer(TxFeeSlider):
amountChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=amountChanged)
- def amount(self):
+ def amount(self) -> QEAmount:
return self._amount
@amount.setter
@@ -440,7 +440,7 @@ class QETxFinalizer(TxFeeSlider):
extraFeeChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=extraFeeChanged)
- def extraFee(self):
+ def extraFee(self) -> QEAmount:
return self._extraFee
@extraFee.setter
@@ -671,7 +671,7 @@ class QETxRbfFeeBumper(TxFeeSlider, TxMonMixin):
oldfeeChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=oldfeeChanged)
- def oldfee(self):
+ def oldfee(self) -> QEAmount:
return self._oldfee
@oldfee.setter
@@ -812,7 +812,7 @@ class QETxCanceller(TxFeeSlider, TxMonMixin):
oldfeeChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=oldfeeChanged)
- def oldfee(self):
+ def oldfee(self) -> QEAmount:
return self._oldfee
@oldfee.setter
@@ -945,7 +945,7 @@ class QETxCpfpFeeBumper(TxFeeSlider, TxMonMixin):
totalFeeChanged = pyqtSignal()
@pyqtProperty(QVariant, notify=totalFeeChanged)
- def totalFee(self):
+ def totalFee(self) -> QEAmount:
return self._total_fee
@totalFee.setter
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.