invoices: minor clean-up (type hints, mark broken things)
also rm some dead code
This commit is contained in:
@@ -1159,7 +1159,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
|
|||||||
|
|
||||||
def sign_payment_request(self, addr):
|
def sign_payment_request(self, addr):
|
||||||
alias = self.config.get('alias')
|
alias = self.config.get('alias')
|
||||||
alias_privkey = None
|
|
||||||
if alias and self.alias_info:
|
if alias and self.alias_info:
|
||||||
alias_addr, alias_name, validated = self.alias_info
|
alias_addr, alias_name, validated = self.alias_info
|
||||||
if alias_addr:
|
if alias_addr:
|
||||||
@@ -1230,17 +1229,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
|
|||||||
tooltip_text = _("{} copied to clipboard").format(title)
|
tooltip_text = _("{} copied to clipboard").format(title)
|
||||||
QToolTip.showText(QCursor.pos(), tooltip_text, self)
|
QToolTip.showText(QCursor.pos(), tooltip_text, self)
|
||||||
|
|
||||||
def export_payment_request(self, addr):
|
|
||||||
r = self.wallet.receive_requests.get(addr)
|
|
||||||
pr = paymentrequest.serialize_request(r).SerializeToString()
|
|
||||||
name = r.id + '.bip70'
|
|
||||||
fileName = self.getSaveFileName(_("Select where to save your payment request"), name, "*.bip70")
|
|
||||||
if fileName:
|
|
||||||
with open(fileName, "wb+") as f:
|
|
||||||
f.write(util.to_bytes(pr))
|
|
||||||
self.show_message(_("Request saved successfully"))
|
|
||||||
self.saved = True
|
|
||||||
|
|
||||||
def clear_receive_tab(self):
|
def clear_receive_tab(self):
|
||||||
self.receive_payreq_e.setText('')
|
self.receive_payreq_e.setText('')
|
||||||
self.receive_address_e.setText('')
|
self.receive_address_e.setText('')
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ class OnchainInvoice(Invoice):
|
|||||||
id=pr.get_id(),
|
id=pr.get_id(),
|
||||||
time=pr.get_time(),
|
time=pr.get_time(),
|
||||||
exp=pr.get_expiration_date() - pr.get_time(),
|
exp=pr.get_expiration_date() - pr.get_time(),
|
||||||
bip70=pr.raw.hex() if pr else None,
|
bip70=pr.raw.hex(),
|
||||||
requestor=pr.get_requestor(),
|
requestor=pr.get_requestor(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
import hashlib
|
import hashlib
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
from typing import Optional, List
|
from typing import Optional, List, TYPE_CHECKING
|
||||||
import asyncio
|
import asyncio
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
@@ -41,13 +41,16 @@ except ImportError:
|
|||||||
|
|
||||||
from . import bitcoin, ecc, util, transaction, x509, rsakey
|
from . import bitcoin, ecc, util, transaction, x509, rsakey
|
||||||
from .util import bh2u, bfh, make_aiohttp_session
|
from .util import bh2u, bfh, make_aiohttp_session
|
||||||
from .invoices import PR_UNPAID, PR_EXPIRED, PR_PAID, PR_UNKNOWN, PR_INFLIGHT
|
from .invoices import OnchainInvoice
|
||||||
from .crypto import sha256
|
from .crypto import sha256
|
||||||
from .bitcoin import address_to_script
|
from .bitcoin import address_to_script
|
||||||
from .transaction import PartialTxOutput
|
from .transaction import PartialTxOutput
|
||||||
from .network import Network
|
from .network import Network
|
||||||
from .logging import get_logger, Logger
|
from .logging import get_logger, Logger
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from .simple_config import SimpleConfig
|
||||||
|
|
||||||
|
|
||||||
_logger = get_logger(__name__)
|
_logger = get_logger(__name__)
|
||||||
|
|
||||||
@@ -315,8 +318,7 @@ class PaymentRequest:
|
|||||||
return False, error
|
return False, error
|
||||||
|
|
||||||
|
|
||||||
def make_unsigned_request(req):
|
def make_unsigned_request(req: 'OnchainInvoice'):
|
||||||
from .transaction import Transaction
|
|
||||||
addr = req.get_address()
|
addr = req.get_address()
|
||||||
time = req.time
|
time = req.time
|
||||||
exp = req.exp
|
exp = req.exp
|
||||||
@@ -444,7 +446,7 @@ def sign_request_with_x509(pr, key_path, cert_path):
|
|||||||
pr.signature = bytes(sig)
|
pr.signature = bytes(sig)
|
||||||
|
|
||||||
|
|
||||||
def serialize_request(req):
|
def serialize_request(req): # FIXME this is broken
|
||||||
pr = make_unsigned_request(req)
|
pr = make_unsigned_request(req)
|
||||||
signature = req.get('sig')
|
signature = req.get('sig')
|
||||||
requestor = req.get('name')
|
requestor = req.get('name')
|
||||||
@@ -455,7 +457,7 @@ def serialize_request(req):
|
|||||||
return pr
|
return pr
|
||||||
|
|
||||||
|
|
||||||
def make_request(config, req):
|
def make_request(config: 'SimpleConfig', req: 'OnchainInvoice'):
|
||||||
pr = make_unsigned_request(req)
|
pr = make_unsigned_request(req)
|
||||||
key_path = config.get('ssl_keyfile')
|
key_path = config.get('ssl_keyfile')
|
||||||
cert_path = config.get('ssl_certfile')
|
cert_path = config.get('ssl_certfile')
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ from PyQt5.QtWidgets import (QVBoxLayout, QLabel, QGridLayout, QLineEdit,
|
|||||||
|
|
||||||
from electrum.gui.qt.util import (EnterButton, Buttons, CloseButton, OkButton,
|
from electrum.gui.qt.util import (EnterButton, Buttons, CloseButton, OkButton,
|
||||||
WindowModalDialog, get_parent_main_window)
|
WindowModalDialog, get_parent_main_window)
|
||||||
|
from electrum.gui.qt.main_window import ElectrumWindow
|
||||||
|
|
||||||
from electrum.plugin import BasePlugin, hook
|
from electrum.plugin import BasePlugin, hook
|
||||||
from electrum.paymentrequest import PaymentRequest
|
from electrum.paymentrequest import PaymentRequest
|
||||||
@@ -179,7 +180,7 @@ class Plugin(BasePlugin):
|
|||||||
window = get_parent_main_window(menu)
|
window = get_parent_main_window(menu)
|
||||||
menu.addAction(_("Send via e-mail"), lambda: self.send(window, addr))
|
menu.addAction(_("Send via e-mail"), lambda: self.send(window, addr))
|
||||||
|
|
||||||
def send(self, window, addr):
|
def send(self, window: ElectrumWindow, addr): # FIXME this is broken
|
||||||
from electrum import paymentrequest
|
from electrum import paymentrequest
|
||||||
r = window.wallet.receive_requests.get(addr)
|
r = window.wallet.receive_requests.get(addr)
|
||||||
message = r.get('memo', '')
|
message = r.get('memo', '')
|
||||||
|
|||||||
@@ -267,7 +267,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
|
|||||||
self.frozen_addresses = set(db.get('frozen_addresses', []))
|
self.frozen_addresses = set(db.get('frozen_addresses', []))
|
||||||
self.frozen_coins = set(db.get('frozen_coins', [])) # set of txid:vout strings
|
self.frozen_coins = set(db.get('frozen_coins', [])) # set of txid:vout strings
|
||||||
self.fiat_value = db.get_dict('fiat_value')
|
self.fiat_value = db.get_dict('fiat_value')
|
||||||
self.receive_requests = db.get_dict('payment_requests')
|
self.receive_requests = db.get_dict('payment_requests') # type: Dict[str, Invoice]
|
||||||
self.invoices = db.get_dict('invoices') # type: Dict[str, Invoice]
|
self.invoices = db.get_dict('invoices') # type: Dict[str, Invoice]
|
||||||
self._reserved_addresses = set(db.get('reserved_addresses', []))
|
self._reserved_addresses = set(db.get('reserved_addresses', []))
|
||||||
|
|
||||||
@@ -1624,7 +1624,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
|
|||||||
return True, conf
|
return True, conf
|
||||||
return False, None
|
return False, None
|
||||||
|
|
||||||
def get_request_URI(self, req: Invoice):
|
def get_request_URI(self, req: OnchainInvoice) -> str:
|
||||||
addr = req.get_address()
|
addr = req.get_address()
|
||||||
message = self.labels.get(addr, '')
|
message = self.labels.get(addr, '')
|
||||||
amount = req.amount
|
amount = req.amount
|
||||||
@@ -1674,8 +1674,13 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
|
|||||||
if x:
|
if x:
|
||||||
return self.export_request(x)
|
return self.export_request(x)
|
||||||
|
|
||||||
def export_request(self, x):
|
def export_request(self, x: Invoice) -> Dict[str, Any]:
|
||||||
key = x.rhash if x.is_lightning() else x.get_address()
|
if x.is_lightning():
|
||||||
|
assert isinstance(x, LNInvoice)
|
||||||
|
key = x.rhash
|
||||||
|
else:
|
||||||
|
assert isinstance(x, OnchainInvoice)
|
||||||
|
key = x.get_address()
|
||||||
status = self.get_request_status(key)
|
status = self.get_request_status(key)
|
||||||
status_str = x.get_status_str(status)
|
status_str = x.get_status_str(status)
|
||||||
is_lightning = x.is_lightning()
|
is_lightning = x.is_lightning()
|
||||||
@@ -1695,7 +1700,6 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
|
|||||||
if self.lnworker and status == PR_UNPAID:
|
if self.lnworker and status == PR_UNPAID:
|
||||||
d['can_receive'] = self.lnworker.can_receive_invoice(x)
|
d['can_receive'] = self.lnworker.can_receive_invoice(x)
|
||||||
else:
|
else:
|
||||||
#key = x.id
|
|
||||||
addr = x.get_address()
|
addr = x.get_address()
|
||||||
paid, conf = self.get_payment_status(addr, x.amount)
|
paid, conf = self.get_payment_status(addr, x.amount)
|
||||||
d['address'] = addr
|
d['address'] = addr
|
||||||
@@ -1715,7 +1719,7 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
|
|||||||
d['bip70_url'] = request_url
|
d['bip70_url'] = request_url
|
||||||
return d
|
return d
|
||||||
|
|
||||||
def export_invoice(self, x):
|
def export_invoice(self, x: Invoice) -> Dict[str, Any]:
|
||||||
status = self.get_invoice_status(x)
|
status = self.get_invoice_status(x)
|
||||||
status_str = x.get_status_str(status)
|
status_str = x.get_status_str(status)
|
||||||
is_lightning = x.is_lightning()
|
is_lightning = x.is_lightning()
|
||||||
@@ -1730,10 +1734,12 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
|
|||||||
'status_str': status_str,
|
'status_str': status_str,
|
||||||
}
|
}
|
||||||
if is_lightning:
|
if is_lightning:
|
||||||
|
assert isinstance(x, LNInvoice)
|
||||||
d['invoice'] = x.invoice
|
d['invoice'] = x.invoice
|
||||||
if self.lnworker and status == PR_UNPAID:
|
if self.lnworker and status == PR_UNPAID:
|
||||||
d['can_pay'] = self.lnworker.can_pay_invoice(x)
|
d['can_pay'] = self.lnworker.can_pay_invoice(x)
|
||||||
else:
|
else:
|
||||||
|
assert isinstance(x, OnchainInvoice)
|
||||||
d['outputs'] = [y.to_legacy_tuple() for y in x.outputs]
|
d['outputs'] = [y.to_legacy_tuple() for y in x.outputs]
|
||||||
if x.bip70:
|
if x.bip70:
|
||||||
d['bip70'] = x.bip70
|
d['bip70'] = x.bip70
|
||||||
@@ -1763,25 +1769,28 @@ class Abstract_Wallet(AddressSynchronizer, ABC):
|
|||||||
bip70 = None,
|
bip70 = None,
|
||||||
requestor = None)
|
requestor = None)
|
||||||
|
|
||||||
def sign_payment_request(self, key, alias, alias_addr, password):
|
def sign_payment_request(self, key, alias, alias_addr, password): # FIXME this is broken
|
||||||
req = self.receive_requests.get(key)
|
req = self.receive_requests.get(key)
|
||||||
|
assert isinstance(req, OnchainInvoice)
|
||||||
alias_privkey = self.export_private_key(alias_addr, password)
|
alias_privkey = self.export_private_key(alias_addr, password)
|
||||||
pr = paymentrequest.make_unsigned_request(req)
|
pr = paymentrequest.make_unsigned_request(req)
|
||||||
paymentrequest.sign_request_with_alias(pr, alias, alias_privkey)
|
paymentrequest.sign_request_with_alias(pr, alias, alias_privkey)
|
||||||
|
req.bip70 = pr.raw.hex()
|
||||||
req['name'] = pr.pki_data
|
req['name'] = pr.pki_data
|
||||||
req['sig'] = bh2u(pr.signature)
|
req['sig'] = bh2u(pr.signature)
|
||||||
self.receive_requests[key] = req
|
self.receive_requests[key] = req
|
||||||
|
|
||||||
def add_payment_request(self, req):
|
def add_payment_request(self, req: Invoice):
|
||||||
if not req.is_lightning():
|
if not req.is_lightning():
|
||||||
|
assert isinstance(req, OnchainInvoice)
|
||||||
addr = req.get_address()
|
addr = req.get_address()
|
||||||
if not bitcoin.is_address(addr):
|
if not bitcoin.is_address(addr):
|
||||||
raise Exception(_('Invalid Bitcoin address.'))
|
raise Exception(_('Invalid Bitcoin address.'))
|
||||||
if not self.is_mine(addr):
|
if not self.is_mine(addr):
|
||||||
raise Exception(_('Address not in wallet.'))
|
raise Exception(_('Address not in wallet.'))
|
||||||
key = addr
|
key = addr
|
||||||
message = req.message
|
|
||||||
else:
|
else:
|
||||||
|
assert isinstance(req, LNInvoice)
|
||||||
key = req.rhash
|
key = req.rhash
|
||||||
message = req.message
|
message = req.message
|
||||||
self.receive_requests[key] = req
|
self.receive_requests[key] = req
|
||||||
|
|||||||
Reference in New Issue
Block a user